diping
This commit is contained in:
commit
0fde055d27
|
@ -15,7 +15,7 @@ import load from "./dynamicLoadScript";
|
||||||
import { upUrl, upHeaders } from "@/api/file";
|
import { upUrl, upHeaders } from "@/api/file";
|
||||||
import { getToken } from "@/utils/auth";
|
import { getToken } from "@/utils/auth";
|
||||||
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
// why use this cdn, detail see https://github.com/PanJiaChen/tinymce-all-in-one
|
||||||
const tinymceCDN ="http://lib.baomitu.com/tinymce/4.9.3/tinymce.min.js";
|
const tinymceCDN ="https://lib.baomitu.com/tinymce/4.9.3/tinymce.min.js";
|
||||||
// "https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/tinymce/4.9.3/tinymce.min.js";
|
// "https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/tinymce/4.9.3/tinymce.min.js";
|
||||||
export default {
|
export default {
|
||||||
name: "Tinymce",
|
name: "Tinymce",
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
@click="resetFilter"
|
@click="resetFilter"
|
||||||
>刷新重置</el-button>
|
>刷新重置</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="checkPermission(['certificate_create'])&&uploadUrl!='https://qw.ctc-zc.com/api'"
|
v-if="checkPermission(['certificate_create'])&&uploadUrl=='https://dppz.ctc.ac.cn/api'"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="handleAdd"
|
@click="handleAdd"
|
||||||
>手动创建</el-button>
|
>手动创建</el-button>
|
||||||
|
@ -48,19 +48,19 @@
|
||||||
<template slot-scope="scope">{{ scope.row.workscope_name }}</template>
|
<template slot-scope="scope">{{ scope.row.workscope_name }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="职业等级">
|
<el-table-column label="职业等级">
|
||||||
<template slot-scope="scope">{{ scope.row.opllevel }}</template>
|
<template slot-scope="scope">{{ getOpllevelName(scope.row.opllevel) }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="单位">
|
<el-table-column label="单位">
|
||||||
<template slot-scope="scope">{{ scope.row.company_name }}</template>
|
<template slot-scope="scope">{{ scope.row.company_name }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!--
|
|
||||||
<el-table-column label="有效期始">
|
<el-table-column v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="有效期始">
|
||||||
<template slot-scope="scope">{{ scope.row.start_date }}</template>
|
<template slot-scope="scope">{{ scope.row.start_date }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="有效期止">
|
<el-table-column v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="有效期止">
|
||||||
<template slot-scope="scope">{{ scope.row.end_date }}</template>
|
<template slot-scope="scope">{{ scope.row.end_date }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
-->
|
|
||||||
<el-table-column label="手动创建">
|
<el-table-column label="手动创建">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<span v-if="scope.row.is_manual">是</span>
|
<span v-if="scope.row.is_manual">是</span>
|
||||||
|
@ -74,7 +74,7 @@
|
||||||
<el-table-column align="center" label="操作" fixed="right">
|
<el-table-column align="center" label="操作" fixed="right">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-button
|
<el-button
|
||||||
v-if="uploadUrl=='https://qw.ctc-zc.com/api'"
|
v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'"
|
||||||
type="primary"
|
type="primary"
|
||||||
size="small"
|
size="small"
|
||||||
icon="el-icon-more"
|
icon="el-icon-more"
|
||||||
|
@ -128,20 +128,19 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="性别" prop="gender">
|
<el-form-item label="性别" prop="gender">
|
||||||
<el-select v-model="candidate.gender" placeholder="性别" style="width:80%">
|
<el-select v-model="candidate.gender" placeholder="性别" style="width:80%">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in genderOption"
|
v-for="item in genderOption"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="身份证号" prop="ID_number">
|
<el-form-item label="身份证号" prop="ID_number">
|
||||||
<el-input v-model="candidate.ID_number" placeholder="身份证号" />
|
<el-input v-model="candidate.ID_number" placeholder="身份证号" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-form-item label="发证日期" prop="issue_date">
|
<el-form-item label="发证日期" prop="issue_date">
|
||||||
|
@ -152,8 +151,8 @@
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!--
|
|
||||||
<el-form-item label="有效期始" prop="start_date">
|
<el-form-item v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="有效期始" prop="start_date">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="candidate.start_date"
|
v-model="candidate.start_date"
|
||||||
type="date"
|
type="date"
|
||||||
|
@ -161,7 +160,7 @@
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="有效期止" prop="end_date">
|
<el-form-item v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="有效期止" prop="end_date">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="candidate.end_date"
|
v-model="candidate.end_date"
|
||||||
type="date"
|
type="date"
|
||||||
|
@ -170,43 +169,43 @@
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="考试时间" prop="examtest_date">
|
<el-form-item v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="考试时间" prop="examtest_date">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="candidate.examtest_date"
|
v-model="candidate.examtest_date"
|
||||||
type="date"
|
type="date"
|
||||||
placeholder="选择日期"
|
placeholder="选择日期"
|
||||||
value-format="yyyy-MM-dd"
|
value-format="yyyy-MM-dd"
|
||||||
/>
|
/>
|
||||||
</el-form-item> -->
|
</el-form-item>
|
||||||
<el-form-item label="职业等级" prop="opllevel">
|
<el-form-item label="职业等级" prop="opllevel">
|
||||||
<el-select v-model="candidate.opllevel" placeholder="职业等级" style="width:80%">
|
<el-select v-model="candidate.opllevel" placeholder="职业等级" style="width:80%">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in typeOption"
|
v-for="item in typeOption"
|
||||||
:key="item.value"
|
:key="item.value"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="工作类别" prop="workscope_name">
|
<el-form-item label="工作类别" prop="workscope_name">
|
||||||
<el-select v-model="candidate.workscope_name" placeholder="工作类别" style="width:80%">
|
<el-select v-model="candidate.workscope_name" placeholder="工作类别" style="width:80%">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in worksOption"
|
v-for="item in worksOption"
|
||||||
:key="item.key"
|
:key="item.key"
|
||||||
:label="item.label"
|
:label="item.label"
|
||||||
:value="item.value"
|
:value="item.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="单位" prop="company_name">
|
<el-form-item label="单位" prop="company_name">
|
||||||
<el-input v-model="candidate.company_name" placeholder="单位" />
|
<el-input v-model="candidate.company_name" placeholder="单位" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!---
|
|
||||||
<el-form-item label="部门" prop="deptname">
|
<el-form-item v-if="uploadUrl!='https://dppz.ctc.ac.cn/api'" label="部门" prop="deptname">
|
||||||
<el-input v-model="candidate.deptname" placeholder="部门" />
|
<el-input v-model="candidate.deptname" placeholder="部门" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
-->
|
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
@ -271,8 +270,8 @@ import {
|
||||||
updateCandidate
|
updateCandidate
|
||||||
} from '@/api/candidate'
|
} from '@/api/candidate'
|
||||||
import {
|
import {
|
||||||
getWorkScopeAll,
|
getWorkScopeAll
|
||||||
} from "@/api/examtest";
|
} from '@/api/examtest'
|
||||||
import { upUrl, upHeaders } from '@/api/file'
|
import { upUrl, upHeaders } from '@/api/file'
|
||||||
import { genTree, deepClone } from '@/utils'
|
import { genTree, deepClone } from '@/utils'
|
||||||
import checkPermission from '@/utils/permission'
|
import checkPermission from '@/utils/permission'
|
||||||
|
@ -281,7 +280,7 @@ import Pagination from '@/components/Pagination'
|
||||||
const listQuery = {
|
const listQuery = {
|
||||||
page: 1,
|
page: 1,
|
||||||
limit: 20,
|
limit: 20,
|
||||||
search: ''
|
ordering: 'opllevel'
|
||||||
}
|
}
|
||||||
export default {
|
export default {
|
||||||
components: { Pagination },
|
components: { Pagination },
|
||||||
|
@ -302,17 +301,19 @@ export default {
|
||||||
candidateRule: {
|
candidateRule: {
|
||||||
number: [{ required: true, message: '请输入编号', trigger: 'blur' }]
|
number: [{ required: true, message: '请输入编号', trigger: 'blur' }]
|
||||||
},
|
},
|
||||||
typeOption:[
|
typeOption: [
|
||||||
{ name: '初级工', value: '初级工' },
|
{ name: '初级工', value: 2 },
|
||||||
{ name: '中级工', value: '中级工'},
|
{ name: '中级工', value: 1 },
|
||||||
{ name: '高级工', value: '高级工' },
|
{ name: '高级工', value: 0 },
|
||||||
{ name: '技师', value: '技师'},
|
{ name: '技师', value: 4 },
|
||||||
{ name: '高级技师', value: '高级技师' }
|
{ name: '高级技师', value: 3 }
|
||||||
],
|
],
|
||||||
worksOption:[],
|
worksOption: [],
|
||||||
genderOption:[
|
genderOption: [
|
||||||
{ name: '男', value: '男' },
|
{ name: '男', value: '男' },
|
||||||
{ name: '女', value: '女'}]
|
{ name: '女', value: '女' }
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -325,6 +326,13 @@ export default {
|
||||||
handleAvatarSuccess(res, file) {
|
handleAvatarSuccess(res, file) {
|
||||||
this.candidate.photo = res.data.path
|
this.candidate.photo = res.data.path
|
||||||
},
|
},
|
||||||
|
getOpllevelName(value) {
|
||||||
|
console.log(value, 'value')
|
||||||
|
const numValue = Number(value)
|
||||||
|
const item = this.typeOption.find((item) => item.value === numValue)
|
||||||
|
console.log(item, 'item-name')
|
||||||
|
return item ? item.name : ''
|
||||||
|
},
|
||||||
beforeAvatarUpload(file) {
|
beforeAvatarUpload(file) {
|
||||||
const isLt2M = file.size / 1024 / 1024 < 2
|
const isLt2M = file.size / 1024 / 1024 < 2
|
||||||
if (!isLt2M) {
|
if (!isLt2M) {
|
||||||
|
@ -332,7 +340,7 @@ export default {
|
||||||
}
|
}
|
||||||
return isLt2M
|
return isLt2M
|
||||||
},
|
},
|
||||||
//工作类别选择
|
// 工作类别选择
|
||||||
getWorkScopeAll() {
|
getWorkScopeAll() {
|
||||||
getWorkScopeAll().then((response) => {
|
getWorkScopeAll().then((response) => {
|
||||||
this.worksOption = genTree(response.data)
|
this.worksOption = genTree(response.data)
|
||||||
|
@ -378,7 +386,7 @@ export default {
|
||||||
},
|
},
|
||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
this.getWorkScopeAll();
|
this.getWorkScopeAll()
|
||||||
this.dialogType = 'create'
|
this.dialogType = 'create'
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$refs['candidateForm'].clearValidate()
|
this.$refs['candidateForm'].clearValidate()
|
||||||
|
@ -386,6 +394,7 @@ export default {
|
||||||
},
|
},
|
||||||
handleEdit(scope) {
|
handleEdit(scope) {
|
||||||
this.candidate = scope.row
|
this.candidate = scope.row
|
||||||
|
this.getWorkScopeAll()
|
||||||
this.dialogType = 'update'
|
this.dialogType = 'update'
|
||||||
this.dialogVisible = true
|
this.dialogVisible = true
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<el-container>
|
<el-container>
|
||||||
<el-header style="height: 90px;">
|
<el-header style="height: 100px;">
|
||||||
<div style="margin-top: 10px;">
|
<div style="margin-top: 10px;">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="listQuery.search"
|
v-model="listQuery.search"
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
@click="resetFilter"
|
@click="resetFilter"
|
||||||
>刷新重置</el-button>
|
>刷新重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-top: 10px;" >
|
<div style="margin-top:10px;height:50px">
|
||||||
<el-button type="primary" icon="el-icon-plus" @click="handleCreate('文档')">文档</el-button>
|
<el-button type="primary" icon="el-icon-plus" @click="handleCreate('文档')">文档</el-button>
|
||||||
<el-button type="primary" icon="el-icon-plus" @click="handleCreate('视频')">视频</el-button>
|
<el-button type="primary" icon="el-icon-plus" @click="handleCreate('视频')">视频</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -102,7 +102,7 @@
|
||||||
<el-form-item label="描述" prop="description">
|
<el-form-item label="描述" prop="description">
|
||||||
<el-input v-model="material.description" placeholder="描述" />
|
<el-input v-model="material.description" placeholder="描述" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="分类" prop="cate">
|
<el-form-item label="分类" prop="cate" >
|
||||||
<el-select
|
<el-select
|
||||||
v-model="material.cate"
|
v-model="material.cate"
|
||||||
placeholder="所属分类"
|
placeholder="所属分类"
|
||||||
|
@ -236,6 +236,7 @@ export default {
|
||||||
components: { Pagination },
|
components: { Pagination },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
|
||||||
upHeaders: upHeaders(),
|
upHeaders: upHeaders(),
|
||||||
upUrl: upUrl(),
|
upUrl: upUrl(),
|
||||||
materialList: { count: 0 },
|
materialList: { count: 0 },
|
||||||
|
@ -289,6 +290,7 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
handleCreate(val) {
|
handleCreate(val) {
|
||||||
|
console.log(val)
|
||||||
this.material = Object.assign({}, defaultmaterial)
|
this.material = Object.assign({}, defaultmaterial)
|
||||||
this.material.type = val
|
this.material.type = val
|
||||||
this.fileList = []
|
this.fileList = []
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
<el-table-column align="left" label="标题">
|
<el-table-column align="left" label="标题">
|
||||||
<template slot-scope="scope">{{ scope.row.title }}</template>
|
<template slot-scope="scope">{{ scope.row.title }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="left" label="文章类型">
|
<el-table-column align="left" label="文章类型" v-if=" uploadUrl=='https://dppz.ctc.ac.cn/api'">
|
||||||
<template slot-scope="scope">{{ type_[scope.row.type] }}</template>
|
<template slot-scope="scope">{{ type_[scope.row.type] }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="left" label="来源">
|
<el-table-column align="left" label="来源">
|
||||||
|
@ -110,6 +110,7 @@ export default {
|
||||||
components: { Pagination },
|
components: { Pagination },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
uploadUrl: process.env.VUE_APP_BASE_API,
|
||||||
type_: {1:"技能大赛",2:"铺装工匠",3:"培训信息",4:"大赛信息"},
|
type_: {1:"技能大赛",2:"铺装工匠",3:"培训信息",4:"大赛信息"},
|
||||||
|
|
||||||
listQuery: Object.assign({}, listQuery),
|
listQuery: Object.assign({}, listQuery),
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<el-form-item label="标题" prop="title">
|
<el-form-item label="标题" prop="title">
|
||||||
<el-input v-model="Form.title" style="width: 80%" />
|
<el-input v-model="Form.title" style="width: 80%" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="文章类型">
|
<el-form-item label="文章类型" v-if=" uploadUrl=='https://dppz.ctc.ac.cn/api'">
|
||||||
<el-select v-model="Form.type" placeholder="文章类型" style="width:80%">
|
<el-select v-model="Form.type" placeholder="文章类型" style="width:80%">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in typeOption"
|
v-for="item in typeOption"
|
||||||
|
@ -50,6 +50,7 @@ export default {
|
||||||
components: { Tinymce },
|
components: { Tinymce },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
uploadUrl: process.env.VUE_APP_BASE_API,
|
||||||
typeOption: [
|
typeOption: [
|
||||||
{ name: '技能大赛', value: 1 },
|
{ name: '技能大赛', value: 1 },
|
||||||
{ name: '铺装工匠', value: 2 },
|
{ name: '铺装工匠', value: 2 },
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<el-form-item label="标题" prop="title">
|
<el-form-item label="标题" prop="title">
|
||||||
<el-input v-model="Form.title" style="width: 80%"></el-input>
|
<el-input v-model="Form.title" style="width: 80%"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="文章类型">
|
<el-form-item label="文章类型" v-if=" uploadUrl=='https://dppz.ctc.ac.cn/api'">
|
||||||
<el-select v-model="Form.type" placeholder="文章类型" style="width:80%">
|
<el-select v-model="Form.type" placeholder="文章类型" style="width:80%">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in typeOption"
|
v-for="item in typeOption"
|
||||||
|
@ -49,6 +49,7 @@ export default {
|
||||||
components: { Tinymce },
|
components: { Tinymce },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
uploadUrl: process.env.VUE_APP_BASE_API,
|
||||||
Form:{
|
Form:{
|
||||||
title:'',
|
title:'',
|
||||||
ifrom:'',
|
ifrom:'',
|
||||||
|
|
|
@ -27,6 +27,12 @@
|
||||||
<el-table-column align="left" label="协办大赛总积分">
|
<el-table-column align="left" label="协办大赛总积分">
|
||||||
<template slot-scope="scope">{{ scope.row.co_sponsor_points }}</template>
|
<template slot-scope="scope">{{ scope.row.co_sponsor_points }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column align="left" label="企业图片">
|
||||||
|
<template slot-scope="scope"><img
|
||||||
|
v-if="scope.row.photo"
|
||||||
|
:src="scope.row.photo"
|
||||||
|
style="width: 50px; height: 50px; object-fit: cover; border-radius: 5px;"></template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column align="left" label="企业总积分">
|
<el-table-column align="left" label="企业总积分">
|
||||||
<template slot-scope="scope">{{ scope.row.edu_points+scope.row.co_sponsor_points }}</template>
|
<template slot-scope="scope">{{ scope.row.edu_points+scope.row.co_sponsor_points }}</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -54,9 +60,8 @@
|
||||||
:model="companydata"
|
:model="companydata"
|
||||||
label-width="120px"
|
label-width="120px"
|
||||||
label-position="right"
|
label-position="right"
|
||||||
:rules="rule1"
|
|
||||||
>
|
>
|
||||||
<el-form-item label="企业名称" prop="company_name">
|
<el-form-item label="企业名称" prop="company_name" style="width: 400px;">
|
||||||
<el-input v-model="companydata.company_name " placeholder="企业名称" />
|
<el-input v-model="companydata.company_name " placeholder="企业名称" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="教育工匠总积分" prop="edu_points">
|
<el-form-item label="教育工匠总积分" prop="edu_points">
|
||||||
|
@ -65,6 +70,23 @@
|
||||||
<el-form-item label="协办大赛总积分" prop="co_sponsor_points">
|
<el-form-item label="协办大赛总积分" prop="co_sponsor_points">
|
||||||
<el-input-number v-model="companydata.co_sponsor_points " />
|
<el-input-number v-model="companydata.co_sponsor_points " />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="头像" prop="path" >
|
||||||
|
<el-upload
|
||||||
|
class="avatar-uploader"
|
||||||
|
:headers="upHeaders"
|
||||||
|
:action="upUrl"
|
||||||
|
accept="image/jpeg, image/gif, image/png, image/bmp"
|
||||||
|
:show-file-list="true"
|
||||||
|
:on-success="handleImgSuccess"
|
||||||
|
:before-upload="beforeImgUpload"
|
||||||
|
>
|
||||||
|
<img v-if="companydata.path" :src="companydata.path" style="width: 80%;height: auto;display: block;"/>
|
||||||
|
<el-button size="small" type="primary" v-else>点击上传</el-button>
|
||||||
|
</el-upload>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="备注" prop="remark">
|
||||||
|
<el-input v-model="companydata.remark" type="textarea" placeholder="备注" style="width: 600px;" />
|
||||||
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<div style="text-align:right;">
|
<div style="text-align:right;">
|
||||||
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
|
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
|
||||||
|
@ -126,7 +148,6 @@
|
||||||
:model="childCompy"
|
:model="childCompy"
|
||||||
label-width="120px"
|
label-width="120px"
|
||||||
label-position="right"
|
label-position="right"
|
||||||
:rules="rule1"
|
|
||||||
>
|
>
|
||||||
<el-form-item label="企业名称" prop="child_edu_points">
|
<el-form-item label="企业名称" prop="child_edu_points">
|
||||||
<el-select
|
<el-select
|
||||||
|
@ -172,7 +193,9 @@
|
||||||
import { getCompanyList, createCompany, deleteCompany, updateCompany, getChildcompanyList, createChildcomany, deleteChildcomany, updateChildcomany } from '@/api/cms'
|
import { getCompanyList, createCompany, deleteCompany, updateCompany, getChildcompanyList, createChildcomany, deleteChildcomany, updateChildcomany } from '@/api/cms'
|
||||||
import checkPermission from '@/utils/permission'
|
import checkPermission from '@/utils/permission'
|
||||||
import Pagination from '@/components/Pagination'
|
import Pagination from '@/components/Pagination'
|
||||||
|
import { upUrl } from "@/api/file";
|
||||||
import { genTree, deepClone } from '@/utils'
|
import { genTree, deepClone } from '@/utils'
|
||||||
|
import { getToken } from "@/utils/auth";
|
||||||
|
|
||||||
const listQuery = {
|
const listQuery = {
|
||||||
page: 1,
|
page: 1,
|
||||||
|
@ -188,6 +211,15 @@ export default {
|
||||||
components: { Pagination },
|
components: { Pagination },
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
upUrl: upUrl(),
|
||||||
|
banner: {
|
||||||
|
id: "",
|
||||||
|
name: "",
|
||||||
|
url:"",
|
||||||
|
sort:0,
|
||||||
|
path:""
|
||||||
|
},
|
||||||
|
upHeaders: { Authorization: "JWT " + getToken() },
|
||||||
listQuery: Object.assign({}, listQuery),
|
listQuery: Object.assign({}, listQuery),
|
||||||
listQuery2: Object.assign({}, listQuery2),
|
listQuery2: Object.assign({}, listQuery2),
|
||||||
tableData: [],
|
tableData: [],
|
||||||
|
@ -199,7 +231,7 @@ export default {
|
||||||
dialogVisible2: false,
|
dialogVisible2: false,
|
||||||
childCompy: {},
|
childCompy: {},
|
||||||
companydata: {},
|
companydata: {},
|
||||||
companyOption: []
|
companyOption: [],
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -225,7 +257,16 @@ export default {
|
||||||
this.listLoading = false
|
this.listLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
handleImgSuccess(res, file) {
|
||||||
|
this.companydata.photo = res.data.path
|
||||||
|
},
|
||||||
|
beforeImgUpload(file) {
|
||||||
|
const isLt2M = file.size / 1024 / 1024 < 0.6;
|
||||||
|
if (!isLt2M) {
|
||||||
|
this.$message.error("上传图片大小不能超过 600KB!");
|
||||||
|
}
|
||||||
|
return isLt2M;
|
||||||
|
},
|
||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.companydata = {}
|
this.companydata = {}
|
||||||
this.dialogType = 'new'
|
this.dialogType = 'new'
|
||||||
|
@ -284,8 +325,9 @@ export default {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
const isEdit = this.dialogType === 'edit'
|
const isEdit = this.dialogType === 'edit'
|
||||||
if (isEdit) {
|
if (isEdit) {
|
||||||
updateChildcomany(this.companydata.id, this.companydata).then(() => {
|
updateCompany(this.companydata.id, this.companydata).then(() => {
|
||||||
this.getList()
|
this.getList()
|
||||||
|
// 清空上传图片
|
||||||
this.dialogVisible = false
|
this.dialogVisible = false
|
||||||
this.$message.success('成功')
|
this.$message.success('成功')
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 3.2.12 on 2025-03-04 07:52
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cms', '0018_auto_20240918_1109'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='companyinfo',
|
||||||
|
name='photo',
|
||||||
|
field=models.CharField(blank=True, max_length=100, null=True, verbose_name='公司图片'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='companyinfo',
|
||||||
|
name='remark',
|
||||||
|
field=models.TextField(blank=True, max_length=500, null=True, verbose_name='备注'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -69,6 +69,8 @@ class CompanyInfo(CommonModel):
|
||||||
edu_points = models.FloatField('教育积分', null=True, blank=True)
|
edu_points = models.FloatField('教育积分', null=True, blank=True)
|
||||||
co_sponsor_points = models.FloatField('协办大赛积分', null=True, blank=True)
|
co_sponsor_points = models.FloatField('协办大赛积分', null=True, blank=True)
|
||||||
sum_points = models.FloatField('总积分', null=True, blank=True)
|
sum_points = models.FloatField('总积分', null=True, blank=True)
|
||||||
|
photo = models.CharField('公司图片', null=True, blank=True, max_length=100)
|
||||||
|
remark = models.TextField('备注', null=True, blank=True, max_length=500)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.company_name
|
return self.company_name
|
||||||
|
|
|
@ -88,24 +88,3 @@ class ChildrenCompanySerializer(serializers.ModelSerializer):
|
||||||
parent_company.sum_points = parent_company.edu_points + parent_company.co_sponsor_points
|
parent_company.sum_points = parent_company.edu_points + parent_company.co_sponsor_points
|
||||||
parent_company.save()
|
parent_company.save()
|
||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
|
||||||
# # # 定义信号处理器
|
|
||||||
# from django.db.models.signals import pre_save
|
|
||||||
# from django.dispatch import receiver
|
|
||||||
# from .models import ChildrenCompany, CompanyInfo
|
|
||||||
|
|
||||||
|
|
||||||
# @receiver(pre_save, sender=ChildrenCompany)
|
|
||||||
# def update_parent_sum_points(sender, instance, **kwargs):
|
|
||||||
# parent_company = instance.parent_company
|
|
||||||
# child_companies = ChildrenCompany.objects.filter(parent_company=parent_company)
|
|
||||||
# # 计算子公司的积分
|
|
||||||
# child_edu_sum = sum(c.child_edu_points or 0 for c in child_companies)
|
|
||||||
# child_co_sponsor_sum = sum(c.child_co_sponsor_points or 0 for c in child_companies)
|
|
||||||
|
|
||||||
# # 更新父公司的总积分
|
|
||||||
# parent_company.edu_points = child_edu_sum
|
|
||||||
# parent_company.co_sponsor_points = child_co_sponsor_sum
|
|
||||||
# parent_company.sum_points = child_edu_sum + child_co_sponsor_sum
|
|
||||||
# parent_company.save()
|
|
|
@ -78,6 +78,7 @@ class ChildrenCompanyViewSet(ModelViewSet):
|
||||||
ordering_fields = ['update_time']
|
ordering_fields = ['update_time']
|
||||||
ordering = ['-update_time']
|
ordering = ['-update_time']
|
||||||
|
|
||||||
|
|
||||||
class MaterialViewSet(ModelViewSet):
|
class MaterialViewSet(ModelViewSet):
|
||||||
"""
|
"""
|
||||||
资料:增删改查
|
资料:增删改查
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
# Generated by Django 3.2.12 on 2025-03-04 06:10
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('crm', '0047_auto_20240919_1605'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='candidate',
|
||||||
|
options={'ordering': ['opllevel'], 'verbose_name': '证书', 'verbose_name_plural': '证书'},
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='candidate',
|
||||||
|
name='opllevel',
|
||||||
|
field=models.IntegerField(blank=True, choices=[(0, '高级工'), (1, '中级工'), (2, '初级工'), (3, '高级技师'), (4, '技师')], null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -107,6 +107,13 @@ class SendCode(CommonModel):
|
||||||
code = models.CharField(max_length=6, verbose_name= '验证码')
|
code = models.CharField(max_length=6, verbose_name= '验证码')
|
||||||
|
|
||||||
class Candidate(CommonModel):
|
class Candidate(CommonModel):
|
||||||
|
OP_LEVEL_CHOICES = [
|
||||||
|
(0, '高级工'),
|
||||||
|
(1, '中级工'),
|
||||||
|
(2, '初级工'),
|
||||||
|
(3, '高级技师'),
|
||||||
|
(4, '技师'),
|
||||||
|
]
|
||||||
consumer = models.ForeignKey(Consumer, on_delete=models.SET_NULL, related_name='candidate_consumer', null=True, blank=True)
|
consumer = models.ForeignKey(Consumer, on_delete=models.SET_NULL, related_name='candidate_consumer', null=True, blank=True)
|
||||||
workscope = models.ForeignKey(WorkScope, on_delete=models.SET_NULL, related_name='candidate_workscope', null=True, blank=True)
|
workscope = models.ForeignKey(WorkScope, on_delete=models.SET_NULL, related_name='candidate_workscope', null=True, blank=True)
|
||||||
examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.SET_NULL)
|
examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.SET_NULL)
|
||||||
|
@ -130,11 +137,12 @@ class Candidate(CommonModel):
|
||||||
train_end_date = models.DateField('培训结束日期', null=True)
|
train_end_date = models.DateField('培训结束日期', null=True)
|
||||||
create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL)
|
create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL)
|
||||||
gender = models.CharField('性别', max_length=10, null=True, blank=True)
|
gender = models.CharField('性别', max_length=10, null=True, blank=True)
|
||||||
opllevel = models.CharField('职业等级',max_length=60, null=True, blank=True)
|
opllevel = models.IntegerField(choices=OP_LEVEL_CHOICES, null=True, blank=True, default=0)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '证书'
|
verbose_name = '证书'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
ordering = ['opllevel']
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.consumer.username
|
return self.consumer.username
|
||||||
|
|
|
@ -4,7 +4,8 @@ from .models import Candidate, Company, Consumer, PaySubject, ConsumerPerm, Cons
|
||||||
from question.models import Question, Questioncat
|
from question.models import Question, Questioncat
|
||||||
from .permission import get_consumerperm_list
|
from .permission import get_consumerperm_list
|
||||||
from rbac.serializers.user_serializer import UserListSerializer
|
from rbac.serializers.user_serializer import UserListSerializer
|
||||||
|
from examtest.services import make_img
|
||||||
|
from server import settings
|
||||||
|
|
||||||
class ConsumerPermSerializer(serializers.ModelSerializer):
|
class ConsumerPermSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -43,7 +44,7 @@ class ConsumerSerializer(serializers.ModelSerializer):
|
||||||
create_admin_name = serializers.StringRelatedField(source='create_admin', read_only=True)
|
create_admin_name = serializers.StringRelatedField(source='create_admin', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Consumer
|
model = Consumer
|
||||||
exclude = ('avatar','collects', 'process')
|
exclude = ('collects', 'process')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def setup_eager_loading(queryset):
|
def setup_eager_loading(queryset):
|
||||||
|
@ -83,6 +84,7 @@ class ConsumerDetailSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class CandidateSerializer(serializers.ModelSerializer):
|
class CandidateSerializer(serializers.ModelSerializer):
|
||||||
create_admin_username = serializers.StringRelatedField(source='create_admin', read_only=True)
|
create_admin_username = serializers.StringRelatedField(source='create_admin', read_only=True)
|
||||||
|
cert_template = serializers.StringRelatedField(source='examtest.exam.cert_template', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Candidate
|
model = Candidate
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
@ -97,6 +99,16 @@ class CandidateCreateSerializer(serializers.ModelSerializer):
|
||||||
validated_data['create_admin'] = self.context['request'].user
|
validated_data['create_admin'] = self.context['request'].user
|
||||||
return super().create(validated_data)
|
return super().create(validated_data)
|
||||||
|
|
||||||
|
def update(self, instance, validated_data):
|
||||||
|
validated_data['is_manual'] = True
|
||||||
|
validated_data['create_admin'] = self.context['request'].user
|
||||||
|
issue_date = validated_data.get('issue_date', None)
|
||||||
|
exp_date = validated_data.get('end_date', None)
|
||||||
|
header_photo = settings.BASE_DIR + validated_data.get('photo', None)
|
||||||
|
path = make_img(validated_data["consumer_name"], str(issue_date.year), str(issue_date.month), str(exp_date.year), str(exp_date.month), str(exp_date.day), validated_data["number"], header_photo)
|
||||||
|
validated_data['path'] = path
|
||||||
|
return super().update(instance,validated_data)
|
||||||
|
|
||||||
class MsgSerializer(serializers.ModelSerializer):
|
class MsgSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = SendCode
|
model = SendCode
|
||||||
|
|
|
@ -743,8 +743,7 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, Upd
|
||||||
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
|
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
|
||||||
filterset_fields = ['consumer', 'create_admin']
|
filterset_fields = ['consumer', 'create_admin']
|
||||||
search_fields = ('number', 'consumer_name', 'workscope_name', 'company_name', 'create_admin__username', 'ID_number')
|
search_fields = ('number', 'consumer_name', 'workscope_name', 'company_name', 'create_admin__username', 'ID_number')
|
||||||
ordering_fields = ('-id', 'update_time')
|
ordering_fields = ('-id', 'update_time', 'opllevel')
|
||||||
ordering = ['-update_time']
|
|
||||||
|
|
||||||
def get_serializer_class(self):
|
def get_serializer_class(self):
|
||||||
if self.action in ['create', 'update']:
|
if self.action in ['create', 'update']:
|
||||||
|
|
|
@ -27,7 +27,7 @@ class Exam(CommonModel):
|
||||||
qdimgs = JSONField('签到图片', default=list)
|
qdimgs = JSONField('签到图片', default=list)
|
||||||
xcimgs = JSONField('现场图片', default=list)
|
xcimgs = JSONField('现场图片', default=list)
|
||||||
only_vip = models.BooleanField('仅允许培训班学员', default=False)
|
only_vip = models.BooleanField('仅允许培训班学员', default=False)
|
||||||
cert_template = models.PositiveSmallIntegerField('证书模板', null=True, blank=True, help_text='1,2')
|
cert_template = models.PositiveSmallIntegerField('证书模板', null=True, blank=True, help_text='1,2,3')
|
||||||
auto_issue = models.BooleanField('是否自动发证', default=False)
|
auto_issue = models.BooleanField('是否自动发证', default=False)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -4,6 +4,10 @@ from django.utils import timezone
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
from rbac.models import UserProfile
|
from rbac.models import UserProfile
|
||||||
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
|
import datetime
|
||||||
|
from server import settings
|
||||||
|
|
||||||
def issue(obj: ExamTest, create_admin: UserProfile = None):
|
def issue(obj: ExamTest, create_admin: UserProfile = None):
|
||||||
if create_admin is None:
|
if create_admin is None:
|
||||||
create_admin = obj.exam.create_admin
|
create_admin = obj.exam.create_admin
|
||||||
|
@ -35,8 +39,124 @@ def issue(obj: ExamTest, create_admin: UserProfile = None):
|
||||||
if cert_template == 2:
|
if cert_template == 2:
|
||||||
count = Candidate.objects.filter(create_admin=create_admin, issue_date__year=now.year, issue_date__month=now.month).count()
|
count = Candidate.objects.filter(create_admin=create_admin, issue_date__year=now.year, issue_date__month=now.month).count()
|
||||||
candidate.number='HNHK'+ str(now.year) + str(now.month).zfill(2) + str(count+1).zfill(4)
|
candidate.number='HNHK'+ str(now.year) + str(now.month).zfill(2) + str(count+1).zfill(4)
|
||||||
|
elif cert_template == 3:
|
||||||
|
cer_path = make_img(candidate.consumer_name, str(candidate.start_date.year), str(candidate.start_date.month), str(candidate.end_date.year), str(candidate.end_date.month), str(candidate.end_date.day), candidate.number, header_path=candidate.photo, mode=True)
|
||||||
|
candidate.path = cer_path
|
||||||
|
candidate.number='HNHK'+ str(now.year) + str(now.month).zfill(2) + str(count+1).zfill(4)
|
||||||
|
elif cert_template == 4:
|
||||||
|
cer_path = make_img(candidate.consumer_name, str(candidate.start_date.year), str(candidate.start_date.month), str(candidate.end_date.year), str(candidate.end_date.month), str(candidate.end_date.day), candidate.number, header_path=candidate.photo, mode=False)
|
||||||
|
candidate.path = cer_path
|
||||||
|
candidate.number='HNHK'+ str(now.year) + str(now.month).zfill(2) + str(count+1).zfill(4)
|
||||||
else:
|
else:
|
||||||
candidate.number='SL'+ str(now.year)[-2:] + str(candidate.pk).zfill(6)
|
candidate.number='SL'+ str(now.year)[-2:] + str(candidate.pk).zfill(6)
|
||||||
|
|
||||||
candidate.create_admin = create_admin
|
candidate.create_admin = create_admin
|
||||||
candidate.save()
|
candidate.save()
|
||||||
return {"id":candidate.pk, "number":candidate.number, "path":None}
|
return {"id":candidate.pk, "number":candidate.number, "path":None}
|
||||||
|
|
||||||
|
|
||||||
|
def make_img(name:str, year:str, month:str, expiry_year:str, expiry_month:str, expiry_day:str, certificate_number:str, header_path=None, mode=None):
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
font_path = settings.BASE_DIR + "/media/cert/template/STKAITI.TTF"
|
||||||
|
if mode:
|
||||||
|
demo_image_path = settings.BASE_DIR + "/media/cert/template/assess.png"
|
||||||
|
# demo_image_path = r"C:\code\cma_search\server\media\test.png"
|
||||||
|
img = Image.open(demo_image_path)
|
||||||
|
if img.mode == 'RGBA':
|
||||||
|
img = img.convert('RGB')
|
||||||
|
# Initialize ImageDraw
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
|
||||||
|
# Set font paths and sizes
|
||||||
|
# font_path = r"C:/code/cma_search/server/media/font/SIMLI.TTF" # Update this to the correct font path
|
||||||
|
font_name = ImageFont.truetype(font_path, 20) # Font size for the name
|
||||||
|
font_text = ImageFont.truetype(font_path, 20) # Font size for the other text
|
||||||
|
font_number = ImageFont.truetype(font_path, 15) # Font size for the other text
|
||||||
|
|
||||||
|
# uoload header image
|
||||||
|
# header_path = "C:\code\cma_search\server\media\OIP.jpg"
|
||||||
|
if header_path:
|
||||||
|
header_img = Image.open(header_path)
|
||||||
|
# 指定粘贴的位置
|
||||||
|
header_position = (210, 235) # 粘贴图像的左上角位置
|
||||||
|
header_img = header_img.resize((140, 150))
|
||||||
|
img.paste(header_img, header_position)
|
||||||
|
if len(name) <= 3:
|
||||||
|
position_name = (105, 395)
|
||||||
|
else:
|
||||||
|
position_name = (100, 395)
|
||||||
|
position_year = (220, 395)
|
||||||
|
position_month = (280, 395)
|
||||||
|
|
||||||
|
position_exp_day = (310, 490)
|
||||||
|
position_exp_month = (270, 490)
|
||||||
|
position_exp_year = (210, 490)
|
||||||
|
position_cert_number = (180, 530)
|
||||||
|
|
||||||
|
# Define colors
|
||||||
|
color = (0, 0, 0) # Black color
|
||||||
|
|
||||||
|
# Draw the text on the image
|
||||||
|
draw.text(position_name, name, fill=color, font=font_name)
|
||||||
|
draw.text(position_year, year, fill=color, font=font_text)
|
||||||
|
draw.text(position_month, month, fill=color, font=font_text)
|
||||||
|
|
||||||
|
draw.text(position_exp_year, expiry_year, fill=color, font=font_text)
|
||||||
|
draw.text(position_exp_month, expiry_month, fill=color, font=font_text)
|
||||||
|
draw.text(position_exp_day, expiry_day, fill=color, font=font_text)
|
||||||
|
|
||||||
|
draw.text(position_cert_number, certificate_number, fill=color, font=font_number)
|
||||||
|
# Save the edited image
|
||||||
|
output_path = f"/media/cert/template/certificate/{now}.jpg"# Update this to the desired output path
|
||||||
|
img.save(settings.BASE_DIR + output_path, format='JPEG')
|
||||||
|
else:
|
||||||
|
demo_image_path = settings.BASE_DIR + "/media/cert/template/inspect.jpg"
|
||||||
|
# font_path = r"C:/code/cma_search/server/media/font/SIMLI.TTF" # Update this to the correct font path
|
||||||
|
img = Image.open(demo_image_path)
|
||||||
|
if img.mode == 'RGBA':
|
||||||
|
img = img.convert('RGB')
|
||||||
|
# Initialize ImageDraw
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
# Set font paths and sizes
|
||||||
|
font_name = ImageFont.truetype(font_path, 20) # Font size for the name
|
||||||
|
font_text = ImageFont.truetype(font_path, 20) # Font size for the other text
|
||||||
|
font_number = ImageFont.truetype(font_path, 15) # Font size for the other text
|
||||||
|
|
||||||
|
# uoload header image
|
||||||
|
if header_path:
|
||||||
|
header_img = Image.open(header_path)
|
||||||
|
# 指定粘贴的位置
|
||||||
|
header_position = (240, 250) # 粘贴图像的左上角位置
|
||||||
|
header_img = header_img.resize((120, 150))
|
||||||
|
img.paste(header_img, header_position)
|
||||||
|
|
||||||
|
# Define text positions (X, Y) based on your image
|
||||||
|
if len(name) <= 3:
|
||||||
|
position_name = (130, 430)
|
||||||
|
else:
|
||||||
|
position_name = (140, 430)
|
||||||
|
position_year = (245, 430)
|
||||||
|
position_month = (308, 430)
|
||||||
|
|
||||||
|
position_exp_day = (430, 525)
|
||||||
|
position_exp_month = (390, 525)
|
||||||
|
position_exp_year = (330, 525)
|
||||||
|
position_cert_number = (200, 565)
|
||||||
|
|
||||||
|
# Define colors
|
||||||
|
color = (0, 0, 0) # Black color
|
||||||
|
|
||||||
|
# Draw the text on the image
|
||||||
|
draw.text(position_name, name, fill=color, font=font_name)
|
||||||
|
draw.text(position_year, year, fill=color, font=font_text)
|
||||||
|
draw.text(position_month, month, fill=color, font=font_text)
|
||||||
|
|
||||||
|
draw.text(position_exp_year, expiry_year, fill=color, font=font_text)
|
||||||
|
draw.text(position_exp_month, expiry_month, fill=color, font=font_text)
|
||||||
|
draw.text(position_exp_day, expiry_day, fill=color, font=font_text)
|
||||||
|
|
||||||
|
draw.text(position_cert_number, certificate_number, fill=color, font=font_number)
|
||||||
|
# Save the edited image
|
||||||
|
output_path = f"/media/cert/template/certificate/{now}.jpg"# Update this to the desired output path # Update this to the desired output path
|
||||||
|
img.save(settings.BASE_DIR + output_path, format='JPEG')
|
||||||
|
return output_path
|
Loading…
Reference in New Issue