145 lines
3.1 KiB
TypeScript
145 lines
3.1 KiB
TypeScript
import type { IUserInfoVo } from '@/api/types/login'
|
|
import { defineStore } from 'pinia'
|
|
import { ref } from 'vue'
|
|
import {
|
|
getUserInfo as _getUserInfo,
|
|
login as _login,
|
|
logout as _logout,
|
|
wxLogin as _wxLogin,
|
|
getWxCode,
|
|
mobileLogin as _mobileLogin
|
|
} from '@/api/login'
|
|
import { toast } from '@/utils/toast'
|
|
|
|
const defaultAvatar = 'https://shchazhi.oss-cn-hangzhou.aliyuncs.com/fronted/icon/icon_avatar.png'
|
|
|
|
// 初始化状态
|
|
const userInfoState: IUserInfoVo = {
|
|
id: 0,
|
|
nickname: '',
|
|
avatar: defaultAvatar,
|
|
token: '',
|
|
sn: '',
|
|
account: '',
|
|
channel: 0,
|
|
is_new_user: 1,
|
|
mobile: '',
|
|
username: '',
|
|
}
|
|
|
|
// 默认未登录
|
|
const isLoggedIn = ref<boolean>(false)
|
|
|
|
export const useUserStore = defineStore(
|
|
'user',
|
|
() => {
|
|
// 定义用户信息
|
|
const userInfo = ref<IUserInfoVo>({ ...userInfoState })
|
|
// 设置用户信息
|
|
const setUserInfo = (val: IUserInfoVo) => {
|
|
console.log('设置用户信息', val)
|
|
// 若头像为空 则使用默认头像
|
|
if (!val.avatar) {
|
|
val.avatar = userInfoState.avatar
|
|
}
|
|
else {
|
|
val.avatar = defaultAvatar
|
|
}
|
|
userInfo.value = val
|
|
}
|
|
const setUserAvatar = (avatar: string) => {
|
|
userInfo.value.avatar = avatar
|
|
console.log('设置用户头像', avatar)
|
|
console.log('userInfo', userInfo.value)
|
|
}
|
|
// 删除用户信息
|
|
const removeUserInfo = () => {
|
|
userInfo.value = { ...userInfoState }
|
|
uni.removeStorageSync('userInfo')
|
|
uni.removeStorageSync('token')
|
|
isLoggedIn.value = false
|
|
}
|
|
/**
|
|
* 获取用户信息
|
|
*/
|
|
const getUserInfo = async () => {
|
|
const res = await _getUserInfo()
|
|
const userInfo = res
|
|
setUserInfo(userInfo)
|
|
uni.setStorageSync('userInfo', userInfo)
|
|
// TODO 这里可以增加获取用户路由的方法 根据用户的角色动态生成路由
|
|
return res
|
|
}
|
|
/**
|
|
* 用户登录
|
|
* @param credentials 登录参数
|
|
* @returns R<IUserLogin>
|
|
*/
|
|
const login = async (credentials: {
|
|
username: string
|
|
password: string
|
|
code: string
|
|
uuid: string
|
|
}) => {
|
|
const res = await _login(credentials)
|
|
console.log('登录信息', res)
|
|
toast.success('登录成功')
|
|
await getUserInfo()
|
|
return res
|
|
}
|
|
|
|
/**
|
|
* 账号密码登录
|
|
*/
|
|
const mobileLogin = async (account: string, terminal: number, scene: number) => {
|
|
const res = await _mobileLogin({ account, terminal, scene})
|
|
console.log("🚀 ~ mobileLogin ~ res:", res)
|
|
uni.setStorageSync('token', res.token)
|
|
|
|
await getUserInfo()
|
|
isLoggedIn.value = true
|
|
return res
|
|
}
|
|
|
|
/**
|
|
* 退出登录 并 删除用户信息
|
|
*/
|
|
const logout = async () => {
|
|
_logout()
|
|
removeUserInfo()
|
|
}
|
|
/**
|
|
* 微信登录
|
|
*/
|
|
const wxLogin = async () => {
|
|
// 获取微信小程序登录的code
|
|
const data = await getWxCode()
|
|
console.log('微信登录code', data)
|
|
|
|
const res = await _wxLogin(data)
|
|
uni.setStorageSync('token', res.token)
|
|
|
|
const user = await getUserInfo()
|
|
|
|
isLoggedIn.value = true
|
|
return res && user
|
|
}
|
|
|
|
return {
|
|
userInfo,
|
|
login,
|
|
wxLogin,
|
|
getUserInfo,
|
|
setUserAvatar,
|
|
logout,
|
|
setUserInfo,
|
|
removeUserInfo,
|
|
isLoggedIn,
|
|
mobileLogin
|
|
}
|
|
},
|
|
{
|
|
persist: true,
|
|
},
|
|
)
|