四零语境后端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

121 lines
3.9 KiB

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