diff --git a/frontend/src/stores/user.ts b/frontend/src/stores/user.ts new file mode 100644 index 0000000..996092e --- /dev/null +++ b/frontend/src/stores/user.ts @@ -0,0 +1,164 @@ +import { defineStore } from 'pinia' +// import { ref } from 'vue' +import { AuthApi } from '@/api/login' +import { useCache } from '@/utils/useCache' +import { i18n } from '@/i18n' +import { store } from './index' + +const { wsCache } = useCache() + +interface UserState { + token: string + uid: string + account: string + name: string + oid: string + language: string + exp: number + time: number + weight: number + [key: string]: string | number +} + +export const UserStore = defineStore('user', { + state: (): UserState => { + return { + token: '', + uid: '', + account: '', + name: '', + oid: '', + language: 'zh-CN', + exp: 0, + time: 0, + weight: 0, + } + }, + getters: { + getToken(): string { + return this.token + }, + getUid(): string { + return this.uid + }, + getAccount(): string { + return this.account + }, + getName(): string { + return this.name + }, + getOid(): string { + return this.oid + }, + getLanguage(): string { + return this.language + }, + getExp(): number { + return this.exp + }, + getTime(): number { + return this.time + }, + isAdmin(): boolean { + return this.uid === '1' + }, + getWeight(): number { + return this.weight + }, + isSpaceAdmin(): boolean { + return this.uid === '1' || !!this.weight + }, + }, + actions: { + async login(formData: { username: string; password: string }) { + const res: any = await AuthApi.login(formData) + this.setToken(res.access_token) + }, + + logout() { + this.clear() + }, + + async info() { + const res: any = await AuthApi.info() + const res_data = res || {} + + const keys = ['uid', 'account', 'name', 'oid', 'language', 'exp', 'time', 'weight'] as const + + keys.forEach((key) => { + const dkey = key === 'uid' ? 'id' : key + const value = res_data[dkey] + if (key === 'exp' || key === 'time' || key === 'weight') { + this[key] = Number(value) + } else { + this[key] = String(value) + } + wsCache.set('user.' + key, value) + }) + + this.setLanguage(this.language) + }, + setToken(token: string) { + wsCache.set('user.token', token) + this.token = token + }, + setExp(exp: number) { + wsCache.set('user.exp', exp) + this.exp = exp + }, + setTime(time: number) { + wsCache.set('user.time', time) + this.time = time + }, + setUid(uid: string) { + wsCache.set('user.uid', uid) + this.uid = uid + }, + setAccount(account: string) { + wsCache.set('user.account', account) + this.account = account + }, + setName(name: string) { + wsCache.set('user.name', name) + this.name = name + }, + setOid(oid: string) { + wsCache.set('user.oid', oid) + this.oid = oid + }, + setLanguage(language: string) { + if (!language || language === 'zh_CN') { + language = 'zh-CN' + } + wsCache.set('user.language', language) + this.language = language + i18n.global.locale.value = language + /* const { locale } = useI18n() + locale.value = language */ + // locale.setLang(language) + }, + setWeight(weight: number) { + wsCache.set('user.weight', weight) + this.weight = weight + }, + clear() { + const keys: string[] = [ + 'token', + 'uid', + 'account', + 'name', + 'oid', + 'language', + 'exp', + 'time', + 'weight', + ] + keys.forEach((key) => wsCache.delete('user.' + key)) + this.$reset() + }, + }, +}) + +export const useUserStore = () => { + return UserStore(store) +}