index.vue 45 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  1. <template>
  2. <view>
  3. <!-- index.wxml -->
  4. <view :class="showGoodsSpec ? 'wrap limited' : 'wrap'">
  5. <view class="wrap_nr">
  6. <view :class="addGoodList && addGoodList.length != 0 ? 'tips addPos' : 'tips'" v-if="!isHaveGoods">购物车空空如也,去逛逛吧~</view>
  7. <view class="shopcar_wrap" v-if="isHaveGoods">
  8. <view class="shopcar">
  9. <view class="goods_list">
  10. <van-checkbox-group :value="resultArr" @change="onChangeResult">
  11. <van-swipe-cell :right-width="65" v-for="(item, index) in cartGoods" :key="index">
  12. <van-cell-group>
  13. <!-- 普通商品 -->
  14. <view class="goods_item" v-if="!item.add_good_rule_id">
  15. <van-checkbox
  16. :name="item.id"
  17. checked-color="#295C56"
  18. :class="'checkboxes-' + item.id"
  19. @tap.native="toggleGoods($event, { id: item.id })"
  20. :data-id="item.id"
  21. ></van-checkbox>
  22. <image class="goods_tu" :src="imgUrl + item.good_thumb" @tap="onGoodsSpec" :data-item="item"></image>
  23. <view class="goods_info">
  24. <view @tap="onGoodsSpec" :data-item="item">
  25. <view class="goods_title">{{ item.good_title }}</view>
  26. <view class="goods_labels" v-if="item.good_specs_title">
  27. <view class="label">{{ item.good_specs_title }}</view>
  28. </view>
  29. </view>
  30. <view class="goods_specs">
  31. <view class="price">
  32. <text>
  33. <text class="unit">¥</text>
  34. {{ item.price }}
  35. </text>
  36. <text class="vip">会员价{{ '¥' + item.member_price }}</text>
  37. </view>
  38. <van-stepper
  39. :value="item.nums"
  40. input-width="40rpx"
  41. min="1"
  42. disable-input
  43. custom-class="stepper"
  44. plus-class="plus"
  45. minus-class="minus"
  46. input-class="step_input"
  47. @change="onChangeCartNum($event, { item })"
  48. :data-item="item"
  49. />
  50. </view>
  51. </view>
  52. </view>
  53. <!-- 活动加购商品 -->
  54. <view class="goods_item" v-else>
  55. <van-checkbox
  56. :name="item.id"
  57. checked-color="#295C56"
  58. :class="'checkboxes-' + item.id"
  59. @tap.native="toggleGoods($event, { id: item.id })"
  60. :data-id="item.id"
  61. ></van-checkbox>
  62. <image class="goods_tu" :src="imgUrl + item.good_thumb" @tap="onGoodsSpec" :data-item="item"></image>
  63. <view class="goods_info">
  64. <view @tap="onGoodsSpec" :data-item="item">
  65. <view class="goods_title">
  66. <text class="add_tag">加购商品</text>
  67. {{ item.good_title }}
  68. </view>
  69. <view class="goods_labels" v-if="item.good_specs_title">
  70. <view class="label">{{ item.good_specs_title }}</view>
  71. </view>
  72. </view>
  73. <view class="goods_specs">
  74. <view class="price">
  75. <text>
  76. <text class="unit">¥</text>
  77. {{ item.add_price }}
  78. </text>
  79. <text class="df_price">原价{{ '¥' + item.price }}</text>
  80. </view>
  81. <van-stepper
  82. :value="item.nums"
  83. input-width="40rpx"
  84. min="1"
  85. async-change
  86. disable-input
  87. custom-class="stepper"
  88. plus-class="plus"
  89. minus-class="minus"
  90. input-class="step_input"
  91. @change="onChangeCartNum($event, { item })"
  92. :data-item="item"
  93. />
  94. </view>
  95. </view>
  96. </view>
  97. </van-cell-group>
  98. <view slot="right" class="goods_del" @tap="bindDel" :data-item="item">删除</view>
  99. </van-swipe-cell>
  100. </van-checkbox-group>
  101. </view>
  102. <view class="jiesuan_wrap">
  103. <!-- {{ is_member ? totalMemberPrice : totalPrice }} -->
  104. <view class="jiesuan_t">
  105. 共计{{ totalNums }}个产品,总价
  106. <text class="price">
  107. <text class="unit">¥</text>
  108. {{ totalPrice }}
  109. </text>
  110. </view>
  111. <view class="jiesuan_b">
  112. <view class="jieusan_btn" @tap="toPay">去结算</view>
  113. </view>
  114. </view>
  115. </view>
  116. </view>
  117. <view :class="!isHaveGoods ? 'huangou_wrap addTipPos' : 'huangou_wrap'" v-if="addGoodList && addGoodList.length != 0">
  118. <view v-for="(item, index) in addGoodList" :key="item.id">
  119. <view class="title">{{ item.title }}</view>
  120. <view class="huangou_list">
  121. <view class="huangou_item">
  122. <image class="goods_tu" :src="imgUrl + item.add_good.thumb" @tap="onAdGoodsSpec" :data-item="item"></image>
  123. <view class="goods_info">
  124. <view class="goods_title">{{ item.add_good.title }}</view>
  125. <view class="goods_info_b">
  126. <view class="goods_price">
  127. <text class="ac_price">
  128. <text class="unit">¥</text>
  129. {{ item.add_price }}
  130. </text>
  131. <text class="df_price">
  132. <text class="unit">¥</text>
  133. {{ item.add_good.base_price }}
  134. </text>
  135. </view>
  136. </view>
  137. <view class="setp_w">
  138. <view
  139. class="guige_btn"
  140. v-if="item.add_good_rule_good_spec && item.add_good_rule_good_spec.length != 0"
  141. @tap="onAdGoodsSpec"
  142. :data-item="item"
  143. >
  144. 选规格
  145. </view>
  146. <van-stepper
  147. v-else
  148. :value="item.nums"
  149. input-width="40rpx"
  150. min="0"
  151. :max="item.add_num"
  152. disable-input
  153. custom-class="stepper"
  154. plus-class="plus"
  155. minus-class="minus"
  156. input-class="step_input"
  157. :data-item="item"
  158. @change="onChangeAdGoodsNum($event, { item })"
  159. />
  160. </view>
  161. </view>
  162. </view>
  163. </view>
  164. </view>
  165. </view>
  166. </view>
  167. </view>
  168. <!-- 详情弹层 -->
  169. <van-overlay :z-index="5" class-style="background: rgba(0,0,0,.3);" :show="showGoodsSpec" @tap.native.stop.prevent="closeGoodsSpec"></van-overlay>
  170. <view class="guige_wrap" v-if="showGoodsSpec">
  171. <view class="guige">
  172. <view class="guige_t">
  173. <image class="goods_thumb" mode="widthFix" :src="imgUrl + currentGoods.good_thumb"></image>
  174. <view class="guige_t_r">
  175. <view class="goods_name">
  176. <view class="goods_name_l">{{ currentGoods.good_title }}</view>
  177. </view>
  178. <view class="goods_desc" v-if="currentGoods.good_specs_title">
  179. <view class="goods_desc_nr slh">{{ currentGoods.good_specs_title }}</view>
  180. </view>
  181. </view>
  182. </view>
  183. <view class="guige_b">
  184. <view class="guige_b_l">
  185. <text class="price">
  186. <text class="unit">¥</text>
  187. {{ currentGoods.price }}
  188. </text>
  189. <text class="vip">会员价{{ '¥' + currentGoods.member_price }}</text>
  190. </view>
  191. <view class="">
  192. <van-stepper
  193. :value="currentGoods.nums"
  194. input-width="40rpx"
  195. min="1"
  196. disable-input
  197. custom-class="stepper"
  198. plus-class="plus"
  199. minus-class="minus"
  200. input-class="step_input"
  201. @change="onChangeCartNum($event, { item: currentGoods })"
  202. :data-item="currentGoods"
  203. />
  204. </view>
  205. </view>
  206. </view>
  207. <van-icon name="close" class="btn_close" color="#ffffff" size="30px" @tap.native="closeGoodsSpec" />
  208. </view>
  209. <!-- 加购商品详情 -->
  210. <van-overlay :z-index="5" class-style="background: rgba(0,0,0,.3);" :show="showAdGoodsSpec" @tap.native.stop.prevent="closeAdGoodsSpec"></van-overlay>
  211. <view class="guige_wrap" v-if="showAdGoodsSpec">
  212. <view class="guige">
  213. <view class="guige_t">
  214. <image class="goods_thumb" mode="widthFix" :src="imgUrl + currentAdGoods.add_good.thumb"></image>
  215. <view class="guige_t_r">
  216. <view class="goods_name">
  217. <view class="goods_name_l">{{ currentAdGoods.add_good.title }}</view>
  218. </view>
  219. <view class="goods_guige" v-if="currentAdGoods.add_good_rule_good_spec && currentAdGoods.add_good_rule_good_spec.length != 0">
  220. <view class="goods_guige_name">规格</view>
  221. <view class="goods_guige_nr">
  222. <view
  223. :class="addgood_specs.is_checked ? 'guige_item selected' : 'guige_item'"
  224. @tap="onChangeSpecGoods"
  225. :data-specs="addgood_specs"
  226. v-for="(addgood_specs, index) in currentAdGoods.add_good_rule_good_spec"
  227. :key="index"
  228. >
  229. <view class="item_wenzi">
  230. <text>{{ addgood_specs.good_spec.title }}</text>
  231. </view>
  232. </view>
  233. </view>
  234. </view>
  235. <!-- <view class="goods_guige">
  236. <view class="goods_desc_nr" wx:if="{{ currentAdGoods.add_good_rule_good_spec.length == 0 }}">
  237. <view class="item_wenzi"><text>{{ currentAdGoods.add_good_specs.title }}</text></view>
  238. </view>
  239. </view> -->
  240. <!-- <view class="goods_desc" wx:if="{{ currentAdGoods.add_good_rule_good_spec }}">
  241. <view class="goods_desc_nr slh">{{ currentAdGoods.add_good_specs.title }}</view>
  242. </view> -->
  243. </view>
  244. </view>
  245. <view class="guige_b_wrap">
  246. <view class="guige_b" v-if="currentAdGoods.add_good_rule_good_spec && currentAdGoods.add_good_rule_good_spec.length != 0">
  247. <view class="guige_b_l">
  248. <text class="price">
  249. <text class="unit">¥</text>
  250. {{ currentAdGoods.add_price }}
  251. </text>
  252. <text class="vip">原价{{ '¥' + currentAdGoodsSpec.good_spec.price }}</text>
  253. </view>
  254. <view class="">
  255. <van-stepper
  256. :value="currentAdGoodsSpec.nums"
  257. input-width="40rpx"
  258. min="0"
  259. :max="currentAdGoods.add_num"
  260. async-change
  261. disable-input
  262. custom-class="stepper"
  263. plus-class="plus"
  264. minus-class="minus"
  265. input-class="step_input"
  266. :data-item="currentAdGoodsSpec"
  267. @change="onChangeAdGoodsSpecNum($event, { item: currentAdGoodsSpec })"
  268. />
  269. </view>
  270. </view>
  271. <view class="guige_b" v-else>
  272. <view class="guige_b_l">
  273. <text class="price">
  274. <text class="unit">¥</text>
  275. {{ currentAdGoods.add_price }}
  276. </text>
  277. <text class="vip">原价{{ '¥' + currentAdGoods.add_good.base_price }}</text>
  278. </view>
  279. <view class="">
  280. <van-stepper
  281. :value="currentAdGoods.nums"
  282. input-width="40rpx"
  283. min="0"
  284. :max="currentAdGoods.add_num"
  285. disable-input
  286. custom-class="stepper"
  287. plus-class="plus"
  288. minus-class="minus"
  289. input-class="step_input"
  290. :data-item="currentAdGoods"
  291. @change="onChangeAdGoodsNum($event, { item: currentAdGoods })"
  292. />
  293. </view>
  294. </view>
  295. </view>
  296. </view>
  297. <van-icon name="close" class="btn_close" color="#ffffff" size="30px" @tap.native="closeAdGoodsSpec" />
  298. </view>
  299. <!-- js -->
  300. </view>
  301. </template>
  302. <script module="we" lang="wxs">
  303. /* 字符串长度截取 */
  304. var strSlice = function(value) {
  305. if(value.length > 10){
  306. value = value.slice(0,6)+'...'
  307. };
  308. return value;
  309. };
  310. module.exports = {
  311. strSlice: strSlice
  312. }
  313. </script>
  314. <script>
  315. // index.js
  316. let myPro = require('../../utils/wxRequest.js');
  317. let util = require('../../utils/util.js');
  318. export default {
  319. data() {
  320. return {
  321. setBgHeight: getApp().globalData.setBgHeight,
  322. imgUrl: getApp().globalData.imgUrl,
  323. fare_type: 1,
  324. // 0外卖 1自提 默认自取
  325. is_member: 0,
  326. // 是否为会员
  327. showGoodsSpec: false,
  328. cartGoods: [],
  329. // 购物车商品
  330. addGoodList: [],
  331. // 活动加购商品
  332. resultArr: [],
  333. // 选中商品
  334. checkedAll: true,
  335. resultAll: [],
  336. // 测试
  337. totalNums: 0,
  338. // 加购商品总数
  339. totalPrice: 0,
  340. // 加购商品总价(原价)
  341. totalMemberPrice: 0,
  342. // 加购商品总价(会员价)
  343. showAdGoodsSpec: false,
  344. // 是否有商品
  345. isHaveGoods: true,
  346. currentGoods: {
  347. good_thumb: '',
  348. good_title: '',
  349. good_specs_title: '',
  350. member_price: '',
  351. nums: ''
  352. },
  353. currentAdGoods: {
  354. add_good: {
  355. thumb: '',
  356. title: '',
  357. base_price: ''
  358. },
  359. add_good_rule_good_spec: '',
  360. add_num: '',
  361. nums: ''
  362. },
  363. currentAdGoodsSpec: {
  364. good_spec: {
  365. price: ''
  366. },
  367. nums: ''
  368. },
  369. addgood_specs: {
  370. is_checked: false,
  371. good_spec: {
  372. title: ''
  373. }
  374. }
  375. };
  376. },
  377. onLoad: function (options) {
  378. // Do some initialize when page load.
  379. },
  380. onShow: function () {
  381. // Do something when page show.
  382. let that = this;
  383. that.setData({
  384. is_member: getApp().globalData.is_member
  385. }); // 获取配送方式
  386. if (uni.getStorageSync('fare_type')) {
  387. that.setData({
  388. fare_type: uni.getStorageSync('fare_type')
  389. });
  390. }
  391. that.getCartsList();
  392. },
  393. onReady: function () {
  394. // Do something when page ready.
  395. },
  396. onHide: function () {
  397. // Do something when page hide.
  398. },
  399. onUnload: function () {
  400. // Do something when page close.
  401. },
  402. onPullDownRefresh: function () {
  403. // Do something when pull down.
  404. },
  405. onReachBottom: function () {
  406. // Do something when page reach bottom.
  407. },
  408. onPageScroll: function () {
  409. // Do something when page scroll
  410. },
  411. onResize: function () {
  412. // Do something when page resize
  413. },
  414. methods: {
  415. // 获取购物车商品
  416. getCartsList() {
  417. let that = this;
  418. let params = {};
  419. myPro
  420. .wxRequest('user/v3/carts/list', 'GET', params)
  421. .then((res) => {
  422. // 普通商品
  423. let list = res.result.list;
  424. if (list.length != 0) {
  425. that.setData({
  426. isHaveGoods: true
  427. });
  428. } else {
  429. that.setData({
  430. isHaveGoods: false
  431. });
  432. } // 活动加购商品
  433. let addGoodList = res.result.add_good_list;
  434. that.setData({
  435. cartGoods: list,
  436. addGoodList: addGoodList,
  437. totalNums: res.result.total_num,
  438. totalPrice: res.result.money // 接口返回的,不需再关注是否为会员价
  439. }); // 商品选中状态
  440. let resultArr = [];
  441. for (let i in list) {
  442. if (list[i].selected) {
  443. resultArr.push('' + list[i].id);
  444. }
  445. }
  446. that.setData({
  447. resultArr: resultArr
  448. });
  449. })
  450. .catch((err) => {
  451. console.log('报错信息', err);
  452. uni.showToast({
  453. title: err,
  454. icon: 'none'
  455. });
  456. });
  457. },
  458. // 展示详情
  459. onGoodsSpec(event) {
  460. let that = this;
  461. let item = event.currentTarget.dataset.item;
  462. that.setData({
  463. currentGoods: item,
  464. // 商品加购的规格(不带多规格)
  465. showGoodsSpec: true
  466. });
  467. },
  468. // 关闭详情
  469. closeGoodsSpec() {
  470. let that = this;
  471. that.setData({
  472. showGoodsSpec: false
  473. });
  474. },
  475. // 更改购物车商品
  476. onChangeCartNum(event, _dataset) {
  477. /* ---处理dataset begin--- */
  478. this.datasetHandle(event, _dataset);
  479. /* ---处理dataset end--- */
  480. let that = this;
  481. let nums = event.detail;
  482. let item = event.currentTarget.dataset.item;
  483. let params = {
  484. id: item.id,
  485. nums: nums
  486. }; // console.log('event',event)
  487. // return;
  488. myPro
  489. .wxRequest('user/v3/carts/editnum', 'POST', params)
  490. .then((res) => {
  491. that.getCartsList();
  492. })
  493. .catch((err) => {
  494. console.log('报错信息', err);
  495. uni.showToast({
  496. title: err,
  497. icon: 'none'
  498. });
  499. });
  500. },
  501. // 删除商品
  502. bindDel(event) {
  503. let that = this;
  504. console.log('event', event);
  505. let item = event.currentTarget.dataset.item;
  506. let params = {
  507. id: item.id
  508. };
  509. myPro
  510. .wxRequest('user/v3/carts/remove', 'POST', params)
  511. .then((res) => {
  512. // 主动调购物车,更新信息
  513. that.getCartsList();
  514. })
  515. .catch((err) => {
  516. console.log('报错信息', err);
  517. uni.showToast({
  518. title: err,
  519. icon: 'none'
  520. });
  521. });
  522. },
  523. // 选择
  524. onChangeResult(event) {
  525. let that = this;
  526. console.log(event.detail);
  527. that.setData({
  528. resultArr: event.detail
  529. });
  530. },
  531. // 切换状态
  532. toggleGoods(event, _dataset) {
  533. /* ---处理dataset begin--- */
  534. this.datasetHandle(event, _dataset);
  535. /* ---处理dataset end--- */
  536. console.log('切换状态', event);
  537. let that = this;
  538. let id = event.currentTarget.dataset.id;
  539. let resultArr = that.resultArr;
  540. let params = {
  541. id: id
  542. };
  543. if (resultArr.includes('' + id)) {
  544. params.selected = 1; // 选中
  545. myPro
  546. .wxRequest('user/v3/carts/selected', 'POST', params)
  547. .then((res) => {
  548. that.getCartsList();
  549. })
  550. .catch((err) => {
  551. console.log('报错信息', err);
  552. uni.showToast({
  553. title: err,
  554. icon: 'none'
  555. });
  556. });
  557. } else {
  558. // 取消选中
  559. params.selected = 0; // 选中
  560. myPro
  561. .wxRequest('user/v3/carts/selected', 'POST', params)
  562. .then((res) => {
  563. that.getCartsList();
  564. })
  565. .catch((err) => {
  566. console.log('报错信息', err);
  567. uni.showToast({
  568. title: err,
  569. icon: 'none'
  570. });
  571. });
  572. }
  573. },
  574. // 去结算
  575. toPay() {
  576. let that = this; // 判断商品是否勾选(如果都未勾选提示一下)
  577. // console.log('resultArr',that.data.resultArr);
  578. let resultArr = that.resultArr;
  579. if (resultArr.length == 0) {
  580. uni.showToast({
  581. title: '请勾选商品',
  582. icon: 'none'
  583. });
  584. return;
  585. } // 验证是否能下单(有可能不在营业时间)
  586. uni.request({
  587. url: getApp().globalData.api + 'user/v3/order/createlist',
  588. data: {
  589. token: getApp().globalData.token
  590. },
  591. success: function (res) {
  592. if (res.data.code == 200) {
  593. // 如果是外卖,看是否有收货地址
  594. if (that.fare_type == 0) {
  595. if (!uni.getStorageSync('checkedAddress')) {
  596. uni.navigateTo({
  597. url: '/pages/user/address/list/index'
  598. });
  599. } else {
  600. uni.navigateTo({
  601. url: '/pages/create-order/index'
  602. });
  603. }
  604. } else {
  605. // 路由跳转:需要保留购物车页面(因为从购物车往后的步骤都可能回退),但注意更新购物车
  606. uni.navigateTo({
  607. url: '/pages/create-order/index'
  608. });
  609. }
  610. } else {
  611. uni.showToast({
  612. title: res.data.msg,
  613. icon: 'none'
  614. });
  615. }
  616. }
  617. });
  618. },
  619. // 活动加购商品
  620. onAdGoodsSpec(event) {
  621. let that = this;
  622. let cartGoods = that.cartGoods;
  623. let item = event.currentTarget.dataset.item;
  624. let currentAdGoodsSpec = null;
  625. if (item.add_good_rule_good_spec && item.add_good_rule_good_spec.length != 0) {
  626. for (let i in item.add_good_rule_good_spec) {
  627. if (i == 0) {
  628. item.add_good_rule_good_spec[i].is_checked = true; // 默认选中第一个
  629. currentAdGoodsSpec = item.add_good_rule_good_spec[i];
  630. } else {
  631. item.add_good_rule_good_spec[i].is_checked = false;
  632. }
  633. } // 跟购物车对比,拿数量
  634. for (let k in cartGoods) {
  635. if (
  636. currentAdGoodsSpec.good_id == cartGoods[k].good_id &&
  637. currentAdGoodsSpec.good_spec_id == cartGoods[k].good_specs_id &&
  638. currentAdGoodsSpec.add_good_rule_id == cartGoods[k].add_good_rule_id
  639. ) {
  640. currentAdGoodsSpec.nums = cartGoods[k].nums;
  641. break;
  642. }
  643. }
  644. }
  645. that.setData({
  646. showAdGoodsSpec: true,
  647. currentAdGoods: item,
  648. currentAdGoodsSpec: currentAdGoodsSpec
  649. }); // console.log('活动加购商品',that.data.currentAdGoods);
  650. },
  651. // 切换规格
  652. onChangeSpecGoods(event) {
  653. let that = this;
  654. console.log(event);
  655. let specs = event.currentTarget.dataset.specs;
  656. let currentAdGoods = that.currentAdGoods;
  657. let cartGoods = that.cartGoods;
  658. if (currentAdGoods.add_good_rule_good_spec && currentAdGoods.add_good_rule_good_spec.length != 0) {
  659. for (let i in currentAdGoods.add_good_rule_good_spec) {
  660. let item = currentAdGoods.add_good_rule_good_spec[i];
  661. if (item.good_spec_id == specs.good_spec_id) {
  662. item.is_checked = true;
  663. } else {
  664. item.is_checked = false;
  665. }
  666. } // 跟购物车对比,拿数量
  667. for (let k in cartGoods) {
  668. if (specs.good_id == cartGoods[k].good_id && specs.good_spec_id == cartGoods[k].good_specs_id && specs.add_good_rule_id == cartGoods[k].add_good_rule_id) {
  669. specs.nums = cartGoods[k].nums;
  670. break;
  671. }
  672. }
  673. }
  674. that.setData({
  675. currentAdGoods: currentAdGoods,
  676. currentAdGoodsSpec: specs
  677. });
  678. },
  679. // 关闭活动加购商品
  680. closeAdGoodsSpec() {
  681. let that = this;
  682. that.setData({
  683. showAdGoodsSpec: false
  684. });
  685. },
  686. // 点击活动加购商品(多规格)
  687. onChangeAdGoodsSpecNum(event, _dataset) {
  688. /* ---处理dataset begin--- */
  689. this.datasetHandle(event, _dataset);
  690. /* ---处理dataset end--- */
  691. let that = this;
  692. let nums = event.detail; // console.log('event',event);
  693. let item = event.currentTarget.dataset.item;
  694. let itemObj = {
  695. good_id: item.good_id,
  696. add_good_rule_id: item.add_good_rule_id,
  697. good_specs_id: item.good_spec_id
  698. }; // console.log('当前规格',itemObj);
  699. that.handleAdGoods(itemObj, nums);
  700. },
  701. // 点击活动加购商品(无规格)
  702. onChangeAdGoodsNum(event, _dataset) {
  703. /* ---处理dataset begin--- */
  704. this.datasetHandle(event, _dataset);
  705. /* ---处理dataset end--- */
  706. let that = this;
  707. let nums = event.detail;
  708. let item = event.currentTarget.dataset.item;
  709. let itemObj = {
  710. good_id: item.add_good_id,
  711. add_good_rule_id: item.id,
  712. good_specs_id: item.add_good_spec_id
  713. };
  714. that.handleAdGoods(itemObj, nums);
  715. },
  716. // 加购商品增删改查
  717. handleAdGoods(item, nums) {
  718. let that = this;
  719. let cartId = that.isAddCart(item);
  720. if (cartId) {
  721. console.log('在'); // 在购物车
  722. let params = {
  723. id: cartId // 购物车ID
  724. }; // 活动加购商品
  725. if (nums != 0) {
  726. params.nums = nums; // 修改数量
  727. myPro
  728. .wxRequest('user/v3/carts/editnum', 'POST', params)
  729. .then((res) => {
  730. that.closeAdGoodsSpec();
  731. that.getCartsList();
  732. })
  733. .catch((err) => {
  734. console.log('报错信息', err);
  735. uni.showToast({
  736. title: err,
  737. icon: 'none'
  738. });
  739. });
  740. } else {
  741. // 删除
  742. myPro
  743. .wxRequest('user/v3/carts/remove', 'POST', params)
  744. .then((res) => {
  745. that.closeAdGoodsSpec();
  746. that.getCartsList();
  747. })
  748. .catch((err) => {
  749. console.log('报错信息', err);
  750. uni.showToast({
  751. title: err,
  752. icon: 'none'
  753. });
  754. });
  755. }
  756. } else {
  757. console.log('不在');
  758. let params = {
  759. good_id: item.good_id,
  760. good_specs_id: item.good_specs_id,
  761. nums: nums,
  762. add_good_rule_id: item.add_good_rule_id,
  763. is_add: 1 // 是否为加购商品(1是 0否)
  764. }; // console.log('参数',params);
  765. // return;
  766. myPro
  767. .wxRequest('user/v3/carts/create', 'POST', params)
  768. .then((res) => {
  769. that.closeAdGoodsSpec();
  770. that.getCartsList();
  771. })
  772. .catch((err) => {
  773. console.log('报错信息', err);
  774. uni.showToast({
  775. title: err,
  776. icon: 'none'
  777. });
  778. });
  779. }
  780. },
  781. // 核实商品是否存在于购物车
  782. isAddCart(item) {
  783. let that = this;
  784. let oldCartGoods = that.cartGoods;
  785. let cartId = null; // console.log('item',item);
  786. // console.log('购物车',oldCartGoods);
  787. // 检测购物车是否有此商品
  788. for (let i in oldCartGoods) {
  789. if (item.good_id == oldCartGoods[i].good_id && oldCartGoods[i].add_good_rule_id && item.add_good_rule_id && item.good_specs_id == oldCartGoods[i].good_specs_id) {
  790. cartId = oldCartGoods[i].id;
  791. break;
  792. }
  793. }
  794. return cartId;
  795. }
  796. }
  797. };
  798. </script>
  799. <style>
  800. /**index.wxss**/
  801. .wrap {
  802. min-height: 100vh;
  803. background: #f6f6f6;
  804. overflow: auto;
  805. }
  806. .wrap.limited {
  807. height: 100vh;
  808. overflow: hidden;
  809. }
  810. .wrap_nr {
  811. padding-bottom: 30rpx;
  812. }
  813. /* 商品 */
  814. .shopcar_wrap {
  815. padding-top: 30rpx;
  816. }
  817. .shopcar {
  818. width: 690rpx;
  819. margin: 0 auto;
  820. background: #ffffff;
  821. }
  822. .shopcar .goods_list .goods_item .goods_tu {
  823. width: 120rpx;
  824. height: 120rpx;
  825. border-radius: 5rpx;
  826. }
  827. .shopcar .goods_list .goods_item .goods_info {
  828. display: flex;
  829. flex-direction: column;
  830. justify-content: space-between;
  831. }
  832. .goods_list .goods_del {
  833. height: 100%;
  834. width: 130rpx;
  835. display: flex;
  836. align-items: center;
  837. justify-content: center;
  838. color: #ffffff;
  839. background: #ef3838;
  840. }
  841. /* 会员价 */
  842. .goods_list .goods_item {
  843. margin-top: 20rpx;
  844. padding: 30rpx;
  845. }
  846. .goods_list .goods_item:first-child {
  847. margin-top: 0;
  848. }
  849. .goods_list .goods_item .goods_specs .price .vip {
  850. padding: 4rpx 10rpx;
  851. font-size: 20rpx;
  852. /* font-weight: bold; */
  853. background: #ffffff;
  854. border: 1px solid #f1a223;
  855. border-radius: 14px;
  856. display: flex;
  857. align-items: center;
  858. justify-content: center;
  859. color: #f1a223;
  860. }
  861. .guige .guige_b .guige_b_l .vip {
  862. padding-left: 8rpx;
  863. }
  864. /* 合计 */
  865. .heji_wrap {
  866. width: 100%;
  867. height: 100rpx;
  868. padding: 0 30rpx;
  869. position: fixed;
  870. bottom: 0;
  871. left: 0;
  872. background: #ffffff;
  873. display: flex;
  874. align-items: center;
  875. justify-content: space-between;
  876. z-index: 10;
  877. }
  878. .heji_wrap .heji_r {
  879. display: flex;
  880. align-items: center;
  881. }
  882. .heji_wrap .heji_btn {
  883. width: 200rpx;
  884. height: 80rpx;
  885. margin-left: 30rpx;
  886. border-radius: 40rpx;
  887. background: #ffd102;
  888. display: flex;
  889. align-items: center;
  890. justify-content: center;
  891. }
  892. /* 规格 */
  893. .guige_wrap {
  894. width: 670rpx;
  895. border-radius: 10rpx 10rpx 0 0;
  896. margin: 0 auto;
  897. position: fixed;
  898. top: 50%;
  899. left: 50%;
  900. transform: translate(-50%, -50%);
  901. z-index: 15;
  902. }
  903. .guige {
  904. width: 100%;
  905. padding-bottom: 38rpx;
  906. background: #ffffff;
  907. }
  908. .guige .goods_thumb_wrap {
  909. width: 100%;
  910. /* height: 370rpx; */
  911. position: relative;
  912. }
  913. .guige .goods_thumb_wrap .line {
  914. width: 100%;
  915. height: 30rpx;
  916. position: absolute;
  917. bottom: 0;
  918. left: 0;
  919. background-repeat: repeat-x;
  920. background-size: 18rpx 30rpx;
  921. }
  922. .guige .goods_thumb {
  923. width: 100%;
  924. height: auto;
  925. }
  926. .guige .goods_name {
  927. padding: 20rpx 30rpx 0;
  928. font-size: 30rpx;
  929. color: #080808;
  930. display: flex;
  931. align-items: center;
  932. justify-content: space-between;
  933. }
  934. .guige .goods_labels {
  935. padding: 0 30rpx;
  936. font-size: 24rpx;
  937. color: rgba(8, 8, 8, 0.54);
  938. display: flex;
  939. flex-wrap: wrap;
  940. }
  941. .guige .goods_labels .label {
  942. padding: 6rpx;
  943. background: #f6f6f6;
  944. margin: 10rpx 14rpx 0 0;
  945. }
  946. .guige .goods_desc {
  947. padding: 10rpx 30rpx 0;
  948. }
  949. .guige .goods_desc .goods_desc_name {
  950. font-size: 26rpx;
  951. color: rgba(51, 51, 51, 0.54);
  952. }
  953. .guige .goods_desc .goods_desc_nr {
  954. /* padding-top: 20rpx; */
  955. font-size: 24rpx;
  956. color: rgba(8, 8, 8, 0.54);
  957. }
  958. .guige .goods_guige {
  959. padding: 20rpx 30rpx 0;
  960. }
  961. .guige .goods_guige .goods_guige_name {
  962. font-size: 26rpx;
  963. color: rgba(51, 51, 51, 0.54);
  964. }
  965. .guige .goods_guige .goods_guige_nr {
  966. display: flex;
  967. flex-wrap: wrap;
  968. }
  969. .guige .guige_item {
  970. height: 59rpx;
  971. font-size: 24rpx;
  972. color: #333333;
  973. background: #ffffff;
  974. border: 1rpx solid rgba(0, 0, 0, 0.12);
  975. border-radius: 5rpx;
  976. display: flex;
  977. align-items: center;
  978. margin: 20rpx 20rpx 0 0;
  979. }
  980. .guige .guige_item:last-child {
  981. margin-right: 0;
  982. }
  983. .guige .guige_item .item_wenzi {
  984. display: flex;
  985. }
  986. .guige .guige_item .item_wenzi text {
  987. padding: 0 16rpx 0 12rpx;
  988. display: flex;
  989. align-items: center;
  990. }
  991. .guige .guige_item .item_wenzi text:not(:last-child)::after {
  992. content: '';
  993. display: block;
  994. width: 2rpx;
  995. height: 16rpx;
  996. background: rgba(0, 0, 0, 0.12);
  997. margin-left: 16rpx;
  998. }
  999. .guige .guige_item .price {
  1000. padding: 0 18rpx;
  1001. font-size: 28rpx;
  1002. border-left: 1rpx solid rgba(0, 0, 0, 0.12);
  1003. }
  1004. .guige .guige_item .price .unit {
  1005. font-size: 20rpx;
  1006. }
  1007. .guige .guige_item.selected {
  1008. background: #fffbf0;
  1009. border-color: #ed8c17;
  1010. color: #ed8c17;
  1011. }
  1012. .guige .guige_item.selected .price {
  1013. color: #ea4335;
  1014. border-left-color: #ed8c17;
  1015. }
  1016. .guige .guige_selected {
  1017. margin-top: 20rpx;
  1018. height: 60rpx;
  1019. background: #fafafa;
  1020. border: 1rpx solid rgba(0, 0, 0, 0.05);
  1021. border-left: 0 none;
  1022. border-right: 0 none;
  1023. padding: 0rpx 30rpx;
  1024. display: flex;
  1025. align-items: center;
  1026. font-size: 26rpx;
  1027. color: #000000;
  1028. }
  1029. .guige .guige_selected .label {
  1030. color: rgba(0, 0, 0, 0.54);
  1031. }
  1032. .guige .guige_b {
  1033. margin-top: 30rpx;
  1034. padding: 0 30rpx;
  1035. display: flex;
  1036. align-items: center;
  1037. justify-content: space-between;
  1038. }
  1039. .guige .guige_b .guige_b_l {
  1040. font-size: 26rpx;
  1041. color: #000000;
  1042. }
  1043. .guige .guige_b .price {
  1044. font-size: 38rpx;
  1045. color: #ea4335;
  1046. padding-left: 10rpx;
  1047. }
  1048. .guige .guige_b .price .unit {
  1049. font-size: 22rpx;
  1050. }
  1051. .guige .guige_b .item {
  1052. font-size: 24rpx;
  1053. color: rgba(0, 0, 0, 0.54);
  1054. }
  1055. .guige .guige_b .guige_b_r {
  1056. width: 350rpx;
  1057. height: 90rpx;
  1058. background: #d54c43;
  1059. border-radius: 45rpx;
  1060. font-size: 34rpx;
  1061. color: #ffffff;
  1062. display: flex;
  1063. align-items: center;
  1064. justify-content: center;
  1065. }
  1066. .guige_wrap .btn_close {
  1067. width: 100%;
  1068. }
  1069. .guige_wrap .btn_close .van-icon {
  1070. /* width: 56rpx;
  1071. height: 56rpx; */
  1072. display: block;
  1073. margin: 36rpx auto;
  1074. }
  1075. .guige_wrap .van-icon-cross {
  1076. position: absolute;
  1077. top: 30rpx;
  1078. right: 30rpx;
  1079. }
  1080. /* 无商品的提醒 */
  1081. .wrap_nr .tips {
  1082. position: absolute;
  1083. top: 40vh;
  1084. left: 0;
  1085. width: 100%;
  1086. text-align: center;
  1087. }
  1088. /* */
  1089. .goods_list .goods_item .goods_labels .label {
  1090. background: none;
  1091. font-size: 24rpx;
  1092. color: rgba(8, 8, 8, 0.54);
  1093. margin: 0;
  1094. }
  1095. .goods_list .goods_item .goods_specs .price {
  1096. display: flex;
  1097. align-items: center;
  1098. }
  1099. .goods_list .goods_item .goods_specs .price .vip {
  1100. margin-left: 20rpx;
  1101. }
  1102. /* */
  1103. .jiesuan_wrap {
  1104. padding: 30rpx 20rpx 36rpx;
  1105. font-size: 26rpx;
  1106. color: #000000;
  1107. border-top: 1rpx solid rgba(0, 0, 0, 0.12);
  1108. }
  1109. .jiesuan_wrap .jiesuan_t .price {
  1110. padding-left: 10rpx;
  1111. font-size: 34rpx;
  1112. font-weight: bold;
  1113. color: #d54c43;
  1114. }
  1115. .jiesuan_wrap .jiesuan_t .price .unit {
  1116. font-size: 24rpx;
  1117. }
  1118. .jiesuan_wrap .jiesuan_b {
  1119. display: flex;
  1120. justify-content: flex-end;
  1121. }
  1122. .jiesuan_wrap .jieusan_btn {
  1123. width: 197rpx;
  1124. height: 60rpx;
  1125. background: #295c56;
  1126. border-radius: 30rpx;
  1127. font-size: 28rpx;
  1128. color: #fffefe;
  1129. display: flex;
  1130. align-items: center;
  1131. justify-content: center;
  1132. }
  1133. /* 换购 */
  1134. .huangou_wrap {
  1135. width: 690rpx;
  1136. margin: 0 auto;
  1137. }
  1138. .huangou_wrap .title {
  1139. font-size: 30rpx;
  1140. color: #000000;
  1141. display: flex;
  1142. align-items: center;
  1143. margin-top: 28rpx;
  1144. }
  1145. .huangou_wrap .title::before {
  1146. content: '';
  1147. display: block;
  1148. width: 6rpx;
  1149. height: 28rpx;
  1150. background: #295c56;
  1151. margin-right: 10rpx;
  1152. }
  1153. .huangou_wrap .huangou_list {
  1154. display: flex;
  1155. flex-wrap: wrap;
  1156. }
  1157. .huangou_wrap .huangou_list .huangou_item {
  1158. width: 210rpx;
  1159. margin: 28rpx 28rpx 0 0;
  1160. }
  1161. .huangou_wrap .huangou_list .huangou_item:nth-of-type(3n) {
  1162. margin-right: 0;
  1163. }
  1164. .huangou_item .goods_tu {
  1165. width: 210rpx;
  1166. height: 210rpx;
  1167. border-radius: 5rpx 5rpx 0rpx 0rpx;
  1168. display: block;
  1169. }
  1170. .huangou_item .goods_info {
  1171. width: 100%;
  1172. background: #ffffff;
  1173. border-radius: 0 0 5rpx 5rpx;
  1174. padding: 10rpx;
  1175. }
  1176. .huangou_item .goods_info .goods_title {
  1177. font-size: 24rpx;
  1178. color: #080808;
  1179. }
  1180. .huangou_item .goods_info_b {
  1181. padding-top: 10rpx;
  1182. display: flex;
  1183. align-items: center;
  1184. justify-content: space-between;
  1185. }
  1186. .huangou_item .ac_price {
  1187. font-size: 30rpx;
  1188. color: #d54c43;
  1189. }
  1190. .huangou_item .ac_price .unit {
  1191. font-size: 20rpx;
  1192. }
  1193. .huangou_item .df_price {
  1194. font-size: 20rpx;
  1195. color: rgba(8, 8, 8, 0.54);
  1196. text-decoration: line-through;
  1197. }
  1198. .huangou_item .df_price .unit {
  1199. font-size: 14rpx;
  1200. }
  1201. .huangou_item .add_btn .van-icon {
  1202. color: #295c56;
  1203. font-size: 35rpx;
  1204. }
  1205. .huangou_item .setp_w {
  1206. display: flex;
  1207. justify-content: flex-end;
  1208. }
  1209. /* 商品列表 活动价*/
  1210. .goods_list .goods_item .goods_specs .price .df_price {
  1211. padding-left: 20rpx;
  1212. font-size: 20rpx;
  1213. color: rgba(8, 8, 8, 0.54);
  1214. text-decoration: line-through;
  1215. }
  1216. /* 规格按钮 */
  1217. .guige_btn {
  1218. width: 120rpx;
  1219. height: 45rpx;
  1220. background: #295c56;
  1221. border-radius: 23rpx;
  1222. font-size: 26rpx;
  1223. color: #ffffff;
  1224. display: flex;
  1225. align-items: center;
  1226. justify-content: center;
  1227. }
  1228. /* */
  1229. .wrap_nr .tips.addPos {
  1230. top: 5vh;
  1231. }
  1232. .huangou_wrap.addTipPos {
  1233. margin-top: 10vh;
  1234. }
  1235. /* 加购标志 */
  1236. .add_tag {
  1237. font-size: 24rpx;
  1238. color: #ffffff;
  1239. background: linear-gradient(90deg, #ff6637, #ff954e);
  1240. border-radius: 5rpx;
  1241. padding: 6rpx 8rpx;
  1242. margin-right: 12rpx;
  1243. }
  1244. </style>