152 lines
3.6 KiB
TypeScript
152 lines
3.6 KiB
TypeScript
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
|
||
},
|
||
});
|