ecert.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. <!--
  2. 电子证书
  3. http://localhost:5173/card/#/pages/achievement/ecert/ecert
  4. https://oss-mbh5.colormaprun.com/card/#/pages/achievement/ecert/ecert
  5. -->
  6. <template>
  7. <view class="main">
  8. <my-topbar :mcName="ecertConfig.title" class="mytopbar" :showRule="false" @btnBackClick="btnBack"></my-topbar>
  9. <!-- <text class="title" v-html="ecertConfig.title"></text> -->
  10. <image v-if="canvasReady" ref="ecertImg" class="ecertImg" :style="getEcertImageStyle()" mode="aspectFit" :src="ecertUrl" @click="previewCert"></image>
  11. <div v-else class="loading-animation"></div>
  12. <view class="btnlist uni-row uni-jcse">
  13. <text v-if="isCertCreate == 0" class="btnlist-item" @click="modify">修改姓名</text>
  14. <text class="btnlist-item" @click="previewCert">预览证书</text>
  15. <text class="btnlist-item" @click="downloadCert">下载证书</text>
  16. <!-- <text class="btnlist-item" @click="shareWx">打开微信</text> -->
  17. </view>
  18. <!-- <br>
  19. <a :href="'action://down_file?filename='+encodeURIComponent('图片下载_xfl.png')+'&url='+encodeURIComponent('https://oss-mbh5.colormaprun.com/card/static/logo/xfl.png')">下载图片</a>
  20. &nbsp;
  21. <a :href="'action://down_file?filename='+encodeURIComponent('文件下载_index.html')+'&url='+encodeURIComponent('https://oss-mbh5.colormaprun.com/card/index.html')">下载文件</a>
  22. &nbsp;
  23. <a :href="'action://down_file?filename='+encodeURIComponent('音频下载_1.mp3')+'&url='+encodeURIComponent('https://oss-mbh5.colormaprun.com/card/static/audio/1.mp3')">下载音频</a>
  24. &nbsp;
  25. <br>
  26. <a :href="'action://down_file?filename='+encodeURIComponent('小视频下载_Walk_to_image_room.mp4')+'&url='+encodeURIComponent('https://oss-mbh5.colormaprun.com/card/Walk_to_image_room.mp4')">下载小视频</a>
  27. &nbsp;
  28. <a :href="'action://down_file?filename='+encodeURIComponent('大视频下载_wifidigger.mp4')+'&url='+encodeURIComponent('https://oss-mbh5.colormaprun.com/card/wifidigger.mp4')">下载大视频</a>
  29. &nbsp; -->
  30. <!-- <a href="tel:13335119550">拨打电话</a> &nbsp; -->
  31. <canvas v-if="canvasReady" canvas-id="ecert" id="ecert" class="ecert" :style="getEcertCanvasStyle()"></canvas>
  32. <uni-popup ref="modifyDialog" type="dialog">
  33. <uni-popup-dialog type="warn" mode="base" title="修改姓名" @confirm="modifyDialogConfirm">
  34. <view class="dialogView uni-column uni-jcse">
  35. <input class="uni-input" maxlength="12" placeholder="请输入姓名" placeholder-style="font-size: 14px;" v-model="newName" />
  36. <view class="dialogView-memo">( 注:姓名<span style="color: red;">只能修改一次</span> )</view>
  37. </view>
  38. </uni-popup-dialog>
  39. </uni-popup>
  40. <uni-popup ref="confirmDialog" type="dialog">
  41. <uni-popup-dialog type="warn" cancelText="取消" confirmText="确定" title="提示" :content="confirmContent"
  42. @confirm="confirmDialogConfirm"></uni-popup-dialog>
  43. </uni-popup>
  44. <!-- <movable-area :scale-area="true" class="movable-area">
  45. <movable-view class="movable-view" direction="all" :inertia="true" :scale-min="0.5" :scale-max="10" :scale="true" :out-of-bounds="true">
  46. <canvas canvas-id="ecert" id="ecert" class="ecert" :style="getEcertStyle()"></canvas>
  47. </movable-view>
  48. </movable-area> -->
  49. </view>
  50. </template>
  51. <script>
  52. import tools from '/common/tools';
  53. import {
  54. token,
  55. apiCertStyleQuery,
  56. apiUserBaseQueryInCertificate,
  57. apiCertificateCreateByUserAi,
  58. checkResCode
  59. } from '/common/api';
  60. export default {
  61. data() {
  62. return {
  63. pageName: "ecert",
  64. queryObj: {},
  65. queryString: "",
  66. token: "",
  67. certStyleType: "", // 证书样式类型 比如 "shanda1"
  68. oarId: 0, // 成就记录id
  69. dpr: 1, // 设备像素比
  70. windowWidth: uni.getSystemInfoSync().windowWidth, // 可视区域宽度
  71. // windowHeight: uni.getSystemInfoSync().windowHeight, // 可视区域高度
  72. ecertWidth: 0,
  73. ecertHeight: 0,
  74. ecertUrl: "",
  75. btnCertText: "确认生成证书",
  76. nickName: '',
  77. coiId: 0, // 报名单位id
  78. coiName: "", // 报名单位名称
  79. teamNum: 0, // 队伍
  80. compName: "", // 赛事名称
  81. certificateName: "", // 奖项名称
  82. compBt: 0, // 赛事开始时间戳
  83. compEt: 0, // 赛事结束时间戳
  84. totalSysPoint: 0, // 个人总积分
  85. totalDistance: 0, // 个人总里程,单位米
  86. isCertCreate: 0, // 是否已经生成证书(生成后不能修改昵称) 0 未生成 1 已生成
  87. ecertConfig: {},
  88. canvasReady: false,
  89. newName: "",
  90. confirmContent: ""
  91. }
  92. },
  93. onLoad(query) {
  94. // console.log(query);
  95. this.queryObj = query;
  96. this.queryString = tools.objectToQueryString(this.queryObj);
  97. // console.log(queryString);
  98. this.token = query["token"] ?? token;
  99. this.certStyleType = query["certStyleType"] ?? "";
  100. this.oarId = query["oarId"] ?? 0;
  101. this.init();
  102. },
  103. onReady() {
  104. // this.test();
  105. },
  106. methods: {
  107. init() {
  108. let that = this;
  109. uni.getSystemInfo({
  110. success: function(res) {
  111. that.dpr = res.pixelRatio;
  112. // console.log('设备像素比:', that.dpr);
  113. that.userBaseQueryInCertificate();
  114. }
  115. });
  116. },
  117. // 格式化 距离
  118. fmtDistanct(val) {
  119. return Math.round(val * 100 / 1000) / 100;
  120. },
  121. // 格式化 赛事日期
  122. fmtMcTime(timestamp1, timestamp2) {
  123. return tools.fmtMcTime3(timestamp1, timestamp2);
  124. },
  125. getEcertImageStyle() {
  126. if (this.ecertWidth == 0) {
  127. return "";
  128. }
  129. const ratio = 0.9;
  130. const width = this.windowWidth * ratio;
  131. const height = Math.round(this.windowWidth / this.ecertWidth * this.ecertHeight) * ratio;
  132. let style = "";
  133. style += "width: " + width + "px;";
  134. style += "height: " + height + "px;";
  135. // console.log("[getEcertImageStyle]", style);
  136. return style;
  137. },
  138. getEcertCanvasStyle() {
  139. let style = "";
  140. style += "width: " + this.ecertWidth + "px;";
  141. style += "height: " + this.ecertHeight + "px;";
  142. // console.log("[getEcertCanvasStyle]", style);
  143. return style;
  144. },
  145. getParamValue(paramName) {
  146. let value = null;
  147. if (paramName == "coiName") {
  148. value = "(" + this.coiName + ")";
  149. } else if (paramName == "totalDistance") {
  150. value = this.fmtDistanct(this.totalDistance);
  151. } else if (paramName == "compTime") {
  152. value = this.fmtMcTime(this.compBt, this.compEt);
  153. } else {
  154. return this[paramName];
  155. }
  156. return value;
  157. },
  158. drawText(param, text, context) {
  159. if (param.font != undefined) {
  160. const font = param.font;
  161. if (font.align != undefined && font.align.length > 0) {
  162. context.setTextAlign(font.align);
  163. }
  164. if (font.size != undefined && font.size > 0) {
  165. const font_family = (font.family != undefined && font.family.length > 0) ? font.family : "Arial";
  166. const font_size = Math.round(font.size / this.dpr);
  167. let style = `${font_size}px ${font_family}`;
  168. if (font.preStyle != undefined && font.preStyle.length > 0) {
  169. style = `${font.preStyle} ${style}`;
  170. }
  171. // console.log(style);
  172. context.font = style;
  173. }
  174. // if (font.size != undefined && font.size > 0) {
  175. // context.setFontSize(font.size / this.dpr);
  176. // }
  177. if (font.color != undefined && font.color.length > 0) {
  178. context.fillStyle = font.color;
  179. }
  180. }
  181. context.fillText(text, param.position.x / this.dpr, param.position.y / this.dpr);
  182. },
  183. makeCert() {
  184. let that = this;
  185. // console.log("[makeCert]", that.ecertConfig.tplUrl);
  186. const ctx = uni.createCanvasContext('ecert');
  187. ctx.drawImage(that.ecertConfig.tplUrl, 0, 0, that.ecertWidth, that.ecertHeight);
  188. for (var i = 0; i < that.ecertConfig.paramList.length; i++) {
  189. const param = that.ecertConfig.paramList[i];
  190. const text = that.getParamValue(param.paramName);
  191. that.drawText(param, text, ctx);
  192. }
  193. ctx.draw(true, () => {
  194. // 在这里调用uni.canvasToTempFilePath,确保绘制完成
  195. uni.canvasToTempFilePath({
  196. canvasId: 'ecert',
  197. success: function(res) {
  198. // 在H5平台下,tempFilePath 为 base64
  199. // console.log(res.tempFilePath);
  200. let imageData = res.tempFilePath;
  201. that.ecertUrl = imageData;
  202. }
  203. });
  204. });
  205. },
  206. // 查询电子证书样式
  207. certStyleQuery() {
  208. uni.request({
  209. url: apiCertStyleQuery,
  210. header: {
  211. "Content-Type": "application/x-www-form-urlencoded",
  212. "token": this.token,
  213. },
  214. method: "POST",
  215. data: {
  216. "certStyleType": this.certStyleType
  217. },
  218. success: (res) => {
  219. // console.log("certStyleQuery", res);
  220. if (res.data.code == 0) {
  221. const data = res.data.data;
  222. const ecertConfig = data.configJson != "" ? JSON.parse(data.configJson) : "";
  223. this.ecertConfig = ecertConfig;
  224. /* this.ecertConfig = {
  225. "title": "完赛证书",
  226. "tplUrl": "/static/ecert/ecert_tpl.jpg",
  227. "width": 2000,
  228. "height": 2828,
  229. "paramList": [
  230. {
  231. "paramName": "compName",
  232. "font": {
  233. "preStyle": "bold",
  234. "size": 86,
  235. "family": "",
  236. "color": "#000000",
  237. "align": "center"
  238. },
  239. "position": {
  240. "x": 1000,
  241. "y": 1550
  242. }
  243. },
  244. {
  245. "paramName": "compTime",
  246. "font": {
  247. "preStyle": "",
  248. "size": 44,
  249. "family": "",
  250. "color": "#000000",
  251. "align": "center"
  252. },
  253. "position": {
  254. "x": 1100,
  255. "y": 1643
  256. }
  257. },
  258. {
  259. "paramName": "certificateName",
  260. "font": {
  261. "preStyle": "bold",
  262. "size": 116,
  263. "family": "",
  264. "color": "#fe0000",
  265. "align": "center"
  266. },
  267. "position": {
  268. "x": 1000,
  269. "y": 1900
  270. }
  271. },
  272. {
  273. "paramName": "nickName",
  274. "font": {
  275. "preStyle": "bold",
  276. "size": 56,
  277. "family": "",
  278. "color": "#000000",
  279. "align": "center"
  280. },
  281. "position": {
  282. "x": 1000,
  283. "y": 2120
  284. }
  285. },
  286. {
  287. "paramName": "coiName",
  288. "font": {
  289. "preStyle": "",
  290. "size": 46,
  291. "family": "",
  292. "color": "#646363",
  293. "align": "center"
  294. },
  295. "position": {
  296. "x": 1000,
  297. "y": 2200
  298. }
  299. },
  300. {
  301. "paramName": "totalDistance",
  302. "font": {
  303. "preStyle": "",
  304. "size": 40,
  305. "family": "",
  306. "color": "#fe0000",
  307. "align": "center"
  308. },
  309. "position": {
  310. "x": 910,
  311. "y": 1704
  312. }
  313. },
  314. {
  315. "paramName": "totalSysPoint",
  316. "font": {
  317. "preStyle": "",
  318. "size": 40,
  319. "family": "",
  320. "color": "#fe0000",
  321. "align": "left"
  322. },
  323. "position": {
  324. "x": 1320,
  325. "y": 1704
  326. }
  327. }
  328. ]
  329. }; */
  330. // console.log("ecertConfig:", this.ecertConfig);
  331. this.ecertWidth = Math.round(this.ecertConfig.width / this.dpr);
  332. this.ecertHeight = Math.round(this.ecertConfig.height / this.dpr);
  333. // console.log("[certStyleQuery] ecertWidth ecertHeight:", this.ecertWidth, this.ecertHeight);
  334. this.canvasReady = true;
  335. this.$nextTick(() => {
  336. this.makeCert();
  337. });
  338. }
  339. },
  340. fail: (err) => {
  341. console.log("certStyleQuery err", err);
  342. },
  343. });
  344. },
  345. // 查询电子证书成就对应用户基本信息
  346. userBaseQueryInCertificate() {
  347. uni.request({
  348. url: apiUserBaseQueryInCertificate,
  349. header: {
  350. "Content-Type": "application/x-www-form-urlencoded",
  351. "token": this.token,
  352. },
  353. method: "POST",
  354. data: {
  355. "oarId": this.oarId
  356. },
  357. success: (res) => {
  358. // console.log("userBaseQueryInCertificate", res);
  359. if (res.data.code == 0) {
  360. const data = res.data.data;
  361. this.nickName = data.nickName;
  362. this.coiId = data.coiId;
  363. this.coiName = data.coiName;
  364. this.teamNum = data.teamNum;
  365. this.compName = data.compName;
  366. this.certificateName = data.certificateName;
  367. this.compBt = data.compBt;
  368. this.compEt = data.compEt;
  369. this.totalSysPoint = data.totalSysPoint;
  370. this.totalDistance = data.totalDistance;
  371. this.isCertCreate = data.isCertCreate;
  372. this.certStyleQuery();
  373. }
  374. },
  375. fail: (err) => {
  376. console.log("userBaseQueryInCertificate err", err);
  377. },
  378. });
  379. },
  380. // 根据成就信息确认生成电子证书
  381. certificateCreateByUserAi() {
  382. uni.request({
  383. url: apiCertificateCreateByUserAi,
  384. header: {
  385. "Content-Type": "application/x-www-form-urlencoded",
  386. "token": this.token,
  387. },
  388. method: "POST",
  389. data: {
  390. "oarId": this.oarId,
  391. "coiName": this.coiName,
  392. "coiId": this.coiId,
  393. "teamNum": this.teamNum,
  394. "nickName": this.nickName,
  395. },
  396. success: (res) => {
  397. // console.log("certificateCreateByUserAi", res);
  398. if (checkResCode(res)) {
  399. uni.showToast({
  400. icon: "none",
  401. title: "姓名修改成功",
  402. duration: 3000
  403. });
  404. }
  405. this.userBaseQueryInCertificate();
  406. },
  407. fail: (err) => {
  408. console.log("certificateCreateByUserAi err", err);
  409. uni.showToast({
  410. icon: "none",
  411. title: "姓名修改失败:" + err.message
  412. });
  413. this.userBaseQueryInCertificate();
  414. },
  415. });
  416. },
  417. modify() {
  418. if (this.isCertCreate) {
  419. uni.showToast({
  420. icon: "none",
  421. title: "不能再次修改姓名"
  422. });
  423. return;
  424. }
  425. this.newName = this.nickName;
  426. this.$refs.modifyDialog.open();
  427. },
  428. modifyDialogConfirm() {
  429. this.newName = this.newName.trim();
  430. if (this.newName.length == 0) {
  431. uni.showToast({
  432. icon: "none",
  433. title: "请输入姓名"
  434. });
  435. return;
  436. }
  437. if (this.newName != this.nickName) {
  438. this.confirmContent = `姓名:${this.newName}\r\n\r\n只能修改一次,确定要修改吗?`;
  439. this.$refs.confirmDialog.open();
  440. } else {
  441. uni.showToast({
  442. icon: "none",
  443. title: "姓名未修改,操作取消"
  444. });
  445. return;
  446. }
  447. },
  448. confirmDialogConfirm() {
  449. this.nickName = this.newName.trim();
  450. this.certificateCreateByUserAi();
  451. },
  452. previewCert() {
  453. uni.previewImage({
  454. showmenu: true,
  455. urls: [this.ecertUrl] // 需要预览的图片 HTTP 链接列表
  456. });
  457. },
  458. downloadCert() {
  459. let data = {
  460. name: `${this.compName}_${this.certificateName}_ecert.png`,
  461. content: this.ecertUrl,
  462. type: "image"
  463. };
  464. data = JSON.stringify(data);
  465. // console.log(data);
  466. save_base64.postMessage(data);
  467. /* let filename = `${this.compName}_${this.certificateName}_ecert`;
  468. // console.log("filename:", filename);
  469. filename = encodeURIComponent(filename);
  470. let fileurl = this.ecertUrl;
  471. // console.log("fileurl:", fileurl);
  472. fileurl = encodeURIComponent(fileurl);
  473. const url = `action://down_pic_base64?filename=${filename}&url=${fileurl}`;
  474. tools.appAction(url); */
  475. /* uni.downloadFile({
  476. // url: this.ecertConfig.tplUrl,
  477. // url: this.$refs.ecertImg.src,
  478. url: this.ecertUrl,
  479. success: function(downloadResult) {
  480. if (downloadResult.statusCode === 200) {
  481. // 下载成功后,尝试保存图片到本地相册
  482. uni.saveImageToPhotosAlbum({
  483. filePath: downloadResult.tempFilePath,
  484. success: function() {
  485. console.log('图片保存成功');
  486. uni.showToast({
  487. icon: "none",
  488. title: "图片保存成功",
  489. duration: 2000
  490. });
  491. },
  492. fail: function(err) {
  493. console.log('保存图片失败', err);
  494. uni.showToast({
  495. icon: "none",
  496. title: "保存图片失败:" + err.errMsg,
  497. duration: 5000
  498. });
  499. }
  500. });
  501. }
  502. },
  503. fail: function(err) {
  504. console.log('下载图片失败', err);
  505. uni.showToast({
  506. icon: "none",
  507. title: "下载图片失败:" + err.errMsg,
  508. duration: 5000
  509. });
  510. }
  511. }); */
  512. },
  513. shareWx() {
  514. let data = {
  515. title: "彩图奔跑商家版",
  516. url: "https://oss-mbh5.colormaprun.com/shop/",
  517. image: "https://oss-mbh5.colormaprun.com/shop/static/logo.png",
  518. scene: "session" // session:分享到对话 timeline:分享到朋友圈 favorite:分享到收藏
  519. };
  520. /* let data = {
  521. title: "赢商网小程序",
  522. url: "",
  523. image: "https://oss-mbh5.colormaprun.com/static/yingshangwang.png",
  524. scene: "session" // session:分享到对话 timeline:分享到朋友圈 favorite:分享到收藏
  525. }; */
  526. data = JSON.stringify(data);
  527. // console.log(data);
  528. share_wx.postMessage(data);
  529. },
  530. btnCert() {
  531. this.makeCert();
  532. },
  533. btnBack() {
  534. window.history.back();
  535. /* const url = `action://to_home/`;
  536. tools.appAction(url); */
  537. },
  538. test() {
  539. // var ctx = uni.createCanvasContext('firstCanvas')
  540. var ctx = uni.createCanvasContext('ecert')
  541. // ctx.scale(this.dpr, this.dpr);
  542. ctx.setStrokeStyle("#00ff00")
  543. ctx.setLineWidth(5)
  544. ctx.rect(0, 0, 200, 200)
  545. ctx.stroke()
  546. ctx.setStrokeStyle("red");
  547. // ctx.setLineWidth(5);
  548. ctx.moveTo(150, 20);
  549. ctx.lineTo(150, 170);
  550. ctx.stroke();
  551. ctx.setFontSize(15);
  552. ctx.setTextAlign('left');
  553. ctx.fillText('textAlign=left', 150, 60);
  554. ctx.setTextAlign('center');
  555. ctx.fillText('textAlign=center', 150, 80);
  556. ctx.setTextAlign('right');
  557. ctx.fillText('textAlign=right', 150, 100);
  558. ctx.draw()
  559. },
  560. }
  561. }
  562. </script>
  563. <style scoped>
  564. .main {
  565. width: 100vw;
  566. height: 100vh;
  567. overflow: hidden;
  568. text-align: center;
  569. }
  570. .mytopbar {
  571. padding-top: 40px;
  572. padding-bottom: 20px;
  573. margin-left: auto;
  574. margin-right: auto;
  575. }
  576. /* .title {
  577. display: block;
  578. margin-top: 35px;
  579. margin-bottom: 15px;
  580. font-size: 22px;
  581. font-weight: 550;
  582. color: #333333;
  583. } */
  584. .loading-animation {
  585. margin: 200px auto;
  586. border: 6px solid #f3f3f3;
  587. border-top: 6px solid #3498db;
  588. border-radius: 50%;
  589. width: 50px;
  590. height: 50px;
  591. animation: spin 1s linear infinite;
  592. }
  593. @keyframes spin {
  594. 0% {
  595. transform: rotate(0deg);
  596. }
  597. 100% {
  598. transform: rotate(360deg);
  599. }
  600. }
  601. .ecertImg {
  602. margin-top: 6px;
  603. margin-bottom: 20px;
  604. border: #bfbfbf solid 1px;
  605. box-shadow: 3px 3px 8px #b9b9b9;
  606. /* -webkit-touch-callout: default; */
  607. }
  608. .btnlist {
  609. width: 80%;
  610. /* height: 30px; */
  611. margin: 0px auto;
  612. /* background-color: #3498db; */
  613. }
  614. .btnlist-item {
  615. font-size: 14px;
  616. font-weight: 500;
  617. color: #383838;
  618. text-decoration: underline;
  619. }
  620. .ecert {
  621. visibility: hidden;
  622. /* width: 100vw;
  623. height: 100vh; */
  624. /* transform: scale(0.5); */
  625. }
  626. .dialogView {
  627. width: 90%;
  628. }
  629. .dialogView-memo {
  630. font-size: 12px;
  631. font-weight: 400;
  632. color: #808080;
  633. }
  634. .uni-input {
  635. width: 100%;
  636. height: 34px;
  637. margin-bottom: 10px;
  638. border: 1px solid #dcdfe6;
  639. border-radius: 4px;
  640. font-size: 14px;
  641. }
  642. ::v-deep #u-a-p > div {
  643. top: 30px !important;
  644. }
  645. /* .info {
  646. max-width: fit-content;
  647. margin-left: auto;
  648. margin-right: auto;
  649. margin-top: 30px;
  650. }
  651. .info-text {
  652. font-size: 16px;
  653. font-weight: 500;
  654. color: #333333;
  655. line-height: 30px;
  656. }
  657. .info-memo {
  658. font-size: 12px;
  659. font-weight: 400;
  660. color: #808080;
  661. line-height: 25px;
  662. }
  663. .btnCert {
  664. width: 289px;
  665. height: 53px;
  666. margin-top: 30px;
  667. margin-bottom: 20px;
  668. border-radius: 27px;
  669. background: #a43a07;
  670. color: #ffffff;
  671. line-height: 53px;
  672. } */
  673. /* .movable-area {
  674. width: 100vw;
  675. height: 80vh;
  676. background-color: #ddd;
  677. overflow: hidden;
  678. align-items: center;
  679. }
  680. .movable-view {
  681. width: 100%;
  682. height: 50%;
  683. transform: scale(0.1) !important;
  684. } */
  685. </style>