63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
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<string>(getToken())
|
||
const refreshToken = ref<string>(uni.getStorageSync(REFRESH_TOKEN_KEY) || '')
|
||
const userInfo = ref<UserInfo | null>(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
|
||
}
|
||
})
|