diff --git a/.env.development b/.env.development index 2744ed21f..17285acf0 100644 --- a/.env.development +++ b/.env.development @@ -6,3 +6,5 @@ VITE_APP_ENV = 'development' # 若依管理系统/开发环境 VITE_APP_BASE_API = '/dev-api' + +VITE_PROXY_BASE_URL = 'http://localhost:8080' diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..69f047ece --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +/bin +/html +/node_modules +/vite +/public \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 000000000..4ceb0b70e --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,37 @@ +module.exports = { + root: true, + parserOptions: { + sourceType: 'module', + ecmaVersion: 2021, + }, + parser: 'vue-eslint-parser', + extends: ['plugin:vue/vue3-recommended', 'airbnb-base', 'plugin:prettier/recommended', 'plugin:jsx-a11y/recommended'], + plugins: ['prettier', 'jsx-a11y'], + env: { + browser: true, + node: true, + es6: true, + 'vue/setup-compiler-macros': true, + }, + rules: { + 'consistent-return': 'off', + 'prettier/prettier': ['error'], + 'no-console': 'off', + 'no-unused-expressions': 'off', + 'import/no-unresolved': 'off', + 'import/extensions': 'off', + 'import/no-absolute-path': 'off', + 'import/no-extraneous-dependencies': 'off', + 'import/prefer-default-export': 'off', + 'no-shadow': 'off', + 'no-param-reassign': 'off', + 'no-restricted-syntax': 'off', + 'no-use-before-define': 'off', + 'no-plusplus': [ + 'off', + { + allowForLoopAfterthoughts: true, + }, + ], + }, +} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..3427073be --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint-fix diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 000000000..3427073be --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint-fix diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..43cff5b3f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 120, + "semi": false, + "singleQuote": true, + "endOfLine": "auto" +} diff --git a/package.json b/package.json index fc1939f79..04a40a257 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "dev": "vite", "build:prod": "vite build", "build:stage": "vite build --mode staging", - "preview": "vite preview" + "lint-fix": "eslint --fix --ext .js --ext .jsx src/ && git add .", + "preview": "vite preview", + "prepare": "husky install" }, "repository": { "type": "git", @@ -20,12 +22,20 @@ "axios": "0.27.2", "echarts": "5.4.0", "element-plus": "2.2.27", + "eslint": "^8.5.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.2.0", "file-saver": "2.0.5", "fuse.js": "6.6.2", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", "nprogress": "0.2.0", "pinia": "2.0.22", + "prettier": "^2.5.1", "vue": "3.2.45", "vue-cropper": "1.0.3", "vue-router": "4.1.4" @@ -33,6 +43,7 @@ "devDependencies": { "@vitejs/plugin-vue": "3.1.0", "@vue/compiler-sfc": "3.2.45", + "husky": "^8.0.3", "sass": "1.56.1", "unplugin-auto-import": "0.11.4", "vite": "3.2.3", diff --git a/src/api/login.js b/src/api/login.js index 26742e79c..e5390c0ae 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -6,15 +6,15 @@ export function login(username, password, code, uuid) { username, password, code, - uuid + uuid, } return request({ url: '/login', headers: { - isToken: false + isToken: false, }, method: 'post', - data: data + data, }) } @@ -23,10 +23,10 @@ export function register(data) { return request({ url: '/register', headers: { - isToken: false + isToken: false, }, method: 'post', - data: data + data, }) } @@ -34,7 +34,7 @@ export function register(data) { export function getInfo() { return request({ url: '/getInfo', - method: 'get' + method: 'get', }) } @@ -42,7 +42,7 @@ export function getInfo() { export function logout() { return request({ url: '/logout', - method: 'post' + method: 'post', }) } @@ -51,9 +51,9 @@ export function getCodeImg() { return request({ url: '/captchaImage', headers: { - isToken: false + isToken: false, }, method: 'get', - timeout: 20000 + timeout: 20000, }) -} \ No newline at end of file +} diff --git a/src/api/menu.js b/src/api/menu.js index 6e52e6e8a..b4152b8e3 100644 --- a/src/api/menu.js +++ b/src/api/menu.js @@ -4,6 +4,6 @@ import request from '@/utils/request' export const getRouters = () => { return request({ url: '/getRouters', - method: 'get' + method: 'get', }) -} \ No newline at end of file +} diff --git a/src/api/monitor/cache.js b/src/api/monitor/cache.js index e1f2c878c..980267209 100644 --- a/src/api/monitor/cache.js +++ b/src/api/monitor/cache.js @@ -4,7 +4,7 @@ import request from '@/utils/request' export function getCache() { return request({ url: '/monitor/cache', - method: 'get' + method: 'get', }) } @@ -12,39 +12,39 @@ export function getCache() { export function listCacheName() { return request({ url: '/monitor/cache/getNames', - method: 'get' + method: 'get', }) } // 查询缓存键名列表 export function listCacheKey(cacheName) { return request({ - url: '/monitor/cache/getKeys/' + cacheName, - method: 'get' + url: `/monitor/cache/getKeys/${cacheName}`, + method: 'get', }) } // 查询缓存内容 export function getCacheValue(cacheName, cacheKey) { return request({ - url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, - method: 'get' + url: `/monitor/cache/getValue/${cacheName}/${cacheKey}`, + method: 'get', }) } // 清理指定名称缓存 export function clearCacheName(cacheName) { return request({ - url: '/monitor/cache/clearCacheName/' + cacheName, - method: 'delete' + url: `/monitor/cache/clearCacheName/${cacheName}`, + method: 'delete', }) } // 清理指定键名缓存 export function clearCacheKey(cacheKey) { return request({ - url: '/monitor/cache/clearCacheKey/' + cacheKey, - method: 'delete' + url: `/monitor/cache/clearCacheKey/${cacheKey}`, + method: 'delete', }) } @@ -52,6 +52,6 @@ export function clearCacheKey(cacheKey) { export function clearCacheAll() { return request({ url: '/monitor/cache/clearCacheAll', - method: 'delete' + method: 'delete', }) } diff --git a/src/api/monitor/job.js b/src/api/monitor/job.js index b33ad3d95..a2a17daca 100644 --- a/src/api/monitor/job.js +++ b/src/api/monitor/job.js @@ -5,15 +5,15 @@ export function listJob(query) { return request({ url: '/monitor/job/list', method: 'get', - params: query + params: query, }) } // 查询定时任务调度详细 export function getJob(jobId) { return request({ - url: '/monitor/job/' + jobId, - method: 'get' + url: `/monitor/job/${jobId}`, + method: 'get', }) } @@ -22,7 +22,7 @@ export function addJob(data) { return request({ url: '/monitor/job', method: 'post', - data: data + data, }) } @@ -31,15 +31,15 @@ export function updateJob(data) { return request({ url: '/monitor/job', method: 'put', - data: data + data, }) } // 删除定时任务调度 export function delJob(jobId) { return request({ - url: '/monitor/job/' + jobId, - method: 'delete' + url: `/monitor/job/${jobId}`, + method: 'delete', }) } @@ -47,25 +47,24 @@ export function delJob(jobId) { export function changeJobStatus(jobId, status) { const data = { jobId, - status + status, } return request({ url: '/monitor/job/changeStatus', method: 'put', - data: data + data, }) } - // 定时任务立即执行一次 export function runJob(jobId, jobGroup) { const data = { jobId, - jobGroup + jobGroup, } return request({ url: '/monitor/job/run', method: 'put', - data: data + data, }) -} \ No newline at end of file +} diff --git a/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js index 654bbae7e..76e09a228 100644 --- a/src/api/monitor/jobLog.js +++ b/src/api/monitor/jobLog.js @@ -5,15 +5,15 @@ export function listJobLog(query) { return request({ url: '/monitor/jobLog/list', method: 'get', - params: query + params: query, }) } // 删除调度日志 export function delJobLog(jobLogId) { return request({ - url: '/monitor/jobLog/' + jobLogId, - method: 'delete' + url: `/monitor/jobLog/${jobLogId}`, + method: 'delete', }) } @@ -21,6 +21,6 @@ export function delJobLog(jobLogId) { export function cleanJobLog() { return request({ url: '/monitor/jobLog/clean', - method: 'delete' + method: 'delete', }) } diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js index c49a40e1b..e8e691c74 100644 --- a/src/api/monitor/logininfor.js +++ b/src/api/monitor/logininfor.js @@ -5,23 +5,23 @@ export function list(query) { return request({ url: '/monitor/logininfor/list', method: 'get', - params: query + params: query, }) } // 删除登录日志 export function delLogininfor(infoId) { return request({ - url: '/monitor/logininfor/' + infoId, - method: 'delete' + url: `/monitor/logininfor/${infoId}`, + method: 'delete', }) } // 解锁用户登录状态 export function unlockLogininfor(userName) { return request({ - url: '/monitor/logininfor/unlock/' + userName, - method: 'get' + url: `/monitor/logininfor/unlock/${userName}`, + method: 'get', }) } @@ -29,6 +29,6 @@ export function unlockLogininfor(userName) { export function cleanLogininfor() { return request({ url: '/monitor/logininfor/clean', - method: 'delete' + method: 'delete', }) } diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js index 288ebe029..a625b9bc3 100644 --- a/src/api/monitor/online.js +++ b/src/api/monitor/online.js @@ -5,14 +5,14 @@ export function list(query) { return request({ url: '/monitor/online/list', method: 'get', - params: query + params: query, }) } // 强退用户 export function forceLogout(tokenId) { return request({ - url: '/monitor/online/' + tokenId, - method: 'delete' + url: `/monitor/online/${tokenId}`, + method: 'delete', }) } diff --git a/src/api/monitor/operlog.js b/src/api/monitor/operlog.js index 6e881dfe8..cdb8c4a0e 100644 --- a/src/api/monitor/operlog.js +++ b/src/api/monitor/operlog.js @@ -5,15 +5,15 @@ export function list(query) { return request({ url: '/monitor/operlog/list', method: 'get', - params: query + params: query, }) } // 删除操作日志 export function delOperlog(operId) { return request({ - url: '/monitor/operlog/' + operId, - method: 'delete' + url: `/monitor/operlog/${operId}`, + method: 'delete', }) } @@ -21,6 +21,6 @@ export function delOperlog(operId) { export function cleanOperlog() { return request({ url: '/monitor/operlog/clean', - method: 'delete' + method: 'delete', }) } diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js index cac77916e..5dcf995e9 100644 --- a/src/api/monitor/server.js +++ b/src/api/monitor/server.js @@ -4,6 +4,6 @@ import request from '@/utils/request' export function getServer() { return request({ url: '/monitor/server', - method: 'get' + method: 'get', }) -} \ No newline at end of file +} diff --git a/src/api/system/config.js b/src/api/system/config.js index 7858c6928..90c6a6d74 100644 --- a/src/api/system/config.js +++ b/src/api/system/config.js @@ -5,23 +5,23 @@ export function listConfig(query) { return request({ url: '/system/config/list', method: 'get', - params: query + params: query, }) } // 查询参数详细 export function getConfig(configId) { return request({ - url: '/system/config/' + configId, - method: 'get' + url: `/system/config/${configId}`, + method: 'get', }) } // 根据参数键名查询参数值 export function getConfigKey(configKey) { return request({ - url: '/system/config/configKey/' + configKey, - method: 'get' + url: `/system/config/configKey/${configKey}`, + method: 'get', }) } @@ -30,7 +30,7 @@ export function addConfig(data) { return request({ url: '/system/config', method: 'post', - data: data + data, }) } @@ -39,15 +39,15 @@ export function updateConfig(data) { return request({ url: '/system/config', method: 'put', - data: data + data, }) } // 删除参数配置 export function delConfig(configId) { return request({ - url: '/system/config/' + configId, - method: 'delete' + url: `/system/config/${configId}`, + method: 'delete', }) } @@ -55,6 +55,6 @@ export function delConfig(configId) { export function refreshCache() { return request({ url: '/system/config/refreshCache', - method: 'delete' + method: 'delete', }) } diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 9ca696630..d12b0b59d 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -5,23 +5,23 @@ export function listDept(query) { return request({ url: '/system/dept/list', method: 'get', - params: query + params: query, }) } // 查询部门列表(排除节点) export function listDeptExcludeChild(deptId) { return request({ - url: '/system/dept/list/exclude/' + deptId, - method: 'get' + url: `/system/dept/list/exclude/${deptId}`, + method: 'get', }) } // 查询部门详细 export function getDept(deptId) { return request({ - url: '/system/dept/' + deptId, - method: 'get' + url: `/system/dept/${deptId}`, + method: 'get', }) } @@ -30,7 +30,7 @@ export function addDept(data) { return request({ url: '/system/dept', method: 'post', - data: data + data, }) } @@ -39,14 +39,14 @@ export function updateDept(data) { return request({ url: '/system/dept', method: 'put', - data: data + data, }) } // 删除部门 export function delDept(deptId) { return request({ - url: '/system/dept/' + deptId, - method: 'delete' + url: `/system/dept/${deptId}`, + method: 'delete', }) -} \ No newline at end of file +} diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js index 2a6e48112..bae36c9d2 100644 --- a/src/api/system/dict/data.js +++ b/src/api/system/dict/data.js @@ -5,23 +5,23 @@ export function listData(query) { return request({ url: '/system/dict/data/list', method: 'get', - params: query + params: query, }) } // 查询字典数据详细 export function getData(dictCode) { return request({ - url: '/system/dict/data/' + dictCode, - method: 'get' + url: `/system/dict/data/${dictCode}`, + method: 'get', }) } // 根据字典类型查询字典数据信息 export function getDicts(dictType) { return request({ - url: '/system/dict/data/type/' + dictType, - method: 'get' + url: `/system/dict/data/type/${dictType}`, + method: 'get', }) } @@ -30,7 +30,7 @@ export function addData(data) { return request({ url: '/system/dict/data', method: 'post', - data: data + data, }) } @@ -39,14 +39,14 @@ export function updateData(data) { return request({ url: '/system/dict/data', method: 'put', - data: data + data, }) } // 删除字典数据 export function delData(dictCode) { return request({ - url: '/system/dict/data/' + dictCode, - method: 'delete' + url: `/system/dict/data/${dictCode}`, + method: 'delete', }) } diff --git a/src/api/system/dict/type.js b/src/api/system/dict/type.js index d89dbd1a0..e6c791ff7 100644 --- a/src/api/system/dict/type.js +++ b/src/api/system/dict/type.js @@ -5,15 +5,15 @@ export function listType(query) { return request({ url: '/system/dict/type/list', method: 'get', - params: query + params: query, }) } // 查询字典类型详细 export function getType(dictId) { return request({ - url: '/system/dict/type/' + dictId, - method: 'get' + url: `/system/dict/type/${dictId}`, + method: 'get', }) } @@ -22,7 +22,7 @@ export function addType(data) { return request({ url: '/system/dict/type', method: 'post', - data: data + data, }) } @@ -31,15 +31,15 @@ export function updateType(data) { return request({ url: '/system/dict/type', method: 'put', - data: data + data, }) } // 删除字典类型 export function delType(dictId) { return request({ - url: '/system/dict/type/' + dictId, - method: 'delete' + url: `/system/dict/type/${dictId}`, + method: 'delete', }) } @@ -47,7 +47,7 @@ export function delType(dictId) { export function refreshCache() { return request({ url: '/system/dict/type/refreshCache', - method: 'delete' + method: 'delete', }) } @@ -55,6 +55,6 @@ export function refreshCache() { export function optionselect() { return request({ url: '/system/dict/type/optionselect', - method: 'get' + method: 'get', }) } diff --git a/src/api/system/menu.js b/src/api/system/menu.js index 97258ee61..b9f85f26c 100644 --- a/src/api/system/menu.js +++ b/src/api/system/menu.js @@ -5,15 +5,15 @@ export function listMenu(query) { return request({ url: '/system/menu/list', method: 'get', - params: query + params: query, }) } // 查询菜单详细 export function getMenu(menuId) { return request({ - url: '/system/menu/' + menuId, - method: 'get' + url: `/system/menu/${menuId}`, + method: 'get', }) } @@ -21,15 +21,15 @@ export function getMenu(menuId) { export function treeselect() { return request({ url: '/system/menu/treeselect', - method: 'get' + method: 'get', }) } // 根据角色ID查询菜单下拉树结构 export function roleMenuTreeselect(roleId) { return request({ - url: '/system/menu/roleMenuTreeselect/' + roleId, - method: 'get' + url: `/system/menu/roleMenuTreeselect/${roleId}`, + method: 'get', }) } @@ -38,7 +38,7 @@ export function addMenu(data) { return request({ url: '/system/menu', method: 'post', - data: data + data, }) } @@ -47,14 +47,14 @@ export function updateMenu(data) { return request({ url: '/system/menu', method: 'put', - data: data + data, }) } // 删除菜单 export function delMenu(menuId) { return request({ - url: '/system/menu/' + menuId, - method: 'delete' + url: `/system/menu/${menuId}`, + method: 'delete', }) -} \ No newline at end of file +} diff --git a/src/api/system/notice.js b/src/api/system/notice.js index 737fc169d..6d4940e27 100644 --- a/src/api/system/notice.js +++ b/src/api/system/notice.js @@ -5,15 +5,15 @@ export function listNotice(query) { return request({ url: '/system/notice/list', method: 'get', - params: query + params: query, }) } // 查询公告详细 export function getNotice(noticeId) { return request({ - url: '/system/notice/' + noticeId, - method: 'get' + url: `/system/notice/${noticeId}`, + method: 'get', }) } @@ -22,7 +22,7 @@ export function addNotice(data) { return request({ url: '/system/notice', method: 'post', - data: data + data, }) } @@ -31,14 +31,14 @@ export function updateNotice(data) { return request({ url: '/system/notice', method: 'put', - data: data + data, }) } // 删除公告 export function delNotice(noticeId) { return request({ - url: '/system/notice/' + noticeId, - method: 'delete' + url: `/system/notice/${noticeId}`, + method: 'delete', }) -} \ No newline at end of file +} diff --git a/src/api/system/post.js b/src/api/system/post.js index 8faa2669f..b0255aa13 100644 --- a/src/api/system/post.js +++ b/src/api/system/post.js @@ -5,15 +5,15 @@ export function listPost(query) { return request({ url: '/system/post/list', method: 'get', - params: query + params: query, }) } // 查询岗位详细 export function getPost(postId) { return request({ - url: '/system/post/' + postId, - method: 'get' + url: `/system/post/${postId}`, + method: 'get', }) } @@ -22,7 +22,7 @@ export function addPost(data) { return request({ url: '/system/post', method: 'post', - data: data + data, }) } @@ -31,14 +31,14 @@ export function updatePost(data) { return request({ url: '/system/post', method: 'put', - data: data + data, }) } // 删除岗位 export function delPost(postId) { return request({ - url: '/system/post/' + postId, - method: 'delete' + url: `/system/post/${postId}`, + method: 'delete', }) } diff --git a/src/api/system/role.js b/src/api/system/role.js index 528cd186c..27c835319 100644 --- a/src/api/system/role.js +++ b/src/api/system/role.js @@ -5,15 +5,15 @@ export function listRole(query) { return request({ url: '/system/role/list', method: 'get', - params: query + params: query, }) } // 查询角色详细 export function getRole(roleId) { return request({ - url: '/system/role/' + roleId, - method: 'get' + url: `/system/role/${roleId}`, + method: 'get', }) } @@ -22,7 +22,7 @@ export function addRole(data) { return request({ url: '/system/role', method: 'post', - data: data + data, }) } @@ -31,7 +31,7 @@ export function updateRole(data) { return request({ url: '/system/role', method: 'put', - data: data + data, }) } @@ -40,7 +40,7 @@ export function dataScope(data) { return request({ url: '/system/role/dataScope', method: 'put', - data: data + data, }) } @@ -48,20 +48,20 @@ export function dataScope(data) { export function changeRoleStatus(roleId, status) { const data = { roleId, - status + status, } return request({ url: '/system/role/changeStatus', method: 'put', - data: data + data, }) } // 删除角色 export function delRole(roleId) { return request({ - url: '/system/role/' + roleId, - method: 'delete' + url: `/system/role/${roleId}`, + method: 'delete', }) } @@ -70,7 +70,7 @@ export function allocatedUserList(query) { return request({ url: '/system/role/authUser/allocatedList', method: 'get', - params: query + params: query, }) } @@ -79,7 +79,7 @@ export function unallocatedUserList(query) { return request({ url: '/system/role/authUser/unallocatedList', method: 'get', - params: query + params: query, }) } @@ -88,7 +88,7 @@ export function authUserCancel(data) { return request({ url: '/system/role/authUser/cancel', method: 'put', - data: data + data, }) } @@ -97,7 +97,7 @@ export function authUserCancelAll(data) { return request({ url: '/system/role/authUser/cancelAll', method: 'put', - params: data + params: data, }) } @@ -106,14 +106,14 @@ export function authUserSelectAll(data) { return request({ url: '/system/role/authUser/selectAll', method: 'put', - params: data + params: data, }) } // 根据角色ID查询部门树结构 export function deptTreeSelect(roleId) { return request({ - url: '/system/role/deptTree/' + roleId, - method: 'get' + url: `/system/role/deptTree/${roleId}`, + method: 'get', }) } diff --git a/src/api/system/user.js b/src/api/system/user.js index 9b949e911..c89d5d5e6 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -1,20 +1,20 @@ import request from '@/utils/request' -import { parseStrEmpty } from "@/utils/ruoyi"; +import { parseStrEmpty } from '@/utils/ruoyi' // 查询用户列表 export function listUser(query) { return request({ url: '/system/user/list', method: 'get', - params: query + params: query, }) } // 查询用户详细 export function getUser(userId) { return request({ - url: '/system/user/' + parseStrEmpty(userId), - method: 'get' + url: `/system/user/${parseStrEmpty(userId)}`, + method: 'get', }) } @@ -23,7 +23,7 @@ export function addUser(data) { return request({ url: '/system/user', method: 'post', - data: data + data, }) } @@ -32,15 +32,15 @@ export function updateUser(data) { return request({ url: '/system/user', method: 'put', - data: data + data, }) } // 删除用户 export function delUser(userId) { return request({ - url: '/system/user/' + userId, - method: 'delete' + url: `/system/user/${userId}`, + method: 'delete', }) } @@ -48,12 +48,12 @@ export function delUser(userId) { export function resetUserPwd(userId, password) { const data = { userId, - password + password, } return request({ url: '/system/user/resetPwd', method: 'put', - data: data + data, }) } @@ -61,12 +61,12 @@ export function resetUserPwd(userId, password) { export function changeUserStatus(userId, status) { const data = { userId, - status + status, } return request({ url: '/system/user/changeStatus', method: 'put', - data: data + data, }) } @@ -74,7 +74,7 @@ export function changeUserStatus(userId, status) { export function getUserProfile() { return request({ url: '/system/user/profile', - method: 'get' + method: 'get', }) } @@ -83,7 +83,7 @@ export function updateUserProfile(data) { return request({ url: '/system/user/profile', method: 'put', - data: data + data, }) } @@ -91,12 +91,12 @@ export function updateUserProfile(data) { export function updateUserPwd(oldPassword, newPassword) { const data = { oldPassword, - newPassword + newPassword, } return request({ url: '/system/user/profile/updatePwd', method: 'put', - params: data + params: data, }) } @@ -105,15 +105,15 @@ export function uploadAvatar(data) { return request({ url: '/system/user/profile/avatar', method: 'post', - data: data + data, }) } // 查询授权角色 export function getAuthRole(userId) { return request({ - url: '/system/user/authRole/' + userId, - method: 'get' + url: `/system/user/authRole/${userId}`, + method: 'get', }) } @@ -122,7 +122,7 @@ export function updateAuthRole(data) { return request({ url: '/system/user/authRole', method: 'put', - params: data + params: data, }) } @@ -130,6 +130,6 @@ export function updateAuthRole(data) { export function deptTreeSelect() { return request({ url: '/system/user/deptTree', - method: 'get' + method: 'get', }) } diff --git a/src/api/tool/gen.js b/src/api/tool/gen.js index afaf2a959..aa34b1fa5 100644 --- a/src/api/tool/gen.js +++ b/src/api/tool/gen.js @@ -5,7 +5,7 @@ export function listTable(query) { return request({ url: '/tool/gen/list', method: 'get', - params: query + params: query, }) } // 查询db数据库列表 @@ -13,15 +13,15 @@ export function listDbTable(query) { return request({ url: '/tool/gen/db/list', method: 'get', - params: query + params: query, }) } // 查询表详细信息 export function getGenTable(tableId) { return request({ - url: '/tool/gen/' + tableId, - method: 'get' + url: `/tool/gen/${tableId}`, + method: 'get', }) } @@ -30,7 +30,7 @@ export function updateGenTable(data) { return request({ url: '/tool/gen', method: 'put', - data: data + data, }) } @@ -39,38 +39,38 @@ export function importTable(data) { return request({ url: '/tool/gen/importTable', method: 'post', - params: data + params: data, }) } // 预览生成代码 export function previewTable(tableId) { return request({ - url: '/tool/gen/preview/' + tableId, - method: 'get' + url: `/tool/gen/preview/${tableId}`, + method: 'get', }) } // 删除表数据 export function delTable(tableId) { return request({ - url: '/tool/gen/' + tableId, - method: 'delete' + url: `/tool/gen/${tableId}`, + method: 'delete', }) } // 生成代码(自定义路径) export function genCode(tableName) { return request({ - url: '/tool/gen/genCode/' + tableName, - method: 'get' + url: `/tool/gen/genCode/${tableName}`, + method: 'get', }) } // 同步数据库 export function synchDb(tableName) { return request({ - url: '/tool/gen/synchDb/' + tableName, - method: 'get' + url: `/tool/gen/synchDb/${tableName}`, + method: 'get', }) } diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js index 158b5366f..8d6211f6f 100644 --- a/src/components/IconSelect/requireIcons.js +++ b/src/components/IconSelect/requireIcons.js @@ -1,8 +1,9 @@ -let icons = [] -const modules = import.meta.glob('./../../assets/icons/svg/*.svg'); +const icons = [] +const modules = import.meta.glob('./../../assets/icons/svg/*.svg') +// eslint-disable-next-line guard-for-in for (const path in modules) { - const p = path.split('assets/icons/svg/')[1].split('.svg')[0]; - icons.push(p); + const p = path.split('assets/icons/svg/')[1].split('.svg')[0] + icons.push(p) } -export default icons \ No newline at end of file +export default icons diff --git a/src/components/SvgIcon/svgicon.js b/src/components/SvgIcon/svgicon.js index b7c190707..bc24cfbb0 100644 --- a/src/components/SvgIcon/svgicon.js +++ b/src/components/SvgIcon/svgicon.js @@ -1,10 +1,11 @@ import * as components from '@element-plus/icons-vue' export default { - install: (app) => { - for (const key in components) { - const componentConfig = components[key]; - app.component(componentConfig.name, componentConfig); - } - }, -}; + install: (app) => { + // eslint-disable-next-line guard-for-in + for (const key in components) { + const componentConfig = components[key] + app.component(componentConfig.name, componentConfig) + } + }, +} diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js index f1316cee0..de84034bd 100644 --- a/src/directive/common/copyText.js +++ b/src/directive/common/copyText.js @@ -1,66 +1,68 @@ /** -* v-copyText 复制文本内容 -* Copyright (c) 2022 ruoyi -*/ + * v-copyText 复制文本内容 + * Copyright (c) 2022 ruoyi + */ export default { beforeMount(el, { value, arg }) { - if (arg === "callback") { - el.$copyCallback = value; + if (arg === 'callback') { + el.$copyCallback = value } else { - el.$copyValue = value; + el.$copyValue = value const handler = () => { - copyTextToClipboard(el.$copyValue); + copyTextToClipboard(el.$copyValue) if (el.$copyCallback) { - el.$copyCallback(el.$copyValue); + el.$copyCallback(el.$copyValue) } - }; - el.addEventListener("click", handler); - el.$destroyCopy = () => el.removeEventListener("click", handler); + } + el.addEventListener('click', handler) + el.$destroyCopy = () => el.removeEventListener('click', handler) } - } + }, } function copyTextToClipboard(input, { target = document.body } = {}) { - const element = document.createElement('textarea'); - const previouslyFocusedElement = document.activeElement; + const element = document.createElement('textarea') + const previouslyFocusedElement = document.activeElement - element.value = input; + element.value = input // Prevent keyboard from showing on mobile - element.setAttribute('readonly', ''); + element.setAttribute('readonly', '') - element.style.contain = 'strict'; - element.style.position = 'absolute'; - element.style.left = '-9999px'; - element.style.fontSize = '12pt'; // Prevent zooming on iOS + element.style.contain = 'strict' + element.style.position = 'absolute' + element.style.left = '-9999px' + element.style.fontSize = '12pt' // Prevent zooming on iOS - const selection = document.getSelection(); - const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0); + const selection = document.getSelection() + const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0) - target.append(element); - element.select(); + target.append(element) + element.select() // Explicit selection workaround for iOS - element.selectionStart = 0; - element.selectionEnd = input.length; + element.selectionStart = 0 + element.selectionEnd = input.length - let isSuccess = false; + let isSuccess = false try { - isSuccess = document.execCommand('copy'); - } catch { } + isSuccess = document.execCommand('copy') + } catch (e) { + console.error(e) + } - element.remove(); + element.remove() if (originalRange) { - selection.removeAllRanges(); - selection.addRange(originalRange); + selection.removeAllRanges() + selection.addRange(originalRange) } // Get the focus back on the previously focused element, if any if (previouslyFocusedElement) { - previouslyFocusedElement.focus(); + previouslyFocusedElement.focus() } - return isSuccess; + return isSuccess } diff --git a/src/directive/index.js b/src/directive/index.js index a86e00b32..dfba672f8 100644 --- a/src/directive/index.js +++ b/src/directive/index.js @@ -2,8 +2,8 @@ import hasRole from './permission/hasRole' import hasPermi from './permission/hasPermi' import copyText from './common/copyText' -export default function directive(app){ +export default function directive(app) { app.directive('hasRole', hasRole) app.directive('hasPermi', hasPermi) app.directive('copyText', copyText) -} \ No newline at end of file +} diff --git a/src/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js index 4581e0144..51a5da6c7 100644 --- a/src/directive/permission/hasPermi.js +++ b/src/directive/permission/hasPermi.js @@ -1,21 +1,21 @@ - /** +/** * v-hasPermi 操作权限处理 * Copyright (c) 2019 ruoyi */ - + import useUserStore from '@/store/modules/user' export default { - mounted(el, binding, vnode) { + mounted(el, binding) { const { value } = binding - const all_permission = "*:*:*"; - const permissions = useUserStore().permissions + const allPermission = '*:*:*' + const { permissions } = useUserStore() if (value && value instanceof Array && value.length > 0) { const permissionFlag = value - const hasPermissions = permissions.some(permission => { - return all_permission === permission || permissionFlag.includes(permission) + const hasPermissions = permissions.some((permission) => { + return allPermission === permission || permissionFlag.includes(permission) }) if (!hasPermissions) { @@ -24,5 +24,5 @@ export default { } else { throw new Error(`请设置操作权限标签值`) } - } + }, } diff --git a/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js index 0c3479177..78bace282 100644 --- a/src/directive/permission/hasRole.js +++ b/src/directive/permission/hasRole.js @@ -1,21 +1,21 @@ - /** +/** * v-hasRole 角色权限处理 * Copyright (c) 2019 ruoyi */ - + import useUserStore from '@/store/modules/user' export default { - mounted(el, binding, vnode) { + mounted(el, binding) { const { value } = binding - const super_admin = "admin"; - const roles = useUserStore().roles + const superAdmin = 'admin' + const { roles } = useUserStore() if (value && value instanceof Array && value.length > 0) { const roleFlag = value - const hasRole = roles.some(role => { - return super_admin === role || roleFlag.includes(role) + const hasRole = roles.some((role) => { + return superAdmin === role || roleFlag.includes(role) }) if (!hasRole) { @@ -24,5 +24,5 @@ export default { } else { throw new Error(`请设置角色权限标签值`) } - } + }, } diff --git a/src/main.js b/src/main.js index 28725e7bd..3aa9b99a8 100644 --- a/src/main.js +++ b/src/main.js @@ -12,7 +12,6 @@ import store from './store' import router from './router' import directive from './directive' // directive - // 注册指令 import plugins from './plugins' // plugins import { download } from '@/utils/request' @@ -32,11 +31,11 @@ import Pagination from '@/components/Pagination' // 自定义表格工具组件 import RightToolbar from '@/components/RightToolbar' // 文件上传组件 -import FileUpload from "@/components/FileUpload" +import FileUpload from '@/components/FileUpload' // 图片上传组件 -import ImageUpload from "@/components/ImageUpload" +import ImageUpload from '@/components/ImageUpload' // 图片预览组件 -import ImagePreview from "@/components/ImagePreview" +import ImagePreview from '@/components/ImagePreview' // 自定义树选择组件 import TreeSelect from '@/components/TreeSelect' // 字典标签组件 @@ -56,6 +55,7 @@ app.config.globalProperties.selectDictLabels = selectDictLabels // 全局组件挂载 app.component('DictTag', DictTag) +// eslint-disable-next-line vue/multi-word-component-names app.component('Pagination', Pagination) app.component('TreeSelect', TreeSelect) app.component('FileUpload', FileUpload) @@ -67,15 +67,15 @@ app.use(router) app.use(store) app.use(plugins) app.use(elementIcons) -app.component('svg-icon', SvgIcon) +app.component('SvgIcon', SvgIcon) directive(app) // 使用element-plus 并且设置全局的大小 app.use(ElementPlus, { - locale: locale, + locale, // 支持 large、default、small - size: Cookies.get('size') || 'default' + size: Cookies.get('size') || 'default', }) app.mount('#app') diff --git a/src/permission.js b/src/permission.js index 2a4f87176..49e1a8a68 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,6 +1,6 @@ -import router from './router' import { ElMessage } from 'element-plus' import NProgress from 'nprogress' +import router from './router' import 'nprogress/nprogress.css' import { getToken } from '@/utils/auth' import { isHttp } from '@/utils/validate' @@ -9,45 +9,51 @@ import useUserStore from '@/store/modules/user' import useSettingsStore from '@/store/modules/settings' import usePermissionStore from '@/store/modules/permission' -NProgress.configure({ showSpinner: false }); +NProgress.configure({ showSpinner: false }) -const whiteList = ['/login', '/register']; +const whiteList = ['/login', '/register'] router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { to.meta.title && useSettingsStore().setTitle(to.meta.title) - /* has token*/ + /* has token */ if (to.path === '/login') { next({ path: '/' }) NProgress.done() - } else { - if (useUserStore().roles.length === 0) { - isRelogin.show = true - // 判断当前用户是否已拉取完user_info信息 - useUserStore().getInfo().then(() => { + } else if (useUserStore().roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + useUserStore() + .getInfo() + .then(() => { isRelogin.show = false - usePermissionStore().generateRoutes().then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - accessRoutes.forEach(route => { - if (!isHttp(route.path)) { - router.addRoute(route) // 动态添加可访问路由表 - } + usePermissionStore() + .generateRoutes() + .then((accessRoutes) => { + // 根据roles权限生成可访问的路由表 + accessRoutes.forEach((route) => { + if (!isHttp(route.path)) { + router.addRoute(route) // 动态添加可访问路由表 + } + }) + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 }) - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 - }) - }).catch(err => { - useUserStore().logOut().then(() => { - ElMessage.error(err) - next({ path: '/' }) - }) }) - } else { - next() - } + .catch((err) => { + useUserStore() + .logOut() + .then(() => { + ElMessage.error(err) + next({ path: '/' }) + }) + }) + } else { + next() } } else { // 没有token + // eslint-disable-next-line no-lonely-if if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() diff --git a/src/plugins/auth.js b/src/plugins/auth.js index 5f38cfa79..73a642848 100644 --- a/src/plugins/auth.js +++ b/src/plugins/auth.js @@ -1,60 +1,58 @@ import useUserStore from '@/store/modules/user' function authPermission(permission) { - const all_permission = "*:*:*"; - const permissions = useUserStore().permissions + const allPermission = '*:*:*' + const { permissions } = useUserStore() if (permission && permission.length > 0) { - return permissions.some(v => { - return all_permission === v || v === permission + return permissions.some((v) => { + return allPermission === v || v === permission }) - } else { - return false } + return false } function authRole(role) { - const super_admin = "admin"; - const roles = useUserStore().roles + const superAdmin = 'admin' + const { roles } = useUserStore() if (role && role.length > 0) { - return roles.some(v => { - return super_admin === v || v === role + return roles.some((v) => { + return superAdmin === v || v === role }) - } else { - return false } + return false } export default { // 验证用户是否具备某权限 hasPermi(permission) { - return authPermission(permission); + return authPermission(permission) }, // 验证用户是否含有指定权限,只需包含其中一个 hasPermiOr(permissions) { - return permissions.some(item => { + return permissions.some((item) => { return authPermission(item) }) }, // 验证用户是否含有指定权限,必须全部拥有 hasPermiAnd(permissions) { - return permissions.every(item => { + return permissions.every((item) => { return authPermission(item) }) }, // 验证用户是否具备某角色 hasRole(role) { - return authRole(role); + return authRole(role) }, // 验证用户是否含有指定角色,只需包含其中一个 hasRoleOr(roles) { - return roles.some(item => { + return roles.some((item) => { return authRole(item) }) }, // 验证用户是否含有指定角色,必须全部拥有 hasRoleAnd(roles) { - return roles.every(item => { + return roles.every((item) => { return authRole(item) }) - } + }, } diff --git a/src/plugins/cache.js b/src/plugins/cache.js index 6f71b8e5c..bef531268 100644 --- a/src/plugins/cache.js +++ b/src/plugins/cache.js @@ -1,5 +1,5 @@ const sessionCache = { - set (key, value) { + set(key, value) { if (!sessionStorage) { return } @@ -7,7 +7,7 @@ const sessionCache = { sessionStorage.setItem(key, value) } }, - get (key) { + get(key) { if (!sessionStorage) { return null } @@ -16,23 +16,24 @@ const sessionCache = { } return sessionStorage.getItem(key) }, - setJSON (key, jsonValue) { + setJSON(key, jsonValue) { if (jsonValue != null) { this.set(key, JSON.stringify(jsonValue)) } }, - getJSON (key) { + // eslint-disable-next-line consistent-return + getJSON(key) { const value = this.get(key) if (value != null) { return JSON.parse(value) } }, - remove (key) { - sessionStorage.removeItem(key); - } + remove(key) { + sessionStorage.removeItem(key) + }, } const localCache = { - set (key, value) { + set(key, value) { if (!localStorage) { return } @@ -40,7 +41,7 @@ const localCache = { localStorage.setItem(key, value) } }, - get (key) { + get(key) { if (!localStorage) { return null } @@ -49,20 +50,20 @@ const localCache = { } return localStorage.getItem(key) }, - setJSON (key, jsonValue) { + setJSON(key, jsonValue) { if (jsonValue != null) { this.set(key, JSON.stringify(jsonValue)) } }, - getJSON (key) { + getJSON(key) { const value = this.get(key) if (value != null) { return JSON.parse(value) } }, - remove (key) { - localStorage.removeItem(key); - } + remove(key) { + localStorage.removeItem(key) + }, } export default { @@ -73,5 +74,5 @@ export default { /** * 本地缓存 */ - local: localCache + local: localCache, } diff --git a/src/plugins/download.js b/src/plugins/download.js index 41b29347e..95432daec 100644 --- a/src/plugins/download.js +++ b/src/plugins/download.js @@ -9,64 +9,63 @@ const baseURL = import.meta.env.VITE_APP_BASE_API export default { name(name, isDelete = true) { - var url = baseURL + "/common/download?fileName=" + encodeURIComponent(name) + "&delete=" + isDelete + const url = `${baseURL}/common/download?fileName=${encodeURIComponent(name)}&delete=${isDelete}` axios({ method: 'get', - url: url, + url, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { Authorization: `Bearer ${getToken()}` }, }).then(async (res) => { - const isLogin = await blobValidate(res.data); + const isLogin = await blobValidate(res.data) if (isLogin) { const blob = new Blob([res.data]) this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) } else { - this.printErrMsg(res.data); + this.printErrMsg(res.data) } }) }, resource(resource) { - var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource); + const url = `${baseURL}/common/download/resource?resource=${encodeURIComponent(resource)}` axios({ method: 'get', - url: url, + url, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { Authorization: `Bearer ${getToken()}` }, }).then(async (res) => { - const isLogin = await blobValidate(res.data); + const isLogin = await blobValidate(res.data) if (isLogin) { const blob = new Blob([res.data]) this.saveAs(blob, decodeURIComponent(res.headers['download-filename'])) } else { - this.printErrMsg(res.data); + this.printErrMsg(res.data) } }) }, zip(url, name) { - var url = baseURL + url + const composedUrl = baseURL + url axios({ method: 'get', - url: url, + url: composedUrl, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { Authorization: `Bearer ${getToken()}` }, }).then(async (res) => { - const isLogin = await blobValidate(res.data); + const isLogin = await blobValidate(res.data) if (isLogin) { const blob = new Blob([res.data], { type: 'application/zip' }) this.saveAs(blob, name) } else { - this.printErrMsg(res.data); + this.printErrMsg(res.data) } }) }, saveAs(text, name, opts) { - saveAs(text, name, opts); + saveAs(text, name, opts) }, async printErrMsg(data) { - const resText = await data.text(); - const rspObj = JSON.parse(resText); - const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] - ElMessage.error(errMsg); - } + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode.default + ElMessage.error(errMsg) + }, } - diff --git a/src/plugins/index.js b/src/plugins/index.js index fb75c63ad..57a7173b0 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -4,7 +4,7 @@ import cache from './cache' import modal from './modal' import download from './download' -export default function installPlugins(app){ +export default function installPlugins(app) { // 页签操作 app.config.globalProperties.$tab = tab // 认证对象 diff --git a/src/plugins/modal.js b/src/plugins/modal.js index 005b92e34..ad64047d1 100644 --- a/src/plugins/modal.js +++ b/src/plugins/modal.js @@ -1,6 +1,6 @@ import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus' -let loadingInstance; +let loadingInstance export default { // 消息提示 @@ -21,19 +21,19 @@ export default { }, // 弹出提示 alert(content) { - ElMessageBox.alert(content, "系统提示") + ElMessageBox.alert(content, '系统提示') }, // 错误提示 alertError(content) { - ElMessageBox.alert(content, "系统提示", { type: 'error' }) + ElMessageBox.alert(content, '系统提示', { type: 'error' }) }, // 成功提示 alertSuccess(content) { - ElMessageBox.alert(content, "系统提示", { type: 'success' }) + ElMessageBox.alert(content, '系统提示', { type: 'success' }) }, // 警告提示 alertWarning(content) { - ElMessageBox.alert(content, "系统提示", { type: 'warning' }) + ElMessageBox.alert(content, '系统提示', { type: 'warning' }) }, // 通知提示 notify(content) { @@ -41,7 +41,7 @@ export default { }, // 错误通知 notifyError(content) { - ElNotification.error(content); + ElNotification.error(content) }, // 成功通知 notifySuccess(content) { @@ -53,18 +53,18 @@ export default { }, // 确认窗体 confirm(content) { - return ElMessageBox.confirm(content, "系统提示", { + return ElMessageBox.confirm(content, '系统提示', { confirmButtonText: '确定', cancelButtonText: '取消', - type: "warning", + type: 'warning', }) }, // 提交内容 prompt(content) { - return ElMessageBox.prompt(content, "系统提示", { + return ElMessageBox.prompt(content, '系统提示', { confirmButtonText: '确定', cancelButtonText: '取消', - type: "warning", + type: 'warning', }) }, // 打开遮罩层 @@ -72,11 +72,11 @@ export default { loadingInstance = ElLoading.service({ lock: true, text: content, - background: "rgba(0, 0, 0, 0.7)", + background: 'rgba(0, 0, 0, 0.7)', }) }, // 关闭遮罩层 closeLoading() { - loadingInstance.close(); - } + loadingInstance.close() + }, } diff --git a/src/plugins/tab.js b/src/plugins/tab.js index fd3d2860f..2663288a3 100644 --- a/src/plugins/tab.js +++ b/src/plugins/tab.js @@ -4,62 +4,66 @@ import router from '@/router' export default { // 刷新当前tab页签 refreshPage(obj) { - const { path, query, matched } = router.currentRoute.value; + const { path, query, matched } = router.currentRoute.value if (obj === undefined) { matched.forEach((m) => { if (m.components && m.components.default && m.components.default.name) { if (!['Layout', 'ParentView'].includes(m.components.default.name)) { - obj = { name: m.components.default.name, path: path, query: query }; + obj = { name: m.components.default.name, path, query } } } - }); + }) } - return useTagsViewStore().delCachedView(obj).then(() => { - const { path, query } = obj - router.replace({ - path: '/redirect' + path, - query: query + return useTagsViewStore() + .delCachedView(obj) + .then(() => { + const { path, query } = obj + router.replace({ + path: `/redirect${path}`, + query, + }) }) - }) }, // 关闭当前tab页签,打开新页签 closeOpenPage(obj) { - useTagsViewStore().delView(router.currentRoute.value); + useTagsViewStore().delView(router.currentRoute.value) if (obj !== undefined) { - return router.push(obj); + return router.push(obj) } }, // 关闭指定tab页签 closePage(obj) { if (obj === undefined) { - return useTagsViewStore().delView(router.currentRoute.value).then(({ lastPath }) => { - return router.push(lastPath || '/index'); - }); + return useTagsViewStore() + .delView(router.currentRoute.value) + .then(({ lastPath }) => { + return router.push(lastPath || '/index') + }) } - return useTagsViewStore().delView(obj); + return useTagsViewStore().delView(obj) }, // 关闭所有tab页签 closeAllPage() { - return useTagsViewStore().delAllViews(); + return useTagsViewStore().delAllViews() }, // 关闭左侧tab页签 closeLeftPage(obj) { - return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); + return useTagsViewStore().delLeftTags(obj || router.currentRoute.value) }, // 关闭右侧tab页签 closeRightPage(obj) { - return useTagsViewStore().delRightTags(obj || router.currentRoute.value); + return useTagsViewStore().delRightTags(obj || router.currentRoute.value) }, // 关闭其他tab页签 closeOtherPage(obj) { - return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); + return useTagsViewStore().delOthersViews(obj || router.currentRoute.value) }, // 打开tab页签 openPage(url) { - return router.push(url); + return router.push(url) }, // 修改tab页签 updatePage(obj) { - return useTagsViewStore().updateVisitedView(obj); - } + return useTagsViewStore().updateVisitedView(obj) + }, } diff --git a/src/router/index.js b/src/router/index.js index b05d1c135..0e1b4e396 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -33,29 +33,29 @@ export const constantRoutes = [ children: [ { path: '/redirect/:path(.*)', - component: () => import('@/views/redirect/index.vue') - } - ] + component: () => import('@/views/redirect/index.vue'), + }, + ], }, { path: '/login', component: () => import('@/views/login'), - hidden: true + hidden: true, }, { path: '/register', component: () => import('@/views/register'), - hidden: true + hidden: true, }, { - path: "/:pathMatch(.*)*", + path: '/:pathMatch(.*)*', component: () => import('@/views/error/404'), - hidden: true + hidden: true, }, { path: '/401', component: () => import('@/views/error/401'), - hidden: true + hidden: true, }, { path: '', @@ -66,9 +66,9 @@ export const constantRoutes = [ path: '/index', component: () => import('@/views/index'), name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } - } - ] + meta: { title: '首页', icon: 'dashboard', affix: true }, + }, + ], }, { path: '/user', @@ -80,10 +80,10 @@ export const constantRoutes = [ path: 'profile', component: () => import('@/views/system/user/profile/index'), name: 'Profile', - meta: { title: '个人中心', icon: 'user' } - } - ] - } + meta: { title: '个人中心', icon: 'user' }, + }, + ], + }, ] // 动态路由,基于用户权限动态去加载 @@ -98,9 +98,9 @@ export const dynamicRoutes = [ path: 'role/:userId(\\d+)', component: () => import('@/views/system/user/authRole'), name: 'AuthRole', - meta: { title: '分配角色', activeMenu: '/system/user' } - } - ] + meta: { title: '分配角色', activeMenu: '/system/user' }, + }, + ], }, { path: '/system/role-auth', @@ -112,9 +112,9 @@ export const dynamicRoutes = [ path: 'user/:roleId(\\d+)', component: () => import('@/views/system/role/authUser'), name: 'AuthUser', - meta: { title: '分配用户', activeMenu: '/system/role' } - } - ] + meta: { title: '分配用户', activeMenu: '/system/role' }, + }, + ], }, { path: '/system/dict-data', @@ -126,9 +126,9 @@ export const dynamicRoutes = [ path: 'index/:dictId(\\d+)', component: () => import('@/views/system/dict/data'), name: 'Data', - meta: { title: '字典数据', activeMenu: '/system/dict' } - } - ] + meta: { title: '字典数据', activeMenu: '/system/dict' }, + }, + ], }, { path: '/monitor/job-log', @@ -140,9 +140,9 @@ export const dynamicRoutes = [ path: 'index/:jobId(\\d+)', component: () => import('@/views/monitor/job/log'), name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] + meta: { title: '调度日志', activeMenu: '/monitor/job' }, + }, + ], }, { path: '/tool/gen-edit', @@ -154,10 +154,10 @@ export const dynamicRoutes = [ path: 'index/:tableId(\\d+)', component: () => import('@/views/tool/gen/editTable'), name: 'GenEdit', - meta: { title: '修改生成配置', activeMenu: '/tool/gen' } - } - ] - } + meta: { title: '修改生成配置', activeMenu: '/tool/gen' }, + }, + ], + }, ] const router = createRouter({ @@ -166,10 +166,9 @@ const router = createRouter({ scrollBehavior(to, from, savedPosition) { if (savedPosition) { return savedPosition - } else { - return { top: 0 } } + return { top: 0 } }, -}); +}) -export default router; +export default router diff --git a/src/settings.js b/src/settings.js index bd4b9e2d5..1f28b7920 100644 --- a/src/settings.js +++ b/src/settings.js @@ -43,5 +43,5 @@ export default { * The default is only used in the production env * If you want to also use it in dev, you can pass ['production', 'development'] */ - errorLog: 'production' + errorLog: 'production', } diff --git a/src/store/index.js b/src/store/index.js index cd733854d..bab676cf5 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,3 +1,5 @@ +import { createPinia } from 'pinia' + const store = createPinia() -export default store \ No newline at end of file +export default store diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 3b26cfe73..0904c3353 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,46 +1,46 @@ import Cookies from 'js-cookie' +import { defineStore } from 'pinia' -const useAppStore = defineStore( - 'app', - { - state: () => ({ - sidebar: { - opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, - withoutAnimation: false, - hide: false - }, - device: 'desktop', - size: Cookies.get('size') || 'default' - }), - actions: { - toggleSideBar(withoutAnimation) { - if (this.sidebar.hide) { - return false; - } - this.sidebar.opened = !this.sidebar.opened - this.sidebar.withoutAnimation = withoutAnimation - if (this.sidebar.opened) { - Cookies.set('sidebarStatus', 1) - } else { - Cookies.set('sidebarStatus', 0) - } - }, - closeSideBar({ withoutAnimation }) { +const useAppStore = defineStore('app', { + state: () => ({ + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false, + hide: false, + }, + device: 'desktop', + size: Cookies.get('size') || 'default', + }), + actions: { + // eslint-disable-next-line consistent-return + toggleSideBar(withoutAnimation) { + if (this.sidebar.hide) { + return false + } + this.sidebar.opened = !this.sidebar.opened + this.sidebar.withoutAnimation = withoutAnimation + if (this.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { Cookies.set('sidebarStatus', 0) - this.sidebar.opened = false - this.sidebar.withoutAnimation = withoutAnimation - }, - toggleDevice(device) { - this.device = device - }, - setSize(size) { - this.size = size; - Cookies.set('size', size) - }, - toggleSideBarHide(status) { - this.sidebar.hide = status } - } - }) + }, + closeSideBar({ withoutAnimation }) { + Cookies.set('sidebarStatus', 0) + this.sidebar.opened = false + this.sidebar.withoutAnimation = withoutAnimation + }, + toggleDevice(device) { + this.device = device + }, + setSize(size) { + this.size = size + Cookies.set('size', size) + }, + toggleSideBarHide(status) { + this.sidebar.hide = status + }, + }, +}) export default useAppStore diff --git a/src/store/modules/dict.js b/src/store/modules/dict.js index 7e62a67f3..66e72ecb1 100644 --- a/src/store/modules/dict.js +++ b/src/store/modules/dict.js @@ -1,57 +1,60 @@ -const useDictStore = defineStore( - 'dict', - { - state: () => ({ - dict: new Array() - }), - actions: { - // 获取字典 - getDict(_key) { - if (_key == null && _key == "") { - return null; - } - try { - for (let i = 0; i < this.dict.length; i++) { - if (this.dict[i].key == _key) { - return this.dict[i].value; - } +import { defineStore } from 'pinia' + +const useDictStore = defineStore('dict', { + state: () => ({ + dict: [], + }), + actions: { + // 获取字典 + // eslint-disable-next-line consistent-return + getDict(_key) { + // eslint-disable-next-line eqeqeq + if (_key == null && _key == '') { + return null + } + try { + for (let i = 0; i < this.dict.length; i++) { + // eslint-disable-next-line eqeqeq + if (this.dict[i].key == _key) { + return this.dict[i].value } - } catch (e) { - return null; } - }, - // 设置字典 - setDict(_key, value) { - if (_key !== null && _key !== "") { - this.dict.push({ - key: _key, - value: value - }); - } - }, - // 删除字典 - removeDict(_key) { - var bln = false; - try { - for (let i = 0; i < this.dict.length; i++) { - if (this.dict[i].key == _key) { - this.dict.splice(i, 1); - return true; - } + } catch (e) { + return null + } + }, + // 设置字典 + setDict(_key, value) { + if (_key !== null && _key !== '') { + this.dict.push({ + key: _key, + value, + }) + } + }, + // 删除字典 + removeDict(_key) { + let bln = false + try { + for (let i = 0; i < this.dict.length; i++) { + // eslint-disable-next-line eqeqeq + if (this.dict[i].key == _key) { + this.dict.splice(i, 1) + return true } - } catch (e) { - bln = false; } - return bln; - }, - // 清空字典 - cleanDict() { - this.dict = new Array(); - }, - // 初始字典 - initDict() { + } catch (e) { + bln = false } - } - }) + return bln + }, + // 清空字典 + cleanDict() { + this.dict = [] + }, + // 初始字典 + initDict() {}, + }, +}) export default useDictStore diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index c1c862b94..f84c25a97 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,3 +1,4 @@ +import { defineStore } from 'pinia' import auth from '@/plugins/auth' import router, { constantRoutes, dynamicRoutes } from '@/router' import { getRouters } from '@/api/menu' @@ -8,56 +9,57 @@ import InnerLink from '@/layout/components/InnerLink' // 匹配views里面所有的.vue文件 const modules = import.meta.glob('./../../views/**/*.vue') -const usePermissionStore = defineStore( - 'permission', - { - state: () => ({ - routes: [], - addRoutes: [], - defaultRoutes: [], - topbarRouters: [], - sidebarRouters: [] - }), - actions: { - setRoutes(routes) { - this.addRoutes = routes - this.routes = constantRoutes.concat(routes) - }, - setDefaultRoutes(routes) { - this.defaultRoutes = constantRoutes.concat(routes) - }, - setTopbarRoutes(routes) { - this.topbarRouters = routes - }, - setSidebarRouters(routes) { - this.sidebarRouters = routes - }, - generateRoutes(roles) { - return new Promise(resolve => { - // 向后端请求路由数据 - getRouters().then(res => { - const sdata = JSON.parse(JSON.stringify(res.data)) - const rdata = JSON.parse(JSON.stringify(res.data)) - const defaultData = JSON.parse(JSON.stringify(res.data)) - const sidebarRoutes = filterAsyncRouter(sdata) - const rewriteRoutes = filterAsyncRouter(rdata, false, true) - const defaultRoutes = filterAsyncRouter(defaultData) - const asyncRoutes = filterDynamicRoutes(dynamicRoutes) - asyncRoutes.forEach(route => { router.addRoute(route) }) - this.setRoutes(rewriteRoutes) - this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) - this.setDefaultRoutes(sidebarRoutes) - this.setTopbarRoutes(defaultRoutes) - resolve(rewriteRoutes) +const usePermissionStore = defineStore('permission', { + state: () => ({ + routes: [], + addRoutes: [], + defaultRoutes: [], + topbarRouters: [], + sidebarRouters: [], + }), + actions: { + setRoutes(routes) { + this.addRoutes = routes + this.routes = constantRoutes.concat(routes) + }, + setDefaultRoutes(routes) { + this.defaultRoutes = constantRoutes.concat(routes) + }, + setTopbarRoutes(routes) { + this.topbarRouters = routes + }, + setSidebarRouters(routes) { + this.sidebarRouters = routes + }, + generateRoutes() { + return new Promise((resolve) => { + // 向后端请求路由数据 + getRouters().then((res) => { + const sdata = JSON.parse(JSON.stringify(res.data)) + const rdata = JSON.parse(JSON.stringify(res.data)) + const defaultData = JSON.parse(JSON.stringify(res.data)) + const sidebarRoutes = filterAsyncRouter(sdata) + const rewriteRoutes = filterAsyncRouter(rdata, false, true) + const defaultRoutes = filterAsyncRouter(defaultData) + const asyncRoutes = filterDynamicRoutes(dynamicRoutes) + asyncRoutes.forEach((route) => { + router.addRoute(route) }) + this.setRoutes(rewriteRoutes) + this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) + this.setDefaultRoutes(sidebarRoutes) + this.setTopbarRoutes(defaultRoutes) + resolve(rewriteRoutes) }) - } - } - }) + }) + }, + }, +}) // 遍历后台传来的路由字符串,转换为组件对象 +// eslint-disable-next-line no-unused-vars function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { - return asyncRouterMap.filter(route => { + return asyncRouterMap.filter((route) => { if (type && route.children) { route.children = filterChildren(route.children) } @@ -76,20 +78,20 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { if (route.children != null && route.children && route.children.length) { route.children = filterAsyncRouter(route.children, route, type) } else { - delete route['children'] - delete route['redirect'] + delete route.children + delete route.redirect } return true }) } function filterChildren(childrenMap, lastRouter = false) { - var children = [] - childrenMap.forEach((el, index) => { + let children = [] + childrenMap.forEach((el) => { if (el.children && el.children.length) { if (el.component === 'ParentView' && !lastRouter) { - el.children.forEach(c => { - c.path = el.path + '/' + c.path + el.children.forEach((c) => { + c.path = `${el.path}/${c.path}` if (c.children && c.children.length) { children = children.concat(filterChildren(c.children, c)) return @@ -100,7 +102,7 @@ function filterChildren(childrenMap, lastRouter = false) { } } if (lastRouter) { - el.path = lastRouter.path + '/' + el.path + el.path = `${lastRouter.path}/${el.path}` } children = children.concat(el) }) @@ -110,7 +112,7 @@ function filterChildren(childrenMap, lastRouter = false) { // 动态路由遍历,验证是否具备权限 export function filterDynamicRoutes(routes) { const res = [] - routes.forEach(route => { + routes.forEach((route) => { if (route.permissions) { if (auth.hasPermiOr(route.permissions)) { res.push(route) @@ -125,14 +127,15 @@ export function filterDynamicRoutes(routes) { } export const loadView = (view) => { - let res; + let res + // eslint-disable-next-line guard-for-in for (const path in modules) { - const dir = path.split('views/')[1].split('.vue')[0]; + const dir = path.split('views/')[1].split('.vue')[0] if (dir === view) { - res = () => modules[path](); + res = () => modules[path]() } } - return res; + return res } export default usePermissionStore diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index 3e41513cd..ed0d24ce4 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,3 +1,4 @@ +import { defineStore } from 'pinia' import defaultSettings from '@/settings' import { useDynamicTitle } from '@/utils/dynamicTitle' @@ -5,34 +6,33 @@ const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dyn const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' -const useSettingsStore = defineStore( - 'settings', - { - state: () => ({ - title: '', - theme: storageSetting.theme || '#409EFF', - sideTheme: storageSetting.sideTheme || sideTheme, - showSettings: showSettings, - topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, - tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, - fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, - sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, - dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle - }), - actions: { - // 修改布局设置 - changeSetting(data) { - const { key, value } = data - if (this.hasOwnProperty(key)) { - this[key] = value - } - }, - // 设置网页标题 - setTitle(title) { - this.title = title - useDynamicTitle(); +const useSettingsStore = defineStore('settings', { + state: () => ({ + title: '', + theme: storageSetting.theme || '#409EFF', + sideTheme: storageSetting.sideTheme || sideTheme, + showSettings, + topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, + tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, + fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, + sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle, + }), + actions: { + // 修改布局设置 + changeSetting(data) { + const { key, value } = data + // eslint-disable-next-line no-prototype-builtins + if (this.hasOwnProperty(key)) { + this[key] = value } - } - }) + }, + // 设置网页标题 + setTitle(title) { + this.title = title + useDynamicTitle() + }, + }, +}) export default useSettingsStore diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index b0d4ca1df..295bfed7b 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -1,182 +1,176 @@ -const useTagsViewStore = defineStore( - 'tags-view', - { - state: () => ({ - visitedViews: [], - cachedViews: [], - iframeViews: [] - }), - actions: { - addView(view) { - this.addVisitedView(view) - this.addCachedView(view) - }, - addIframeView(view) { - if (this.iframeViews.some(v => v.path === view.path)) return - this.iframeViews.push( - Object.assign({}, view, { - title: view.meta.title || 'no-name' - }) - ) - }, - addVisitedView(view) { - if (this.visitedViews.some(v => v.path === view.path)) return - this.visitedViews.push( - Object.assign({}, view, { - title: view.meta.title || 'no-name' - }) - ) - }, - addCachedView(view) { - if (this.cachedViews.includes(view.name)) return - if (!view.meta.noCache) { - this.cachedViews.push(view.name) - } - }, - delView(view) { - return new Promise(resolve => { - this.delVisitedView(view) - this.delCachedView(view) - resolve({ - visitedViews: [...this.visitedViews], - cachedViews: [...this.cachedViews] - }) - }) - }, - delVisitedView(view) { - return new Promise(resolve => { - for (const [i, v] of this.visitedViews.entries()) { - if (v.path === view.path) { - this.visitedViews.splice(i, 1) - break - } - } - this.iframeViews = this.iframeViews.filter(item => item.path !== view.path) - resolve([...this.visitedViews]) - }) - }, - delIframeView(view) { - return new Promise(resolve => { - this.iframeViews = this.iframeViews.filter(item => item.path !== view.path) - resolve([...this.iframeViews]) - }) - }, - delCachedView(view) { - return new Promise(resolve => { - const index = this.cachedViews.indexOf(view.name) - index > -1 && this.cachedViews.splice(index, 1) - resolve([...this.cachedViews]) - }) - }, - delOthersViews(view) { - return new Promise(resolve => { - this.delOthersVisitedViews(view) - this.delOthersCachedViews(view) - resolve({ - visitedViews: [...this.visitedViews], - cachedViews: [...this.cachedViews] - }) - }) - }, - delOthersVisitedViews(view) { - return new Promise(resolve => { - this.visitedViews = this.visitedViews.filter(v => { - return v.meta.affix || v.path === view.path - }) - this.iframeViews = this.iframeViews.filter(item => item.path === view.path) - resolve([...this.visitedViews]) +import { defineStore } from 'pinia' + +const useTagsViewStore = defineStore('tags-view', { + state: () => ({ + visitedViews: [], + cachedViews: [], + iframeViews: [], + }), + actions: { + addView(view) { + this.addVisitedView(view) + this.addCachedView(view) + }, + addIframeView(view) { + if (this.iframeViews.some((v) => v.path === view.path)) return + this.iframeViews.push({ ...view, title: view.meta.title || 'no-name' }) + }, + addVisitedView(view) { + if (this.visitedViews.some((v) => v.path === view.path)) return + this.visitedViews.push({ ...view, title: view.meta.title || 'no-name' }) + }, + addCachedView(view) { + if (this.cachedViews.includes(view.name)) return + if (!view.meta.noCache) { + this.cachedViews.push(view.name) + } + }, + delView(view) { + return new Promise((resolve) => { + this.delVisitedView(view) + this.delCachedView(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews], }) - }, - delOthersCachedViews(view) { - return new Promise(resolve => { - const index = this.cachedViews.indexOf(view.name) - if (index > -1) { - this.cachedViews = this.cachedViews.slice(index, index + 1) - } else { - this.cachedViews = [] + }) + }, + delVisitedView(view) { + return new Promise((resolve) => { + for (const [i, v] of this.visitedViews.entries()) { + if (v.path === view.path) { + this.visitedViews.splice(i, 1) + break } - resolve([...this.cachedViews]) - }) - }, - delAllViews(view) { - return new Promise(resolve => { - this.delAllVisitedViews(view) - this.delAllCachedViews(view) - resolve({ - visitedViews: [...this.visitedViews], - cachedViews: [...this.cachedViews] - }) + } + this.iframeViews = this.iframeViews.filter((item) => item.path !== view.path) + resolve([...this.visitedViews]) + }) + }, + delIframeView(view) { + return new Promise((resolve) => { + this.iframeViews = this.iframeViews.filter((item) => item.path !== view.path) + resolve([...this.iframeViews]) + }) + }, + delCachedView(view) { + return new Promise((resolve) => { + const index = this.cachedViews.indexOf(view.name) + index > -1 && this.cachedViews.splice(index, 1) + resolve([...this.cachedViews]) + }) + }, + delOthersViews(view) { + return new Promise((resolve) => { + this.delOthersVisitedViews(view) + this.delOthersCachedViews(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews], }) - }, - delAllVisitedViews(view) { - return new Promise(resolve => { - const affixTags = this.visitedViews.filter(tag => tag.meta.affix) - this.visitedViews = affixTags - this.iframeViews = [] - resolve([...this.visitedViews]) + }) + }, + delOthersVisitedViews(view) { + return new Promise((resolve) => { + this.visitedViews = this.visitedViews.filter((v) => { + return v.meta.affix || v.path === view.path }) - }, - delAllCachedViews(view) { - return new Promise(resolve => { + this.iframeViews = this.iframeViews.filter((item) => item.path === view.path) + resolve([...this.visitedViews]) + }) + }, + delOthersCachedViews(view) { + return new Promise((resolve) => { + const index = this.cachedViews.indexOf(view.name) + if (index > -1) { + this.cachedViews = this.cachedViews.slice(index, index + 1) + } else { this.cachedViews = [] - resolve([...this.cachedViews]) + } + resolve([...this.cachedViews]) + }) + }, + delAllViews(view) { + return new Promise((resolve) => { + this.delAllVisitedViews(view) + this.delAllCachedViews(view) + resolve({ + visitedViews: [...this.visitedViews], + cachedViews: [...this.cachedViews], }) - }, - updateVisitedView(view) { - for (let v of this.visitedViews) { - if (v.path === view.path) { - v = Object.assign(v, view) - break - } + }) + }, + // eslint-disable-next-line no-unused-vars + delAllVisitedViews(view) { + return new Promise((resolve) => { + const affixTags = this.visitedViews.filter((tag) => tag.meta.affix) + this.visitedViews = affixTags + this.iframeViews = [] + resolve([...this.visitedViews]) + }) + }, + // eslint-disable-next-line no-unused-vars + delAllCachedViews(view) { + return new Promise((resolve) => { + this.cachedViews = [] + resolve([...this.cachedViews]) + }) + }, + updateVisitedView(view) { + for (let v of this.visitedViews) { + if (v.path === view.path) { + v = Object.assign(v, view) + break + } + } + }, + delRightTags(view) { + return new Promise((resolve) => { + const index = this.visitedViews.findIndex((v) => v.path === view.path) + if (index === -1) { + return } - }, - delRightTags(view) { - return new Promise(resolve => { - const index = this.visitedViews.findIndex(v => v.path === view.path) - if (index === -1) { - return + this.visitedViews = this.visitedViews.filter((item, idx) => { + if (idx <= index || (item.meta && item.meta.affix)) { + return true } - this.visitedViews = this.visitedViews.filter((item, idx) => { - if (idx <= index || (item.meta && item.meta.affix)) { - return true - } - const i = this.cachedViews.indexOf(item.name) - if (i > -1) { - this.cachedViews.splice(i, 1) - } - if(item.meta.link) { - const fi = this.iframeViews.findIndex(v => v.path === item.path) - this.iframeViews.splice(fi, 1) - } - return false - }) - resolve([...this.visitedViews]) + const i = this.cachedViews.indexOf(item.name) + if (i > -1) { + this.cachedViews.splice(i, 1) + } + if (item.meta.link) { + const fi = this.iframeViews.findIndex((v) => v.path === item.path) + this.iframeViews.splice(fi, 1) + } + return false }) - }, - delLeftTags(view) { - return new Promise(resolve => { - const index = this.visitedViews.findIndex(v => v.path === view.path) - if (index === -1) { - return + resolve([...this.visitedViews]) + }) + }, + delLeftTags(view) { + return new Promise((resolve) => { + const index = this.visitedViews.findIndex((v) => v.path === view.path) + if (index === -1) { + return + } + this.visitedViews = this.visitedViews.filter((item, idx) => { + if (idx >= index || (item.meta && item.meta.affix)) { + return true } - this.visitedViews = this.visitedViews.filter((item, idx) => { - if (idx >= index || (item.meta && item.meta.affix)) { - return true - } - const i = this.cachedViews.indexOf(item.name) - if (i > -1) { - this.cachedViews.splice(i, 1) - } - if(item.meta.link) { - const fi = this.iframeViews.findIndex(v => v.path === item.path) - this.iframeViews.splice(fi, 1) - } - return false - }) - resolve([...this.visitedViews]) + const i = this.cachedViews.indexOf(item.name) + if (i > -1) { + this.cachedViews.splice(i, 1) + } + if (item.meta.link) { + const fi = this.iframeViews.findIndex((v) => v.path === item.path) + this.iframeViews.splice(fi, 1) + } + return false }) - } - } - }) + resolve([...this.visitedViews]) + }) + }, + }, +}) export default useTagsViewStore diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 7c2e6e884..e6fcc6dc8 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,70 +1,77 @@ +import { defineStore } from 'pinia' import { login, logout, getInfo } from '@/api/login' import { getToken, setToken, removeToken } from '@/utils/auth' import defAva from '@/assets/images/profile.jpg' -const useUserStore = defineStore( - 'user', - { - state: () => ({ - token: getToken(), - name: '', - avatar: '', - roles: [], - permissions: [] - }), - actions: { - // 登录 - login(userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid - return new Promise((resolve, reject) => { - login(username, password, code, uuid).then(res => { +const useUserStore = defineStore('user', { + state: () => ({ + token: getToken(), + name: '', + avatar: '', + roles: [], + permissions: [], + }), + actions: { + // 登录 + login(userInfo) { + const username = userInfo.username.trim() + const { password } = userInfo + const { code } = userInfo + const { uuid } = userInfo + return new Promise((resolve, reject) => { + login(username, password, code, uuid) + .then((res) => { setToken(res.token) this.token = res.token resolve() - }).catch(error => { + }) + .catch((error) => { reject(error) }) - }) - }, - // 获取用户信息 - getInfo() { - return new Promise((resolve, reject) => { - getInfo().then(res => { - const user = res.user - const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; + }) + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo() + .then((res) => { + const { user } = res + const avatar = + user.avatar === '' || user.avatar == null ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + if (res.roles && res.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 this.roles = res.roles this.permissions = res.permissions } else { this.roles = ['ROLE_DEFAULT'] } this.name = user.userName - this.avatar = avatar; + this.avatar = avatar resolve(res) - }).catch(error => { + }) + .catch((error) => { reject(error) }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { + }) + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token) + .then(() => { this.token = '' this.roles = [] this.permissions = [] removeToken() resolve() - }).catch(error => { + }) + .catch((error) => { reject(error) }) - }) - } - } - }) + }) + }, + }, +}) export default useUserStore diff --git a/src/utils/dict.js b/src/utils/dict.js index 40d06913b..36a54234b 100644 --- a/src/utils/dict.js +++ b/src/utils/dict.js @@ -1,3 +1,4 @@ +import { ref, toRefs } from 'vue' import useDictStore from '@/store/modules/dict' import { getDicts } from '@/api/system/dict/data' @@ -5,20 +6,25 @@ import { getDicts } from '@/api/system/dict/data' * 获取字典数据 */ export function useDict(...args) { - const res = ref({}); + const res = ref({}) return (() => { - args.forEach((dictType, index) => { - res.value[dictType] = []; - const dicts = useDictStore().getDict(dictType); + args.forEach((dictType) => { + res.value[dictType] = [] + const dicts = useDictStore().getDict(dictType) if (dicts) { - res.value[dictType] = dicts; + res.value[dictType] = dicts } else { - getDicts(dictType).then(resp => { - res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass })) - useDictStore().setDict(dictType, res.value[dictType]); + getDicts(dictType).then((resp) => { + res.value[dictType] = resp.data.map((p) => ({ + label: p.dictLabel, + value: p.dictValue, + elTagType: p.listClass, + elTagClass: p.cssClass, + })) + useDictStore().setDict(dictType, res.value[dictType]) }) } }) - return toRefs(res.value); + return toRefs(res.value) })() -} \ No newline at end of file +} diff --git a/src/utils/dynamicTitle.js b/src/utils/dynamicTitle.js index b55d6a136..1cb91be18 100644 --- a/src/utils/dynamicTitle.js +++ b/src/utils/dynamicTitle.js @@ -1,4 +1,3 @@ -import store from '@/store' import defaultSettings from '@/settings' import useSettingsStore from '@/store/modules/settings' @@ -6,10 +5,10 @@ import useSettingsStore from '@/store/modules/settings' * 动态修改标题 */ export function useDynamicTitle() { - const settingsStore = useSettingsStore(); + const settingsStore = useSettingsStore() if (settingsStore.dynamicTitle) { - document.title = settingsStore.title + ' - ' + defaultSettings.title; + document.title = `${settingsStore.title} - ${defaultSettings.title}` } else { - document.title = defaultSettings.title; + document.title = defaultSettings.title } -} \ No newline at end of file +} diff --git a/src/utils/errorCode.js b/src/utils/errorCode.js index b72d02646..de08c28ab 100644 --- a/src/utils/errorCode.js +++ b/src/utils/errorCode.js @@ -1,6 +1,6 @@ export default { - '401': '认证失败,无法访问系统资源', - '403': '当前操作没有权限', - '404': '访问资源不存在', - 'default': '系统未知错误,请反馈给管理员' + 401: '认证失败,无法访问系统资源', + 403: '当前操作没有权限', + 404: '访问资源不存在', + default: '系统未知错误,请反馈给管理员', } diff --git a/src/utils/index.js b/src/utils/index.js index 9679e757a..85270d329 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -4,15 +4,16 @@ import { parseTime } from './ruoyi' * 表格时间格式化 */ export function formatDate(cellValue) { - if (cellValue == null || cellValue == "") return ""; - var date = new Date(cellValue) - var year = date.getFullYear() - var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 - var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() - var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() - var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() - var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() - return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds + // eslint-disable-next-line eqeqeq + if (cellValue == null || cellValue == '') return '' + const date = new Date(cellValue) + const year = date.getFullYear() + const month = date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1 + const day = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate() + const hours = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours() + const minutes = date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes() + const seconds = date.getSeconds() < 10 ? `0${date.getSeconds()}` : date.getSeconds() + return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` } /** @@ -21,8 +22,8 @@ export function formatDate(cellValue) { * @returns {string} */ export function formatTime(time, option) { - if (('' + time).length === 10) { - time = parseInt(time) * 1000 + if (`${time}`.length === 10) { + time = parseInt(time, 10) * 1000 } else { time = +time } @@ -33,29 +34,21 @@ export function formatTime(time, option) { if (diff < 30) { return '刚刚' - } else if (diff < 3600) { + } + if (diff < 3600) { // less 1 hour - return Math.ceil(diff / 60) + '分钟前' - } else if (diff < 3600 * 24) { - return Math.ceil(diff / 3600) + '小时前' - } else if (diff < 3600 * 24 * 2) { + return `${Math.ceil(diff / 60)}分钟前` + } + if (diff < 3600 * 24) { + return `${Math.ceil(diff / 3600)}小时前` + } + if (diff < 3600 * 24 * 2) { return '1天前' } if (option) { return parseTime(time, option) - } else { - return ( - d.getMonth() + - 1 + - '月' + - d.getDate() + - '日' + - d.getHours() + - '时' + - d.getMinutes() + - '分' - ) } + return `${d.getMonth() + 1}月${d.getDate()}日${d.getHours()}时${d.getMinutes()}分` } /** @@ -84,11 +77,11 @@ export function getQueryObject(url) { export function byteLength(str) { // returns the byte length of an utf8 string let s = str.length - for (var i = str.length - 1; i >= 0; i--) { + for (let i = str.length - 1; i >= 0; i--) { const code = str.charCodeAt(i) if (code > 0x7f && code <= 0x7ff) s++ else if (code > 0x7ff && code <= 0xffff) s += 2 - if (code >= 0xDC00 && code <= 0xDFFF) i-- + if (code >= 0xdc00 && code <= 0xdfff) i-- } return s } @@ -114,9 +107,9 @@ export function cleanArray(actual) { export function param(json) { if (!json) return '' return cleanArray( - Object.keys(json).map(key => { + Object.keys(json).map((key) => { if (json[key] === undefined) return '' - return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + return `${encodeURIComponent(key)}=${encodeURIComponent(json[key])}` }) ).join('&') } @@ -132,7 +125,7 @@ export function param2Obj(url) { } const obj = {} const searchArr = search.split('&') - searchArr.forEach(v => { + searchArr.forEach((v) => { const index = v.indexOf('=') if (index !== -1) { const name = v.substring(0, index) @@ -166,7 +159,7 @@ export function objectMerge(target, source) { if (Array.isArray(source)) { return source.slice() } - Object.keys(source).forEach(property => { + Object.keys(source).forEach((property) => { const sourceProperty = source[property] if (typeof sourceProperty === 'object') { target[property] = objectMerge(target[property], sourceProperty) @@ -188,11 +181,9 @@ export function toggleClass(element, className) { let classString = element.className const nameIndex = classString.indexOf(className) if (nameIndex === -1) { - classString += '' + className + classString += `${className}` } else { - classString = - classString.substr(0, nameIndex) + - classString.substr(nameIndex + className.length) + classString = classString.substr(0, nameIndex) + classString.substr(nameIndex + className.length) } element.className = classString } @@ -204,9 +195,8 @@ export function toggleClass(element, className) { export function getTime(type) { if (type === 'start') { return new Date().getTime() - 3600 * 1000 * 24 * 90 - } else { - return new Date(new Date().toDateString()) } + return new Date(new Date().toDateString()) } /** @@ -216,9 +206,14 @@ export function getTime(type) { * @return {*} */ export function debounce(func, wait, immediate) { - let timeout, args, context, timestamp, result + let timeout + let args + let context + let timestamp + let result - const later = function() { + // eslint-disable-next-line func-names + const later = function () { // 据上一次触发时间间隔 const last = +new Date() - timestamp @@ -230,12 +225,14 @@ export function debounce(func, wait, immediate) { // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 if (!immediate) { result = func.apply(context, args) + // eslint-disable-next-line no-multi-assign if (!timeout) context = args = null } } } - return function(...args) { + // eslint-disable-next-line func-names + return function (...args) { context = this timestamp = +new Date() const callNow = immediate && !timeout @@ -243,6 +240,7 @@ export function debounce(func, wait, immediate) { if (!timeout) timeout = setTimeout(later, wait) if (callNow) { result = func.apply(context, args) + // eslint-disable-next-line no-multi-assign context = args = null } @@ -262,7 +260,7 @@ export function deepClone(source) { throw new Error('error arguments', 'deepClone') } const targetObj = source.constructor === Array ? [] : {} - Object.keys(source).forEach(keys => { + Object.keys(source).forEach((keys) => { if (source[keys] && typeof source[keys] === 'object') { targetObj[keys] = deepClone(source[keys]) } else { @@ -284,8 +282,8 @@ export function uniqueArr(arr) { * @returns {string} */ export function createUniqueString() { - const timestamp = +new Date() + '' - const randomNum = parseInt((1 + Math.random()) * 65536) + '' + const timestamp = `${+new Date()}` + const randomNum = `${parseInt((1 + Math.random()) * 65536, 10)}` return (+(randomNum + timestamp)).toString(32) } @@ -296,7 +294,7 @@ export function createUniqueString() { * @returns {boolean} */ export function hasClass(ele, cls) { - return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) + return !!ele.className.match(new RegExp(`(\\s|^)${cls}(\\s|$)`)) } /** @@ -305,7 +303,7 @@ export function hasClass(ele, cls) { * @param {string} cls */ export function addClass(ele, cls) { - if (!hasClass(ele, cls)) ele.className += ' ' + cls + if (!hasClass(ele, cls)) ele.className += ` ${cls}` } /** @@ -315,7 +313,7 @@ export function addClass(ele, cls) { */ export function removeClass(ele, cls) { if (hasClass(ele, cls)) { - const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + const reg = new RegExp(`(\\s|^)${cls}(\\s|$)`) ele.className = ele.className.replace(reg, ' ') } } @@ -326,11 +324,9 @@ export function makeMap(str, expectsLowerCase) { for (let i = 0; i < list.length; i++) { map[list[i]] = true } - return expectsLowerCase - ? val => map[val.toLowerCase()] - : val => map[val] + return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val] } - + export const exportDefault = 'export default ' export const beautifierConf = { @@ -351,7 +347,7 @@ export const beautifierConf = { indent_inner_html: true, comma_first: false, e4x: true, - indent_empty_lines: true + indent_empty_lines: true, }, js: { indent_size: '2', @@ -370,21 +366,20 @@ export const beautifierConf = { indent_inner_html: true, comma_first: false, e4x: true, - indent_empty_lines: true - } + indent_empty_lines: true, + }, } // 首字母大小 export function titleCase(str) { - return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) + return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()) } // 下划转驼峰 export function camelCase(str) { - return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) + return str.replace(/_[a-z]/g, (str1) => str1.substr(-1).toUpperCase()) } export function isNumberStr(str) { return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) } - diff --git a/src/utils/jsencrypt.js b/src/utils/jsencrypt.js index 9f3a280e2..0a805828e 100644 --- a/src/utils/jsencrypt.js +++ b/src/utils/jsencrypt.js @@ -2,10 +2,12 @@ import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' // 密钥对生成 http://web.chacuo.net/netrsakeypair -const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + +const publicKey = + 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' -const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + +const privateKey = + 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + @@ -27,4 +29,3 @@ export function decrypt(txt) { encryptor.setPrivateKey(privateKey) // 设置私钥 return encryptor.decrypt(txt) // 对数据进行解密 } - diff --git a/src/utils/permission.js b/src/utils/permission.js index 93b772d54..f7ee720f8 100644 --- a/src/utils/permission.js +++ b/src/utils/permission.js @@ -7,22 +7,21 @@ import useUserStore from '@/store/modules/user' */ export function checkPermi(value) { if (value && value instanceof Array && value.length > 0) { - const permissions = useUserStore().permissions + const { permissions } = useUserStore() const permissionDatas = value - const all_permission = "*:*:*"; + const allPermission = '*:*:*' - const hasPermission = permissions.some(permission => { - return all_permission === permission || permissionDatas.includes(permission) + const hasPermission = permissions.some((permission) => { + return allPermission === permission || permissionDatas.includes(permission) }) if (!hasPermission) { return false } return true - } else { - console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) - return false } + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false } /** @@ -32,20 +31,19 @@ export function checkPermi(value) { */ export function checkRole(value) { if (value && value instanceof Array && value.length > 0) { - const roles = useUserStore().roles + const { roles } = useUserStore() const permissionRoles = value - const super_admin = "admin"; + const superAdmin = 'admin' - const hasRole = roles.some(role => { - return super_admin === role || permissionRoles.includes(role) + const hasRole = roles.some((role) => { + return superAdmin === role || permissionRoles.includes(role) }) if (!hasRole) { return false } return true - } else { - console.error(`need roles! Like checkRole="['admin','editor']"`) - return false } -} \ No newline at end of file + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false +} diff --git a/src/utils/request.js b/src/utils/request.js index 001ec1133..fbe82f25d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,15 +1,15 @@ import axios from 'axios' -import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' +import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus' +import { saveAs } from 'file-saver' import { getToken } from '@/utils/auth' import errorCode from '@/utils/errorCode' import { tansParams, blobValidate } from '@/utils/ruoyi' import cache from '@/plugins/cache' -import { saveAs } from 'file-saver' import useUserStore from '@/store/modules/user' -let downloadLoadingInstance; +let downloadLoadingInstance // 是否显示重新登录 -export let isRelogin = { show: false }; +export const isRelogin = { show: false } axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' // 创建axios实例 @@ -17,130 +17,152 @@ const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: import.meta.env.VITE_APP_BASE_API, // 超时 - timeout: 10000 + timeout: 10000, }) // request拦截器 -service.interceptors.request.use(config => { - // 是否需要设置 token - const isToken = (config.headers || {}).isToken === false - // 是否需要防止数据重复提交 - const isRepeatSubmit = (config.headers || {}).repeatSubmit === false - if (getToken() && !isToken) { - config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 - } - // get请求映射params参数 - if (config.method === 'get' && config.params) { - let url = config.url + '?' + tansParams(config.params); - url = url.slice(0, -1); - config.params = {}; - config.url = url; - } - if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { - const requestObj = { - url: config.url, - data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, - time: new Date().getTime() +service.interceptors.request.use( + (config) => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + if (getToken() && !isToken) { + config.headers.Authorization = `Bearer ${getToken()}` // 让每个请求携带自定义token 请根据实际情况自行修改 + } + // get请求映射params参数 + if (config.method === 'get' && config.params) { + let url = `${config.url}?${tansParams(config.params)}` + url = url.slice(0, -1) + config.params = {} + config.url = url } - const sessionObj = cache.session.getJSON('sessionObj') - if (sessionObj === undefined || sessionObj === null || sessionObj === '') { - cache.session.setJSON('sessionObj', requestObj) - } else { - const s_url = sessionObj.url; // 请求地址 - const s_data = sessionObj.data; // 请求数据 - const s_time = sessionObj.time; // 请求时间 - const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 - if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { - const message = '数据正在处理,请勿重复提交'; - console.warn(`[${s_url}]: ` + message) - return Promise.reject(new Error(message)) + if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime(), + } + const sessionObj = cache.session.getJSON('sessionObj') + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + cache.session.setJSON('sessionObj', requestObj) } else { + const sUrl = sessionObj.url // 请求地址 + const sData = sessionObj.data // 请求数据 + const sTime = sessionObj.time // 请求时间 + const interval = 1000 // 间隔时间(ms),小于此时间视为重复提交 + if (sData === requestObj.data && requestObj.time - sTime < interval && sUrl === requestObj.url) { + const message = '数据正在处理,请勿重复提交' + console.warn(`[${sUrl}]: ${message}`) + return Promise.reject(new Error(message)) + } cache.session.setJSON('sessionObj', requestObj) } } - } - return config -}, error => { + return config + }, + (error) => { console.log(error) Promise.reject(error) -}) + } +) // 响应拦截器 -service.interceptors.response.use(res => { +service.interceptors.response.use( + (res) => { // 未设置状态码则默认成功状态 - const code = res.data.code || 200; + const code = res.data.code || 200 // 获取错误信息 - const msg = errorCode[code] || res.data.msg || errorCode['default'] + const msg = errorCode[code] || res.data.msg || errorCode.default // 二进制数据则直接返回 - if(res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer'){ + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { return res.data } if (code === 401) { if (!isRelogin.show) { - isRelogin.show = true; - ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => { - isRelogin.show = false; - useUserStore().logOut().then(() => { - location.href = '/index'; + isRelogin.show = true + ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { + confirmButtonText: '重新登录', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => { + isRelogin.show = false + useUserStore() + .logOut() + .then(() => { + window.location.href = '/index' + }) }) - }).catch(() => { - isRelogin.show = false; - }); - } + .catch(() => { + isRelogin.show = false + }) + } + // eslint-disable-next-line prefer-promise-reject-errors return Promise.reject('无效的会话,或者会话已过期,请重新登录。') - } else if (code === 500) { + } + if (code === 500) { ElMessage({ message: msg, type: 'error' }) return Promise.reject(new Error(msg)) - } else if (code === 601) { + } + if (code === 601) { ElMessage({ message: msg, type: 'warning' }) return Promise.reject(new Error(msg)) - } else if (code !== 200) { + } + if (code !== 200) { ElNotification.error({ title: msg }) + // eslint-disable-next-line prefer-promise-reject-errors return Promise.reject('error') - } else { - return Promise.resolve(res.data) } + return Promise.resolve(res.data) }, - error => { - console.log('err' + error) - let { message } = error; - if (message == "Network Error") { - message = "后端接口连接异常"; - } else if (message.includes("timeout")) { - message = "系统接口请求超时"; - } else if (message.includes("Request failed with status code")) { - message = "系统接口" + message.substr(message.length - 3) + "异常"; + (error) => { + console.log(`err${error}`) + let { message } = error + if (message === 'Network Error') { + message = '后端接口连接异常' + } else if (message.includes('timeout')) { + message = '系统接口请求超时' + } else if (message.includes('Request failed with status code')) { + message = `系统接口${message.substr(message.length - 3)}异常` } - ElMessage({ message: message, type: 'error', duration: 5 * 1000 }) + ElMessage({ message, type: 'error', duration: 5 * 1000 }) return Promise.reject(error) } ) // 通用下载方法 export function download(url, params, filename, config) { - downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) - return service.post(url, params, { - transformRequest: [(params) => { return tansParams(params) }], - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - responseType: 'blob', - ...config - }).then(async (data) => { - const isLogin = await blobValidate(data); - if (isLogin) { - const blob = new Blob([data]) - saveAs(blob, filename) - } else { - const resText = await data.text(); - const rspObj = JSON.parse(resText); - const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] - ElMessage.error(errMsg); - } - downloadLoadingInstance.close(); - }).catch((r) => { - console.error(r) - ElMessage.error('下载文件出现错误,请联系管理员!') - downloadLoadingInstance.close(); - }) + downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' }) + return service + .post(url, params, { + transformRequest: [ + (params) => { + return tansParams(params) + }, + ], + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + responseType: 'blob', + ...config, + }) + .then(async (data) => { + const isLogin = await blobValidate(data) + if (isLogin) { + const blob = new Blob([data]) + saveAs(blob, filename) + } else { + const resText = await data.text() + const rspObj = JSON.parse(resText) + const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode.default + ElMessage.error(errMsg) + } + downloadLoadingInstance.close() + }) + .catch((r) => { + console.error(r) + ElMessage.error('下载文件出现错误,请联系管理员!') + downloadLoadingInstance.close() + }) } export default service diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js index 3ba28681c..07fb6fad4 100644 --- a/src/utils/ruoyi.js +++ b/src/utils/ruoyi.js @@ -1,5 +1,3 @@ - - /** * 通用js方法封装处理 * Copyright (c) 2019 ruoyi @@ -15,13 +13,16 @@ export function parseTime(time, pattern) { if (typeof time === 'object') { date = time } else { - if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { - time = parseInt(time) + if (typeof time === 'string' && /^[0-9]+$/.test(time)) { + time = parseInt(time, 10) } else if (typeof time === 'string') { - time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); + time = time + .replace(/-/gm, '/') + .replace('T', ' ') + .replace(/\.[\d]{3}/gm, '') } - if ((typeof time === 'number') && (time.toString().length === 10)) { - time = time * 1000 + if (typeof time === 'number' && time.toString().length === 10) { + time *= 1000 } date = new Date(time) } @@ -32,123 +33,136 @@ export function parseTime(time, pattern) { h: date.getHours(), i: date.getMinutes(), s: date.getSeconds(), - a: date.getDay() + a: date.getDay(), } - const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { let value = formatObj[key] // Note: getDay() returns 0 on Sunday - if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (key === 'a') { + return ['日', '一', '二', '三', '四', '五', '六'][value] + } if (result.length > 0 && value < 10) { - value = '0' + value + value = `0${value}` } return value || 0 }) - return time_str + return timeStr } // 表单重置 export function resetForm(refName) { if (this.$refs[refName]) { - this.$refs[refName].resetFields(); + this.$refs[refName].resetFields() } } // 添加日期范围 export function addDateRange(params, dateRange, propName) { - let search = params; - search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {}; - dateRange = Array.isArray(dateRange) ? dateRange : []; - if (typeof (propName) === 'undefined') { - search.params['beginTime'] = dateRange[0]; - search.params['endTime'] = dateRange[1]; + const search = params + search.params = + typeof search.params === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {} + dateRange = Array.isArray(dateRange) ? dateRange : [] + if (typeof propName === 'undefined') { + ;[search.params.beginTime, search.params.endTime] = dateRange } else { - search.params['begin' + propName] = dateRange[0]; - search.params['end' + propName] = dateRange[1]; + ;[search.params[`begin${propName}`], search.params[`end${propName}`]] = dateRange } - return search; + return search } // 回显数据字典 export function selectDictLabel(datas, value) { if (value === undefined) { - return ""; + return '' } - var actions = []; + const actions = [] + // eslint-disable-next-line array-callback-return Object.keys(datas).some((key) => { - if (datas[key].value == ('' + value)) { - actions.push(datas[key].label); - return true; + // eslint-disable-next-line eqeqeq + if (datas[key].value == `${value}`) { + actions.push(datas[key].label) + return true } }) if (actions.length === 0) { - actions.push(value); + actions.push(value) } - return actions.join(''); + return actions.join('') } // 回显数据字典(字符串数组) export function selectDictLabels(datas, value, separator) { - if (value === undefined || value.length ===0) { - return ""; + if (value === undefined || value.length === 0) { + return '' } if (Array.isArray(value)) { - value = value.join(","); + value = value.join(',') } - var actions = []; - var currentSeparator = undefined === separator ? "," : separator; - var temp = value.split(currentSeparator); + const actions = [] + const currentSeparator = undefined === separator ? ',' : separator + const temp = value.split(currentSeparator) + // eslint-disable-next-line array-callback-return Object.keys(value.split(currentSeparator)).some((val) => { - var match = false; + let match = false + // eslint-disable-next-line array-callback-return Object.keys(datas).some((key) => { - if (datas[key].value == ('' + temp[val])) { - actions.push(datas[key].label + currentSeparator); - match = true; + // eslint-disable-next-line eqeqeq + if (datas[key].value == `${temp[val]}`) { + actions.push(datas[key].label + currentSeparator) + match = true } }) if (!match) { - actions.push(temp[val] + currentSeparator); + actions.push(temp[val] + currentSeparator) } }) - return actions.join('').substring(0, actions.join('').length - 1); + return actions.join('').substring(0, actions.join('').length - 1) } // 字符串格式化(%s ) export function sprintf(str) { - var args = arguments, flag = true, i = 1; + // eslint-disable-next-line prefer-rest-params + const args = arguments + let flag = true + let i = 1 + // eslint-disable-next-line func-names str = str.replace(/%s/g, function () { - var arg = args[i++]; + const arg = args[i++] if (typeof arg === 'undefined') { - flag = false; - return ''; + flag = false + return '' } - return arg; - }); - return flag ? str : ''; + return arg + }) + return flag ? str : '' } // 转换字符串,undefined,null等转化为"" export function parseStrEmpty(str) { - if (!str || str == "undefined" || str == "null") { - return ""; + // eslint-disable-next-line eqeqeq + if (!str || str == 'undefined' || str == 'null') { + return '' } - return str; + return str } // 数据合并 export function mergeRecursive(source, target) { - for (var p in target) { + // eslint-disable-next-line guard-for-in + for (const p in target) { try { + // eslint-disable-next-line eqeqeq if (target[p].constructor == Object) { - source[p] = mergeRecursive(source[p], target[p]); + source[p] = mergeRecursive(source[p], target[p]) } else { - source[p] = target[p]; + source[p] = target[p] } } catch (e) { - source[p] = target[p]; + source[p] = target[p] } } - return source; -}; + return source +} /** * 构造树型结构数据 @@ -158,95 +172,95 @@ export function mergeRecursive(source, target) { * @param {*} children 孩子节点字段 默认 'children' */ export function handleTree(data, id, parentId, children) { - let config = { + const config = { id: id || 'id', parentId: parentId || 'parentId', - childrenList: children || 'children' - }; + childrenList: children || 'children', + } - var childrenListMap = {}; - var nodeIds = {}; - var tree = []; + const childrenListMap = {} + const nodeIds = {} + const tree = [] - for (let d of data) { - let parentId = d[config.parentId]; + for (const d of data) { + const parentId = d[config.parentId] if (childrenListMap[parentId] == null) { - childrenListMap[parentId] = []; + childrenListMap[parentId] = [] } - nodeIds[d[config.id]] = d; - childrenListMap[parentId].push(d); + nodeIds[d[config.id]] = d + childrenListMap[parentId].push(d) } - for (let d of data) { - let parentId = d[config.parentId]; + for (const d of data) { + const parentId = d[config.parentId] if (nodeIds[parentId] == null) { - tree.push(d); + tree.push(d) } } - for (let t of tree) { - adaptToChildrenList(t); + for (const t of tree) { + adaptToChildrenList(t) } function adaptToChildrenList(o) { if (childrenListMap[o[config.id]] !== null) { - o[config.childrenList] = childrenListMap[o[config.id]]; + o[config.childrenList] = childrenListMap[o[config.id]] } if (o[config.childrenList]) { - for (let c of o[config.childrenList]) { - adaptToChildrenList(c); + for (const c of o[config.childrenList]) { + adaptToChildrenList(c) } } } - return tree; + return tree } /** -* 参数处理 -* @param {*} params 参数 -*/ + * 参数处理 + * @param {*} params 参数 + */ export function tansParams(params) { let result = '' for (const propName of Object.keys(params)) { - const value = params[propName]; - var part = encodeURIComponent(propName) + "="; - if (value !== null && value !== "" && typeof (value) !== "undefined") { + const value = params[propName] + const part = `${encodeURIComponent(propName)}=` + if (value !== null && value !== '' && typeof value !== 'undefined') { if (typeof value === 'object') { for (const key of Object.keys(value)) { - if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { - let params = propName + '[' + key + ']'; - var subPart = encodeURIComponent(params) + "="; - result += subPart + encodeURIComponent(value[key]) + "&"; + if (value[key] !== null && value[key] !== '' && typeof value[key] !== 'undefined') { + const params = `${propName}[${key}]` + const subPart = `${encodeURIComponent(params)}=` + result += `${subPart + encodeURIComponent(value[key])}&` } } } else { - result += part + encodeURIComponent(value) + "&"; + result += `${part + encodeURIComponent(value)}&` } } } return result } - // 返回项目路径 export function getNormalPath(p) { + // eslint-disable-next-line eqeqeq if (p.length === 0 || !p || p == 'undefined') { return p - }; - let res = p.replace('//', '/') + } + const res = p.replace('//', '/') if (res[res.length - 1] === '/') { return res.slice(0, res.length - 1) } - return res; + return res } // 验证是否为blob格式 export async function blobValidate(data) { try { - const text = await data.text(); - JSON.parse(text); - return false; + const text = await data.text() + JSON.parse(text) + return false } catch (error) { - return true; + return true } -} \ No newline at end of file +} diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js index 709fa5745..c4e90c5db 100644 --- a/src/utils/scroll-to.js +++ b/src/utils/scroll-to.js @@ -1,15 +1,25 @@ -Math.easeInOutQuad = function(t, b, c, d) { +// eslint-disable-next-line func-names +Math.easeInOutQuad = function (t, b, c, d) { t /= d / 2 if (t < 1) { - return c / 2 * t * t + b + return (c / 2) * t * t + b } t-- - return -c / 2 * (t * (t - 2) - 1) + b + return (-c / 2) * (t * (t - 2) - 1) + b } // requestAnimationFrame for Smart Animating http://goo.gl/sx5sts -var requestAnimFrame = (function() { - return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +// eslint-disable-next-line func-names +const requestAnimFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + // eslint-disable-next-line func-names + function (callback) { + window.setTimeout(callback, 1000 / 60) + } + ) })() /** @@ -36,22 +46,21 @@ export function scrollTo(to, duration, callback) { const change = to - start const increment = 20 let currentTime = 0 - duration = (typeof (duration) === 'undefined') ? 500 : duration - var animateScroll = function() { + duration = typeof duration === 'undefined' ? 500 : duration + // eslint-disable-next-line func-names + const animateScroll = function () { // increment the time currentTime += increment // find the value with the quadratic in-out easing function - var val = Math.easeInOutQuad(currentTime, start, change, duration) + const val = Math.easeInOutQuad(currentTime, start, change, duration) // move the document.body move(val) // do the animation unless its over if (currentTime < duration) { requestAnimFrame(animateScroll) - } else { - if (callback && typeof (callback) === 'function') { - // the animation is done so lets callback - callback() - } + } else if (callback && typeof callback === 'function') { + // the animation is done so lets callback + callback() } } animateScroll() diff --git a/src/utils/theme.js b/src/utils/theme.js index f4badc67e..6dc81d348 100644 --- a/src/utils/theme.js +++ b/src/utils/theme.js @@ -1,49 +1,50 @@ // 处理主题样式 export function handleThemeStyle(theme) { - document.documentElement.style.setProperty('--el-color-primary', theme) - for (let i = 1; i <= 9; i++) { - document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`) - } - for (let i = 1; i <= 9; i++) { - document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`) - } + document.documentElement.style.setProperty('--el-color-primary', theme) + for (let i = 1; i <= 9; i++) { + document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`) + } + for (let i = 1; i <= 9; i++) { + document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`) + } } // hex颜色转rgb颜色 export function hexToRgb(str) { - str = str.replace('#', '') - let hexs = str.match(/../g) - for (let i = 0; i < 3; i++) { - hexs[i] = parseInt(hexs[i], 16) - } - return hexs + str = str.replace('#', '') + const hexs = str.match(/../g) + for (let i = 0; i < 3; i++) { + hexs[i] = parseInt(hexs[i], 16) + } + return hexs } // rgb颜色转Hex颜色 export function rgbToHex(r, g, b) { - let hexs = [r.toString(16), g.toString(16), b.toString(16)] - for (let i = 0; i < 3; i++) { - if (hexs[i].length == 1) { - hexs[i] = `0${hexs[i]}` - } - } - return `#${hexs.join('')}` + const hexs = [r.toString(16), g.toString(16), b.toString(16)] + for (let i = 0; i < 3; i++) { + // eslint-disable-next-line eqeqeq + if (hexs[i].length == 1) { + hexs[i] = `0${hexs[i]}` + } + } + return `#${hexs.join('')}` } // 变浅颜色值 export function getLightColor(color, level) { - let rgb = hexToRgb(color) - for (let i = 0; i < 3; i++) { - rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]) - } - return rgbToHex(rgb[0], rgb[1], rgb[2]) + const rgb = hexToRgb(color) + for (let i = 0; i < 3; i++) { + rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]) + } + return rgbToHex(rgb[0], rgb[1], rgb[2]) } // 变深颜色值 export function getDarkColor(color, level) { - let rgb = hexToRgb(color) - for (let i = 0; i < 3; i++) { - rgb[i] = Math.floor(rgb[i] * (1 - level)) - } - return rgbToHex(rgb[0], rgb[1], rgb[2]) + const rgb = hexToRgb(color) + for (let i = 0; i < 3; i++) { + rgb[i] = Math.floor(rgb[i] * (1 - level)) + } + return rgbToHex(rgb[0], rgb[1], rgb[2]) } diff --git a/src/utils/validate.js b/src/utils/validate.js index 71d0d0616..cab721726 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,9 +1,9 @@ /** - * 判断url是否是http或https + * 判断url是否是http或https * @param {string} path * @returns {Boolean} */ - export function isHttp(url) { +export function isHttp(url) { return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 } @@ -12,7 +12,7 @@ * @param {string} path * @returns {Boolean} */ - export function isExternal(path) { +export function isExternal(path) { return /^(https?:|mailto:|tel:)/.test(path) } @@ -21,8 +21,8 @@ * @returns {Boolean} */ export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 + const validMap = ['admin', 'editor'] + return validMap.indexOf(str.trim()) >= 0 } /** @@ -30,7 +30,8 @@ export function validUsername(str) { * @returns {Boolean} */ export function validURL(url) { - const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + const reg = + /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ return reg.test(url) } @@ -66,7 +67,9 @@ export function validAlphabets(str) { * @returns {Boolean} */ export function validEmail(email) { - const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + const reg = + // eslint-disable-next-line no-useless-escape + /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ return reg.test(email) } diff --git a/src/views/login.vue b/src/views/login.vue index c2a91efcc..875152e7c 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -3,13 +3,7 @@

若依后台管理系统

- + @@ -25,7 +19,7 @@ - + - 记住密码 - - + 记住密码 + + 登 录 登 录 中... -
+
立即注册
@@ -65,98 +53,101 @@ -