├── .editorconfig ├── .env.build ├── .env.build-test ├── .env.serve-dev ├── .env.serve-local ├── .env.serve-test ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .npmrc ├── .prettierrc ├── .vscode ├── extensions.json └── settings.json ├── README.md ├── eslintrc ├── .eslintrc-auto-import.json └── eslint-config.cjs ├── index.html ├── mock-prod-server.ts ├── mock ├── example.ts ├── excel.ts └── table.ts ├── optimize-include.ts ├── package.json ├── public └── favicon.ico ├── src ├── App.vue ├── api │ ├── dataAuth.ts │ ├── dept.ts │ ├── dict.ts │ ├── dictData.ts │ ├── loginInfo.ts │ ├── menu.ts │ ├── operatorLog.ts │ ├── oss.ts │ ├── ossConfig.ts │ ├── platform.ts │ ├── post.ts │ ├── rbac.ts │ ├── remote-search.ts │ ├── role.ts │ ├── system │ │ └── dict │ │ │ ├── data.js │ │ │ └── type.js │ ├── table.ts │ └── user.ts ├── assets │ ├── 401_images │ │ └── 401.gif │ ├── 404_images │ │ ├── 404.png │ │ └── 404_cloud.png │ ├── gif │ │ └── dianchi.gif │ └── layout │ │ ├── animation-image.gif │ │ ├── login-bg.svg │ │ ├── login-front.svg │ │ ├── login-top.svg │ │ ├── login.svg │ │ └── logo.png ├── components │ ├── ColumnFilter.vue │ ├── DictTag.vue │ ├── ElSvgIcon.vue │ ├── FileUpload │ │ ├── imgDillUtils.ts │ │ └── index.vue │ ├── InnerLink │ │ └── index.vue │ ├── JsonInput.vue │ ├── Pagination │ │ └── index.vue │ ├── ParentView │ │ └── index.vue │ ├── RightToolBar.vue │ ├── RightToolbar │ │ └── index.vue │ ├── TestUnit.vue │ └── __tests__ │ │ └── el-svgIcon.test.jsx ├── directives │ ├── example │ │ ├── clickoutside.js │ │ ├── copy.js │ │ ├── debounce.js │ │ ├── longpress.js │ │ ├── watermark.js │ │ ├── waves.css │ │ └── waves.js │ ├── has-perm.ts │ ├── has-role.ts │ ├── index.ts │ └── lang.ts ├── hooks │ ├── use-common.ts │ ├── use-data-dict.ts │ ├── use-element.ts │ ├── use-error-log.ts │ ├── use-layout.ts │ ├── use-menu.ts │ ├── use-permission.ts │ ├── use-self-router.ts │ └── use-table.ts ├── icons │ ├── SvgIcon.vue │ ├── common │ │ ├── 404.svg │ │ ├── bug.svg │ │ ├── build.svg │ │ ├── button.svg │ │ ├── cascader.svg │ │ ├── chart.svg │ │ ├── checkbox.svg │ │ ├── clipboard.svg │ │ ├── code.svg │ │ ├── color.svg │ │ ├── component.svg │ │ ├── dashboard.svg │ │ ├── date-range.svg │ │ ├── date.svg │ │ ├── demo.svg │ │ ├── dict.svg │ │ ├── documentation.svg │ │ ├── download.svg │ │ ├── drag.svg │ │ ├── druid.svg │ │ ├── edit.svg │ │ ├── education.svg │ │ ├── email.svg │ │ ├── example.svg │ │ ├── excel.svg │ │ ├── exit-fullscreen.svg │ │ ├── eye-open.svg │ │ ├── eye.svg │ │ ├── form.svg │ │ ├── fullscreen.svg │ │ ├── github.svg │ │ ├── guide.svg │ │ ├── hamburger.svg │ │ ├── icon.svg │ │ ├── input.svg │ │ ├── international.svg │ │ ├── job.svg │ │ ├── language.svg │ │ ├── link.svg │ │ ├── list.svg │ │ ├── lock.svg │ │ ├── log.svg │ │ ├── logininfor.svg │ │ ├── message.svg │ │ ├── money.svg │ │ ├── monitor.svg │ │ ├── nested.svg │ │ ├── number.svg │ │ ├── online.svg │ │ ├── password.svg │ │ ├── pdf.svg │ │ ├── people.svg │ │ ├── peoples.svg │ │ ├── phone.svg │ │ ├── post.svg │ │ ├── qq.svg │ │ ├── question.svg │ │ ├── radio.svg │ │ ├── rate.svg │ │ ├── redis-list.svg │ │ ├── redis.svg │ │ ├── row.svg │ │ ├── search.svg │ │ ├── select.svg │ │ ├── server.svg │ │ ├── shopping.svg │ │ ├── sidebar-logo.svg │ │ ├── size.svg │ │ ├── skill.svg │ │ ├── slider.svg │ │ ├── star.svg │ │ ├── swagger.svg │ │ ├── switch.svg │ │ ├── system.svg │ │ ├── tab.svg │ │ ├── table.svg │ │ ├── textarea.svg │ │ ├── theme.svg │ │ ├── time-range.svg │ │ ├── time.svg │ │ ├── tool.svg │ │ ├── tree-table.svg │ │ ├── tree.svg │ │ ├── upload.svg │ │ ├── user.svg │ │ ├── validCode.svg │ │ ├── wechat.svg │ │ └── zip.svg │ └── nav-bar │ │ ├── dashboard.svg │ │ ├── example.svg │ │ ├── eye-open.svg │ │ ├── eye.svg │ │ ├── form.svg │ │ ├── language.svg │ │ ├── link.svg │ │ ├── nested.svg │ │ ├── password.svg │ │ ├── table.svg │ │ ├── theme-icon.svg │ │ ├── tree.svg │ │ ├── user.svg │ │ └── validCode.svg ├── lang │ ├── en.ts │ ├── index.ts │ └── zh.ts ├── layout │ ├── app-main │ │ ├── Breadcrumb.vue │ │ ├── Hamburger.vue │ │ ├── Navbar.vue │ │ ├── TagsView.vue │ │ ├── component │ │ │ ├── LangSelect.vue │ │ │ ├── ScreenFull.vue │ │ │ ├── ScreenLock.vue │ │ │ ├── SizeSelect.vue │ │ │ └── ThemeSelect.vue │ │ └── index.vue │ ├── index.vue │ └── sidebar │ │ ├── Link.vue │ │ ├── Logo.vue │ │ ├── MenuIcon.vue │ │ ├── SidebarItem.vue │ │ └── index.vue ├── lib │ ├── el-svg-icon.ts │ └── element-plus.ts ├── main.ts ├── permission.ts ├── plugins │ └── vite-plugin-setup-extend │ │ └── index.ts ├── router │ ├── index.ts │ └── modules │ │ ├── basic-demo.ts │ │ ├── charts.ts │ │ ├── directive.ts │ │ ├── excel.ts │ │ ├── guid.ts │ │ ├── other.ts │ │ ├── rich-text.ts │ │ └── table.ts ├── settings.ts ├── store │ ├── basic.ts │ ├── config.ts │ ├── dict.ts │ └── tags-view.ts ├── styles │ ├── index.scss │ ├── init-loading.css │ ├── project-style.scss │ ├── reset-elemenet-plus.scss │ ├── scss-suger.scss │ └── transition.scss ├── theme │ ├── base │ │ ├── custom │ │ │ └── ct-css-vars.scss │ │ ├── element-plus │ │ │ ├── button.scss │ │ │ ├── checkbox.scss │ │ │ ├── css-vars.scss │ │ │ ├── form.scss │ │ │ ├── pagination.scss │ │ │ ├── redio.scss │ │ │ ├── table.scss │ │ │ └── var.scss │ │ └── index.scss │ ├── china-red │ │ ├── custom │ │ │ └── ct-css-vars.scss │ │ ├── element-plus │ │ │ ├── button.scss │ │ │ ├── checkbox.scss │ │ │ ├── css-vars.scss │ │ │ ├── form.scss │ │ │ ├── pagination.scss │ │ │ ├── redio.scss │ │ │ ├── table.scss │ │ │ └── var.scss │ │ └── index.scss │ ├── dark │ │ ├── custom │ │ │ └── ct-css-vars.scss │ │ ├── element-plus │ │ │ ├── button.scss │ │ │ ├── checkbox.scss │ │ │ ├── css-vars.css │ │ │ ├── css-vars.css.map │ │ │ ├── css-vars.scss │ │ │ ├── form.scss │ │ │ ├── pagination.scss │ │ │ ├── redio.scss │ │ │ ├── table.scss │ │ │ └── var.scss │ │ └── index.scss │ ├── index.scss │ ├── lighting │ │ ├── custom │ │ │ └── ct-css-vars.scss │ │ ├── element-plus │ │ │ ├── button.scss │ │ │ ├── checkbox.scss │ │ │ ├── css-vars.css │ │ │ ├── css-vars.css.map │ │ │ ├── css-vars.scss │ │ │ ├── form.scss │ │ │ ├── pagination.scss │ │ │ ├── redio.scss │ │ │ ├── table.scss │ │ │ └── var.scss │ │ └── index.scss │ ├── mixins │ │ ├── _var.scss │ │ ├── config.scss │ │ ├── function.scss │ │ └── mixins.scss │ └── utils │ │ ├── change-theme.ts │ │ └── index.ts ├── utils │ ├── axios-req.ts │ ├── bus.ts │ ├── common-util.ts │ ├── mock-axios-req.ts │ └── scroll-to.ts └── views │ ├── charts │ ├── components │ │ ├── Keyboard.vue │ │ ├── LineMarker.vue │ │ ├── MixChart.vue │ │ └── mixins │ │ │ └── resize.js │ ├── echarts-demo.vue │ ├── keyboard.vue │ ├── line.vue │ └── mix-chart.vue │ ├── d3 │ ├── component │ │ └── NodeDetail.vue │ ├── data.json │ ├── relation-map.vue │ ├── useD3.js │ └── useDatas.js │ ├── dashboard │ ├── ElTag.vue │ └── index.vue │ ├── directive │ ├── clickoutside.vue │ ├── copy.vue │ ├── debounce.vue │ ├── longpress.vue │ ├── watermark.vue │ └── waves.vue │ ├── error-page │ ├── 401.vue │ └── 404.vue │ ├── excel │ ├── excel.js │ ├── exportExcel.vue │ └── importExcel.vue │ ├── form │ ├── basic │ │ └── index.vue │ ├── config.ts │ ├── dynamic │ │ └── index.vue │ └── validators.ts │ ├── guide │ ├── index.vue │ └── steps.ts │ ├── login │ ├── index.vue │ ├── login-alt.vue │ ├── login-basic.vue │ ├── login-lighting.vue │ └── register.vue │ ├── redirect │ └── index.tsx │ ├── rich-text │ └── wang-edit │ │ └── index.vue │ ├── setting-switch │ ├── SettingSwitch.vue │ └── index.vue │ ├── system │ ├── dept │ │ ├── AddEditModal.vue │ │ ├── index-hook.ts │ │ └── index.vue │ ├── dict-data │ │ ├── AddEditModal.vue │ │ ├── index-hook.ts │ │ └── index.vue │ ├── dict │ │ ├── AddEditModal.vue │ │ ├── index-hook.ts │ │ └── index.vue │ ├── login-info │ │ ├── index-hook.ts │ │ └── index.vue │ ├── menu │ │ ├── AddEditModal.vue │ │ ├── IconSelect.vue │ │ ├── index-hook.js │ │ ├── index.vue │ │ └── requireIcons.js │ ├── operator-log │ │ ├── index-hook.ts │ │ └── index.vue │ ├── oss-config │ │ ├── AddEditModal.vue │ │ ├── index-hook.ts │ │ └── index.vue │ ├── oss │ │ ├── UploadFileImage.vue │ │ ├── imgDillUtils.js │ │ ├── index-hook.ts │ │ └── index.vue │ ├── platform │ │ ├── AddEditModal.vm │ │ ├── AddEditModal.vue │ │ ├── Import.vue │ │ ├── index-hook.ts │ │ ├── index.vm │ │ └── index.vue │ ├── post │ │ ├── AddEditModal.vue │ │ ├── index-hook.ts │ │ └── index.vue │ ├── role │ │ ├── AddEditModal.vue │ │ ├── DataAuthorModal.vue │ │ ├── Import.vue │ │ ├── SelectUser.vue │ │ ├── auth-user.vue │ │ ├── index-hook.js │ │ └── index.vue │ └── user │ │ ├── AddEditModal.vue │ │ ├── Import.vue │ │ ├── auth-role.vue │ │ ├── current-hook.js │ │ └── index.vue │ └── table │ ├── DynamicTable.vue │ ├── dynamic-table.vue │ ├── index.vue │ └── vxe-table.vue ├── ts-out-dir ├── package.json └── src │ ├── api │ ├── user.d.ts │ └── user.js │ ├── directives │ ├── button-codes.d.ts │ ├── button-codes.js │ ├── codes-permission.d.ts │ ├── codes-permission.js │ ├── index.d.ts │ ├── index.js │ ├── roles-permission.d.ts │ └── roles-permission.js │ ├── hooks │ ├── use-common.d.ts │ ├── use-common.js │ ├── use-element.d.ts │ ├── use-element.js │ ├── use-error-log.d.ts │ ├── use-error-log.js │ ├── use-layout.d.ts │ ├── use-layout.js │ ├── use-permission.d.ts │ ├── use-permission.js │ ├── use-self-router.d.ts │ ├── use-self-router.js │ ├── use-table.d.ts │ └── use-table.js │ ├── lib │ ├── element-plus.d.ts │ └── element-plus.js │ ├── main.d.ts │ ├── main.js │ ├── permission.d.ts │ ├── permission.js │ ├── router │ ├── index.d.ts │ └── index.js │ ├── settings.d.ts │ ├── settings.js │ ├── store │ ├── basic.d.ts │ ├── basic.js │ ├── tagsView.d.ts │ └── tagsView.js │ ├── utils │ ├── axios-req.d.ts │ ├── axios-req.js │ ├── bus.d.ts │ ├── bus.js │ ├── common-util.d.ts │ └── common-util.js │ └── views │ └── redirect │ ├── index.d.ts │ └── index.jsx ├── tsconfig.base.json ├── tsconfig.json ├── typings ├── auto-imports.d.ts ├── basic.d.ts ├── components.d.ts ├── env.d.ts ├── global.d.ts └── shims-vue.d.ts ├── vite.config.ts ├── vitest.config.ts └── vitest.setup.ts /.editorconfig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/.editorconfig -------------------------------------------------------------------------------- /.env.build: -------------------------------------------------------------------------------- 1 | VITE_APP_ENV = 'prod' 2 | #自动获取地址推荐 3 | VITE_APP_BASE_URL = 'https://github.jzfai.top/micro-service-api' 4 | 5 | #image or oss address 6 | VITE_APP_IMAGE_URL = 'https://github.jzfai.top/minio' 7 | -------------------------------------------------------------------------------- /.env.build-test: -------------------------------------------------------------------------------- 1 | VITE_APP_ENV = 'test' 2 | #自动获取地址推荐 3 | #VITE_APP_BASE_URL = '/micro-service-api' 4 | VITE_APP_BASE_URL = 'https://github.jzfai.top/micro-service-api' 5 | VITE_APP_BASE_WS_URL = '' 6 | 7 | #image or oss address 8 | VITE_APP_IMAGE_URL = 'https://github.jzfai.top/minio' 9 | -------------------------------------------------------------------------------- /.env.serve-dev: -------------------------------------------------------------------------------- 1 | #The defined variable must start with VITE_APP_ 2 | VITE_APP_ENV = 'dev' 3 | VITE_APP_BASE_URL = 'https://github.jzfai.top/micro-service-api' 4 | 5 | #image or oss address 6 | VITE_APP_IMAGE_URL = 'https://github.jzfai.top/minio' 7 | 8 | 9 | #代理拦截前缀 10 | VITE_PROXY_BASE_URL = '/proxy' 11 | #proxy转发地址(请求完整地址) 12 | VITE_PROXY_URL = 'http://localhost:8081' 13 | -------------------------------------------------------------------------------- /.env.serve-local: -------------------------------------------------------------------------------- 1 | #The defined variable must start with VITE_APP_ 2 | VITE_APP_ENV = 'test' 3 | VITE_APP_BASE_URL = 'http://localhost:12050' 4 | #image or oss address 5 | VITE_APP_IMAGE_URL = 'https://github.jzfai.top/minio' 6 | 7 | #proxy, use this to test proxy 8 | #VITE_APP_BASE_URL = '/api' 9 | #VITE_APP_PROXY_URL = 'https://github.jzfai.top/micro-service-api' 10 | -------------------------------------------------------------------------------- /.env.serve-test: -------------------------------------------------------------------------------- 1 | #The defined variable must start with VITE_APP_ 2 | VITE_APP_ENV = 'test' 3 | VITE_APP_BASE_URL = 'http://localhost:30121' 4 | #image or oss address 5 | VITE_APP_IMAGE_URL = 'https://github.jzfai.top/minio' 6 | 7 | #proxy, use this to test proxy 8 | #VITE_APP_BASE_URL = '/api' 9 | #VITE_APP_PROXY_URL = 'https://github.jzfai.top/micro-service-api' 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | public 2 | node_modules 3 | .history 4 | .husky 5 | dist 6 | *.d.ts 7 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": ["./eslintrc/eslint-config.cjs", "./eslintrc/.eslintrc-auto-import.json"] 4 | } 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # compiled output 2 | /dist 3 | /dist-ssr 4 | /node_modules 5 | 6 | #lock 7 | pnpm-lock.yaml 8 | 9 | # Logs 10 | logs 11 | *.log 12 | npm-debug.log* 13 | pnpm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* 16 | lerna-debug.log* 17 | 18 | # OS 19 | .DS_Store 20 | 21 | # Tests 22 | /coverage 23 | /.nyc_output 24 | 25 | # IDEs and editors 26 | /.idea 27 | .project 28 | .classpath 29 | .c9/ 30 | *.launch 31 | .settings/ 32 | *.sublime-workspace 33 | 34 | # IDE - VSCode 35 | .vscode/* 36 | !.vscode/settings.json 37 | !.vscode/tasks.json 38 | !.vscode/launch.json 39 | !.vscode/extensions.json 40 | 41 | # Other 42 | .history 43 | *.local 44 | yarn* 45 | pnpm* 46 | 47 | 48 | #.eslintrc-auto-import.json 49 | #auto-imports.d.ts 50 | #components.d.ts 51 | stats.html 52 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #. "$(dirname "$0")/_/husky.sh" 3 | #在项目中我们会使用commit-msg这个git hook来校验我们commit时添加的备注信息是否符合规范。在以前的我们通常是这样配置: 4 | #--no-install 参数表示强制npx使用项目中node_modules目录中的commitlint包(如果需要开启,注意:需要安装npx) 5 | #npx --no-install commitlint --edit $1 6 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | #推送之前运行eslint检查 5 | npm run lint 6 | #推送之前运行单元测试检查 7 | #npm run test:unit 8 | 9 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=false 3 | 4 | ###aliyun address 5 | registry = https://registry.npmmirror.com 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "tabWidth": 2, 4 | "printWidth": 120, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "bracketSpacing": true, 8 | "semi": false, 9 | "htmlWhitespaceSensitivity": "ignore" 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar", "esbenp.prettier-vscode","dbaeumer.vscode-eslint"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "npm.packageManager": "yarn" 4 | } 5 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= title %> 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /mock-prod-server.ts: -------------------------------------------------------------------------------- 1 | import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer' 2 | //https://cn.vitejs.dev/guide/features.html#glob-import 3 | const modulesFiles = import.meta.glob('../mock/*', { eager: true }) 4 | let modules = [] 5 | for (const filePath in modulesFiles) { 6 | //读取文件内容到 modules 7 | modules = modules.concat(modulesFiles[filePath].default) 8 | } 9 | export function setupProdMockServer() { 10 | //创建prod mock server 11 | createProdMockServer([...modules]) 12 | } 13 | -------------------------------------------------------------------------------- /mock/example.ts: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | url: '/getMapInfo', 4 | method: 'get', 5 | response: () => { 6 | return { 7 | code: 200, 8 | title: 'mock请求测试' 9 | } 10 | } 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /mock/excel.ts: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | 3 | const NameList: any = [] 4 | const count = 100 5 | 6 | for (let i = 0; i < count; i++) { 7 | NameList.push( 8 | Mock.mock({ 9 | name: '@first' 10 | }) 11 | ) 12 | } 13 | NameList.push({ name: 'mock-Pan' }) 14 | 15 | export default [ 16 | { 17 | url: '/vue3-admin-plus/search/user', 18 | method: 'get', 19 | response: (config) => { 20 | const { name } = config.query 21 | const mockNameList = NameList.filter((item) => { 22 | // @ts-ignore 23 | const lowerCaseName = item.name.toLowerCase() 24 | return !(name && !lowerCaseName.includes(name.toLowerCase())) 25 | }) 26 | return { 27 | code: 20000, 28 | data: { items: mockNameList } 29 | } 30 | } 31 | }, 32 | { 33 | url: '/vue3-admin-plus/transaction/list', 34 | method: 'get', 35 | response: () => { 36 | return { 37 | code: 20000, 38 | data: { 39 | total: 20, 40 | 'items|20': [ 41 | { 42 | order_no: '@guid()', 43 | timestamp: +Mock.Random.date('T'), 44 | username: '@name()', 45 | price: '@float(1000, 15000, 0, 2)', 46 | 'status|1': ['success', 'pending'] 47 | } 48 | ] 49 | } 50 | } 51 | } 52 | } 53 | ] 54 | -------------------------------------------------------------------------------- /mock/table.ts: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | 3 | const data = Mock.mock({ 4 | 'items|30': [ 5 | { 6 | id: '@id', 7 | title: '@sentence(10, 20)', 8 | 'status|1': ['published', 'draft', 'deleted'], 9 | author: 'name', 10 | display_time: '@datetime', 11 | pageviews: '@integer(300, 5000)' 12 | } 13 | ] 14 | }) 15 | 16 | export default [ 17 | { 18 | url: '/vue3-admin-plus/table/list', 19 | method: 'get', 20 | response: () => { 21 | const items = data.items 22 | return { 23 | code: 20000, 24 | data: { 25 | total: items.length, 26 | items 27 | } 28 | } 29 | } 30 | } 31 | ] 32 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/public/favicon.ico -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 40 | 46 | -------------------------------------------------------------------------------- /src/api/dataAuth.ts: -------------------------------------------------------------------------------- 1 | // 新增和编辑接口 2 | import request from '@/utils/axios-req' 3 | //新增 4 | export const addDataAuth = (data) => { 5 | return request({ 6 | url: `/system/role/dataScope`, 7 | data, 8 | reqLoading: false, 9 | method: 'post' 10 | }) 11 | } 12 | //更新 13 | export const updateDataAuth = (data) => { 14 | return request({ 15 | url: `/system/role/dataScope`, 16 | data, 17 | method: 'put' 18 | }) 19 | } 20 | //详情 21 | export const getDataAuth = (id) => { 22 | return request({ 23 | url: `/system/role/deptTree/${id}`, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 查询部门下拉树结构 29 | // 根据角色ID查询部门树结构 30 | export function deptTreeSelect(roleId) { 31 | return request({ 32 | url: `/system/role/deptTree/${roleId}`, 33 | method: 'get' 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /src/api/dept.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/dept/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query||{} 11 | }) 12 | } 13 | 14 | //导出 15 | export const exportReq = (reqConfig) => { 16 | return request({ 17 | url: `/system/dept/export`, 18 | responseType: 'blob', 19 | method: 'post', 20 | params: Object.assign(reqConfig, { responseType: 'blob' }) 21 | }) 22 | } 23 | 24 | //删除 25 | export const deleteReq = (id) => { 26 | return request({ 27 | url: `/system/dept/${id}`, 28 | method: 'delete' 29 | }) 30 | } 31 | 32 | /** 33 | * 新增编辑页面接口 34 | *Dept新增 35 | */ 36 | export const addDept = (data) => { 37 | return request({ 38 | url: `/system/dept`, 39 | data, 40 | method: 'post' 41 | }) 42 | } 43 | 44 | /** 45 | *Dept更新 46 | @param {*} id 详情id 47 | */ 48 | export const updateDept = (data) => { 49 | return request({ 50 | url: `/system/dept`, 51 | method: 'put', 52 | data 53 | }) 54 | } 55 | 56 | /** 57 | *Dept详情 58 | * @param {*} data json数据 59 | */ 60 | export const getDept = (id) => { 61 | return request({ 62 | url: `/system/dept/${id}`, 63 | method: 'get' 64 | }) 65 | } 66 | -------------------------------------------------------------------------------- /src/api/dictData.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/sysDictData/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/system/sysDictData/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/system/sysDictData/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | //导出 31 | export const exportReq = (reqConfig) => { 32 | return request({ 33 | url: `/system/sysDictData/export`, 34 | responseType: 'blob', 35 | method: 'post', 36 | params: Object.assign(reqConfig, { responseType: 'blob' }) 37 | }) 38 | } 39 | 40 | /** 41 | * 新增编辑页面接口 42 | *Dict新增 43 | */ 44 | export const addDict = (data) => { 45 | return request({ 46 | url: `/system/sysDictData`, 47 | data, 48 | method: 'post' 49 | }) 50 | } 51 | 52 | /** 53 | *Dict更新 54 | @param {*} id 详情id 55 | */ 56 | export const updateDict = (data) => { 57 | return request({ 58 | url: `/system/sysDictData`, 59 | method: 'put', 60 | data 61 | }) 62 | } 63 | 64 | /** 65 | *Dict详情 66 | * @param {*} data json数据 67 | */ 68 | export const getDict = (id) => { 69 | return request({ 70 | url: `/system/sysDictData/${id}`, 71 | method: 'get' 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /src/api/loginInfo.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/monitor/loginInfo/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/monitor/loginInfo/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/monitor/loginInfo/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | //导出 31 | export const exportReq = (reqConfig) => { 32 | return request({ 33 | url: `monitor/loginInfo/export`, 34 | responseType: 'blob', 35 | method: 'post', 36 | params: Object.assign(reqConfig, { responseType: 'blob' }) 37 | }) 38 | } 39 | 40 | // 解锁用户登录状态 41 | export function unlockLoginInfo(userName) { 42 | return request({ 43 | url: `/monitor/loginInfo/unlock/${userName}`, 44 | method: 'get' 45 | }) 46 | } 47 | 48 | // 清空登录日志 49 | export function cleanLoginInfo() { 50 | return request({ 51 | url: '/monitor/loginInfo/clean', 52 | method: 'delete' 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /src/api/menu.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listMenuReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/menu/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/system/menu/deleteById/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //模板下载 23 | export const downloadTemplateReq = () => { 24 | return request({ 25 | url: `system/role/importTemplate`, 26 | method: 'post' 27 | }) 28 | } 29 | 30 | // 新增和编辑接口 31 | 32 | //新增 33 | export const addMenu = (data) => { 34 | return request({ 35 | url: `/system/menu`, 36 | data, 37 | method: 'post' 38 | }) 39 | } 40 | //更新 41 | export const updateMenu = (data) => { 42 | return request({ 43 | url: `/system/menu`, 44 | data, 45 | method: 'put' 46 | }) 47 | } 48 | //详情 49 | export const getMenu = (id) => { 50 | return request({ 51 | url: `/system/menu/${id}`, 52 | method: 'get' 53 | }) 54 | } 55 | -------------------------------------------------------------------------------- /src/api/operatorLog.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/monitor/operatorLog/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/monitor/operatorLog/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/monitor/operatorLog/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | //导出 31 | export const exportReq = (reqConfig) => { 32 | return request({ 33 | url: `monitor/operatorLog/export`, 34 | responseType: 'blob', 35 | method: 'post', 36 | params: Object.assign(reqConfig, { responseType: 'blob' }) 37 | }) 38 | } 39 | -------------------------------------------------------------------------------- /src/api/oss.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/oss/listPage', 8 | method: 'get', 9 | reqLoading: false, 10 | params: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/system/oss/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/system/oss/mul/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | export const exportReq = () => {} 31 | -------------------------------------------------------------------------------- /src/api/ossConfig.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/oss/config/list', 8 | method: 'get', 9 | reqLoading: false, 10 | params: query 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/system/oss/config/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/system/oss/config/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | /** 31 | * 新增编辑页面接口 32 | *OssConfig新增 33 | */ 34 | export const addOssConfig = (data) => { 35 | return request({ 36 | url: `/system/oss/config`, 37 | data, 38 | method: 'post' 39 | }) 40 | } 41 | 42 | // 对象存储状态修改 43 | export const changeOssConfigStatus = (ossConfigId, status, configKey) => { 44 | const data = { 45 | ossConfigId, 46 | status, 47 | configKey 48 | } 49 | return request({ 50 | url: '/system/oss/config/changeStatus', 51 | method: 'put', 52 | data 53 | }) 54 | } 55 | 56 | /** 57 | *OssConfig更新 58 | @param {*} id 详情id 59 | */ 60 | export const updateOssConfig = (data) => { 61 | return request({ 62 | url: `/system/oss/config`, 63 | method: 'put', 64 | data 65 | }) 66 | } 67 | 68 | /** 69 | *OssConfig详情 70 | * @param {*} data json数据 71 | */ 72 | export const getOssConfig = (id) => { 73 | return request({ 74 | url: `/system/oss/config/${id}`, 75 | method: 'get' 76 | }) 77 | } 78 | -------------------------------------------------------------------------------- /src/api/post.ts: -------------------------------------------------------------------------------- 1 | //查询列表页面接口 2 | import request from '@/utils/axios-req' 3 | 4 | export const listReq = (query) => { 5 | //查询列表 6 | return request({ 7 | url: '/system/post/list', 8 | method: 'post', 9 | reqLoading: false, 10 | data: query||{} 11 | }) 12 | } 13 | 14 | //删除 15 | export const deleteReq = (id) => { 16 | return request({ 17 | url: `/system/post/${id}`, 18 | method: 'delete' 19 | }) 20 | } 21 | 22 | //批量删除 23 | export const multiDeleteReq = (id) => { 24 | return request({ 25 | url: `/system/post/${id}`, 26 | method: 'delete' 27 | }) 28 | } 29 | 30 | //导出 31 | export const exportReq = (reqConfig) => { 32 | return request({ 33 | url: `/system/post/export`, 34 | responseType: 'blob', 35 | method: 'post', 36 | params: Object.assign(reqConfig, { responseType: 'blob' }) 37 | }) 38 | } 39 | 40 | /** 41 | * 新增编辑页面接口 42 | *Post新增 43 | */ 44 | export const addPost = (data) => { 45 | return request({ 46 | url: `/system/post`, 47 | data, 48 | method: 'post' 49 | }) 50 | } 51 | 52 | /** 53 | *Post更新 54 | @param {*} id 详情id 55 | */ 56 | export const updatePost = (data) => { 57 | return request({ 58 | url: `/system/post`, 59 | method: 'put', 60 | data 61 | }) 62 | } 63 | 64 | /** 65 | *Post详情 66 | * @param {*} data json数据 67 | */ 68 | export const getPost = (id) => { 69 | return request({ 70 | url: `/system/post/${id}`, 71 | method: 'get' 72 | }) 73 | } 74 | -------------------------------------------------------------------------------- /src/api/rbac.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/axios-req' 2 | import settings from '@/settings' 3 | 4 | export const userInfoReq = () => { 5 | return new Promise((resolve) => { 6 | const reqConfig = { 7 | url: 'rbac/getInfo', 8 | data:{platformId: settings.platformId}, 9 | method: 'get' 10 | } 11 | request(reqConfig).then(({ data }) => { 12 | resolve(data) 13 | }) 14 | }) 15 | } 16 | 17 | //登录 18 | export const loginReq = (subForm) => { 19 | return request({ 20 | url: 'rbac/login', 21 | data: subForm, 22 | method: 'post', 23 | isNotTipErrorMsg: true 24 | }) 25 | } 26 | // 注册方法 27 | export const register = (data) => { 28 | return request({ 29 | url: 'rbac/register', 30 | method: 'post', 31 | data 32 | }) 33 | } 34 | //获取验证码 35 | export const getCodeImg = () => { 36 | return request({ 37 | url: 'rbac/getCode', 38 | params:{width:85,height:50}, 39 | method: 'get' 40 | }) 41 | } 42 | -------------------------------------------------------------------------------- /src/api/remote-search.ts: -------------------------------------------------------------------------------- 1 | import request from 'axios' 2 | 3 | export function searchUser(name) { 4 | return request({ 5 | url: '/vue3-admin-plus/search/user', 6 | method: 'get', 7 | params: { name } 8 | }) 9 | } 10 | 11 | export function transactionList(query) { 12 | return request({ 13 | url: '/vue3-admin-plus/transaction/list', 14 | method: 'get', 15 | params: query 16 | }) 17 | } 18 | -------------------------------------------------------------------------------- /src/api/system/dict/data.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/axios-req' 2 | 3 | // 查询字典数据列表 4 | export function listData(query) { 5 | return request({ 6 | url: '/system/dict/data/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询字典数据详细 13 | export function getData(dictCode) { 14 | return request({ 15 | url: `/system/dict/data/${dictCode}`, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 根据字典类型查询字典数据信息 21 | export function getDicts(dictType) { 22 | return request({ 23 | url: `/system/dict/data/type/${dictType}`, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 新增字典数据 29 | export function addData(data) { 30 | return request({ 31 | url: '/system/dict/data', 32 | method: 'post', 33 | data 34 | }) 35 | } 36 | 37 | // 修改字典数据 38 | export function updateData(data) { 39 | return request({ 40 | url: '/system/dict/data', 41 | method: 'put', 42 | data 43 | }) 44 | } 45 | 46 | // 删除字典数据 47 | export function delData(dictCode) { 48 | return request({ 49 | url: `/system/dict/data/${dictCode}`, 50 | method: 'delete' 51 | }) 52 | } 53 | -------------------------------------------------------------------------------- /src/api/system/dict/type.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询字典类型列表 4 | export function listType(query) { 5 | return request({ 6 | url: 'system/sysDictype/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询字典类型详细 13 | export function getType(dictId) { 14 | return request({ 15 | url: `system/sysDictype/${ dictId}`, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增字典类型 21 | export function addType(data) { 22 | return request({ 23 | url: '/system/dict/type', 24 | method: 'post', 25 | data 26 | }) 27 | } 28 | 29 | // 修改字典类型 30 | export function updateType(data) { 31 | return request({ 32 | url: '/system/dict/type', 33 | method: 'put', 34 | data 35 | }) 36 | } 37 | 38 | // 删除字典类型 39 | export function delType(dictId) { 40 | return request({ 41 | url: `system/sysDictype/${ dictId}`, 42 | method: 'delete' 43 | }) 44 | } 45 | 46 | // 刷新字典缓存 47 | export function refreshCache() { 48 | return request({ 49 | url: 'system/sysDictype/refreshCache', 50 | method: 'delete' 51 | }) 52 | } 53 | 54 | // 获取字典选择框列表 55 | export function optionselect() { 56 | return request({ 57 | url: 'system/sysDictype/optionselect', 58 | method: 'get' 59 | }) 60 | } 61 | -------------------------------------------------------------------------------- /src/api/table.ts: -------------------------------------------------------------------------------- 1 | import request from 'axios' 2 | 3 | export function getList(params) { 4 | return request({ 5 | url: '/vue3-admin-plus/table/list', 6 | method: 'get', 7 | params 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/404_images/404.png -------------------------------------------------------------------------------- /src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /src/assets/gif/dianchi.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/gif/dianchi.gif -------------------------------------------------------------------------------- /src/assets/layout/animation-image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/layout/animation-image.gif -------------------------------------------------------------------------------- /src/assets/layout/login-bg.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/layout/login-front.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/layout/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jzfai/vue3-admin-plus/e68d9108785ab118ef4fc0e6196a93778d2fff29/src/assets/layout/logo.png -------------------------------------------------------------------------------- /src/components/DictTag.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | 27 | 32 | -------------------------------------------------------------------------------- /src/components/ElSvgIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 27 | 28 | 37 | -------------------------------------------------------------------------------- /src/components/InnerLink/index.vue: -------------------------------------------------------------------------------- 1 |