From 8f84f22e954dc978ddf01ac9804d9441def91fea Mon Sep 17 00:00:00 2001 From: cclu <1106109051@qq.com> Date: Wed, 26 Feb 2025 14:09:23 +0800 Subject: [PATCH] start --- .editorconfig | 16 + .eslintignore | 8 + .eslintrc.json | 124 + .gitignore | 14 + .husky/.gitignore | 1 + .husky/commit-msg | 7 + README-en_US.md | 201 + config/config.ts | 15 + config/proxy.ts | 8 + mock/user.ts | 259 + package.json | 33 + public/favicon.svg | 1 + public/logo.svg | 1 + src/assets/.gitkeep | 0 src/assets/login-bg.png | Bin 0 -> 141534 bytes src/assets/logo.svg | 37 + src/components/Access.tsx | 32 + src/components/Avatar/index.less | 18 + src/components/Avatar/index.tsx | 59 + src/components/Footer.tsx | 47 + src/components/LayoutWrapper.tsx | 96 + src/components/Nav/index.less | 24 + src/components/Nav/index.tsx | 43 + src/components/PageAccess.tsx | 48 + src/global.less | 7 + src/layouts/index.less | 56 + src/layouts/index.tsx | 346 + src/layouts/old.tsx | 156 + src/models/global.ts | 74 + src/models/user.ts | 263 + src/pages/404.tsx | 24 + src/pages/about/index.tsx | 12 + src/pages/about/m/authority.ts | 5 + src/pages/about/m/index.tsx | 24 + src/pages/about/u/$id.tsx | 14 + src/pages/about/u/index.tsx | 14 + src/pages/about/um/index.tsx | 14 + src/pages/authority.ts | 31 + src/pages/index.tsx | 22 + src/pages/teacher/m/index.tsx | 10 + src/pages/teacher/u/index.tsx | 10 + src/pages/teacher/um/index.tsx | 10 + src/pages/user/login/index.less | 168 + src/pages/user/login/index.tsx | 147 + src/services/user.ts | 48 + src/utils/handleGetCurrentLocation.ts | 34 + .../handleGetEachDatumFromNestedDataByKey.ts | 32 + .../handleGetIndexValidMenuItemByPath.ts | 25 + src/utils/handleGetRootSubmenuKeys.ts | 18 + src/utils/handleRecursiveNestedData.ts | 32 + src/utils/handleRedirect.ts | 69 + src/utils/request.ts | 73 + tsconfig.json | 39 + typings.d.ts | 162 + umi4-admin-main.zip | Bin 0 -> 284185 bytes yarn.lock | 11376 ++++++++++++++++ 56 files changed, 14407 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .husky/.gitignore create mode 100644 .husky/commit-msg create mode 100644 README-en_US.md create mode 100644 config/config.ts create mode 100644 config/proxy.ts create mode 100644 mock/user.ts create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/logo.svg create mode 100644 src/assets/.gitkeep create mode 100644 src/assets/login-bg.png create mode 100644 src/assets/logo.svg create mode 100644 src/components/Access.tsx create mode 100644 src/components/Avatar/index.less create mode 100644 src/components/Avatar/index.tsx create mode 100644 src/components/Footer.tsx create mode 100644 src/components/LayoutWrapper.tsx create mode 100644 src/components/Nav/index.less create mode 100644 src/components/Nav/index.tsx create mode 100644 src/components/PageAccess.tsx create mode 100644 src/global.less create mode 100644 src/layouts/index.less create mode 100644 src/layouts/index.tsx create mode 100644 src/layouts/old.tsx create mode 100644 src/models/global.ts create mode 100644 src/models/user.ts create mode 100644 src/pages/404.tsx create mode 100644 src/pages/about/index.tsx create mode 100644 src/pages/about/m/authority.ts create mode 100644 src/pages/about/m/index.tsx create mode 100644 src/pages/about/u/$id.tsx create mode 100644 src/pages/about/u/index.tsx create mode 100644 src/pages/about/um/index.tsx create mode 100644 src/pages/authority.ts create mode 100644 src/pages/index.tsx create mode 100644 src/pages/teacher/m/index.tsx create mode 100644 src/pages/teacher/u/index.tsx create mode 100644 src/pages/teacher/um/index.tsx create mode 100644 src/pages/user/login/index.less create mode 100644 src/pages/user/login/index.tsx create mode 100644 src/services/user.ts create mode 100644 src/utils/handleGetCurrentLocation.ts create mode 100644 src/utils/handleGetEachDatumFromNestedDataByKey.ts create mode 100644 src/utils/handleGetIndexValidMenuItemByPath.ts create mode 100644 src/utils/handleGetRootSubmenuKeys.ts create mode 100644 src/utils/handleRecursiveNestedData.ts create mode 100644 src/utils/handleRedirect.ts create mode 100644 src/utils/request.ts create mode 100644 tsconfig.json create mode 100644 typings.d.ts create mode 100644 umi4-admin-main.zip create mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7e3649a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9a071ec --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +/lambda/ +/scripts +/config +.history +public +dist +.umi +mock diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..efa949a --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,124 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "settings": { + "react": { + "version": "detect" + } + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:react/jsx-runtime", + "plugin:react-hooks/recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "react-hooks", + "@typescript-eslint" + ], + "rules": { + //原生eslint配置 + //规则文档: https://eslint.org/docs/latest/ + "indent": [ + "error", + 2, + { + "SwitchCase": 1, + "ignoredNodes": [ "ConditionalExpression" ] + } + ], + "linebreak-style": [ "error", "windows" ], + "quotes": [ "error", "single" ], + "semi": [ "error", "always" ], + "arrow-parens": [ "error", "always" ], + "array-bracket-spacing": [ + "error", + "always", + { + "singleValue": true, + "objectsInArrays": true, + "arraysInArrays": true + } + ], + "object-curly-spacing": [ + "error", + "always", + { + "arraysInObjects": true, + "objectsInObjects": true + } + ], + "no-lonely-if": "error", + "comma-dangle": [ + "error", + { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "always-multiline" + } + ], + "eol-last": [ "error", "always" ], + "no-multiple-empty-lines": [ + "error", + { + "max": 1, + "maxEOF": 0 + } + ], + "space-before-function-paren": [ + "error", + { + "named": "never", + "anonymous": "always", + "asyncArrow": "always" + } + ], + "keyword-spacing": [ + "error", + { + "before": true, + "after": true + } + ], + "space-before-blocks": "error", + //eslint-plugin-react配置 + //规则文档: https://github.com/jsx-eslint/eslint-plugin-react/tree/master/docs/rules + "react/sort-comp": [ 2 ], + "react/jsx-curly-newline": [ + "error", + { + "multiline": "consistent", + "singleline": "consistent" + } + ], + "react/jsx-max-props-per-line": [ + 2, + { + "maximum": 1, + "when": "always" + } + ], + "react/jsx-first-prop-new-line": [ + "error", + "multiline-multiprop" + ], + "react/self-closing-comp": [ + "error", + { + "component": true, + "html": true + } + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e81349 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/node_modules +/.env.local +/.umirc.local.ts +/config/config.local.ts +/src/.umi +/src/.umi-production +/src/.umi-test +/dist +.swc +*.md +!README.md +!README-en_US.md +*.log +.env diff --git a/.husky/.gitignore b/.husky/.gitignore new file mode 100644 index 0000000..31354ec --- /dev/null +++ b/.husky/.gitignore @@ -0,0 +1 @@ +_ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..d50cdcf --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,7 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +# Export Git hook params +export GIT_PARAMS=$* + +npx --no-install fabric verify-commit diff --git a/README-en_US.md b/README-en_US.md new file mode 100644 index 0000000..4916386 --- /dev/null +++ b/README-en_US.md @@ -0,0 +1,201 @@ +[简体中文](./README.md) | English + +The recommended `node` version is `18.14.2`, and the recommended `yarn` version is `1.22.x` + +> October 8, 2024: Today, all dependencies were updated to the latest versions. The Node.js version used is the most recent one, 20.18.0. If you encounter issues with installing dependencies or running the program using Node.js 18.14.2, you can try using 20.18.0, or attempt using other versions. + +# Overview + +A lightweight development framework built with [umi4](https://umijs.org/), integrated conventional routing, custom layout(including custom routing rendering), retrieve menu data from server side, and global state management and permission verification, newest pkg and the best development experience, clone to use + +# Git Work Flow +``` +Legal format of commit log were shown as bellow(emoji and module are optional): + +[] [revert: ?][(scope)?]: + +💥 feat(module): added a great feature +🐛 fix(module): fixed some bugs +📝 docs(module): updated the documentation +🌷 UI(module): modified the style +🏰 chore(module): made some changes to the scaffold +🌐 locale(module): made some small contributions to i18n + +Other commit types: refactor, perf, workflow, build, CI, typos, tests, types, wip, release, dep +``` + +# Mock +Built in `mock service`, start development even backend is not ready~~they always do that~~ + +## Interface Response Format +``` +/** + * response body + * @description data + * @description code 0 success, other failure + * @description message + */ +type ResponstBody = { + data: T; + code: number; + message: string; +}; +``` +This is a common response format, it's suit for most developer, and i choose it as a conventional response format + +# Proxy +Nothing much to say, `proxy` is nessary for morden web app development + +# Environment Variable +Custom environment variable should start with `UMI_APP_`, and write to `.env` file, so we can visit it via `process.env.UMI_APP_xxx` + +Should i commmit `.env` file to my `git` repository? good question, refer to these 2 articles: + +[Should I commit my .env file?](https://github.com/motdotla/dotenv#should-i-commit-my-env-file) + +[Should I have multiple .env files?](https://github.com/motdotla/dotenv#should-i-have-multiple-env-files) + +I agree not to commit the `.env` file to the repo and to have only one `.env` file, cuz the config in it is not safe for commit to repo, additionally, each environment has different config, we can share `.env` file separately with ohter collaborators via email or IM sorftware if we need to collaborate on development + +In other words: one `.env` file on the developer's computer for development, and one `.env` file on the test server and one on the online server for testing and production packaging respectively. + +# Route +Conventional routing. And which specific route is valid is depends on the data returned from menu interface, the data returned from menu interface will be displayed in the left menu bar. While a route(menu data) has been returned by an interface, it's considered valid since it's provided by the interface. However, due to the use of conventional routing, the route will be rendered correctlly only when it has been created in the project directory + +Additionally, the route of login page doesn't need to be returned by menu interface(otherwise it will displayed in the left menu bar), it doesn't use route-based logic to determine it's location (cuz it's not returned by the menu interface). The specific routing and redirection logic can be viewed in `/src/utils/handleRedirect.ts` + +# Menu +The menu is returned by server side, and stored in global state, the format of return data should like this: [ItemType](https://ant.design/components/menu#itemtype) which can be consumed by[Menu](https://ant.design/components/menu), and don't include `access` field any more. The menu data of current user is what can be accessed by current user, but not all operations within the page may be accessible to the current user. Page authentication mainly prevents the current user from opening other users' routes (such as opening bookmarks saved by other users). The permission content will be described later, and the `ts` definition for the menu is as bellow: +``` +/** + * @description id Data's id + + * @description pid Data's parent id + + * @description key The unique identifier of the menu item, use `string` type instead `React.Key`: + https://ant.design/components/menu-cn#itemtype, + otherwise there may be a problem where the menu item can't be selected due to an incorrect key type + + * @description lable Menu's title + + * @description hideInMenu Should hidden in menu bar or not + + * @description path Route path, each menu will have this field whether it has `children` field or not, + for menus without `children` field, it will redirect to this value, while for menus with `children` field, + it will redirect to `redirect` field. Cuz having `children` field which means this menu is expandable, + at this time, the `path` with `children` only represents it's position, rather than a truly valid route + + * @description redirect Redirect route path, only the menu which has `children` field has this field, + when selectable menu whithin the `children` field of this menu, this value will be the + 1st selectable menu's `path`, when there are no selectable menu in `children` field of this menu, + but still have `children` field, the value is the path of the first selectable menu item in its + children's children, that's say no matter how, this value is always the 1st valid route, + check menu data in the mock data out for specifics. Also, this field should be an optional field + theoretically, however, in order to make it easier for the backend to process, it's written as a + fixed field over here, in data where this field is not necessary, the backend can return an + empty string + + * @description children Sub menu + */ +type MenuItem = { + id: number; + pid?: number; + key: string; + path: string; + redirect: string; + hideInMenu?: boolean; + label: React.ReactElement | string; + children?: MenuItem[]; +} +``` + +# Layout +Abandoned the default `/src/app.tsx` layout and switched to using a custom layout: `/src/layouts/index.tsx` + +## Implement Custom Rendering In Custom Layout +`/src/layouts/index.tsx` won't disturb the login page, beside: when user is login already, if user access login page again at this time(e.g. user manually enter the login page or access it through a bookmark) it will be redirected to a non-login page(if there is a `redirect` field then redirect to `redirect`, or redirect to index page), check this file out for specific codes: `/src/components/LayoutWrapper.tsx` + +# Page Title +Using `umi4`'s global `title` config, each page's `location` info and menu data returned from interface implemented dynamic page title for each page, check this out for details: `/src/components/LayoutWrapper.tsx` + +# Data Flow(State Management) +Using [dva](https://dvajs.com/) instead of `initial-state` of `umi4` ~~i won't tell u that it's because i abandoed the default `/src/app.tsx` layout, which resulted in the inability to use `initial-state` and `dva` is the only `react` state management solution i know how to use ;)~~ and we can consider combining [dva_umi4](https://umijs.org/docs/max/dva) and [@umijs/plugin-dva](https://v3.umijs.org/plugins/plugin-dva) together + +# Request +The request lib is [axios](https://github.com/axios/axios) of course, and the structure of request codes are as bellow: +``` +//... +. +├── src +│ ├── layouts +│ │ ├── index.tsx +│ │ ├── index.less +│ ├── services +│ │ └── user.ts +│ ├── pages +│ │ ├── index.tsx +│ │ ├── index.less +│ │ ├── pageA +│ │ │ └── index.tsx +│ │ │ └── index.less +│ │ │ ├── services.ts +//... +``` +The request codes for `pageA` are all in `serveces.ts` + +# Permission +``` +/** + * Page permission type + * @description key is route's path, value is permisson array + */ +type PageAuthority = { + [path: string]: string[]; +} +``` + +``` +/** + * permission type for elements within a page + * @description key is permission name, value is a specific permission string + */ +type Authority = { + [key: string]: string; +} +``` + +The details of permission logic: + + 1. page permission(for entire page): `/src/components/PageAccess.tsx` + 1. have permission: render page normally(`children`) + 2. don't have permission: return[result_antd](https://ant.design/components/result-cn)component's[403](https://ant.design/components/result-cn#components-result-demo-403)result + +The processing of page authorization has been placed in `/src/layouts/index.tsx`, cuz this component is the parent of all pages that require authorization processing, making it the most suitable location for handing this + + 2. page internal(for certain elements in the page): `/src/components/Access.tsx` + 1. have permission: render elements normally(`children`) + 2. don't have permission: + 1. dont't have `fallback`: render nothing + 2. have `fallback`: render `fallback` + +The processing of certain elements's permission in the page requires using the `` component to be separately processed in each individual page + +Both the user info and user permission returned by backend after login are stored in global state, which is `dva` + +# Lint +This part refer to [12 essential ESLint rules for React](https://blog.logrocket.com/12-essential-eslint-rules-react/), and i have made some additional configurations as well: +``` +"editor.codeActionsOnSave": { + "source.fixAll.eslint": true +} +``` +And the shortcut config of course: +``` +{ + "key": "alt+f", + "command": "eslint.executeAutofix" +} +``` +For me, this can imporve experience of programming greatly, i think it should be the same for you all, so i recommend everyone to config it this way + +***Finally, happy hacking my friend ;)*** diff --git a/config/config.ts b/config/config.ts new file mode 100644 index 0000000..5dd89ca --- /dev/null +++ b/config/config.ts @@ -0,0 +1,15 @@ +// import { defineConfig } from "umi"; +// import proxy from './proxy'; + +//不使用defineConfig则能在其他地方获取这些配置 +export default { + plugins: [ + '@umijs/plugins/dist/dva' + ], + // proxy, + dva: {}, + title: 'UMI4 Admin', + favicons: [ + '/favicon.svg' + ] +}; diff --git a/config/proxy.ts b/config/proxy.ts new file mode 100644 index 0000000..91fdb9d --- /dev/null +++ b/config/proxy.ts @@ -0,0 +1,8 @@ +const proxy = { + '/api': { + target: 'https://preview.pro.ant.design', + changeOrigin: true + } +} + +export default proxy; diff --git a/mock/user.ts b/mock/user.ts new file mode 100644 index 0000000..c9de08c --- /dev/null +++ b/mock/user.ts @@ -0,0 +1,259 @@ +import type { Request, Response } from 'express'; + +const waitTime = (time: number = 100) => ( + new Promise((resolve) => { + setTimeout( + () => { + resolve(true); + }, + time + ) + }) +); + +const handleCommonRes = (data: Record | Record[], code = 0) => ({ + data, + code, + message: !code ? '成功' : '失败' +}); + +const userApi = { + //登录 + 'POST /api/user/login': async (req: Request, res: Response) => { + console.log('req', req); + console.log('res', res); + + return + + const { password, username, mobile, captcha } = req.body; + await waitTime(2000); + + switch (true) { + case username === 'admin' && password === 'ant.design': + case username === 'user' && password === 'ant.design': + case /^1\d{10}$/.test(mobile) && Boolean(captcha): + res.send( + handleCommonRes({ + token: 'Bearer xxx' + }) + ); + return; + } + + res.send( + handleCommonRes( + { + token: 'Wrong Bearer' + }, + 10001 + ) + ); + }, + //用户信息 + 'GET /api/user/info': async (req: Request, res: Response) => { + await waitTime(2000); + + if (!req.headers.authorization) { + res.status(401).send(); + return; + } + + res.send( + handleCommonRes({ + name: 'Serati Ma', + avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png', + userid: '00000001', + email: 'antdesign@alipay.com', + signature: '海纳百川,有容乃大', + title: '交互专家', + group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED', + tags: [ + { + key: '0', + label: '很有想法的', + }, + { + key: '1', + label: '专注设计', + }, + { + key: '2', + label: '辣~', + }, + { + key: '3', + label: '大长腿', + }, + { + key: '4', + label: '川妹子', + }, + { + key: '5', + label: '海纳百川', + }, + ], + notifyCount: 12, + unreadCount: 11, + country: 'China', + geographic: { + province: { + label: '浙江省', + key: '330000', + }, + city: { + label: '杭州市', + key: '330100', + }, + }, + address: '西湖区工专路 77 号', + phone: '0752-268888888', + }) + ); + }, + //用户权限 + 'GET /api/user/authority': async (req: Request, res: Response) => { + await waitTime(1500); + + res.send( + handleCommonRes({ + authority: [ + '/', + '/about/u/1', + '/about/u/2', + '/about/m', + '/about/um', + '/teacher/u', + '/teacher/m', + '/teacher/um', + '/student', + '/about/m/update' + ] + }) + ); + }, + //菜单 + 'GET /api/user/menu': async (req: Request, res: Response) => { + await waitTime(1000); + + res.send( + handleCommonRes([ + { + id: 1, + key: '1', + path: '/', + redirect: '', + name: '首页' + }, + { + id: 2, + key: '2', + name: '关于', + path: '/about', + redirect: '/about/m', + children: [ + { + id: 21, + key: '2-1', + name: '关于你', + path: '/about/u', + redirect: '/about/u/1', + pid: 2, + children: [ + { + id: 211, + key: '2-1-1', + name: '关于你1', + path: '/about/u/1', + redirect: '', + pid: 21 + }, + { + id: 212, + key: '2-1-2', + name: '关于你2', + path: '/about/u/2', + redirect: '', + pid: 21 + } + ] + }, + { + id: 22, + key: '2-2', + path: '/about/m', + redirect: '', + name: '(页面元素权限)关于我', + pid: 2 + }, + { + id: 23, + key: '2-3', + path: '/about/um', + redirect: '', + name: '关于你和我', + pid: 2 + } + ] + }, + { + id: 3, + key: '3', + name: '教师', + path: '/teacher', + redirect: '/teacher/u', + children: [ + { + id: 31, + key: '3-1', + path: '/teacher/u', + redirect: '', + name: '(403)关于你教师', + pid: 3 + }, + { + id: 32, + key: '3-2', + path: '/teacher/m', + redirect: '', + name: '关于我教师', + pid: 3 + }, + { + id: 33, + key: '3-3', + path: '/teacher/um', + redirect: '', + name: '关于你和我教师', + pid: 3 + } + ] + }, + { + id: 4, + key: '4', + name: '(404)学生', + path: '/student', + redirect: '', + } + ]) + ); + }, + //登出 + 'POST /api/user/logout': (req: Request, res: Response) => { + res.send( + handleCommonRes({}) + ); + }, + //验证码 + 'GET /api/user/captcha': async (req: Request, res: Response) => { + await waitTime(2000); + return res.send( + handleCommonRes({ + captcha: 'captcha-xxx' + }) + ); + } +}; + +export default userApi; diff --git a/package.json b/package.json new file mode 100644 index 0000000..c3e95eb --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "private": true, + "author": "小镇靓仔 ", + "scripts": { + "dev": "umi dev", + "build": "umi build", + "setup": "umi setup", + "postinstall": "umi setup", + "prepare": "husky" + }, + "dependencies": { + "@ant-design/icons": "^5.5.1", + "@ant-design/pro-components": "^2.8.6", + "antd": "^5.21.2", + "axios": "^1.7.7", + "dva": "^3.0.0-alpha.1", + "umi": "^4.3.24" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "@types/react": "^18.3.11", + "@types/react-dom": "^18.3.0", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@umijs/fabric": "^4.0.1", + "@umijs/plugins": "^4.3.24", + "eslint": "^9.21.0", + "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react-hooks": "^4.6.2", + "husky": "^9.1.6", + "typescript": "^5.6.2" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..e7f6c1b --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..29e29c6 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1 @@ +Group 28 Copy 5Created with Sketch. diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/login-bg.png b/src/assets/login-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9e3954050b280d2be5d7e4a80415d881f7561a GIT binary patch literal 141534 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
+
+ {/*
+ + logo +

UMI4 Admin

+ +
*/} +
+
+ +
+
+ ); +}; + +export default Nav; diff --git a/src/components/PageAccess.tsx b/src/components/PageAccess.tsx new file mode 100644 index 0000000..7a7dfc6 --- /dev/null +++ b/src/components/PageAccess.tsx @@ -0,0 +1,48 @@ +import type { FC, ReactElement } from 'react'; +import { connect, history, useLocation } from 'umi'; +import { Button, Result } from 'antd'; +import authority from '@/pages/authority'; +import type { UserConnectedProps } from '@/models/user'; + +type Props = { + children: ReactElement; +} & UserConnectedProps; + +//处理页面权限的组件, 放置在所有需要鉴权的页面的最外层 +const PageAccess: FC = (props): ReactElement | null => { + const { user, children } = props; + const { authority: userAuthority } = user; + const { pathname } = useLocation(); + //可选操作符用来处理子路由跳转的情形, 因为这里的权限都是有效路由的权限, + //当遇到输入的是菜单组件中可展开的节点的path的时候就没有权限了, 此时可能会报错, + //加可选操作符可避免这个报错导致的页面渲染问题 + const accessible = authority[pathname]?.some((item: string) => userAuthority.includes(item)); + + let res = children; + + if (!accessible) { + res = ( + history.push('/') + } + >返回首页 + )} + /> + ); + } + + return res; +}; + +export default connect( + ({ user }: { user: UserConnectedProps['user'] }) => ({ + user, + }), +)(PageAccess); diff --git a/src/global.less b/src/global.less new file mode 100644 index 0000000..7c45d66 --- /dev/null +++ b/src/global.less @@ -0,0 +1,7 @@ +html,body{ + padding: 0; + margin: 0; +} +*{ + box-sizing: border-box; +} diff --git a/src/layouts/index.less b/src/layouts/index.less new file mode 100644 index 0000000..2c1df36 --- /dev/null +++ b/src/layouts/index.less @@ -0,0 +1,56 @@ +.proLayoutBox{ + .ant-layout{ + .ant-layout-sider{ + background-color: #021529; + .ant-layout-sider-children{ + padding: 0; + .ant-pro-sider-logo{ + display: flex; + align-items: center; + a{ + display: block; + h1{ + color: #fff; + font-weight: 600; + font-size: 18px; + line-height: 32px; + vertical-align: none; + margin-left: 12px; + } + } + } + } + + .ant-layout-sider-children{ + .ant-pro-sider-extra{ + margin: 0; + .ant-layout{ + ul{ + li{ + span{ + font-size: 14px; + color: #ffffffA6; + } + i{ + font-size: 14px; + color: #ffffffA6; + } + } + } + } + } + } + } + } + + + + + + .ant-pro-layout-container{ + background-color: #f0f2f5; + main{ + padding: 0; + } + } +} \ No newline at end of file diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx new file mode 100644 index 0000000..f98ed10 --- /dev/null +++ b/src/layouts/index.tsx @@ -0,0 +1,346 @@ +import type { FC } from 'react'; +import { useState, useEffect } from 'react'; +import { Dropdown, Layout, Menu, Tabs, Tooltip } from 'antd'; +import type { MenuProps } from 'antd'; +import { Outlet, Link, useLocation, connect } from 'umi'; +import PageAccess from '@/components/PageAccess'; +import type { UserConnectedProps, UserModelState } from '@/models/user'; +import LayoutWrapper from '@/components/LayoutWrapper'; +import Nav from '@/components/Nav'; +import Page404 from '@/pages/404'; +import handleRecursiveNestedData from '@/utils/handleRecursiveNestedData'; +import handleGetCurrentLocation from '@/utils/handleGetCurrentLocation'; +import { MenuDataItem, ProLayout } from '@ant-design/pro-components'; +import './index.less' +import logo from '../assets/logo.svg'; +import Icon, { DoubleRightOutlined, SmileOutlined } from '@ant-design/icons'; +import { ProfileModelState } from '@/models/global'; +import React from 'react'; + +const { Header, Content } = Layout; +/** + * 获取openKeys的方法 + * @param currentLocation 当前位置, 由handleGetCurrentLocation方法返回 + * @returns openKeys + */ +const handleGetOpenKeys = (currentLocation: API.MenuItem[] | []): string[] => { + //currentLocation为空 + if (!currentLocation.length) return ['']; + + //currentLocation只有一项 + if (currentLocation.length === 1) { + return currentLocation.map((item: API.MenuItem) => `${item.key}`); + } + + const res = []; + + //currentLocation有多项, 只要前n-1项 + for (let i = 0; i < currentLocation.length - 1; i++) { + res.push(`${currentLocation[i].key}`); + } + + return res; +}; + +//自定义的layout页面, 顶部导航通栏+侧边栏(菜单)布局, 可根据需要做调整 +const BasicLayout: FC<{ user: UserModelState, global: ProfileModelState, dispatch: any }> = (props) => { + const [collapsed, setCollapsed] = useState(false); + const [openKeys, setOpenKeys] = useState(['']); + const { pathname } = useLocation(); + const { + dispatch, + user: { + menu, rootSubmenuKeys, indexAllMenuItemById, + indexValidMenuItemByPath + }, + global: { + + } + } = props; + + console.log('props', props); + + + const validMenuItem = indexValidMenuItemByPath[pathname]; + const selectedKeys = validMenuItem?.key; + + useEffect( + () => { + //每次页面重新渲染都要设置openKeys + setOpenKeys( + handleGetOpenKeys( + handleGetCurrentLocation(indexValidMenuItemByPath[pathname], indexAllMenuItemById), + ), + ); + }, + [pathname, indexAllMenuItemById, indexValidMenuItemByPath], + ); + + //Menu中的selectedKeys和openKeys不是一回事: + //openKeys: + //当前展开的SubMenu菜单项key数组, 有子菜单的父菜单, 当selectedKeys为没子菜单的父菜单时该值应该设为[''], + //也就是关闭所有有子菜单的父菜单; + //selectedKeys: + //当前选中的菜单项key数组, 有子菜单则是子菜单(叶子节点), 没有子菜单则是父菜单(一级菜单), 始终是可选中的 + + //点击有子菜单的父菜单的回调 + // const onOpenChange: MenuProps['onOpenChange'] = (keys) => { + // setOpenKeys(keys) + // console.log('keys', keys); + // dispatch({ + // namespace: "global/setProfileData", + // payload: { + // keys + // } + // }) + // }; + + //所有MenuItem: + //有children的: 一定都有path, lable不动, children下的label修改为 + //无children的: 有path的label修改为, 没path的label不动 + const consumableMenu = handleRecursiveNestedData( + menu, + (item: API.MenuItem) => ({ + ...item, + name: item.path + ? ( + {item.name} + ) + : item.name, + }), + ); + // const consumableMenu: MenuDataItem[] = [ + // { + // path: '/', + // name: 'Dashboard', + // icon: , + // }, + // { + // path: '/about', + // name: 'Users', + // icon: , + // children: [ + // { + // path: '/about/u', + // name: 'User List', + // }, + // { + // path: '/about/m', + // name: 'User Profile', + // }, + // ], + // }, + // ]; + console.log('consumableMenu', consumableMenu); + const location = useLocation(); + + // 改变panes + const handleTabsPanes = (payload: any): void => { + dispatch({ + type: "global/saveTabsRoutes", + payload: { + data: payload, + action: 'add' + } + }) + }; + + return ( + + + consumableMenu + // menu + } + subMenuItemRender={(menuItemProps) => { + if (menuItemProps.icon && typeof menuItemProps.icon === 'string') { + const ele = React.createElement(Icon[menuItemProps.icon]) + return
+ {ele} + {menuItemProps.name} +
; + } + return
+ {menuItemProps.name} +
; + }} + menuItemRender={(menuItemProps, defaultDom) => { + if ( + menuItemProps.isUrl || + !menuItemProps.path || + location.pathname === menuItemProps.path + ) { + return defaultDom; + } + return { + }}> + {defaultDom} + {/* {menuItemProps.name} */} + ; + }} + breadcrumbRender={false} + itemRender={(route, params, routes, paths) => { + const first = routes.indexOf(route) === 0; + return first ? ( + {route.breadcrumbName} + ) : ( + {route.breadcrumbName} + ); + }} + actionsRender={() =>

rGD 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 literal 0 HcmV?d00001 diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..f529c57 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1,37 @@ + + + + diff --git a/src/components/Access.tsx b/src/components/Access.tsx new file mode 100644 index 0000000..2f76ac8 --- /dev/null +++ b/src/components/Access.tsx @@ -0,0 +1,32 @@ +import type { FC, ReactElement } from 'react'; +import { connect } from 'umi'; +import type { UserConnectedProps } from '@/models/user'; + +type Props = { + authority: string; + children: ReactElement; + fallback?: ReactElement; +} & UserConnectedProps; + +//处理页面元素权限的组件 +const Access: FC = (props): ReactElement | null => { + const { user, authority, fallback, children } = props; + const { authority: userAuthority } = user; + const accessible = userAuthority.some((item: string) => item === authority); + + let res = null; + + if (accessible) { + res = children; + } else if (fallback) { + res = fallback; + } + + return res; +}; + +export default connect( + ({ user }: { user: UserConnectedProps['user'] }) => ({ + user, + }), +)(Access); diff --git a/src/components/Avatar/index.less b/src/components/Avatar/index.less new file mode 100644 index 0000000..5a511bb --- /dev/null +++ b/src/components/Avatar/index.less @@ -0,0 +1,18 @@ +@import '@/global.less'; + +.avatar-container{ + height: 100%; + padding: 0 10px; + cursor: pointer; + .avatar{ + display: block; + width: 30.9px; + height: 30.9px; + } + .username{ + color: #fff; + } + &:hover { + // background: #252a3d; + } +} diff --git a/src/components/Avatar/index.tsx b/src/components/Avatar/index.tsx new file mode 100644 index 0000000..800ec83 --- /dev/null +++ b/src/components/Avatar/index.tsx @@ -0,0 +1,59 @@ +import type { FC } from 'react'; +import { connect } from 'umi'; +import { Dropdown, Space } from 'antd'; +import { LogoutOutlined } from '@ant-design/icons'; +import type { UserConnectedProps } from '@/models/user'; +import './index.less'; + +const Avatar: FC = (props) => { + const { + user: { data }, dispatch, + } = props; + + const handleLogout = () => { + dispatch?.({ + type: 'user/logout', + }); + }; + + const items = [ + { + key: 'logout', + label: ( + + + 退出登录 + + ), + }, + ]; + + return ( + + + avatar + {data.name} + + + ); +}; + +export default connect( + ({ user }: { user: UserConnectedProps['user'] }) => ({ + user, + }), +)(Avatar); diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..64a98f1 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,47 @@ +/* + * @Author: cclu 1106109051@qq.com + * @Date: 2025-02-25 11:39:58 + * @LastEditors: cclu 1106109051@qq.com + * @LastEditTime: 2025-02-26 11:25:46 + * @FilePath: \umi4-admin-main\src\components\Footer.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +import type { FC } from 'react'; +import { DefaultFooter } from '@ant-design/pro-layout'; + +const Footer: FC = () => { + return ( + + // , + // href: 'https://github.com/ant-design/ant-design-pro', + // blankTarget: true, + // }, + // { + // key: 'Ant Design', + // title: 'Ant Design', + // href: 'https://ant.design', + // blankTarget: true, + // }, + // ]} + // /> + ); +}; + +export default Footer; diff --git a/src/components/LayoutWrapper.tsx b/src/components/LayoutWrapper.tsx new file mode 100644 index 0000000..187c966 --- /dev/null +++ b/src/components/LayoutWrapper.tsx @@ -0,0 +1,96 @@ +import { Fragment, useEffect } from 'react'; +import type { FC, ReactElement } from 'react'; +import { Spin } from 'antd'; +import { Helmet, useLocation, connect } from 'umi'; +import type { UserConnectedProps } from '@/models/user'; +import LoginPage from '@/pages/user/login'; +import cfg from '../../config/config'; + +type Props = { + children: ReactElement; +} & UserConnectedProps; + +//登录页不走/src/layouts, 登录完之后的页面才走/src/layouts +const LayoutWrapper: FC = (props) => { + const { pathname } = useLocation(); + const { + dispatch, children, + user: { isLogin, layoutWrapperLoading, indexValidMenuItemByPath }, + } = props; + const tabTitle = indexValidMenuItemByPath[pathname]?.label; + const projectTitle = cfg.title; + const title = tabTitle ? `${tabTitle} - ${projectTitle}` : projectTitle; + + useEffect( + () => { + //调用户信息相关接口查询登录状态(401表示未登录) + dispatch?.({ + type: 'user/getUserInfoAuthorityMenu', + payload: { + type: 'relay', + }, + }); + }, + [ dispatch ], + ); + + //进任何页面都需要先loading + let pageContent = ( + + ); + + //页面不loading + /** + 一开始我是这么写的: + if(!layoutWrapperLoading) { + if(isLogin){ + if(pathname === '/user/login') { + 登录过了, 此时页面url还是登录页的时候我希望不再进入登录页而是直接跳转离开 + handleRedirect(); + 这里如果使用了history.push则会报如下的错误: + Warning: Cannot update a component (`BrowserRoutes`) while rendering a different component (`LayoutWrapper`). + To locate the bad setState() call inside `LayoutWrapper`, follow the stack trace as described in + https://reactjs.org/link/setstate-in-render + 大意是不能在render的时候更新路由, 也就是调history.push更新BrowserRoutes + 使用window.location.href = 'xxx';的方式用户会再一次看到整个页面的loading, 体验不好 + 后来我将逻辑写到用户登录状态确认之后, 也就是全局状态管理中: /src/models/user.ts就可以了 + 搜索 handleRedirect 即可找到相应的代码 + } + } + } + */ + if (!layoutWrapperLoading) { + if (isLogin) { + if (pathname !== '/user/login') { + pageContent = children; + } + } else { + //只要没登陆过就渲染登录页而不是跳转到登录页, 因为登录页不走/src/layouts + pageContent = ; + } + } + + return ( + + + {title} + + {pageContent} + + ); +}; + +export default connect( + ({ user }: { user: UserConnectedProps['user'] }) => ({ + user, + }), +)(LayoutWrapper); diff --git a/src/components/Nav/index.less b/src/components/Nav/index.less new file mode 100644 index 0000000..005752f --- /dev/null +++ b/src/components/Nav/index.less @@ -0,0 +1,24 @@ +.container { + display: flex; + justify-content: space-between; + height: 50px; + padding: 0 15px; + // background-color: #001529; + .former { + display: flex; + .left { + display: flex; + align-items: center; + img { + width: 28px; + height: 28px; + display: block; + } + } + } + .latter { + display: flex; + align-items: center; + gap: 0 15px; + } +} diff --git a/src/components/Nav/index.tsx b/src/components/Nav/index.tsx new file mode 100644 index 0000000..bced379 --- /dev/null +++ b/src/components/Nav/index.tsx @@ -0,0 +1,43 @@ +import type { FC } from 'react'; +import { Link } from 'umi'; +import Avatar from '../Avatar'; +import './index.less'; + +const Nav: FC = () => { + + return ( +