小程序路由跳转

main
项洋 6 hours ago
parent 3425888623
commit 70e196a331

@ -17,7 +17,7 @@
<script setup name="Breadcrumb">
import { ref, watch, onMounted, computed } from "vue";
import { useRoute, useRouter } from "vue-router";
import { usePermissionStore } from "@/store/modules/permission";
import usePermissionStore from "@/store/modules/permission";
const route = useRoute();
const router = useRouter();

@ -49,7 +49,7 @@ import Fuse from 'fuse.js'
import { getNormalPath } from '@/utils/ruoyi'
import { isHttp } from '@/utils/validate'
import useSettingsStore from '@/store/modules/settings'
import { usePermissionStore } from '@/store/modules/permission'
import usePermissionStore from '@/store/modules/permission'
const search = ref('')
const options = ref([])

@ -37,7 +37,7 @@ import { constantRoutes } from "@/router"
import { isHttp } from '@/utils/validate'
import useAppStore from '@/store/modules/app'
import useSettingsStore from '@/store/modules/settings'
import { usePermissionStore } from '@/store/modules/permission'
import usePermissionStore from '@/store/modules/permission'
//
const visibleNumber = ref(null)

@ -81,7 +81,7 @@
<script setup>
import useAppStore from '@/store/modules/app'
import useSettingsStore from '@/store/modules/settings'
import { usePermissionStore } from '@/store/modules/permission'
import usePermissionStore from '@/store/modules/permission'
import { handleThemeStyle } from '@/utils/theme'
const { proxy } = getCurrentInstance()

@ -34,7 +34,7 @@ import SidebarItem from "./SidebarItem";
import variables from "@/assets/styles/variables.module.scss";
import useAppStore from "@/store/modules/app";
import useSettingsStore from "@/store/modules/settings";
import { usePermissionStore } from "@/store/modules/permission";
import usePermissionStore from "@/store/modules/permission";
const route = useRoute();
const appStore = useAppStore();

@ -46,7 +46,7 @@ import ScrollPane from './ScrollPane'
import { getNormalPath } from '@/utils/ruoyi'
import useTagsViewStore from '@/store/modules/tagsView'
import useSettingsStore from '@/store/modules/settings'
import { usePermissionStore } from '@/store/modules/permission'
import usePermissionStore from '@/store/modules/permission'
const visible = ref(false)
const top = ref(0)

@ -7,7 +7,7 @@ import { isHttp, isPathMatch } from '@/utils/validate'
import { isRelogin } from '@/utils/request'
import useUserStore from '@/store/modules/user'
import useSettingsStore from '@/store/modules/settings'
import { usePermissionStore } from '@/store/modules/permission'
import usePermissionStore from '@/store/modules/permission'
NProgress.configure({ showSpinner: false })

@ -1,8 +1,7 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import { createRouter, createWebHashHistory } from "vue-router";
/* Layout */
import Layout from '@/layout'
import Layout from "@/layout";
/**
* Note: 路由配置项
@ -29,185 +28,198 @@ import Layout from '@/layout'
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
path: "/redirect",
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect')
}
]
path: "/redirect/:path(.*)",
component: () => import("@/views/redirect"),
},
],
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
path: "/login",
component: () => import("@/views/login"),
hidden: true,
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
path: "/register",
component: () => import("@/views/register"),
hidden: true,
},
{
path: '/404',
component: () => import('@/views/error/404'),
hidden: true
path: "/404",
component: () => import("@/views/error/404"),
hidden: true,
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
path: "/401",
component: () => import("@/views/error/401"),
hidden: true,
},
{
path: '',
path: "",
component: Layout,
hidden: true,
redirect: 'index',
redirect: "index",
children: [
{
path: 'index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
},{
path: 'assetsAuth',
component: () => import('@/views/auditPages/assetsManagement/assetsAuth'),
name: 'AssetsAuth',
// meta: { title: '新增资产', icon: 'user', activeMenu: "/assets" }
meta: { title: '新增资产', icon: 'user', activeMenu: "/assetsManage/assets" }
},{
path: 'taskInfo',
component: () => import('@/views/auditPages/taskManagement/info'),
name: 'TaskInfo',
meta: { title: '任务详情', icon: 'user', activeMenu: "/task" }
},{
path: 'taskAudit',
component: () => import('@/views/auditPages/taskManagement/auditList'),
name: 'taskAudit',
meta: { title: '任务审核', icon: 'user', activeMenu: "/task" }
},{
path: 'taskAuditInfo',
component: () => import('@/views/auditPages/taskManagement/audit'),
name: 'taskAuditInfo',
meta: { title: '资产审核', icon: 'user', activeMenu: "/task" }
},{
path: 'taskAuditInfolishichakan',
component: () => import('@/views/auditPages/taskManagement/audit'),
name: 'taskAuditInfolishichakan',
meta: { title: '资产提交记录', icon: 'user', activeMenu: "/task" }
},{
path: 'unitAuth',
component: () => import('@/views/auditPages/unitManagement/index'),
name: 'UnitAuth',
meta: { title: '新增单位', icon: 'user', activeMenu: "/unit" }
},{
path: 'unitAssetsAuth',
component: () => import('@/views/auditPages/unitAutonomicFill/assetsAuth'),
name: 'unitAssetsAuth',
meta: { title: '资产修改', icon: 'user', activeMenu: "/unitFill" }
}
]
path: "index",
component: () => import("@/views/index"),
name: "Index",
meta: { title: "首页", icon: "dashboard", affix: true },
},
// {
// path: 'assetsAuth',
// component: () => import('@/views/auditPages/assetsManagement/assetsAuth'),
// name: 'AssetsAuth',
// // meta: { title: '新增资产', icon: 'user', activeMenu: "/assets" }
// meta: { title: '新增资产', icon: 'user', activeMenu: "/assetsManage/assets" }
// }
{
path: "/auditPages/assetsType",
name: "assetsType1",
component: () => import("@/views/components/assetsType/index_v1.vue"),
// meta: { title: '新增资产', icon: 'user', activeMenu: "/assetsManage/assets" }
},
{
path: "taskInfo",
component: () => import("@/views/auditPages/taskManagement/info"),
name: "TaskInfo",
meta: { title: "任务详情", icon: "user", activeMenu: "/task" },
},
{
path: "taskAudit",
component: () => import("@/views/auditPages/taskManagement/auditList"),
name: "taskAudit",
meta: { title: "任务审核", icon: "user", activeMenu: "/task" },
},
{
path: "taskAuditInfo",
component: () => import("@/views/auditPages/taskManagement/audit"),
name: "taskAuditInfo",
meta: { title: "资产审核", icon: "user", activeMenu: "/task" },
},
{
path: "taskAuditInfolishichakan",
component: () => import("@/views/auditPages/taskManagement/audit"),
name: "taskAuditInfolishichakan",
meta: { title: "资产提交记录", icon: "user", activeMenu: "/task" },
},
{
path: "unitAuth",
component: () => import("@/views/auditPages/unitManagement/index"),
name: "UnitAuth",
meta: { title: "新增单位", icon: "user", activeMenu: "/unit" },
},
{
path: "unitAssetsAuth",
component: () =>
import("@/views/auditPages/unitAutonomicFill/assetsAuth"),
name: "unitAssetsAuth",
meta: { title: "资产修改", icon: "user", activeMenu: "/unitFill" },
},
],
},
{
path: '/user',
path: "/user",
component: Layout,
hidden: true,
redirect: 'noredirect',
redirect: "noredirect",
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: { title: '个人中心', icon: 'user' }
path: "profile",
component: () => import("@/views/system/user/profile/index"),
name: "Profile",
meta: { title: "个人中心", icon: "user" },
},
]
],
},
]
];
// 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [
{
path: '/system/user-auth',
path: "/system/user-auth",
component: Layout,
hidden: true,
permissions: ['system:user:edit'],
permissions: ["system:user:edit"],
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
name: 'AuthRole',
meta: { title: '分配角色', activeMenu: '/system/user' }
}
]
path: "role/:userId(\\d+)",
component: () => import("@/views/system/user/authRole"),
name: "AuthRole",
meta: { title: "分配角色", activeMenu: "/system/user" },
},
],
},
{
path: '/system/role-auth',
path: "/system/role-auth",
component: Layout,
hidden: true,
permissions: ['system:role:edit'],
permissions: ["system:role:edit"],
children: [
{
path: 'user/:roleId(\\d+)',
component: () => import('@/views/system/role/authUser'),
name: 'AuthUser',
meta: { title: '分配用户', activeMenu: '/system/role' }
}
]
path: "user/:roleId(\\d+)",
component: () => import("@/views/system/role/authUser"),
name: "AuthUser",
meta: { title: "分配用户", activeMenu: "/system/role" },
},
],
},
{
path: '/system/dict-data',
path: "/system/dict-data",
component: Layout,
hidden: true,
permissions: ['system:dict:list'],
permissions: ["system:dict:list"],
children: [
{
path: 'index/:dictId(\\d+)',
component: () => import('@/views/system/dict/data'),
name: 'Data',
meta: { title: '字典数据', activeMenu: '/system/dict' }
}
]
path: "index/:dictId(\\d+)",
component: () => import("@/views/system/dict/data"),
name: "Data",
meta: { title: "字典数据", activeMenu: "/system/dict" },
},
],
},
{
path: '/monitor/job-log',
path: "/monitor/job-log",
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
permissions: ["monitor:job:list"],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: { title: '调度日志', activeMenu: '/monitor/job' }
}
]
path: "index/:jobId(\\d+)",
component: () => import("@/views/monitor/job/log"),
name: "JobLog",
meta: { title: "调度日志", activeMenu: "/monitor/job" },
},
],
},
{
path: '/tool/gen-edit',
path: "/tool/gen-edit",
component: Layout,
hidden: true,
permissions: ['tool:gen:edit'],
permissions: ["tool:gen:edit"],
children: [
{
path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit',
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
}
]
}
]
path: "index/:tableId(\\d+)",
component: () => import("@/views/tool/gen/editTable"),
name: "GenEdit",
meta: { title: "修改生成配置", activeMenu: "/tool/gen" },
},
],
},
];
// 创建路由
const router = createRouter({
history: createWebHashHistory(),
scrollBehavior: () => ({ top: 0 }),
routes: constantRoutes
})
routes: constantRoutes,
});
// 防止连续点击多次路由报错的方法在Vue Router 4中不再需要
// 因为它已经内置处理了这种情况
export default router
export default router;

@ -0,0 +1,4 @@
const getters = {
crumbs: (state) => state.permission.crumbs,
}
export default getters

@ -1,151 +1,143 @@
import { defineStore } from 'pinia'
import auth from '@/plugins/auth'
import router, { constantRoutes, dynamicRoutes } from '@/router'
import { getRouters } from '@/api/menu'
import Layout from '@/layout/index'
import ParentView from '@/components/ParentView'
import InnerLink from '@/layout/components/InnerLink'
import auth from "@/plugins/auth";
import router, { constantRoutes, dynamicRoutes } from "@/router";
import { getRouters } from "@/api/menu";
import Layout from "@/layout/index";
import ParentView from "@/components/ParentView";
import InnerLink from "@/layout/components/InnerLink";
// 匹配views里面所有的.vue文件
const modules = import.meta.glob('@/views/**/*.vue')
const modules = import.meta.glob("./../../views/**/*.vue");
// 动态路由遍历,验证是否具备权限
const filterDynamicRoutes = (routes) => {
const res = []
routes.forEach(route => {
if (route.permissions) {
if (auth.hasPermiOr(route.permissions)) {
res.push(route)
}
} else if (route.roles) {
if (auth.hasRoleOr(route.roles)) {
res.push(route)
}
}
})
return res
}
const usePermissionStore = defineStore("permission", {
state: () => ({
routes: [],
addRoutes: [],
defaultRoutes: [],
topbarRouters: [],
sidebarRouters: [],
crumbs:"",
}),
actions: {
setCrumbs(crumbs){
this.crumbs = crumbs
},
setRoutes(routes) {
this.addRoutes = routes;
this.routes = constantRoutes.concat(routes);
},
setDefaultRoutes(routes) {
this.defaultRoutes = constantRoutes.concat(routes);
},
setTopbarRoutes(routes) {
this.topbarRouters = routes;
},
setSidebarRouters(routes) {
this.sidebarRouters = routes;
},
generateRoutes(roles) {
return new Promise((resolve) => {
// 向后端请求路由数据
getRouters().then((res) => {
console.log(res);
const sdata = JSON.parse(JSON.stringify(res.data));
const rdata = JSON.parse(JSON.stringify(res.data));
const defaultData = JSON.parse(JSON.stringify(res.data));
const sidebarRoutes = filterAsyncRouter(sdata);
const rewriteRoutes = filterAsyncRouter(rdata, false, true);
const defaultRoutes = filterAsyncRouter(defaultData);
const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
asyncRoutes.forEach((route) => {
router.addRoute(route);
});
this.setRoutes(rewriteRoutes);
this.setSidebarRouters(constantRoutes.concat(sidebarRoutes));
this.setDefaultRoutes(sidebarRoutes);
this.setTopbarRoutes(defaultRoutes);
console.log(rewriteRoutes);
resolve(rewriteRoutes);
});
});
},
},
});
// 遍历后台传来的路由字符串,转换为组件对象
const filterAsyncRouter = (asyncRouterMap, lastRouter = false, type = false) => {
return asyncRouterMap.filter(route => {
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
return asyncRouterMap.filter((route) => {
if (type && route.children) {
route.children = filterChildren(route.children)
route.children = filterChildren(route.children);
}
if (extractPrefix(route.path)) {
route.meta.activeMenu = extractPrefix(route.path);
}
if (route.component) {
// Layout ParentView 组件特殊处理
if (route.component === 'Layout') {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
} else if (route.component === 'InnerLink') {
route.component = InnerLink
if (route.component === "Layout") {
route.component = Layout;
} else if (route.component === "ParentView") {
route.component = ParentView;
} else if (route.component === "InnerLink") {
route.component = InnerLink;
} else {
route.component = loadView(route.component)
route.component = loadView(route.component);
}
}
if (route.children != null && route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, route, type)
route.children = filterAsyncRouter(route.children, route, type);
} else {
delete route['children']
delete route['redirect']
delete route["children"];
delete route["redirect"];
}
return true
})
return true;
});
}
const filterChildren = (childrenMap, lastRouter = false) => {
const children = []
childrenMap.forEach(el => {
el.path = lastRouter ? lastRouter.path + '/' + el.path : el.path
if (el.children && el.children.length && el.component === 'ParentView') {
children.push(...filterChildren(el.children, el))
function extractPrefix(str) {
const pattern = /(.+?)(-info|-add|-edit)/;
const match = str.match(pattern);
if (match) {
return match[1];
}
return null;
}
function filterChildren(childrenMap, lastRouter = false) {
var children = [];
childrenMap.forEach((el) => {
el.path = lastRouter ? lastRouter.path + "/" + el.path : el.path;
if (el.children && el.children.length && el.component === "ParentView") {
children = children.concat(filterChildren(el.children, el));
} else {
children.push(el)
children.push(el);
}
})
return children
});
return children;
}
const loadView = (view) => {
let res
for (const path in modules) {
const dir = path.split('views/')[1].split('.vue')[0]
if (dir === view) {
res = modules[path]
// 动态路由遍历,验证是否具备权限
export function filterDynamicRoutes(routes) {
const res = [];
routes.forEach((route) => {
if (route.permissions) {
if (auth.hasPermiOr(route.permissions)) {
res.push(route);
}
} else if (route.roles) {
if (auth.hasRoleOr(route.roles)) {
res.push(route);
}
}
}
return res
});
return res;
}
export const usePermissionStore = defineStore('permission', {
state: () => ({
routes: [],
addRoutes: [],
defaultRoutes: [],
topbarRouters: [],
sidebarRouters: []
}),
getters: {
getRoutes: (state) => state.routes,
getAddRoutes: (state) => state.addRoutes,
getDefaultRoutes: (state) => state.defaultRoutes,
getTopbarRouters: (state) => state.topbarRouters,
getSidebarRouters: (state) => state.sidebarRouters
},
actions: {
// 设置路由
setRoutes(routes) {
this.addRoutes = routes
this.routes = constantRoutes.concat(routes)
},
// 设置默认路由
setDefaultRoutes(routes) {
this.defaultRoutes = constantRoutes.concat(routes)
},
// 设置顶部导航栏路由
setTopbarRoutes(routes) {
this.topbarRouters = routes
},
// 设置侧边栏路由
setSidebarRouters(routes) {
this.sidebarRouters = routes
},
// 生成路由
async generateRoutes() {
try {
const res = await getRouters()
console.log(res)
const sdata = JSON.parse(JSON.stringify(res.data))
const rdata = JSON.parse(JSON.stringify(res.data))
const defaultData = JSON.parse(JSON.stringify(res.data))
const sidebarRoutes = filterAsyncRouter(sdata)
const rewriteRoutes = filterAsyncRouter(rdata, false, true)
const defaultRoutes = filterAsyncRouter(defaultData)
const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
// 添加动态路由
asyncRoutes.forEach(route => {
router.addRoute(route)
})
console.log(rewriteRoutes)
this.setRoutes(rewriteRoutes)
this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
this.setDefaultRoutes(sidebarRoutes)
this.setTopbarRoutes(defaultRoutes)
return rewriteRoutes
} catch (error) {
console.error('生成路由出错:', error)
return []
}
export const loadView = (view) => {
let res;
for (const path in modules) {
const dir = path.split("views/")[1].split(".vue")[0];
if (dir === view) {
res = () => modules[path]();
}
}
})
return res;
};
export default usePermissionStore;

@ -6,7 +6,7 @@
<assetsTypeFive :pageType="route.query.pageType" :id="route.query.id" :queryData="route.query.queryData" v-else-if="route.query.type == 4" />
</template>
<script setup>
<script setup name="assetsAuth">
import { onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
// web

@ -388,7 +388,8 @@ const goInfo = (row, id) => {
type: 0,
id: row.id,
queryData: formInline,
}
},
meta: { title: '新增资产', icon: 'user', activeMenu: "/assetsManage/program" }
})
} else if(id === 2) {
router.push({
@ -421,7 +422,6 @@ const tableRowClassName = ({rowIndex}) => {
return ''
}
//
const cancalDebounce = () => {
const element = document.getElementById('L-size-main')
const header = document.getElementById('L-header')

@ -552,7 +552,7 @@ function goInfo(row, id) {
console.log(formInline.value,'row')
if (id === 1) {
router.push({
name: "AssetsAuth",
name: "assetsType1",
query: {
pageType: "look",
type: 1,

@ -4511,7 +4511,7 @@
</div>
</div>
</template>
<script>
<script name="assetsType">
import pcas from "@/utils/pca-code.json";
import myUpload from "@/views/components/myUpload/index.vue";
import {

@ -388,9 +388,9 @@
</div>
</div>
</template>
<script setup>
<script setup name="assetsType1">
import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { useRouter, useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
import {
assetMiniPrograms,
@ -399,11 +399,46 @@ import {
} from "@/api/auditPagesApi/index"
import equalToPassword from "@/views/components/assetsType/mainx.js"
import { useDict } from '@/utils/dict'
import { computed } from 'vue'
const props = defineProps({
pageType: String,
id: [String, Number],
queryData: Object
pageType: {
type: String,
default: ''
},
id: {
type: [String, Number],
default: ''
},
type: {
type: [String, Number],
default: 1
},
queryData: {
type: Object,
default: () => ({
dwmc: '',
xcxmc: '',
startTime: '',
endTime: '',
current: 1,
size: 20
})
}
})
// 使 route
const route = useRoute()
const pageType = computed(() => route.query.pageType || props.pageType)
const id = computed(() => route.query.id || props.id)
const type = computed(() => route.query.type || props.type)
const queryData = computed(() => {
if (route.query.queryData) {
return typeof route.query.queryData === 'string'
? JSON.parse(route.query.queryData)
: route.query.queryData
}
return props.queryData
})
const router = useRouter()

@ -629,7 +629,7 @@
</div>
</div>
</template>
<script setup>
<script setup name="assetsType2">
import { ref, reactive, onMounted, getCurrentInstance, nextTick } from "vue";
import { useRouter } from "vue-router";
import {

@ -362,7 +362,7 @@
</div>
</template>
<script setup>
<script setup name="assetsType3">
import { ref, onMounted, nextTick } from "vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";

@ -349,7 +349,7 @@
</div>
</template>
<script setup>
<script setup name="assetsType4">
import { ref, onMounted, nextTick } from "vue";
import { useRouter } from "vue-router";
import { ElMessage } from "element-plus";

Loading…
Cancel
Save