signContract.vue 19 KB

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