wujingjing
2025-04-09 dd58c1d3a27ba48a5df050aab7c586bb9b988914
src/stores/global.ts
@@ -1,18 +1,28 @@
import { MAIN_URL } from '../constants';
import { accessSessionKey } from '../utils/request';
import type { Ref } from 'vue';
import { ref } from 'vue';
import { GetSystemGlobalConfig } from '../api/system';
import { SERVE_URL, SSE_URL } from '../constants';
import { accessSessionKey, userInfoKey } from '../utils/request';
import { SSEClient } from '../utils/sse/SSEClient';
import { Local } from '../utils/storage';
import type { SystemGlobalConfig } from '../views/types';
import { ElLoadingService, ElMessage } from 'element-plus';
import { handleAfterLogin } from '../layout/component/login/login';
import { isShowLogin } from './chatRoom';
import { PostLogin, userBindingWechat } from '../api/ai/user';
import emitter from '../utils/mitt';
/**
 * 连接消息同步服务
 * @returns
 */
const connectMsgSyncService = () => {
   if (!Local.get(accessSessionKey)) return;
   if (!SSE_URL) return;
   // 创建实例
   const sseClient = new SSEClient(
      `${MAIN_URL}chat/connect_broadcast_chat`,
      // `https://widev.cpolar.top/sse/chat/connect_broadcast_chat`,
      // `${MAIN_URL}events`
      SSE_URL
   );
   sseClient.connect({
      websessionid: Local.get(accessSessionKey),
@@ -21,3 +31,141 @@
};
export const sseClient = connectMsgSyncService();
/** @description 系统全局配置 */
export const systemGlobalConfig: Ref<SystemGlobalConfig> = ref({} as SystemGlobalConfig);
/**
 * 获取系统全局配置
 * @returns
 */
export const getSystemGlobalConfig = async () => {
   const res = await GetSystemGlobalConfig({
      config_key_list: ['ui.project_city'].join(','),
   });
   systemGlobalConfig.value = res.values ?? {};
};
const resolveWechatInfo = () => {
   const url = window.location.href;
   const hashParams = url.split('#')[1];
   if (!hashParams) return;
   const [path, queryString] = hashParams.split('?');
   if (!queryString) return;
   const params = new URLSearchParams(queryString);
   const wxcode = params.get('wxcode');
   const isLogin = params.get('isWxLogin');
   if (!wxcode) return;
   return { wxcode, isLogin };
};
export const checkWechatLogin = async (wxcode: string) => {
   isShowLogin.value = false;
   Local.set('isWechatLogin', true);
   const loadingInstance = ElLoadingService({
      // text: '加载中...',
      target: '.layout-parent',
   });
   const res = await PostLogin({
      weixin_code: wxcode,
   }).finally(() => {
      loadingInstance.close();
   });
   if (res?.json_ok) {
      handleAfterLogin(res, false);
      Local.remove('isWechatLogin');
      // 使用新地址替换当前页面,移除微信登录参数
      // const newUrl = window.location.href.split('?')[0];
      // window.history.replaceState({}, '', SERVE_URL);
      window.location.href = SERVE_URL;
      // window.location.reload();
   } else {
      // isShowLogin.value = true;
      Local.set('wechatLoginMsgInfo', {
         type: 'error',
         value: res?.json_msg ?? '登录失败,请检查是否已绑定微信',
      });
      window.location.href = SERVE_URL;
   }
};
export const handleBindWechat = async (wxcode: string) => {
   const userInfo = Local.get(userInfoKey);
   const loadingInstance = ElLoadingService({
      // text: '加载中...',
      target: '.layout-parent',
   });
   const res = await userBindingWechat({
      weixin_code: wxcode,
      user_name: userInfo.userName,
   }).finally(() => {
      loadingInstance.close();
   });
   if (res?.json_ok) {
      ElMessage.success('绑定成功');
      const userInfo = Local.get(userInfoKey);
      Local.set(userInfoKey, {
         ...userInfo,
         isBindWechat: true,
         wechatNickname:res.json_url
      });
      setTimeout(() => {
         window.location.href = SERVE_URL;
      }, 700);
   } else {
      ElMessage.error(res?.json_msg ?? '绑定失败');
      setTimeout(() => {
         window.location.href = SERVE_URL;
      }, 2000);
   }
};
export const checkWxOperate = () => {
   const result = resolveWechatInfo();
   if (!result) return;
   if (result.isLogin === 'Y') {
      checkWechatLogin(result.wxcode);
   } else {
      handleBindWechat(result.wxcode);
   }
};
/**
 * 返回一个对象,给 parent 调用
 * 此对象包含多个函数
 * @returns
 */
const childCallObj = {
   /** @description 测试函数 */
   test: (msg: string) => {
      console.log('test 函数来自 child', msg);
   },
   execute: (obj: any) => {
      console.log('execute 函数来自 child', obj);
   },
};
export class ParentRegister {
   static notify = null;
   static setRegisterFunc() {
      if (!window.parent) return;
      (window as any).registerNotifyFunction = (notifyFunc: any) => {
         ParentRegister.notify = notifyFunc;
         return childCallObj;
      };
   }
   static updateChildCallObj(key:string,callback:Function) {
      childCallObj[key] = callback;
   }
}
window.callObj = childCallObj;