122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import { defineStore } from 'pinia';
 | ||
| import CartApi from '@/sheep/api/trade/cart';
 | ||
| 
 | ||
| const cart = defineStore({
 | ||
|   id: 'cart',
 | ||
|   state: () => ({
 | ||
|     list: [], // 购物车列表(invalidList + validList)
 | ||
|     selectedIds: [], // 已选列表
 | ||
|     isAllSelected: false, // 是否全选
 | ||
|     totalPriceSelected: 0, // 选中项总金额
 | ||
|     newList: [], // 除去已下架的购物车列表(validList)
 | ||
|     editMode: false, // 是否是编辑模式
 | ||
|   }),
 | ||
|   actions: {
 | ||
|     // 获取购物车列表
 | ||
|     async getList() {
 | ||
|       const { data, code } = await CartApi.getCartList();
 | ||
|       if (code === 0) {
 | ||
|         this.list = [...data.validList, ...data.invalidList];
 | ||
|         this.newList = data.validList;
 | ||
| 
 | ||
|         // 计算各种关联属性
 | ||
|         this.selectedIds = [];
 | ||
|         this.isAllSelected = true;
 | ||
|         this.totalPriceSelected = 0;
 | ||
|         (this.editMode ? this.list : this.newList).forEach((item) => {
 | ||
|           if (item.selected) {
 | ||
|             this.selectedIds.push(item.id);
 | ||
|             this.totalPriceSelected += item.count * item.sku?.price;
 | ||
|           } else {
 | ||
|             this.isAllSelected = false;
 | ||
|           }
 | ||
|         });
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     onChangeEditMode(flag) {
 | ||
|       this.editMode = flag;
 | ||
|       this.selectedIds = [];
 | ||
|       this.getList();
 | ||
|     },
 | ||
| 
 | ||
|     // 添加购物车
 | ||
|     async add(goodsInfo) {
 | ||
|       // 添加购物项
 | ||
|       const { code } = await CartApi.addCart({
 | ||
|         skuId: goodsInfo.id,
 | ||
|         count: goodsInfo.goods_num,
 | ||
|       });
 | ||
|       // 刷新购物车列表
 | ||
|       if (code === 0) {
 | ||
|         await this.getList();
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 更新购物车
 | ||
|     async update(goodsInfo) {
 | ||
|       const { code } = await CartApi.updateCartCount({
 | ||
|         id: goodsInfo.goods_id,
 | ||
|         count: goodsInfo.goods_num,
 | ||
|       });
 | ||
|       if (code === 0) {
 | ||
|         await this.getList();
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 移除购物车
 | ||
|     async delete(ids) {
 | ||
|       let idsTemp = '';
 | ||
|       if (Array.isArray(ids)) {
 | ||
|         idsTemp = ids.join(',');
 | ||
|       } else {
 | ||
|         idsTemp = ids;
 | ||
|       }
 | ||
|       const { code } = await CartApi.deleteCart(idsTemp);
 | ||
|       if (code === 0) {
 | ||
|         await this.getList();
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 单选购物车商品
 | ||
|     async selectSingle(goodsId) {
 | ||
|       const { code } = await CartApi.updateCartSelected({
 | ||
|         ids: [goodsId],
 | ||
|         selected: !this.selectedIds.includes(goodsId), // 取反
 | ||
|       });
 | ||
|       if (code === 0) {
 | ||
|         await this.getList();
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 全选购物车商品
 | ||
|     async selectAll(flag) {
 | ||
|       const { code } = await CartApi.updateCartSelected({
 | ||
|         ids: this.list.map((item) => item.id),
 | ||
|         selected: flag,
 | ||
|       });
 | ||
|       if (code === 0) {
 | ||
|         await this.getList();
 | ||
|       }
 | ||
|     },
 | ||
| 
 | ||
|     // 清空购物车。注意,仅用于用户退出时,重置数据
 | ||
|     emptyList() {
 | ||
|       this.list = [];
 | ||
|       this.selectedIds = [];
 | ||
|       this.isAllSelected = true;
 | ||
|       this.totalPriceSelected = 0;
 | ||
|     },
 | ||
|   },
 | ||
|   persist: {
 | ||
|     enabled: true,
 | ||
|     strategies: [
 | ||
|       {
 | ||
|         key: 'cart-store',
 | ||
|       },
 | ||
|     ],
 | ||
|   },
 | ||
| });
 | ||
| 
 | ||
| export default cart;
 |