order.vue 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045
  1. <template>
  2. <mobile-frame>
  3. <view class="main">
  4. <view class="one">
  5. <scroll-view scroll-y="true" class="scroll-view">
  6. <view class="list-scroll-view">
  7. <view class="one_1" @tap="toChoose">
  8. <text class="localicon iconfont icon-dingweixiao"></text>
  9. <view class="other" v-if="address._id">
  10. <view class="name">
  11. <text>{{address.name}},</text>{{address.phone}}
  12. </view>
  13. <view class="other_1">
  14. <text>{{address.province}}</text><text>{{address.city}}</text>
  15. <text>{{address.area}}</text><text>{{address.address}}</text>
  16. </view>
  17. </view>
  18. <view class="address" v-else><text>请选择一个收货地址</text></view>
  19. <text class="iconfont icon-jiantouyou"></text>
  20. </view>
  21. <view class="one_2">
  22. <view class="list" v-for="(item,index) in orderList" :key="index">
  23. <view class="list_1">
  24. <view class="l">
  25. <text class="iconfont icon-shangdian"></text>
  26. <text>{{item.shop_name}}</text>
  27. </view>
  28. </view>
  29. <view class="list_2" v-for="(tag,index) in item.goods" :key="index">
  30. <view class="list_2_1">
  31. <view class="l">
  32. <image class="image" :src="tag.file&&tag.file.length>0?tag.file[0].url:''"
  33. mode=""></image>
  34. </view>
  35. <view class="c">
  36. <view class="name">
  37. {{tag.goods_name}}
  38. </view>
  39. <view class="Spec">
  40. 规格:{{tag.goodsSpec_name}}
  41. </view>
  42. <view class="label">
  43. <text v-if="tag.gift.length>0" class="label_1">赠品</text>
  44. <text v-if="tag.sp_price" class="label_2">特价</text>
  45. </view>
  46. </view>
  47. <view class="r">
  48. <view class="price" v-if="type=='0'">
  49. ¥{{tag.price}}
  50. </view>
  51. <view v-else class="price">
  52. ¥{{tag.group_sell_money}}
  53. </view>
  54. <view class="num">
  55. ×{{tag.num}}
  56. </view>
  57. </view>
  58. </view>
  59. <view class="list_2_2" v-if="tag.gift.length>0">赠品</view>
  60. <view class="list_2_3" v-if="tag.gift.length>0" v-for="(tags,indexx) in tag.gift"
  61. :key="indexx">
  62. <view class="left">
  63. <view class="name">
  64. {{tags.goods_name}}
  65. </view>
  66. <view class="Spec">
  67. 规格:{{tags.spec_name}}
  68. </view>
  69. <view class="Spec">
  70. 说明:{{tags.desc}}
  71. </view>
  72. </view>
  73. <view class="right">
  74. <view class="price">
  75. ¥{{tags.money||0}}
  76. </view>
  77. <view class="num">
  78. ×{{tags.num}}
  79. </view>
  80. </view>
  81. </view>
  82. </view>
  83. <view class="list_3">
  84. <view class="other">
  85. <view class="other_1">配送方式</view>
  86. <view class="other_2"><text class="iconfont icon-duihao"></text>快递配送</view>
  87. </view>
  88. <view class="other">
  89. <view class="other_1">运费</view>
  90. <view class="other_2" v-if="!item.freight_total==0">¥{{item.freight_total}}
  91. </view>
  92. <view class="other_2" v-else>包邮</view>
  93. </view>
  94. <view class="other">
  95. <view class="other_1">订单备注</view>
  96. <view class="other_3">
  97. <input type="text" v-model="item.remarks" placeholder="选填,可填写您与卖家达成一致的要求" />
  98. </view>
  99. </view>
  100. </view>
  101. </view>
  102. <view class="other" v-for="(item,index) in total_detail" :key="index">
  103. <view class="other_1">{{item.zh}}</view>
  104. <view class="other_2">¥{{item.money}}</view>
  105. </view>
  106. <view class="other" v-if="type=='0'">
  107. <view class="other_1">优惠劵</view>
  108. <view class="other_2" @click="toCoupon" v-if="couponList.length">
  109. {{coupon_name||'请选择优惠劵'}}
  110. </view>
  111. <view class="other_2" v-else>暂无优惠劵使用</view>
  112. </view>
  113. <view class="other" v-if="total>0&&actInfo" @tap="toAddGoods">
  114. <view class="other_1">加购商品</view>
  115. <view class="other_4">去加购></view>
  116. </view>
  117. <view class="act" v-if="plus_goods.length>0">
  118. <view class="act_1">您已选择商品为</view>
  119. <view class="act_2">
  120. <view class="plusList" v-for="(item,index) in plusList" :key="index">
  121. <image class="image" :src="item.file.length>0?item.file[0].url:item.file[0].url"
  122. mode="aspectFill"></image>
  123. <view class="name">{{item.goods_name}}</view>
  124. <view class="money">
  125. <text class="text_1">¥{{item.flow_money}}</text>
  126. <text class="text_2">¥{{item.config.plus_money||item.sell_money}}</text>
  127. </view>
  128. </view>
  129. <view class="bottom" @tap="toOpen">
  130. <text v-if="plus_goods.length>3"
  131. :class="[change==false?'iconfont icon-xiajiantou-copy':'iconfont icon-shangjiantou-copy']"></text>
  132. </view>
  133. </view>
  134. </view>
  135. </view>
  136. </view>
  137. </scroll-view>
  138. </view>
  139. <view class="two">
  140. <view class="two_1">
  141. <view>实付金额:</view>
  142. <view>¥{{goods_total}}</view>
  143. </view>
  144. <view class="two_2">
  145. <text @tap="toSubmit">提交订单</text>
  146. </view>
  147. </view>
  148. </view>
  149. <uni-popup ref="popup" background-color="#fff" type="bottom">
  150. <view class="popup" v-if="popup.type=='1'">
  151. <scroll-view scroll-y="true" class="scroll-view">
  152. <discount :Style="Style" :couponList="couponList" @toDiscount="toDiscount"></discount>
  153. </scroll-view>
  154. </view>
  155. </uni-popup>
  156. <uni-drawer ref="showRight" :mask="false" :width="width" mode="right" :mask-click="false">
  157. <scroll-view scroll-y="true" class="scroll-view" @scrolltolower="toPage">
  158. <view class="act">
  159. <view class="act_1">
  160. 订单已满<text>{{actInfo.plus_money}}</text>元,为你推荐优惠商品搭配
  161. </view>
  162. <view class="act_2">
  163. <checkbox-group @change="checkboxChange">
  164. <label class="actList" v-for="(item,index) in actList" :key="index">
  165. <image class="image" :src="item.file.length>0?item.file[0].url:item.file[0].url"
  166. mode="aspectFill"></image>
  167. <view class="name">
  168. <view class="some">{{item.goods_name}}</view>
  169. <view class="some">店铺:{{item.shop_name}}</view>
  170. <view class="some">规格:{{item.spec_name}}</view>
  171. </view>
  172. <view class="money">
  173. <text class="text_1">¥{{item.flow_money||0}}</text>
  174. <text class="text_2">¥{{item.config.plus_money||item.sell_money}}</text>
  175. </view>
  176. <view class="checkbox">
  177. <checkbox color="#FB1438" style="transform:scale(0.7)" :value="item._id"
  178. :checked="item.checked" />
  179. </view>
  180. </label>
  181. </checkbox-group>
  182. </view>
  183. <view class="bottom">
  184. <button @click="closeDrawer('define')" size="mini">确认加购</button>
  185. <button @click="closeDrawer('cancel')" size="mini">取消加购</button>
  186. </view>
  187. </view>
  188. </scroll-view>
  189. </uni-drawer>
  190. </mobile-frame>
  191. </template>
  192. <script>
  193. import discount from '@/components/discount/index.vue';
  194. export default {
  195. components: {
  196. discount
  197. },
  198. data() {
  199. return {
  200. // 设备平台信息
  201. system: {},
  202. popup: {
  203. type: '1'
  204. },
  205. Style: {
  206. btn: true
  207. },
  208. user: {},
  209. key: '',
  210. address: {},
  211. orderList: [],
  212. shop: [],
  213. goods_total: 0,
  214. // 金额明细
  215. total_detail: [],
  216. // 收货地址
  217. addressList: [],
  218. // 优惠劵
  219. couponList: [],
  220. coupon: [],
  221. // 优惠劵名称
  222. coupon_name: '',
  223. // 是否开团
  224. type: '0',
  225. // 团id
  226. group_id: '',
  227. // 分享人id
  228. inviter: '',
  229. // 活动商品
  230. actList: [],
  231. // 加价购活动
  232. actInfo: {},
  233. // 加购商品
  234. plus_goods: [],
  235. total: 0,
  236. page: 0,
  237. skip: 0,
  238. limit: 10,
  239. // 抽屉
  240. width: '100%',
  241. change: false,
  242. // 显示加购商品
  243. plus_total: 3,
  244. disabled: false
  245. };
  246. },
  247. onLoad: function(e) {
  248. const that = this;
  249. uni.$on("id", async (id) => {
  250. let arr = await that.$api(`/address/${id}`, `GET`)
  251. if (arr.errcode == '0') {
  252. that.$set(that, `address`, arr.data)
  253. }
  254. })
  255. that.$set(that, `key`, e.key || '');
  256. that.$set(that, `group_id`, e.group_id || '');
  257. that.watchLogin()
  258. },
  259. computed: {
  260. plusList() { // 计算属性使用切片生成新数组
  261. let data = [];
  262. // 大于三条,使用切片,返回新数组
  263. if (this.plus_goods.length > 3) {
  264. data = this.plus_goods.slice(0, this.plus_total);
  265. return data;
  266. } else {
  267. // 否则使用原来数组,不进行切片处理
  268. data = this.plus_goods
  269. return data;
  270. }
  271. },
  272. },
  273. methods: {
  274. // 监听用户是否登录
  275. watchLogin() {
  276. const that = this;
  277. uni.getStorage({
  278. key: 'token',
  279. success: function(res) {
  280. let user = that.$jwt(res.data);
  281. that.$set(that, `user`, user);
  282. // 设备平台信息
  283. let config = that.$config;
  284. that.$set(that, `system`, config.system);
  285. that.search()
  286. },
  287. fail: function(err) {
  288. uni.navigateTo({
  289. url: `/pages/login/index`
  290. })
  291. }
  292. })
  293. },
  294. // 查询列表
  295. async search() {
  296. const that = this;
  297. let user = that.user;
  298. const res = await that.$api(`/address`, 'GET', {
  299. customer: user._id
  300. })
  301. if (res.errcode == '0') {
  302. that.$set(that, `addressList`, res.data.reverse());
  303. }
  304. const arr = await that.$api(`/order/toMakeOrder`, 'POST', {
  305. key: that.key
  306. })
  307. if (arr.errcode == '0') {
  308. // 查询活动商品列表
  309. let act;
  310. act = arr.data.actList.find(i => i.platform_act_type == '4')
  311. if (act) {
  312. that.searchAct(act);
  313. that.$set(that, `actInfo`, act);
  314. arr.data.orderTotal.push({
  315. zh: "加购总价",
  316. key: 'plus',
  317. money: 0
  318. })
  319. }
  320. // 分享人id
  321. that.$set(that, `inviter`, arr.data.inviter);
  322. // 地址
  323. that.$set(that, `address`, arr.data.address);
  324. // 订单
  325. that.$set(that, `orderList`, arr.data.goodsData);
  326. // 总价
  327. that.$set(that, `total_detail`, arr.data.orderTotal);
  328. that.$set(that, `type`, arr.data.type);
  329. that.computedTotal();
  330. // 优惠劵
  331. that.$set(that, `couponList`, arr.data.couponList);
  332. }
  333. },
  334. // 查询活动商品列表
  335. async searchAct(e) {
  336. const that = this;
  337. let platform_act = e.platform_act;
  338. let info = {
  339. skip: that.skip,
  340. limit: that.limit,
  341. platform_act: platform_act,
  342. goods_type: 'plus'
  343. }
  344. let res = await that.$api(`/goodsJoinAct`, 'GET', {
  345. ...info,
  346. })
  347. if (res.errcode == '0') {
  348. let list = [...that.actList, ...res.data];
  349. that.$set(that, `actList`, list)
  350. that.$set(that, `total`, res.total)
  351. }
  352. },
  353. // 使用优惠劵
  354. toDiscount(e) {
  355. const that = this;
  356. that.$set(that, 'coupon_name', e.name)
  357. that.coupon.push(e._id)
  358. that.$refs.popup.close();
  359. that.computedTotal();
  360. },
  361. // 选择收货地址
  362. toChoose() {
  363. const that = this;
  364. if (that.address?._id) {
  365. uni.navigateTo({
  366. url: `/pagesMy/address/index?type=${"shopping"}&id=${that.address._id}`
  367. })
  368. } else {
  369. uni.navigateTo({
  370. url: `/pagesMy/address/index?type=${"shopping"}`
  371. })
  372. }
  373. },
  374. // 选择优惠劵
  375. toCoupon() {
  376. const that = this;
  377. that.$set(that.popup, 'type', '1')
  378. that.$set(that, 'coupon', [])
  379. that.$refs.popup.open();
  380. },
  381. // 选择活动商品
  382. checkboxChange(e) {
  383. const that = this;
  384. var actList = that.actList,
  385. values = e.detail.value;
  386. for (var i = 0, lenI = actList.length; i < lenI; ++i) {
  387. const item = actList[i]
  388. if (values.includes(item._id)) that.$set(item, 'checked', true)
  389. else that.$set(item, 'checked', false)
  390. }
  391. },
  392. // 选择加购产品
  393. toAddGoods() {
  394. const that = this;
  395. that.$set(that, 'plus_goods', [])
  396. that.$refs.showRight.open();
  397. },
  398. // 关闭抽屉
  399. closeDrawer(e) {
  400. const that = this;
  401. if (e == 'cancel') {
  402. for (let val of that.actList) {
  403. if (val.checked == true) val.checked = false
  404. }
  405. for (let arr of that.total_detail) {
  406. if (arr.key == 'plus') arr.money = 0
  407. }
  408. that.$set(that, 'plus_goods', []);
  409. that.computedTotal();
  410. that.$refs.showRight.close();
  411. } else {
  412. // 选购中商品
  413. let plus_goods = that.actList.filter(item => item.checked == true)
  414. if (plus_goods) {
  415. let plus_total = 0;
  416. for (let arr of that.total_detail) {
  417. if (arr.key == 'plus') {
  418. for (let val of plus_goods) {
  419. if (val.config.plus_money) plus_total = that.$plus(plus_total, val.config.plus_money)
  420. else plus_total = that.$plus(plus_total, val.sell_money)
  421. }
  422. arr.money = plus_total
  423. }
  424. }
  425. }
  426. that.$set(that, 'plus_goods', plus_goods);
  427. that.computedTotal();
  428. that.$refs.showRight.close();
  429. }
  430. },
  431. // 显示
  432. toOpen() {
  433. const that = this;
  434. if (that.plus_goods.length > that.plus_total) {
  435. // 每次点击加三条
  436. that.plus_total += 3;
  437. that.$set(that, 'change', true);
  438. } else {
  439. that.$set(that, `plus_total`, 3)
  440. that.$set(that, `change`, false)
  441. }
  442. },
  443. // 分页
  444. toPage() {
  445. const that = this;
  446. let list = that.actList;
  447. let actInfo = that.actInfo;
  448. let limit = that.limit;
  449. if (that.total > list.length) {
  450. uni.showLoading({
  451. title: '加载中',
  452. mask: true
  453. })
  454. let page = that.page + 1;
  455. that.$set(that, `page`, page)
  456. let skip = page * limit;
  457. that.$set(that, `skip`, skip)
  458. that.searchAct(actInfo);
  459. uni.hideLoading();
  460. }
  461. },
  462. // 提交订单
  463. async toSubmit() {
  464. const that = this;
  465. let system = that.system;
  466. if (that.disabled) return;
  467. that.$set(that, `disabled`, true);
  468. if (that.address) {
  469. let obj = {
  470. address: that.address,
  471. goods: that.orderList,
  472. total_detail: that.total_detail,
  473. coupon: that.coupon,
  474. type: that.type,
  475. inviter: that.inviter,
  476. plus_goods: that.plus_goods
  477. }
  478. if (that.group_id) obj.group = that.group_id;
  479. // 创建订单
  480. let p1 = await that.$api(`/order`, 'POST', obj);
  481. if (p1.errcode == '0') {
  482. if (system.uniPlatform == "mp-weixin") {
  483. // 微信支付
  484. uni.showLoading({
  485. title: '加载中'
  486. })
  487. // 支付信息
  488. let p2 = await that.$api('/pay/toPayOrder', 'POST', {
  489. order_id: p1.data,
  490. type: '0'
  491. })
  492. if (p2.errcode == '0' && p2.data.paySign) {
  493. uni.requestPayment({
  494. "provider": "wxpay",
  495. ...p2.data,
  496. success: async function(res) {
  497. // 获取团信息
  498. let p3 = await that.$api('/group/getGroup', 'GET', {
  499. order_id: p1.data,
  500. })
  501. if (p3.errcode == '0') {
  502. uni.hideLoading();
  503. if (p3.data) {
  504. uni.reLaunch({
  505. url: `/pagesHome/group/share?id=${p3.data}`
  506. })
  507. } else {
  508. uni.reLaunch({
  509. url: `/pagesMy/order/index?status=${'1'}`
  510. })
  511. }
  512. } else {
  513. that.$set(that, `disabled`, false);
  514. uni.showToast({
  515. title: p3.errmsg,
  516. icon: 'none'
  517. })
  518. }
  519. },
  520. fail: function(err) {
  521. that.$set(that, `disabled`, false);
  522. uni.showToast({
  523. title: `支付失败`,
  524. icon: 'none'
  525. })
  526. uni.hideLoading();
  527. uni.reLaunch({
  528. url: `/pagesMy/order/index?status=${'0'}`
  529. })
  530. }
  531. })
  532. } else {
  533. uni.showToast({
  534. title: p2.errmsg,
  535. icon: 'none'
  536. })
  537. }
  538. } else if (system.uniPlatform == "app") {
  539. uni.requestPayment({
  540. provider: 'alipay',
  541. orderInfo: 'orderInfo',
  542. success: function(res) {
  543. console.log('success:' + JSON.stringify(res));
  544. },
  545. fail: function(err) {
  546. console.log('fail:' + JSON.stringify(err));
  547. }
  548. });
  549. } else {
  550. uni.showToast({
  551. title: `平台不支持支付`,
  552. icon: 'none'
  553. })
  554. }
  555. } else {
  556. uni.showToast({
  557. title: p1.errmsg,
  558. icon: 'none'
  559. })
  560. }
  561. } else {
  562. uni.showToast({
  563. title: `没有收货地址`,
  564. icon: 'none'
  565. })
  566. }
  567. },
  568. // 计算优惠券
  569. async computedTotal() {
  570. const total_detail = this.total_detail;
  571. let total = 0;
  572. for (let val of total_detail) total = this.$plus(total, val.money)
  573. if (this.coupon.length > 0) {
  574. let discount = 0;
  575. for (const coupon of this.coupon) {
  576. const r = this.couponList.find(f => f._id === coupon)
  577. if (!r) continue;
  578. const {
  579. discount_config,
  580. discount_type
  581. } = r;
  582. if (discount_type === 'min') {
  583. const min = discount_config.min;
  584. discount = this.$plus(discount, min)
  585. } else if (discount_type === 'discount') {
  586. const min = discount_config.min || 0;
  587. let discount_money = 0;
  588. const max = discount_config.max || 0;
  589. // TODO 现在是平台发放的优惠券,所以可以直接用总价*折扣,如果是店铺的折扣券,则需要将金额分开,对应店铺计算折扣
  590. // const dm = min / 10 * total;
  591. const dm = this.$multiply(this.divide(min, 10), total)
  592. if (max !== 0) {
  593. if (max > dm) discount_money = dm;
  594. else discount_money = max
  595. }
  596. discount += discount_money
  597. }
  598. }
  599. total = this.$minus(total, discount)
  600. }
  601. if (total >= 0) {
  602. this.$set(this, `goods_total`, total);
  603. } else {
  604. uni.showToast({
  605. title: `实付金额不能为负数 不能使用该优惠劵`,
  606. icon: 'none'
  607. })
  608. }
  609. }
  610. }
  611. }
  612. </script>
  613. <style lang="scss">
  614. .main {
  615. display: flex;
  616. flex-direction: column;
  617. width: 100vw;
  618. height: 100vh;
  619. .one {
  620. position: relative;
  621. flex-grow: 1;
  622. background-color: var(--f1Color);
  623. .one_1 {
  624. display: flex;
  625. justify-content: space-between;
  626. align-items: center;
  627. width: 100vw;
  628. padding: 2vw;
  629. border-bottom: 1vw dashed var(--fcColor);
  630. .address {
  631. flex-grow: 1;
  632. margin: 0 0 0 2vw;
  633. font-size: var(--font14Size);
  634. color: var(--f85Color);
  635. }
  636. .iconfont {
  637. font-size: var(--font20Szie);
  638. }
  639. .other {
  640. width: 82vw;
  641. padding: 0 2vw;
  642. .name {
  643. font-size: var(--font16Size);
  644. }
  645. .other_1 {
  646. font-size: var(--font14Size);
  647. color: var(--f85Color);
  648. text {
  649. margin: 0 1vw 0 0;
  650. }
  651. }
  652. }
  653. }
  654. .one_2 {
  655. .list {
  656. width: 100vw;
  657. margin: 2vw 0;
  658. .list_1 {
  659. padding: 2vw;
  660. background-color: var(--mainColor);
  661. border-bottom: 0.1vw solid var(--fcColor);
  662. text {
  663. padding: 0 0 0 1vw;
  664. }
  665. }
  666. .list_2 {
  667. padding: 2vw;
  668. background-color: var(--mainColor);
  669. .list_2_1 {
  670. display: flex;
  671. .l {
  672. width: 20vw;
  673. .image {
  674. width: 100%;
  675. height: 20vw;
  676. border-radius: 5px;
  677. }
  678. }
  679. .c {
  680. width: 60vw;
  681. padding: 0 2vw;
  682. .Spec {
  683. font-size: var(--font12Size);
  684. color: var(--f85Color);
  685. }
  686. .label {
  687. display: flex;
  688. padding: 1vw 0 0 0;
  689. .label_1 {
  690. margin: 0 1vw 0 0;
  691. font-size: 12px;
  692. color: #FFA500;
  693. border: 1px solid #FFA500;
  694. border-radius: 5px;
  695. padding: 0 1vw;
  696. }
  697. .label_2 {
  698. font-size: 12px;
  699. border: 1px solid var(--fFB1Color);
  700. color: var(--fFB1Color);
  701. border-radius: 5px;
  702. padding: 0 1vw;
  703. }
  704. }
  705. }
  706. .r {
  707. width: 15vw;
  708. text-align: right;
  709. }
  710. }
  711. .list_2_2 {
  712. padding: 0 1vw 1vw 0;
  713. font-size: var(--font14Size);
  714. }
  715. .list_2_3 {
  716. display: flex;
  717. justify-content: space-between;
  718. border: 1px solid var(--fcColor);
  719. border-radius: 5px;
  720. margin: 0 0 1vw 0;
  721. padding: 1vw;
  722. .left {
  723. .name {
  724. font-size: 14px;
  725. }
  726. .Spec {
  727. font-size: var(--font12Size);
  728. color: var(--f85Color);
  729. }
  730. }
  731. }
  732. }
  733. .list_3 {
  734. width: 96vw;
  735. padding: 2vw;
  736. background-color: var(--mainColor);
  737. .other {
  738. display: flex;
  739. justify-content: space-between;
  740. border-bottom: 0.1vw solid var(--fcColor);
  741. margin: 0 0 2vw 0;
  742. padding: 2vw 0;
  743. .other_1 {
  744. font-size: var(--font16Size);
  745. color: var(--f85Color);
  746. }
  747. .other_3 {
  748. flex-grow: 1;
  749. margin: 0 0 0 2vw;
  750. font-size: var(--font12Size);
  751. }
  752. text {
  753. padding: 0 1vw 0 0;
  754. font-size: var(--font20Szie);
  755. }
  756. }
  757. }
  758. }
  759. .other {
  760. display: flex;
  761. justify-content: space-between;
  762. background-color: var(--mainColor);
  763. border-bottom: 0.1vw solid var(--fcColor);
  764. width: 96vw;
  765. padding: 2vw;
  766. .other_1 {
  767. font-size: var(--font16Size);
  768. color: var(--f85Color);
  769. }
  770. .other_3 {
  771. flex-grow: 1;
  772. margin: 0 0 0 2vw;
  773. font-size: var(--font12Size);
  774. }
  775. .other_4 {
  776. color: var(--fFB1Color);
  777. }
  778. text {
  779. padding: 0 1vw 0 0;
  780. font-size: var(--font20Szie);
  781. }
  782. }
  783. .act {
  784. background-color: var(--mainColor);
  785. border-bottom: 0.1vw solid var(--fcColor);
  786. margin: 0 0 2vw 0;
  787. width: 96vw;
  788. padding: 2vw;
  789. .act_1 {
  790. font-size: var(--font14Size);
  791. font-weight: bold;
  792. text {
  793. color: #FFA500;
  794. }
  795. }
  796. .act_2 {
  797. .plusList {
  798. display: flex;
  799. margin: 2vw 0;
  800. .image {
  801. width: 15vw;
  802. height: 10vw;
  803. border: 1px solid #ffffff;
  804. }
  805. .name {
  806. width: 57vw;
  807. font-size: 12px;
  808. margin: 0 0 0 1vw;
  809. }
  810. .money {
  811. width: 20vw;
  812. .text_1 {
  813. font-size: 12px;
  814. color: #858585;
  815. text-decoration: line-through;
  816. }
  817. .text_2 {
  818. font-size: 14px;
  819. color: #ff0000;
  820. }
  821. }
  822. }
  823. }
  824. .bottom {
  825. text-align: center;
  826. }
  827. }
  828. }
  829. }
  830. .two {
  831. display: flex;
  832. justify-content: space-between;
  833. border-top: 0.1vw solid var(--fcColor);
  834. .two_1 {
  835. display: flex;
  836. align-items: center;
  837. padding: 0 2vw;
  838. font-size: var(--font16Size);
  839. view:last-child {
  840. margin: 0 0 0 2vw;
  841. color: var(--ff0Color);
  842. font-weight: bold;
  843. }
  844. }
  845. .two_2 {
  846. padding: 3vw 4vw;
  847. color: var(--mainColor);
  848. font-size: var(--font16Size);
  849. background-color: var(--ff0Color);
  850. }
  851. }
  852. }
  853. .scroll-view {
  854. position: absolute;
  855. top: 0;
  856. left: 0;
  857. right: 0;
  858. bottom: 0;
  859. .list-scroll-view {
  860. display: flex;
  861. flex-direction: row;
  862. flex-wrap: wrap;
  863. }
  864. }
  865. .popup {
  866. display: flex;
  867. flex-direction: column;
  868. height: 100vw;
  869. overflow-x: hidden;
  870. background-color: var(--f5Color);
  871. padding: 2vw;
  872. .list {
  873. .one {
  874. display: flex;
  875. justify-content: space-between;
  876. margin: 2vw 0 0 0;
  877. padding: 2vw;
  878. background-color: var(--mainColor);
  879. .name {
  880. font-size: var(--font16Size);
  881. }
  882. .address {
  883. font-size: var(--font14Size);
  884. }
  885. .iconfont {
  886. line-height: 15vw;
  887. font-size: var(--font20Szie);
  888. }
  889. }
  890. .two {
  891. display: flex;
  892. justify-content: space-between;
  893. border-top: 0.1vw solid var(--fcColor);
  894. padding: 2vw;
  895. background-color: var(--mainColor);
  896. font-size: var(--font14Size);
  897. .text {
  898. margin: 0 2vw 0 0;
  899. border: 0.1vw solid var(--fFB1Color);
  900. padding: 1vw;
  901. font-size: var(--font12Size);
  902. border-radius: 2vw;
  903. color: var(--fFB1Color);
  904. }
  905. }
  906. }
  907. }
  908. .act {
  909. background-color: var(--mainColor);
  910. width: 96vw;
  911. padding: 2vw;
  912. .act_1 {
  913. font-size: var(--font14Size);
  914. font-weight: bold;
  915. text {
  916. color: #FFA500;
  917. }
  918. }
  919. .act_2 {
  920. margin: 1vw 0;
  921. .actList {
  922. display: flex;
  923. align-items: center;
  924. margin: 2vw 0;
  925. border: 0.1vw solid var(--fcColor);
  926. border-radius: 5px;
  927. padding: 1vw 0;
  928. .image {
  929. width: 12vw;
  930. height: 10vw;
  931. border: 1px solid #ffffff;
  932. }
  933. .name {
  934. width: 52vw;
  935. font-size: 12px;
  936. margin: 0 0 0 1vw;
  937. .some {
  938. display: inline-block;
  939. white-space: nowrap;
  940. width: 100%;
  941. overflow: hidden;
  942. text-overflow: ellipsis;
  943. }
  944. }
  945. .money {
  946. width: 20vw;
  947. .text_1 {
  948. font-size: 12px;
  949. color: #858585;
  950. text-decoration: line-through;
  951. }
  952. .text_2 {
  953. font-size: 13px;
  954. color: #ff0000;
  955. }
  956. }
  957. .checkbox {
  958. width: 7vw;
  959. }
  960. }
  961. }
  962. .bottom {
  963. text-align: center;
  964. button:first-child {
  965. margin: 0 1vw 0 0;
  966. background-color: #ff0000;
  967. color: #ffffff;
  968. }
  969. }
  970. }
  971. </style>