Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/main'

ljx 2 gadi atpakaļ
vecāks
revīzija
ed63c09a40

+ 70 - 0
ruoyi-ui/src/utils/htmlToPdf.js

@@ -0,0 +1,70 @@
+// 导出页面为PDF格式
+import html2Canvas from 'html2canvas'
+import JsPDF from 'jspdf'
+export default {
+  install(Vue, options) {
+    Vue.prototype.getPdf = function () {
+      var title = this.htmlTitle // 导出名称
+      // var type = this.downType // 导出类型 true ->图片 false-> pdf
+      var htmlID = document.getElementById('pdfDom')
+      // window.pageYoffset = 0; // 如果有滚动条影响,会导致导出的内容不全,可以直接设置导出前置顶
+      // document.documentElement.scrollTop = 0;
+      // document.body.scrollTop = 0;
+      html2Canvas(htmlID, {
+        allowTaint: true,
+        // scrollY: 50, // 偏移量吧,如果有滚动条影响,但是不想设置滚动条置顶, 可以设置这个,但是要计算滚动了多少
+        // scrollX:0,
+        // x:0, // 距离左边距离
+        // y:10,
+        // width: 1000,
+        // height: 800
+        // 下面两个用来提高清晰度
+        // dpi: window.devicePixelRatio*4, //将分辨率提高到特定的DPI 提高四倍
+        dpi: 300, //将分辨率提高到特定的DPI 提高四倍
+        scale:4, //按比例增加分辨率
+        useCORS: true // 【重要】开启跨域配置
+      }).then(function (canvas) {
+        var contentWidth = canvas.width*2;
+        var contentHeight = canvas.height*2;
+        //一页pdf显示html页面生成的canvas高度;
+        var pageHeight = contentWidth / 592.28 * 841.89;
+        //未生成pdf的html页面高度
+        var leftHeight = contentHeight;
+        //页面偏移
+        var position = 0;
+        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
+        var imgHeight = 590.28;
+        var imgWidth = 841.89 ;
+        // var imgHeight = 592.28/contentWidth * contentHeight;
+        var pageData = canvas.toDataURL('image/png', 1.0);
+        // console.log(pageData,1111)
+        // this.imgUrl = pageData
+        const el = document.createElement("a");
+        // 设置 href 为图片经过 base64 编码后的字符串,默认为 png 格式
+        el.href = pageData;
+        el.download = title;
+        // 创建一个点击事件并对 a 标签进行触发
+        const event = new MouseEvent("click");
+        el.dispatchEvent(event)
+        // var pdf = new JsPDF('landscape', 'pt', 'a4');
+        // //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+        // //当内容未超过pdf一页显示的范围,无需分页
+        // if (leftHeight < pageHeight) {
+        //     console.log(imgWidth, imgHeight,222)
+        //     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');
+        })
+    }
+  }
+}

+ 33 - 34
ruoyi-ui/src/views/cert/contract/index.vue

@@ -19,6 +19,14 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
+      <el-form-item label="身份证号码或社会统一信用代码" prop="code" label-width="130px">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="请输入身份证或者信用代码"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
       <el-form-item label="邮箱" prop="email">
         <el-input
           v-model="queryParams.email"
@@ -35,7 +43,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="专业委员会" prop="certMajor">
+      <!-- <el-form-item label="专业委员会" prop="certMajor">
         <el-select v-model="queryParams.certMajor" placeholder="请选择专业委员会" clearable>
           <el-option
             v-for="dict in dict.type.cert_major_type"
@@ -44,7 +52,7 @@
             :value="dict.value"
           />
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="手机号" prop="phone">
         <el-input
           v-model="queryParams.phone"
@@ -53,14 +61,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="身份证号码或社会统一信用代码" prop="code" label-width="130px">
-        <el-input
-          v-model="queryParams.code"
-          placeholder="请输入身份证或者信用代码"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
+      
       <el-form-item >
         <el-button style="margin-left:20px" type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button style="margin-left:20px" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -134,21 +135,21 @@
       <el-table-column label="姓名或者单位名称" align="center" prop="name"  width="130"/>
       <el-table-column label="身份证号码或社会统一信用代码" align="center" prop="code"  width="220"/>
       <el-table-column label="证书编码" align="center" prop="certId" width="200"/>
-      <el-table-column label="专业委员会" align="center" prop="certMajor" width="100">
+      <!-- <el-table-column label="专业委员会" align="center" prop="certMajor" width="100">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.cert_major_type" :value="scope.row.certMajor"/>
         </template>
-      </el-table-column>
+      </el-table-column> -->
       <el-table-column label="发证时间" align="center" prop="issueDate" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.issueDate, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
       <el-table-column label="证书有效期" align="center" prop="validTerm" width="250"/>
-      <el-table-column label="邮箱" align="center" prop="email" width="200"/>
-      <el-table-column label="手机号" align="center" prop="phone" width="120"/>
       <el-table-column label="证书文字" align="center" prop="certContent" width="250"/>
-      <el-table-column label="证书模板" align="center" prop="templateId" width="250">
+      <el-table-column label="手机号" align="center" prop="phone" width="120"/>
+      <el-table-column label="邮箱" align="center" prop="email" width="200"/>
+      <el-table-column label="证书模板" align="center" prop="templateId" width="150">
         <template slot-scope="scope">
           <span>{{scope.row.templateId?tempHandle(scope.row.templateId):""}}</span>
         </template>
@@ -204,7 +205,7 @@
         <el-form-item label="证书编码" prop="certId">
           <el-input v-model="form.certId" placeholder="请输入证书编码" />
         </el-form-item>
-        <el-form-item label="专业委员会" prop="certMajor">
+        <!-- <el-form-item label="专业委员会" prop="certMajor">
           <el-select v-model="form.certMajor" placeholder="请选择专业委员会" style="width:100%">
             <el-option
               v-for="dict in dict.type.cert_major_type"
@@ -213,14 +214,7 @@
 :value="parseInt(dict.value)"
             ></el-option>
           </el-select>
-        </el-form-item>
-        <el-form-item label="证书模板" prop="templateId">
-          <el-select v-model="form.templateId" placeholder="请选择证书模板" filterable clearable
-            :style="{width: '100%'}">
-            <el-option v-for="(item, index) in tempValueOptions" :key="index" :label="item.label"
-              :value="item.value" ></el-option>
-          </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="发证时间" prop="issueDate" >
           <el-date-picker clearable
             v-model="form.issueDate"
@@ -247,8 +241,15 @@
             placeholder="请选择导入系统的时间戳" style="width:100%">
           </el-date-picker>
         </el-form-item> -->
-        <el-form-item label="证书文字">
-          <editor v-model="form.certContent" :min-height="192"/>
+        <el-form-item label="证书模板" prop="templateId">
+          <el-select v-model="form.templateId" placeholder="请选择证书模板" filterable clearable
+            :style="{width: '100%'}">
+            <el-option v-for="(item, index) in tempValueOptions" :key="index" :label="item.label"
+              :value="item.value" ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="证书文字" prop="certContent">
+          <el-input v-model="form.certContent" type="textarea" placeholder="请输入内容" />
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -339,20 +340,18 @@ export default {
         certId: [
           { required: true, message: "证书编码不能为空", trigger: "blur" }
         ],
-        certMajor: [
-          { required: true, message: "专业委员会不能为空", trigger: "change" }
-        ],
         issueDate: [
           { required: true, message: "发证时间不能为空", trigger: "blur" }
         ],
         validTerm: [
           { required: true, message: "证书有效期不能为空", trigger: "blur" }
         ],
-        templateId: [{
-          required: true,
-          message: '请选择证书模板',
-          trigger: 'blur'
-        }]
+        templateId: [
+          { required: true, message: '请选择证书模板', trigger: 'blur' }
+        ],
+        certContent: [
+          { required: true, message: "证书文字不能为空", trigger: "blur" }
+        ]
       },
       upload: {
         // 是否显示弹出层(用户导入)

+ 2 - 1
ruoyi-ui/src/views/cert/temp/index.vue

@@ -63,7 +63,7 @@
 
     <el-table v-loading="loading" :data="tempList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="${comment}" align="center" prop="id" />
+      <!-- <el-table-column label="${comment}" align="center" prop="id" /> -->
       <el-table-column label="模板名称" align="center" prop="name" />
       <el-table-column label="模板地址" align="center" prop="url" width="100">
         <template slot-scope="scope">
@@ -217,6 +217,7 @@ export default {
     submitForm() {
       this.$refs["form"].validate(valid => {
         if (valid) {
+          
           if (this.form.id != null) {
             updateTemp(this.form).then(response => {
               this.$modal.msgSuccess("修改成功");

+ 16 - 2
ruoyi-ui/src/views/certInquire/index.vue

@@ -123,6 +123,17 @@
   font-family: 楷体;
   font-size: 16px;
 }
+
+.proBox-img{
+  width: 750px;
+  height: 525px;
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+
+
 .tit {
   color: #000;
   /* color: #892f27; */
@@ -149,10 +160,13 @@
   text-align: left;
   margin: 10px 0;
   line-height: 32px;
-  text-indent: 2em;
+  // text-indent: 2em;
+  text-indent: 3em;
   position: absolute;
     /* top: 129px; */
-    bottom: 265px;
+  bottom: 265px;
+  margin-top: 30px;
+   padding-right: 50px;
 }
 .con-name {
   font-family:黑体 ;

+ 150 - 41
ruoyi-ui/src/views/certInquire/member/index.vue

@@ -1,51 +1,130 @@
 <template>
     <div>
-      <div style="text-align: center;line-height: 50px;">
-          <span class="main-title" style="margin: 0 10px;font-weight: bold;" >会员、理事证书、聘书查询</span>
+      <div class="main-content">
+        <div class="img-box">
+            <img src="../../../assets/logo/logo2.png" alt="广东省教师继续教育学会">
+        </div>
+        <div style="text-align: center;line-height: 50px;">
+            <span class="main-title" style="margin: 0 10px;font-weight: bold;" >会员、理事证书、聘书查询</span>
+        </div>
+        <div>
+            <div class="label-box">
+                <div class="label-title">
+                    <p>持证人姓名</p>
+                    <p>(或持证单位全称)</p>
+                </div>
+                <input type="text" v-model="userName" class="label-input" />
+            </div>
+            <div class="label-box">
+                <div class="label-title">
+                    <p>证书编码</p>
+                </div>
+                <input type="text" v-model="certNumber" class="label-input" />
+            </div>
+            <div class="label-box">
+                <div class="label-title">
+                    <p>验证码<span class="label-must">*</span></p>
+                </div>
+                <input type="text" v-model="code" class="label-input" style="border-color:#acb1b5"/>
+                <div class="captcha-img">
+                    <img :src="codeUrl" @click="getCode" class="login-code-img"/>
+                </div>
+            </div>
+            <div class="btn-box">
+                <button class="btn-reset">重置</button>
+                <button class="btn-search" @click="handleSearch" v-bind:disabled="iconShow">
+                  查询<i class="el-icon-loading" v-show="iconShow"></i>
+                </button>
+            </div>
+        </div>
       </div>
-      <div>
-          <div class="label-box">
-              <div class="label-title">
-                  <p>持证人姓名</p>
-                  <p>(或持证单位全称)</p>
-              </div>
-              <input type="text" v-model="userName" class="label-input" />
+      <el-dialog
+        title="证书预览和下载"
+        :visible.sync="dialogVisible"
+        width="fit-content"
+        :before-close="handleClose"
+      >
+      <!-- :before-close="handleClose" -->
+        <div id="pdfDom" ref="posterWrap">
+          <div class="proBox" >
+            <!-- :style="{backgroundImage:'url('+data.imgurl+')'}" -->
+            <img class="proBox-img" :src="data.url" >
+            <!-- < <p class="tit">{{data.title}}</p> 
+            <p class="proid"><span>编号:</span> <span>xxjj2021412</span></p> -->
+            <div class="con" >
+              <span class="con-name">{{data.name}}</span>
+              <span>{{data.certContent}}</span>
+            </div>
+            <span class="foot-term" :style="{bottom:'+data.top+'+'px'}">{{data.validTerm}}</span>
+            <span class="foot-cert">{{data.certId}}</span>
+            <span class="foot-date">{{data.issueDate}}</span>
+            <!-- <p class="con">特发此证。</p>
+            <div class="con-unit">
+              <p>广东省教师继续教育学会</p>
+            </div>  -->
+            <!-- <div class="con-footer">
+              <p>广东省教师继续教育学会证书查询:</p>
+              <p>请关注学会微信公众号“粤师继教”(gqisjxjyxh)查询</p>
+            </div> -->
+            <!-- <div class="cert-msg">
+              <p>证书编号:{{data.d_code}}</p>
+              <p>发证时间:{{data.issue_date}}</p>
+            </div> -->
           </div>
-          <div class="label-box">
-              <div class="label-title">
-                  <p>证书编码</p>
-              </div>
-              <input type="text" v-model="certNumber" class="label-input" />
-          </div>
-          <div class="label-box">
-              <div class="label-title">
-                  <p>验证码<span class="label-must">*</span></p>
-              </div>
-              <input type="text" v-model="code" class="label-input" style="border-color:#acb1b5"/>
-              <div class="captcha-img">
-                  <img :src="codeUrl" @click="getCode" class="login-code-img"/>
-              </div>
-          </div>
-          <div class="btn-box">
-              <button class="btn-reset">重置</button>
-              <button class="btn-search" @click="handleSearch">查询</button>
-          </div>
-      </div>
+          <!-- <img :src="imgUrl" > -->
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <!-- <el-checkbox v-model="isShow" style="margin-right: 20px;">添加盖章</el-checkbox> -->
+          <el-button @click="handleClose">取 消</el-button>
+          <!-- <el-button type="primary" @click="makePoster">下载</el-button>   bnm,.//.,mnbvcx
+           -->
+          <el-button type="primary" @click="getPdf('#pdfDom')">下载</el-button>
+        </span>
+      </el-dialog>
     </div>
 </template>
-  
+
 <script>
-import { getCodeImg,checkCode } from "@/api/login";
+import { getCodeImg,checkCode} from "@/api/login";
 import { getCert } from "@/api/system/contract";
 export default {
   data() {
     return {
+      pic:require('@/assets/certback/appiontment_page-0001.jpg'),
       userName: "",
       certNumber: "",
       code: "",
       codeUrl:"",
       captchaEnabled:true,
       uuid:"",
+      dialogVisible: false,
+      iconShow:false,
+      dist:"cert_b_type",
+      pageData: null, //接收html格式代码
+      htmlTitle: "结业证书",
+      isShow: true,
+      isCanvas: false,
+      downType: false, // false为 pdf , true为图片
+      data:{
+        certContent: null,
+        certId: "221231hhh13",
+        certMajor: 1,
+        certType: 1,
+        code: "666666666666666",
+        createBy: null,
+        createTime: null,
+        email: "littlegreen55@163.com",
+        id: 4,
+        issueDate: "2022-11-28",
+        name: "张晓翠",
+        phone: "16329009990",
+        remark: null,
+        updateBy: null,
+        updateDate: null,
+        updateTime: null,
+        validTerm: "22222222"
+      },
+      majorData:[],
     };
   },
   methods:{
@@ -57,18 +136,23 @@ export default {
           this.codeUrl = "data:image/gif;base64," + res.img;
           this.uuid = res.uuid;
         }
+        this.iconShow = false
       });
     },
     async handleSearch(){
+       this.iconShow = true
         if( this.isBlock(this.userName)){
+          this.iconShow = false
           this.$message.error("请输入持证人姓名或单位名称!")
           return;
         }
         if( this.isBlock(this.certNumber)){
+          this.iconShow = false
           this.$message.error("请输入证书编码!")
           return;
         }
         if( this.isBlock(this.code)){
+          this.iconShow = false
           this.$message.error("请输入验证码!")
           return;
         }
@@ -80,13 +164,28 @@ export default {
           code: this.code,
           uuid: this.uuid
         }
-        let codeRes = await checkCode(codeForm)
-        if(codeRes.code===200 && codeRes.msg==="success"){
-          getCert(form).then(res=>{
-            console.log(res)
-          })
+        try{
+          let codeRes = await checkCode(codeForm)
+          if(codeRes.code===200){
+            try{
+              getCert(form).then(res=>{
+                this.iconShow = false
+                this.data = res.data
+                let img = this.realUrl(this.data.url)
+                this.htmlTitle = this.data.name
+                this.data.url = img
+                this.dialogVisible = true
+                // console.log(host)
+              })
+            }catch(error){
+              this.iconShow = false
+              this.getCode()
+            }
+          }
+        }catch(err){
+          this.iconShow = false
+          this.getCode()
         }
-        // console.log(codeRes)
     },
     isBlock(str){
       if(str===""){
@@ -94,15 +193,25 @@ export default {
       }else {
         return false
       }
+    },
+    handleClose(){
+      // console.log("beforeClose")
+      this.getCode()
+      this.dialogVisible = false
+    },
+    realUrl(val){
+      return process.env.VUE_APP_BASE_API + val
     }
   },
   mounted(){
     this.getCode()
-
+  },
+  destroyed(){
+    // removeToken()
   }
 };
 </script>
-  
-<style>
 
-</style>
+<style lang="scss" scoped>
+
+</style>

+ 12 - 6
ruoyi-ui/src/views/certInquire/profess/index.vue

@@ -1,9 +1,13 @@
 <template>
     <div>
-      <div style="text-align: center;line-height: 50px;">
-          <span class="main-title" style="margin: 0 10px;font-weight: bold;" >专业能力证书查询</span>
-      </div>
-      <div>
+      <div class="main-content">
+        <div class="img-box">
+              <img src="../../../assets/logo/logo2.png" alt="广东省教师继续教育学会">
+          </div>
+        <div style="text-align: center;line-height: 50px;">
+            <span class="main-title" style="margin: 0 10px;font-weight: bold;" >专业能力证书查询</span>
+        </div>
+        <div>
           <div class="label-box">
               <div class="label-title">
                   <p>持证人姓名</p>
@@ -30,10 +34,12 @@
               <button class="btn-reset">重置</button>
               <button class="btn-search" @click="handleSearch">查询</button>
           </div>
+        </div>
       </div>
     </div>
+
 </template>
-  
+
 <script>
 import { getCodeImg } from "@/api/login";
 export default {
@@ -77,4 +83,4 @@ export default {
 
 <style>
 
-</style>
+</style>

+ 9 - 4
ruoyi-ui/src/views/certInquire/train/index.vue

@@ -1,5 +1,9 @@
 <template>
-    <div>
+  <div>
+    <div class="main-content">
+      <div class="img-box">
+            <img src="../../../assets/logo/logo2.png" alt="广东省教师继续教育学会">
+        </div>
       <div style="text-align: center;line-height: 50px;">
           <span class="main-title" style="margin: 0 10px;font-weight: bold;" >结业证书、学时证明查询</span>
       </div>
@@ -32,8 +36,9 @@
           </div>
       </div>
     </div>
+  </div>
 </template>
-  
+
 <script>
 import { getCodeImg } from "@/api/login";
 export default {
@@ -74,7 +79,7 @@ export default {
   }
 };
 </script>
-  
+
 <style>
 
-</style>
+</style>