cart.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <template>
  2. <view style="height: 100vh;background-color: #F5F5F5;">
  3. <van-skeleton :loading="loading">
  4. <view class="titleright" @click="changeShop" v-if="isdelete">编辑</view>
  5. <view class="titleright" @click="changeShop" v-else>取消</view>
  6. <view v-if="list.length>0" style="margin-bottom: 150upx;">
  7. <scroll-view style="height: 88vh;" class="floor-list"
  8. :scroll-top="scrollTop" scroll-y="true" @scroll="scroll" @scrolltoupper="upper" @scrolltolower="lower"
  9. :refresher-enabled="false">
  10. <view class="cart-list">
  11. <view style="display: flex;align-items: center;padding: 20upx 36upx;
  12. border-bottom: 1px solid #F5F5F5;">
  13. <image :src="pictureUrl+'/uploads/home/store/'+store.store_id+'/'+store.store_banner" style="border-radius: 50%;
  14. width: 50upx;height: 50upx;"></image>
  15. <span style="padding-left: 8upx;">{{store.store_name}}</span>
  16. </view>
  17. <view v-for="(item,index) in list" :key="index" class="shoplist" style="background-color: #fff;">
  18. <view style="flex: 1;border-radius: 100%;">
  19. <van-checkbox-group :value="checkboxList" @change="checkboxChange()">
  20. <van-checkbox checked-color="#D9332E" :name="index"></van-checkbox>
  21. </van-checkbox-group>
  22. </view>
  23. <view style="flex: 15;">
  24. <van-card
  25. title-class="changewidth"
  26. price-class ="priceClass"
  27. :price="item.goods_price"
  28. :desc="item.descire+'X'+item.goods_num"
  29. :title="item.desarray"
  30. :thumb="pictureUrl + '/uploads/home/store/goods/' + item.goods_image.substr(0, item.goods_image.indexOf('\_')) + '/' + item.goods_image"
  31. >
  32. <view slot="footer">
  33. <!-- <uninumberbox :min="1":isMax="item.number>=item.stock?true:false"
  34. :isMin="item.number===1":max="item.stock" :value="item.goods_num" @change="bindChange(item)"/> -->
  35. <uninumberbox
  36. class="step"
  37. :min="1"
  38. :value="item.goods_num"
  39. :index="index"
  40. @eventChange="bindChange"
  41. ></uninumberbox>
  42. </view>
  43. </van-card>
  44. </view>
  45. </view>
  46. </view>
  47. </scroll-view>
  48. </view>
  49. <view v-else>
  50. <view style="margin: 120upx auto;text-align: center;">
  51. <van-icon size="160rpx" color="#909399" name="cart-o" />
  52. <view @click="gostore" style="text-align: center;
  53. color: #909399;border: 1px solid #909399; padding: 5upx 10upx;
  54. margin: 10upx auto;width: 150rpx;">
  55. 去逛逛
  56. </view>
  57. </view>
  58. </view>
  59. <view style="position: fixed;bottom: 0;border-top:1px solid #eee;height: 8vh;">
  60. <!-- :price-class="isdelete? '':'isdiaplay' " -->
  61. <van-submit-bar
  62. v-if="isdelete"
  63. :price="prices"
  64. :button-text="listip"
  65. @submit="onClickButton"
  66. :tip="true"
  67. >
  68. <van-checkbox checked-color="#D9332E" :value="isAll" shape="round" @change="onChange">
  69. 全选
  70. </van-checkbox>
  71. </van-submit-bar>
  72. <van-submit-bar
  73. bar-class="betweenclass"
  74. v-if="!isdelete"
  75. :button-text="listip"
  76. @submit="onClickButton"
  77. :tip="true"
  78. >
  79. <van-checkbox checked-color="#D9332E" :value="isAll" shape="round" @change="onChange">
  80. 全选
  81. </van-checkbox>
  82. </van-submit-bar>
  83. </view>
  84. </van-skeleton>
  85. </view>
  86. </template>
  87. <script>
  88. import uniNavBar from '@/component/uni-nav-bar/uni-nav-bar.vue'
  89. import uninumberbox from '@/component/uinNumberCart.vue'
  90. export default {
  91. components: {
  92. uniNavBar,
  93. uninumberbox
  94. },
  95. data() {
  96. return {
  97. firstloading: 0,
  98. loading: true,
  99. ismax: 0,
  100. lengthnumber: 0,
  101. pricelist:[],
  102. pictureUrl: this.pictureUrl,
  103. scrollTop: 0,
  104. old: {
  105. scrollTop: 0
  106. },
  107. nums: 0,
  108. store: {},
  109. ispull: true,
  110. page: 1,
  111. store_id: 0,
  112. prices: 0,
  113. listip: '',
  114. isdelete: true,
  115. isAll: false,
  116. checkboxList:[],
  117. list:[],
  118. }
  119. },
  120. // 隐藏分享菜单
  121. onLoad: function (options) {
  122. this.store_id = options.store_id;
  123. this.listip = "结算" + '(' + this.nums + ')';
  124. this.getshoplist();
  125. },
  126. methods: {
  127. // 返回酒店
  128. gostore() {
  129. uni.navigateBack();
  130. },
  131. onClickButton(e) {
  132. let array = [];
  133. if(this.pricelist.length == 0) {
  134. if(this.isdelete) {
  135. this.$msg('请选择商品');
  136. }else {
  137. this.$msg('请选择删除商品');
  138. }
  139. return;
  140. }
  141. this.pricelist.forEach(item => {
  142. array.push(item.goods_id)
  143. })
  144. let ids = array.toString();
  145. if(this.isdelete) {
  146. // 结算
  147. this.getorderId(); // 保存订单生成订单id 购买
  148. }else {
  149. this.deleteshop(ids);
  150. }
  151. },
  152. // 保存订单生成订单id
  153. getorderId() {
  154. let goods = [];
  155. let prices = this.prices;
  156. this.pricelist.forEach((item,index) => {
  157. goods.push({});
  158. goods[index].goods_id = item.goods_id;
  159. goods[index].buy_num = item.goods_num;
  160. })
  161. this.request({
  162. url:'/v1/order/save_og',
  163. method: 'post',
  164. data: {
  165. store_id: this.store.store_id,
  166. goods: JSON.stringify(goods)
  167. },
  168. success:(res) => {
  169. if(res.data.code == 1000) {
  170. let order_id = res.data.data.order_id;
  171. let store = this.store.store_id;
  172. uni.navigateTo({
  173. url: `/pages/index/sureBuy?store=${store}&prices=${prices}&order_id=${order_id}`
  174. });
  175. }
  176. }
  177. })
  178. },
  179. // 购物车删除
  180. deleteshop(ids) {
  181. this.request({
  182. url: '/v2/order/cart_drop',
  183. method: 'post',
  184. data: {
  185. ids: ids,
  186. store_id: this.store_id
  187. },
  188. success: () => {
  189. this.nums = 0;
  190. this.listip = "删除" + '(' + this.nums + ')';
  191. this.list = [];
  192. this.checkboxList = [];
  193. this.getshoplist();
  194. }
  195. })
  196. },
  197. // 滚动到顶部
  198. upper(e) {
  199. console.log("顶部")
  200. },
  201. // 滚到底部
  202. lower(e) {
  203. // this.page = this.page + 1;
  204. // if(this.ispull) {
  205. // this.getshoplist();
  206. // }
  207. },
  208. // 滚动时触发
  209. scroll(e) {
  210. this.old.scrollTop = e.detail.scrollTop
  211. },
  212. changeShop() {
  213. this.isdelete = !this.isdelete;
  214. this.listip = this.isdelete ? "结算" + '(' + this.nums + ')' :'删除'+ '(' + this.nums + ')';
  215. },
  216. getshoplist() {
  217. this.loading = true;
  218. this.request({
  219. url: '/v2/order/cart',
  220. method: 'post',
  221. data: {
  222. store_id: this.store_id,
  223. page: this.page
  224. },
  225. success: (res) => {
  226. let { data } = res.data;
  227. data.cart_list.forEach(item => {
  228. let arr = item.goods_name.split(' ');
  229. item.desarray = arr[0];
  230. item.descire = item.goods_name.replace(arr[0], '');
  231. })
  232. if(data.cart_list.length < 10) {
  233. this.ispull = false;
  234. }
  235. this.list = this.list.concat(data.cart_list);
  236. this.store = data.store;
  237. if(this.firstloading == 0) {
  238. this.loading = false;
  239. }
  240. this.firstloading = 1;
  241. }
  242. })
  243. },
  244. // 返回上层
  245. goback() {
  246. uni.navigateBack();
  247. },
  248. // 数量累加
  249. bindChange(e) {
  250. this.list[e.index].goods_num = e.number;
  251. this.checkoutprice();
  252. },
  253. // 单选
  254. checkboxChange(e) {
  255. this.checkboxList = []
  256. e.detail.forEach((item, idx) => {
  257. this.$set(this.checkboxList, idx, item)
  258. })
  259. let array = this.list;
  260. let price = [];
  261. this.checkboxList.forEach(item => {
  262. price.push(array[item])
  263. })
  264. this.pricelist = price;
  265. let num = 0;
  266. this.pricelist.forEach(item => {
  267. num += item.goods_num;
  268. })
  269. console.log(num);
  270. this.nums = num;
  271. this.lengthnumber = this.pricelist.length;
  272. this.listip = this.isdelete ? "结算" + '(' + this.nums + ')' :'删除'+ '(' + this.nums + ')';
  273. this.checkoutprice();
  274. },
  275. // 计算价格
  276. checkoutprice() {
  277. let total = 0;
  278. let num = 0
  279. this.pricelist.forEach(item => {
  280. total += item.goods_price * item.goods_num;
  281. num += item.goods_num;
  282. })
  283. this.nums = num;
  284. this.prices = Number(total.toFixed(2))*100;
  285. this.listip = this.isdelete ? "结算" + '(' + this.nums + ')' :'删除'+ '(' + this.nums + ')';
  286. },
  287. // 全选
  288. onChange(a) {
  289. this.isAll = !this.isAll;
  290. let items = this.list;
  291. if(this.isAll) {
  292. items.forEach((item, idx) => {
  293. this.$set(this.checkboxList, idx, idx.toString())
  294. })
  295. this.pricelist = this.list;
  296. let num = 0
  297. this.pricelist.forEach(item => {
  298. num += item.goods_num;
  299. })
  300. this.nums = num;
  301. this.listip = this.isdelete ? "结算" + '(' + this.nums + ')' :'删除'+ '(' + this.nums + ')';
  302. this.checkoutprice();
  303. }else {
  304. for (let i = 0, lenI = items.length; i < lenI; ++i) {
  305. this.checkboxList = [];
  306. this.pricelist = [];
  307. this.nums = 0;
  308. this.listip = this.isdelete ? "结算" + '(' + this.nums + ')' :'删除'+ '(' + this.nums + ')';
  309. this.checkoutprice();
  310. }
  311. }
  312. }
  313. }
  314. }
  315. </script>
  316. <style>
  317. .betweenclass {
  318. display: flex;
  319. justify-content: space-between!important;
  320. }
  321. .uniNavBar {
  322. height: 100%;
  323. }
  324. .cart-list {
  325. background-color: #fff;
  326. /* padding: 0 36upx; */
  327. }
  328. .titleright {
  329. text-align: right;
  330. padding: 10upx 30upx;
  331. background: #fff;
  332. border-bottom: 1px solid #eee;
  333. height: 4vh;
  334. }
  335. .changewidth {
  336. color: #303133;
  337. font-size: 32upx;
  338. font-weight: 100!important;
  339. width: 70%;
  340. white-space: nowrap;
  341. overflow: hidden;
  342. text-overflow: ellipsis;
  343. }
  344. .van-card {
  345. background-color: #fff!important;
  346. }
  347. .shoplist {
  348. display: flex;
  349. padding: 0 35upx;
  350. justify-content: space-between;
  351. align-items: center;
  352. padding-bottom: 25upx;
  353. }
  354. .checklabel {
  355. transform:scale(0.7);
  356. border-radius: 100%;
  357. }
  358. .checkboxteil {
  359. transform:scale(0.7);
  360. border-radius: 100%;
  361. }
  362. .uni-numbox {
  363. position: static!important;
  364. float: right;
  365. }
  366. .isdiaplay .van-submit-bar__text {
  367. visibility: hidden;
  368. }
  369. .isdiaplay {
  370. visibility: hidden;
  371. }
  372. </style>