food_wechat/store/index.js
sszdot a1feb8bb4b 【类 型】:feat
【原  因】:
【过  程】:从接口拿订单数据 同时进行 ‘订单快照’ 字段的 序列化 并且把sku spu的图片路径 补全 ps:完整的访问路径
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
2024-12-18 12:14:30 +08:00

369 lines
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Vue from 'vue'
import Vuex from 'vuex'
//把vuex作为插件引入到Vue示例中 ps:注册
Vue.use(Vuex)
//引用全局设定
import settings from '@/settings.js'
const {
host,
baseURL,
listPath,
spuPath,
skuPath,
sitePath,
logoPath
} = settings
const store = new Vuex.Store({
//全局状态
state: {
shop_id: null, //商铺id
site_id: null, //当前站点id
userInfo: {
name: null,
photo: null,
sex: '0',
tel: null,
token: null,
topic_prefix: null
}, //用户信息
orderList: [], //订单列表
siteList: [], //站点列表
menuList: [], //分类列表
spuList: [], //spu列表
skuList: [], //sku列表
shopCon: {}, //商铺信息
cartList: [], //购物车列表 结构:[{"spu_id":"id","skuG":[sku_id,sku_id],"conutG":[数量,数量],"priceG":[单价,单价]},{.....}]
tabbarCurrent: 0, //tabbar的当前激活项
cartShow: false, //列表页 购物车折叠显隐
mqttState: false, //标记mqtt服务器是否已经连接成功
},
//修改状态
mutations: {
//设置 二维码获取商铺id
setShopId(state, shop_id) {
state.shop_id = shop_id;
},
//设置 二维码获取站点id
setSiteId(state, site_id) {
state.site_id = site_id;
},
//设置 列表页 购物车折叠显隐
setCartShow(state, val) {
Vue.set(state, 'cartShow', val)
},
//设置 标记用户登录状态
setMqttState(state, val) {
Vue.set(state, 'mqttState', val)
},
//设置tabbar当前激活像
setTabbarCurrent(state, val) {
Vue.set(state, 'tabbarCurrent', val)
},
//把用户信息 从本地缓存 提取到内存当中
setUserInfo(state, obj) {
Vue.set(state.userInfo, 'name', obj.name)
Vue.set(state.userInfo, 'photo', obj.photo)
Vue.set(state.userInfo, 'sex', obj.sex)
Vue.set(state.userInfo, 'tel', obj.tel)
Vue.set(state.userInfo, 'token', obj.token)
Vue.set(state.userInfo, 'topic_prefix', obj.topic_prefix)
},
//清除用户信息
clearUserInfo(state) {
Vue.set(state.userInfo, 'name', null)
Vue.set(state.userInfo, 'photo', null)
Vue.set(state.userInfo, 'sex', '0')
Vue.set(state.userInfo, 'tel', null)
Vue.set(state.userInfo, 'token', null)
Vue.set(state.userInfo, 'topic_prefix', null)
},
//设置订单列表
setOrderList(state, list) {
state.orderList = list
},
//设置站点列表
setSiteList(state, list) {
state.siteList = list
},
//设置分类列表
setMenuList(state, list) {
state.menuList = list
},
//设置spu列表
setSpuList(state, list) {
state.spuList = list
},
//设置sku列表
setSkuList(state, list) {
state.skuList = list
},
//设置商铺信息
setShopCon(state, obj) {
state.shopCon = obj
},
//清空购物车
clearCartList(state) {
Vue.set(state, 'cartList', [])
},
// 设置购物车列表
setCartList(state, obj) {
let isExisting = false
state.cartList.forEach(item => {
// 判断是否存在相同的skuG组合
if (JSON.stringify(item.skuG) === JSON.stringify(obj.skuG)) {
// 如果存在相同的skuG组合则将现有商品的数量加1
for (let i = 0; i < item.countG.length; i++) {
// 使用 Vue.set 或 this.$set 来确保 Vue 能够响应这个变化
Vue.set(item.countG, i, item.countG[i] + 1)
}
isExisting = true
}
})
// 如果购物车中不存在相同的skuG组合则将新商品添加到购物车列表中
if (!isExisting) {
state.cartList.push(obj)
}
},
//给spu添加最低价格字段
addMinPriceToSpuList(state) {
state.spuList.forEach((spuItem, index) => {
let totalPrice = 0
spuItem.bind_sku.forEach(skuGroup => {
let minPrice = 0
let sku
skuGroup.value.forEach(skuId => {
sku = state.skuList.find(sku => skuId == sku
.id)
if (Number(minPrice) === 0 || Number(minPrice) > Number(sku
.price)) {
minPrice = Number(sku.price)
}
})
totalPrice += Number(minPrice)
})
// 添加新的字段 js不能用this.$set(注意)
Vue.set(spuItem, 'minPrice', parseFloat(totalPrice.toFixed(2)))
})
},
//给spu.bind_sku.skuG 字段添加解构数据 ps:此函数在加载完skuList后执行
addSkuGToSpuList(state) {
state.spuList.forEach(spuItem => {
spuItem.bind_sku.forEach(item => {
const skuG = item.value.map(id => state.skuList.find(sku => Number(sku
.id) === Number(id)))
Vue.set(item, 'skuG', skuG)
})
})
}
},
//异步请求
actions: {
//获取订单列表
async fetchOrderList({
state,
commit
}) {
try {
// 请求订单列表
const res = await uni.$u.http.get('/Api/Check/getOrderList', {
header: {
'Token': state.userInfo.token
}
})
if (res.data.status === 1) {
// 对订单列表处理
const orderList = res.data.orderList.map(item => {
let tempPS
try {
// 解析 product_snapshot 字段
tempPS = JSON.parse(item.product_snapshot)
} catch (error) {
console.error(`product_snapshot 解析失败: ${error.message}`)
tempPS = []
}
// 遍历 product_snapshot 数组
tempPS = tempPS.map(spu => {
// 给 spu_photo 添加完整路径
spu.spu_photo = spu.spu_photo.map(photo => spuPath + photo)
// 遍历 sku_arr给 sku_photo 添加完整路径
spu.sku_arr = spu.sku_arr.map(sku => {
sku.sku_photo = sku.sku_photo.map(photo => skuPath +
photo)
return sku
})
return spu
})
return {
...item,
product_snapshot: tempPS
}
})
// 提交更新到 Vuex 的状态
commit('setOrderList', orderList)
} else {
commit('setOrderList', [])
}
} catch (error) {
console.error(`获取订单列表失败: ${error.message}`)
commit('setOrderList', [])
}
},
//获取站点列表
async fetchSiteList({
state,
commit
}) {
await uni.$u.http.get('/Api/Normal/getSiteList', {
params: {
shop_id: state.shop_id
}
}).then(res => {
if (res.data.status === 1) {
// 反序列化处理 字段
res.data.siteList.forEach(site => {
site.photo = JSON.parse(site.photo)
site.photo.forEach((p, index) => {
site.photo[index] = sitePath + p
})
})
//更新数据
commit('setSiteList', res.data.siteList)
} else {
commit('setSiteList', [])
}
})
},
//获取分类列表
async fetchMenuList({
state,
commit
}) {
await uni.$u.http.get('/Api/Normal/getCategoryList', {
params: {
shop_id: state.shop_id
}
}).then(res => {
if (res.data.status === 1) {
// 反序列化处理 字段
res.data.categoryList.forEach(category => {
category.photo = JSON.parse(category.photo)
category.photo.forEach((p, index) => {
category.photo[index] = listPath + p
})
})
//更新数据
commit('setMenuList', res.data.categoryList)
} else {
commit('setMenuList', [])
}
})
},
// 获取spu列表
fetchSpuList({
state,
commit
}) {
return new Promise((resolve, reject) => {
uni.$u.http.get('/Api/Normal/getSpuList', {
params: {
shop_id: state.shop_id
}
}).then(res => {
if (res.data.status === 1) {
// 反序列化处理 字段
res.data.spuList.forEach(spu => {
spu.photo = JSON.parse(spu.photo)
spu.photo.forEach((p, index) => {
spu.photo[index] = spuPath + p
})
spu.bind_sku = JSON.parse(spu.bind_sku)
spu.bind_sku.forEach(bs => {
Vue.set(bs, 'skuG',
[]
) //添加对应sku组 字段 临时先加一个空数组 在另外的方法等skuList异步加载完成在 添加 结构这个字段
})
Vue.set(spu, 'bind_sku', spu.bind_sku)
Vue.set(spu, 'pro_tag', JSON.parse(spu.pro_tag))
})
//更新数据
commit('setSpuList', res.data.spuList)
resolve() // 请求成功后 resolve
} else {
commit('setSpuList', [])
reject() // 请求失败时 reject
}
}).catch(error => {
reject(error) // 请求出错时 reject
})
})
},
// 获取sku列表
fetchSkuList({
state,
commit
}) {
return new Promise((resolve, reject) => {
uni.$u.http.get('/Api/Normal/getSkuList', {
params: {
shop_id: state.shop_id
}
}).then(res => {
if (res.data.status === 1) {
// 反序列化处理 字段
res.data.skuList.forEach(sku => {
sku.photo = JSON.parse(sku.photo)
sku.photo.forEach((p, index) => {
sku.photo[index] = skuPath + p
})
})
//更新数据
commit('setSkuList', res.data.skuList)
resolve() // 请求成功后 resolve
} else {
commit('setSkuList', [])
reject() // 请求失败时 reject
}
}).catch(error => {
reject(error) // 请求出错时 reject
})
})
},
//获取商品信息
async fetchShopCon({
state,
commit
}) {
await uni.$u.http.get('/Api/Normal/getShopCon', {
params: {
shop_id: state.shop_id
}
}).then(res => {
if (res.data.status === 1) {
// 反序列化处理 字段
res.data.shopCon.logo = JSON.parse(res.data.shopCon.logo)
res.data.shopCon.logo.forEach((p, index) => {
res.data.shopCon.logo[index] = logoPath + p
})
//更新数据
commit('setShopCon', res.data.shopCon)
} else {
commit('setShopCon', {})
}
})
},
}
})
export default store