7021f2fd创建于 2025年5月14日历史提交
import { createRouter } from '@/plugin/uni-mini-router'
// 导入pages.json
import pagesJson from '../pages.json'
console.log("pagesJson::",pagesJson);
// 引入uni-parse-pages
import pagesJsonToRoutes from 'uni-parse-pages'
import { useUserStore } from '@/store/user'
import {
  HOME_PAGE,
  ROUTE_PARAMS
} from '@/common/constants'
import { cache,isOAuth2AppEnv } from '@/common/uitls'
import {isEmpty} from "@/utils/is";
// 生成路由表
const routes = pagesJsonToRoutes(pagesJson)
setRouteName(routes)
const router = createRouter({
  routes: [...routes], // 路由表信息
})
export const whiteList = ['/pages/login/login','/pages/login/loginOauth2']
export const loginPage = '/pages/login/login'
interface CacheRoute {
  path: string;
  query: Record<string, string | number | boolean>;
}
export const beforEach = (to, from, next) => {
  const userStore = useUserStore()
  //update-begin-author:liusq---date:2025-03-20--for: 防止移动端oauth地址和PC不一致的问题
  if(to.path == '/oauth2-app/login'){
    let temp = location.href;
    location.href = temp.replace('/oauth2-app/login','/pages/login/loginOauth2')
    return;
  }
  //update-end-author:liusq---date:2025-03-20--for:防止移动端oauth地址和PC不一致的问题
  if (userStore.isLogined) {
    // 有登录态
    if(to.path === '/pages/login/loginOauth2'){
      //有跳转地址
      if(to.query && to.query.redirect){
        next()
      }else{
        //跳转到首页
        next({path: HOME_PAGE})
      }
    }
    //update-begin-author:liusq---date:2025-03-20--for: 流程路由逻辑
    let flowRoute = getPathAndQuery(to);
    if(flowRoute===false){
      let cacheRoute = cache(ROUTE_PARAMS);
      if(cacheRoute && !isEmpty(cacheRoute) && (cacheRoute as any)?.path == to.path
          && isEmpty(to.query)
          && !isEmpty((cacheRoute as any)?.query)){

        to.query = (cacheRoute as any)?.query;
        next({ path: to.path, query: (cacheRoute as any)?.query })
      }else{
        cache(ROUTE_PARAMS,to,1*60*10);
        next()
      }
    }else{
      next({ path: flowRoute.path, query: flowRoute.query })
    }
    //update-end-author:liusq---date:2025-03-20--for: 流程路由逻辑
  } else {
    // 无登录态
    if (whiteList.includes(to.path)) {
      // 在免登录白名单,如果进入的页面是login页面并且当前是OAuth2app环境,就进入OAuth2登录页面
      if (to.path === '/pages/login/login' && isOAuth2AppEnv()) {
        next({path: '/pages/login/loginOauth2'})
      } else {
        // 在免登录白名单,直接进入
        next()
      }
    } else {
      // 如果当前是在OAuth2APP环境,就跳转到OAuth2登录页面
      let path = isOAuth2AppEnv() ? '/pages/login/loginOauth2' : '/pages/login/login';
      let temp = to.path;
      if(isOAuth2AppEnv() && temp=='/pages/flow/myTaskDetail'){
        if(to.query && to.query.info){
          temp+='?info='+to.query.info
        }
        next({ path: path, query: { redirect: encodeURIComponent(temp) } })
      }else{
        next({ path: path })
      }
    }
  }
}
// 全局前置守卫
router.beforeEach(beforEach)

// 路由的最后一级为路由名字不可重复
function setRouteName(routes) {
  routes.forEach((item) => {
    if (item.path) {
      const name = item.path.split('/').pop()
      item.name = name
    }
  })
}

/**
 * 路由跳转-已经登录过了 直接next会导致参数丢失,所以需要再走一遍loginOauth2页面的逻辑
 * @param to
 * @returns {{path: string, query: {redirect: string}}|boolean}
 */
function getPathAndQuery(to){
  if(to.path === '/pages/flow/myTaskDetail'){
    if(to.query && to.query.info){
      let info = JSON.parse(to.query.info)
      info['hasToken'] = 1;
      let temp = '/pages/flow/myTaskDetail?info='+ JSON.stringify(info)
      return {
        path: '/pages/login/loginOauth2',
        query: { redirect: encodeURI(temp) }
      }
    }
  }
  return false
}
export default router