signContract.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. <template>
  2. <view class="content">
  3. <!-- <view class="content1">
  4. <view style='width:70px'>付款方式</view>
  5. <u-radio-group v-model="dataDetails.advanceFreightService" placement="row">
  6. <u-radio :customStyle="radioCustomStyle" v-for="(item, index) in radiolist1" :key="index"
  7. :label="item.name" :name="item.name" @change="radioChange">
  8. </u-radio>
  9. </u-radio-group>
  10. </view> -->
  11. <view class="content2">
  12. <view class="title">
  13. 合同摘要
  14. </view>
  15. <view class='row-between'>
  16. <view class="gray">发货单位</view>
  17. <view class="">{{dataDetails.compName?dataDetails.compName:'个人货主'}}</view>
  18. </view>
  19. <view class='row-between'>
  20. <view class="gray">发货地</view>
  21. <view class="place">
  22. {{dataDetails.sendPrivate}}{{dataDetails.sendCity}}{{dataDetails.sendArea}}{{dataDetails.sendDetailedAddress}}
  23. </view>
  24. </view>
  25. <view class='row-between'>
  26. <view class="gray">卸货地</view>
  27. <view class=" place">
  28. {{dataDetails.unloadPrivate}}{{dataDetails.unloadCity}}{{dataDetails.unloadArea}}{{dataDetails.unloadDetailedAddress}}
  29. </view>
  30. </view>
  31. <view class='row-between'>
  32. <view class="gray">货名</view>
  33. <view class="">{{dataDetails.goodsName}}</view>
  34. </view>
  35. <view class='row-between'>
  36. <view class="gray">距离</view>
  37. <view class="">约{{dataDetails.distance}}公里</view>
  38. </view>
  39. <view class='row-between'>
  40. <!-- 后加 -->
  41. <view class="gray">服务费(元)</view>
  42. <view class="">{{dataDetails.serviceCharge}}</view>
  43. </view>
  44. <view class="title">
  45. 完善信息
  46. </view>
  47. <view class='row-between'>
  48. <view class="gray">运费</view>
  49. <!-- <view class="">{{dataDetails.freight}}{{dataDetails.illingMethod==0?'元/吨':'元/车'}}</view> -->
  50. <!-- <view class="flex"><input type="text" placeholder="请输入运费" v-model="dataDetails.freight"
  51. class="text-align-right yf-input">{{dataDetails.freight}}元/车</view> -->
  52. <view class="flex">
  53. <u--input placeholder="请输入运费" border="none" type="number" v-model="dataDetails.freight"
  54. inputAlign='right' clearable></u--input>
  55. <!-- <span>元/车</span> -->
  56. </view>
  57. </view>
  58. <view class='row-between'>
  59. <view class="gray">车牌号</view>
  60. <view class="" style="color:#BBBBBB;" @click="carClick">
  61. {{dataDetails.carrierInfo.carNo?dataDetails.carrierInfo.carNo:'请选择车牌号'}}
  62. </view>
  63. <!-- <view class="flex">
  64. <input class="" v-model='dataDetails.carrierInfo.carNo' @click.stop="handleShowKeyboard"
  65. :disabled="true" placeholder="输入车牌号" name="input" style="text-align: right;"></input>
  66. </view> -->
  67. </view>
  68. <view class='row-between'>
  69. <view class="gray">挂车号(选填)</view>
  70. <view class="flex">
  71. <u--input placeholder="请输入挂车号" border="none" disabled v-model="dataDetails.trailerNumber"
  72. inputAlign='right' clearable></u--input>
  73. </view>
  74. </view>
  75. <view class='row-between'>
  76. <view class="gray">装车净重</view>
  77. <view class="flex">
  78. <u--input placeholder="请输入装车净重" border="none" v-model="dataDetails.weight" inputAlign='right'
  79. clearable></u--input>
  80. </view>
  81. </view>
  82. <view class='row-between'>
  83. <view class="gray">运输开始日期</view>
  84. <view class="">
  85. <view @click="dateShow">{{dataDetails.startDates?dataDetails.startDates:'请选择运输开始日期'}}
  86. </view>
  87. <u-calendar :show="startShow" mode="single" @confirm="startDate" @close="startShow= false">
  88. </u-calendar>
  89. </view>
  90. </view>
  91. <view class='row-between'>
  92. <view class="gray">运输截止日期</view>
  93. <view class="">
  94. <!-- <u--input placeholder="请输入内容" border="none" v-model="dataDetails.value" inputAlign='right'
  95. clearable></u--input> -->
  96. <view class="" @click="endShow = true">{{dataDetails.endDates?dataDetails.endDates:'请选择运输截止日期'}}
  97. </view>
  98. <u-calendar :show="endShow" mode="single" @confirm="endDate" @close="endShow= false"></u-calendar>
  99. </view>
  100. </view>
  101. <view class='row-between'>
  102. <view class="gray">联络人姓名</view>
  103. <view class="">
  104. <u--input placeholder="请输入联络人姓名" border="none" v-model="dataDetails.driverName" inputAlign='right'
  105. clearable></u--input>
  106. </view>
  107. </view>
  108. <view class='row-between'>
  109. <view class="gray">联络人电话</view>
  110. <view class="">
  111. <u--input placeholder="请输入联络人电话" border="none" type="number" maxlength="11"
  112. v-model="dataDetails.driverPhone" inputAlign='right' clearable></u--input>
  113. </view>
  114. </view>
  115. <view class='row-between'>
  116. <view class="gray">装车后预付款</view>
  117. <view class="">
  118. <u--input placeholder="请输入装车后预付款" v-if="dataDetails.freightAdvance == 1" border="none"
  119. v-model="dataDetails.loadingAdvancePayment" inputAlign='right' clearable disabled></u--input>
  120. <u--input placeholder="请输入装车后预付款" v-else border="none" v-model="dataDetails.loadingAdvancePayment"
  121. inputAlign='right' clearable></u--input>
  122. </view>
  123. </view>
  124. <view class='row-between'>
  125. <view class="gray">收款账户</view>
  126. <view class="" @click="collection">
  127. {{dataDetails.bankDeposit?dataDetails.bankDeposit:"请选择收款账户"}}
  128. {{dataDetails.bankCard?dataDetails.bankCard.substring(dataDetails.bankCard.length - 4):""}}
  129. </view>
  130. </view>
  131. </view>
  132. <view class="wrapper content3">
  133. <view class="qm-row">
  134. <view class="handTitle">手写签名</view>
  135. <image src="@/static/xiangpica@2x.png" mode="widthFix" @click="retDraw" class="retDraw-image"></image>
  136. <!-- <button @click="retDraw" class="delBtn">重写</button> -->
  137. </view>
  138. <view class="handCenter">
  139. <canvas class="handWriting" :disable-scroll="true" @touchstart="uploadScaleStart"
  140. @touchmove="uploadScaleMove" canvas-id="handWriting"></canvas>
  141. </view>
  142. <view class="handRight">
  143. </view>
  144. <view class="handBtn">
  145. <!-- <image @click="selectColorEvent('black','#1A1A1A')"
  146. :src="selectColor === 'black' ? '/static/other/color_black_selected.png' : '/static/other/color_black.png'"
  147. :class="[selectColor === 'black' ? 'color_select' : '', 'black-select']"></image>
  148. <image @click="selectColorEvent('red','#ca262a')"
  149. :src="selectColor === 'red' ? '/static/other/color_red_selected.png' : '/static/other/color_red.png'"
  150. :class="[selectColor === 'red' ? 'color_select' : '', 'black-select']"></image> -->
  151. <!-- <button @click="saveCanvasAsImg" class="saveBtn">保存</button> -->
  152. <view @click="submit" class="saveBtn">提交</view>
  153. <!-- <button @click="previewCanvasImg" class="previewBtn">预览</button> -->
  154. <!-- <button @click="subCanvas" class="subBtn">完成</button> -->
  155. </view>
  156. </view>
  157. <u-picker :show="showCarList" :columns="carList" :closeOnClickOverlay='true' @close='selectTypeClose'
  158. @cancel='selectTypeClose' @confirm='confirmBtn'></u-picker>
  159. <master-keyboard ref="keyboard" keyboardtype="car" :show="keyShow" :randomNumber="true" :newCar="false"
  160. :defaultValue="carNumber" @keyboardClick="handleClick"></master-keyboard>
  161. <u-toast ref="uToast"></u-toast>
  162. <u-toast ref="uToast"></u-toast>
  163. </view>
  164. </template>
  165. <script>
  166. import {
  167. mapState
  168. } from 'vuex';
  169. var that;
  170. import uploadImage from '@/components/ossutil/uploadFile.js';
  171. export default {
  172. data() {
  173. return {
  174. showCarList: false,
  175. carList: [],
  176. carlistCopy: [],
  177. keyShow: false,
  178. carNumber: '',
  179. isScaleStart: false,
  180. radioCustomStyle: {
  181. margin: '0 0 0 10rpx'
  182. },
  183. canvasName: 'handWriting',
  184. ctx: "",
  185. startX: null,
  186. startY: null,
  187. canvasWidth: 0,
  188. canvasHeight: 0,
  189. selectColor: 'black',
  190. lineColor: '#1A1A1A', // 颜色
  191. lineSize: 5, // 笔记倍数
  192. value: true,
  193. dataDetails: {
  194. carrierInfo: {},
  195. serviceCharge:'50'
  196. },
  197. radiolist1: [{
  198. name: '平台垫付运费',
  199. disabled: false
  200. },
  201. {
  202. name: '无需平台垫付运费',
  203. disabled: false
  204. },
  205. ],
  206. startShow: false,
  207. endShow: false,
  208. };
  209. },
  210. computed: {
  211. ...mapState(['hasLogin', 'userInfo', 'firstAuthentication']),
  212. },
  213. onShow() {
  214. let payInfo = uni.getStorageSync("payInfo")
  215. if (payInfo) {
  216. this.dataDetails.bankCard = payInfo.bankCard
  217. this.dataDetails.bankDeposit = payInfo.bankDeposit
  218. this.dataDetails.bankDepositBranch = payInfo.bankDepositBranch
  219. this.dataDetails.payeeName = payInfo.payeeName
  220. } else {
  221. this.$request.baseRequest('get', '/driverPayeeInfo/getDriverPayee', {
  222. commonId: that.firstAuthentication.commonId
  223. }).then(res => {
  224. if(res.data){
  225. this.dataDetails.bankCard = res.data.bankCard
  226. this.dataDetails.bankDeposit = res.data.bankDeposit
  227. this.dataDetails.bankDepositBranch = res.data.bankDepositBranch
  228. this.dataDetails.payeeName = res.data.payeeName
  229. }
  230. })
  231. }
  232. },
  233. onLoad(options) {
  234. this.carList = []
  235. that = this
  236. // this.dataDetails = JSON.parse(options.obj)
  237. this.dataDetails = JSON.parse(decodeURIComponent(options.obj))
  238. // this.dataDetails.advanceFreightService = '平台垫付运费'
  239. this.dataDetails.carrierInfo = {}
  240. this.ctx = uni.createCanvasContext("handWriting");
  241. this.$nextTick(() => {
  242. uni.createSelectorQuery().select('.handCenter').boundingClientRect(rect => {
  243. this.canvasWidth = rect.width;
  244. this.canvasHeight = rect.height;
  245. /* 将canvas背景设置为 白底,不设置 导出的canvas的背景为透明 */
  246. this.setCanvasBg('#fff');
  247. })
  248. .exec();
  249. });
  250. uni.showLoading({
  251. title: '加载中'
  252. })
  253. this.$request.baseRequest('get', '/driverCarInfo/selectDriverCar', {
  254. driverId: that.userInfo.driverId,
  255. // driverId:this.firstAuthentication.id
  256. }).then(res => {
  257. if (res.code == '200') {
  258. uni.hideLoading()
  259. if (res.data.length > 0) {
  260. let _list = []
  261. for (let i = 0; i < res.data.length; i++) {
  262. if (res.data[i].status == '已通过') {
  263. _list.push(res.data[i].carNumber)
  264. }
  265. }
  266. that.carlistCopy = res.data
  267. that.carList = [_list]
  268. }
  269. } else {
  270. uni.$u.toast(res.message);
  271. }
  272. })
  273. .catch(res => {
  274. uni.$u.toast(res.message);
  275. });
  276. },
  277. methods: {
  278. collection() {
  279. uni.$u.route('/pages/order/bankCard');
  280. },
  281. confirmBtn(e) {
  282. this.dataDetails.carrierInfo.carNo = e.value[0]
  283. for (let i = 0; i < this.carlistCopy.length; i++) {
  284. if (e.value[0] == this.carlistCopy[i].carNumber) {
  285. this.dataDetails.trailerNumber = this.carlistCopy[i].guaCarNumber
  286. }
  287. }
  288. this.showCarList = false
  289. },
  290. selectTypeClose() {
  291. this.showCarList = false
  292. },
  293. carClick() {
  294. this.showCarList = true
  295. },
  296. //车牌号弹出键盘
  297. handleShowKeyboard() {
  298. if (!this.dataDetails.carrierInfo.carNo) {
  299. this.carNumber = ''
  300. } else {
  301. this.carNumber = this.dataDetails.carrierInfo.carNo
  302. }
  303. if (this.$refs.keyboard.open) {
  304. this.$refs.keyboard.open(false) //true 键盘显示 false 键盘隐藏
  305. } else {
  306. this.$refs.keyboard[0].open(false)
  307. }
  308. if (this.$refs.keyboard.open) {
  309. this.$refs.keyboard.open(true) //true 键盘显示 false 键盘隐藏
  310. } else {
  311. this.$refs.keyboard[0].open(true)
  312. }
  313. },
  314. //车牌号弹出键盘
  315. handleClick(e) {
  316. this.carNumber = e.value
  317. this.dataDetails.carrierInfo.carNo = e.value //键盘输入值
  318. },
  319. dateShow() {
  320. this.startShow = true
  321. },
  322. removeStart() {
  323. this.startShow = false
  324. },
  325. removeEnd() {
  326. this.endShow = false
  327. },
  328. startDate(e) {
  329. this.startShow = false
  330. this.dataDetails.startDates = e[0]
  331. },
  332. endDate(e) {
  333. this.dataDetails.endDates = e[0]
  334. this.endShow = false
  335. },
  336. submit() {
  337. if (!that.isScaleStart) {
  338. that.$refs.uToast.show({
  339. type: 'error',
  340. message: "手写签名不能为空!",
  341. })
  342. return
  343. }
  344. if (uni.$u.test.isEmpty(that.dataDetails.freight)) {
  345. that.$refs.uToast.show({
  346. type: 'error',
  347. message: "运费不能为空!",
  348. })
  349. return
  350. }
  351. if (uni.$u.test.isEmpty(that.dataDetails.startDates)) {
  352. that.$refs.uToast.show({
  353. type: 'error',
  354. message: "运输起始日期不能为空!",
  355. })
  356. return
  357. }
  358. if (uni.$u.test.isEmpty(that.dataDetails.endDates)) {
  359. that.$refs.uToast.show({
  360. type: 'error',
  361. message: "运输截止日期不能为空!",
  362. })
  363. return
  364. }
  365. if (uni.$u.test.isEmpty(that.dataDetails.driverName)) {
  366. that.$refs.uToast.show({
  367. type: 'error',
  368. message: "联络人姓名不能为空!",
  369. })
  370. return
  371. }
  372. if (uni.$u.test.isEmpty(that.dataDetails.driverPhone)) {
  373. that.$refs.uToast.show({
  374. type: 'error',
  375. message: "联络人电话不能为空!",
  376. })
  377. return
  378. }
  379. if (uni.$u.test.isEmpty(that.dataDetails.loadingAdvancePayment)) {
  380. that.$refs.uToast.show({
  381. type: 'error',
  382. message: "装车后预付款不能为空!",
  383. })
  384. return
  385. }
  386. let _obj = {}
  387. _obj.trailerNumber = that.dataDetails.trailerNumber
  388. _obj.startDates = that.dataDetails.startDates
  389. _obj.endDates = that.dataDetails.endDates
  390. _obj.contactPersonName = that.dataDetails.driverName
  391. _obj.contactPersonPhone = that.dataDetails.driverPhone
  392. _obj.freightCars = that.dataDetails.freight
  393. // _obj.advanceCharge = that.dataDetails.advanceCharge
  394. _obj.id = that.dataDetails.id
  395. _obj.carNumber = that.dataDetails.carrierInfo.carNo
  396. _obj.weight = that.dataDetails.weight
  397. _obj.loadingAdvancePayment = that.dataDetails.loadingAdvancePayment
  398. _obj.typeFlag = 2
  399. uni.canvasToTempFilePath({
  400. canvasId: 'handWriting',
  401. fileType: 'png',
  402. quality: 1, //图片质量
  403. success(res) {
  404. uploadImage('image', res.tempFilePath, 'appData/',
  405. result => {
  406. // 上传成功
  407. that.dataDetails.cargoOwnerAutograph = result
  408. _obj.driverAutograph = result
  409. uni.showLoading({
  410. title: '加载中',
  411. mask: true
  412. })
  413. that.$request.baseRequest('get', '/orderInfo/setPdf', _obj).then(
  414. res => {
  415. if (res.code == 200) {
  416. uni.hideLoading()
  417. that.contractSrc = res.data
  418. uni.downloadFile({
  419. url: res.data,
  420. success: function(res) {
  421. var filePath = res.tempFilePath;
  422. uni.openDocument({
  423. filePath: filePath,
  424. showMenu: true,
  425. success: function(res) {
  426. console.log('打开文档成功');
  427. }
  428. });
  429. }
  430. });
  431. that.$refs.uToast.show({
  432. type: 'success',
  433. message: "提交成功",
  434. complete() {
  435. uni.removeStorageSync("payInfo") //如果要有银行卡缓存就删除
  436. uni.$u.route('/pages/order/confirmLoading', {
  437. obj: JSON.stringify(that
  438. .dataDetails),
  439. });
  440. // that.upCallback({
  441. // size: 10,
  442. // num: 1
  443. // })
  444. }
  445. })
  446. }
  447. })
  448. .catch(res => {
  449. uni.$u.toast(res.message);
  450. });
  451. }
  452. )
  453. }
  454. });
  455. },
  456. // change(e){
  457. // if(this.value){
  458. // this.$set(this.dataDetails,'advanceFreightService',1)
  459. // }else{
  460. // this.$set(this.dataDetails,'advanceFreightService',0)
  461. // }
  462. // },
  463. // 笔迹开始
  464. uploadScaleStart(e) {
  465. this.isScaleStart = true
  466. this.startX = e.changedTouches[0].x
  467. this.startY = e.changedTouches[0].y
  468. //设置画笔参数
  469. //画笔颜色
  470. this.ctx.setStrokeStyle(this.lineColor)
  471. //设置线条粗细
  472. this.ctx.setLineWidth(this.lineSize)
  473. //设置线条的结束端点样式
  474. this.ctx.setLineCap("round") //'butt'、'round'、'square'
  475. //开始画笔
  476. this.ctx.beginPath()
  477. },
  478. // 笔迹移动
  479. uploadScaleMove(e) {
  480. //取点
  481. let temX = e.changedTouches[0].x
  482. let temY = e.changedTouches[0].y
  483. //画线条
  484. this.ctx.moveTo(this.startX, this.startY)
  485. this.ctx.lineTo(temX, temY)
  486. this.ctx.stroke()
  487. this.startX = temX
  488. this.startY = temY
  489. this.ctx.draw(true)
  490. },
  491. /**
  492. * 重写
  493. */
  494. retDraw() {
  495. this.ctx.clearRect(0, 0, 700, 730);
  496. this.ctx.draw();
  497. //设置canvas背景
  498. this.setCanvasBg('#fff');
  499. },
  500. /**
  501. * @param {Object} str
  502. * @param {Object} color
  503. * 选择颜色
  504. */
  505. selectColorEvent(str, color) {
  506. this.selectColor = str;
  507. this.lineColor = color;
  508. },
  509. //完成
  510. subCanvas() {
  511. uni.canvasToTempFilePath({
  512. canvasId: 'handWriting',
  513. fileType: 'png',
  514. quality: 1, //图片质量
  515. success(res) {
  516. // console.log(res.tempFilePath, 'canvas生成图片地址');
  517. uni.showToast({
  518. title: '以保存'
  519. });
  520. //保存到系统相册
  521. uni.saveImageToPhotosAlbum({
  522. filePath: res.tempFilePath,
  523. success(res) {
  524. uni.showToast({
  525. title: '已成功保存到相册',
  526. duration: 2000
  527. });
  528. }
  529. });
  530. }
  531. });
  532. },
  533. //保存到相册
  534. saveCanvasAsImg() {
  535. uni.canvasToTempFilePath({
  536. canvasId: 'handWriting',
  537. fileType: 'png',
  538. quality: 1, //图片质量
  539. success(res) {
  540. console.log(res.tempFilePath, 'canvas生成图片地址');
  541. uni.saveImageToPhotosAlbum({
  542. filePath: res.tempFilePath,
  543. success(res) {
  544. uni.showToast({
  545. title: '已保存到相册',
  546. duration: 2000
  547. });
  548. }
  549. });
  550. }
  551. });
  552. },
  553. //预览
  554. previewCanvasImg() {
  555. uni.canvasToTempFilePath({
  556. canvasId: 'handWriting',
  557. fileType: 'jpg',
  558. quality: 1, //图片质量
  559. success(res) {
  560. uni.previewImage({
  561. urls: [res.tempFilePath] //预览图片 数组
  562. });
  563. }
  564. });
  565. },
  566. //设置canvas背景色 不设置 导出的canvas的背景为透明
  567. //@params:字符串 color
  568. setCanvasBg(color) {
  569. /* 将canvas背景设置为 白底,不设置 导出的canvas的背景为透明 */
  570. //rect() 参数说明 矩形路径左上角的横坐标,左上角的纵坐标, 矩形路径的宽度, 矩形路径的高度
  571. //这里是 canvasHeight - 4 是因为下边盖住边框了,所以手动减了写
  572. this.ctx.rect(0, 0, this.canvasWidth, this.canvasHeight - 4);
  573. // ctx.setFillStyle('red')
  574. this.ctx.setFillStyle(color);
  575. this.ctx.fill(); //设置填充
  576. this.ctx.draw(); //开画
  577. }
  578. }
  579. };
  580. </script>
  581. <style lang="scss" scoped>
  582. page {
  583. background: #fbfbfb;
  584. height: auto;
  585. }
  586. .content1 {
  587. background: white;
  588. border-radius: 20rpx;
  589. margin: 20rpx;
  590. padding: 30rpx 20rpx;
  591. display: flex;
  592. justify-content: space-between;
  593. .right {
  594. display: flex;
  595. }
  596. }
  597. .content2 {
  598. background: white;
  599. border-radius: 20rpx;
  600. margin: 20rpx;
  601. padding: 30rpx 20rpx;
  602. .title {
  603. font-size: 36rpx;
  604. font-weight: 700;
  605. margin-bottom: 20rpx;
  606. }
  607. .row-between {
  608. margin-bottom: 20rpx;
  609. }
  610. .left-text {
  611. margin-right: 20rpx;
  612. }
  613. .yf-input {
  614. padding-right: 10rpx;
  615. }
  616. }
  617. .content3 {
  618. background: white;
  619. border-radius: 20rpx;
  620. margin: 20rpx;
  621. padding: 30rpx 20rpx;
  622. }
  623. .place {
  624. width: 80%;
  625. text-align: right;
  626. }
  627. .handCenter {
  628. border: 4rpx dashed #e9e9e9;
  629. overflow: hidden;
  630. box-sizing: border-box;
  631. height: 500rpx;
  632. }
  633. .handWriting {
  634. background: #F9F9FB;
  635. width: 100%;
  636. height: 100%;
  637. }
  638. .handRight {
  639. display: inline-flex;
  640. align-items: center;
  641. }
  642. .handCenter {
  643. border: 4rpx dashed #e9e9e9;
  644. flex: 5;
  645. overflow: hidden;
  646. box-sizing: border-box;
  647. }
  648. .handTitle {
  649. font-size: 36rpx;
  650. color: #666;
  651. font-weight: 700;
  652. color: #333333;
  653. margin-bottom: 20rpx;
  654. }
  655. .retDraw-image {
  656. width: 50rpx;
  657. }
  658. .qm-row {
  659. display: flex;
  660. justify-content: space-between;
  661. }
  662. .saveBtn {
  663. width: 80%;
  664. background: #2772FB;
  665. color: white;
  666. text-align: center;
  667. border-radius: 50rpx;
  668. padding: 20rpx;
  669. }
  670. .handBtn {
  671. display: flex;
  672. justify-content: center;
  673. }
  674. /*
  675. .wrapper {
  676. width: 100%;
  677. height: 95vh;
  678. margin: 30rpx 0;
  679. overflow: hidden;
  680. display: flex;
  681. align-content: center;
  682. flex-direction: row;
  683. justify-content: center;
  684. font-size: 28rpx;
  685. }
  686. .handBtn button {
  687. font-size: 28rpx;
  688. }
  689. .handBtn {
  690. height: 95vh;
  691. display: inline-flex;
  692. flex-direction: column;
  693. justify-content: space-between;
  694. align-content: space-between;
  695. flex: 1;
  696. }
  697. .delBtn {
  698. position: absolute;
  699. top: 250rpx;
  700. left: 0rpx;
  701. transform: rotate(90deg);
  702. color: #666;
  703. }
  704. .delBtn image {
  705. position: absolute;
  706. top: 13rpx;
  707. left: 25rpx;
  708. }
  709. .subBtn {
  710. position: absolute;
  711. bottom: 52rpx;
  712. left: -3rpx;
  713. display: inline-flex;
  714. transform: rotate(90deg);
  715. background: #008ef6;
  716. color: #fff;
  717. margin-bottom: 30rpx;
  718. text-align: center;
  719. justify-content: center;
  720. }
  721. .saveBtn {
  722. position: absolute;
  723. top: 375rpx;
  724. left: 0rpx;
  725. transform: rotate(90deg);
  726. color: #666;
  727. }
  728. .previewBtn {
  729. position: absolute;
  730. top: 500rpx;
  731. left: 0rpx;
  732. transform: rotate(90deg);
  733. color: #666;
  734. }
  735. .uploadBtn {
  736. position: absolute;
  737. top: 625rpx;
  738. left: 0rpx;
  739. transform: rotate(90deg);
  740. color: #666;
  741. }
  742. .black-select {
  743. width: 60rpx;
  744. height: 60rpx;
  745. position: absolute;
  746. top: 30rpx;
  747. left: 25rpx;
  748. }
  749. .black-select.color_select {
  750. width: 90rpx;
  751. height: 90rpx;
  752. top: 100rpx;
  753. left: 10rpx;
  754. }
  755. .red-select {
  756. width: 60rpx;
  757. height: 60rpx;
  758. position: absolute;
  759. top: 140rpx;
  760. left: 25rpx;
  761. }
  762. .red-select.color_select {
  763. width: 90rpx;
  764. height: 90rpx;
  765. top: 120rpx;
  766. left: 10rpx;
  767. } */
  768. </style>