Skip to content

Commit

Permalink
feat(menu): the route is automatically mapped to the menu
Browse files Browse the repository at this point in the history
  • Loading branch information
anncwb committed Jun 27, 2021
1 parent 327d71b commit 913c22c
Show file tree
Hide file tree
Showing 40 changed files with 159 additions and 889 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.zh_CN.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
## Wip

### ⚡ Performance Improvements

- **Icon** 移除 Icon 组件全局注册,防止特定情况下热更新问题

### ✨ Features

- **Menu** 新增 `permissionMode=PermissionModeEnum.ROUTE_MAPPING`模式
- 项目默认改为该模式,删除原有菜单文件
- 如果之前已经写好了菜单,可以更改为`PermissionModeEnum.ROLE`模式即可

## 2.5.1(2021-06-26)

### ⚡ Performance Improvements
Expand Down
2 changes: 2 additions & 0 deletions src/enums/appEnum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ export enum PermissionModeEnum {
ROLE = 'ROLE',
// black
BACK = 'BACK',
// route mapping
ROUTE_MAPPING = 'ROUTE_MAPPING',
}

// Route switching animation
Expand Down
8 changes: 4 additions & 4 deletions src/hooks/web/usePermission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export function usePermission() {
appStore.setProjectConfig({
permissionMode:
projectSetting.permissionMode === PermissionModeEnum.BACK
? PermissionModeEnum.ROLE
? PermissionModeEnum.ROUTE_MAPPING
: PermissionModeEnum.BACK,
});
location.reload();
Expand Down Expand Up @@ -59,7 +59,7 @@ export function usePermission() {
function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
const permMode = projectSetting.permissionMode;

if (PermissionModeEnum.ROLE === permMode) {
if (PermissionModeEnum.ROUTE_MAPPING === permMode) {
// Visible by default
if (!value) {
return def;
Expand Down Expand Up @@ -89,9 +89,9 @@ export function usePermission() {
* @param roles
*/
async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
if (projectSetting.permissionMode !== PermissionModeEnum.ROLE) {
if (projectSetting.permissionMode !== PermissionModeEnum.ROUTE_MAPPING) {
throw new Error(
'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!'
'Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!'
);
}

Expand Down
4 changes: 2 additions & 2 deletions src/layouts/default/feature/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useDesign } from '/@/hooks/web/useDesign';
import { useUserStoreWidthOut } from '/@/store/modules/user';
import { useUserStoreWithOut } from '/@/store/modules/user';
import { SettingButtonPositionEnum } from '/@/enums/appEnum';
import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
Expand All @@ -22,7 +22,7 @@
setup() {
const { getUseOpenBackTop, getShowSettingButton, getSettingButtonPosition, getFullContent } =
useRootSetting();
const userStore = useUserStoreWidthOut();
const userStore = useUserStoreWithOut();
const { prefixCls } = useDesign('setting-drawer-fearure');
const { getShowHeader } = useHeaderSetting();
Expand Down
8 changes: 4 additions & 4 deletions src/router/guard/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Router, RouteLocationNormalized } from 'vue-router';
import { useAppStoreWidthOut } from '/@/store/modules/app';
import { useUserStoreWidthOut } from '/@/store/modules/user';
import { useAppStoreWithOut } from '/@/store/modules/app';
import { useUserStoreWithOut } from '/@/store/modules/user';
import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel';
import { Modal, notification } from 'ant-design-vue';
Expand Down Expand Up @@ -46,8 +46,8 @@ function createPageGuard(router: Router) {

// Used to handle page loading status
function createPageLoadingGuard(router: Router) {
const userStore = useUserStoreWidthOut();
const appStore = useAppStoreWidthOut();
const userStore = useUserStoreWithOut();
const appStore = useAppStoreWithOut();
const { getOpenPageLoading } = useTransitionSetting();
router.beforeEach(async (to) => {
if (!userStore.getToken) {
Expand Down
8 changes: 4 additions & 4 deletions src/router/guard/permissionGuard.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type { Router, RouteRecordRaw } from 'vue-router';

import { usePermissionStoreWidthOut } from '/@/store/modules/permission';
import { usePermissionStoreWithOut } from '/@/store/modules/permission';

import { PageEnum } from '/@/enums/pageEnum';
import { useUserStoreWidthOut } from '/@/store/modules/user';
import { useUserStoreWithOut } from '/@/store/modules/user';

import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';

Expand All @@ -12,8 +12,8 @@ const LOGIN_PATH = PageEnum.BASE_LOGIN;
const whitePathList: PageEnum[] = [LOGIN_PATH];

export function createPermissionGuard(router: Router) {
const userStore = useUserStoreWidthOut();
const permissionStore = usePermissionStoreWidthOut();
const userStore = useUserStoreWithOut();
const permissionStore = usePermissionStoreWithOut();
router.beforeEach(async (to, from, next) => {
// Jump to the 404 page after processing the login
if (from.path === LOGIN_PATH && to.name === PAGE_NOT_FOUND_ROUTE.name) {
Expand Down
2 changes: 2 additions & 0 deletions src/router/helper/routeHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ function dynamicImport(

// Turn background objects into routing objects
export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModule[]): T[] {
console.log(routeList);

routeList.forEach((route) => {
const component = route.component as string;
if (component) {
Expand Down
55 changes: 40 additions & 15 deletions src/router/menus/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Menu, MenuModule } from '/@/router/types';
import type { RouteRecordNormalized } from 'vue-router';

import { useAppStoreWidthOut } from '/@/store/modules/app';
import { useAppStoreWithOut } from '/@/store/modules/app';
import { usePermissionStore } from '/@/store/modules/permission';
import { transformMenuModule, getAllParentPath } from '/@/router/helper/menuHelper';
import { filter } from '/@/utils/helper/treeHelper';
Expand All @@ -23,9 +23,21 @@ Object.keys(modules).forEach((key) => {
// ===========================
// ==========Helper===========
// ===========================

const getPermissionMode = () => {
const appStore = useAppStoreWithOut();
return appStore.getProjectConfig.permissionMode;
};
const isBackMode = () => {
const appStore = useAppStoreWidthOut();
return appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK;
return getPermissionMode() === PermissionModeEnum.BACK;
};

const isRouteMappingMode = () => {
return getPermissionMode() === PermissionModeEnum.ROUTE_MAPPING;
};

const isRoleMode = () => {
return getPermissionMode() === PermissionModeEnum.ROLE;
};

const staticMenus: Menu[] = [];
Expand All @@ -41,40 +53,53 @@ const staticMenus: Menu[] = [];

async function getAsyncMenus() {
const permissionStore = usePermissionStore();
return !isBackMode() ? staticMenus : permissionStore.getBackMenuList;
if (isBackMode()) {
return permissionStore.getBackMenuList;
}
if (isRouteMappingMode()) {
return permissionStore.getFrontMenuList.filter((item) => !item.hideMenu);
}
return staticMenus;
}

export const getMenus = async (): Promise<Menu[]> => {
const menus = await getAsyncMenus();
const routes = router.getRoutes();

return !isBackMode() ? filter(menus, basicFilter(routes)) : menus;
if (isRoleMode()) {
const routes = router.getRoutes();
return filter(menus, basicFilter(routes));
}
return menus;
};

export async function getCurrentParentPath(currentPath: string) {
const menus = await getAsyncMenus();

const allParentPath = await getAllParentPath(menus, currentPath);

return allParentPath?.[0];
}

// Get the level 1 menu, delete children
export async function getShallowMenus(): Promise<Menu[]> {
const menus = await getAsyncMenus();
const routes = router.getRoutes();
const shallowMenuList = menus.map((item) => ({ ...item, children: undefined }));
return !isBackMode() ? shallowMenuList.filter(basicFilter(routes)) : shallowMenuList;
if (isRoleMode()) {
const routes = router.getRoutes();
return shallowMenuList.filter(basicFilter(routes));
}
return shallowMenuList;
}

// Get the children of the menu
export async function getChildrenMenus(parentPath: string) {
const menus = await getMenus();
const parent = menus.find((item) => item.path === parentPath);
if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) return [] as Menu[];
const routes = router.getRoutes();

return !isBackMode() ? filter(parent.children, basicFilter(routes)) : parent.children;
if (!parent || !parent.children || !!parent?.meta?.hideChildrenInMenu) {
return [] as Menu[];
}
if (isRoleMode()) {
const routes = router.getRoutes();
return filter(parent.children, basicFilter(routes));
}
return parent.children;
}

function basicFilter(routes: RouteRecordNormalized[]) {
Expand Down
11 changes: 0 additions & 11 deletions src/router/menus/modules/about.ts

This file was deleted.

22 changes: 0 additions & 22 deletions src/router/menus/modules/dashboard.ts

This file was deleted.

45 changes: 0 additions & 45 deletions src/router/menus/modules/demo/charts.ts

This file was deleted.

Loading

0 comments on commit 913c22c

Please sign in to comment.