order.vue 25 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040
  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. };
  245. },
  246. onLoad: function(e) {
  247. const that = this;
  248. uni.$on("id", async (id) => {
  249. let arr = await that.$api(`/address/${id}`, `GET`)
  250. if (arr.errcode == '0') {
  251. that.$set(that, `address`, arr.data)
  252. }
  253. })
  254. that.$set(that, `key`, e.key || '');
  255. that.$set(that, `group_id`, e.group_id || '');
  256. that.watchLogin()
  257. },
  258. computed: {
  259. plusList() { // 计算属性使用切片生成新数组
  260. let data = [];
  261. // 大于三条,使用切片,返回新数组
  262. if (this.plus_goods.length > 3) {
  263. data = this.plus_goods.slice(0, this.plus_total);
  264. return data;
  265. } else {
  266. // 否则使用原来数组,不进行切片处理
  267. data = this.plus_goods
  268. return data;
  269. }
  270. },
  271. },
  272. methods: {
  273. // 监听用户是否登录
  274. watchLogin() {
  275. const that = this;
  276. uni.getStorage({
  277. key: 'token',
  278. success: function(res) {
  279. let user = that.$jwt(res.data);
  280. that.$set(that, `user`, user);
  281. // 设备平台信息
  282. let config = that.$config;
  283. that.$set(that, `system`, config.system);
  284. that.search()
  285. },
  286. fail: function(err) {
  287. uni.navigateTo({
  288. url: `/pages/login/index`
  289. })
  290. }
  291. })
  292. },
  293. // 查询列表
  294. async search() {
  295. const that = this;
  296. let user = that.user;
  297. const res = await that.$api(`/address`, 'GET', {
  298. customer: user._id
  299. })
  300. if (res.errcode == '0') {
  301. that.$set(that, `addressList`, res.data.reverse());
  302. }
  303. const arr = await that.$api(`/order/toMakeOrder`, 'POST', {
  304. key: that.key
  305. })
  306. if (arr.errcode == '0') {
  307. // 查询活动商品列表
  308. let act;
  309. act = arr.data.actList.find(i => i.platform_act_type == '4')
  310. if (act) {
  311. that.searchAct(act);
  312. that.$set(that, `actInfo`, act);
  313. arr.data.orderTotal.push({
  314. zh: "加购总价",
  315. key: 'plus',
  316. money: 0
  317. })
  318. }
  319. // 分享人id
  320. that.$set(that, `inviter`, arr.data.inviter);
  321. // 地址
  322. that.$set(that, `address`, arr.data.address);
  323. // 订单
  324. that.$set(that, `orderList`, arr.data.goodsData);
  325. // 总价
  326. that.$set(that, `total_detail`, arr.data.orderTotal);
  327. that.$set(that, `type`, arr.data.type);
  328. this.computedTotal();
  329. // 优惠劵
  330. that.$set(that, `couponList`, arr.data.couponList);
  331. }
  332. },
  333. // 查询活动商品列表
  334. async searchAct(e) {
  335. const that = this;
  336. let platform_act = e.platform_act;
  337. let info = {
  338. skip: that.skip,
  339. limit: that.limit,
  340. platform_act: platform_act,
  341. goods_type: 'plus'
  342. }
  343. let res = await that.$api(`/goodsJoinAct`, 'GET', {
  344. ...info,
  345. })
  346. if (res.errcode == '0') {
  347. let list = [...that.actList, ...res.data];
  348. that.$set(that, `actList`, list)
  349. that.$set(that, `total`, res.total)
  350. }
  351. },
  352. // 使用优惠劵
  353. toDiscount(e) {
  354. const that = this;
  355. that.$set(that, 'coupon_name', e.name)
  356. that.coupon.push(e._id)
  357. that.$refs.popup.close();
  358. that.computedTotal();
  359. },
  360. // 选择收货地址
  361. toChoose() {
  362. const that = this;
  363. if (that.address?._id) {
  364. uni.navigateTo({
  365. url: `/pagesMy/address/index?type=${"shopping"}&id=${that.address._id}`
  366. })
  367. } else {
  368. uni.navigateTo({
  369. url: `/pagesMy/address/index?type=${"shopping"}`
  370. })
  371. }
  372. },
  373. // 选择优惠劵
  374. toCoupon() {
  375. const that = this;
  376. that.$set(that.popup, 'type', '1')
  377. that.$set(that, 'coupon', [])
  378. that.$refs.popup.open();
  379. },
  380. // 选择活动商品
  381. checkboxChange(e) {
  382. const that = this;
  383. var actList = that.actList,
  384. values = e.detail.value;
  385. for (var i = 0, lenI = actList.length; i < lenI; ++i) {
  386. const item = actList[i]
  387. if (values.includes(item._id)) that.$set(item, 'checked', true)
  388. else that.$set(item, 'checked', false)
  389. }
  390. },
  391. // 选择加购产品
  392. toAddGoods() {
  393. const that = this;
  394. that.$set(that, 'plus_goods', [])
  395. that.$refs.showRight.open();
  396. },
  397. // 关闭抽屉
  398. closeDrawer(e) {
  399. const that = this;
  400. if (e == 'cancel') {
  401. for (let val of that.actList) {
  402. if (val.checked == true) val.checked = false
  403. }
  404. for (let arr of that.total_detail) {
  405. if (arr.key == 'plus') arr.money = 0
  406. }
  407. that.$set(that, 'plus_goods', []);
  408. that.computedTotal();
  409. that.$refs.showRight.close();
  410. } else {
  411. // 选购中商品
  412. let plus_goods = that.actList.filter(item => item.checked == true)
  413. if (plus_goods) {
  414. let plus_total = 0;
  415. for (let arr of that.total_detail) {
  416. if (arr.key == 'plus') {
  417. for (let val of plus_goods) {
  418. if (val.config.plus_money) plus_total = that.$plus(plus_total, val.config.plus_money)
  419. else plus_total = that.$plus(plus_total, val.sell_money)
  420. }
  421. arr.money = plus_total
  422. }
  423. }
  424. }
  425. that.$set(that, 'plus_goods', plus_goods);
  426. that.computedTotal();
  427. that.$refs.showRight.close();
  428. }
  429. },
  430. // 显示
  431. toOpen() {
  432. const that = this;
  433. if (that.plus_goods.length > that.plus_total) {
  434. // 每次点击加三条
  435. that.plus_total += 3;
  436. that.$set(that, 'change', true);
  437. } else {
  438. that.$set(that, `plus_total`, 3)
  439. that.$set(that, `change`, false)
  440. }
  441. },
  442. // 分页
  443. toPage() {
  444. const that = this;
  445. let list = that.actList;
  446. let actInfo = that.actInfo;
  447. let limit = that.limit;
  448. if (that.total > list.length) {
  449. uni.showLoading({
  450. title: '加载中',
  451. mask: true
  452. })
  453. let page = that.page + 1;
  454. that.$set(that, `page`, page)
  455. let skip = page * limit;
  456. that.$set(that, `skip`, skip)
  457. that.searchAct(actInfo);
  458. uni.hideLoading();
  459. }
  460. },
  461. // 提交订单
  462. async toSubmit() {
  463. const that = this;
  464. let system = that.system;
  465. if (that.address) {
  466. let obj = {
  467. address: that.address,
  468. goods: that.orderList,
  469. total_detail: that.total_detail,
  470. coupon: that.coupon,
  471. type: that.type,
  472. inviter: that.inviter,
  473. plus_goods: that.plus_goods
  474. }
  475. if (that.group_id) obj.group = that.group_id;
  476. // 创建订单
  477. let p1 = await that.$api(`/order`, 'POST', obj);
  478. if (p1.errcode == '0') {
  479. if (system.uniPlatform == "mp-weixin") {
  480. // 微信支付
  481. uni.showLoading({
  482. title: '加载中'
  483. })
  484. // 支付信息
  485. let p2 = await that.$api('/pay/toPayOrder', 'POST', {
  486. order_id: p1.data,
  487. type: '0'
  488. })
  489. if (p2.errcode == '0' && p2.data.paySign) {
  490. uni.requestPayment({
  491. "provider": "wxpay",
  492. ...p2.data,
  493. success: async function(res) {
  494. // 获取团信息
  495. let p3 = await that.$api('/group/getGroup', 'GET', {
  496. order_id: p1.data,
  497. })
  498. if (p3.errcode == '0') {
  499. uni.hideLoading();
  500. if (p3.data) {
  501. uni.reLaunch({
  502. url: `/pagesHome/group/share?id=${p3.data}`
  503. })
  504. } else {
  505. uni.reLaunch({
  506. url: `/pagesMy/order/index?status=${'1'}`
  507. })
  508. }
  509. } else {
  510. uni.showToast({
  511. title: p3.errmsg,
  512. icon: 'none'
  513. })
  514. }
  515. },
  516. fail: function(err) {
  517. uni.showToast({
  518. title: `支付失败`,
  519. icon: 'none'
  520. })
  521. uni.hideLoading();
  522. uni.reLaunch({
  523. url: `/pagesMy/order/index?status=${'0'}`
  524. })
  525. }
  526. })
  527. } else {
  528. uni.showToast({
  529. title: p2.errmsg,
  530. icon: 'none'
  531. })
  532. }
  533. } else if (system.uniPlatform == "app") {
  534. uni.requestPayment({
  535. provider: 'alipay',
  536. orderInfo: 'orderInfo',
  537. success: function(res) {
  538. console.log('success:' + JSON.stringify(res));
  539. },
  540. fail: function(err) {
  541. console.log('fail:' + JSON.stringify(err));
  542. }
  543. });
  544. } else {
  545. uni.showToast({
  546. title: `平台不支持支付`,
  547. icon: 'none'
  548. })
  549. }
  550. } else {
  551. uni.showToast({
  552. title: p1.errmsg,
  553. icon: 'none'
  554. })
  555. }
  556. } else {
  557. uni.showToast({
  558. title: `没有收货地址`,
  559. icon: 'none'
  560. })
  561. }
  562. },
  563. // 计算优惠券
  564. async computedTotal() {
  565. const total_detail = this.total_detail;
  566. let total = 0;
  567. for (let val of total_detail) total = this.$plus(total, val.money)
  568. if (this.coupon.length > 0) {
  569. let discount = 0;
  570. for (const coupon of this.coupon) {
  571. const r = this.couponList.find(f => f._id === coupon)
  572. if (!r) continue;
  573. const {
  574. discount_config,
  575. discount_type
  576. } = r;
  577. if (discount_type === 'min') {
  578. const min = discount_config.min;
  579. discount = this.$plus(discount, min)
  580. } else if (discount_type === 'discount') {
  581. const min = discount_config.min || 0;
  582. let discount_money = 0;
  583. const max = discount_config.max || 0;
  584. // TODO 现在是平台发放的优惠券,所以可以直接用总价*折扣,如果是店铺的折扣券,则需要将金额分开,对应店铺计算折扣
  585. // const dm = min / 10 * total;
  586. const dm = this.$multiply(this.divide(min, 10), total)
  587. if (max !== 0) {
  588. if (max > dm) discount_money = dm;
  589. else discount_money = max
  590. }
  591. discount += discount_money
  592. }
  593. }
  594. total = this.$minus(total, discount)
  595. }
  596. if (total >= 0) {
  597. this.$set(this, `goods_total`, total);
  598. } else {
  599. uni.showToast({
  600. title: `实付金额不能为负数 不能使用该优惠劵`,
  601. icon: 'none'
  602. })
  603. }
  604. }
  605. }
  606. }
  607. </script>
  608. <style lang="scss">
  609. .main {
  610. display: flex;
  611. flex-direction: column;
  612. width: 100vw;
  613. height: 100vh;
  614. .one {
  615. position: relative;
  616. flex-grow: 1;
  617. background-color: var(--f1Color);
  618. .one_1 {
  619. display: flex;
  620. justify-content: space-between;
  621. align-items: center;
  622. width: 100vw;
  623. padding: 2vw;
  624. border-bottom: 1vw dashed var(--fcColor);
  625. .address {
  626. flex-grow: 1;
  627. margin: 0 0 0 2vw;
  628. font-size: var(--font14Size);
  629. color: var(--f85Color);
  630. }
  631. .iconfont {
  632. font-size: var(--font20Szie);
  633. }
  634. .other {
  635. width: 82vw;
  636. padding: 0 2vw;
  637. .name {
  638. font-size: var(--font16Size);
  639. }
  640. .other_1 {
  641. font-size: var(--font14Size);
  642. color: var(--f85Color);
  643. text {
  644. margin: 0 1vw 0 0;
  645. }
  646. }
  647. }
  648. }
  649. .one_2 {
  650. .list {
  651. width: 100vw;
  652. margin: 2vw 0;
  653. .list_1 {
  654. padding: 2vw;
  655. background-color: var(--mainColor);
  656. border-bottom: 0.1vw solid var(--fcColor);
  657. text {
  658. padding: 0 0 0 1vw;
  659. }
  660. }
  661. .list_2 {
  662. padding: 2vw;
  663. background-color: var(--mainColor);
  664. .list_2_1 {
  665. display: flex;
  666. .l {
  667. width: 20vw;
  668. .image {
  669. width: 100%;
  670. height: 20vw;
  671. border-radius: 5px;
  672. }
  673. }
  674. .c {
  675. width: 60vw;
  676. padding: 0 2vw;
  677. .Spec {
  678. font-size: var(--font12Size);
  679. color: var(--f85Color);
  680. }
  681. .label {
  682. display: flex;
  683. padding: 1vw 0 0 0;
  684. .label_1 {
  685. margin: 0 1vw 0 0;
  686. font-size: 12px;
  687. color: #FFA500;
  688. border: 1px solid #FFA500;
  689. border-radius: 5px;
  690. padding: 0 1vw;
  691. }
  692. .label_2 {
  693. font-size: 12px;
  694. border: 1px solid var(--fFB1Color);
  695. color: var(--fFB1Color);
  696. border-radius: 5px;
  697. padding: 0 1vw;
  698. }
  699. }
  700. }
  701. .r {
  702. width: 15vw;
  703. text-align: right;
  704. }
  705. }
  706. .list_2_2 {
  707. padding: 0 1vw 1vw 0;
  708. font-size: var(--font14Size);
  709. }
  710. .list_2_3 {
  711. display: flex;
  712. justify-content: space-between;
  713. border: 1px solid var(--fcColor);
  714. border-radius: 5px;
  715. margin: 0 0 1vw 0;
  716. padding: 1vw;
  717. .left {
  718. .name {
  719. font-size: 14px;
  720. }
  721. .Spec {
  722. font-size: var(--font12Size);
  723. color: var(--f85Color);
  724. }
  725. }
  726. }
  727. }
  728. .list_3 {
  729. width: 96vw;
  730. padding: 2vw;
  731. background-color: var(--mainColor);
  732. .other {
  733. display: flex;
  734. justify-content: space-between;
  735. border-bottom: 0.1vw solid var(--fcColor);
  736. margin: 0 0 2vw 0;
  737. padding: 2vw 0;
  738. .other_1 {
  739. font-size: var(--font16Size);
  740. color: var(--f85Color);
  741. }
  742. .other_3 {
  743. flex-grow: 1;
  744. margin: 0 0 0 2vw;
  745. font-size: var(--font12Size);
  746. }
  747. text {
  748. padding: 0 1vw 0 0;
  749. font-size: var(--font20Szie);
  750. }
  751. }
  752. }
  753. }
  754. .other {
  755. display: flex;
  756. justify-content: space-between;
  757. background-color: var(--mainColor);
  758. border-bottom: 0.1vw solid var(--fcColor);
  759. width: 96vw;
  760. padding: 2vw;
  761. .other_1 {
  762. font-size: var(--font16Size);
  763. color: var(--f85Color);
  764. }
  765. .other_3 {
  766. flex-grow: 1;
  767. margin: 0 0 0 2vw;
  768. font-size: var(--font12Size);
  769. }
  770. .other_4 {
  771. color: var(--fFB1Color);
  772. }
  773. text {
  774. padding: 0 1vw 0 0;
  775. font-size: var(--font20Szie);
  776. }
  777. }
  778. .act {
  779. background-color: var(--mainColor);
  780. border-bottom: 0.1vw solid var(--fcColor);
  781. margin: 0 0 2vw 0;
  782. width: 96vw;
  783. padding: 2vw;
  784. .act_1 {
  785. font-size: var(--font14Size);
  786. font-weight: bold;
  787. text {
  788. color: #FFA500;
  789. }
  790. }
  791. .act_2 {
  792. .plusList {
  793. display: flex;
  794. margin: 2vw 0;
  795. .image {
  796. width: 15vw;
  797. height: 10vw;
  798. border: 1px solid #ffffff;
  799. }
  800. .name {
  801. width: 57vw;
  802. font-size: 12px;
  803. margin: 0 0 0 1vw;
  804. }
  805. .money {
  806. width: 20vw;
  807. .text_1 {
  808. font-size: 12px;
  809. color: #858585;
  810. text-decoration: line-through;
  811. }
  812. .text_2 {
  813. font-size: 14px;
  814. color: #ff0000;
  815. }
  816. }
  817. }
  818. }
  819. .bottom {
  820. text-align: center;
  821. }
  822. }
  823. }
  824. }
  825. .two {
  826. display: flex;
  827. justify-content: space-between;
  828. border-top: 0.1vw solid var(--fcColor);
  829. .two_1 {
  830. display: flex;
  831. align-items: center;
  832. padding: 0 2vw;
  833. font-size: var(--font16Size);
  834. view:last-child {
  835. margin: 0 0 0 2vw;
  836. color: var(--ff0Color);
  837. font-weight: bold;
  838. }
  839. }
  840. .two_2 {
  841. padding: 3vw 4vw;
  842. color: var(--mainColor);
  843. font-size: var(--font16Size);
  844. background-color: var(--ff0Color);
  845. }
  846. }
  847. }
  848. .scroll-view {
  849. position: absolute;
  850. top: 0;
  851. left: 0;
  852. right: 0;
  853. bottom: 0;
  854. .list-scroll-view {
  855. display: flex;
  856. flex-direction: row;
  857. flex-wrap: wrap;
  858. }
  859. }
  860. .popup {
  861. display: flex;
  862. flex-direction: column;
  863. height: 100vw;
  864. overflow-x: hidden;
  865. background-color: var(--f5Color);
  866. padding: 2vw;
  867. .list {
  868. .one {
  869. display: flex;
  870. justify-content: space-between;
  871. margin: 2vw 0 0 0;
  872. padding: 2vw;
  873. background-color: var(--mainColor);
  874. .name {
  875. font-size: var(--font16Size);
  876. }
  877. .address {
  878. font-size: var(--font14Size);
  879. }
  880. .iconfont {
  881. line-height: 15vw;
  882. font-size: var(--font20Szie);
  883. }
  884. }
  885. .two {
  886. display: flex;
  887. justify-content: space-between;
  888. border-top: 0.1vw solid var(--fcColor);
  889. padding: 2vw;
  890. background-color: var(--mainColor);
  891. font-size: var(--font14Size);
  892. .text {
  893. margin: 0 2vw 0 0;
  894. border: 0.1vw solid var(--fFB1Color);
  895. padding: 1vw;
  896. font-size: var(--font12Size);
  897. border-radius: 2vw;
  898. color: var(--fFB1Color);
  899. }
  900. }
  901. }
  902. }
  903. .act {
  904. background-color: var(--mainColor);
  905. width: 96vw;
  906. padding: 2vw;
  907. .act_1 {
  908. font-size: var(--font14Size);
  909. font-weight: bold;
  910. text {
  911. color: #FFA500;
  912. }
  913. }
  914. .act_2 {
  915. margin: 1vw 0;
  916. .actList {
  917. display: flex;
  918. align-items: center;
  919. margin: 2vw 0;
  920. border: 0.1vw solid var(--fcColor);
  921. border-radius: 5px;
  922. padding: 1vw 0;
  923. .image {
  924. width: 12vw;
  925. height: 10vw;
  926. border: 1px solid #ffffff;
  927. }
  928. .name {
  929. width: 52vw;
  930. font-size: 12px;
  931. margin: 0 0 0 1vw;
  932. .some {
  933. display: inline-block;
  934. white-space: nowrap;
  935. width: 100%;
  936. overflow: hidden;
  937. text-overflow: ellipsis;
  938. }
  939. }
  940. .money {
  941. width: 20vw;
  942. .text_1 {
  943. font-size: 12px;
  944. color: #858585;
  945. text-decoration: line-through;
  946. }
  947. .text_2 {
  948. font-size: 13px;
  949. color: #ff0000;
  950. }
  951. }
  952. .checkbox {
  953. width: 7vw;
  954. }
  955. }
  956. }
  957. .bottom {
  958. text-align: center;
  959. button:first-child {
  960. margin: 0 1vw 0 0;
  961. background-color: #ff0000;
  962. color: #ffffff;
  963. }
  964. }
  965. }
  966. </style>