user.js
5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
import { defineStore } from 'pinia';
import { ref, toRefs } from 'vue';
import $share from '@/sheep/platform/share';
import { clone, cloneDeep } from 'lodash-es';
import cart from './cart';
import app from './app';
import { showAuthModal } from '@/sheep/hooks/useModal';
import UserApi from '@/sheep/api/member/user';
import PayWalletApi from '@/sheep/api/pay/wallet';
import OrderApi from '@/sheep/api/trade/order';
import CouponApi from '@/sheep/api/promotion/coupon';
// 默认用户信息
const defaultUserInfo = {
avatar: '', // 头像
nickname: '', // 昵称
isAllowUpdSex: 0, // 是否允许更新性别
sex: 0, // 性别
province: '', // 省份
city: '', // 城市
region: '', // 区县
mobile: '', // 手机号
signature: '', // 签名
createTime: 0, // 创建时间
};
// 默认钱包信息
const defaultUserWallet = {
balance: 0, // 余额
};
// 默认订单、优惠券等其他资产信息
const defaultNumData = {
unusedCouponCount: 0,
orderCount: {
allCount: 0,
unpaidCount: 0,
undeliveredCount: 0,
deliveredCount: 0,
uncommentedCount: 0,
afterSaleCount: 0,
},
};
// 初始化用户
const defaultInitUser = {
isNewbie: '', //是否新用户
storeId: '', //当前选中的门店
cityId: '', //当前选中的城市
};
// 组合式 API 写法:参数为函数,返回 { 状态, 方法 }
const useUserStore = defineStore(
'user',
() => {
// 1. 定义状态(替代原 state 选项)
// 基础类型用 ref,复杂对象用 reactive(也可全用 ref)
const userInfo = ref(clone(defaultUserInfo));
const userWallet = ref(clone(defaultUserWallet));
const isLogin = ref(!!uni.getStorageSync('token'));
const numData = ref(cloneDeep(defaultNumData));
const lastUpdateTime = ref(0);
const initUser = ref(clone(defaultInitUser));
// 2. 定义 actions(直接写普通函数,替代原 actions 选项)
// 获取用户信息
const getInfo = async () => {
const { code, data } = await UserApi.getUserBasicInfo();
if (code !== 0) {
return;
}
userInfo.value = data; // ref 类型需通过 .value 赋值
return Promise.resolve(data);
};
// 获取初始化用户信息
const getInitUser = async () => {
const { code, data } = await UserApi.getUserInitInfo();
if (code !== 0) {
return;
}
initUser.value = data; // ref 类型需通过 .value 赋值
return Promise.resolve(data);
};
// 获得用户钱包
const getWallet = async () => {
const { code, data } = await PayWalletApi.getUserBalance();
if (code !== 0) {
return;
}
userWallet.value.balance = data;
};
// 获取订单、优惠券等其他资产信息
const getNumData = () => {
OrderApi.getOrderCount().then((res) => {
if (res.code === 0) {
numData.value.orderCount = res.data;
}
});
CouponApi.getUnusedCouponCount().then((res) => {
if (res.code === 0) {
numData.value.unusedCouponCount = res.data;
}
});
};
/**
* 设置 token
* @param {string} accessToken - 访问令牌
* @param {string} refreshToken - 刷新令牌
* @returns {boolean} 登录状态
*/
const setToken = (accessToken = '', refreshToken = '') => {
if (accessToken === '') {
isLogin.value = false;
uni.removeStorageSync('token');
uni.removeStorageSync('refresh-token');
} else {
isLogin.value = true;
uni.setStorageSync('token', accessToken);
uni.setStorageSync('refresh-token', refreshToken);
// loginAfter(); // 直接调用内部函数
}
return isLogin.value;
};
/**
* 更新用户相关信息 (手动限流,5 秒之内不刷新)
*/
const updateUserData = async () => {
if (!isLogin.value) {
resetUserData();
return;
}
// 防抖,5 秒之内不刷新
const nowTime = new Date().getTime();
if (lastUpdateTime.value + 5000 > nowTime) {
return;
}
lastUpdateTime.value = nowTime;
// 获取最新信息
await getInfo();
getWallet();
// getNumData();
return userInfo.value;
};
/**
* 重置用户默认数据
*/
const resetUserData = async () => {
// 清空 token
setToken();
// 清空用户相关的缓存
userInfo.value = clone(defaultUserInfo);
const res = await UserApi.anonymousUserInit();
initUser.value = res.data;
userWallet.value = clone(defaultUserWallet);
// numData.value = cloneDeep(defaultNumData);
// 清空购物车的缓存
// cart().emptyList();
};
/**
* 登录后,加载各种信息
*/
const loginAfter = async () => {
await updateUserData();
await getInitUser();
// 加载购物车
// cart().getList();
// 登录后设置全局分享参数
$share.getShareInfo();
// 提醒绑定手机号
// if (app().platform.bind_mobile && !userInfo.value.mobile) {
// showAuthModal('changeMobile');
// }
// 绑定推广员
// $share.bindBrokerageUser();
};
/**
* 登出系统
* @returns {boolean} 登出后的登录状态(false)
*/
const logout = async () => {
resetUserData();
return !isLogin.value;
};
// 3. 暴露状态和方法(toRefs 保持响应式,解构后不丢失响应性)
return {
...toRefs({
userInfo,
userWallet,
isLogin,
numData,
lastUpdateTime,
initUser,
}),
getInfo,
getWallet,
getNumData,
setToken,
updateUserData,
resetUserData,
loginAfter,
logout,
};
},
{
// persist 配置移到第二个参数(选项式配置)
persist: {
enabled: true,
strategies: [
{
key: 'user-store',
},
],
},
},
);
export default useUserStore;