shop.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <template>
  2. <view class="shop-cart">
  3. <van-cell :title="defaultAddr === '' ? '默认收货地址' : defaultAddr" is-link link-type="navigateTo"
  4. url="/pages/address/address" />
  5. <view style="height: 25rpx;"></view>
  6. <view class="cards-list">
  7. <view v-for="(item,index) in shopCartInfo" :key="index">
  8. <van-row v-for="(items,index1) in item.shopCartItemDiscounts[0].shopCartItems" :key="items.basketId">
  9. <van-col span="2">
  10. <van-checkbox @click.native="basketClick" @change="onChange" :data-param1="items.basketId"
  11. :value="items.isCheck"></van-checkbox>
  12. </van-col>
  13. <van-col span="22">
  14. <text class="shop-name">{{ item.shopName }}</text>
  15. <van-card :num="items.prodCount" :price="items.price" :desc="items.skuName"
  16. :title="items.prodName" :thumb="items.pic">
  17. <template #footer>
  18. <van-stepper :value="items.prodCount" :data-param1="items" async-change
  19. @change="changeThing" integer />
  20. </template>
  21. </van-card>
  22. </van-col>
  23. </van-row>
  24. <van-divider />
  25. </view>
  26. <van-empty v-if="shopCartInfo <= 0" />
  27. <van-submit-bar :price="totalMoney" button-text="提交订单" @submit="onSubmit">
  28. <van-checkbox :value="checkedAll" @change="allProdSelected">全选</van-checkbox>
  29. <a class="clear-cart" v-if="basketIds.length > 0" @click="clearCart">清空</a>
  30. </van-submit-bar>
  31. </view>
  32. </view>
  33. </template>
  34. <script>
  35. import {
  36. shopCartInfo,
  37. totalPay,
  38. changeItem,
  39. deleteItem
  40. } from '@/api/shop.js'
  41. import {
  42. addressList
  43. } from '@/api/address.js'
  44. export default {
  45. data() {
  46. return {
  47. checkedAll: false,
  48. // isCheck: false,
  49. shopCartInfo: [],
  50. value: 0,
  51. basketIds: [],
  52. totalMoney: 0,
  53. addresslist: [],
  54. defaultAddr: "",
  55. defaultAddrId: 0,
  56. changeItemList: {
  57. basketId: 0,
  58. prodId: 0,
  59. skuId: 0,
  60. shopId: 0,
  61. count: 0,
  62. distributionCardNo: ""
  63. },
  64. confirm: {
  65. basketIds: [],
  66. orderItem: {
  67. prodId: 0,
  68. skuId: 0,
  69. prodCount: 1,
  70. shopId: 0,
  71. distributionCardNo: ""
  72. },
  73. addrId: 0,
  74. userChangeCoupon: 0,
  75. couponIds: []
  76. },
  77. result: ['a', 'b'],
  78. }
  79. },
  80. async onShow() {
  81. this.init();
  82. },
  83. methods: {
  84. onChange(event) {
  85. let shop = this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems;
  86. setTimeout(() => {
  87. if (this.basketIds.length == shop.length) {
  88. this.checkedAll = true;
  89. } else {
  90. this.checkedAll = false;
  91. }
  92. }, 100)
  93. shop.forEach((obj) => {
  94. if (obj.basketId === event.currentTarget.dataset.param1) {
  95. obj.isCheck = event.detail;
  96. // this.basketIds.push
  97. }
  98. })
  99. },
  100. onSubmit() {
  101. if (this.basketIds.length <= 0) return;
  102. this.confirm.basketIds = this.basketIds
  103. this.confirm.addrId = this.defaultAddrId
  104. uni.setStorageSync("confirm", JSON.stringify(this.confirm))
  105. uni.navigateTo({
  106. url: "/pages/order/order"
  107. })
  108. },
  109. changeThing(event) {
  110. let value = event.detail;
  111. let items = event.currentTarget.dataset.param1;
  112. this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems.forEach((obj) => {
  113. if (obj.basketId === items.basketId) {
  114. obj.prodCount = value;
  115. }
  116. })
  117. if (items.prodCount === value) {
  118. return;
  119. }
  120. let count = 1;
  121. if (items.prodCount > value) {
  122. count = -1;
  123. }
  124. this.onStepperChange(items, count, () => {
  125. items.prodCount = value
  126. setTimeout(() => {
  127. if (this.basketIds.includes(items.basketId)) {
  128. totalPay(this.basketIds).then(res => {
  129. this.totalMoney = res.finalMoney * 100
  130. })
  131. }
  132. }, 200)
  133. })
  134. },
  135. async init() {
  136. shopCartInfo({}).then(res => {
  137. this.shopCartInfo = res;
  138. this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems.map((obj) => {
  139. obj.isCheck = false;
  140. return obj;
  141. })
  142. this.basketClick();
  143. })
  144. this.addresslist = await addressList()
  145. for (const key in this.addresslist) {
  146. if (Object.hasOwnProperty.call(this.addresslist, key)) {
  147. if (this.addresslist[key].commonAddr === 1) {
  148. const result = this.addresslist[key]
  149. this.defaultAddrId = this.addresslist[key].addrId
  150. this.defaultAddr = result.province + " " + result.city + " " +
  151. result.area + " " + result.addr
  152. }
  153. }
  154. }
  155. },
  156. async basketClick(event) {
  157. if (event) {
  158. let param = event.currentTarget.dataset.param1 || event.basketIds;
  159. this.basketIds.push(param)
  160. this.basketIds = this.removeDuplicates(this.basketIds);
  161. } else {
  162. this.basketIds = []
  163. }
  164. const result = await totalPay(this.basketIds);
  165. this.totalMoney = result.finalMoney * 100;
  166. },
  167. removeDuplicates(arr) {
  168. for (let i = 0; i < arr.length; i++) {
  169. for (let j = i + 1; j < arr.length; j++) {
  170. if (arr[i] === arr[j]) {
  171. arr.splice(j, 1); // 删除相同的元素
  172. arr.splice(i, 1);
  173. i--; // 更新索引,以便继续比较下一个元素
  174. break;
  175. }
  176. }
  177. }
  178. return arr;
  179. },
  180. allProdSelected(event) {
  181. console.log(this.basketIds, '全选')
  182. this.checkedAll = event.detail;
  183. let shop = this.shopCartInfo[0].shopCartItemDiscounts[0].shopCartItems;
  184. if (this.checkedAll == true) {
  185. shop.forEach((obj) => {
  186. obj.isCheck = true;
  187. this.basketIds.push(obj.basketId);
  188. })
  189. this.total(this.basketIds);
  190. } else {
  191. shop.forEach((obj) => {
  192. obj.isCheck = false;
  193. })
  194. this.basketIds = [];
  195. this.total(this.basketIds);
  196. }
  197. },
  198. async total(event) {
  199. setTimeout(()=>{
  200. totalPay(event).then(res => {
  201. this.totalMoney = res.finalMoney * 100;
  202. })
  203. },100)
  204. },
  205. clearCart() {
  206. deleteItem(this.basketIds).then(r => {
  207. this.init();
  208. })
  209. },
  210. onStepperChange(items, value, callback) {
  211. this.changeItemList.basketId = items.basketId;
  212. this.changeItemList.prodId = items.prodId;
  213. this.changeItemList.skuId = items.skuId;
  214. this.changeItemList.shopId = items.shopId;
  215. this.changeItemList.count = value;
  216. this.changeItemList.distributionCardNo = "";
  217. changeItem(this.changeItemList).then(res => {
  218. console.log(res, 'eee')
  219. })
  220. callback();
  221. },
  222. }
  223. }
  224. </script>
  225. <style lang='less'>
  226. .shop-cart {
  227. background-color: #fafafa;
  228. height: 100%;
  229. .clear-cart {
  230. margin-left: 1rem;
  231. color: #333;
  232. }
  233. .van-submit-bar {
  234. position: fixed;
  235. bottom: 0;
  236. left: 0;
  237. }
  238. .cards-list {
  239. padding-right: 0.5rem;
  240. padding-left: 0.5rem;
  241. background-color: #fff;
  242. padding-bottom: 100rpx;
  243. .van-row {
  244. .van-col--2 {
  245. margin-top: 6rem;
  246. }
  247. .van-col {
  248. .shop-name {
  249. display: inline-block;
  250. height: 2.5rem;
  251. text-align: left;
  252. width: 100%;
  253. margin-top: 1rem;
  254. font-weight: 600;
  255. }
  256. .van-card {
  257. background-color: #fff;
  258. }
  259. }
  260. }
  261. }
  262. }
  263. </style>