From 7aa71a93fd5d97506077ea0f894d98a777ccd7aa Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期四, 10 七月 2025 13:43:20 +0800 Subject: [PATCH] 修改 --- src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue | 3 src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue | 3 src/views/work/onlineEducation/people/components/trainRecord.vue | 16 +++ src/utils/htmlToPdf.js | 50 ++++++++++++ package.json | 1 src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc.js | 2 src/views/certificatePdf.vue | 119 +++++++++++++++++++++++++++++ src/assets/images/certBg.jpg | 0 src/router/index.js | 5 + src/components/Tinymce/Tinymce.vue | 4 10 files changed, 197 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index cb8aa10..2f30671 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "js-base64": "^3.7.5", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", + "jspdf": "^3.0.1", "jszip-utils": "^0.1.0", "moment": "^2.30.1", "nprogress": "0.2.0", diff --git a/src/assets/images/certBg.jpg b/src/assets/images/certBg.jpg new file mode 100644 index 0000000..5d46e51 --- /dev/null +++ b/src/assets/images/certBg.jpg Binary files differ diff --git a/src/components/Tinymce/Tinymce.vue b/src/components/Tinymce/Tinymce.vue index 7178c82..3a47e16 100644 --- a/src/components/Tinymce/Tinymce.vue +++ b/src/components/Tinymce/Tinymce.vue @@ -12,7 +12,7 @@ import tinymce from "tinymce/tinymce"; import Editor from "@tinymce/tinymce-vue"; import { upload } from "@/api/backManage/notice"; -// import 'tinymce-paragraphspacing' +import 'tinymce-paragraphspacing' import "tinymce/themes/silver"; import "tinymce/themes/silver/theme"; import "tinymce/icons/default/icons"; @@ -51,7 +51,7 @@ }, toolbar: { type: [String, Array], - default: " fontsizeselect | undo redo " + default: " styleselect fontsizeselect paragraphspacing | upfile image bold italic | fontselect |alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | undo redo | lists insertfile table | removeformat fullscreen " } }, data() { diff --git a/src/router/index.js b/src/router/index.js index b06fe5f..aa3e70c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -53,6 +53,11 @@ hidden: true }, { + path: '/certPdf', + component: () => import('@/views/certificatePdf'), + hidden: true + }, + { path: '/courseManage', component: Layout, redirect: '/onlineEducation/courseManage', diff --git a/src/utils/htmlToPdf.js b/src/utils/htmlToPdf.js new file mode 100644 index 0000000..3dcb647 --- /dev/null +++ b/src/utils/htmlToPdf.js @@ -0,0 +1,50 @@ +// 导出页面为PDF格式 +import html2Canvas from 'html2canvas'; +import JsPDF from 'jspdf'; + +export default function htmlToPdf(title=new Date().getTime()) { + return html2Canvas(document.body, { + // useCORS:true, //保证跨域图片的显示 + // width:window.screen.availWidth, //显示canvas窗口的宽度 + // height:window.screen.availHeight, //显示canvas窗口的高度 + // windowHeight: document.body.scrollHeight, //获取y方向滚动条中的内容 + // windowWidth: document.body.scrollWidth,//获取x方向滚动条中的内容 + // x:0, //页面在水平方向上没有滚动,故设置为0 + // y: window.pageXOffset //页面在垂直方向的滚动距离 + }).then(function (canvas) { + let contentWidth = canvas.width; + let contentHeight = canvas.height; + let pageHeight = contentWidth / 592.28 * 841.89; + let leftHeight = contentHeight; + let position = 0; + // let imgWidth = 595.28; + // let imgHeight = 592.28 / contentWidth * contentHeight; + let imgWidth = 838.89; + let imgHeight = 835.89 / contentWidth * contentHeight; + + // 将图片转化为dataUrl + let pageData = canvas.toDataURL('image/jpeg', 1.0); + + // 三个参数,第一个方向(landscape横向?),第二个尺寸,第三个尺寸格式 + let PDF = new JsPDF('landscape', 'pt', 'a4'); + + //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度 (841.89) + //当内容未超过pdf一页显示的范围,无需分页 + if (leftHeight < pageHeight) { + // 0, 0, 控制文字距离左边,与上边的距离,后两个参数控制添加图片的尺寸,此处将页面高度按照 a4纸宽高比列进行压缩 + PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight); + } else { + while (leftHeight > 0) { + PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight); + leftHeight -= pageHeight; + position -= 841.89; + //避免添加空白页 + if (leftHeight > 0) { + PDF.addPage(); + } + } + } + PDF.save(title + '.pdf'); + }); + +} \ No newline at end of file diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue index 3ab2521..ba3c245 100644 --- a/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue +++ b/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue @@ -19,7 +19,7 @@ </el-select> </el-form-item> <el-form-item label="企业概括:" v-if="showEditor" required> - <t-editor style="width: 800px" ref="myEditor" :value="state.noticeForm.companySummary" ></t-editor> + <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.companySummary" ></t-editor> </el-form-item> <el-form-item label="企业概括:" v-else> <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" > @@ -57,6 +57,7 @@ const dialogVisible = ref(false); const title = ref(""); +const toolbar = ref('fontsizeselect | undo redo') const noticeRef = ref(); const fileList = ref([]); const myEditor = ref(); diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue index 2a4aaec..4474956 100644 --- a/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue +++ b/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue @@ -18,7 +18,7 @@ </el-select> </el-form-item> <el-form-item label="质量方针:" v-if="showEditor" required> - <t-editor style="width: 800px" ref="myEditor" :value="state.noticeForm.policy" ></t-editor> + <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.noticeForm.policy" ></t-editor> </el-form-item> <el-form-item label="质量方针:" v-else> <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" > @@ -56,6 +56,7 @@ const emit = defineEmits(["getList"]); const dialogVisible = ref(false); +const toolbar = ref('fontsizeselect | undo redo') const title = ref(""); const noticeRef = ref(); const fileList = ref([]); diff --git a/src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc.js b/src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc.js index cf4023c..41a294d 100644 --- a/src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc.js +++ b/src/views/build/conpanyFunctionConsult/digitalFileDep/manageType/qualityManual/components/exportDoc.js @@ -369,4 +369,4 @@ throw error; } }); -} \ No newline at end of file +} diff --git a/src/views/certificatePdf.vue b/src/views/certificatePdf.vue new file mode 100644 index 0000000..167f502 --- /dev/null +++ b/src/views/certificatePdf.vue @@ -0,0 +1,119 @@ +<template> + <div class="form-container"> + <div class="certContent" @click="getPdf()"> + <div class="certNo">{{info.companyName}}</div> + <div class="main-content"> + {{info.name}} + </div> + <div class="name-content"> + {{info.stuName}} + </div> + <div class="num-content"> + {{info.number}} + </div> + <div class="dep-content"> + {{info.companyName}} + </div> + </div> + </div> +</template> +<script setup> +import {reactive, ref, toRefs, onMounted, nextTick} from 'vue' +import {ElMessage, ElMessageBox} from "element-plus" +import htmlToPdf from '@/utils/htmlToPdf'; +import { useRoute } from 'vue-router' +const { proxy } = getCurrentInstance(); +const route = useRoute(); +const data = reactive({ + info: {} +}) +const {info} = toRefs(data) +onMounted(()=>{ + data.info = route.query + console.log(' data.info', data.info) + nextTick(()=>{ + getPdf() + }) +}) + +function getPdf() { + let title = data.info.name + '证书' + htmlToPdf(title); +} + +onMounted(()=>{ + +}) +</script> + +<style scoped lang="scss"> +@font-face { + font-family: "fangzhengKT"; + src: url("@/assets/styles/font/fangzhengKT.ttf"); + font-style: normal; + font-weight: normal; +} +.form-container{ + padding: 20px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .certContent{ + width: calc(1920px * 0.8); + height: calc(1280px * 0.8); + background: url("@/assets/images/certBg.jpg") no-repeat center; + background-size: contain; + display: flex; + flex-direction: column; + align-items: center; + padding: 420px 300px 120px; + color: #333; + position: relative; + + .certNo{ + position: absolute; + top: 230px; + font-size: 1.3rem; + font-weight: 600; + color: rgb(10,38,140); + font-family: 'fangzhengKT'; + } + + .main-content{ + position: absolute; + top: 365px; + font-size: 1.3rem; + font-weight: 600; + color: rgb(10,38,140); + font-family: 'fangzhengKT'; + } + .name-content{ + position: absolute; + top: 566px; + font-size: 1.0rem; + font-weight: 600; + font-family: 'fangzhengKT'; + left: 715px; + } + .num-content{ + position: absolute; + top: 628px; + font-size: 1.0rem; + font-weight: 600; + font-family: 'fangzhengKT'; + left: 715px; + } + .dep-content{ + position: absolute; + top: 688px; + font-size: 1.0rem; + font-weight: 600; + font-family: 'fangzhengKT'; + left: 715px; + } + + } +} +</style> diff --git a/src/views/work/onlineEducation/people/components/trainRecord.vue b/src/views/work/onlineEducation/people/components/trainRecord.vue index e868866..a976d68 100644 --- a/src/views/work/onlineEducation/people/components/trainRecord.vue +++ b/src/views/work/onlineEducation/people/components/trainRecord.vue @@ -22,6 +22,11 @@ </template> </el-table-column> <el-table-column label="所在公司" prop="companyName" align="center"/> + <el-table-column label="证书" align="center" > + <template #default="scope"> + <el-button v-if="scope.row.passed == 1" type="primary" @click="downloadCert(scope.row)" link>下载</el-button> + </template> + </el-table-column> </el-table> </el-dialog> </div> @@ -39,7 +44,8 @@ import Cookies from "js-cookie"; import {addQuestionBank, checkQuestionBankName, editQuestionBank} from "@/api/onlineEducation/questionBank"; import {getStudent, getStuTrainRecord} from "@/api/onlineEducation/student"; - +import {useRouter} from "vue-router"; +const router = useRouter(); const dialogVisible = ref(false); const title = ref(""); const busRef = ref(); @@ -77,6 +83,14 @@ emit("getList") } +const downloadCert = (info) => { + const routePath = '/certPdf' + const resolvedRoute = router.resolve(routePath) + const queryString = new URLSearchParams(info).toString() + const fullPath = `${resolvedRoute.href}?${queryString}` + window.open(fullPath, '_blank') + +} defineExpose({ openDialog -- Gitblit v1.9.2