index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <div>
  3. <div class="main-content">
  4. <div class="img-box">
  5. <img src="../../../assets/logo/logo2.png" alt="广东省教师继续教育学会">
  6. </div>
  7. <div style="text-align: center;line-height: 50px;">
  8. <span class="main-title" style="margin: 0 10px;font-weight: bold;" >专业能力证书查询</span>
  9. </div>
  10. <div>
  11. <div class="label-box">
  12. <div class="label-title">
  13. <p>持证人姓名</p>
  14. <p>(或持证单位全称)</p>
  15. </div>
  16. <input type="text" v-model="userName" class="label-input" />
  17. </div>
  18. <div class="label-box">
  19. <div class="label-title">
  20. <p>证书编码</p>
  21. </div>
  22. <input type="text" v-model="certNumber" class="label-input" />
  23. </div>
  24. <div class="label-box">
  25. <div class="label-title">
  26. <p>验证码<span class="label-must">*</span></p>
  27. </div>
  28. <input type="text" v-model="code" class="label-input" style="border-color:#acb1b5"/>
  29. <div class="captcha-img">
  30. <img :src="codeUrl" @click="getCode" class="login-code-img"/>
  31. </div>
  32. </div>
  33. <div class="btn-box">
  34. <button class="btn-reset">重置</button>
  35. <button class="btn-search" @click="handleSearch" v-bind:disabled="iconShow">
  36. 查询<i class="el-icon-loading" v-show="iconShow"></i>
  37. </button>
  38. </div>
  39. </div>
  40. </div>
  41. <div style="position:fixed;top:-1200px;left:-1800px">
  42. <div id="pdfDomm" ref="posterWrap">
  43. <div class="proBox" >
  44. <img class="proBox-img z01" :src="data.backurl" />
  45. <div class="con z10" style="width: 64px; height: 83px;overflow: hidden;text-indent: 0;padding-right: 0;top: 133px;left: 182px;">
  46. <img id="pdfhead" :src="data.headurl" style="height:100%;position: absolute;left: 50%;transform: translate(-50%, -50%);top: 50%;" />
  47. </div>
  48. <div class="foot-pp z10">
  49. <p class="foot-p-name " >{{data.uesrName}}</p>
  50. <p class="foot-p-ID ">{{data.userId}}</p>
  51. <p class="foot-p-cert ">{{data.certId}}</p>
  52. <p class="foot-p-date ">{{data.issueDate}}</p>
  53. </div>
  54. <div class="content z10" style="position: absolute;left: 450px;width: 230px;top: 85px;font-size: 19px;line-height: 30px;text-indent: 2em;">
  55. <p style="margin:0">
  56. 持证人参加了<span class="heiti" style="margin: 0 15px;font-size: 19px;">{{data.certName}}</span>,已修完教学计划规定的全部课程,合计<span class="heiti" style="margin: 0 15px;font-size: 20px;">{{data.courseHours}}</span>学时。
  57. </p>
  58. <p style="margin:0">考核合格,准予结业,特发此证。</p>
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. <el-dialog
  64. :title="`您以证书编号:${certNumber}为关键字查询验证证书结果如下:`"
  65. :visible.sync="dialogVisible"
  66. width="fit-content"
  67. :before-close="handleClose"
  68. class="dialog-box"
  69. >
  70. <!-- <div id="pdfDom" ref="posterWrap">
  71. <div class="proBox" >
  72. <img class="proBox-img z01" :src="data.backurl" />
  73. <div class="con z10" style="width: 64px; height: 83px;overflow: hidden;text-indent: 0;padding-right: 0;top: 133px;left: 182px;">
  74. <img :src="data.headurl" style="height:100%;position: absolute;left: 50%;transform: translate(-50%, -50%);top: 50%;" />
  75. </div>
  76. <div class="foot-p z10">
  77. <p class="foot-p-name " >{{data.uesrName}}</p>
  78. <p class="foot-p-ID ">{{data.userId}}</p>
  79. <p class="foot-p-cert ">{{data.certId}}</p>
  80. <p class="foot-p-date ">{{data.issueDate}}</p>
  81. </div>
  82. <div class="content z10" style="position: absolute;left: 450px;width: 230px;top: 85px;font-size: 19px;line-height: 30px;text-indent: 2em;">
  83. <p style="margin:0">
  84. 持证人参加了<span class="heiti" style="margin: 0 15px;font-size: 19px;">{{data.certName}}</span>,已修完教学计划规定的全部课程,合计<span class="heiti" style="margin: 0 15px;font-size: 20px;">{{data.courseHours}}</span>学时。
  85. </p>
  86. <p style="margin:0">考核合格,准予结业,特发此证。</p>
  87. </div>
  88. </div>
  89. </div> -->
  90. <p >经证书系统验证查询,证书信息正确,该证书预览如下,如需下载使用,请点击“下载”按钮。</p>
  91. <img :src="imgUrl" width="750px" height="525px" ref="certimg"/>
  92. <p style="font-weight:bold;color: red;font-size: 20px;text-indent: 0;">提示:伪造证书系违法行为,请勿尝试。</p>
  93. <span slot="footer" class="dialog-footer">
  94. <el-button @click="handleClose">取 消</el-button>
  95. <el-button type="primary" @click="downloadImg">下载</el-button>
  96. <!-- getPdf('#pdfDom') -->
  97. </span>
  98. </el-dialog>
  99. <el-dialog
  100. :title="`您以证书编号:${certNumber}为关键字查询验证证书结果如下:`"
  101. :visible.sync="errorDialog"
  102. width="50%"
  103. class="errordialog-box"
  104. :before-close="handleErrorClose"
  105. >
  106. <!-- :before-close="handleClose" -->
  107. <p>未能查询到该证书,原因可能是证书编号或姓名(单位名称)输入错误, 也可能该证书为伪造证书。请重新输入准确的 证书编号 与 姓名(单位名称)信息后,再查询。谢谢您的关注。</p>
  108. <p>如有疑问,请通知持证人与我会联系。</p>
  109. <span slot="footer" class="dialog-footer">
  110. <el-button type="primary" @click="handleErrorClose" style="width:100px">确 定</el-button>
  111. </span>
  112. </el-dialog>
  113. </div>
  114. </template>
  115. <script>
  116. import { getCodeImg,checkCode} from "@/api/login"
  117. import { getACert } from "@/api/system/grad"
  118. import html2Canvas from 'html2canvas'
  119. export default {
  120. data() {
  121. return {
  122. userName: "",
  123. certNumber: "",
  124. code: "",
  125. codeUrl:"",
  126. captchaEnabled:true,
  127. uuid:"",
  128. dialogVisible: false,
  129. iconShow:false,
  130. dist:"cert_b_type",
  131. pageData: null, //接收html格式代码
  132. htmlTitle: "结业证书",
  133. isShow: true,
  134. isCanvas: false,
  135. downType: false, // false为 pdf , true为图片
  136. data:{
  137. certId: "11111111",
  138. certName: "222",
  139. certType: 0,
  140. courseHours: "222",
  141. courseName: "222",
  142. createBy: null,
  143. createTime: null,
  144. id: 3,
  145. issueDate: "2022-11-29",
  146. level: "22",
  147. picture: "/profile/2022/222_A00.jpg",
  148. remark: null,
  149. trainPeriod: "222",
  150. uesrName: null,
  151. updateBy: null,
  152. updateDate: "2022-12-13T15:29:56.000+08:00",
  153. updateTime: null,
  154. url: "/profile/upload/2022/12/13/pro1_page-0001_20221213151348A006.jpg",
  155. userEmail:"222222",
  156. userId: "2222",
  157. userPhone: "222"
  158. },
  159. imgUrl:'',
  160. errorDialog:false,
  161. word:''
  162. };
  163. },
  164. methods:{
  165. getCode() {
  166. getCodeImg().then(res => {
  167. // console.log(res)
  168. this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
  169. if (this.captchaEnabled) {
  170. this.codeUrl = "data:image/gif;base64," + res.img;
  171. this.uuid = res.uuid;
  172. }
  173. });
  174. },
  175. async handleSearch(){
  176. this.iconShow = true
  177. if( this.isBlock(this.userName)){
  178. this.iconShow = false
  179. this.$message.error("请输入持证人姓名或单位名称!")
  180. return;
  181. }
  182. if( this.isBlock(this.certNumber)){
  183. this.iconShow = false
  184. this.$message.error("请输入证书编码!")
  185. return;
  186. }
  187. if( this.isBlock(this.code)){
  188. this.iconShow = false
  189. this.$message.error("请输入验证码!")
  190. return;
  191. }
  192. const form = {
  193. userName: this.userName,
  194. certNumber: this.certNumber,
  195. certType:0
  196. }
  197. const codeForm = {
  198. code: this.code,
  199. uuid: this.uuid
  200. }
  201. try{
  202. let codeRes = await checkCode(codeForm)
  203. // console.log(codeRes)
  204. if(codeRes.code===200){
  205. try{
  206. getACert(form).then(res=>{
  207. if(res.data){
  208. this.iconShow = false
  209. this.data = res.data
  210. // console.log(this.data)
  211. let backimg = this.realUrl(this.data.url)
  212. let headimg = this.realUrl(this.data.picture)
  213. this.htmlTitle = this.data.uesrName
  214. this.data.backurl = backimg
  215. this.data.headurl = headimg
  216. // 创建html代码
  217. // this.makeHtml()
  218. this.$nextTick(()=>{
  219. // 将html代码=>canvas=>img
  220. this.toImg()
  221. this.dialogVisible = true
  222. // 然后删除掉用完的html代码
  223. let e = document.getElementById('pdfDomm')
  224. e.innerHTML = ""
  225. })
  226. }else{
  227. this.errorDialog = true
  228. }
  229. })
  230. setTimeout(()=>{
  231. if(this.iconShow){
  232. this.iconShow = false
  233. }
  234. },10000)
  235. }catch(error){
  236. this.iconShow = false
  237. this.getCode()
  238. }
  239. }
  240. }catch(err){
  241. this.iconShow = false
  242. this.getCode()
  243. }
  244. },
  245. isBlock(str){
  246. if(str===""){
  247. return true
  248. }else {
  249. return false
  250. }
  251. },
  252. handleClose(){
  253. this.iconShow = false
  254. this.getCode()
  255. this.dialogVisible = false
  256. },
  257. handleErrorClose(){
  258. this.iconShow = false
  259. this.getCode()
  260. this.errorDialog = false
  261. },
  262. realUrl(val){
  263. return process.env.VUE_APP_BASE_API + val
  264. },
  265. toImg(){
  266. // 将html代码=>canvas=>img
  267. var htmlID = document.getElementById('pdfDomm')
  268. const that = this
  269. html2Canvas(htmlID, {
  270. allowTaint: true,
  271. // 下面两个用来提高清晰度
  272. // dpi: window.devicePixelRatio*4, //将分辨率提高到特定的DPI 提高四倍
  273. dpi: 300, //将分辨率提高到特定的DPI 提高四倍
  274. scale:4, //按比例增加分辨率
  275. useCORS: true // 【重要】开启跨域配置
  276. }).then(function (canvas) {
  277. var pageData = canvas.toDataURL('image/png', 1.0);
  278. that.imgUrl = pageData
  279. })
  280. },
  281. downloadImg(){
  282. const el = document.createElement("a");
  283. // 设置 href 为图片经过 base64 编码后的字符串,默认为 png 格式
  284. el.href = this.$refs.certimg.src;
  285. el.download = this.htmlTitle;
  286. // 创建一个点击事件并对 a 标签进行触发
  287. const event = new MouseEvent("click");
  288. el.dispatchEvent(event)
  289. },
  290. makeHtml(){
  291. // js写html代码
  292. let e = document.getElementById('pdfDomm')
  293. this.word = `<div class="proBox" >
  294. <img class="proBox-img z01" src="${window.location.origin}${this.data.backurl}" />
  295. <div class="con z10" style="width: 64px; height: 83px;overflow: hidden;text-indent: 0;padding-right: 0;top: 133px;left: 182px;">
  296. <img src="${window.location.origin}${this.data.headurl}" style="height:100%;position: absolute;left: 50%;transform: translate(-50%, -50%);top: 50%;" />
  297. </div>
  298. <div class="foot-pp z10">
  299. <p class="foot-p-name ">${this.data.uesrName}</p>
  300. <p class="foot-p-ID ">${this.data.userId}</p>
  301. <p class="foot-p-cert ">${this.data.certId}</p>
  302. <p class="foot-p-date ">${this.data.issueDate}</p>
  303. </div>
  304. <div class="content z10" style="position: absolute;left: 450px;width: 230px;top: 85px;font-size: 19px;line-height: 30px;text-indent: 2em;">
  305. <p style="margin:0">
  306. 持证人参加了<span class="heiti" style="margin: 0 15px;font-size: 19px;">${this.data.certName}</span>,已修完教学计划规定的全部课程,合计<span class="heiti" style="margin: 0 15px;font-size: 20px;">${this.data.courseHours}</span>学时。
  307. </p>
  308. <p style="margin:0">考核合格,准予结业,特发此证。</p>
  309. </div>
  310. </div>`
  311. e.innerHTML = this.word
  312. }
  313. },
  314. mounted(){
  315. this.getCode()
  316. }
  317. };
  318. </script>
  319. <style lang="scss" scoped>
  320. </style>