├── .env ├── .env.development ├── .env.production ├── .eslintrc-auto-import.json ├── .eslintrc.cjs ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .prettierignore ├── .prettierrc.cjs ├── .vscode └── extensions.json ├── LICENSE ├── README.md ├── commitlint.config.cjs ├── index.html ├── mock ├── constant.ts ├── controller │ └── user.ts ├── mockProdServer.ts └── utils.ts ├── package.json ├── pnpm-lock.yaml ├── public └── vite.svg ├── src ├── App.vue ├── api │ └── user.ts ├── assets │ └── images │ │ ├── login │ │ ├── background.png │ │ ├── login-box.png │ │ └── login-content.png │ │ └── user │ │ ├── avatar01.png │ │ ├── avatar15.png │ │ └── headImg.gif ├── components │ ├── base-box │ │ └── index.vue │ ├── base-button │ │ └── index.vue │ ├── base-charts │ │ ├── index.ts │ │ └── src │ │ │ ├── base-charts.vue │ │ │ ├── config │ │ │ ├── bar.ts │ │ │ ├── graph.ts │ │ │ ├── heatmap.ts │ │ │ ├── line.ts │ │ │ ├── liquidfill.ts │ │ │ ├── map.ts │ │ │ ├── pie.ts │ │ │ ├── radar.ts │ │ │ ├── scatter.ts │ │ │ └── wordcloud.ts │ │ │ ├── hooks │ │ │ ├── useCharts.ts │ │ │ └── useChartsConfig.ts │ │ │ └── types.ts │ ├── base-count-to │ │ └── index.vue │ ├── base-dialog │ │ ├── index.ts │ │ └── src │ │ │ ├── base-dialog.scss │ │ │ ├── base-dialog.vue │ │ │ └── props.ts │ ├── base-icon │ │ ├── base-icon-picker.vue │ │ ├── base-icon.vue │ │ └── icon.ts │ ├── base-loading │ │ ├── base-loading.vue │ │ └── spin │ │ │ ├── chaseSpin.vue │ │ │ ├── cubeSpin.vue │ │ │ ├── dotSpin.vue │ │ │ ├── planeSpin.vue │ │ │ ├── preloaderSpin.vue │ │ │ ├── pulseSpin.vue │ │ │ └── rectSpin.vue │ ├── base-result │ │ └── base-result.vue │ ├── base-seamscroll │ │ ├── index.ts │ │ └── src │ │ │ ├── base-seam-scroll.vue │ │ │ ├── props.ts │ │ │ └── types.ts │ └── base-skeleton │ │ └── base-skeleton.vue ├── directive │ ├── index.ts │ ├── loading.ts │ └── permission.ts ├── enums │ ├── DropMenuEnum.ts │ ├── httpEnum.ts │ ├── loadingEnum.ts │ └── storageEnum.ts ├── hooks │ ├── index.ts │ ├── useDark.ts │ ├── useEnv.ts │ ├── useLoading.ts │ ├── useMessage.ts │ ├── usePageSetting.ts │ ├── useStorage.ts │ └── useWatermark.ts ├── icons │ ├── 403.svg │ ├── 404.svg │ ├── 500.svg │ ├── about.svg │ ├── approval.svg │ ├── clear.svg │ ├── click.svg │ ├── close.svg │ ├── column.svg │ ├── comp.svg │ ├── confirm.svg │ ├── dark.svg │ ├── dashboard.svg │ ├── deliver.svg │ ├── down.svg │ ├── editPassword.svg │ ├── empty.svg │ ├── esc.svg │ ├── exit.svg │ ├── export.svg │ ├── feedback.svg │ ├── filter.svg │ ├── fold.svg │ ├── fullOutScreen.svg │ ├── fullScreen.svg │ ├── func.svg │ ├── gitee.svg │ ├── github.svg │ ├── good.svg │ ├── help.svg │ ├── icon.svg │ ├── light.svg │ ├── location.svg │ ├── log.svg │ ├── logo.svg │ ├── money.svg │ ├── more.svg │ ├── nested.svg │ ├── other.svg │ ├── out.svg │ ├── page.svg │ ├── permission.svg │ ├── qq.svg │ ├── read.svg │ ├── remind.svg │ ├── search.svg │ ├── setting.svg │ ├── size.svg │ ├── sizeMini.svg │ ├── sizePlus.svg │ ├── textSize.svg │ ├── unfold.svg │ ├── up.svg │ ├── view.svg │ ├── warning.svg │ ├── weixin.svg │ └── zhifubao.svg ├── layouts │ ├── hooks │ │ └── useTagEvent.ts │ ├── index.vue │ ├── nav-bar │ │ ├── breadcrumb.vue │ │ ├── index.vue │ │ ├── nav-fullscreen.vue │ │ ├── nav-search.vue │ │ ├── nav-switch.vue │ │ └── nav-user.vue │ ├── side-bar │ │ ├── index.scss │ │ ├── index.vue │ │ ├── logo.vue │ │ └── side-bar-item.vue │ └── tag-view │ │ ├── index.scss │ │ ├── index.vue │ │ ├── tag-action.vue │ │ ├── tag-fullscreen.vue │ │ ├── tag-item.vue │ │ └── tag-scroll.vue ├── main.ts ├── mockProdServer.ts ├── plugins │ ├── echarts.ts │ ├── globalUtils.ts │ ├── icon.ts │ └── index.ts ├── router │ ├── basic.ts │ ├── guard │ │ ├── index.ts │ │ ├── pageTitle.ts │ │ ├── permission.ts │ │ └── progress.ts │ ├── index.ts │ ├── modules │ │ ├── dashboard.ts │ │ ├── nested.ts │ │ ├── out-link.ts │ │ └── page.ts │ └── types.ts ├── stores │ ├── index.ts │ └── modules │ │ ├── app.ts │ │ ├── permission.ts │ │ ├── tagView.ts │ │ └── user.ts ├── styles │ ├── common.scss │ ├── index.scss │ ├── scrollbar.scss │ └── theme │ │ ├── base.scss │ │ ├── dark.scss │ │ └── index.scss ├── utils │ ├── common.ts │ ├── dom.ts │ ├── index.ts │ ├── is.ts │ ├── message.ts │ ├── request │ │ ├── cancel.ts │ │ ├── index.ts │ │ ├── loading.ts │ │ └── retry.ts │ ├── requestAnimationFrame.ts │ └── storage.ts └── views │ ├── dashboard │ ├── analysis │ │ ├── column.ts │ │ ├── components │ │ │ ├── CardList.vue │ │ │ ├── DetailAnalysis.vue │ │ │ ├── TrueDynamic.vue │ │ │ └── TurnoverAnalysis.vue │ │ └── index.vue │ └── workbench │ │ ├── column.ts │ │ ├── components │ │ ├── Calendar.vue │ │ ├── DynamicInfo.vue │ │ ├── NoticeList.vue │ │ ├── QuickNav.vue │ │ └── TodoList.vue │ │ └── index.vue │ ├── login │ └── index.vue │ ├── nested │ ├── menu1 │ │ ├── menu1-1 │ │ │ └── menu1-1-1 │ │ │ │ └── index.vue │ │ └── menu1-2 │ │ │ └── index.vue │ └── menu2 │ │ └── index.vue │ ├── page │ ├── 403.vue │ ├── 404.vue │ ├── 500.vue │ ├── error.vue │ └── success.vue │ └── redirect │ └── index.vue ├── tsconfig.json ├── tsconfig.node.json ├── types └── global.d.ts └── vite.config.ts /.env: -------------------------------------------------------------------------------- 1 | # app name 2 | VITE_APP_NAME=Vue3 Basic Admin 3 | 4 | # Whether to open mock 5 | VITE_USE_MOCK = true -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | # public path 2 | VITE_PUBLIC_PATH = / 3 | 4 | # api 5 | VITE_BASE_API= /api 6 | 7 | # upload api 8 | VITE_BASE_UPLOAD_API= /upload 9 | 10 | # Whether to open mock 11 | VITE_USE_MOCK = true 12 | 13 | # Delete console 14 | VITE_DROP_CONSOLE = false -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # public path 2 | VITE_PUBLIC_PATH = ./ 3 | 4 | # api 5 | VITE_BASE_API= /api 6 | 7 | # upload api 8 | VITE_BASE_UPLOAD_API= /upload 9 | 10 | # Whether to open mock 11 | VITE_USE_MOCK = true 12 | 13 | # Delete console 14 | VITE_DROP_CONSOLE = true -------------------------------------------------------------------------------- /.eslintrc-auto-import.json: -------------------------------------------------------------------------------- 1 | { 2 | "globals": {} 3 | } -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es2021: true, 5 | node: true 6 | }, 7 | extends: ["standard", "plugin:vue/vue3-essential", "eslint-config-prettier"], 8 | parserOptions: { 9 | ecmaVersion: "latest", 10 | parser: "@typescript-eslint/parser", 11 | sourceType: "module" 12 | }, 13 | rules: { 14 | "no-undef": "off", 15 | semi: ["error", "always"], 16 | "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", 17 | "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", 18 | "space-before-function-paren": 0, 19 | "vue/array-bracket-spacing": "error", 20 | "vue/arrow-spacing": "error", 21 | "vue/block-spacing": "error", 22 | "vue/brace-style": "error", 23 | "vue/camelcase": "off", 24 | "vue/comma-dangle": "error", 25 | "vue/component-name-in-template-casing": "error", 26 | "vue/eqeqeq": "error", 27 | "vue/key-spacing": "error", 28 | "vue/match-component-file-name": "error", 29 | "vue/object-curly-spacing": "off", 30 | "no-useless-escape": "off", 31 | "no-unused-vars": "off", 32 | "vue/attribute-hyphenation": "off", 33 | "vue/custom-event-name-casing": "off", 34 | "vue/multi-word-component-names": "off", 35 | "vue/comment-directive": "off" 36 | }, 37 | plugins: ["vue", "@typescript-eslint"] 38 | }; 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | .history 15 | report.html 16 | components.d.ts 17 | auto-imports.d.ts 18 | 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | .DS_Store 25 | *.suo 26 | *.ntvs* 27 | *.njsproj 28 | *.sln 29 | *.sw? 30 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx --no -- commitlint --edit 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /dist/* 2 | .local 3 | .output.js 4 | *.svg 5 | /node_modules/** 6 | 7 | **/*.svg 8 | **/*.sh 9 | 10 | /public/* -------------------------------------------------------------------------------- /.prettierrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // 一行最多 100 字符 3 | printWidth: 150, 4 | // 使用 4 个空格缩进 5 | tabWidth: 4, 6 | // 不使用缩进符,而使用空格 7 | useTabs: false, 8 | // 行尾分号 9 | semi: true, 10 | // 使用单引号 11 | singleQuote: false, 12 | // 对象的 key 仅在必要时用引号 13 | quoteProps: "as-needed", 14 | // jsx 不使用单引号,而使用双引号 15 | jsxSingleQuote: false, 16 | // 尾随逗号 17 | trailingComma: "none", 18 | // 大括号内的首尾需要空格 19 | bracketSpacing: true, 20 | // jsx 标签的反尖括号需要换行 21 | jsxBracketSameLine: false, 22 | // 箭头函数,只有一个参数的时候,也需要括号 23 | arrowParens: "always", 24 | // 每个文件格式化的范围是文件的全部内容 25 | rangeStart: 0, 26 | rangeEnd: Infinity, 27 | // 不需要写文件开头的 @prettier 28 | requirePragma: false, 29 | // 不需要自动在文件开头插入 @prettier 30 | insertPragma: false, 31 | // 使用默认的折行标准 32 | proseWrap: "preserve", 33 | // 根据显示样式决定 html 要不要折行 34 | htmlWhitespaceSensitivity: "css", 35 | // 换行符使用 lf 36 | endOfLine: "lf", 37 | }; 38 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /commitlint.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ["@commitlint/config-conventional"], 3 | rules: { 4 | "type-enum": [ 5 | 2, 6 | "always", 7 | [ 8 | "build", // 编译相关修改(新版本发布) 9 | "feat", // 新功能 10 | "fix", // 修复bug 11 | "update", // 更新某功能 12 | "refactor", // 重构 13 | "docs", // 文档 14 | "chore", // 增加依赖或库 15 | "style", // 格式(不影响代码变动) 16 | "revert", // 撤销commit 回滚上一版本 17 | "perf", // 性能优化 18 | "test" // 测试单元 19 | ] 20 | ], 21 | "type-case": [0], 22 | "type-empty": [0], 23 | "scope-empty": [0], 24 | "scope-case": [0], 25 | "subject-full-stop": [0, "never"], 26 | "subject-case": [0, "never"], 27 | "header-max-length": [0, "always", 72] 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |args).includes(item as P);
18 | }) as Exclude