index.vue 20 KB

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