2026-01-20 19:36:49 +08:00
|
|
|
|
import { ref } from "vue";
|
|
|
|
|
|
import { defineStore } from "pinia";
|
|
|
|
|
|
import api from '@/utils/api';
|
|
|
|
|
|
import { toast } from '@/utils/widget';
|
2026-01-28 13:38:05 +08:00
|
|
|
|
import { initGlobalTIM, globalTimChatManager } from "@/utils/tim-chat.js";
|
2026-01-20 19:36:49 +08:00
|
|
|
|
const env = __VITE_ENV__;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default defineStore("accountStore", () => {
|
|
|
|
|
|
const appid = env.MP_WX_APP_ID;
|
|
|
|
|
|
const account = ref(null);
|
|
|
|
|
|
const loading = ref(false)
|
2026-01-28 13:38:05 +08:00
|
|
|
|
const isIMInitialized = ref(false);
|
|
|
|
|
|
const openid = ref("");
|
2026-01-20 19:36:49 +08:00
|
|
|
|
async function login(phoneCode = '') {
|
2026-01-28 13:38:05 +08:00
|
|
|
|
|
2026-01-20 19:36:49 +08:00
|
|
|
|
if (loading.value) return;
|
|
|
|
|
|
loading.value = true;
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
const { code } = await uni.login({
|
|
|
|
|
|
appid,
|
|
|
|
|
|
provider: "weixin",
|
|
|
|
|
|
scope: "snsapi_base",
|
|
|
|
|
|
});
|
|
|
|
|
|
if (code) {
|
|
|
|
|
|
const res = await api('wxAppLogin', {
|
|
|
|
|
|
phoneCode,
|
|
|
|
|
|
code,
|
|
|
|
|
|
});
|
|
|
|
|
|
loading.value = false
|
|
|
|
|
|
if (res.success && res.data && res.data.mobile) {
|
|
|
|
|
|
account.value = res.data;
|
2026-01-28 13:38:05 +08:00
|
|
|
|
openid.value = res.data.openid;
|
2026-01-29 11:42:56 +08:00
|
|
|
|
|
|
|
|
|
|
// 保存账户信息和 openId 到本地存储
|
|
|
|
|
|
uni.setStorageSync('account', res.data);
|
|
|
|
|
|
uni.setStorageSync('openid', res.data.openid);
|
|
|
|
|
|
|
2026-01-28 13:38:05 +08:00
|
|
|
|
initIMAfterLogin(openid.value)
|
2026-01-20 19:36:49 +08:00
|
|
|
|
return res.data
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
toast('登录失败,请重新登录');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
toast('登录失败,请重新登录');
|
|
|
|
|
|
}
|
|
|
|
|
|
loading.value = false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-28 16:20:19 +08:00
|
|
|
|
async function initIMAfterLogin() {
|
2026-01-28 13:38:05 +08:00
|
|
|
|
if (isIMInitialized.value) {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
2026-01-29 11:42:56 +08:00
|
|
|
|
// 使用 openid 作为 userID 初始化 IM
|
|
|
|
|
|
const userID = openid.value || uni.getStorageSync('openid');
|
|
|
|
|
|
if (!userID) {
|
|
|
|
|
|
console.error('无法获取 openid,IM 初始化失败');
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
console.log('开始初始化 IM,userID:', userID);
|
|
|
|
|
|
const success = await initGlobalTIM(userID);
|
|
|
|
|
|
|
|
|
|
|
|
if (!success) {
|
|
|
|
|
|
console.error('initGlobalTIM 返回失败');
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 验证 TIM 实例是否真正创建成功
|
|
|
|
|
|
if (!globalTimChatManager || !globalTimChatManager.tim) {
|
|
|
|
|
|
console.error('IM 初始化后 TIM 实例不存在');
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-28 13:38:05 +08:00
|
|
|
|
isIMInitialized.value = true;
|
2026-01-29 11:42:56 +08:00
|
|
|
|
console.log('IM 初始化成功');
|
2026-01-28 13:38:05 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('IM初始化失败:', error);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 退出登录
|
|
|
|
|
|
async function logout() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 退出腾讯IM
|
|
|
|
|
|
if (globalTimChatManager && globalTimChatManager.tim) {
|
|
|
|
|
|
console.log('开始退出腾讯IM');
|
|
|
|
|
|
await globalTimChatManager.destroy();
|
|
|
|
|
|
console.log('腾讯IM退出成功');
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('退出腾讯IM失败:', error);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 清空账户信息
|
|
|
|
|
|
account.value = null;
|
|
|
|
|
|
openid.value = "";
|
|
|
|
|
|
isIMInitialized.value = false;
|
2026-01-29 11:42:56 +08:00
|
|
|
|
|
|
|
|
|
|
// 清除本地存储
|
|
|
|
|
|
uni.removeStorageSync('account');
|
|
|
|
|
|
uni.removeStorageSync('openid');
|
2026-01-28 13:38:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return { account, login, initIMAfterLogin, logout, openid, isIMInitialized }
|
2026-01-20 19:36:49 +08:00
|
|
|
|
})
|