creatProduct.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <template>
  2. <view class="creat">
  3. <view class="top"></view>
  4. <view class="head">
  5. <span class="cuIcon-back" @click="back"></span>
  6. <view class="case">
  7. 创建商品
  8. </view>
  9. </view>
  10. <view class="content">
  11. <view class="form" v-show="schedule ==1">
  12. <view class="titl">
  13. 基础信息
  14. </view>
  15. <view class="item">
  16. <view class="label">
  17. 商品分类<span>*</span>
  18. </view>
  19. <view class="picker" @click="selectProductType">
  20. <span v-if="showText == ''">选择商品分类</span>
  21. <span v-else style="color: #333333;">{{showText}}</span>
  22. <u-icon name="arrow-right"></u-icon>
  23. </view>
  24. </view>
  25. <view class="item">
  26. <view class="label">
  27. 商品名称<span>*</span>
  28. </view>
  29. <view class="picker">
  30. <u-input v-model="form.productName" placeholder="输入商品名称" />
  31. </view>
  32. </view>
  33. <view class="item upload">
  34. <view class="label">
  35. 商品封面图<span>*</span>
  36. </view>
  37. <view class="tips">
  38. 支持jpg、png格式,尺寸为00px*00px
  39. </view>
  40. <u-upload ref="uUpload" :action="action" :file-list="fmImageList" @on-success="handleSuccess"
  41. @on-remove="handleRemove" max-count="1" width="140rpx" height="140rpx"></u-upload>
  42. </view>
  43. <view class="item upload">
  44. <view class="label">
  45. 商品详情图<span>*</span>
  46. </view>
  47. <view class="tips">
  48. 支持jpg、png格式,尺寸为00px*00px,最多20张
  49. </view>
  50. <u-upload ref="dUpload" :action="action" :file-list="xqImage" @on-success="detailsSuccess"
  51. @on-remove="detailsRemove" max-count="20" width="140rpx" height="140rpx"></u-upload>
  52. </view>
  53. <view class="item">
  54. <view class="label">
  55. 原价<span>*</span>
  56. </view>
  57. <view class="picker">
  58. <u-input v-model="form.price" placeholder="输入商品原价" />
  59. </view>
  60. <view class="unit">
  61. </view>
  62. </view>
  63. <view class="item">
  64. <view class="label">
  65. 实际售价<span>*</span>
  66. </view>
  67. <view class="picker">
  68. <u-input type="num" v-model="form.soldPrice" placeholder="输入客户实际支付价" />
  69. </view>
  70. <view class="unit">
  71. </view>
  72. </view>
  73. <view class="item">
  74. <view class="label">
  75. 组合套餐
  76. </view>
  77. <view class="picker set" @click="goGroup">
  78. 去设置
  79. <u-icon name="arrow-right" style="margin-left: 17rpx;"></u-icon>
  80. </view>
  81. </view>
  82. </view>
  83. <view class="form" v-show="schedule == 2">
  84. <view class="titl ">
  85. 售卖/使用信息
  86. </view>
  87. <view class="item">
  88. <view class="label">
  89. 售卖时间<span>*</span>
  90. </view>
  91. <view class="picker set inp" @click="selectDate">
  92. <u-input placeholder="去设置" v-model="showDate" @click="selectDate" />
  93. <u-icon name="arrow-right" style="margin-left: 17rpx;"></u-icon>
  94. </view>
  95. </view>
  96. <view class="item">
  97. <view class="label">
  98. 库存<span>*</span>
  99. </view>
  100. <view class="picker set">
  101. <u-input type="number" v-model="form.stockQuantity" placeholder="输入库存数量" />
  102. </view>
  103. </view>
  104. <view class="item">
  105. <view class="label">
  106. 可用时间<span>*</span>
  107. </view>
  108. <view class="picker set">
  109. <view class="picker set inp" @click="setUsable" v-if="showSellDate == ''">
  110. <u-input placeholder="去设置" />
  111. <u-icon name="arrow-right" style="margin-left: 17rpx;"></u-icon>
  112. </view>
  113. <view class="picker set inp" @click="setUsable" v-else>
  114. <span style="color: #333333;">{{showSellDate}}</span>
  115. <u-icon name="arrow-right" style="margin-left: 17rpx;"></u-icon>
  116. </view>
  117. </view>
  118. </view>
  119. <view class="item">
  120. <view class="label">
  121. 需要预约<span>*</span>
  122. </view>
  123. <view class="picker set">
  124. <u-switch v-model="makeChecked" style="margin-left:8rpx;" size="28"></u-switch>
  125. </view>
  126. </view>
  127. <view class="item">
  128. <view class="label">
  129. 退款规则
  130. </view>
  131. <view class="picker set" @click="isRefund = true">
  132. <view class="" v-if="showRule" style="color: #333333;">
  133. {{showRule}}
  134. </view>
  135. <view class="" v-else>
  136. 请选择
  137. <u-icon name="arrow-right" style="margin-left: 17rpx;"></u-icon>
  138. </view>
  139. </view>
  140. </view>
  141. <view class="item upload">
  142. <view class="label">
  143. 使用说明
  144. </view>
  145. <view class="textarea">
  146. <u-input v-model="form.instructions" type="textarea" placeholder="输入库存数量" maxlength="500" />
  147. </view>
  148. <view class="num">
  149. <span v-if="form.instructions">{{form.instructions.length>0?form.instructions.length:'0'}}</span>/500
  150. </view>
  151. </view>
  152. </view>
  153. </view>
  154. <view class="btn">
  155. <view class="next" @click="next" v-if="schedule==1">
  156. 下一步
  157. </view>
  158. <view class="handle" v-else>
  159. <view class="back" @click="schedule-=1">
  160. 上一步
  161. </view>
  162. <view class="submit" @click="submit">
  163. 提交审核
  164. </view>
  165. </view>
  166. </view>
  167. <rangTime ref="rangTime" :mode="mode" @onSubmit="onEndTimeChange" />
  168. <refund v-if="isRefund" @confirm="saveFound" @close="cutRule" />
  169. <view class="popup" v-if="isSelectType">
  170. <view class="model">
  171. <view class="title">
  172. 商品品类
  173. <image src="/static/index/cut.png" mode="" @click="closePopup"></image>
  174. </view>
  175. <view class="tree">
  176. <view class="left">
  177. <view class="item" :class="currentLeft == index?'active':''" v-for="(item,index) in treeLeft" :key="item.id"
  178. @click="selectLeft(item,index)">
  179. {{item.name}}
  180. </view>
  181. </view>
  182. <view class="left border">
  183. <view class="item" :class="currentCenter == index?'active':''" v-for="(item,index) in treeCenter"
  184. :key="item.id" @click="selectRight(item,index)">
  185. {{item.name}}
  186. </view>
  187. </view>
  188. <view class="left">
  189. <view class="item" :class="currentRight == index?'active':''" v-for="(item,index) in treeRight"
  190. :key="item.id" @click="selectLast(item,index)">
  191. {{item.name}}
  192. </view>
  193. </view>
  194. </view>
  195. <view class="sub">
  196. <view class="submit" @click="selectType">
  197. 确定
  198. </view>
  199. </view>
  200. </view>
  201. </view>
  202. </view>
  203. </template>
  204. <script>
  205. import rangTime from '../../components/dengrq-datetime-picker/dateSelector/index.vue'
  206. import refund from '@/components/product/refund.vue'
  207. export default {
  208. components: {
  209. rangTime,
  210. refund
  211. },
  212. data() {
  213. return {
  214. mode: 1,
  215. form: {
  216. instructions: '',
  217. preBook: 0,
  218. merchantId: null
  219. // categoryId:'',
  220. // productName: '',
  221. // productImage: '',
  222. // checked: null,
  223. // num: 0,
  224. // refundLabel:null,
  225. // refundConfirm:null
  226. },
  227. fmImageList: [], //封面图回显
  228. xqImage: [], //详情图回显
  229. showRule: '', //显示退款规则文字
  230. action: 'http://192.168.0.36:8080/jeecg-boot/sys/common/upload', //图片上传地址
  231. schedule: 2, //进度
  232. fileList: [],
  233. selectedTime: null,
  234. isSelectDate: false,
  235. isRefund: false,
  236. isSelectType: false,
  237. treeLeft: [], //一级列表
  238. treeCenter: [], //二级列表
  239. treeRight: [], //三级列表
  240. currentLeft: 0, //一级选中
  241. currentCenter: 0, //二级选中
  242. currentRight: 0, //三级选中
  243. productType: [], //选中的商品分类id
  244. selectTypeList: [], //选中的商品分类名称
  245. showText: '',
  246. showDate: '',
  247. showSellDate: '',
  248. makeChecked: false,
  249. imageHttp: 'http://192.168.0.36:8080/jeecg-boot/', //上传图片前缀+
  250. productId: '',
  251. postImage: [], //上传图片详情
  252. }
  253. },
  254. methods: {
  255. // 上传封面图成功回调
  256. handleSuccess(res, index, lists) {
  257. this.form.productImage = this.imageHttp + res.message
  258. },
  259. // 移除封面图文件回调
  260. handleRemove(index, lists) {
  261. this.fmImageList = [];
  262. },
  263. //上传详情图
  264. detailsSuccess(res, index, lists) {
  265. // this.postImage.push({url:this.imageHttp + res.message})
  266. this.postImage = lists
  267. },
  268. detailsRemove(index, lists) {
  269. this.postImage = lists
  270. },
  271. //下一步
  272. next() {
  273. let temp = []
  274. if (this.postImage.length > 0) {
  275. this.postImage.forEach(item => {
  276. temp.push(this.imageHttp + item.response.message)
  277. })
  278. }
  279. if (this.xqImage.length > 0) {
  280. this.xqImage.forEach((item => {
  281. temp.push(item.url)
  282. }))
  283. }
  284. this.form.detailImages = temp.join(',')
  285. //基础信息必填提示
  286. if (!this.form.categoryId) {
  287. uni.showToast({
  288. title: '请选择商品分类',
  289. icon: 'none'
  290. });
  291. return
  292. }
  293. if (!this.form.productName) {
  294. uni.showToast({
  295. title: '请输入商品名称',
  296. icon: 'none'
  297. });
  298. return
  299. }
  300. if (!this.form.productImage) {
  301. uni.showToast({
  302. title: '请上传商品封面图',
  303. icon: 'none'
  304. });
  305. return
  306. }
  307. if (!this.form.detailImages) {
  308. uni.showToast({
  309. title: '请上传商品详情图',
  310. icon: 'none'
  311. });
  312. return
  313. }
  314. if (!this.form.price) {
  315. uni.showToast({
  316. title: '请输入商品原价',
  317. icon: 'none'
  318. });
  319. return
  320. }
  321. if (!this.form.soldPrice) {
  322. uni.showToast({
  323. title: '请输入商品售价',
  324. icon: 'none'
  325. });
  326. return
  327. } else {
  328. this.schedule += 1
  329. }
  330. },
  331. // 跳转至组合商品页
  332. goGroup() {
  333. uni.navigateTo({
  334. url: '/pages/product/group'
  335. })
  336. },
  337. //返回
  338. back() {
  339. uni.navigateTo({
  340. url: '/pages/product/index'
  341. })
  342. },
  343. // 处理 confirm 事件,接收子组件传递的时间段数据
  344. handleConfirm(time) {
  345. this.selectedTime = time; // 保存时间段数据
  346. this.isSelectDate = false
  347. },
  348. //隐藏弹窗
  349. closeSelectDate() {
  350. this.isSelectDate = false
  351. },
  352. //跳转至可用时间
  353. setUsable() {
  354. uni.navigateTo({
  355. url: '/pages/product/usable'
  356. })
  357. },
  358. // 保存退款规则
  359. saveFound(rules) {
  360. this.form.refundConfirm = rules.refundConfirm.refundConfirm
  361. this.form.refundLabel = rules.refundLabel.refundLabel
  362. let value1 = []
  363. value1.push(rules.refundConfirm.name, rules.refundLabel.name)
  364. this.showRule = value1.join("·")
  365. // this.selectedRules = rules;
  366. this.isRefund = false
  367. },
  368. cutRule() {
  369. this.isRefund = false
  370. },
  371. //获取商品分类一级列表
  372. getLeftTree() {
  373. this.$http.get("/sys/category/childList?pid=" + '1889836358116098050', {}).then(res => {
  374. if (res.data.code == 0) {
  375. this.treeLeft = res.data.result
  376. if (this.treeLeft[0]) {
  377. this.getCenterTree(this.treeLeft[0].id)
  378. }
  379. }
  380. })
  381. },
  382. //获取商品分类二级列表
  383. getCenterTree(id) {
  384. this.$http.get("/sys/category/childList?pid=" + id, {}).then(res => {
  385. if (res.data.code == 0) {
  386. this.treeCenter = res.data.result
  387. if (this.treeCenter[0]) {
  388. // this.getRightTree(this.treeCenter[0].id)
  389. }
  390. }
  391. })
  392. },
  393. //获取商品分类三级列表
  394. getRightTree(id) {
  395. this.$http.get("/sys/category/childList?pid=" + id, {}).then(res => {
  396. if (res.data.code == 0) {
  397. this.treeRight = res.data.result
  398. }
  399. })
  400. },
  401. selectProductType() {
  402. this.isSelectType = true
  403. this.showText = ''
  404. this.productType = []
  405. this.selectTypeList = []
  406. this.currentLeft = null
  407. this.currentCenter = null
  408. this.currentRight = null
  409. },
  410. //选中一级
  411. selectLeft(item, index) {
  412. this.currentLeft = index
  413. this.currentCenter = null
  414. this.currentRight = null
  415. this.treeCenter = []
  416. this.treeRight = []
  417. this.productType = []
  418. this.selectTypeList = []
  419. this.productType.push(item.id)
  420. this.selectTypeList.push(item.name)
  421. this.getCenterTree(item.id)
  422. },
  423. //选中二级
  424. selectRight(item, index) {
  425. this.getRightTree(this.treeCenter[0].id)
  426. this.currentCenter = index
  427. this.currentRight = null
  428. if (this.selectTypeList.length >= 2) {
  429. this.productType.splice(1, 2)
  430. this.selectTypeList.splice(1, 2)
  431. }
  432. this.productType.push(item.id)
  433. this.selectTypeList.push(item.name)
  434. this.getRightTree(item.id)
  435. },
  436. //选中三级
  437. selectLast(item, index) {
  438. if (this.selectTypeList.length >= 3) {
  439. this.productType.splice(2, 1)
  440. this.selectTypeList.splice(2, 1)
  441. }
  442. this.productType.push(item.id)
  443. this.selectTypeList.push(item.name)
  444. this.currentRight = index
  445. },
  446. //确定分类
  447. selectType() {
  448. this.isSelectType = false
  449. this.form.categoryId = this.productType.join(',')
  450. this.showText = this.selectTypeList.join('·')
  451. },
  452. //关闭选择分类弹窗
  453. closePopup() {
  454. this.isSelectType = false
  455. },
  456. selectDate() {
  457. // this.isSelectDate = true
  458. this.$refs.rangTime.open()
  459. },
  460. onEndTimeChange(val) {
  461. this.form.saleStartDate = val.startDate
  462. this.form.saleEndDate = val.endDate
  463. this.showDate = val.startDate + '-' + val.endDate
  464. this.$forceUpdate(); // 强制刷新视图
  465. },
  466. //提交审核
  467. submit() {
  468. this.makeChecked ? this.form.preBook = 1 : this.form.preBook = 0
  469. if (!this.form.saleStartDate) {
  470. uni.showToast({
  471. title: '请设置售卖时间',
  472. icon: 'none'
  473. });
  474. return
  475. } else if (!this.form.stockQuantity) {
  476. uni.showToast({
  477. title: '请输入商品库存',
  478. icon: 'none'
  479. });
  480. return
  481. } else if (!this.form.availableEndDate && !this.form.expirationDays) {
  482. uni.showToast({
  483. title: '请选择可用时间',
  484. icon: 'none'
  485. });
  486. return
  487. } else {
  488. if (this.productId == '') {
  489. this.$http.post("/app/product/add", this.form).then(res => {
  490. if (res.data.code == 200) {
  491. uni.showToast({
  492. title: '添加成功',
  493. icon: 'none'
  494. });
  495. }
  496. uni.removeStorage({
  497. key: 'smdate',
  498. });
  499. uni.removeStorage({
  500. key: 'group',
  501. });
  502. this.back()
  503. })
  504. } else {
  505. this.form.productId = this.productId
  506. this.$http.post("/app/product/edit", this.form).then(res => {
  507. if (res.data.code == 200) {
  508. uni.showToast({
  509. title: '编辑成功',
  510. icon: 'none'
  511. });
  512. }
  513. uni.removeStorage({
  514. key: 'smdate',
  515. });
  516. uni.removeStorage({
  517. key: 'group',
  518. });
  519. this.back()
  520. })
  521. }
  522. }
  523. },
  524. //回显数据
  525. getForm() {
  526. this.$http.get("/app/product/queryById?id=" + this.productId, {}).then(res => {
  527. console.log(res)
  528. if (res.data.code == 200) {
  529. this.form = res.data.result
  530. this.showText = res.data.result.productCategory
  531. this.fmImageList.push({
  532. url: res.data.result.productImage
  533. })
  534. let xqtemp = []
  535. xqtemp = res.data.result.detailImages.split(',')
  536. xqtemp.map(item => {
  537. this.xqImage.push({
  538. url: item
  539. })
  540. })
  541. this.showDate = res.data.result.saleStartDate.slice(0, 10) + '-' + res.data.result.saleEndDate.slice(0,
  542. 10)
  543. if (res.data.result.availableEndDate) {
  544. this.showSellDate = res.data.result.availableStartDate.slice(0, 10) + '-' + res.data.result
  545. .availableEndDate.slice(0, 10)
  546. } else if (res.data.result.expirationDays) {
  547. this.showSellDate = res.data.result.expirationDays + '天后失效'
  548. }
  549. res.data.result.preBook == 0 ? this.makeChecked = false : this.makeChecked = true
  550. this.showRule = res.data.result.refundLabelName + '·' + res.data.result.refundConfirmName
  551. uni.setStorage({
  552. key: 'group',
  553. data: res.data.result.productGroups
  554. })
  555. }
  556. })
  557. }
  558. },
  559. mounted() {
  560. this.getLeftTree()
  561. this.getForm()
  562. },
  563. onLoad(options) {
  564. if (options.productId) {
  565. this.productId = options.productId
  566. }
  567. },
  568. onShow() {
  569. let that = this
  570. uni.getStorage({
  571. key: 'login_user_info',
  572. success: function(res) {
  573. that.form.merchantId = res.data.merchantId
  574. }
  575. })
  576. uni.getStorage({
  577. key: 'smdate',
  578. success: (res) => {
  579. if (res.data.availableEndDate) {
  580. this.showSellDate = res.data.availableStartDate + '-' + res.data.availableEndDate
  581. this.form.availableStartDate = res.data.availableStartDate
  582. this.form.availableEndDate = res.data.availableEndDate
  583. this.form.expirationDays = null
  584. } else if (res.data.expirationDays) {
  585. this.form.expirationDays = res.data.expirationDays
  586. this.form.availableEndDate = null
  587. this.form.availableStartDate = null
  588. this.$nextTick(() => {
  589. this.showSellDate = res.data.expirationDays + '天后失效'
  590. });
  591. }
  592. }
  593. })
  594. uni.getStorage({
  595. key: 'group',
  596. success: function(res) {
  597. that.form.productGroups = res.data
  598. }
  599. })
  600. }
  601. }
  602. </script>
  603. <style lang="scss" scoped>
  604. .creat {
  605. width: 100vw;
  606. height: 100vh;
  607. background: #F7F8FC;
  608. display: flex;
  609. flex-direction: column;
  610. justify-content: space-between;
  611. /*#ifdef APP-PLUS*/
  612. .top {
  613. width: 100%;
  614. height: var(--status-bar-height);
  615. background-color: #fff;
  616. }
  617. /*#endif*/
  618. .head {
  619. width: 100%;
  620. height: 112rpx;
  621. padding: 32rpx 24rpx;
  622. display: flex;
  623. align-items: center;
  624. background-color: #fff;
  625. position: relative;
  626. .cuIcon-back {
  627. font-size: 40rpx;
  628. margin-right: 40rpx;
  629. }
  630. .case {
  631. font-size: 36rpx;
  632. font-weight: 600;
  633. position: absolute;
  634. top: 50%;
  635. left: 50%;
  636. transform: translate(-50%, -50%);
  637. }
  638. .step {
  639. position: absolute;
  640. right: 20rpx;
  641. }
  642. }
  643. .content {
  644. width: 100%;
  645. flex: 1;
  646. padding: 24rpx;
  647. overflow-y: auto;
  648. .titl {
  649. width: 100%;
  650. // height: 60rpx;
  651. font-weight: 500;
  652. margin-bottom: 16rpx;
  653. }
  654. .form {
  655. background-color: #fff;
  656. padding: 16rpx;
  657. border-radius: 16rpx;
  658. .item {
  659. width: 100%;
  660. height: 58rpx;
  661. border-bottom: 1px solid #EEEEEE;
  662. display: flex;
  663. // align-items: center;
  664. padding-bottom: 16rpx;
  665. margin-bottom: 16rpx;
  666. .label {
  667. margin-right: 20rpx;
  668. font-weight: 600;
  669. font-size: 28rpx;
  670. min-width: 126rpx;
  671. span {
  672. color: red;
  673. }
  674. }
  675. .picker {
  676. flex: 1;
  677. display: flex;
  678. align-items: center;
  679. justify-content: space-between;
  680. font-size: 28rpx;
  681. color: #999999;
  682. }
  683. .set {
  684. display: flex;
  685. justify-content: flex-end;
  686. /deep/.u-input {
  687. text-align: right !important;
  688. }
  689. }
  690. }
  691. .upload {
  692. display: block;
  693. height: auto;
  694. .tips {
  695. font-size: 20rpx;
  696. color: #999999;
  697. margin-bottom: 16rpx;
  698. margin-top: 10rpx;
  699. }
  700. }
  701. .textarea {
  702. width: 100%;
  703. height: 196rpx;
  704. background: #F7F8FC;
  705. border-radius: 4rpx;
  706. padding: 12rpx 16rpx;
  707. font-size: 26rpx;
  708. margin-top: 12rpx;
  709. }
  710. .num {
  711. width: 100%;
  712. text-align: right;
  713. font-size: 24rpx;
  714. color: #999999;
  715. margin-top: 6rpx;
  716. }
  717. }
  718. }
  719. .btn {
  720. width: 100%;
  721. height: 112rpx;
  722. background-color: #fff;
  723. display: flex;
  724. justify-content: center;
  725. align-items: center;
  726. .next {
  727. width: 672rpx;
  728. height: 76rpx;
  729. border-radius: 54rpx;
  730. border: 1px solid #449AFF;
  731. margin: 0 auto;
  732. display: flex;
  733. justify-content: center;
  734. align-items: center;
  735. font-size: 28rpx;
  736. color: #449AFF;
  737. }
  738. .handle {
  739. width: 100%;
  740. display: flex;
  741. justify-content: space-around;
  742. .back {
  743. width: 205rpx;
  744. height: 76rpx;
  745. border-radius: 54rpx;
  746. border: 1px solid #449AFF;
  747. display: flex;
  748. align-items: center;
  749. justify-content: center;
  750. font-size: 28rpx;
  751. color: #449AFF;
  752. }
  753. .submit {
  754. width: 443rpx;
  755. height: 76rpx;
  756. background: linear-gradient(90deg, #77B6FF 0%, #449AFF 100%);
  757. border-radius: 53rpx;
  758. display: flex;
  759. align-items: center;
  760. justify-content: center;
  761. font-size: 28rpx;
  762. color: #FFFFFF;
  763. }
  764. }
  765. }
  766. .popup {
  767. width: 100vw;
  768. height: 100vh;
  769. position: fixed;
  770. top: 0;
  771. left: 0;
  772. background: rgba(0, 0, 0, 0.4);
  773. display: flex;
  774. align-items: flex-end;
  775. z-index: 99;
  776. .model {
  777. width: 100%;
  778. background-color: #fff;
  779. border-radius: 20rpx 20rpx 0rpx 0rpx;
  780. padding: 0rpx 24rpx;
  781. padding-bottom: 20rpx;
  782. .title {
  783. width: 100%;
  784. height: 86rpx;
  785. display: flex;
  786. align-items: center;
  787. justify-content: center;
  788. border-bottom: 1px solid #EEEEEE;
  789. position: relative;
  790. image {
  791. width: 40rpx;
  792. height: 40rpx;
  793. position: absolute;
  794. right: 0px;
  795. }
  796. }
  797. .tree {
  798. display: flex;
  799. height: 546rpx;
  800. .left {
  801. overflow-y: auto;
  802. .item {
  803. width: 224rpx;
  804. height: 78rpx;
  805. padding: 20rpx;
  806. font-size: 26rpx;
  807. }
  808. .active {
  809. background: rgba(68, 154, 255, 0.1);
  810. color: #2983EC;
  811. }
  812. }
  813. .border {
  814. border-left: 1px solid #eeeeee;
  815. border-right: 1px solid #eeeeee;
  816. }
  817. }
  818. .sub {
  819. display: flex;
  820. justify-content: space-between;
  821. margin-top: 16rpx;
  822. border-top: 1px solid #eeeeee;
  823. padding-top: 16rpx;
  824. .submit {
  825. width: 672rpx;
  826. height: 76rpx;
  827. background: linear-gradient(90deg, #77B6FF 0%, #449AFF 100%);
  828. border-radius: 53rpx;
  829. display: flex;
  830. align-items: center;
  831. justify-content: center;
  832. font-size: 28rpx;
  833. color: #FFFFFF;
  834. }
  835. }
  836. }
  837. }
  838. }
  839. /deep/.u-upload__button {
  840. width: 250rpx !important;
  841. height: 250rpx !important;
  842. }
  843. </style>