signContract.vue 19 KB

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