index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <template>
  2. <!-- 商品属性规格弹窗 -->
  3. <view>
  4. <view class="product-window"
  5. :class="(attr.cartAttr === true ? 'on' : '') + ' ' + (iSbnt?'join':'') + ' ' + (iScart?'joinCart':'')">
  6. <view class="textpic acea-row row-between-wrapper">
  7. <view class="pictrue" @click="showImg()">
  8. <image :src="attr.productSelect.image"></image>
  9. <view class="icon acea-row row-center-wrapper" v-if="cusPreviewImg">
  10. <view class="iconfont icon-fangda1"></view>
  11. </view>
  12. </view>
  13. <view class="text">
  14. <view class="line1">
  15. {{ type == 'setMeal'?title : attr.productSelect.store_name }}
  16. </view>
  17. <view class="money font-color">
  18. <view class="acea-row row-middle">
  19. <text v-if="type != 'points'">¥</text><text class="num">{{ attr.productSelect.price }}</text><text v-if="type == 'points'" class="num">积分</text>
  20. <text class='vip-money'
  21. v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'">¥{{attr.productSelect.vip_price}}</text>
  22. <view class="vipImg" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'member'">
  23. <image src="../../static/images/vip.png"></image>
  24. </view>
  25. <view class="icon" v-if="is_vip>0 && attr.productSelect.vip_price && storeInfo && storeInfo.price_type == 'level'"><text class="iconfont icon-dengjitubiao"></text>{{storeInfo.level_name}}</view>
  26. </view>
  27. <text class="stock" v-if='isShow'>库存: {{ attr.productSelect.stock }}</text>
  28. <text class='stock' v-if="limitNum">{{type == 'seckill' ? '限量' : type == 'points'?'剩余':'库存'}}: {{attr.productSelect.quota}}</text>
  29. <slot name="bottom" :attr="attr"></slot>
  30. </view>
  31. </view>
  32. <view class="iconfont icon-guanbi" @click="closeAttr"></view>
  33. </view>
  34. <view class="rollTop">
  35. <view class="productWinList">
  36. <view class="item" v-for="(item, indexw) in attr.productAttr" :key="indexw">
  37. <view class="title">{{ item.attr_name }}</view>
  38. <view class="listn acea-row row-middle">
  39. <view class="itemn" :class="item.index === itemn.attr ? 'on' : ''"
  40. v-for="(itemn, indexn) in item.attr_value" @click="tapAttr(indexw, indexn)"
  41. :key="indexn">
  42. {{ itemn.attr }}
  43. </view>
  44. </view>
  45. </view>
  46. <view class="item" v-if="isDelivery">
  47. <view class="title">配送方式</view>
  48. <view class="listn acea-row row-middle">
  49. <view class="itemn" v-if="attr.deliveryType.includes('1')" @click="getstoreInfo('1')" :class="flag==1?'on':''">商城配送</view>
  50. <view class="itemn" v-if="attr.deliveryType.includes('2') && attr.store_self_mention" @click="getstoreInfo('2')" :class="flag==2?'on':''">门店自提</view>
  51. <view class="itemn" v-if="attr.deliveryType.includes('3')" @click="getstoreInfo('3')" :class="flag==3?'on':''">门店配送</view>
  52. </view>
  53. </view>
  54. <view class="address acea-row row-middle" v-if="flag ==1 && isDelivery" @click="openAddress">
  55. <view class="adsInfo">{{addressInfo}}</view>
  56. <view class="iconfont icon-gengduo3"></view>
  57. </view>
  58. <view class="address acea-row row-middle" v-if="flag ==3 && isDelivery" @click="openStore">
  59. <view class="adsInfo">{{deliveryName}}{{deliveryAddress}}{{distance}}</view>
  60. <view class="iconfont icon-gengduo3" v-if="attr.isType == 0"></view>
  61. </view>
  62. <view class="address" v-if="flag ==2 && isDelivery" @click="openStore">
  63. <view>{{deliveryName}}</view>
  64. <view class="info acea-row row-between-wrapper">
  65. <view class="con">{{deliveryAddress}}</view>
  66. <view>{{distance}}<text class="iconfont icon-gengduo3" v-if="attr.isType == 0"></text></view>
  67. </view>
  68. </view>
  69. </view>
  70. <view class="cart acea-row row-between-wrapper" v-if="type != 'setMeal'">
  71. <view class="title">数量</view>
  72. <view class="carnum acea-row row-left">
  73. <view class="item reduce acea-row row-center-wrapper"
  74. :class="attr.productSelect.cart_num <= 1 ? 'on' : ''" v-if="attr.productSelect.cart_num <= 1">
  75. <text class="iconfont icon-shangpinshuliang-jian"></text>
  76. </view>
  77. <view class="item reduce acea-row row-center-wrapper"
  78. :class="attr.productSelect.cart_num <= 1 ? 'on' : ''" @click="CartNumDes" v-else>
  79. <text class="iconfont icon-shangpinshuliang-jian"></text>
  80. </view>
  81. <view class='item num acea-row row-middle'>
  82. <input type="number" v-model="attr.productSelect.cart_num"
  83. data-name="productSelect.cart_num"
  84. @input="bindCode(attr.productSelect.cart_num)"></input>
  85. </view>
  86. <view v-if="iSplus" class="item plus acea-row row-center-wrapper" :class="
  87. attr.productSelect.cart_num >= attr.productSelect.stock
  88. ? 'on'
  89. : ''
  90. " @click="CartNumAdd">
  91. <text class="iconfont icon-shangpinshuliang-jia"></text>
  92. </view>
  93. <view v-else class='item plus'
  94. :class='(attr.productSelect.cart_num >= attr.productSelect.quota) || (attr.productSelect.cart_num >= attr.productSelect.product_stock) || (attr.productSelect.cart_num >= attr.productSelect.num) || (type=="seckill" && attr.productSelect.cart_num >= attr.productSelect.once_num)? "on":""'
  95. @click='CartNumAdd'>+</view>
  96. </view>
  97. </view>
  98. </view>
  99. <view class="joinBnt bg-color"
  100. v-if="iSbnt && attr.productSelect.product_stock>0 &&attr.productSelect.quota>0" @click="goCat">我要参团
  101. </view>
  102. <view class="joinBnt on"
  103. v-else-if="(iSbnt && attr.productSelect.quota<=0)||(iSbnt &&attr.productSelect.product_stock<=0)">已售罄
  104. </view>
  105. <view class="joinBnt bg-color" v-if="iScart && attr.productSelect.stock" @click="goCat">确定</view>
  106. <view class="joinBnt on" v-else-if="iScart && !attr.productSelect.stock">已售罄</view>
  107. </view>
  108. <!-- 选择门店 -->
  109. <view class="product-window" :class="isStore?'store':''">
  110. <view class="storeTitle">选择门店<text class="iconfont icon-guanbi5" @click="closeStore"></text></view>
  111. <view class="storeList">
  112. <view class="item" :class="active == index?'on':''" v-for="(item,index) in storeList" :key="index" @click="tapStore(index,item)">
  113. <view class="name line1">{{item.name}}</view>
  114. <view class="address acea-row row-between">
  115. <view class="iconfont icon-dingwei2"></view>
  116. <view class="info">{{item.address}}</view>
  117. </view>
  118. <view class="time acea-row row-middle">
  119. <view class="iconfont icon-yingyeshijian2"></view>
  120. <view>营业时间:{{item.day_time}}</view>
  121. </view>
  122. <view class="iconfont icon-xuanzhong6" v-if="active == index"></view>
  123. </view>
  124. </view>
  125. </view>
  126. <addressWindow ref="addressWindow" :pagesUrl="pagesUrl" :fromType="1" :address="address" @changeClose="changeClose" @OnChangeAddress="OnChangeAddress">
  127. </addressWindow>
  128. <view class="mask" @touchmove.prevent :hidden="attr.cartAttr === false" @click="closeAttr"></view>
  129. <view class="mask on" @touchmove.prevent :hidden="isStore === false" @click="closeStore"></view>
  130. </view>
  131. </template>
  132. <script>
  133. import addressWindow from '@/components/addressWindow';
  134. import {getAddressList} from '@/api/user.js'
  135. import {storeListApi} from '@/api/store.js'
  136. export default {
  137. components:{
  138. addressWindow
  139. },
  140. props: {
  141. cusPreviewImg: {
  142. type: Number,
  143. value: 0
  144. },
  145. title: {
  146. type: String,
  147. default: ''
  148. },
  149. attr: {
  150. type: Object,
  151. default: () => {}
  152. },
  153. storeInfo: {
  154. type: Object,
  155. default: () => {}
  156. },
  157. limitNum: {
  158. type: Number,
  159. value: 0
  160. },
  161. isShow: {
  162. type: Number,
  163. value: 0
  164. },
  165. iSbnt: {
  166. type: Number,
  167. value: 0
  168. },
  169. iSplus: {
  170. type: Number,
  171. value: 0
  172. },
  173. iScart: {
  174. type: Number,
  175. value: 0
  176. },
  177. is_vip: {
  178. type: Number,
  179. value: 0
  180. },
  181. type: {
  182. type: String,
  183. default: ''
  184. },
  185. },
  186. data() {
  187. return {
  188. flag:1,
  189. addressInfo:'', // 商城快递
  190. deliveryName:'', // 门店配送
  191. distance:'',
  192. deliveryAddress:'',
  193. address: {
  194. address: false
  195. },
  196. pagesUrl:'',
  197. user_latitude: 0,
  198. user_longitude: 0,
  199. isDelivery: false,
  200. storeList: [],
  201. active:0,
  202. isStore: false
  203. }
  204. },
  205. mounted() {
  206. try {
  207. this.user_latitude = uni.getStorageSync('user_latitude');
  208. this.user_longitude = uni.getStorageSync('user_longitude');
  209. } catch (e) {}
  210. },
  211. watch: {
  212. 'attr.deliveryType': {
  213. handler(newV) {
  214. if(newV){
  215. if(this.active<1){
  216. if (this.user_latitude && this.user_longitude) {
  217. this.getList();
  218. } else {
  219. this.selfLocation();
  220. }
  221. }
  222. this.flag = newV[0];
  223. this.$emit('deliveryFun',newV[0]);
  224. }
  225. },
  226. deep: true
  227. }
  228. },
  229. methods: {
  230. closeStore(){
  231. this.isStore = false;
  232. },
  233. openStore(){
  234. if(this.attr.isType == 0){
  235. this.isStore = true;
  236. }
  237. },
  238. // 切换门店
  239. tapStore(index,item){
  240. this.active = index;
  241. this.deliveryName = item.name;
  242. this.deliveryAddress = item.detailed_address+'\xa0';
  243. this.distance = '距您'+item.range+'km';
  244. this.isStore = false;
  245. this.$emit('onstoreId',item);
  246. },
  247. // 切换地址
  248. OnChangeAddress: function(e,row) {
  249. this.address.address = false;
  250. this.addressInfo = row.province+'省'+'\xa0'+row.city+'\xa0'+row.district+'\xa0'+row.street+'\xa0'+row.detail
  251. this.$emit('onAddressId',row)
  252. },
  253. // 打开弹窗
  254. openAddress(){
  255. this.$refs.addressWindow.getAddressList();
  256. this.address.address = true;
  257. this.pagesUrl = '/pages/users/user_address/index'
  258. },
  259. goCat: function() {
  260. this.$emit('goCat');
  261. },
  262. // 配送地址
  263. getAddressList() {
  264. getAddressList({
  265. page: 1,
  266. limit: 1
  267. }).then(res=>{
  268. let data = res.data[0];
  269. if(res.data.length){
  270. this.addressInfo = data.province+'省'+'\xa0'+data.city+'\xa0'+data.district+'\xa0'+data.street+'\xa0'+data.detail
  271. this.$emit('onAddressId',data)
  272. }else{
  273. this.addressInfo = '点击添加地址'
  274. }
  275. })
  276. },
  277. // 关闭地址弹窗;
  278. changeClose: function() {
  279. this.$set(this.address, 'address', false);
  280. },
  281. selfLocation() {
  282. let self = this
  283. // #ifdef H5
  284. if (self.$wechat.isWeixin()) {
  285. self.$wechat.location().then(res => {
  286. this.user_latitude = res.latitude;
  287. this.user_longitude = res.longitude;
  288. uni.setStorageSync('user_latitude', res.latitude);
  289. uni.setStorageSync('user_longitude', res.longitude);
  290. self.getList();
  291. })
  292. } else {
  293. // #endif
  294. uni.getLocation({
  295. type: 'wgs84',
  296. success: (res) => {
  297. try {
  298. this.user_latitude = res.latitude;
  299. this.user_longitude = res.longitude;
  300. uni.setStorageSync('user_latitude', res.latitude);
  301. uni.setStorageSync('user_longitude', res.longitude);
  302. } catch {}
  303. self.getList();
  304. },
  305. complete: function() {
  306. self.getList();
  307. }
  308. });
  309. // #ifdef H5
  310. }
  311. // #endif
  312. },
  313. getList: function() {
  314. let data = {
  315. latitude: this.user_latitude || "", //纬度
  316. longitude: this.user_longitude || "", //经度
  317. page: 1,
  318. limit: 10,
  319. product_id: this.storeInfo.id ? this.storeInfo.id : ''
  320. };
  321. storeListApi(data)
  322. .then(res => {
  323. let list = res.data.list.list;
  324. if(list.length && this.attr && ((this.attr.deliveryType.indexOf('2') != -1 && this.attr.store_self_mention) || this.attr.deliveryType.indexOf('3') != -1)){
  325. this.isDelivery = true;
  326. this.getAddressList()
  327. }
  328. this.storeList = list;
  329. this.active = 0;
  330. this.deliveryName = list[0].name;
  331. this.deliveryAddress = list[0].detailed_address+'\xa0';
  332. this.distance = '距您'+list[0].range+'km';
  333. this.$emit('onstoreId',list[0]);
  334. })
  335. .catch(err => {
  336. this.$util.Tips({
  337. title: err
  338. })
  339. });
  340. },
  341. /**
  342. * 购物车手动输入数量
  343. *
  344. */
  345. bindCode: function(e) {
  346. this.$emit('iptCartNum', this.attr.productSelect.cart_num);
  347. },
  348. closeAttr: function() {
  349. this.$emit('myevent');
  350. },
  351. CartNumDes: function() {
  352. this.$emit('ChangeCartNum', false);
  353. },
  354. CartNumAdd: function() {
  355. this.$emit('ChangeCartNum', true);
  356. },
  357. tapAttr: function(indexw, indexn) {
  358. let that = this;
  359. that.$emit("attrVal", {
  360. indexw: indexw,
  361. indexn: indexn
  362. });
  363. this.$set(this.attr.productAttr[indexw], 'index', this.attr.productAttr[indexw].attr_values[indexn]);
  364. let value = that
  365. .getCheckedValue()
  366. .join(",");
  367. that.$emit("ChangeAttr", value);
  368. },
  369. //获取被选中属性;
  370. getCheckedValue: function() {
  371. let productAttr = this.attr.productAttr;
  372. let value = [];
  373. for (let i = 0; i < productAttr.length; i++) {
  374. for (let j = 0; j < productAttr[i].attr_values.length; j++) {
  375. if (productAttr[i].index === productAttr[i].attr_values[j]) {
  376. value.push(productAttr[i].attr_values[j]);
  377. }
  378. }
  379. }
  380. return value;
  381. },
  382. // 选择配送方式
  383. getstoreInfo(index) {
  384. this.flag = index;
  385. this.active = 0;
  386. this.deliveryName = this.storeList[0].name;
  387. this.deliveryAddress = this.storeList[0].detailed_address+'\xa0';
  388. this.distance = '距您'+this.storeList[0].range+'km';
  389. this.$emit('deliveryFun',index);
  390. },
  391. showImg() {
  392. this.$emit('getImg');
  393. }
  394. }
  395. }
  396. </script>
  397. <style scoped lang="scss">
  398. .mask.on{
  399. z-index: 100 !important;
  400. }
  401. .product-window{
  402. .productWinList{
  403. .address{
  404. width: 690rpx;
  405. background: #F5F5F5;
  406. padding: 30rpx 24rpx;
  407. margin: 0 auto;
  408. margin-top: 20rpx;
  409. font-weight: 400;
  410. color: #333333;
  411. font-size: 26rpx;
  412. border-radius: 10rpx;
  413. .adsInfo{
  414. max-width: 594rpx;
  415. }
  416. .iconfont{
  417. font-size: 18rpx;
  418. margin-left: 12rpx;
  419. }
  420. .info{
  421. font-weight: 400;
  422. color: #999999;
  423. margin-top: 12rpx;
  424. .con{
  425. width: 416rpx;
  426. }
  427. }
  428. }
  429. }
  430. }
  431. .active {
  432. position: relative;
  433. border: 1px solid var(--view-theme);
  434. .icon-xuanzhong6 {
  435. font-size: 46rpx;
  436. position: absolute;
  437. bottom: -4rpx;
  438. right: -6rpx;
  439. color: var(--view-theme);
  440. }
  441. }
  442. .vip-money {
  443. color: #282828;
  444. font-size: 28rpx;
  445. font-weight: 700;
  446. margin-left: 6rpx;
  447. }
  448. .vipImg {
  449. width: 56rpx;
  450. height: 20rpx;
  451. margin-left: 6rpx;
  452. image {
  453. width: 100%;
  454. height: 100%;
  455. display: block;
  456. }
  457. }
  458. .product-window{
  459. &.store{
  460. background-color: #F5F5F5;
  461. border-radius: 20rpx 20rpx 0 0;
  462. transform: translate3d(0, 0, 0);
  463. z-index: 102;
  464. margin: 0;
  465. }
  466. .storeTitle{
  467. text-align: center;
  468. height: 100rpx;
  469. line-height: 100rpx;
  470. font-size: 32rpx;
  471. font-weight: 500;
  472. color: #282828;
  473. position: relative;
  474. .iconfont{
  475. position: absolute;
  476. font-size: 35rpx;
  477. right: 30rpx;
  478. }
  479. }
  480. .storeList{
  481. max-height: 690rpx;
  482. overflow: auto;
  483. .item{
  484. width: 690rpx;
  485. background: #FFFFFF;
  486. border-radius: 12rpx;
  487. margin: 0 auto 20rpx auto;
  488. padding: 28rpx 30rpx;
  489. border: 1px solid #fff;
  490. position: relative;
  491. &.on{
  492. border-color: var(--view-theme);
  493. }
  494. .icon-xuanzhong6{
  495. position: absolute;
  496. right: -6rpx;
  497. bottom: -6rpx;
  498. color: var(--view-theme);
  499. font-size: 54rpx;
  500. }
  501. .name{
  502. font-weight: 500;
  503. color: #333333;
  504. font-size: 28rpx;
  505. }
  506. .time{
  507. font-weight: 400;
  508. color: #888888;
  509. font-size: 22rpx;
  510. margin-top: 15rpx;
  511. .iconfont{
  512. font-size: 20rpx;
  513. margin-right: 8rpx;
  514. }
  515. }
  516. .address{
  517. font-weight: 400;
  518. color: #888888;
  519. font-size: 22rpx;
  520. margin-top: 13rpx;
  521. .iconfont{
  522. font-size: 20rpx;
  523. margin-right: 8rpx;
  524. margin-top: 6rpx;
  525. }
  526. .info{
  527. width: 590rpx;
  528. line-height: 1.5;
  529. }
  530. }
  531. }
  532. }
  533. }
  534. .product-window {
  535. position: fixed;
  536. bottom: 0;
  537. width: 100%;
  538. left: 0;
  539. background-color: #fff;
  540. z-index: 100;
  541. border-radius: 16rpx 16rpx 0 0;
  542. transform: translate3d(0, 100%, 0);
  543. transition: all .3s cubic-bezier(.25, .5, .5, .9);
  544. padding-bottom: 140rpx;
  545. padding-bottom: calc(140rpx+ constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
  546. padding-bottom: calc(140rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
  547. }
  548. .product-window.on {
  549. transform: translate3d(0, 0, 0);
  550. }
  551. .product-window.join {
  552. padding-bottom: 30rpx;
  553. }
  554. .product-window.joinCart {
  555. padding-bottom: 30rpx;
  556. z-index: 10000;
  557. }
  558. .product-window .textpic {
  559. padding: 0 130rpx 0 30rpx;
  560. margin-top: 29rpx;
  561. position: relative;
  562. }
  563. .product-window .textpic .pictrue {
  564. width: 150rpx;
  565. height: 150rpx;
  566. position: relative;
  567. .icon{
  568. width: 30rpx;
  569. height: 30rpx;
  570. background-color: rgba(0,0,0,0.4);
  571. border-radius: 4rpx;
  572. position: absolute;
  573. bottom: 8rpx;
  574. right: 8rpx;
  575. text-align: center;
  576. line-height: 23rpx;
  577. .iconfont{
  578. color: #fff;
  579. font-size: 20rpx;
  580. }
  581. }
  582. }
  583. .product-window .textpic .pictrue image {
  584. width: 100%;
  585. height: 100%;
  586. border-radius: 10rpx;
  587. }
  588. .product-window .textpic .text {
  589. width: 410rpx;
  590. font-size: 32rpx;
  591. color: #202020;
  592. }
  593. .product-window .textpic .text .money {
  594. font-size: 24rpx;
  595. margin-top: 40rpx;
  596. .icon{
  597. display: inline-block;
  598. font-size: 16rpx;
  599. font-weight: normal;
  600. background: #FF9500;
  601. color: #fff;
  602. border-radius: 18rpx;
  603. padding: 2rpx 6rpx;
  604. margin-left: 10rpx;
  605. .iconfont{
  606. font-size: 16rpx;
  607. margin-right: 4rpx;
  608. color: #fff;
  609. }
  610. }
  611. }
  612. .product-window .textpic .text .money .num {
  613. font-size: 36rpx;
  614. }
  615. .product-window .textpic .text .money .stock {
  616. color: #999;
  617. margin-left: 6rpx;
  618. }
  619. .product-window .textpic .icon-guanbi {
  620. position: absolute;
  621. right: 30rpx;
  622. top: -5rpx;
  623. font-size: 35rpx;
  624. color: #8a8a8a;
  625. }
  626. .product-window .rollTop {
  627. max-height: 535rpx;
  628. overflow: auto;
  629. margin-top: 36rpx;
  630. }
  631. .product-window .productWinList .item~.item {
  632. margin-top: 36rpx;
  633. }
  634. .product-window .productWinList .item .title {
  635. font-size: 30rpx;
  636. color: #999;
  637. padding: 0 30rpx;
  638. }
  639. .product-window .productWinList .item .listn {
  640. padding: 0 30rpx 0 16rpx;
  641. }
  642. .product-window .productWinList .item .listn .itemn {
  643. border: 1px solid #F2F2F2;
  644. font-size: 26rpx;
  645. color: #282828;
  646. padding: 7rpx 33rpx;
  647. border-radius: 25rpx;
  648. margin: 20rpx 0 0 14rpx;
  649. background-color: #F2F2F2;
  650. word-break: break-all;
  651. }
  652. .product-window .productWinList .item .listn .itemn.on {
  653. color: var(--view-theme);
  654. background: var(--view-minorColorT);
  655. border-color: var(--view-theme);
  656. }
  657. .product-window .productWinList .item .listn .itemn.limit {
  658. color: #999;
  659. text-decoration: line-through;
  660. }
  661. .product-window .cart {
  662. margin-top: 36rpx;
  663. padding: 0 30rpx;
  664. }
  665. .product-window .cart .title {
  666. font-size: 30rpx;
  667. color: #999;
  668. }
  669. .product-window .cart .carnum {
  670. height: 54rpx;
  671. margin-top: 24rpx;
  672. }
  673. .product-window .cart .carnum .iconfont {
  674. font-size: 25rpx;
  675. }
  676. .product-window .cart .carnum view {
  677. // border: 1px solid #a4a4a4;
  678. width: 84rpx;
  679. text-align: center;
  680. height: 100%;
  681. line-height: 54rpx;
  682. color: #282828;
  683. font-size: 45rpx;
  684. }
  685. .product-window .cart .carnum .reduce {
  686. border-right: 0;
  687. border-radius: 6rpx 0 0 6rpx;
  688. line-height: 48rpx;
  689. font-size: 60rpx;
  690. }
  691. .product-window .cart .carnum .reduce.on {
  692. color: #DEDEDE;
  693. }
  694. .product-window .cart .carnum .plus {
  695. border-left: 0;
  696. border-radius: 0 6rpx 6rpx 0;
  697. line-height: 46rpx;
  698. }
  699. .product-window .cart .carnum .plus.on {
  700. // border-color: #e3e3e3;
  701. color: #dedede;
  702. }
  703. .product-window .cart .carnum .num {
  704. background: rgba(242, 242, 242, 1);
  705. color: #282828;
  706. font-size: 28rpx;
  707. }
  708. .product-window .joinBnt {
  709. font-size: 30rpx;
  710. width: 620rpx;
  711. height: 86rpx;
  712. border-radius: 50rpx;
  713. text-align: center;
  714. line-height: 86rpx;
  715. color: #fff;
  716. margin: 21rpx auto 0 auto;
  717. }
  718. .product-window .joinBnt.on {
  719. background-color: #bbb;
  720. color: #fff;
  721. }
  722. </style>