sign.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. <template>
  2. <!-- <headtitle isback="false" fontColor="#ffffff" :bgColor="mainColor">{{$t('tabtitle.home')}}</headtitle> -->
  3. <!-- <view class="bg">
  4. <image src="../../static/temp/background.png" mode="scaleToFill" class="img"></image>
  5. </view> -->
  6. <view class="content" v-if="project!=null">
  7. <view class="head">
  8. <div class="copy" @click="copyInfo">
  9. <svg t="1741170061594" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7878" width="40" height="40"><path d="M746.932 698.108" fill="#ffffff" p-id="7879"></path><path d="M925.731 288.698c-1.261-1.18-3.607-3.272-6.902-6.343-5.486-5.112-11.615-10.758-18.236-16.891-18.921-17.526-38.003-35.028-56.046-51.397-2.038-1.848-2.038-1.835-4.077-3.682-24.075-21.795-44.156-39.556-58.996-52.076-8.682-7.325-15.517-12.807-20.539-16.426-3.333-2.402-6.043-4.13-8.715-5.396-3.365-1.595-6.48-2.566-10.905-2.483C729.478 134.227 720 143.77 720 155.734l0 42.475 0 42.475 0 84.95L720 347l21.205 0L890 347l0 595L358.689 942C323.429 942 295 913.132 295 877.922L295 177l361.205 0c11.736 0 21.25-9.771 21.25-21.5s-9.514-21.5-21.25-21.5l-382.5 0L252 134l0 21.734L252 813l-52.421 0C166.646 813 140 786.928 140 754.678L140 72l566.286 0C739.29 72 766 98.154 766 130.404L766 134l40 0 0-3.596C806 76.596 761.271 33 706.286 33L119.958 33 100 33l0 19.506 0 702.172C100 808.463 144.642 852 199.579 852L252 852l0 25.922C252 936.612 299.979 984 358.689 984l552.515 0L932 984l0-21.237L932 325.635 932 304l0.433 0C932.432 299 930.196 292.878 925.731 288.698zM762 304l0-63.315L762 198.21l0-0.273c14 11.479 30.3 26.369 49.711 43.942 2.022 1.832 2.136 1.832 4.157 3.665 17.923 16.259 36.957 33.492 55.779 50.926 2.878 2.666 5.713 5.531 8.391 7.531L762 304.001z" fill="#ffffff" p-id="7880"></path><path d="M816.936 436 407.295 436c-10.996 0-19.91 8.727-19.91 19.5 0 10.77 8.914 19.5 19.91 19.5l409.641 0c11 0 19.914-8.73 19.914-19.5C836.85 444.727 827.936 436 816.936 436z" fill="#ffffff" p-id="7881"></path><path d="M816.936 553 407.295 553c-10.996 0-19.91 8.727-19.91 19.5 0 10.774 8.914 19.5 19.91 19.5l409.641 0c11 0 19.914-8.726 19.914-19.5C836.85 561.727 827.936 553 816.936 553z" fill="#ffffff" p-id="7882"></path><path d="M816.936 689 407.295 689c-10.996 0-19.91 8.729-19.91 19.503 0 10.769 8.914 19.497 19.91 19.497l409.641 0c11 0 19.914-8.729 19.914-19.497C836.85 697.729 827.936 689 816.936 689z" fill="#ffffff" p-id="7883"></path></svg>
  10. </div>
  11. <view class="title">TIKTOK Commodity</view>
  12. <!-- <view class="sec-title">Mart -24 GROUP</view> -->
  13. <image src="../../static/temp/logo.png" mode="scaleToFill" class="thesign2"></image>
  14. </view>
  15. <view class="top">
  16. <view class="item">Party A(Platform):Singapore YE SHUI FU Group Companies</view>
  17. <view class="item">Legal representative:Ryan Yap</view>
  18. <view class="item">Address:No. 8 Bulim Avenue, Singapore 648166</view>
  19. <view class="item">Gmail:connect@ych.com</view>
  20. <view class="item interval">Tel:(65) 6767 6777</view>
  21. <view class="item2">
  22. <span>Party B(Seller):</span>
  23. <input type="text" :value="seller" v-model="seller" />
  24. </view>
  25. <view class="item2">
  26. <span>Name:</span>
  27. <input type="text" :value="sellerName" v-model="sellerName" />
  28. </view>
  29. <view class="item2">
  30. <span>ID Number :</span>
  31. <input type="text" :value="id" v-model="id" />
  32. </view>
  33. <view class="item2">
  34. <span>Address :</span>
  35. <input type="text" :value="address" v-model="address" />
  36. </view>
  37. <view class="item2">
  38. <span>Tel:</span>
  39. <input type="text" :value="tel" v-model="tel" />
  40. </view>
  41. <view class="item2">
  42. <span>Gmail:</span>
  43. <input type="text" :value="gmail" v-model="gmail" />
  44. </view>
  45. </view>
  46. <view class="textcon">
  47. <view class="texts">Party A shall provide Party B with stable Platform services and technical support,
  48. ensuring the normal operation and data security of the Platform. However, Party A shall not be held
  49. responsible for service interruptions or malfunctions caused by force majeure or third-party actions.
  50. </view>
  51. <view class="texts">Party A has the right to analyze transaction data on the Platform and may use such data
  52. for Platform management, market promotion, and other purposes, provided that Party B's trade secrets are
  53. not disclosed.</view>
  54. <view class="texts">(B) Party B's Rights and Obligations
  55. Party B has the right to independently operate the Store within the scope of Platform rules, including
  56. but not limited to selecting product categories, setting pricing strategies, and conducting promotional
  57. activities.</view>
  58. <view class="texts">Party B has the right to request Party A to provide Platform services and technical
  59. support as agreed in this agreement and to evaluate Party A's service quality. If Party A fails to
  60. fulfill its service obligations, Party B may request Party A to rectify the issue within a specified
  61. time or assume corresponding liability for breach of contract.</view>
  62. <view class="texts">Party B shall comply with Platform rules and relevant laws and regulations and accept
  63. Party A's supervision and inspection. If Party B disagrees with Platform rules or Party A's decisions,
  64. it may file a complaint within the specified time, and Party A shall review and handle the matter.
  65. </view>
  66. <view class="texts">V. Intellectual Property and Confidentiality
  67. The intellectual property rights involved in the performance of this agreement shall belong to the
  68. respective parties. Neither party may use the other party's intellectual property without prior written
  69. consent.</view>
  70. <view class="texts">Both parties shall keep confidential the trade secrets, technical secrets, and customer
  71. information obtained during the cooperation and shall not disclose or use such information for any third
  72. party. This confidentiality clause shall remain valid for [X] years after the expiration of this
  73. agreement.</view>
  74. <view class="texts">VI. Amendment and Termination of the Agreement
  75. Any amendment or supplement to this agreement shall require written consent from both parties and the
  76. signing of a relevant agreement or written document.</view>
  77. <view class="texts">During the performance of this agreement, if one party discovers that the other
  78. party has violated this agreement or relevant laws and regulations, it may notify the breaching
  79. party in writing to rectify the issue within a specified time. If the breaching party fails to
  80. rectify the issue or the breach severely affects the continuation of this agreement, the
  81. non-breaching party may terminate the agreement and hold the breaching party legally responsible.
  82. </view>
  83. <view class="texts">VII. Liability for Breach
  84. If one party breaches this agreement, it shall bear liability for breach and compensate the other party
  85. for all losses incurred, including but not limited to direct losses, indirect losses, lost profits, and
  86. legal fees.</view>
  87. <view class="texts">If a party is unable to fulfill its obligations under this agreement due to force
  88. majeure or other unforeseeable, unavoidable, and insurmountable reasons, that party shall not be held
  89. liable for breach, but it shall promptly notify the other party and provide relevant proof.</view>
  90. <view class="texts">VIII. Dispute Resolution
  91. The conclusion, performance, interpretation, and dispute resolution of this agreement shall be governed
  92. by the laws of the People's Republic of China. If disputes arise during the performance of this
  93. agreement, both parties shall first attempt to resolve them through friendly consultation. If
  94. consultation fails, either party may file a lawsuit with the competent people's court.</view>
  95. <view class="texts">IX. Miscellaneous
  96. This agreement shall take effect upon being signed (or sealed) by both parties and shall remain valid
  97. for [3] years. Upon expiration, if neither party raises objections, the agreement shall automatically
  98. renew for another [3] years.</view>
  99. <view class="texts">This agreement is made in two copies, with each party holding one copy, both having the
  100. same legal effect.</view>
  101. <!-- <view class="date">Date: {{egyptTime}}</view> -->
  102. <view class="signature">
  103. <view class="sign sign1">
  104. <view class="title">
  105. <!-- <text>Signature</text> -->
  106. <!-- <text @click="open" v-if="!tempImage"> (click here)</text>
  107. <image :src="'data:image/jpg;base64,'+tempImage" mode="scaleToFill" class="thesign"
  108. @click="open" v-else></image> -->
  109. </view>
  110. <view class="title">Party A (Seal): YCH Group Singapore</view>
  111. <view class="">Legal Representative (Signature): Ryan Yap</view>
  112. <view class="">Date of Signing: February 3, 2025</view>
  113. <view class="">
  114. <image src="../../static/temp/commit.png" mode="scaleToFill" class="commit"></image>
  115. </view>
  116. </view>
  117. <view class="sign sign2">
  118. <view class="title">Party B (Signature):
  119. <text @click="open" v-if="!tempImage">__________________</text>
  120. <image :src="tempImage" mode="scaleToFill" class="thesign"
  121. @click="open" v-else></image>
  122. </view>
  123. <view class="date">
  124. Date of Signing:
  125. <view class="dateItem">
  126. <text class="under">_______</text>
  127. <input type="number" class="year" maxlength="4" :value="year" v-model="year" />Year
  128. </view>
  129. <view class="dateItem">
  130. <text class="under">___</text>
  131. <input type="number" class="day" maxlength="2" :value="month" v-model="month" />Month
  132. </view>
  133. <view class="dateItem">
  134. <text class="under">___</text>
  135. <input type="number" class="day" maxlength="2" :value="day" v-model="day" />Day
  136. </view>
  137. </view>
  138. <!-- <image src="../../static/temp/sign.png" mode="scaleToFill" class="thesign2"></image> -->
  139. </view>
  140. </view>
  141. </view>
  142. </view>
  143. <uv-action-sheet ref="actionSheet" title="Signature" @close="close">
  144. <view class="signature">
  145. <canvas class="handWriting" :disable-scroll="true" @touchstart="uploadScaleStart"
  146. @touchmove="uploadScaleMove" canvas-id="handWriting"></canvas>
  147. </view>
  148. <view class="btns">
  149. <view @click="retDraw" class="btn reset">clear</view>
  150. <view @click="saveCanvasAsImg" class="btn submit">submit</view>
  151. </view>
  152. </uv-action-sheet>
  153. <notice :show="success" :text="$t('user.incrate')"></notice>
  154. </template>
  155. <script setup>
  156. import {
  157. onMounted,
  158. ref
  159. } from 'vue';
  160. import {
  161. useUserStore,
  162. useProjectStore,
  163. useColortore
  164. } from '@/store/index.js';
  165. import {
  166. onShow,
  167. onLoad
  168. } from '@dcloudio/uni-app'
  169. import storage from "@/utils/storage.js"
  170. import {
  171. t
  172. } from '@/locale'
  173. import {
  174. navBack,
  175. navTo,
  176. reLaunch
  177. } from '@/utils/navigate';
  178. import {
  179. useRoute
  180. } from 'vue-router'
  181. const project = ref({})
  182. const success = ref(false)
  183. const successText = ref('')
  184. const mainColor = ref('')
  185. const taski = ref('')
  186. const seller = ref('')
  187. const sellerName = ref('')
  188. const id = ref('')
  189. const address = ref('')
  190. const tel = ref('')
  191. const gmail = ref('')
  192. const year = ref()
  193. const month = ref()
  194. const day = ref()
  195. const img = ref()
  196. onLoad((option) => {
  197. // 定义一个辅助函数,用于安全赋值
  198. const safeAssign = (target, key, defaultValue = '') => {
  199. if (option[key] !== undefined && option[key] !== 'undefined' && option[key] !== null && option[
  200. key] !== '') {
  201. target.value = option[key];
  202. } else {
  203. target.value = defaultValue;
  204. }
  205. };
  206. // 使用辅助函数进行安全赋值
  207. safeAssign(seller, 'seller');
  208. safeAssign(sellerName, 'sellerName');
  209. safeAssign(id, 'id');
  210. safeAssign(address, 'address');
  211. safeAssign(tel, 'tel');
  212. safeAssign(gmail, 'gmail');
  213. safeAssign(img,'img')
  214. safeAssign(year, 'year', null); // 默认值为 null
  215. safeAssign(month, 'month', null); // 默认值为 null
  216. safeAssign(day, 'day', null); // 默认值为 null
  217. })
  218. const copyInfo = () => {
  219. let info ="?"
  220. if (seller.value!="" && seller.value!=null && seller.value!=undefined ){
  221. if(info=="?"){
  222. info = info +"seller=" + seller.value
  223. }else{
  224. info = info +"&seller=" + seller.value
  225. }
  226. }
  227. if (sellerName.value!="" && sellerName.value!=null && sellerName.value!=undefined ){
  228. if(info=="?"){
  229. info = info +"sellerName=" + sellerName.value
  230. }else{
  231. info = info +"&sellerName=" + sellerName.value
  232. }
  233. }
  234. if (id.value!="" && id.value!=null && id.value!=undefined ){
  235. if(info=="?"){
  236. info = info +"id=" + id.value
  237. }else{
  238. info = info +"&id=" + id.value
  239. }
  240. }
  241. if (address.value!="" && address.value!=null && address.value!=undefined ){
  242. if(info=="?"){
  243. info = info +"address=" + address.value
  244. }else{
  245. info = info +"&address=" + address.value
  246. }
  247. }
  248. if (tel.value!="" && tel.value!=null && tel.value!=undefined ){
  249. if(info=="?"){
  250. info = info +"tel=" + tel.value
  251. }else{
  252. info = info +"&tel=" + tel.value
  253. }
  254. }
  255. if (gmail.value!="" && gmail.value!=null && gmail.value!=undefined ){
  256. if(info=="?"){
  257. info = info +"gmail=" + gmail.value
  258. }else{
  259. info = info +"&gmail=" + gmail.value
  260. }
  261. }
  262. if (year.value!="" && year.value!=null && year.value!=undefined ){
  263. if(info=="?"){
  264. info = info +"year=" + year.value
  265. }else{
  266. info = info +"&year=" + year.value
  267. }
  268. }
  269. if (month.value!="" && month.value!=null && month.value!=undefined ){
  270. if(info=="?"){
  271. info = info +"month=" + month.value
  272. }else{
  273. info = info +"&month=" + month.value
  274. }
  275. }
  276. if (day.value!="" && day.value!=null && day.value!=undefined ){
  277. if(info=="?"){
  278. info = info +"day=" + day.value
  279. }else{
  280. info = info +"&day=" + day.value
  281. }
  282. }
  283. let tempImageSrc=localStorage.getItem('img')
  284. if (tempImageSrc!="" && tempImageSrc!=undefined){
  285. if(info=="?"){
  286. info = info +"img=" + tempImageSrc
  287. }else{
  288. info = info +"&img=" + tempImageSrc
  289. }
  290. }
  291. console.log(info)
  292. const currentUrl = window.location.hostname;
  293. const data = currentUrl + info
  294. console.log(data)
  295. uni.setClipboardData({
  296. data:data,
  297. success: function() {
  298. //调用方法成功
  299. uni.showToast({
  300. title:"Copy success"
  301. })
  302. }
  303. })
  304. }
  305. </script>
  306. <script>
  307. import {
  308. t,
  309. setLocale
  310. } from '@/locale'
  311. import {
  312. useUserStore,
  313. useProjectStore
  314. } from '@/store/index.js';
  315. import {
  316. itembuy,
  317. updateprofile,
  318. uploadImage
  319. } from '@/api/index.js'
  320. import {
  321. navTabbar
  322. } from '@/utils/navigate';
  323. export default {
  324. data() {
  325. return {
  326. canvasName: 'handWriting',
  327. ctx: '',
  328. startX: null,
  329. startY: null,
  330. canvasWidth: 0,
  331. canvasHeight: 0,
  332. selectColor: 'black',
  333. lineColor: '#1A1A1A', // 颜色
  334. lineSize: 5, // 笔记倍数
  335. name: '', //用来区分多个签字
  336. imageSrc: '',
  337. success: false,
  338. error: false,
  339. successText: '',
  340. errorText: '',
  341. tempImage: '',
  342. };
  343. },
  344. onLoad(options) {
  345. // console.log('name', name);
  346. this.name = options.name
  347. if (options.img!="" && options.img!=undefined){
  348. this.tempImage = options.img;
  349. }
  350. this.ctx = uni.createCanvasContext("handWriting");
  351. this.$nextTick(() => {
  352. uni.createSelectorQuery().select('.handCenter').boundingClientRect(rect => {
  353. // console.log(rect);
  354. // this.canvasWidth = rect.width;
  355. // this.canvasHeight = rect.height;
  356. /* 将canvas背景设置为 白底,不设置 导出的canvas的背景为透明 */
  357. this.setCanvasBg('#fff');
  358. })
  359. .exec();
  360. });
  361. },
  362. methods: {
  363. open() {
  364. this.$refs.actionSheet.open();
  365. },
  366. select(e) {
  367. // console.log('选中该项:', e);
  368. },
  369. close() {
  370. // console.log('关闭');
  371. },
  372. // 笔迹开始
  373. uploadScaleStart(e) {
  374. this.startX = e.changedTouches[0].x
  375. this.startY = e.changedTouches[0].y
  376. //设置画笔参数
  377. //画笔颜色
  378. this.ctx.setStrokeStyle(this.lineColor)
  379. //设置线条粗细
  380. this.ctx.setLineWidth(this.lineSize)
  381. //设置线条的结束端点样式
  382. this.ctx.setLineCap("round") //'butt'、'round'、'square'
  383. //开始画笔
  384. this.ctx.beginPath()
  385. },
  386. // 笔迹移动
  387. uploadScaleMove(e) {
  388. //取点
  389. let temX = e.changedTouches[0].x
  390. let temY = e.changedTouches[0].y
  391. //画线条
  392. this.ctx.moveTo(this.startX, this.startY)
  393. this.ctx.lineTo(temX, temY)
  394. this.ctx.stroke()
  395. this.startX = temX
  396. this.startY = temY
  397. this.ctx.draw(true)
  398. },
  399. /**
  400. * 重写
  401. */
  402. retDraw() {
  403. this.ctx.clearRect(0, 0, 700, 730);
  404. this.ctx.draw();
  405. //设置canvas背景
  406. this.setCanvasBg('#fff');
  407. },
  408. //生成图片
  409. saveCanvasAsImg() {
  410. // console.log(this.startX, this.startY);
  411. if (!this.startX || !this.startY) {
  412. uni.showToast({
  413. title: t('user.signature_alert_tip'),
  414. icon: 'none'
  415. })
  416. return
  417. }
  418. let that = this
  419. uni.canvasToTempFilePath({
  420. canvasId: 'handWriting',
  421. fileType: 'png',
  422. quality: 1, //图片质量
  423. success: (res) => {
  424. console.log(res)
  425. const projectStore = useProjectStore()
  426. projectStore.project.loan_sign = res.tempFilePath;
  427. let tempImageSrc = res.tempFilePath.replace("data:image/png;base64,", "");
  428. let that = this;
  429. //
  430. uni.uploadFile({
  431. url: 'https://tiktokhelps.com/upload.php',
  432. filePath: res.tempFilePath,
  433. name: 'file',
  434. success: (res) => {
  435. const temp = JSON.parse(res.data)
  436. if(temp.url!=undefined){
  437. localStorage.setItem('img',temp.url)
  438. that.tempImage = temp.url;
  439. }
  440. }
  441. });
  442. }
  443. });
  444. this.$refs.actionSheet.close();
  445. },
  446. //设置canvas背景色 不设置 导出的canvas的背景为透明
  447. //@params:字符串 color
  448. setCanvasBg(color) {
  449. /* 将canvas背景设置为 白底,不设置 导出的canvas的背景为透明 */
  450. //rect() 参数说明 矩形路径左上角的横坐标,左上角的纵坐标, 矩形路径的宽度, 矩形路径的高度
  451. //这里是 canvasHeight - 4 是因为下边盖住边框了,所以手动减了写
  452. this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight - 4);
  453. // ctx.setFillStyle('red')
  454. this.ctx.setFillStyle(color);
  455. this.ctx.fill(); //设置填充
  456. this.ctx.draw(); //开画
  457. }
  458. }
  459. };
  460. // 获取当前时间
  461. const now = new Date();
  462. // 创建一个格式化器,指定埃及的时区
  463. const formatter = new Intl.DateTimeFormat('en-EG', {
  464. timeZone: 'Africa/Cairo',
  465. year: 'numeric',
  466. month: 'numeric',
  467. day: 'numeric'
  468. });
  469. // 格式化当前时间
  470. const egyptTime = formatter.format(now);
  471. // console.log('埃及时间:', egyptTime);
  472. </script>
  473. <style lang="scss" scoped>
  474. page {
  475. background-color: #ffffff;
  476. }
  477. .bg {
  478. width: 100vw;
  479. height: 200vh;
  480. position: absolute;
  481. z-index: 1;
  482. .img {
  483. width: 100%;
  484. height: 100%;
  485. }
  486. }
  487. .content {
  488. display: flex;
  489. flex-direction: column;
  490. position: relative;
  491. padding-bottom: 200rpx;
  492. z-index: 2;
  493. background-image: url('../../static/temp/background.png');
  494. background-repeat: no-repeat;
  495. background-position: left top;
  496. background-size: 100% 100%
  497. }
  498. .head {
  499. text-align: center;
  500. padding: 40rpx 54rpx 54rpx 40rpx;
  501. color: #ffffff;
  502. position: relative;
  503. margin-top: 80px;
  504. .copy {
  505. position: absolute;
  506. width: 150rpx;
  507. height: 200rpx;
  508. // background-color: #bc2323;
  509. right: 20rpx;
  510. }
  511. .title {
  512. font-size: 40rpx;
  513. font-weight: bold;
  514. }
  515. .sec-title {
  516. margin-top: 32rpx;
  517. }
  518. }
  519. .top {
  520. color: white;
  521. padding: 60rpx;
  522. .interval {
  523. margin-bottom: 40rpx;
  524. }
  525. .item2 {
  526. display: flex;
  527. }
  528. }
  529. .textcon {
  530. color: #000000;
  531. background-color: #fff;
  532. border-radius: 10px;
  533. padding: 10px;
  534. margin: 0 30px;
  535. // height: 68vh;
  536. // overflow-y: scroll;
  537. // position: absolute;
  538. top: 200px;
  539. .texts {
  540. margin-bottom: 10px;
  541. }
  542. // .date {
  543. // font-weight: bold;
  544. // }
  545. .signature {
  546. font-size: 26rpx;
  547. margin: 30px 0 25px;
  548. .sign {
  549. position: relative;
  550. margin-right: 10px;
  551. .title {
  552. display: flex;
  553. font-weight: bold;
  554. }
  555. .date {
  556. display: flex;
  557. margin-top: 10rpx;
  558. }
  559. .dateItem {
  560. display: flex;
  561. position: relative;
  562. .under {
  563. position: absolute;
  564. }
  565. .year {
  566. font-size: 26rpx;
  567. width: 80rpx;
  568. text-align: center;
  569. }
  570. .day {
  571. font-size: 26rpx;
  572. width: 40rpx;
  573. text-align: center;
  574. }
  575. }
  576. }
  577. .sign1 {
  578. // width: 300rpx;
  579. margin-bottom: 60rpx;
  580. }
  581. }
  582. }
  583. .red {
  584. color: red;
  585. font-weight: bold;
  586. }
  587. .signature {
  588. margin: 0 auto;
  589. .handWriting {
  590. background: #fff;
  591. width: 450rpx;
  592. height: 150rpx;
  593. border: 1px solid #222222;
  594. border-radius: 20rpx;
  595. }
  596. }
  597. .btns {
  598. display: flex;
  599. justify-content: center;
  600. margin: 20px 0;
  601. .btn {
  602. padding: 10rpx 30rpx;
  603. color: #fff;
  604. border-radius: 9999rpx;
  605. }
  606. .reset {
  607. background-color: #9a9a9a;
  608. margin-right: 10px;
  609. }
  610. .submit {
  611. background-color: #bc2323;
  612. }
  613. }
  614. .commit {
  615. position: absolute;
  616. right: 10rpx;
  617. bottom: -100rpx;
  618. width: 160rpx;
  619. height: 160rpx;
  620. }
  621. .thesign {
  622. width: 30vw;
  623. height: 5vh;
  624. margin-left: 10rpx;
  625. }
  626. .thesign2 {
  627. width: 350rpx;
  628. height: 8vh;
  629. }
  630. </style>