import { defineStore } from 'pinia' import { ref, computed } from 'vue' import { getToken, setToken, removeToken } from '../api/request' import { wxLogin as apiWxLogin, login as apiLogin, getUserInfo as apiGetUserInfo } from '../api/user' import type { UserInfo, LoginParams } from '../api/types' import { TOKEN_KEY, REFRESH_TOKEN_KEY } from '../config' export const useUserStore = defineStore('user', () => { const token = ref(getToken()) const refreshToken = ref(uni.getStorageSync(REFRESH_TOKEN_KEY) || '') const userInfo = ref(null) const isLogin = computed(() => !!token.value) /** 微信授权登录(接收 loginCode + phoneCode) */ async function wxLogin(params: { loginCode: string; phoneCode: string }) { const result = await apiWxLogin(params) token.value = result.accessToken refreshToken.value = result.refreshToken setToken(result.accessToken) uni.setStorageSync(REFRESH_TOKEN_KEY, result.refreshToken) return result } /** 账号密码登录(降级方案) */ async function login(params: LoginParams) { const result = await apiLogin(params) token.value = result.accessToken refreshToken.value = result.refreshToken setToken(result.accessToken) uni.setStorageSync(REFRESH_TOKEN_KEY, result.refreshToken) return result } /** 获取用户信息 */ async function fetchUserInfo() { if (!token.value) return const info = await apiGetUserInfo() userInfo.value = info return info } /** 退出登录 */ function logout() { token.value = '' refreshToken.value = '' userInfo.value = null removeToken() uni.removeStorageSync(REFRESH_TOKEN_KEY) } return { token, refreshToken, userInfo, isLogin, wxLogin, login, fetchUserInfo, logout } })