| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- import Vue from "vue";
- import VueRouter from "vue-router";
- import layout from "@/layout/index.vue";
- import { checkWxWorkEnvAndUserCache, getAgentFrom } from '@/utils/index'
- import { checkLoginStatus, initGuidInfo, doWecomLogin, getQyCode, getGuid, getMD5 } from '@/utils/wecomLogin.ts';
- import { doWxidLogin } from "@/api/indexAI";
- Vue.use(VueRouter);
- const router = new VueRouter({
- mode: process.env.NODE_ENV !== "development" ? "history" : "history",
- base: process.env.BASE_URL,
- scrollBehavior(to, from, savedPosition) {
- if (savedPosition) {
- return savedPosition;
- } else {
- return { x: 0, y: 0 };
- }
- },
- routes: [
- {
- path: "/",
- component: layout,
- redirect: "/AIDesign",
- children: [
- {
- path: "/AIDesign",
- component: () => import("../views/AIDesign/index.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- {
- path: "/login",
- component: () => import("../views/login/index.vue"),
- meta: { title: "登录" }
- },
- {
- path: "/error/:code",
- component: () => import("../views/errorPage/index.vue")
- },
- {
- path: "/error",
- component: () => import("../views/errorPage/weixinerr.vue")
- },
- //设计页
- {
- path: "/AIDesign/design",
- component: () => import("../views/AIDesign/design.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //结果页
- {
- path: "/AIDesign/result",
- component: () => import("../views/AIDesign/result.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //历史页
- {
- path: "/AIDesign/history",
- component: () => import("../views/AIDesign/history.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //内墙-设计页
- {
- path: "/AIDesign/insideDesign",
- component: () => import("../views/AIDesign/insideDesign.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //一键诊断-生成页
- {
- path: "/AIDesign/diagnose",
- component: () => import("../views/AIDesign/diagnose.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //一键诊断-历史页
- {
- path: "/AIDesign/diagnoseHistory",
- component: () => import("../views/AIDesign/diagnoseHistory.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //一键诊断-结果页
- {
- path: "/AIDesign/diagnoseResult",
- component: () => import("../views/AIDesign/diagnoseResult.vue"),
- meta: { requiresAuth: true } // 标记需要登录的页面
- },
- //反馈页面
- {
- path: "/AIDesign/feedback",
- component: () => import("../views/AIDesign/feedback.vue"),
- meta: { requiresAuth: true }
- },
- // 生成方案
- {
- path: "/AIDesign/GeneratePlan",
- component: () => import("../views/AIDesign/GeneratePlan.vue"),
- meta: { requiresAuth: true }
- },
- ]
- },
- ]
- });
- // 全局前置守卫:只对需要登录的页面进行登录校验
- router.beforeEach(async (to, from, next) => {
- console.log("to=", to)
- if (!to.meta || (to.meta && !to.meta.requiresAuth)) {
- next();
- return;
- }
- try {
- //先判断企微环境
- // checkWxWorkEnvAndUserCache();
- const { loginType, wxid, WecomType } = to.query;
- // 初始化登录模式标识
- initLoginModeFlag(loginType);
- // 判断当前登录模式,分发处理逻辑
- const isNewLoginMode = sessionStorage.getItem('isNewLoginMode') === 'true';
- if (isNewLoginMode) {
- await handleWxidLoginMode(to, next, wxid, WecomType);
- } else {
- await handleCodeLoginMode(to, next);
- }
- } catch (error) {
- console.error("登录校验过程异常:", error);
- next({ path: "/error" });
- }
- });
- /**
- * 新登录方式处理:强制检测登录 → 获取Token → 缓存 → 放行/失败跳转
- * @param to 目标路由
- * @param next 路由放行方法
- */
- async function handleWxidLoginMode(to, next, wxid, WecomType) {
- try {
- window.localStorage.setItem('loginMode', 'wxidLogin');
- if (wxid) {
- window.localStorage.setItem('weChat', wxid);
- }
- if (WecomType) {
- const agentFrom = getAgentFrom(WecomType);
- window.localStorage.setItem('agentFrom', agentFrom);
- window.localStorage.setItem('agentFromAI', agentFrom);
- }
- // 3. 初始化鉴权信息,校验登录状态
- initGuidInfo();
- if (checkLoginStatus()) return next();
- // 4. wxid参数校验
- let wxId = wxid ? wxid : window.localStorage.getItem("weChat");
- if (!wxId) return redirectToError(next, "wxid参数缺失,无权限");
- const formData = new FormData();
- const timestamp = new Date().getTime().toString();
- const nonce = getGuid();
- const sign = getMD5(nonce, timestamp, wxId);
- formData.append('wxId', wxId);
- formData.append('timestamp', timestamp);
- formData.append('nonce', nonce);
- formData.append('sign', sign);
- doWxidLogin(formData)
- .then((res) => {
- if (res && res.StatusCode === 200 && res.Data && res.Data.token) {
- const userInfoV1 = JSON.stringify(res.Data);
- window.localStorage.setItem('userInfoV1', userInfoV1);
- window.localStorage.setItem('AIToken', res.Data.token);
- window.localStorage.setItem('isRefreshProvider', res.Data.isRefreshProvider);
- window.localStorage.setItem('weChat', res.Data.weChat);
- console.log(`新登录成功,Token已缓存,即将进入 ${to.path}`);
- // debugger
- next();
- } else {
- throw new Error('新登录失败,未获取到Token');
- }
- })
- .catch(() => {
- // 登录失败:跳转错误页
- next({ path: "/error", replace: true });
- });
- } catch (err) {
- console.error('新登录方式处理异常:', err);
- next({ path: "/error", replace: true });
- }
- }
- /**
- * 旧登录方式处理:原有企微code授权登录逻辑
- * @param to 目标路由
- * @param next 路由放行方法
- */
- function handleCodeLoginMode(to, next) {
- const org_loginMode = window.localStorage.getItem('loginMode');
- if (org_loginMode != 'codeLogin') {
- window.localStorage.clear();
- }
- window.localStorage.setItem('loginMode', 'codeLogin');
- //验证时间戳和token
- initGuidInfo();
- if (checkLoginStatus()) return next();
- const code = to.query.code as string;
- let finalCode;
- if (Array.isArray(code)) {
- finalCode = code.length > 0 ? code[code.length - 1] : null;
- } else {
- finalCode = code || null;
- }
- if (finalCode) {
- doWecomLogin(finalCode)
- .then(() => {
- // debugger
- next();
- console.log(`登录成功,即将进入 ${to.path}`);
- })
- .catch(() => {
- next({ path: "/error" });
- });
- } else {
- // debugger
- console.log(`访问 ${to.path} 需登录,正在跳转到授权页面`);
- getQyCode();
- }
- }
- /**
- * 初始化登录模式标识 - 保证会话内登录方式统一
- * @param {string} loginType 路由传参的登录类型
- */
- function initLoginModeFlag(loginType) {
- const isNewLoginMode = loginType && String(loginType) === '2';
- // 保证本次会话的登录方式不变
- if (isNewLoginMode) {
- sessionStorage.setItem("isNewLoginMode", 'true');
- }
- }
- /**
- * 跳转错误页并存储错误信息
- * @param {Function} next 路由放行函数
- * @param {string} msg 错误提示信息
- */
- function redirectToError(next, msg = '参数缺失,无权限') {
- sessionStorage.setItem("errorMsgTit", msg);
- next({ path: '/error', replace: true });
- }
- export default router;
|