2025-07-21 15:44:03 +08:00

152 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineStore } from "pinia";
import { authenticationApi, loginCode, loginPass, weChatLogin } from "@/api/system/login";
import { AUTH_KEY } from "@/config";
import { imagUrl } from "@/utils";
import { useWebSocket } from '@/utils/webSocket/webSocket'
const defWsCallback = (type: string, data: any) => {
console.log('接收到 WebSocket 消息, 默认处理函数:', type, data);
}
interface UserState {
userdata: any;
curXs: any;
token: string;
auth: string[],
ws: any,
wsCallback: any
}
export const useUserStore = defineStore({
id: "app-user",
state: (): UserState => ({
//用户数据
userdata: '',
// 当前学生
curXs: {},
// token
token: '',
//用户注册信息
auth: [],
ws: null,
wsCallback: defWsCallback
}),
getters: {
getToken(): string {
return this.token;
},
getUser(): any {
return this.userdata;
},
getCurXs(): any {
return this.curXs;
},
getAuth(): string[] {
return this.auth;
}
},
actions: {
setToken(token: string) {
this.token = token
},
setUser(data: any) {
this.userdata = data;
},
setCurXs(data: any) {
Object.assign(this.curXs, data);
},
setAuth(data: string[]) {
this.auth = data;
},
setWsCallback(callback: any) {
this.wsCallback = callback;
},
initWs() {
if (!this.ws) {
this.ws = useWebSocket(`/zhxy/webSocket/${this.userdata.userId}`, (type: string, res: any) => {
// 判断this.wsCallback是函数调用
if (typeof this.wsCallback === "function") {
this.wsCallback(type, res);
}
});
this.ws.reconnect();
}
},
/**
* @description: 验证码登录
*/
async codeLogin(params: { phone: number | string, code: number | string }) {
try {
const { result } = await loginCode({ phone: params.phone, code: params.code, openId: '' });
this.afterLoginAction(result)
} catch (e) {
console.log(e)
}
},
/**
* @description: 密码登录
*/
async passwordLogin(params: { name: string, password: string }) {
try {
const { result } = await loginPass({ username: params.name, password: params.password, openId: '' });
this.afterLoginAction(result)
} catch (e) {
}
},
/**
* @description: 微信登录
*/
async weChatLogin(params: { code: string }) {
try {
const { result } = await weChatLogin({ code: params.code })
this.afterLoginAction(result)
} catch (e) {
console.log(e)
}
},
/**
* @description: 登录成功后的操作
*/
afterLoginAction(value: any) {
this.setUser(value)
if (value.xsList && value.xsList.length > 0) {
for (let i = 0; i < value.xsList.length; i++) {
const xs = value.xsList[i];
xs.xstxUrl = imagUrl(xs.xstx) || "";
}
this.setCurXs(value.xsList[0])
} else {
this.setCurXs({})
}
if (value[AUTH_KEY]) {
this.setToken(value[AUTH_KEY])
}
authenticationApi({ userId: value.userId }).then(({ result }) => {
if (result) {
this.setAuth(result)
}
})
},
/**
* @description: 注销
*/
logout() {
this.setToken('')
this.setUser('')
this.setCurXs({})
this.setAuth([])
if (this.ws) {
this.ws.closeConnect();
this.ws = null;
}
this.wsCallback = defWsCallback;
},
},
persist: {
enabled: true,
detached: true,
H5Storage: localStorage
},
});