import { defineStore, skipHydrate } from 'pinia' import refreshToken from '~/utils/RefreshToken' import { getUserInfo } from '~/api/common/index' import type { AppMemberUserInfoRespVO } from '~/api/common/types' import MQTTClient from '~/utils/mqttClient' import { socialLoginByCode } from '~/api/pay' export default defineStore('useUserStore', { state: () => ({ token: refreshToken.getToken().token || '', refreshToken: refreshToken.getToken().refreshToken || '', userId: refreshToken.getToken().userId || '', userName: refreshToken.getToken().userName || '', userInfoRes: (refreshToken.getToken().userInfo || {}) as AppMemberUserInfoRespVO, mqttClient: null as MQTTClient | null, }), actions: { setToken(token: string) { this.token = token }, setRefreshToken(refreshToken: string) { this.refreshToken = refreshToken }, setUserId(userId: string) { this.userId = userId }, setUserName(userName: string) { this.userName = userName }, logout() { const token = useCookie('token') token.value = '' refreshToken.removeToken() localStorage.removeItem('tuxixi-store') if (self === top) { navigateTo('/') } else { window.top?.postMessage({ event: 'logout' }, '*') } }, async getUserInfo() { const user = useUserInfo() const res = await getUserInfo() if (res.code === 0) { this.userInfoRes = res.data refreshToken.setUserInfo(res.data) user.value = res.data // 建立连接mqtt this.connectMqtt() } }, // 建立连接mqtt async connectMqtt() { if (import.meta.client) { this.mqttClient = new MQTTClient('wss://www.tuxixi.net/mqtt', { clientId: this.userInfoRes.id, }) await this.mqttClient.connect() await this.mqttClient?.subscribe(`zbjk_message_single/${this.userInfoRes.id}`) await this.mqttClient?.subscribe(`zbjk_message_kefu/${this.userInfoRes.id}`) } }, async getToken(row: any) { const app = useNuxtApp() try { // 验证state if (localStorage.getItem('wechat_login_state') !== row.state && localStorage.getItem('qq_login_state') !== row.state) { ElMessage.error('验证失败,请重新登录') return } const res = await socialLoginByCode({ code: row.code, state: row.state, type: Number(row.type), // type: 32-微信开放平台 35-腾讯QQ }) const { code, data } = res if (code === 0 && data.openid) { // 打开登录界面 if (!data.accessToken) { ElMessage.error('因你未绑定手机号,请先绑定手机号') app.$openLogin('verify', row.code, row.type, row.state) } else { refreshToken.setToken(data.accessToken, data.refreshToken) refreshToken.setUserId(data.userId.toString()) // refreshToken.setUserName(loginForm.mobile) this.setToken(data.accessToken) this.setUserId(data.userId.toString()) // userStore.setUserName(loginForm.mobile) this.setRefreshToken(data.refreshToken) // 获取信息 await this.getUserInfo() } } else { console.error('获取token失败:', res.msg) } } catch (error) { console.error('getToken error:', error) } }, async getTokenV2(row: any) { const app = useNuxtApp() try { const res = await socialLoginByCode({ openId: row.openId, sceneStr: row.sceneStr, type: 32 }) const { code, data } = res if (code === 0) { // 打开登录界面 if (!data.accessToken) { ElMessage.error('因你未绑定手机号,请先绑定手机号') app.$openLogin('verify', row.code, row.type, row.state) } else { refreshToken.setToken(data.accessToken, data.refreshToken) refreshToken.setUserId(data.userId.toString()) // refreshToken.setUserName(loginForm.mobile) this.setToken(data.accessToken) this.setUserId(data.userId.toString()) // userStore.setUserName(loginForm.mobile) this.setRefreshToken(data.refreshToken) // 获取信息 await this.getUserInfo() } } else { console.error('获取token失败:', res.msg) } } catch (error) { console.error('getToken error:', error) } }, }, persist: import.meta.client && { key: 'tuxixi-store', storage: localStorage, pick: ['token', 'refreshToken', 'userId', 'userName', 'userInfoRes'], }, })