├── .dockerignore
├── .editorconfig
├── .env
├── .env.development
├── .env.production
├── .env.staging
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .husky
├── commit-msg
├── common.sh
├── lintstagedrc.js
└── pre-commit
├── .markdownlint.json
├── .npmrc
├── .prettierrc.js
├── .stylelintignore
├── .vscode
├── extensions.json
├── settings.json
├── vue3.0.code-snippets
├── vue3.2.code-snippets
└── vue3.3.code-snippets
├── Dockerfile
├── LICENSE
├── README.en-US.md
├── README.md
├── build
├── cdn.ts
├── compress.ts
├── index.ts
├── info.ts
├── optimize.ts
└── plugins.ts
├── commitlint.config.js
├── index.html
├── mock
├── asyncRoutes.ts
├── login.ts
└── refreshToken.ts
├── package.json
├── pnpm-lock.yaml
├── postcss.config.js
├── public
├── favicon.ico
├── logo.svg
└── serverConfig.json
├── src
├── App.vue
├── api
│ ├── common
│ │ └── login.ts
│ └── system
│ │ ├── config.ts
│ │ ├── dept.ts
│ │ ├── log.ts
│ │ ├── menu.ts
│ │ ├── monitor.ts
│ │ ├── notice.ts
│ │ ├── post.ts
│ │ ├── role.ts
│ │ └── user.ts
├── assets
│ ├── iconfont
│ │ ├── iconfont.css
│ │ ├── iconfont.js
│ │ ├── iconfont.json
│ │ ├── iconfont.ttf
│ │ ├── iconfont.woff
│ │ └── iconfont.woff2
│ ├── login
│ │ ├── avatar.svg
│ │ ├── bg.png
│ │ └── illustration.svg
│ ├── status
│ │ ├── 403.svg
│ │ ├── 404.svg
│ │ └── 500.svg
│ ├── svg
│ │ ├── FullScreenMaximize.svg
│ │ ├── FullScreenMinimize.svg
│ │ ├── back_top.svg
│ │ ├── dark.svg
│ │ ├── day.svg
│ │ ├── enter_outlined.svg
│ │ ├── exit_screen.svg
│ │ ├── full_screen.svg
│ │ └── keyboard_esc.svg
│ └── user.jpg
├── components
│ ├── ReAuth
│ │ ├── index.ts
│ │ └── src
│ │ │ └── auth.tsx
│ ├── ReCol
│ │ └── index.ts
│ ├── ReCropper
│ │ ├── index.ts
│ │ └── src
│ │ │ ├── circled.css
│ │ │ ├── index.tsx
│ │ │ └── svg
│ │ │ ├── arrow-down.svg
│ │ │ ├── arrow-h.svg
│ │ │ ├── arrow-left.svg
│ │ │ ├── arrow-right.svg
│ │ │ ├── arrow-up.svg
│ │ │ ├── arrow-v.svg
│ │ │ ├── change.svg
│ │ │ ├── download.svg
│ │ │ ├── index.ts
│ │ │ ├── reload.svg
│ │ │ ├── rotate-left.svg
│ │ │ ├── rotate-right.svg
│ │ │ ├── search-minus.svg
│ │ │ ├── search-plus.svg
│ │ │ └── upload.svg
│ ├── ReDialog
│ │ ├── index.ts
│ │ ├── index.vue
│ │ └── type.ts
│ ├── ReIcon
│ │ ├── data.ts
│ │ ├── index.ts
│ │ └── src
│ │ │ ├── Select.vue
│ │ │ ├── hooks.ts
│ │ │ ├── iconfont.ts
│ │ │ ├── iconifyIconOffline.ts
│ │ │ ├── iconifyIconOnline.ts
│ │ │ ├── offlineIcon.ts
│ │ │ └── types.ts
│ ├── ReImageVerify
│ │ ├── index.ts
│ │ └── src
│ │ │ ├── hooks.ts
│ │ │ └── index.vue
│ ├── RePureTableBar
│ │ ├── index.ts
│ │ └── src
│ │ │ ├── bar.tsx
│ │ │ └── svg
│ │ │ ├── collapse.svg
│ │ │ ├── drag.svg
│ │ │ ├── expand.svg
│ │ │ ├── refresh.svg
│ │ │ └── settings.svg
│ ├── ReQrcode
│ │ ├── index.ts
│ │ └── src
│ │ │ ├── index.scss
│ │ │ └── index.tsx
│ ├── ReTypeit
│ │ └── index.ts
│ └── VDialog
│ │ ├── VDialog.vue
│ │ ├── dialog.css
│ │ └── dialog.ts
├── config
│ └── index.ts
├── directives
│ ├── auth
│ │ └── index.ts
│ ├── copy
│ │ └── index.ts
│ ├── index.ts
│ ├── longpress
│ │ └── index.ts
│ └── optimize
│ │ └── index.ts
├── layout
│ ├── components
│ │ ├── appMain.vue
│ │ ├── navbar.vue
│ │ ├── notice
│ │ │ ├── data.ts
│ │ │ ├── index.vue
│ │ │ ├── noticeItem.vue
│ │ │ └── noticeList.vue
│ │ ├── panel
│ │ │ └── index.vue
│ │ ├── search
│ │ │ ├── components
│ │ │ │ ├── SearchFooter.vue
│ │ │ │ ├── SearchModal.vue
│ │ │ │ ├── SearchResult.vue
│ │ │ │ └── index.ts
│ │ │ └── index.vue
│ │ ├── setting
│ │ │ └── index.vue
│ │ ├── sidebar
│ │ │ ├── breadCrumb.vue
│ │ │ ├── extraIcon.vue
│ │ │ ├── horizontal.vue
│ │ │ ├── leftCollapse.vue
│ │ │ ├── logo.vue
│ │ │ ├── mixNav.vue
│ │ │ ├── sidebarItem.vue
│ │ │ ├── topCollapse.vue
│ │ │ └── vertical.vue
│ │ └── tag
│ │ │ ├── index.scss
│ │ │ └── index.vue
│ ├── frameView.vue
│ ├── hooks
│ │ ├── useBoolean.ts
│ │ ├── useDataThemeChange.ts
│ │ ├── useLayout.ts
│ │ ├── useNav.ts
│ │ └── useTag.ts
│ ├── index.vue
│ ├── redirect.vue
│ ├── theme
│ │ └── index.ts
│ └── types.ts
├── main.ts
├── mockProdServer.ts
├── plugins
│ ├── echarts
│ │ └── index.ts
│ └── element-plus
│ │ └── index.ts
├── router
│ ├── index.ts
│ ├── modules
│ │ ├── error.ts
│ │ ├── global.ts
│ │ ├── home.ts
│ │ └── remaining.ts
│ └── utils.ts
├── store
│ ├── index.ts
│ └── modules
│ │ ├── app.ts
│ │ ├── epTheme.ts
│ │ ├── multiTags.ts
│ │ ├── permission.ts
│ │ ├── settings.ts
│ │ ├── types.ts
│ │ └── user.ts
├── style
│ ├── dark.scss
│ ├── element-plus.scss
│ ├── index.scss
│ ├── login.css
│ ├── reset.scss
│ ├── sidebar.scss
│ ├── tailwind.css
│ └── transition.scss
├── utils
│ ├── auth.ts
│ ├── common.ts
│ ├── crypt.ts
│ ├── globalPolyfills.ts
│ ├── http
│ │ ├── index.ts
│ │ └── types.d.ts
│ ├── message.ts
│ ├── mitt.ts
│ ├── print.ts
│ ├── progress
│ │ └── index.ts
│ ├── propTypes.ts
│ ├── responsive.ts
│ ├── rootConver.ts
│ ├── sso.ts
│ └── tree.ts
└── views
│ ├── error
│ ├── 403.vue
│ ├── 404.vue
│ └── 500.vue
│ ├── login
│ ├── components
│ │ ├── phone.vue
│ │ ├── qrCode.vue
│ │ ├── register.vue
│ │ └── resetPassword.vue
│ ├── index.vue
│ └── utils
│ │ ├── enums.ts
│ │ ├── motion.ts
│ │ ├── rule.ts
│ │ ├── static.ts
│ │ └── verifyCode.ts
│ ├── permission
│ ├── button
│ │ └── index.vue
│ └── page
│ │ └── index.vue
│ ├── system
│ ├── config
│ │ ├── form.vue
│ │ ├── index.vue
│ │ └── utils
│ │ │ ├── hook.tsx
│ │ │ └── rule.ts
│ ├── dept
│ │ ├── form.vue
│ │ ├── index.vue
│ │ └── utils
│ │ │ ├── hook.tsx
│ │ │ └── rule.ts
│ ├── hooks.ts
│ ├── log
│ │ ├── loginLog
│ │ │ ├── index.vue
│ │ │ └── utils
│ │ │ │ └── hook.tsx
│ │ └── operationLog
│ │ │ ├── description.vue
│ │ │ ├── index.vue
│ │ │ └── utils
│ │ │ └── hook.tsx
│ ├── menu
│ │ ├── form.vue
│ │ ├── index.vue
│ │ └── utils
│ │ │ ├── hook.tsx
│ │ │ ├── menuLogic.ts
│ │ │ └── rule.ts
│ ├── monitor
│ │ ├── cache
│ │ │ └── index.vue
│ │ ├── hooks.ts
│ │ ├── onlineUser
│ │ │ ├── index.vue
│ │ │ └── utils
│ │ │ │ └── hook.tsx
│ │ └── server
│ │ │ └── index.vue
│ ├── notice
│ │ ├── form.vue
│ │ ├── index.vue
│ │ └── utils
│ │ │ ├── hook.tsx
│ │ │ ├── rule.ts
│ │ │ └── types.ts
│ ├── post
│ │ ├── index.vue
│ │ ├── post-form-modal.vue
│ │ └── utils
│ │ │ └── hook.tsx
│ ├── role
│ │ ├── index.vue
│ │ ├── role-form-modal.vue
│ │ └── utils
│ │ │ └── hook.tsx
│ └── user
│ │ ├── form.vue
│ │ ├── hook.tsx
│ │ ├── index.vue
│ │ ├── passwordForm.vue
│ │ ├── profile
│ │ ├── index.vue
│ │ ├── resetPwd.vue
│ │ ├── userAvatar.vue
│ │ └── userInfo.vue
│ │ ├── rule.ts
│ │ ├── svg
│ │ ├── expand.svg
│ │ └── unexpand.svg
│ │ ├── tree.vue
│ │ ├── uploadForm.vue
│ │ └── utils
│ │ └── hook.tsx
│ └── welcome
│ └── index.vue
├── stylelint.config.js
├── tailwind.config.js
├── tsconfig.json
├── types
├── global-components.d.ts
├── global.d.ts
├── index.d.ts
├── router.d.ts
├── shims-tsx.d.ts
└── shims-vue.d.ts
└── vite.config.ts
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist
4 | dist-ssr
5 | *.local
6 | .eslintcache
7 | report.html
8 |
9 | yarn.lock
10 | npm-debug.log*
11 | .pnpm-error.log*
12 | .pnpm-debug.log
13 | tests/**/coverage/
14 |
15 | # Editor directories and files
16 | .idea
17 | *.suo
18 | *.ntvs*
19 | *.njsproj
20 | *.sln
21 | tsconfig.tsbuildinfo
22 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | end_of_line = lf
9 | insert_final_newline = true
10 | trim_trailing_whitespace = true
11 |
12 | [*.md]
13 | insert_final_newline = false
14 | trim_trailing_whitespace = false
15 |
--------------------------------------------------------------------------------
/.env:
--------------------------------------------------------------------------------
1 | # 平台本地运行端口号
2 | VITE_PORT = 8848
3 |
4 | # 是否隐藏首页 隐藏 true 不隐藏 false (勿删除,VITE_HIDE_HOME只需在.env文件配置)
5 | VITE_HIDE_HOME = false
6 |
--------------------------------------------------------------------------------
/.env.development:
--------------------------------------------------------------------------------
1 | # 平台本地运行端口号
2 | VITE_PORT = 80
3 |
4 | # 开发环境读取配置文件路径
5 | VITE_PUBLIC_PATH = ./
6 |
7 | # 开发环境路由历史模式(Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数")
8 | VITE_ROUTER_HISTORY = "hash"
9 |
10 | # 后端地址
11 | VITE_APP_BASE_API = '/dev-api'
12 |
--------------------------------------------------------------------------------
/.env.production:
--------------------------------------------------------------------------------
1 | # 线上环境平台打包路径
2 | VITE_PUBLIC_PATH = ./
3 |
4 | # 线上环境路由历史模式(Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数")
5 | VITE_ROUTER_HISTORY = "hash"
6 |
7 | # 是否在打包时使用cdn替换本地库 替换 true 不替换 false
8 | VITE_CDN = false
9 |
10 | # 是否启用gzip压缩或brotli压缩(分两种情况,删除原始文件和不删除原始文件)
11 | # 压缩时不删除原始文件的配置:gzip、brotli、both(同时开启 gzip 与 brotli 压缩)、none(不开启压缩,默认)
12 | # 压缩时删除原始文件的配置:gzip-clear、brotli-clear、both-clear(同时开启 gzip 与 brotli 压缩)、none(不开启压缩,默认)
13 | VITE_COMPRESSION = "none"
14 |
15 | # 后端地址
16 | VITE_APP_BASE_API = '/prod-api'
--------------------------------------------------------------------------------
/.env.staging:
--------------------------------------------------------------------------------
1 | # 预发布也需要生产环境的行为
2 | # https://cn.vitejs.dev/guide/env-and-mode.html#modes
3 | # NODE_ENV = development
4 |
5 | VITE_PUBLIC_PATH = ./
6 |
7 | # 预发布环境路由历史模式(Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数")
8 | VITE_ROUTER_HISTORY = "hash"
9 |
10 | # 是否在打包时使用cdn替换本地库 替换 true 不替换 false
11 | VITE_CDN = true
12 |
13 | # 是否启用gzip压缩或brotli压缩(分两种情况,删除原始文件和不删除原始文件)
14 | # 压缩时不删除原始文件的配置:gzip、brotli、both(同时开启 gzip 与 brotli 压缩)、none(不开启压缩,默认)
15 | # 压缩时删除原始文件的配置:gzip-clear、brotli-clear、both-clear(同时开启 gzip 与 brotli 压缩)、none(不开启压缩,默认)
16 | VITE_COMPRESSION = "none"
17 |
18 | # 后端地址
19 | VITE_APP_BASE_API = '/stage-api'
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | public
2 | dist
3 | *.d.ts
4 | /src/assets
5 | package.json
6 | .eslintrc.js
7 | .prettierrc.js
8 | commitlint.config.js
9 | postcss.config.js
10 | tailwind.config.js
11 | stylelint.config.js
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | dist
4 | dist-ssr
5 | *.local
6 | .eslintcache
7 | report.html
8 |
9 | yarn.lock
10 | npm-debug.log*
11 | .pnpm-error.log*
12 | .pnpm-debug.log
13 | tests/**/coverage/
14 |
15 | # 本机调试debug配置文件
16 | .vscode/launch.json
17 |
18 | # Editor directories and files
19 | .idea
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | tsconfig.tsbuildinfo
--------------------------------------------------------------------------------
/.husky/commit-msg:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # shellcheck source=./_/husky.sh
4 | . "$(dirname "$0")/_/husky.sh"
5 |
6 | npx --no-install commitlint --edit "$1"
7 |
--------------------------------------------------------------------------------
/.husky/common.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | command_exists () {
3 | command -v "$1" >/dev/null 2>&1
4 | }
5 |
6 | # Workaround for Windows 10, Git Bash and Pnpm
7 | if command_exists winpty && test -t 1; then
8 | exec < /dev/tty
9 | fi
10 |
--------------------------------------------------------------------------------
/.husky/lintstagedrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
3 | "{!(package)*.json}": ["prettier --write--parser json"],
4 | "package.json": ["prettier --write"],
5 | "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"],
6 | "*.{vue,css,scss,postcss,less}": ["stylelint --fix", "prettier --write"],
7 | "*.md": ["prettier --write"]
8 | };
9 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 | . "$(dirname "$0")/common.sh"
4 |
5 | [ -n "$CI" ] && exit 0
6 |
7 | # Format and submit code according to lintstagedrc.js configuration
8 | npm run lint:lint-staged
9 |
10 | npm run lint:pretty
11 |
--------------------------------------------------------------------------------
/.markdownlint.json:
--------------------------------------------------------------------------------
1 | {
2 | "default": true,
3 | "MD003": false,
4 | "MD033": false,
5 | "MD013": false,
6 | "MD001": false,
7 | "MD025": false,
8 | "MD024": false,
9 | "MD007": { "indent": 4 },
10 | "no-hard-tabs": false
11 | }
12 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | shamefully-hoist=true
2 | strict-peer-dependencies=false
3 | shell-emulator=true
--------------------------------------------------------------------------------
/.prettierrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | bracketSpacing: true,
3 | singleQuote: false,
4 | arrowParens: "avoid",
5 | trailingComma: "none"
6 | };
7 |
--------------------------------------------------------------------------------
/.stylelintignore:
--------------------------------------------------------------------------------
1 | /dist/*
2 | /public/*
3 | public/*
4 | src/style/reset.scss
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "akamud.vscode-theme-onedark",
4 | "antfu.iconify",
5 | "bradlc.vscode-tailwindcss",
6 | "christian-kohler.npm-intellisense",
7 | "christian-kohler.path-intellisense",
8 | "Codeium.codeium",
9 | "csstools.postcss",
10 | "DavidAnson.vscode-markdownlint",
11 | "dbaeumer.vscode-eslint",
12 | "donjayamanne.githistory",
13 | "dsznajder.es7-react-js-snippets",
14 | "eamodio.gitlens",
15 | "ecmel.vscode-html-css",
16 | "esbenp.prettier-vscode",
17 | "genieai.chatgpt-vscode",
18 | "hollowtree.vue-snippets",
19 | "lokalise.i18n-ally",
20 | "mhutchie.git-graph",
21 | "mikestead.dotenv",
22 | "pmneo.tsimporter",
23 | "streetsidesoftware.code-spell-checker",
24 | "stylelint.vscode-stylelint",
25 | "syler.sass-indented",
26 | "sysoev.language-stylus",
27 | "vscode-icons-team.vscode-icons",
28 | "Vue.volar",
29 | "xabikos.JavaScriptSnippets"
30 | ]
31 | }
32 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.formatOnType": true,
3 | "editor.formatOnSave": true,
4 | "[vue]": {
5 | "editor.defaultFormatter": "esbenp.prettier-vscode"
6 | },
7 | "editor.tabSize": 2,
8 | "editor.formatOnPaste": true,
9 | "editor.guides.bracketPairs": "active",
10 | "files.autoSave": "afterDelay",
11 | "git.confirmSync": false,
12 | "workbench.startupEditor": "newUntitledFile",
13 | "editor.suggestSelection": "first",
14 | "editor.acceptSuggestionOnCommitCharacter": false,
15 | "css.lint.propertyIgnoredDueToDisplay": "ignore",
16 | "editor.quickSuggestions": {
17 | "other": true,
18 | "comments": true,
19 | "strings": true
20 | },
21 | "files.associations": {
22 | "editor.snippetSuggestions": "top"
23 | },
24 | "[css]": {
25 | "editor.defaultFormatter": "esbenp.prettier-vscode"
26 | },
27 | "editor.codeActionsOnSave": {
28 | "source.fixAll.eslint": true
29 | },
30 | "iconify.excludes": ["el"],
31 | "cSpell.words": ["iconify", "Qrcode"]
32 | }
33 |
--------------------------------------------------------------------------------
/.vscode/vue3.0.code-snippets:
--------------------------------------------------------------------------------
1 | {
2 | "Vue3.0快速生成模板": {
3 | "scope": "vue",
4 | "prefix": "Vue3.0",
5 | "body": [
6 | "",
7 | "\t