From 3a3b8aef06a8d8ea7d0ed530f46e3043d0cacc2d Mon Sep 17 00:00:00 2001 From: ailanyin Date: Wed, 15 Mar 2023 16:25:25 +0800 Subject: [PATCH] tenant manage, code fmt --- src/App.vue | 30 +- src/api/file/file.js | 9 + src/api/login.js | 118 +- src/api/menu.js | 18 +- src/api/monitor/cache.js | 57 - src/api/monitor/job.js | 141 +- src/api/monitor/jobLog.js | 60 +- src/api/monitor/logininfor.js | 68 +- src/api/monitor/online.js | 18 - src/api/monitor/operlog.js | 52 +- src/api/monitor/server.js | 18 +- src/api/product/category.js | 44 + src/api/system/config.js | 120 +- src/api/system/dept.js | 112 +- src/api/system/dict/data.js | 104 +- src/api/system/dict/type.js | 120 +- src/api/system/menu.js | 120 +- src/api/system/notice.js | 88 +- src/api/system/post.js | 88 +- src/api/system/role.js | 238 +-- src/api/system/tenant.js | 52 + src/api/system/user.js | 265 ++- src/api/tool/gen.js | 152 +- src/assets/iconfonts/demo.css | 540 +++++++ src/assets/iconfonts/demo_index.html | 293 ++++ src/assets/iconfonts/iconfont.css | 26 + src/assets/iconfonts/iconfont.js | 69 + src/assets/iconfonts/iconfont.json | 30 + src/assets/iconfonts/iconfont.ttf | Bin 0 -> 2552 bytes src/assets/iconfonts/iconfont.woff | Bin 0 -> 1668 bytes src/assets/iconfonts/iconfont.woff2 | Bin 0 -> 1280 bytes src/assets/styles/btn.scss | 198 +-- src/assets/styles/element-ui.scss | 192 +-- src/assets/styles/index.scss | 394 ++--- src/assets/styles/mixin.scss | 126 +- src/assets/styles/ruoyi.scss | 567 +++---- src/assets/styles/sidebar.scss | 475 +++--- src/assets/styles/transition.scss | 106 +- src/assets/styles/variables.module.scss | 130 +- src/components/Breadcrumb/index.vue | 138 +- src/components/Crontab/day.vue | 367 +++-- src/components/Crontab/hour.vue | 275 ++-- src/components/Crontab/index.vue | 660 ++++---- src/components/Crontab/min.vue | 273 ++-- src/components/Crontab/month.vue | 303 ++-- src/components/Crontab/result.vue | 1131 ++++++------- src/components/Crontab/second.vue | 277 ++-- src/components/Crontab/week.vue | 426 ++--- src/components/Crontab/year.vue | 341 ++-- src/components/DictTag/index.vue | 99 +- src/components/FileUpload/index.vue | 438 ++--- src/components/Hamburger/index.vue | 84 +- src/components/HeaderSearch/index.vue | 372 +++-- src/components/IconSelect/index.vue | 154 +- src/components/IconSelect/requireIcons.js | 16 +- src/components/ImagePreview/index.vue | 184 +-- src/components/ImageUpload/index.vue | 432 ++--- src/components/Pagination/index.vue | 209 ++- src/components/ParentView/index.vue | 6 +- src/components/RightToolbar/index.vue | 222 +-- src/components/RuoYi/Doc/index.vue | 26 +- src/components/RuoYi/Git/index.vue | 26 +- src/components/Screenfull/index.vue | 47 +- src/components/SizeSelect/index.vue | 95 +- src/components/SvgIcon/index.vue | 106 +- src/components/SvgIcon/svgicon.js | 20 +- src/components/TopNav/index.vue | 386 ++--- src/components/TreeSelect/index.vue | 311 ++-- src/components/iFrame/index.vue | 63 +- src/constant/dict.js | 4 + src/constant/status.js | 12 + src/directive/common/copyText.js | 132 +- src/directive/index.js | 18 +- src/directive/permission/hasPermi.js | 58 +- src/directive/permission/hasRole.js | 56 +- src/layout/components/AppMain.vue | 110 +- src/layout/components/IframeToggle/index.vue | 38 +- src/layout/components/InnerLink/index.vue | 48 +- src/layout/components/Navbar.vue | 393 ++--- src/layout/components/Settings/index.vue | 537 +++--- src/layout/components/Sidebar/Link.vue | 80 +- src/layout/components/Sidebar/Logo.vue | 197 ++- src/layout/components/Sidebar/SidebarItem.vue | 236 +-- src/layout/components/Sidebar/index.vue | 123 +- src/layout/components/TagsView/ScrollPane.vue | 219 +-- src/layout/components/TagsView/index.vue | 693 ++++---- src/layout/components/index.js | 8 +- src/layout/index.vue | 233 +-- src/main.js | 169 +- src/permission.js | 133 +- src/plugins/auth.js | 120 +- src/plugins/cache.js | 154 +- src/plugins/download.js | 151 +- src/plugins/index.js | 36 +- src/plugins/modal.js | 169 +- src/plugins/tab.js | 134 +- src/router/index.js | 360 +++-- src/settings.js | 94 +- src/store/index.js | 6 +- src/store/modules/app.js | 92 +- src/store/modules/dict.js | 111 +- src/store/modules/permission.js | 276 ++-- src/store/modules/settings.js | 95 +- src/store/modules/tagsView.js | 368 ++--- src/store/modules/user.js | 148 +- src/utils/auth.js | 30 +- src/utils/dict.js | 53 +- src/utils/dynamicTitle.js | 30 +- src/utils/errorCode.js | 12 +- src/utils/index.js | 784 ++++----- src/utils/jsencrypt.js | 61 +- src/utils/permission.js | 106 +- src/utils/request.js | 341 ++-- src/utils/ruoyi.js | 517 +++--- src/utils/scroll-to.js | 127 +- src/utils/theme.js | 66 +- src/utils/validate.js | 188 +-- src/views/error/401.vue | 165 +- src/views/error/404.vue | 468 +++--- src/views/iforgot.vue | 108 ++ src/views/index.vue | 984 +---------- src/views/login.vue | 619 ++++--- src/views/monitor/cache/index.vue | 131 -- src/views/monitor/cache/list.vue | 246 --- src/views/monitor/druid/index.vue | 13 - src/views/monitor/job/index.vue | 1108 +++++++------ src/views/monitor/job/log.vue | 623 +++---- src/views/monitor/logininfor/index.vue | 522 +++--- src/views/monitor/online/index.vue | 106 -- src/views/monitor/operlog/index.vue | 650 ++++---- src/views/monitor/server/index.vue | 555 ++++--- src/views/product/category/index.vue | 366 +++++ src/views/redirect/index.vue | 28 +- src/views/register.vue | 541 ++++--- src/views/sign_in_with.vue | 5 + src/views/system/config/index.vue | 701 ++++---- src/views/system/dept/index.vue | 645 ++++---- src/views/system/dict/data.vue | 788 +++++---- src/views/system/dict/index.vue | 711 ++++---- src/views/system/menu/index.vue | 1014 +++++++----- src/views/system/notice/index.vue | 657 ++++---- src/views/system/post/index.vue | 630 ++++---- src/views/system/role/authUser.vue | 404 +++-- src/views/system/role/index.vue | 1246 +++++++------- src/views/system/role/selectUser.vue | 315 ++-- src/views/system/tenant/index.vue | 628 ++++++++ src/views/system/user/authRole.vue | 245 +-- src/views/system/user/index.vue | 1433 ++++++++++------- src/views/system/user/profile/index.vue | 176 +- src/views/system/user/profile/resetPwd.vue | 135 +- src/views/system/user/profile/userAvatar.vue | 350 ++-- src/views/system/user/profile/userInfo.vue | 126 +- src/views/tool/build/index.vue | 3 - src/views/tool/gen/basicInfoForm.vue | 96 +- src/views/tool/gen/editTable.vue | 432 ++--- src/views/tool/gen/genInfoForm.vue | 609 +++---- src/views/tool/gen/importTable.vue | 258 +-- src/views/tool/gen/index.vue | 671 ++++---- src/views/tool/swagger/index.vue | 9 - vite.config.js | 2 +- 160 files changed, 21986 insertions(+), 18387 deletions(-) create mode 100644 src/api/file/file.js delete mode 100644 src/api/monitor/cache.js delete mode 100644 src/api/monitor/online.js create mode 100644 src/api/product/category.js create mode 100644 src/api/system/tenant.js create mode 100644 src/assets/iconfonts/demo.css create mode 100644 src/assets/iconfonts/demo_index.html create mode 100644 src/assets/iconfonts/iconfont.css create mode 100644 src/assets/iconfonts/iconfont.js create mode 100644 src/assets/iconfonts/iconfont.json create mode 100644 src/assets/iconfonts/iconfont.ttf create mode 100644 src/assets/iconfonts/iconfont.woff create mode 100644 src/assets/iconfonts/iconfont.woff2 create mode 100644 src/constant/dict.js create mode 100644 src/constant/status.js create mode 100644 src/views/iforgot.vue delete mode 100644 src/views/monitor/cache/index.vue delete mode 100644 src/views/monitor/cache/list.vue delete mode 100644 src/views/monitor/druid/index.vue delete mode 100644 src/views/monitor/online/index.vue create mode 100644 src/views/product/category/index.vue create mode 100644 src/views/sign_in_with.vue create mode 100644 src/views/system/tenant/index.vue delete mode 100644 src/views/tool/build/index.vue delete mode 100644 src/views/tool/swagger/index.vue diff --git a/src/App.vue b/src/App.vue index fd2b3d5..bf23c9f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,15 +1,15 @@ - - - + + + diff --git a/src/api/file/file.js b/src/api/file/file.js new file mode 100644 index 0000000..b53b6d0 --- /dev/null +++ b/src/api/file/file.js @@ -0,0 +1,9 @@ +import request from "@/utils/request"; + +export function uploadFile(data) { + return request({ + url: "/common/upload", + method: "post", + data: data, + }); +} diff --git a/src/api/login.js b/src/api/login.js index 26742e7..12a774f 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,59 +1,59 @@ -import request from '@/utils/request' - -// 登录方法 -export function login(username, password, code, uuid) { - const data = { - username, - password, - code, - uuid - } - return request({ - url: '/login', - headers: { - isToken: false - }, - method: 'post', - data: data - }) -} - -// 注册方法 -export function register(data) { - return request({ - url: '/register', - headers: { - isToken: false - }, - method: 'post', - data: data - }) -} - -// 获取用户详细信息 -export function getInfo() { - return request({ - url: '/getInfo', - method: 'get' - }) -} - -// 退出方法 -export function logout() { - return request({ - url: '/logout', - method: 'post' - }) -} - -// 获取验证码 -export function getCodeImg() { - return request({ - url: '/captchaImage', - headers: { - isToken: false - }, - method: 'get', - timeout: 20000 - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 登录方法 +export function login(username, password, code, uuid) { + const data = { + username, + password, + code, + uuid, + }; + return request({ + url: "/login", + headers: { + isToken: false, + }, + method: "post", + data: data, + }); +} + +// 注册方法 +export function register(data) { + return request({ + url: "/register", + headers: { + isToken: false, + }, + method: "post", + data: data, + }); +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: "/getInfo", + method: "get", + }); +} + +// 退出方法 +export function logout() { + return request({ + url: "/logout", + method: "post", + }); +} + +// 获取验证码 +export function getCodeImg() { + return request({ + url: "/captchaImage", + headers: { + isToken: false, + }, + method: "get", + timeout: 20000, + }); +} diff --git a/src/api/menu.js b/src/api/menu.js index 6e52e6e..2dbb85e 100644 --- a/src/api/menu.js +++ b/src/api/menu.js @@ -1,9 +1,9 @@ -import request from '@/utils/request' - -// 获取路由 -export const getRouters = () => { - return request({ - url: '/getRouters', - method: 'get' - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 获取路由 +export const getRouters = () => { + return request({ + url: "/getRouters", + method: "get", + }); +}; diff --git a/src/api/monitor/cache.js b/src/api/monitor/cache.js deleted file mode 100644 index e1f2c87..0000000 --- a/src/api/monitor/cache.js +++ /dev/null @@ -1,57 +0,0 @@ -import request from '@/utils/request' - -// 查询缓存详细 -export function getCache() { - return request({ - url: '/monitor/cache', - method: 'get' - }) -} - -// 查询缓存名称列表 -export function listCacheName() { - return request({ - url: '/monitor/cache/getNames', - method: 'get' - }) -} - -// 查询缓存键名列表 -export function listCacheKey(cacheName) { - return request({ - url: '/monitor/cache/getKeys/' + cacheName, - method: 'get' - }) -} - -// 查询缓存内容 -export function getCacheValue(cacheName, cacheKey) { - return request({ - url: '/monitor/cache/getValue/' + cacheName + '/' + cacheKey, - method: 'get' - }) -} - -// 清理指定名称缓存 -export function clearCacheName(cacheName) { - return request({ - url: '/monitor/cache/clearCacheName/' + cacheName, - method: 'delete' - }) -} - -// 清理指定键名缓存 -export function clearCacheKey(cacheKey) { - return request({ - url: '/monitor/cache/clearCacheKey/' + cacheKey, - method: 'delete' - }) -} - -// 清理全部缓存 -export function clearCacheAll() { - return request({ - url: '/monitor/cache/clearCacheAll', - method: 'delete' - }) -} diff --git a/src/api/monitor/job.js b/src/api/monitor/job.js index b33ad3d..94c7905 100644 --- a/src/api/monitor/job.js +++ b/src/api/monitor/job.js @@ -1,71 +1,70 @@ -import request from '@/utils/request' - -// 查询定时任务调度列表 -export function listJob(query) { - return request({ - url: '/monitor/job/list', - method: 'get', - params: query - }) -} - -// 查询定时任务调度详细 -export function getJob(jobId) { - return request({ - url: '/monitor/job/' + jobId, - method: 'get' - }) -} - -// 新增定时任务调度 -export function addJob(data) { - return request({ - url: '/monitor/job', - method: 'post', - data: data - }) -} - -// 修改定时任务调度 -export function updateJob(data) { - return request({ - url: '/monitor/job', - method: 'put', - data: data - }) -} - -// 删除定时任务调度 -export function delJob(jobId) { - return request({ - url: '/monitor/job/' + jobId, - method: 'delete' - }) -} - -// 任务状态修改 -export function changeJobStatus(jobId, status) { - const data = { - jobId, - status - } - return request({ - url: '/monitor/job/changeStatus', - method: 'put', - data: data - }) -} - - -// 定时任务立即执行一次 -export function runJob(jobId, jobGroup) { - const data = { - jobId, - jobGroup - } - return request({ - url: '/monitor/job/run', - method: 'put', - data: data - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 查询定时任务调度列表 +export function listJob(query) { + return request({ + url: "/monitor/job/list", + method: "get", + params: query, + }); +} + +// 查询定时任务调度详细 +export function getJob(jobId) { + return request({ + url: "/monitor/job/" + jobId, + method: "get", + }); +} + +// 新增定时任务调度 +export function addJob(data) { + return request({ + url: "/monitor/job", + method: "post", + data: data, + }); +} + +// 修改定时任务调度 +export function updateJob(data) { + return request({ + url: "/monitor/job", + method: "put", + data: data, + }); +} + +// 删除定时任务调度 +export function delJob(jobId) { + return request({ + url: "/monitor/job/" + jobId, + method: "delete", + }); +} + +// 任务状态修改 +export function changeJobStatus(jobId, status) { + const data = { + jobId, + status, + }; + return request({ + url: "/monitor/job/changeStatus", + method: "put", + data: data, + }); +} + +// 定时任务立即执行一次 +export function runJob(jobId, jobGroup) { + const data = { + jobId, + jobGroup, + }; + return request({ + url: "/monitor/job/run", + method: "put", + data: data, + }); +} diff --git a/src/api/monitor/jobLog.js b/src/api/monitor/jobLog.js index 654bbae..c242fee 100644 --- a/src/api/monitor/jobLog.js +++ b/src/api/monitor/jobLog.js @@ -1,26 +1,34 @@ -import request from '@/utils/request' - -// 查询调度日志列表 -export function listJobLog(query) { - return request({ - url: '/monitor/jobLog/list', - method: 'get', - params: query - }) -} - -// 删除调度日志 -export function delJobLog(jobLogId) { - return request({ - url: '/monitor/jobLog/' + jobLogId, - method: 'delete' - }) -} - -// 清空调度日志 -export function cleanJobLog() { - return request({ - url: '/monitor/jobLog/clean', - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询调度日志列表 +export function listJobLog(query) { + return request({ + url: "/monitor/jobLog/list", + method: "get", + params: query, + }); +} + +// 查询调度日志详细 +export function getJobLog(jobLogId) { + return request({ + url: "/monitor/jobLog/" + jobLogId, + method: "get", + }); +} + +// 删除调度日志 +export function delJobLog(jobLogId) { + return request({ + url: "/monitor/jobLog/" + jobLogId, + method: "delete", + }); +} + +// 清空调度日志 +export function cleanJobLog() { + return request({ + url: "/monitor/jobLog/clean", + method: "delete", + }); +} diff --git a/src/api/monitor/logininfor.js b/src/api/monitor/logininfor.js index c49a40e..3a8d4ed 100644 --- a/src/api/monitor/logininfor.js +++ b/src/api/monitor/logininfor.js @@ -1,34 +1,34 @@ -import request from '@/utils/request' - -// 查询登录日志列表 -export function list(query) { - return request({ - url: '/monitor/logininfor/list', - method: 'get', - params: query - }) -} - -// 删除登录日志 -export function delLogininfor(infoId) { - return request({ - url: '/monitor/logininfor/' + infoId, - method: 'delete' - }) -} - -// 解锁用户登录状态 -export function unlockLogininfor(userName) { - return request({ - url: '/monitor/logininfor/unlock/' + userName, - method: 'get' - }) -} - -// 清空登录日志 -export function cleanLogininfor() { - return request({ - url: '/monitor/logininfor/clean', - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询登录日志列表 +export function list(query) { + return request({ + url: "/monitor/loginLog/list", + method: "get", + params: query, + }); +} + +// 删除登录日志 +export function delLogininfor(ids) { + return request({ + url: "/monitor/loginLog/" + ids, + method: "delete", + }); +} + +// 解锁用户登录状态 +export function unlockLogininfor(userName) { + return request({ + url: "/monitor/loginLog/unlock/" + userName, + method: "get", + }); +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: "/monitor/loginLog/clean", + method: "delete", + }); +} diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js deleted file mode 100644 index 288ebe0..0000000 --- a/src/api/monitor/online.js +++ /dev/null @@ -1,18 +0,0 @@ -import request from '@/utils/request' - -// 查询在线用户列表 -export function list(query) { - return request({ - url: '/monitor/online/list', - method: 'get', - params: query - }) -} - -// 强退用户 -export function forceLogout(tokenId) { - return request({ - url: '/monitor/online/' + tokenId, - method: 'delete' - }) -} diff --git a/src/api/monitor/operlog.js b/src/api/monitor/operlog.js index 6e881df..4a1b91a 100644 --- a/src/api/monitor/operlog.js +++ b/src/api/monitor/operlog.js @@ -1,26 +1,26 @@ -import request from '@/utils/request' - -// 查询操作日志列表 -export function list(query) { - return request({ - url: '/monitor/operlog/list', - method: 'get', - params: query - }) -} - -// 删除操作日志 -export function delOperlog(operId) { - return request({ - url: '/monitor/operlog/' + operId, - method: 'delete' - }) -} - -// 清空操作日志 -export function cleanOperlog() { - return request({ - url: '/monitor/operlog/clean', - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询操作日志列表 +export function list(query) { + return request({ + url: "/monitor/useLog/list", + method: "get", + params: query, + }); +} + +// 删除操作日志 +export function delOperlog(ids) { + return request({ + url: "/monitor/useLog/" + ids, + method: "delete", + }); +} + +// 清空操作日志 +export function cleanOperlog() { + return request({ + url: "/monitor/useLog/clean", + method: "delete", + }); +} diff --git a/src/api/monitor/server.js b/src/api/monitor/server.js index cac7791..1181761 100644 --- a/src/api/monitor/server.js +++ b/src/api/monitor/server.js @@ -1,9 +1,9 @@ -import request from '@/utils/request' - -// 获取服务信息 -export function getServer() { - return request({ - url: '/monitor/server', - method: 'get' - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 获取服务信息 +export function getServer() { + return request({ + url: "/monitor/server", + method: "get", + }); +} diff --git a/src/api/product/category.js b/src/api/product/category.js new file mode 100644 index 0000000..ced5c78 --- /dev/null +++ b/src/api/product/category.js @@ -0,0 +1,44 @@ +import request from "@/utils/request"; + +// 查询产品分类列表 +export function listCategory(query) { + return request({ + url: "/product/category/list", + method: "get", + params: query, + }); +} + +// 查询产品分类详细 +export function getCategory(categoryId) { + return request({ + url: "/product/category/" + categoryId, + method: "get", + }); +} + +// 新增产品分类 +export function addCategory(data) { + return request({ + url: "/product/category", + method: "post", + data: data, + }); +} + +// 修改产品分类 +export function updateCategory(data) { + return request({ + url: "/product/category", + method: "put", + data: data, + }); +} + +// 删除产品分类 +export function delCategory(categoryId) { + return request({ + url: "/product/category/" + categoryId, + method: "delete", + }); +} diff --git a/src/api/system/config.js b/src/api/system/config.js index 7858c69..65d1f86 100644 --- a/src/api/system/config.js +++ b/src/api/system/config.js @@ -1,60 +1,60 @@ -import request from '@/utils/request' - -// 查询参数列表 -export function listConfig(query) { - return request({ - url: '/system/config/list', - method: 'get', - params: query - }) -} - -// 查询参数详细 -export function getConfig(configId) { - return request({ - url: '/system/config/' + configId, - method: 'get' - }) -} - -// 根据参数键名查询参数值 -export function getConfigKey(configKey) { - return request({ - url: '/system/config/configKey/' + configKey, - method: 'get' - }) -} - -// 新增参数配置 -export function addConfig(data) { - return request({ - url: '/system/config', - method: 'post', - data: data - }) -} - -// 修改参数配置 -export function updateConfig(data) { - return request({ - url: '/system/config', - method: 'put', - data: data - }) -} - -// 删除参数配置 -export function delConfig(configId) { - return request({ - url: '/system/config/' + configId, - method: 'delete' - }) -} - -// 刷新参数缓存 -export function refreshCache() { - return request({ - url: '/system/config/refreshCache', - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询参数列表 +export function listConfig(query) { + return request({ + url: "/system/config/list", + method: "get", + params: query, + }); +} + +// 查询参数详细 +export function getConfig(configId) { + return request({ + url: "/system/config/" + configId, + method: "get", + }); +} + +// 根据参数键名查询参数值 +export function getConfigKey(configKey) { + return request({ + url: "/system/config/configKey/" + configKey, + method: "get", + }); +} + +// 新增参数配置 +export function addConfig(data) { + return request({ + url: "/system/config", + method: "post", + data: data, + }); +} + +// 修改参数配置 +export function updateConfig(data) { + return request({ + url: "/system/config", + method: "put", + data: data, + }); +} + +// 删除参数配置 +export function delConfig(configId) { + return request({ + url: "/system/config/" + configId, + method: "delete", + }); +} + +// 刷新参数缓存 +export function refreshCache() { + return request({ + url: "/system/config/refreshCache", + method: "delete", + }); +} diff --git a/src/api/system/dept.js b/src/api/system/dept.js index 9ca6966..8a6be36 100644 --- a/src/api/system/dept.js +++ b/src/api/system/dept.js @@ -1,52 +1,60 @@ -import request from '@/utils/request' - -// 查询部门列表 -export function listDept(query) { - return request({ - url: '/system/dept/list', - method: 'get', - params: query - }) -} - -// 查询部门列表(排除节点) -export function listDeptExcludeChild(deptId) { - return request({ - url: '/system/dept/list/exclude/' + deptId, - method: 'get' - }) -} - -// 查询部门详细 -export function getDept(deptId) { - return request({ - url: '/system/dept/' + deptId, - method: 'get' - }) -} - -// 新增部门 -export function addDept(data) { - return request({ - url: '/system/dept', - method: 'post', - data: data - }) -} - -// 修改部门 -export function updateDept(data) { - return request({ - url: '/system/dept', - method: 'put', - data: data - }) -} - -// 删除部门 -export function delDept(deptId) { - return request({ - url: '/system/dept/' + deptId, - method: 'delete' - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 查询部门列表 +export function listDept(query) { + return request({ + url: "/system/dept/list", + method: "get", + params: query, + }); +} + +// 查询部门列表(排除节点) +export function listDeptExcludeChild(deptId) { + return request({ + url: "/system/dept/list/exclude/" + deptId, + method: "get", + }); +} + +// 查询部门详细 +export function getDept(deptId) { + return request({ + url: "/system/dept/" + deptId, + method: "get", + }); +} + +// 新增部门 +export function addDept(data) { + return request({ + url: "/system/dept", + method: "post", + data: data, + }); +} + +// 修改部门 +export function updateDept(data) { + return request({ + url: "/system/dept", + method: "put", + data: data, + }); +} + +// 删除部门 +export function delDept(deptId) { + return request({ + url: "/system/dept/" + deptId, + method: "delete", + }); +} + +// 查询部门下拉树结构 +export function deptTreeSelect() { + return request({ + url: "/system/dept/deptTree", + method: "get", + }); +} diff --git a/src/api/system/dict/data.js b/src/api/system/dict/data.js index 2a6e481..3fd149f 100644 --- a/src/api/system/dict/data.js +++ b/src/api/system/dict/data.js @@ -1,52 +1,52 @@ -import request from '@/utils/request' - -// 查询字典数据列表 -export function listData(query) { - return request({ - url: '/system/dict/data/list', - method: 'get', - params: query - }) -} - -// 查询字典数据详细 -export function getData(dictCode) { - return request({ - url: '/system/dict/data/' + dictCode, - method: 'get' - }) -} - -// 根据字典类型查询字典数据信息 -export function getDicts(dictType) { - return request({ - url: '/system/dict/data/type/' + dictType, - method: 'get' - }) -} - -// 新增字典数据 -export function addData(data) { - return request({ - url: '/system/dict/data', - method: 'post', - data: data - }) -} - -// 修改字典数据 -export function updateData(data) { - return request({ - url: '/system/dict/data', - method: 'put', - data: data - }) -} - -// 删除字典数据 -export function delData(dictCode) { - return request({ - url: '/system/dict/data/' + dictCode, - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询字典数据列表 +export function listData(query) { + return request({ + url: "/system/dict/data/list", + method: "get", + params: query, + }); +} + +// 查询字典数据详细 +export function getData(dictCode) { + return request({ + url: "/system/dict/data/" + dictCode, + method: "get", + }); +} + +// 根据字典类型查询字典数据信息 +export function getDicts(dictType) { + return request({ + url: "/system/dict/data/type/" + dictType, + method: "get", + }); +} + +// 新增字典数据 +export function addData(data) { + return request({ + url: "/system/dict/data", + method: "post", + data: data, + }); +} + +// 修改字典数据 +export function updateData(data) { + return request({ + url: "/system/dict/data", + method: "put", + data: data, + }); +} + +// 删除字典数据 +export function delData(dictCode) { + return request({ + url: "/system/dict/data/" + dictCode, + method: "delete", + }); +} diff --git a/src/api/system/dict/type.js b/src/api/system/dict/type.js index d89dbd1..a0c99f6 100644 --- a/src/api/system/dict/type.js +++ b/src/api/system/dict/type.js @@ -1,60 +1,60 @@ -import request from '@/utils/request' - -// 查询字典类型列表 -export function listType(query) { - return request({ - url: '/system/dict/type/list', - method: 'get', - params: query - }) -} - -// 查询字典类型详细 -export function getType(dictId) { - return request({ - url: '/system/dict/type/' + dictId, - method: 'get' - }) -} - -// 新增字典类型 -export function addType(data) { - return request({ - url: '/system/dict/type', - method: 'post', - data: data - }) -} - -// 修改字典类型 -export function updateType(data) { - return request({ - url: '/system/dict/type', - method: 'put', - data: data - }) -} - -// 删除字典类型 -export function delType(dictId) { - return request({ - url: '/system/dict/type/' + dictId, - method: 'delete' - }) -} - -// 刷新字典缓存 -export function refreshCache() { - return request({ - url: '/system/dict/type/refreshCache', - method: 'delete' - }) -} - -// 获取字典选择框列表 -export function optionselect() { - return request({ - url: '/system/dict/type/optionselect', - method: 'get' - }) -} +import request from "@/utils/request"; + +// 查询字典类型列表 +export function listType(query) { + return request({ + url: "/system/dict/type/list", + method: "get", + params: query, + }); +} + +// 查询字典类型详细 +export function getType(dictId) { + return request({ + url: "/system/dict/type/" + dictId, + method: "get", + }); +} + +// 新增字典类型 +export function addType(data) { + return request({ + url: "/system/dict/type", + method: "post", + data: data, + }); +} + +// 修改字典类型 +export function updateType(data) { + return request({ + url: "/system/dict/type", + method: "put", + data: data, + }); +} + +// 删除字典类型 +export function delType(dictId) { + return request({ + url: "/system/dict/type/" + dictId, + method: "delete", + }); +} + +// 刷新字典缓存 +export function refreshCache() { + return request({ + url: "/system/dict/type/refreshCache", + method: "delete", + }); +} + +// 获取字典选择框列表 +export function optionselect() { + return request({ + url: "/system/dict/type/optionselect", + method: "get", + }); +} diff --git a/src/api/system/menu.js b/src/api/system/menu.js index 97258ee..e7e9866 100644 --- a/src/api/system/menu.js +++ b/src/api/system/menu.js @@ -1,60 +1,60 @@ -import request from '@/utils/request' - -// 查询菜单列表 -export function listMenu(query) { - return request({ - url: '/system/menu/list', - method: 'get', - params: query - }) -} - -// 查询菜单详细 -export function getMenu(menuId) { - return request({ - url: '/system/menu/' + menuId, - method: 'get' - }) -} - -// 查询菜单下拉树结构 -export function treeselect() { - return request({ - url: '/system/menu/treeselect', - method: 'get' - }) -} - -// 根据角色ID查询菜单下拉树结构 -export function roleMenuTreeselect(roleId) { - return request({ - url: '/system/menu/roleMenuTreeselect/' + roleId, - method: 'get' - }) -} - -// 新增菜单 -export function addMenu(data) { - return request({ - url: '/system/menu', - method: 'post', - data: data - }) -} - -// 修改菜单 -export function updateMenu(data) { - return request({ - url: '/system/menu', - method: 'put', - data: data - }) -} - -// 删除菜单 -export function delMenu(menuId) { - return request({ - url: '/system/menu/' + menuId, - method: 'delete' - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 查询菜单列表 +export function listMenu(query) { + return request({ + url: "/system/menu/list", + method: "get", + params: query, + }); +} + +// 查询菜单详细 +export function getMenu(menuId) { + return request({ + url: "/system/menu/" + menuId, + method: "get", + }); +} + +// 查询菜单下拉树结构 +export function treeselect() { + return request({ + url: "/system/menu/treeselect", + method: "get", + }); +} + +// 根据角色ID查询菜单下拉树结构 +export function roleMenuTreeselect(roleId) { + return request({ + url: "/system/menu/roleMenuTreeselect/" + roleId, + method: "get", + }); +} + +// 新增菜单 +export function addMenu(data) { + return request({ + url: "/system/menu", + method: "post", + data: data, + }); +} + +// 修改菜单 +export function updateMenu(data) { + return request({ + url: "/system/menu", + method: "put", + data: data, + }); +} + +// 删除菜单 +export function delMenu(menuId) { + return request({ + url: "/system/menu/" + menuId, + method: "delete", + }); +} diff --git a/src/api/system/notice.js b/src/api/system/notice.js index 737fc16..2e80624 100644 --- a/src/api/system/notice.js +++ b/src/api/system/notice.js @@ -1,44 +1,44 @@ -import request from '@/utils/request' - -// 查询公告列表 -export function listNotice(query) { - return request({ - url: '/system/notice/list', - method: 'get', - params: query - }) -} - -// 查询公告详细 -export function getNotice(noticeId) { - return request({ - url: '/system/notice/' + noticeId, - method: 'get' - }) -} - -// 新增公告 -export function addNotice(data) { - return request({ - url: '/system/notice', - method: 'post', - data: data - }) -} - -// 修改公告 -export function updateNotice(data) { - return request({ - url: '/system/notice', - method: 'put', - data: data - }) -} - -// 删除公告 -export function delNotice(noticeId) { - return request({ - url: '/system/notice/' + noticeId, - method: 'delete' - }) -} \ No newline at end of file +import request from "@/utils/request"; + +// 查询公告列表 +export function listNotice(query) { + return request({ + url: "/system/notice/list", + method: "get", + params: query, + }); +} + +// 查询公告详细 +export function getNotice(noticeId) { + return request({ + url: "/system/notice/" + noticeId, + method: "get", + }); +} + +// 新增公告 +export function addNotice(data) { + return request({ + url: "/system/notice", + method: "post", + data: data, + }); +} + +// 修改公告 +export function updateNotice(data) { + return request({ + url: "/system/notice", + method: "put", + data: data, + }); +} + +// 删除公告 +export function delNotice(noticeId) { + return request({ + url: "/system/notice/" + noticeId, + method: "delete", + }); +} diff --git a/src/api/system/post.js b/src/api/system/post.js index 8faa266..0258833 100644 --- a/src/api/system/post.js +++ b/src/api/system/post.js @@ -1,44 +1,44 @@ -import request from '@/utils/request' - -// 查询岗位列表 -export function listPost(query) { - return request({ - url: '/system/post/list', - method: 'get', - params: query - }) -} - -// 查询岗位详细 -export function getPost(postId) { - return request({ - url: '/system/post/' + postId, - method: 'get' - }) -} - -// 新增岗位 -export function addPost(data) { - return request({ - url: '/system/post', - method: 'post', - data: data - }) -} - -// 修改岗位 -export function updatePost(data) { - return request({ - url: '/system/post', - method: 'put', - data: data - }) -} - -// 删除岗位 -export function delPost(postId) { - return request({ - url: '/system/post/' + postId, - method: 'delete' - }) -} +import request from "@/utils/request"; + +// 查询岗位列表 +export function listPost(query) { + return request({ + url: "/system/post/list", + method: "get", + params: query, + }); +} + +// 查询岗位详细 +export function getPost(postId) { + return request({ + url: "/system/post/" + postId, + method: "get", + }); +} + +// 新增岗位 +export function addPost(data) { + return request({ + url: "/system/post", + method: "post", + data: data, + }); +} + +// 修改岗位 +export function updatePost(data) { + return request({ + url: "/system/post", + method: "put", + data: data, + }); +} + +// 删除岗位 +export function delPost(postId) { + return request({ + url: "/system/post/" + postId, + method: "delete", + }); +} diff --git a/src/api/system/role.js b/src/api/system/role.js index 528cd18..f363e09 100644 --- a/src/api/system/role.js +++ b/src/api/system/role.js @@ -1,119 +1,119 @@ -import request from '@/utils/request' - -// 查询角色列表 -export function listRole(query) { - return request({ - url: '/system/role/list', - method: 'get', - params: query - }) -} - -// 查询角色详细 -export function getRole(roleId) { - return request({ - url: '/system/role/' + roleId, - method: 'get' - }) -} - -// 新增角色 -export function addRole(data) { - return request({ - url: '/system/role', - method: 'post', - data: data - }) -} - -// 修改角色 -export function updateRole(data) { - return request({ - url: '/system/role', - method: 'put', - data: data - }) -} - -// 角色数据权限 -export function dataScope(data) { - return request({ - url: '/system/role/dataScope', - method: 'put', - data: data - }) -} - -// 角色状态修改 -export function changeRoleStatus(roleId, status) { - const data = { - roleId, - status - } - return request({ - url: '/system/role/changeStatus', - method: 'put', - data: data - }) -} - -// 删除角色 -export function delRole(roleId) { - return request({ - url: '/system/role/' + roleId, - method: 'delete' - }) -} - -// 查询角色已授权用户列表 -export function allocatedUserList(query) { - return request({ - url: '/system/role/authUser/allocatedList', - method: 'get', - params: query - }) -} - -// 查询角色未授权用户列表 -export function unallocatedUserList(query) { - return request({ - url: '/system/role/authUser/unallocatedList', - method: 'get', - params: query - }) -} - -// 取消用户授权角色 -export function authUserCancel(data) { - return request({ - url: '/system/role/authUser/cancel', - method: 'put', - data: data - }) -} - -// 批量取消用户授权角色 -export function authUserCancelAll(data) { - return request({ - url: '/system/role/authUser/cancelAll', - method: 'put', - params: data - }) -} - -// 授权用户选择 -export function authUserSelectAll(data) { - return request({ - url: '/system/role/authUser/selectAll', - method: 'put', - params: data - }) -} - -// 根据角色ID查询部门树结构 -export function deptTreeSelect(roleId) { - return request({ - url: '/system/role/deptTree/' + roleId, - method: 'get' - }) -} +import request from "@/utils/request"; + +// 查询角色列表 +export function listRole(query) { + return request({ + url: "/system/role/list", + method: "get", + params: query, + }); +} + +// 查询角色详细 +export function getRole(roleId) { + return request({ + url: "/system/role/" + roleId, + method: "get", + }); +} + +// 新增角色 +export function addRole(data) { + return request({ + url: "/system/role", + method: "post", + data: data, + }); +} + +// 修改角色 +export function updateRole(data) { + return request({ + url: "/system/role", + method: "put", + data: data, + }); +} + +// 角色数据权限 +export function dataScope(data) { + return request({ + url: "/system/role/dataScope", + method: "put", + data: data, + }); +} + +// 角色状态修改 +export function changeRoleStatus(roleId, status) { + const data = { + roleId, + status, + }; + return request({ + url: "/system/role/changeStatus", + method: "put", + data: data, + }); +} + +// 删除角色 +export function delRole(roleId) { + return request({ + url: "/system/role/" + roleId, + method: "delete", + }); +} + +// 查询角色已授权用户列表 +export function allocatedUserList(query) { + return request({ + url: "/system/role/authUser/allocatedList", + method: "get", + params: query, + }); +} + +// 查询角色未授权用户列表 +export function unallocatedUserList(query) { + return request({ + url: "/system/role/authUser/unallocatedList", + method: "get", + params: query, + }); +} + +// 取消用户授权角色 +export function authUserCancel(data) { + return request({ + url: "/system/role/authUser/cancel", + method: "put", + data: data, + }); +} + +// 批量取消用户授权角色 +export function authUserCancelAll(data) { + return request({ + url: "/system/role/authUser/cancelAll", + method: "put", + params: data, + }); +} + +// 授权用户选择 +export function authUserSelectAll(data) { + return request({ + url: "/system/role/authUser/selectAll", + method: "put", + params: data, + }); +} + +// 根据角色ID查询部门树结构 +export function deptTreeSelect(roleId) { + return request({ + url: "/system/role/deptTree/" + roleId, + method: "get", + }); +} diff --git a/src/api/system/tenant.js b/src/api/system/tenant.js new file mode 100644 index 0000000..ce81c58 --- /dev/null +++ b/src/api/system/tenant.js @@ -0,0 +1,52 @@ +import request from "@/utils/request"; + +// 查询租户列表 +export function listTenant(query) { + return request({ + url: "/sys/tenant/list", + method: "get", + params: query, + }); +} + +// 查询租户详细 +export function getTenant(tenantId) { + return request({ + url: "/sys/tenant/" + tenantId, + method: "get", + }); +} + +// 新增租户 +export function addTenant(data) { + return request({ + url: "/sys/tenant", + method: "post", + data: data, + }); +} + +// 修改租户 +export function updateTenant(data) { + return request({ + url: "/sys/tenant", + method: "put", + data: data, + }); +} + +// 删除租户 +export function delTenant(tenantId) { + return request({ + url: "/sys/tenant/" + tenantId, + method: "delete", + }); +} + +export function registerUser(data) { + return request({ + url: `/sys/tenant/${data.tenantId}`, + method: "put", + data, + }); +} diff --git a/src/api/system/user.js b/src/api/system/user.js index 9b949e9..6e4faad 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -1,135 +1,130 @@ -import request from '@/utils/request' -import { parseStrEmpty } from "@/utils/ruoyi"; - -// 查询用户列表 -export function listUser(query) { - return request({ - url: '/system/user/list', - method: 'get', - params: query - }) -} - -// 查询用户详细 -export function getUser(userId) { - return request({ - url: '/system/user/' + parseStrEmpty(userId), - method: 'get' - }) -} - -// 新增用户 -export function addUser(data) { - return request({ - url: '/system/user', - method: 'post', - data: data - }) -} - -// 修改用户 -export function updateUser(data) { - return request({ - url: '/system/user', - method: 'put', - data: data - }) -} - -// 删除用户 -export function delUser(userId) { - return request({ - url: '/system/user/' + userId, - method: 'delete' - }) -} - -// 用户密码重置 -export function resetUserPwd(userId, password) { - const data = { - userId, - password - } - return request({ - url: '/system/user/resetPwd', - method: 'put', - data: data - }) -} - -// 用户状态修改 -export function changeUserStatus(userId, status) { - const data = { - userId, - status - } - return request({ - url: '/system/user/changeStatus', - method: 'put', - data: data - }) -} - -// 查询用户个人信息 -export function getUserProfile() { - return request({ - url: '/system/user/profile', - method: 'get' - }) -} - -// 修改用户个人信息 -export function updateUserProfile(data) { - return request({ - url: '/system/user/profile', - method: 'put', - data: data - }) -} - -// 用户密码重置 -export function updateUserPwd(oldPassword, newPassword) { - const data = { - oldPassword, - newPassword - } - return request({ - url: '/system/user/profile/updatePwd', - method: 'put', - params: data - }) -} - -// 用户头像上传 -export function uploadAvatar(data) { - return request({ - url: '/system/user/profile/avatar', - method: 'post', - data: data - }) -} - -// 查询授权角色 -export function getAuthRole(userId) { - return request({ - url: '/system/user/authRole/' + userId, - method: 'get' - }) -} - -// 保存授权角色 -export function updateAuthRole(data) { - return request({ - url: '/system/user/authRole', - method: 'put', - params: data - }) -} - -// 查询部门下拉树结构 -export function deptTreeSelect() { - return request({ - url: '/system/user/deptTree', - method: 'get' - }) -} +import request from "@/utils/request"; +import { parseStrEmpty } from "@/utils/ruoyi"; + +// 查询用户列表 +export function listUser(query) { + return request({ + url: "/system/user/list", + method: "get", + params: query, + }); +} + +// 查询用户详细 +export function getUser(userId) { + return request({ + url: "/system/user/" + parseStrEmpty(userId), + method: "get", + }); +} + +// 新增用户 +export function addUser(data) { + return request({ + url: "/system/user", + method: "post", + data: data, + }); +} + +// 修改用户 +export function updateUser(data) { + return request({ + url: "/system/user", + method: "put", + data: data, + }); +} + +// 删除用户 +export function delUser(userId) { + return request({ + url: "/system/user/" + userId, + method: "delete", + }); +} + +// 用户密码重置 +export function resetUserPwd(userId, password) { + const data = { + userId, + password, + }; + return request({ + url: "/system/user/resetPwd", + method: "put", + data: data, + }); +} + +// 用户状态修改 +export function changeUserStatus(userId, status) { + const data = { + userId, + status, + }; + return request({ + url: "/system/user/changeStatus", + method: "put", + data: data, + }); +} + +// 查询用户个人信息 +export function getUserProfile() { + return request({ + url: "/system/user/profile", + method: "get", + }); +} + +// 修改用户个人信息 +export function updateUserProfile(data) { + return request({ + url: "/system/user/profile", + method: "put", + data: data, + }); +} + +// 用户密码重置 +export function updateUserPwd(oldPassword, newPassword) { + const data = { + oldPassword, + newPassword, + }; + return request({ + url: "/system/user/profile/updatePwd", + method: "put", + params: data, + }); +} + +// 用户头像上传 +export function uploadAvatar(url) { + const data = { + url, + }; + return request({ + url: "/system/user/profile/uploadAvatar", + method: "put", + params: data, + }); +} + +// 查询授权角色 +export function getAuthRole(userId) { + return request({ + url: "/system/user/authRole/" + userId, + method: "get", + }); +} + +// 保存授权角色 +export function updateAuthRole(data) { + return request({ + url: "/system/user/authRole", + method: "put", + params: data, + }); +} diff --git a/src/api/tool/gen.js b/src/api/tool/gen.js index afaf2a9..e3461ab 100644 --- a/src/api/tool/gen.js +++ b/src/api/tool/gen.js @@ -1,76 +1,76 @@ -import request from '@/utils/request' - -// 查询生成表数据 -export function listTable(query) { - return request({ - url: '/tool/gen/list', - method: 'get', - params: query - }) -} -// 查询db数据库列表 -export function listDbTable(query) { - return request({ - url: '/tool/gen/db/list', - method: 'get', - params: query - }) -} - -// 查询表详细信息 -export function getGenTable(tableId) { - return request({ - url: '/tool/gen/' + tableId, - method: 'get' - }) -} - -// 修改代码生成信息 -export function updateGenTable(data) { - return request({ - url: '/tool/gen', - method: 'put', - data: data - }) -} - -// 导入表 -export function importTable(data) { - return request({ - url: '/tool/gen/importTable', - method: 'post', - params: data - }) -} - -// 预览生成代码 -export function previewTable(tableId) { - return request({ - url: '/tool/gen/preview/' + tableId, - method: 'get' - }) -} - -// 删除表数据 -export function delTable(tableId) { - return request({ - url: '/tool/gen/' + tableId, - method: 'delete' - }) -} - -// 生成代码(自定义路径) -export function genCode(tableName) { - return request({ - url: '/tool/gen/genCode/' + tableName, - method: 'get' - }) -} - -// 同步数据库 -export function synchDb(tableName) { - return request({ - url: '/tool/gen/synchDb/' + tableName, - method: 'get' - }) -} +import request from "@/utils/request"; + +// 查询生成表数据 +export function listTable(query) { + return request({ + url: "/tool/gen/list", + method: "get", + params: query, + }); +} +// 查询db数据库列表 +export function listDbTable(query) { + return request({ + url: "/tool/gen/db/list", + method: "get", + params: query, + }); +} + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + url: "/tool/gen/" + tableId, + method: "get", + }); +} + +// 修改代码生成信息 +export function updateGenTable(data) { + return request({ + url: "/tool/gen", + method: "put", + data: data, + }); +} + +// 导入表 +export function importTable(data) { + return request({ + url: "/tool/gen/importTable", + method: "post", + params: data, + }); +} + +// 预览生成代码 +export function previewTable(tableId) { + return request({ + url: "/tool/gen/preview/" + tableId, + method: "get", + }); +} + +// 删除表数据 +export function delTable(tableId) { + return request({ + url: "/tool/gen/" + tableId, + method: "delete", + }); +} + +// 生成代码(自定义路径) +export function genCode(tableName) { + return request({ + url: "/tool/gen/genCode/" + tableName, + method: "get", + }); +} + +// 同步数据库 +export function synchDb(tableName) { + return request({ + url: "/tool/gen/synchDb/" + tableName, + method: "get", + }); +} diff --git a/src/assets/iconfonts/demo.css b/src/assets/iconfonts/demo.css new file mode 100644 index 0000000..840ce0a --- /dev/null +++ b/src/assets/iconfonts/demo.css @@ -0,0 +1,540 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url("https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834"); + src: url("https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix") + format("embedded-opentype"), + url("https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834") + format("woff"), + url("https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834") + format("truetype"), + url("https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont") + format("svg"); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #f7f7f7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/assets/iconfonts/demo_index.html b/src/assets/iconfonts/demo_index.html new file mode 100644 index 0000000..070b86d --- /dev/null +++ b/src/assets/iconfonts/demo_index.html @@ -0,0 +1,293 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + + +

+ +
+
+
    +
  • + +
    weixin_mw
    +
    
    +
  • + +
  • + +
    微信
    +
    
    +
  • + +
  • + +
    QQ
    +
    
    +
  • +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

+ 注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol + 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。) +

+
+

Unicode 使用步骤如下:

+

+ 第一步:拷贝项目下面生成的 @font-face +

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1678843509887') format('woff2'),
+       url('iconfont.woff?t=1678843509887') format('woff'),
+       url('iconfont.ttf?t=1678843509887') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

+ "iconfont" 是你项目下的 + font-family。可以通过编辑项目查看,默认是 "iconfont"。 +

+
+
+
+
+
    +
  • + +
    weixin_mw
    +
    .icon-weixinmw
    +
  • + +
  • + +
    微信
    +
    .icon-weixin
    +
  • + +
  • + +
    QQ
    +
    .icon-QQ
    +
  • +
+
+

font-class 引用

+
+ +

+ font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode + 书写不直观,语意不明确的问题。 +

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • + 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon + 是什么。 +
  • +
  • + 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class + 里面的 Unicode 引用。 +
  • +
+

使用步骤如下:

+

+ 第一步:引入项目下面生成的 fontclass 代码: +

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

+ " iconfont" 是你项目下的 + font-family。可以通过编辑项目查看,默认是 "iconfont"。 +

+
+
+
+
+
    +
  • + +
    weixin_mw
    +
    #icon-weixinmw
    +
  • + +
  • + +
    微信
    +
    #icon-weixin
    +
  • + +
  • + +
    QQ
    +
    #icon-QQ
    +
  • +
+
+

Symbol 引用

+
+ +

+ 这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点: +

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • + 通过一些技巧,支持像字体那样,通过 font-size, + color 来调整样式。 +
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+
+
+ + + diff --git a/src/assets/iconfonts/iconfont.css b/src/assets/iconfonts/iconfont.css new file mode 100644 index 0000000..af38e39 --- /dev/null +++ b/src/assets/iconfonts/iconfont.css @@ -0,0 +1,26 @@ +@font-face { + font-family: "iconfont"; /* Project id 3952978 */ + src: url("iconfont.woff2?t=1678843509887") format("woff2"), + url("iconfont.woff?t=1678843509887") format("woff"), + url("iconfont.ttf?t=1678843509887") format("truetype"); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-weixinmw:before { + content: "\e617"; +} + +.icon-weixin:before { + content: "\e73b"; +} + +.icon-QQ:before { + content: "\e73e"; +} diff --git a/src/assets/iconfonts/iconfont.js b/src/assets/iconfonts/iconfont.js new file mode 100644 index 0000000..871a00e --- /dev/null +++ b/src/assets/iconfonts/iconfont.js @@ -0,0 +1,69 @@ +(window._iconfont_svg_string_3952978 = + ''), + (function (n) { + var t = (t = document.getElementsByTagName("script"))[t.length - 1], + e = t.getAttribute("data-injectcss"), + t = t.getAttribute("data-disable-injectsvg"); + if (!t) { + var i, + o, + l, + a, + c, + d = function (t, e) { + e.parentNode.insertBefore(t, e); + }; + if (e && !n.__iconfont__svg__cssinject__) { + n.__iconfont__svg__cssinject__ = !0; + try { + document.write( + "" + ); + } catch (t) { + console && console.log(t); + } + } + (i = function () { + var t, + e = document.createElement("div"); + (e.innerHTML = n._iconfont_svg_string_3952978), + (e = e.getElementsByTagName("svg")[0]) && + (e.setAttribute("aria-hidden", "true"), + (e.style.position = "absolute"), + (e.style.width = 0), + (e.style.height = 0), + (e.style.overflow = "hidden"), + (e = e), + (t = document.body).firstChild + ? d(e, t.firstChild) + : t.appendChild(e)); + }), + document.addEventListener + ? ~["complete", "loaded", "interactive"].indexOf(document.readyState) + ? setTimeout(i, 0) + : ((o = function () { + document.removeEventListener("DOMContentLoaded", o, !1), i(); + }), + document.addEventListener("DOMContentLoaded", o, !1)) + : document.attachEvent && + ((l = i), + (a = n.document), + (c = !1), + h(), + (a.onreadystatechange = function () { + "complete" == a.readyState && + ((a.onreadystatechange = null), s()); + })); + } + function s() { + c || ((c = !0), l()); + } + function h() { + try { + a.documentElement.doScroll("left"); + } catch (t) { + return void setTimeout(h, 50); + } + s(); + } + })(window); diff --git a/src/assets/iconfonts/iconfont.json b/src/assets/iconfonts/iconfont.json new file mode 100644 index 0000000..5c89257 --- /dev/null +++ b/src/assets/iconfonts/iconfont.json @@ -0,0 +1,30 @@ +{ + "id": "3952978", + "name": "muyuan", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "310286", + "name": "weixin_mw", + "font_class": "weixinmw", + "unicode": "e617", + "unicode_decimal": 58903 + }, + { + "icon_id": "1330569", + "name": "微信", + "font_class": "weixin", + "unicode": "e73b", + "unicode_decimal": 59195 + }, + { + "icon_id": "1330577", + "name": "QQ", + "font_class": "QQ", + "unicode": "e73e", + "unicode_decimal": 59198 + } + ] +} diff --git a/src/assets/iconfonts/iconfont.ttf b/src/assets/iconfonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f1983a04e40f55ca3fe891277f0e46a4da2b34f GIT binary patch literal 2552 zcmd^B&2JM&6o0e3-i_DJ+OgNW#)%W#Y1SqL$99ZE5^y021o}Y(n6wgs)Hwc1{Sh4V zRjI~2U2@E3IKnf<-r zy!U42w{O=50suB>0SmFI!$-ygAN9QrK(-^BdF}9EV#mNs655y0elu6iE`I%U@OQNT z!Tw3Ha;~uD>c}Pl_H*nvO8M-3@A4miqVGNIsS*;xJ@z8v@36m6sy5F$5n$}!I5;cy zT$X8(X^j0CZLyj?yGS;{d7Ss69jIlidFN+4z621^hbb=BmzrPsZaJyH* zg3Eot{D9mQ<4XR51i?rKEG)9mXw!u~^Kk3Fx{}uQ0QL^F(2ee4y)ksb|8_KSExhvp z1I837nK37jrO^X;#Zx2CK??0QLm^ygY$d&lTC5|SHO@nQC}L=4LeKVpZ+2aPq$vZc za$hw%)p%vh=(NUG(ni4rGmOJgsG+vKhKwOz z?UlPpB2AJ}g3_R+%d7JWO3bs**H>3}o35WOZQRh7O8Z#YZd6;~Nj4;Rx!qmz&5+gU za#*bnm(%)|D!C>6E~~27t6nS3&0eN@UY?!%X&v5DHrrqJ%#7wnlgD1P@=_ub7l`H@ z+u})NVzEpjmKjpqWL1*oPFc2FomMmdHIb&4Y*KrBrzA19jd_hF9)8%y_U#&*!K{%z z{Umx|Q1-r>3flUoGW+`b_w|Q@-L!H|ExqtMt;*-ro153Lq`DcstioDIFzX8|QVUB2 zYjQY+D2XH046D&ku#O*+2>#2H`#>F4mWF;oa%(1aj-Vo7gl@htlZ(Xi9Vj= z2p4Av%h|${hbAJTg(XZJIkxqjBcE?`DgItg@yUE!C&$@%QIdTM7wl17ZM-5TQ=DkG zJ49yd{>bKiTN%+|w~O3JT*Rjun+xumZ&ARf73I)b`lffAn87Ey)5I+DAro_m`%P@Y z3Qd@pM}DV?Mc4v+Ol-r9i}X#+S#b>w-ZL=)CwyUI1|;~##4PgPo0voVn~5!;z>0}^ z`iF1K+u3jtDYt6Omp?vXFCEHjt*RC`9#!|Un3&f+b zHEJqf%Qx22ES)YUn$1F>(5P1fdof?WQmF?P8})^Jt{E*gn~S4^gLECrM|1TmOyG+z z4_Rp9I1d3h0q1ZmLk{Zr*cSA$`ILPKy^C-PDj3;#YIbAv40<>4$G@y+3qTyA_*1{p zYYM$;y648-EWv49ErEM%;*J8?8pmTT+5`4(@?@P#KvXv zaeR!CuQHJxNr;n4QBtX)B$ctOMA&q7n6$@vru}Pw*LAB+v~2LY)l0Khd`RTIru)HtA<7@;vb6%ps(f%(ESbI@=URkCeS83#Ri;v)f54tO#8Ir(f9O9lCkcIDf* z+B=ETaDBK3&8g8OT4ee;4X|ae77M7)Vi+ox%OA+)!~Oisw6rQyH~U+Ww(Kd8V<)q- zN41dXCQG8WBzs>Qhqp2=m&?y&AuK!FY74doh+z_M2*mUG&FfNaiJF66F8b9`1aFV@ zLae?-d|p2$>u0)PjPZc}{QsxkO^WJbUv= zu_b5jK_AT*rPB7ZA9_&mdQUIjzMG*M1=%0ckuJ?HBBfiPT_V7}(NS8Ox#ybC7lc(h zt187|-_ek`4@gCg6Ah;qE~j$Sm@_zFa*%6XpT&!1ar8aq)dtBSdA05YN^$ymeC~#r zVfSB&PDT!ry@a~VxsD_B#SsnXi47(uFEb|er!j(2g&nabtng4dD`ckrlC+PYYAm^A z&^8}$Bl0!UQ5DnfdezzenlyKyX|eOb+<%51EmXZ-eS@9)XjGN7rMaTw@pSU??v9AMZ#NCi|N64{`dX}iTe8evSJ}%cfc`|_S|7o?=(8K zp66iBIcmK0Of-3kK9Fhr?{VAL3RV2w5W9ZgAD3_56Ae!C7VqsmdwKGu`{~%}-h=HY z!upb)NWGur4!&tl_pMV9wpD!FsucRN%E&%>1Hr1T-iB8jKF@GNN3=eTzd|I*IaSRa zqdO(D`z&rR&6;~TUoje19FFP;2xU45Hi@slx$p(VAZT+FC=h|n&0Wj1TI@YoW}UOcGmc@Mvn_~!p_)zidqlnD9b&ZJ$KDWQ z_nL-D$cFAihRsIz~j zxh_m?9ED{FVwQ-$QIhPh8sR}4Ryu=!v&-i?h8duydD>_u<~}kW}$_5?T+Xm zOACYkFNG|r|HaD}wOghS+!zV9VGTR@l`V;@_}mbOvk_2u*EoG7NlI^{@D%n<+X}f! ziLdMloDJ)7Rvl~4)c&F~B3;w{-u6S2u$-GXA)l2F#qS)G267emYZnB0pV$3)dcVwLU1G!Ji~5IUt)zd-_{_PsG0}`G*MNvtZ5MLH z?pUVDq%NI!*u#?_r7Bs_+I8+|^jd=7%#Hg})00A`2LJI7W;Yc*iFNc-VnE3apLQ%G; fR3sD?rPVm@Y}sUQ(II@Dt$wZgatt literal 0 HcmV?d00001 diff --git a/src/assets/iconfonts/iconfont.woff2 b/src/assets/iconfonts/iconfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7ae0cb3e90969b1975f6fd5a7f94e953253b7e4c GIT binary patch literal 1280 zcmV+b1^@bYPew8T0RR9100jU53jhEB015a200goC0RR9100000000000000000000 z0000SR0d!GgB%KnEQUV;HUcCA5DN+b1Rw>3X9qwVzX(xOPKsnd2i%X-x~jDy~&1 ziH4+~a`%W*4uxI=1Q3`V$}9D{$-;AD=0pcal}K8LrIl>qm!JCMe#KkkYais<0zg!8 zMA71MTeJp6mBmGZ-T2Lc&<$gk7kLW;xGC01HC^1j#VV7mtH%ZmdZs|+E0YpsV>wQO zslW?PzP;&2gB)T5wXd$gf%p6JqckTdY#RNT_Me5=|2zC>)N2+4`iYZ)04FQJ252CE zVKN!5*7QpTtbC8-E^TOkyYQ5+B^}h>2;{`0GZ0+;t5+t%G$;zfH`(n7+o-CqNOJfZ9ItPB5_!Ur&AVy$@QRYM25_%l zvF5g_qoHw^Wf$O7b={sHk#XH&E&Na)7Xxy+}DNg-oJjGWfkB;*KjT? zaHbA>Hf%hIjuejGXIrxY?yOs5W8qpj35gsJtF5aojODrC>UDJtX0#bGLkx_TK`VRmKFtoVBJ+-Ggx`1I_7Ods*{)*fqd zRoI=ci{|`s$vN#4Orrai`Pt)>^}Z=lkJdUc|Ngo-&j61A&$zRgzl;3e^i4KN-%S4{ zc?$#|!i+-&0CmH&JZ6t<0sS;0a8bkwL_b4B)VL@TIE|haJloaDw#6q(1FITR8)H-I zI-^tLNtBttv|7jfH6pqq%F-89{%6~lHQ^8vRahTYgha8?R<9L>`d3FdK$4l}=MFGU z?C#+m&Osq3m47hrfmt7LAYna%zfXopsz}cMtzO<#QIRjRg}J3_W%i&<+%^t#8Dmo?#PSYLCSYvMxoPHgr)k?I>S*_|WMK-OFHRybJi*YQ zgO*C7Fd5YkN)#$?fV$-9jiN3jc!7_aTSP_z3^Q+o2DEfjA=NM&z-;k28REIdMmrcy q3q>f_a8u5BdY*QBivTzJMMjipF=E5Hf>J2yT9ENgiH_%33;+OCR7{%y literal 0 HcmV?d00001 diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss index 46a41f3..c13df57 100644 --- a/src/assets/styles/btn.scss +++ b/src/assets/styles/btn.scss @@ -1,99 +1,99 @@ -@import './variables.module.scss'; - -@mixin colorBtn($color) { - background: $color; - - &:hover { - color: $color; - - &:before, - &:after { - background: $color; - } - } -} - -.blue-btn { - @include colorBtn($blue) -} - -.light-blue-btn { - @include colorBtn($light-blue) -} - -.red-btn { - @include colorBtn($red) -} - -.pink-btn { - @include colorBtn($pink) -} - -.green-btn { - @include colorBtn($green) -} - -.tiffany-btn { - @include colorBtn($tiffany) -} - -.yellow-btn { - @include colorBtn($yellow) -} - -.pan-btn { - font-size: 14px; - color: #fff; - padding: 14px 36px; - border-radius: 8px; - border: none; - outline: none; - transition: 600ms ease all; - position: relative; - display: inline-block; - - &:hover { - background: #fff; - - &:before, - &:after { - width: 100%; - transition: 600ms ease all; - } - } - - &:before, - &:after { - content: ''; - position: absolute; - top: 0; - right: 0; - height: 2px; - width: 0; - transition: 400ms ease all; - } - - &::after { - right: inherit; - top: inherit; - left: 0; - bottom: 0; - } -} - -.custom-button { - display: inline-block; - line-height: 1; - white-space: nowrap; - cursor: pointer; - background: #fff; - color: #fff; - -webkit-appearance: none; - text-align: center; - box-sizing: border-box; - outline: 0; - margin: 0; - padding: 10px 15px; - font-size: 14px; - border-radius: 4px; -} +@import "./variables.module.scss"; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue); +} + +.light-blue-btn { + @include colorBtn($light-blue); +} + +.red-btn { + @include colorBtn($red); +} + +.pink-btn { + @include colorBtn($pink); +} + +.green-btn { + @include colorBtn($green); +} + +.tiffany-btn { + @include colorBtn($tiffany); +} + +.yellow-btn { + @include colorBtn($yellow); +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ""; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss index bb5414d..63c04e7 100644 --- a/src/assets/styles/element-ui.scss +++ b/src/assets/styles/element-ui.scss @@ -1,96 +1,96 @@ -// cover some element-ui styles - -.el-breadcrumb__inner, -.el-breadcrumb__inner a { - font-weight: 400 !important; -} - -.el-upload { - input[type="file"] { - display: none !important; - } -} - -.el-upload__input { - display: none; -} - -.cell { - .el-tag { - margin-right: 0px; - } -} - -.small-padding { - .cell { - padding-left: 5px; - padding-right: 5px; - } -} - -.fixed-width { - .el-button--mini { - padding: 7px 10px; - width: 60px; - } -} - -.status-col { - .cell { - padding: 0 10px; - text-align: center; - - .el-tag { - margin-right: 0px; - } - } -} - -// to fixed https://github.com/ElemeFE/element/issues/2461 -.el-dialog { - transform: none; - left: 0; - position: relative; - margin: 0 auto; -} - -// refine element ui upload -.upload-container { - .el-upload { - width: 100%; - - .el-upload-dragger { - width: 100%; - height: 200px; - } - } -} - -// dropdown -.el-dropdown-menu { - a { - display: block - } -} - -// fix date-picker ui bug in filter-item -.el-range-editor.el-input__inner { - display: inline-flex !important; -} - -// to fix el-date-picker css style -.el-range-separator { - box-sizing: content-box; -} - -.el-menu--collapse - > div - > .el-submenu - > .el-submenu__title - .el-submenu__icon-arrow { - display: none; -} - -.el-dropdown .el-dropdown-link{ - color: var(--el-color-primary) !important; -} \ No newline at end of file +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0px; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0px; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block; + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} + +.el-menu--collapse + > div + > .el-submenu + > .el-submenu__title + .el-submenu__icon-arrow { + display: none; +} + +.el-dropdown .el-dropdown-link { + color: var(--el-color-primary) !important; +} diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index 4f3a36f..1193f31 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -1,193 +1,201 @@ -@import './variables.module.scss'; -@import './mixin.scss'; -@import './transition.scss'; -@import './element-ui.scss'; -@import './sidebar.scss'; -@import './btn.scss'; -@import './ruoyi.scss'; - -body { - height: 100%; - margin: 0; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; -} - -label { - font-weight: 700; -} - -html { - height: 100%; - box-sizing: border-box; -} - -#app { - height: 100%; -} - -*, -*:before, -*:after { - box-sizing: inherit; -} - -.no-padding { - padding: 0px !important; -} - -.padding-content { - padding: 4px 0; -} - -a:focus, -a:active { - outline: none; -} - -a, -a:focus, -a:hover { - cursor: pointer; - color: inherit; - text-decoration: none; -} - -div:focus { - outline: none; -} - -.fr { - float: right; -} - -.fl { - float: left; -} - -.pr-5 { - padding-right: 5px; -} - -.pl-5 { - padding-left: 5px; -} - -.block { - display: block; -} - -.pointer { - cursor: pointer; -} - -.inlineBlock { - display: block; -} - -.clearfix { - &:after { - visibility: hidden; - display: block; - font-size: 0; - content: " "; - clear: both; - height: 0; - } -} - -aside { - background: #eef1f6; - padding: 8px 24px; - margin-bottom: 20px; - border-radius: 2px; - display: block; - line-height: 32px; - font-size: 16px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; - color: #2c3e50; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - a { - color: #337ab7; - cursor: pointer; - - &:hover { - color: rgb(32, 160, 255); - } - } -} - -//main-container全局样式 -.app-container { - padding: 20px; -} - -.components-container { - margin: 30px 50px; - position: relative; -} - -.pagination-container { - margin-top: 30px; -} - -.text-center { - text-align: center -} - -.sub-navbar { - height: 50px; - line-height: 50px; - position: relative; - width: 100%; - text-align: right; - padding-right: 20px; - transition: 600ms ease position; - background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%); - - .subtitle { - font-size: 20px; - color: #fff; - } - - &.draft { - background: #d0d0d0; - } - - &.deleted { - background: #d0d0d0; - } -} - -.link-type, -.link-type:focus { - color: #337ab7; - cursor: pointer; - - &:hover { - color: rgb(32, 160, 255); - } -} - -.filter-container { - padding-bottom: 10px; - - .filter-item { - display: inline-block; - vertical-align: middle; - margin-bottom: 10px; - } -} - -//refine vue-multiselect plugin -.multiselect { - line-height: 16px; -} - -.multiselect--active { - z-index: 1000 !important; -} +@import "./variables.module.scss"; +@import "./mixin.scss"; +@import "./transition.scss"; +@import "./element-ui.scss"; +@import "./sidebar.scss"; +@import "./btn.scss"; +@import "./ruoyi.scss"; + +body { + height: 100%; + margin: 0; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, + Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0px !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 30px; +} + +.text-center { + text-align: center; +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient( + 90deg, + rgba(32, 182, 249, 1) 0%, + rgba(32, 182, 249, 1) 0%, + rgba(33, 120, 241, 1) 100%, + rgba(33, 120, 241, 1) 100% + ); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +.filter-container { + padding-bottom: 10px; + + .filter-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + } +} + +//refine vue-multiselect plugin +.multiselect { + line-height: 16px; +} + +.multiselect--active { + z-index: 1000 !important; +} diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss index 64d9cf6..9172448 100644 --- a/src/assets/styles/mixin.scss +++ b/src/assets/styles/mixin.scss @@ -1,66 +1,60 @@ -@mixin clearfix { - &:after { - content: ""; - display: table; - clear: both; - } -} - -@mixin scrollBar { - &::-webkit-scrollbar-track-piece { - background: #d3dce6; - } - - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-thumb { - background: #99a9bf; - border-radius: 20px; - } -} - -@mixin relative { - position: relative; - width: 100%; - height: 100%; -} - -@mixin pct($pct) { - width: #{$pct}; - position: relative; - margin: 0 auto; -} - -@mixin triangle($width, $height, $color, $direction) { - $width: $width/2; - $color-border-style: $height solid $color; - $transparent-border-style: $width solid transparent; - height: 0; - width: 0; - - @if $direction==up { - border-bottom: $color-border-style; - border-left: $transparent-border-style; - border-right: $transparent-border-style; - } - - @else if $direction==right { - border-left: $color-border-style; - border-top: $transparent-border-style; - border-bottom: $transparent-border-style; - } - - @else if $direction==down { - border-top: $color-border-style; - border-left: $transparent-border-style; - border-right: $transparent-border-style; - } - - @else if $direction==left { - border-right: $color-border-style; - border-top: $transparent-border-style; - border-bottom: $transparent-border-style; - } -} +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index a7d3ec9..914f886 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -1,277 +1,290 @@ - /** - * 通用css样式布局处理 - * Copyright (c) 2019 ruoyi - */ - - /** 基础通用 **/ -.pt5 { - padding-top: 5px; -} -.pr5 { - padding-right: 5px; -} -.pb5 { - padding-bottom: 5px; -} -.mt5 { - margin-top: 5px; -} -.mr5 { - margin-right: 5px; -} -.mb5 { - margin-bottom: 5px; -} -.mb8 { - margin-bottom: 8px; -} -.ml5 { - margin-left: 5px; -} -.mt10 { - margin-top: 10px; -} -.mr10 { - margin-right: 10px; -} -.mb10 { - margin-bottom: 10px; -} -.ml10 { - margin-left: 10px; -} -.mt20 { - margin-top: 20px; -} -.mr20 { - margin-right: 20px; -} -.mb20 { - margin-bottom: 20px; -} -.ml20 { - margin-left: 20px; -} - -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} - -.el-form .el-form-item__label { - font-weight: 700; -} -.el-dialog:not(.is-fullscreen) { - margin-top: 6vh !important; -} - -.el-dialog.scrollbar .el-dialog__body { - overflow: auto; - overflow-x: hidden; - max-height: 70vh; - padding: 10px 20px 0; -} - -.el-table { - .el-table__header-wrapper, .el-table__fixed-header-wrapper { - th { - word-break: break-word; - background-color: #f8f8f9 !important; - color: #515a6e; - height: 40px !important; - font-size: 13px; - } - } - .el-table__body-wrapper { - .el-button [class*="el-icon-"] + span { - margin-left: 1px; - } - } -} - -/** 表单布局 **/ -.form-header { - font-size:15px; - color:#6379bb; - border-bottom:1px solid #ddd; - margin:8px 10px 25px 10px; - padding-bottom:5px -} - -/** 表格布局 **/ -.pagination-container { - // position: relative; - height: 25px; - margin-bottom: 10px; - margin-top: 15px; - padding: 10px 20px !important; -} - -/* tree border */ -.tree-border { - margin-top: 5px; - border: 1px solid #e5e6e7; - background: #FFFFFF none; - border-radius:4px; - width: 100%; -} - -.pagination-container .el-pagination { - right: 0; - position: absolute; -} - -@media ( max-width : 768px) { - .pagination-container .el-pagination > .el-pagination__jump { - display: none !important; - } - .pagination-container .el-pagination > .el-pagination__sizes { - display: none !important; - } -} - -.el-table .fixed-width .el-button--small { - padding-left: 0; - padding-right: 0; - width: inherit; -} - -/** 表格更多操作下拉样式 */ -.el-table .el-dropdown-link { - cursor: pointer; - color: #409EFF; - margin-left: 10px; -} - -.el-table .el-dropdown, .el-icon-arrow-down { - font-size: 12px; -} - -.el-tree-node__content > .el-checkbox { - margin-right: 8px; -} - -.list-group-striped > .list-group-item { - border-left: 0; - border-right: 0; - border-radius: 0; - padding-left: 0; - padding-right: 0; -} - -.list-group { - padding-left: 0px; - list-style: none; -} - -.list-group-item { - border-bottom: 1px solid #e7eaec; - border-top: 1px solid #e7eaec; - margin-bottom: -1px; - padding: 11px 0px; - font-size: 13px; -} - -.pull-right { - float: right !important; -} - -.el-card__header { - padding: 14px 15px 7px !important; - min-height: 40px; -} - -.el-card__body { - padding: 15px 20px 20px 20px !important; -} - -.card-box { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 10px; -} - -/* button color */ -.el-button--cyan.is-active, -.el-button--cyan:active { - background: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; -} - -.el-button--cyan:focus, -.el-button--cyan:hover { - background: #48D1CC; - border-color: #48D1CC; - color: #FFFFFF; -} - -.el-button--cyan { - background-color: #20B2AA; - border-color: #20B2AA; - color: #FFFFFF; -} - -/* text color */ -.text-navy { - color: #1ab394; -} - -.text-primary { - color: inherit; -} - -.text-success { - color: #1c84c6; -} - -.text-info { - color: #23c6c8; -} - -.text-warning { - color: #f8ac59; -} - -.text-danger { - color: #ed5565; -} - -.text-muted { - color: #888888; -} - -/* image */ -.img-circle { - border-radius: 50%; -} - -.img-lg { - width: 120px; - height: 120px; -} - -.avatar-upload-preview { - position: absolute; - top: 50%; - transform: translate(50%, -50%); - width: 200px; - height: 200px; - border-radius: 50%; - box-shadow: 0 0 4px #ccc; - overflow: hidden; -} - -/* 拖拽列样式 */ -.sortable-ghost{ - opacity: .8; - color: #fff!important; - background: #42b983!important; -} - -/* 表格右侧工具栏样式 */ -.top-right-btn { - margin-left: auto; -} +/** + * 通用css样式布局处理 + * Copyright (c) 2019 ruoyi + */ + +/** 基础通用 **/ +.pt5 { + padding-top: 5px; +} +.pr5 { + padding-right: 5px; +} +.pb5 { + padding-bottom: 5px; +} +.mt5 { + margin-top: 5px; +} +.mr5 { + margin-right: 5px; +} +.mb5 { + margin-bottom: 5px; +} +.mb8 { + margin-bottom: 8px; +} +.ml5 { + margin-left: 5px; +} +.mt10 { + margin-top: 10px; +} +.mr10 { + margin-right: 10px; +} +.mb10 { + margin-bottom: 10px; +} +.ml10 { + margin-left: 10px; +} +.mt20 { + margin-top: 20px; +} +.mr20 { + margin-right: 20px; +} +.mb20 { + margin-bottom: 20px; +} +.ml20 { + margin-left: 20px; +} + +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} + +.el-form .el-form-item__label { + font-weight: 700; +} +.el-dialog:not(.is-fullscreen) { + margin-top: 6vh !important; +} + +.el-dialog.scrollbar .el-dialog__body { + overflow: auto; + overflow-x: hidden; + max-height: 70vh; + padding: 10px 20px 0; +} + +.el-table { + .el-table__header-wrapper, + .el-table__fixed-header-wrapper { + th { + word-break: break-word; + background-color: #f8f8f9 !important; + color: #515a6e; + height: 40px !important; + font-size: 13px; + } + } + .el-table__body-wrapper { + .el-button [class*="el-icon-"] + span { + margin-left: 1px; + } + } +} + +/** 表单布局 **/ +.form-header { + font-size: 15px; + color: #6379bb; + border-bottom: 1px solid #ddd; + margin: 8px 10px 25px 10px; + padding-bottom: 5px; +} + +/** 表格布局 **/ +.pagination-container { + // position: relative; + height: 25px; + margin-bottom: 10px; + margin-top: 15px; + padding: 10px 20px !important; +} + +/* tree border */ +.tree-border { + margin-top: 5px; + border: 1px solid #e5e6e7; + background: #ffffff none; + border-radius: 4px; + width: 100%; +} + +.pagination-container .el-pagination { + right: 0; + position: absolute; +} + +@media (max-width: 768px) { + .pagination-container .el-pagination > .el-pagination__jump { + display: none !important; + } + .pagination-container .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-table .fixed-width .el-button--small { + padding-left: 0; + padding-right: 0; + width: inherit; +} + +/** 表格更多操作下拉样式 */ +.el-table .el-dropdown-link { + cursor: pointer; + color: #409eff; + margin-left: 10px; +} + +.el-table .el-dropdown, +.el-icon-arrow-down { + font-size: 12px; +} + +.el-tree-node__content > .el-checkbox { + margin-right: 8px; +} + +.list-group-striped > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} + +.list-group { + padding-left: 0px; + list-style: none; +} + +.list-group-item { + border-bottom: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + margin-bottom: -1px; + padding: 11px 0px; + font-size: 13px; +} + +.pull-right { + float: right !important; +} + +.el-card__header { + padding: 14px 15px 7px !important; + min-height: 40px; +} + +.el-card__body { + padding: 15px 20px 20px 20px !important; +} + +.card-box { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 10px; +} + +/* button color */ +.el-button--cyan.is-active, +.el-button--cyan:active { + background: #20b2aa; + border-color: #20b2aa; + color: #ffffff; +} + +.el-button--cyan:focus, +.el-button--cyan:hover { + background: #48d1cc; + border-color: #48d1cc; + color: #ffffff; +} + +.el-button--cyan { + background-color: #20b2aa; + border-color: #20b2aa; + color: #ffffff; +} + +/* text color */ +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +/* image */ +.img-circle { + border-radius: 50%; +} + +.img-lg { + width: 120px; + height: 120px; +} + +.avatar-upload-preview { + position: absolute; + top: 50%; + transform: translate(50%, -50%); + width: 200px; + height: 200px; + border-radius: 50%; + box-shadow: 0 0 4px #ccc; + overflow: hidden; +} + +/* 拖拽列样式 */ +.sortable-ghost { + opacity: 0.8; + color: #fff !important; + background: #42b983 !important; +} + +/* 表格右侧工具栏样式 */ +.top-right-btn { + margin-left: auto; +} diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index 88be1a9..aeefcc9 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -1,238 +1,237 @@ -#app { - - .main-container { - min-height: 100%; - transition: margin-left .28s; - margin-left: $base-sidebar-width; - position: relative; - } - - .sidebarHide { - margin-left: 0!important; - } - - .sidebar-container { - -webkit-transition: width .28s; - transition: width 0.28s; - width: $base-sidebar-width !important; - background-color: $base-menu-background; - height: 100%; - position: fixed; - font-size: 0px; - top: 0; - bottom: 0; - left: 0; - z-index: 1001; - overflow: hidden; - -webkit-box-shadow: 2px 0 6px rgba(0,21,41,.35); - box-shadow: 2px 0 6px rgba(0,21,41,.35); - - // reset element-ui css - .horizontal-collapse-transition { - transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; - } - - .scrollbar-wrapper { - overflow-x: hidden !important; - } - - .el-scrollbar__bar.is-vertical { - right: 0px; - } - - .el-scrollbar { - height: 100%; - } - - &.has-logo { - .el-scrollbar { - height: calc(100% - 50px); - } - } - - .is-horizontal { - display: none; - } - - a { - display: inline-block; - width: 100%; - overflow: hidden; - } - - .svg-icon { - margin-right: 16px; - } - - .el-menu { - border: none; - height: 100%; - width: 100% !important; - } - - .el-menu-item, .menu-title { - overflow: hidden !important; - text-overflow: ellipsis !important; - white-space: nowrap !important; - } - - .el-menu-item .el-menu-tooltip__trigger { - display: inline-block !important; - } - - // menu hover - .sub-menu-title-noDropdown, - .el-sub-menu__title { - &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - & .theme-dark .is-active > .el-sub-menu__title { - color: $base-menu-color-active !important; - } - - & .nest-menu .el-sub-menu>.el-sub-menu__title, - & .el-sub-menu .el-menu-item { - min-width: $base-sidebar-width !important; - - &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - & .theme-dark .nest-menu .el-sub-menu>.el-sub-menu__title, - & .theme-dark .el-sub-menu .el-menu-item { - background-color: $base-sub-menu-background !important; - - &:hover { - background-color: $base-sub-menu-hover !important; - } - } - } - - .hideSidebar { - .sidebar-container { - width: 54px !important; - } - - .main-container { - margin-left: 54px; - } - - .sub-menu-title-noDropdown { - padding: 0 !important; - position: relative; - - .el-tooltip { - padding: 0 !important; - - .svg-icon { - margin-left: 20px; - } - } - } - - .el-sub-menu { - overflow: hidden; - - &>.el-sub-menu__title { - padding: 0 !important; - - .svg-icon { - margin-left: 20px; - } - - } - } - - .el-menu--collapse { - .el-sub-menu { - &>.el-sub-menu__title { - &>span { - height: 0; - width: 0; - overflow: hidden; - visibility: hidden; - display: inline-block; - } - &>i { - height: 0; - width: 0; - overflow: hidden; - visibility: hidden; - display: inline-block; - } - } - } - } - } - - .el-menu--collapse .el-menu .el-sub-menu { - min-width: $base-sidebar-width !important; - } - - // mobile responsive - .mobile { - .main-container { - margin-left: 0px; - } - - .sidebar-container { - transition: transform .28s; - width: $base-sidebar-width !important; - } - - &.hideSidebar { - .sidebar-container { - pointer-events: none; - transition-duration: 0.3s; - transform: translate3d(-$base-sidebar-width, 0, 0); - } - } - } - - .withoutAnimation { - - .main-container, - .sidebar-container { - transition: none; - } - } -} - -// when menu collapsed -.el-menu--vertical { - &>.el-menu { - .svg-icon { - margin-right: 16px; - } - } - - .nest-menu .el-sub-menu>.el-sub-menu__title, - .el-menu-item { - &:hover { - // you can use $sub-menuHover - background-color: rgba(0, 0, 0, 0.06) !important; - } - } - - // the scroll bar appears when the sub-menu is too long - >.el-menu--popup { - max-height: 100vh; - overflow-y: auto; - - &::-webkit-scrollbar-track-piece { - background: #d3dce6; - } - - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-thumb { - background: #99a9bf; - border-radius: 20px; - } - } -} +#app { + .main-container { + min-height: 100%; + transition: margin-left 0.28s; + margin-left: $base-sidebar-width; + position: relative; + } + + .sidebarHide { + margin-left: 0 !important; + } + + .sidebar-container { + -webkit-transition: width 0.28s; + transition: width 0.28s; + width: $base-sidebar-width !important; + background-color: $base-menu-background; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + -webkit-box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, + 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + .el-menu-item, + .menu-title { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; + } + + .el-menu-item .el-menu-tooltip__trigger { + display: inline-block !important; + } + + // menu hover + .sub-menu-title-noDropdown, + .el-sub-menu__title { + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .is-active > .el-sub-menu__title { + color: $base-menu-color-active !important; + } + + & .nest-menu .el-sub-menu > .el-sub-menu__title, + & .el-sub-menu .el-menu-item { + min-width: $base-sidebar-width !important; + + &:hover { + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title, + & .theme-dark .el-sub-menu .el-menu-item { + background-color: $base-sub-menu-background !important; + + &:hover { + background-color: $base-sub-menu-hover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .sub-menu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-sub-menu { + overflow: hidden; + + & > .el-sub-menu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-menu--collapse { + .el-sub-menu { + & > .el-sub-menu__title { + & > span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + & > i { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-sub-menu { + min-width: $base-sidebar-width !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform 0.28s; + width: $base-sidebar-width !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$base-sidebar-width, 0, 0); + } + } + } + + .withoutAnimation { + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + & > .el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-sub-menu > .el-sub-menu__title, + .el-menu-item { + &:hover { + // you can use $sub-menuHover + background-color: rgba(0, 0, 0, 0.06) !important; + } + } + + // the scroll bar appears when the sub-menu is too long + > .el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss index a712937..5fc9592 100644 --- a/src/assets/styles/transition.scss +++ b/src/assets/styles/transition.scss @@ -1,53 +1,53 @@ -// global transition css - -/* fade */ -.fade-enter-active, -.fade-leave-active { - transition: opacity 0.28s; -} - -.fade-enter, -.fade-leave-active { - opacity: 0; -} - -/* fade-transform */ -.fade-transform--move, -.fade-transform-leave-active, -.fade-transform-enter-active { - transition: all .5s; -} - -.fade-transform-leave-active { - position: absolute; -} - -.fade-transform-enter { - opacity: 0; - transform: translateX(-30px); -} - -.fade-transform-leave-to { - opacity: 0; - transform: translateX(30px); -} - -/* breadcrumb transition */ -.breadcrumb-enter-active, -.breadcrumb-leave-active { - transition: all .5s; -} - -.breadcrumb-enter, -.breadcrumb-leave-active { - opacity: 0; - transform: translateX(20px); -} - -.breadcrumb-move { - transition: all .5s; -} - -.breadcrumb-leave-active { - position: absolute; -} +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform--move, +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all 0.5s; +} + +.fade-transform-leave-active { + position: absolute; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all 0.5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all 0.5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss index e065775..639b23b 100644 --- a/src/assets/styles/variables.module.scss +++ b/src/assets/styles/variables.module.scss @@ -1,65 +1,65 @@ -// base color -$blue: #324157; -$light-blue: #3A71A8; -$red: #C03639; -$pink: #E65D6E; -$green: #30B08F; -$tiffany: #4AB7BD; -$yellow: #FEC171; -$panGreen: #30B08F; - -// 默认菜单主题风格 -$base-menu-color: #bfcbd9; -$base-menu-color-active: #f4f4f5; -$base-menu-background: #304156; -$base-logo-title-color: #ffffff; - -$base-menu-light-color: rgba(0, 0, 0, 0.7); -$base-menu-light-background: #ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background: #1f2d3d; -$base-sub-menu-hover: #001528; - -// 自定义暗色菜单风格 -/** -$base-menu-color:hsla(0,0%,100%,.65); -$base-menu-color-active:#fff; -$base-menu-background:#001529; -$base-logo-title-color: #ffffff; - -$base-menu-light-color:rgba(0,0,0,.70); -$base-menu-light-background:#ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background:#000c17; -$base-sub-menu-hover:#001528; -*/ - -$--color-primary: #409EFF; -$--color-success: #67C23A; -$--color-warning: #E6A23C; -$--color-danger: #F56C6C; -$--color-info: #909399; - -$base-sidebar-width: 200px; - -// the :export directive is the magic sauce for webpack -// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass -:export { - menuColor: $base-menu-color; - menuLightColor: $base-menu-light-color; - menuColorActive: $base-menu-color-active; - menuBackground: $base-menu-background; - menuLightBackground: $base-menu-light-background; - subMenuBackground: $base-sub-menu-background; - subMenuHover: $base-sub-menu-hover; - sideBarWidth: $base-sidebar-width; - logoTitleColor: $base-logo-title-color; - logoLightTitleColor: $base-logo-light-title-color; - primaryColor: $--color-primary; - successColor: $--color-success; - dangerColor: $--color-danger; - infoColor: $--color-info; - warningColor: $--color-warning; -} +// base color +$blue: #324157; +$light-blue: #3a71a8; +$red: #c03639; +$pink: #e65d6e; +$green: #30b08f; +$tiffany: #4ab7bd; +$yellow: #fec171; +$panGreen: #30b08f; + +// 默认菜单主题风格 +$base-menu-color: #bfcbd9; +$base-menu-color-active: #f4f4f5; +$base-menu-background: #304156; +$base-logo-title-color: #ffffff; + +$base-menu-light-color: rgba(0, 0, 0, 0.7); +$base-menu-light-background: #ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background: #1f2d3d; +$base-sub-menu-hover: #001528; + +// 自定义暗色菜单风格 +/** +$base-menu-color:hsla(0,0%,100%,.65); +$base-menu-color-active:#fff; +$base-menu-background:#001529; +$base-logo-title-color: #ffffff; + +$base-menu-light-color:rgba(0,0,0,.70); +$base-menu-light-background:#ffffff; +$base-logo-light-title-color: #001529; + +$base-sub-menu-background:#000c17; +$base-sub-menu-hover:#001528; +*/ + +$--color-primary: #409eff; +$--color-success: #67c23a; +$--color-warning: #e6a23c; +$--color-danger: #f56c6c; +$--color-info: #909399; + +$base-sidebar-width: 200px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuColor: $base-menu-color; + menuLightColor: $base-menu-light-color; + menuColorActive: $base-menu-color-active; + menuBackground: $base-menu-background; + menuLightBackground: $base-menu-light-background; + subMenuBackground: $base-sub-menu-background; + subMenuHover: $base-sub-menu-hover; + sideBarWidth: $base-sidebar-width; + logoTitleColor: $base-logo-title-color; + logoLightTitleColor: $base-logo-light-title-color; + primaryColor: $--color-primary; + successColor: $--color-success; + dangerColor: $--color-danger; + infoColor: $--color-info; + warningColor: $--color-warning; +} diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index db66c37..49adcdb 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -1,66 +1,72 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/day.vue b/src/components/Crontab/day.vue index 90e9dab..1544893 100644 --- a/src/components/Crontab/day.vue +++ b/src/components/Crontab/day.vue @@ -1,174 +1,193 @@ - - - - \ No newline at end of file + + + + diff --git a/src/components/Crontab/hour.vue b/src/components/Crontab/hour.vue index f9a6374..595d892 100644 --- a/src/components/Crontab/hour.vue +++ b/src/components/Crontab/hour.vue @@ -1,127 +1,148 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/index.vue b/src/components/Crontab/index.vue index f1d7201..ecef397 100644 --- a/src/components/Crontab/index.vue +++ b/src/components/Crontab/index.vue @@ -1,310 +1,350 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/min.vue b/src/components/Crontab/min.vue index 1879797..a5c6efd 100644 --- a/src/components/Crontab/min.vue +++ b/src/components/Crontab/min.vue @@ -1,126 +1,147 @@ - - - - \ No newline at end of file + + + + diff --git a/src/components/Crontab/month.vue b/src/components/Crontab/month.vue index af9f0da..d66c605 100644 --- a/src/components/Crontab/month.vue +++ b/src/components/Crontab/month.vue @@ -1,141 +1,162 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/result.vue b/src/components/Crontab/result.vue index 271577e..ad4bec3 100644 --- a/src/components/Crontab/result.vue +++ b/src/components/Crontab/result.vue @@ -1,540 +1,591 @@ - - - \ No newline at end of file + + + diff --git a/src/components/Crontab/second.vue b/src/components/Crontab/second.vue index 39d0171..45b30d0 100644 --- a/src/components/Crontab/second.vue +++ b/src/components/Crontab/second.vue @@ -1,128 +1,149 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/week.vue b/src/components/Crontab/week.vue index a346eb7..a9eeae6 100644 --- a/src/components/Crontab/week.vue +++ b/src/components/Crontab/week.vue @@ -1,197 +1,229 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Crontab/year.vue b/src/components/Crontab/year.vue index 43c13e1..139c505 100644 --- a/src/components/Crontab/year.vue +++ b/src/components/Crontab/year.vue @@ -1,149 +1,192 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue index 0f49315..a02568d 100644 --- a/src/components/DictTag/index.vue +++ b/src/components/DictTag/index.vue @@ -1,49 +1,50 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index 2deb0b4..e77672e 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -1,206 +1,232 @@ - - - - - + + + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue index 8b6f7a8..b7add79 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -1,41 +1,43 @@ - - - - - + + + + + diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 7451037..a8dda98 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -1,179 +1,193 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue index 1199456..928ac28 100644 --- a/src/components/IconSelect/index.vue +++ b/src/components/IconSelect/index.vue @@ -1,74 +1,80 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js index 158b536..196e4ed 100644 --- a/src/components/IconSelect/requireIcons.js +++ b/src/components/IconSelect/requireIcons.js @@ -1,8 +1,8 @@ -let icons = [] -const modules = import.meta.glob('./../../assets/icons/svg/*.svg'); -for (const path in modules) { - const p = path.split('assets/icons/svg/')[1].split('.svg')[0]; - icons.push(p); -} - -export default icons \ No newline at end of file +let icons = []; +const modules = import.meta.glob("./../../assets/icons/svg/*.svg"); +for (const path in modules) { + const p = path.split("assets/icons/svg/")[1].split(".svg")[0]; + icons.push(p); +} + +export default icons; diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue index 26380bb..412f2c6 100644 --- a/src/components/ImagePreview/index.vue +++ b/src/components/ImagePreview/index.vue @@ -1,92 +1,92 @@ - - - - - + + + + + diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index 149524b..d1976b8 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -1,213 +1,219 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index f67f5cc..8200733 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -1,105 +1,104 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/ParentView/index.vue b/src/components/ParentView/index.vue index ad6360c..98240ae 100644 --- a/src/components/ParentView/index.vue +++ b/src/components/ParentView/index.vue @@ -1,3 +1,3 @@ - + diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue index 9fd0bb0..74b8724 100644 --- a/src/components/RightToolbar/index.vue +++ b/src/components/RightToolbar/index.vue @@ -1,105 +1,117 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/RuoYi/Doc/index.vue b/src/components/RuoYi/Doc/index.vue index ace6d47..89aeae6 100644 --- a/src/components/RuoYi/Doc/index.vue +++ b/src/components/RuoYi/Doc/index.vue @@ -1,13 +1,13 @@ - - - \ No newline at end of file + + + diff --git a/src/components/RuoYi/Git/index.vue b/src/components/RuoYi/Git/index.vue index 3fe77d0..73f6a9c 100644 --- a/src/components/RuoYi/Git/index.vue +++ b/src/components/RuoYi/Git/index.vue @@ -1,13 +1,13 @@ - - - + + + diff --git a/src/components/Screenfull/index.vue b/src/components/Screenfull/index.vue index c3b9b94..eaed38f 100644 --- a/src/components/Screenfull/index.vue +++ b/src/components/Screenfull/index.vue @@ -1,22 +1,25 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index f3cf567..d38fc03 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -1,45 +1,50 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index 41f64c9..bb66d79 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -1,53 +1,53 @@ - - - - - + + + + + diff --git a/src/components/SvgIcon/svgicon.js b/src/components/SvgIcon/svgicon.js index b7c1907..f7369ef 100644 --- a/src/components/SvgIcon/svgicon.js +++ b/src/components/SvgIcon/svgicon.js @@ -1,10 +1,10 @@ -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); - } - }, -}; +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); + } + }, +}; diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index c2d1a74..27d98ba 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -1,186 +1,200 @@ - - - - - + + + + + diff --git a/src/components/TreeSelect/index.vue b/src/components/TreeSelect/index.vue index 82cafb7..f392b38 100644 --- a/src/components/TreeSelect/index.vue +++ b/src/components/TreeSelect/index.vue @@ -1,156 +1,155 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue index 2e88332..90837b7 100644 --- a/src/components/iFrame/index.vue +++ b/src/components/iFrame/index.vue @@ -1,31 +1,32 @@ - - - + + + diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 8a2605d..59ac6bf 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,191 +1,202 @@ - - - - - + + + + + diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue index 3bf28fe..a6ec816 100644 --- a/src/layout/components/Settings/index.vue +++ b/src/layout/components/Settings/index.vue @@ -1,241 +1,296 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue index 15692ba..ff3c20f 100644 --- a/src/layout/components/Sidebar/Link.vue +++ b/src/layout/components/Sidebar/Link.vue @@ -1,40 +1,40 @@ - - - + + + diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index 962600e..0754baa 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -1,81 +1,116 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index f2a913f..4f4299f 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -1,102 +1,134 @@ - - - + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index 646bb63..664954a 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -1,54 +1,69 @@ - - - + + + diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue index ff058ba..1953de1 100644 --- a/src/layout/components/TagsView/ScrollPane.vue +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -1,105 +1,114 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index c6ebdba..5625621 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -1,338 +1,355 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/src/layout/components/index.js b/src/layout/components/index.js index d1308ce..5d8cf1c 100644 --- a/src/layout/components/index.js +++ b/src/layout/components/index.js @@ -1,4 +1,4 @@ -export { default as AppMain } from './AppMain' -export { default as Navbar } from './Navbar' -export { default as Settings } from './Settings' -export { default as TagsView } from './TagsView/index.vue' +export { default as AppMain } from "./AppMain"; +export { default as Navbar } from "./Navbar"; +export { default as Settings } from "./Settings"; +export { default as TagsView } from "./TagsView/index.vue"; diff --git a/src/layout/index.vue b/src/layout/index.vue index 52d821b..28f87f1 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -1,111 +1,122 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/main.js b/src/main.js index 28725e7..5fa46e2 100644 --- a/src/main.js +++ b/src/main.js @@ -1,81 +1,88 @@ -import { createApp } from 'vue' - -import Cookies from 'js-cookie' - -import ElementPlus from 'element-plus' -import locale from 'element-plus/lib/locale/lang/zh-cn' // 中文语言 - -import '@/assets/styles/index.scss' // global css - -import App from './App' -import store from './store' -import router from './router' -import directive from './directive' // directive - - -// 注册指令 -import plugins from './plugins' // plugins -import { download } from '@/utils/request' - -// svg图标 -import 'virtual:svg-icons-register' -import SvgIcon from '@/components/SvgIcon' -import elementIcons from '@/components/SvgIcon/svgicon' - -import './permission' // permission control - -import { useDict } from '@/utils/dict' -import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi' - -// 分页组件 -import Pagination from '@/components/Pagination' -// 自定义表格工具组件 -import RightToolbar from '@/components/RightToolbar' -// 文件上传组件 -import FileUpload from "@/components/FileUpload" -// 图片上传组件 -import ImageUpload from "@/components/ImageUpload" -// 图片预览组件 -import ImagePreview from "@/components/ImagePreview" -// 自定义树选择组件 -import TreeSelect from '@/components/TreeSelect' -// 字典标签组件 -import DictTag from '@/components/DictTag' - -const app = createApp(App) - -// 全局方法挂载 -app.config.globalProperties.useDict = useDict -app.config.globalProperties.download = download -app.config.globalProperties.parseTime = parseTime -app.config.globalProperties.resetForm = resetForm -app.config.globalProperties.handleTree = handleTree -app.config.globalProperties.addDateRange = addDateRange -app.config.globalProperties.selectDictLabel = selectDictLabel -app.config.globalProperties.selectDictLabels = selectDictLabels - -// 全局组件挂载 -app.component('DictTag', DictTag) -app.component('Pagination', Pagination) -app.component('TreeSelect', TreeSelect) -app.component('FileUpload', FileUpload) -app.component('ImageUpload', ImageUpload) -app.component('ImagePreview', ImagePreview) -app.component('RightToolbar', RightToolbar) - -app.use(router) -app.use(store) -app.use(plugins) -app.use(elementIcons) -app.component('svg-icon', SvgIcon) - -directive(app) - -// 使用element-plus 并且设置全局的大小 -app.use(ElementPlus, { - locale: locale, - // 支持 large、default、small - size: Cookies.get('size') || 'default' -}) - -app.mount('#app') +import { createApp } from "vue"; + +import Cookies from "js-cookie"; + +import ElementPlus from "element-plus"; +import locale from "element-plus/lib/locale/lang/zh-cn"; // 中文语言 + +import "@/assets/styles/index.scss"; // global css + +import App from "./App"; +import store from "./store"; +import router from "./router"; +import directive from "./directive"; // directive +import "@/assets/iconfonts/iconfont.css"; + +// 注册指令 +import plugins from "./plugins"; // plugins +import { download } from "@/utils/request"; + +// svg图标 +import "virtual:svg-icons-register"; +import SvgIcon from "@/components/SvgIcon"; +import elementIcons from "@/components/SvgIcon/svgicon"; + +import "./permission"; // permission control + +import { useDict } from "@/utils/dict"; +import { + parseTime, + resetForm, + addDateRange, + handleTree, + selectDictLabel, + selectDictLabels, +} from "@/utils/ruoyi"; + +// 分页组件 +import Pagination from "@/components/Pagination"; +// 自定义表格工具组件 +import RightToolbar from "@/components/RightToolbar"; +// 文件上传组件 +import FileUpload from "@/components/FileUpload"; +// 图片上传组件 +import ImageUpload from "@/components/ImageUpload"; +// 图片预览组件 +import ImagePreview from "@/components/ImagePreview"; +// 自定义树选择组件 +import TreeSelect from "@/components/TreeSelect"; +// 字典标签组件 +import DictTag from "@/components/DictTag"; + +const app = createApp(App); + +// 全局方法挂载 +app.config.globalProperties.useDict = useDict; +app.config.globalProperties.download = download; +app.config.globalProperties.parseTime = parseTime; +app.config.globalProperties.resetForm = resetForm; +app.config.globalProperties.handleTree = handleTree; +app.config.globalProperties.addDateRange = addDateRange; +app.config.globalProperties.selectDictLabel = selectDictLabel; +app.config.globalProperties.selectDictLabels = selectDictLabels; + +// 全局组件挂载 +app.component("DictTag", DictTag); +app.component("Pagination", Pagination); +app.component("TreeSelect", TreeSelect); +app.component("FileUpload", FileUpload); +app.component("ImageUpload", ImageUpload); +app.component("ImagePreview", ImagePreview); +app.component("RightToolbar", RightToolbar); + +app.use(router); +app.use(store); +app.use(plugins); +app.use(elementIcons); +app.component("svg-icon", SvgIcon); + +directive(app); + +// 使用element-plus 并且设置全局的大小 +app.use(ElementPlus, { + locale: locale, + // 支持 large、default、small + size: Cookies.get("size") || "default", +}); + +app.mount("#app"); diff --git a/src/permission.js b/src/permission.js index 2a4f871..c4e777e 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,63 +1,70 @@ -import router from './router' -import { ElMessage } from 'element-plus' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import { getToken } from '@/utils/auth' -import { isHttp } from '@/utils/validate' -import { isRelogin } from '@/utils/request' -import useUserStore from '@/store/modules/user' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' - -NProgress.configure({ showSpinner: false }); - -const whiteList = ['/login', '/register']; - -router.beforeEach((to, from, next) => { - NProgress.start() - if (getToken()) { - to.meta.title && useSettingsStore().setTitle(to.meta.title) - /* has token*/ - if (to.path === '/login') { - next({ path: '/' }) - NProgress.done() - } 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) // 动态添加可访问路由表 - } - }) - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 - }) - }).catch(err => { - useUserStore().logOut().then(() => { - ElMessage.error(err) - next({ path: '/' }) - }) - }) - } else { - next() - } - } - } else { - // 没有token - if (whiteList.indexOf(to.path) !== -1) { - // 在免登录白名单,直接进入 - next() - } else { - next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 - NProgress.done() - } - } -}) - -router.afterEach(() => { - NProgress.done() -}) +import router from "./router"; +import { ElMessage } from "element-plus"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; +import { getToken } from "@/utils/auth"; +import { isHttp } from "@/utils/validate"; +import { isRelogin } from "@/utils/request"; +import useUserStore from "@/store/modules/user"; +import useSettingsStore from "@/store/modules/settings"; +import usePermissionStore from "@/store/modules/permission"; + +NProgress.configure({ showSpinner: false }); + +const whiteList = ["/login", "/register", "/iforgot", "/sign_in_with"]; + +router.beforeEach((to, from, next) => { + NProgress.start(); + if (getToken()) { + to.meta.title && useSettingsStore().setTitle(to.meta.title); + /* has token*/ + if (to.path === "/login") { + next({ path: "/" }); + NProgress.done(); + } 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); // 动态添加可访问路由表 + } + }); + next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 + }); + }) + .catch((err) => { + useUserStore() + .logOut() + .then(() => { + ElMessage.error(err); + next({ path: "/" }); + }); + }); + } else { + next(); + } + } + } else { + // 没有token + if (whiteList.indexOf(to.path) !== -1) { + // 在免登录白名单,直接进入 + next(); + } else { + next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页 + NProgress.done(); + } + } +}); + +router.afterEach(() => { + NProgress.done(); +}); diff --git a/src/plugins/auth.js b/src/plugins/auth.js index 5f38cfa..1c59efe 100644 --- a/src/plugins/auth.js +++ b/src/plugins/auth.js @@ -1,60 +1,60 @@ -import useUserStore from '@/store/modules/user' - -function authPermission(permission) { - const all_permission = "*:*:*"; - const permissions = useUserStore().permissions - if (permission && permission.length > 0) { - return permissions.some(v => { - return all_permission === v || v === permission - }) - } else { - return false - } -} - -function authRole(role) { - const super_admin = "admin"; - const roles = useUserStore().roles - if (role && role.length > 0) { - return roles.some(v => { - return super_admin === v || v === role - }) - } else { - return false - } -} - -export default { - // 验证用户是否具备某权限 - hasPermi(permission) { - return authPermission(permission); - }, - // 验证用户是否含有指定权限,只需包含其中一个 - hasPermiOr(permissions) { - return permissions.some(item => { - return authPermission(item) - }) - }, - // 验证用户是否含有指定权限,必须全部拥有 - hasPermiAnd(permissions) { - return permissions.every(item => { - return authPermission(item) - }) - }, - // 验证用户是否具备某角色 - hasRole(role) { - return authRole(role); - }, - // 验证用户是否含有指定角色,只需包含其中一个 - hasRoleOr(roles) { - return roles.some(item => { - return authRole(item) - }) - }, - // 验证用户是否含有指定角色,必须全部拥有 - hasRoleAnd(roles) { - return roles.every(item => { - return authRole(item) - }) - } -} +import useUserStore from "@/store/modules/user"; + +function authPermission(permission) { + const all_permission = "*:*:*"; + const permissions = useUserStore().permissions; + if (permission && permission.length > 0) { + return permissions.some((v) => { + return all_permission === v || v === permission; + }); + } else { + return false; + } +} + +function authRole(role) { + const super_admin = "admin"; + const roles = useUserStore().roles; + if (role && role.length > 0) { + return roles.some((v) => { + return super_admin === v || v === role; + }); + } else { + return false; + } +} + +export default { + // 验证用户是否具备某权限 + hasPermi(permission) { + return authPermission(permission); + }, + // 验证用户是否含有指定权限,只需包含其中一个 + hasPermiOr(permissions) { + return permissions.some((item) => { + return authPermission(item); + }); + }, + // 验证用户是否含有指定权限,必须全部拥有 + hasPermiAnd(permissions) { + return permissions.every((item) => { + return authPermission(item); + }); + }, + // 验证用户是否具备某角色 + hasRole(role) { + return authRole(role); + }, + // 验证用户是否含有指定角色,只需包含其中一个 + hasRoleOr(roles) { + return roles.some((item) => { + return authRole(item); + }); + }, + // 验证用户是否含有指定角色,必须全部拥有 + hasRoleAnd(roles) { + return roles.every((item) => { + return authRole(item); + }); + }, +}; diff --git a/src/plugins/cache.js b/src/plugins/cache.js index 6f71b8e..04a33e7 100644 --- a/src/plugins/cache.js +++ b/src/plugins/cache.js @@ -1,77 +1,77 @@ -const sessionCache = { - set (key, value) { - if (!sessionStorage) { - return - } - if (key != null && value != null) { - sessionStorage.setItem(key, value) - } - }, - get (key) { - if (!sessionStorage) { - return null - } - if (key == null) { - return null - } - return sessionStorage.getItem(key) - }, - setJSON (key, jsonValue) { - if (jsonValue != null) { - this.set(key, JSON.stringify(jsonValue)) - } - }, - getJSON (key) { - const value = this.get(key) - if (value != null) { - return JSON.parse(value) - } - }, - remove (key) { - sessionStorage.removeItem(key); - } -} -const localCache = { - set (key, value) { - if (!localStorage) { - return - } - if (key != null && value != null) { - localStorage.setItem(key, value) - } - }, - get (key) { - if (!localStorage) { - return null - } - if (key == null) { - return null - } - return localStorage.getItem(key) - }, - setJSON (key, jsonValue) { - if (jsonValue != null) { - this.set(key, JSON.stringify(jsonValue)) - } - }, - getJSON (key) { - const value = this.get(key) - if (value != null) { - return JSON.parse(value) - } - }, - remove (key) { - localStorage.removeItem(key); - } -} - -export default { - /** - * 会话级缓存 - */ - session: sessionCache, - /** - * 本地缓存 - */ - local: localCache -} +const sessionCache = { + set(key, value) { + if (!sessionStorage) { + return; + } + if (key != null && value != null) { + sessionStorage.setItem(key, value); + } + }, + get(key) { + if (!sessionStorage) { + return null; + } + if (key == null) { + return null; + } + return sessionStorage.getItem(key); + }, + setJSON(key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)); + } + }, + getJSON(key) { + const value = this.get(key); + if (value != null) { + return JSON.parse(value); + } + }, + remove(key) { + sessionStorage.removeItem(key); + }, +}; +const localCache = { + set(key, value) { + if (!localStorage) { + return; + } + if (key != null && value != null) { + localStorage.setItem(key, value); + } + }, + get(key) { + if (!localStorage) { + return null; + } + if (key == null) { + return null; + } + return localStorage.getItem(key); + }, + setJSON(key, jsonValue) { + if (jsonValue != null) { + this.set(key, JSON.stringify(jsonValue)); + } + }, + getJSON(key) { + const value = this.get(key); + if (value != null) { + return JSON.parse(value); + } + }, + remove(key) { + localStorage.removeItem(key); + }, +}; + +export default { + /** + * 会话级缓存 + */ + session: sessionCache, + /** + * 本地缓存 + */ + local: localCache, +}; diff --git a/src/plugins/download.js b/src/plugins/download.js index 41b2934..68fbb63 100644 --- a/src/plugins/download.js +++ b/src/plugins/download.js @@ -1,72 +1,79 @@ -import axios from 'axios' -import { ElMessage } from 'element-plus' -import { saveAs } from 'file-saver' -import { getToken } from '@/utils/auth' -import errorCode from '@/utils/errorCode' -import { blobValidate } from '@/utils/ruoyi' - -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 - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then(async (res) => { - 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); - } - }) - }, - resource(resource) { - var url = baseURL + "/common/download/resource?resource=" + encodeURIComponent(resource); - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then(async (res) => { - 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); - } - }) - }, - zip(url, name) { - var url = baseURL + url - axios({ - method: 'get', - url: url, - responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } - }).then(async (res) => { - 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); - } - }) - }, - 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); - } -} - +import axios from "axios"; +import { ElMessage } from "element-plus"; +import { saveAs } from "file-saver"; +import { getToken } from "@/utils/auth"; +import errorCode from "@/utils/errorCode"; +import { blobValidate } from "@/utils/ruoyi"; + +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; + axios({ + method: "get", + url: url, + responseType: "blob", + headers: { Authorization: "Bearer " + getToken() }, + }).then(async (res) => { + 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); + } + }); + }, + resource(resource) { + var url = + baseURL + + "/common/download/resource?resource=" + + encodeURIComponent(resource); + axios({ + method: "get", + url: url, + responseType: "blob", + headers: { Authorization: "Bearer " + getToken() }, + }).then(async (res) => { + 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); + } + }); + }, + zip(url, name) { + var url = baseURL + url; + axios({ + method: "get", + url: url, + responseType: "blob", + headers: { Authorization: "Bearer " + getToken() }, + }).then(async (res) => { + 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); + } + }); + }, + 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); + }, +}; diff --git a/src/plugins/index.js b/src/plugins/index.js index fb75c63..9050925 100644 --- a/src/plugins/index.js +++ b/src/plugins/index.js @@ -1,18 +1,18 @@ -import tab from './tab' -import auth from './auth' -import cache from './cache' -import modal from './modal' -import download from './download' - -export default function installPlugins(app){ - // 页签操作 - app.config.globalProperties.$tab = tab - // 认证对象 - app.config.globalProperties.$auth = auth - // 缓存对象 - app.config.globalProperties.$cache = cache - // 模态框对象 - app.config.globalProperties.$modal = modal - // 下载文件 - app.config.globalProperties.$download = download -} +import tab from "./tab"; +import auth from "./auth"; +import cache from "./cache"; +import modal from "./modal"; +import download from "./download"; + +export default function installPlugins(app) { + // 页签操作 + app.config.globalProperties.$tab = tab; + // 认证对象 + app.config.globalProperties.$auth = auth; + // 缓存对象 + app.config.globalProperties.$cache = cache; + // 模态框对象 + app.config.globalProperties.$modal = modal; + // 下载文件 + app.config.globalProperties.$download = download; +} diff --git a/src/plugins/modal.js b/src/plugins/modal.js index 005b92e..d10efce 100644 --- a/src/plugins/modal.js +++ b/src/plugins/modal.js @@ -1,82 +1,87 @@ -import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus' - -let loadingInstance; - -export default { - // 消息提示 - msg(content) { - ElMessage.info(content) - }, - // 错误消息 - msgError(content) { - ElMessage.error(content) - }, - // 成功消息 - msgSuccess(content) { - ElMessage.success(content) - }, - // 警告消息 - msgWarning(content) { - ElMessage.warning(content) - }, - // 弹出提示 - alert(content) { - ElMessageBox.alert(content, "系统提示") - }, - // 错误提示 - alertError(content) { - ElMessageBox.alert(content, "系统提示", { type: 'error' }) - }, - // 成功提示 - alertSuccess(content) { - ElMessageBox.alert(content, "系统提示", { type: 'success' }) - }, - // 警告提示 - alertWarning(content) { - ElMessageBox.alert(content, "系统提示", { type: 'warning' }) - }, - // 通知提示 - notify(content) { - ElNotification.info(content) - }, - // 错误通知 - notifyError(content) { - ElNotification.error(content); - }, - // 成功通知 - notifySuccess(content) { - ElNotification.success(content) - }, - // 警告通知 - notifyWarning(content) { - ElNotification.warning(content) - }, - // 确认窗体 - confirm(content) { - return ElMessageBox.confirm(content, "系统提示", { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: "warning", - }) - }, - // 提交内容 - prompt(content) { - return ElMessageBox.prompt(content, "系统提示", { - confirmButtonText: '确定', - cancelButtonText: '取消', - type: "warning", - }) - }, - // 打开遮罩层 - loading(content) { - loadingInstance = ElLoading.service({ - lock: true, - text: content, - background: "rgba(0, 0, 0, 0.7)", - }) - }, - // 关闭遮罩层 - closeLoading() { - loadingInstance.close(); - } -} +import { + ElMessage, + ElMessageBox, + ElNotification, + ElLoading, +} from "element-plus"; + +let loadingInstance; + +export default { + // 消息提示 + msg(content) { + ElMessage.info(content); + }, + // 错误消息 + msgError(content) { + ElMessage.error(content); + }, + // 成功消息 + msgSuccess(content) { + ElMessage.success(content); + }, + // 警告消息 + msgWarning(content) { + ElMessage.warning(content); + }, + // 弹出提示 + alert(content) { + ElMessageBox.alert(content, "系统提示"); + }, + // 错误提示 + alertError(content) { + ElMessageBox.alert(content, "系统提示", { type: "error" }); + }, + // 成功提示 + alertSuccess(content) { + ElMessageBox.alert(content, "系统提示", { type: "success" }); + }, + // 警告提示 + alertWarning(content) { + ElMessageBox.alert(content, "系统提示", { type: "warning" }); + }, + // 通知提示 + notify(content) { + ElNotification.info(content); + }, + // 错误通知 + notifyError(content) { + ElNotification.error(content); + }, + // 成功通知 + notifySuccess(content) { + ElNotification.success(content); + }, + // 警告通知 + notifyWarning(content) { + ElNotification.warning(content); + }, + // 确认窗体 + confirm(content) { + return ElMessageBox.confirm(content, "系统提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }); + }, + // 提交内容 + prompt(content) { + return ElMessageBox.prompt(content, "系统提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning", + }); + }, + // 打开遮罩层 + loading(content) { + loadingInstance = ElLoading.service({ + lock: true, + text: content, + background: "rgba(0, 0, 0, 0.7)", + }); + }, + // 关闭遮罩层 + closeLoading() { + loadingInstance.close(); + }, +}; diff --git a/src/plugins/tab.js b/src/plugins/tab.js index fd3d286..420bd37 100644 --- a/src/plugins/tab.js +++ b/src/plugins/tab.js @@ -1,65 +1,69 @@ -import useTagsViewStore from '@/store/modules/tagsView' -import router from '@/router' - -export default { - // 刷新当前tab页签 - refreshPage(obj) { - 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 }; - } - } - }); - } - return useTagsViewStore().delCachedView(obj).then(() => { - const { path, query } = obj - router.replace({ - path: '/redirect' + path, - query: query - }) - }) - }, - // 关闭当前tab页签,打开新页签 - closeOpenPage(obj) { - useTagsViewStore().delView(router.currentRoute.value); - if (obj !== undefined) { - 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(obj); - }, - // 关闭所有tab页签 - closeAllPage() { - return useTagsViewStore().delAllViews(); - }, - // 关闭左侧tab页签 - closeLeftPage(obj) { - return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); - }, - // 关闭右侧tab页签 - closeRightPage(obj) { - return useTagsViewStore().delRightTags(obj || router.currentRoute.value); - }, - // 关闭其他tab页签 - closeOtherPage(obj) { - return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); - }, - // 打开tab页签 - openPage(url) { - return router.push(url); - }, - // 修改tab页签 - updatePage(obj) { - return useTagsViewStore().updateVisitedView(obj); - } -} +import useTagsViewStore from "@/store/modules/tagsView"; +import router from "@/router"; + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + 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 }; + } + } + }); + } + return useTagsViewStore() + .delCachedView(obj) + .then(() => { + const { path, query } = obj; + router.replace({ + path: "/redirect" + path, + query: query, + }); + }); + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + useTagsViewStore().delView(router.currentRoute.value); + if (obj !== undefined) { + 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(obj); + }, + // 关闭所有tab页签 + closeAllPage() { + return useTagsViewStore().delAllViews(); + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return useTagsViewStore().delRightTags(obj || router.currentRoute.value); + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); + }, + // 打开tab页签 + openPage(url) { + return router.push(url); + }, + // 修改tab页签 + updatePage(obj) { + return useTagsViewStore().updateVisitedView(obj); + }, +}; diff --git a/src/router/index.js b/src/router/index.js index b05d1c1..fc8281b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,175 +1,185 @@ -import { createWebHistory, createRouter } from 'vue-router' -/* Layout */ -import Layout from '@/layout' - -/** - * Note: 路由配置项 - * - * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 - * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 - * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 - * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 - * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 - * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 - * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 - * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 - * roles: ['admin', 'common'] // 访问路由的角色权限 - * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 - * meta : { - noCache: true // 如果设置为true,则不会被 缓存(默认 false) - title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 - icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg - breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 - activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 - } - */ - -// 公共路由 -export const constantRoutes = [ - { - path: '/redirect', - component: Layout, - hidden: true, - children: [ - { - path: '/redirect/:path(.*)', - component: () => import('@/views/redirect/index.vue') - } - ] - }, - { - path: '/login', - component: () => import('@/views/login'), - hidden: true - }, - { - path: '/register', - component: () => import('@/views/register'), - hidden: true - }, - { - path: "/:pathMatch(.*)*", - component: () => import('@/views/error/404'), - hidden: true - }, - { - path: '/401', - component: () => import('@/views/error/401'), - hidden: true - }, - { - path: '', - component: Layout, - redirect: '/index', - children: [ - { - path: '/index', - component: () => import('@/views/index'), - name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } - } - ] - }, - { - path: '/user', - component: Layout, - hidden: true, - redirect: 'noredirect', - children: [ - { - path: 'profile', - component: () => import('@/views/system/user/profile/index'), - name: 'Profile', - meta: { title: '个人中心', icon: 'user' } - } - ] - } -] - -// 动态路由,基于用户权限动态去加载 -export const dynamicRoutes = [ - { - path: '/system/user-auth', - component: Layout, - hidden: true, - permissions: ['system:user:edit'], - children: [ - { - path: 'role/:userId(\\d+)', - component: () => import('@/views/system/user/authRole'), - name: 'AuthRole', - meta: { title: '分配角色', activeMenu: '/system/user' } - } - ] - }, - { - path: '/system/role-auth', - component: Layout, - hidden: true, - permissions: ['system:role:edit'], - children: [ - { - path: 'user/:roleId(\\d+)', - component: () => import('@/views/system/role/authUser'), - name: 'AuthUser', - meta: { title: '分配用户', activeMenu: '/system/role' } - } - ] - }, - { - path: '/system/dict-data', - component: Layout, - hidden: true, - permissions: ['system:dict:list'], - children: [ - { - path: 'index/:dictId(\\d+)', - component: () => import('@/views/system/dict/data'), - name: 'Data', - meta: { title: '字典数据', activeMenu: '/system/dict' } - } - ] - }, - { - path: '/monitor/job-log', - component: Layout, - hidden: true, - permissions: ['monitor:job:list'], - children: [ - { - path: 'index/:jobId(\\d+)', - component: () => import('@/views/monitor/job/log'), - name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] - }, - { - path: '/tool/gen-edit', - component: Layout, - hidden: true, - permissions: ['tool:gen:edit'], - children: [ - { - path: 'index/:tableId(\\d+)', - component: () => import('@/views/tool/gen/editTable'), - name: 'GenEdit', - meta: { title: '修改生成配置', activeMenu: '/tool/gen' } - } - ] - } -] - -const router = createRouter({ - history: createWebHistory(), - routes: constantRoutes, - scrollBehavior(to, from, savedPosition) { - if (savedPosition) { - return savedPosition - } else { - return { top: 0 } - } - }, -}); - -export default router; +import { createRouter, createWebHistory } from "vue-router"; +/* Layout */ +import Layout from "@/layout"; + +/** + * Note: 路由配置项 + * + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 + * roles: ['admin', 'common'] // 访问路由的角色权限 + * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 false) + title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 + icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg + breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + } + */ + +// 公共路由 +export const constantRoutes = [ + { + path: "/redirect", + component: Layout, + hidden: true, + children: [ + { + path: "/redirect/:path(.*)", + component: () => import("@/views/redirect/index.vue"), + }, + ], + }, + { + path: "/login", + component: () => import("@/views/login"), + hidden: true, + }, + { + path: "/register", + component: () => import("@/views/register"), + hidden: true, + }, + { + path: "/iforgot", + component: () => import("@/views/iforgot.vue"), + hidden: true, + }, + { + path: "/sign_in_with", + component: () => import("@/views/sign_in_with.vue"), + hidden: true, + }, + { + path: "/:pathMatch(.*)*", + component: () => import("@/views/error/404"), + hidden: true, + }, + { + path: "/401", + component: () => import("@/views/error/401"), + hidden: true, + }, + { + path: "", + component: Layout, + redirect: "/index", + children: [ + { + path: "/index", + component: () => import("@/views/index"), + name: "Index", + meta: { title: "首页", icon: "dashboard", affix: true }, + }, + ], + }, + { + path: "/user", + component: Layout, + hidden: true, + redirect: "noredirect", + children: [ + { + path: "profile", + component: () => import("@/views/system/user/profile/index"), + name: "Profile", + meta: { title: "个人中心", icon: "user" }, + }, + ], + }, +]; + +// 动态路由,基于用户权限动态去加载 +export const dynamicRoutes = [ + { + path: "/system/user-auth", + component: Layout, + hidden: true, + permissions: ["system:user:edit"], + children: [ + { + path: "role/:userId(\\d+)", + component: () => import("@/views/system/user/authRole"), + name: "AuthRole", + meta: { title: "分配角色", activeMenu: "/system/user" }, + }, + ], + }, + { + path: "/system/role-auth", + component: Layout, + hidden: true, + permissions: ["system:role:edit"], + children: [ + { + path: "user/:roleId(\\d+)", + component: () => import("@/views/system/role/authUser"), + name: "AuthUser", + meta: { title: "分配用户", activeMenu: "/system/role" }, + }, + ], + }, + { + path: "/system/dict-data", + component: Layout, + hidden: true, + permissions: ["system:dict:list"], + children: [ + { + path: "index/:dictId(\\d+)", + component: () => import("@/views/system/dict/data"), + name: "Data", + meta: { title: "字典数据", activeMenu: "/system/dict" }, + }, + ], + }, + { + path: "/monitor/job-log", + component: Layout, + hidden: true, + permissions: ["monitor:job:list"], + children: [ + { + path: "index/:jobId(\\d+)", + component: () => import("@/views/monitor/job/log"), + name: "JobLog", + meta: { title: "调度日志", activeMenu: "/monitor/job" }, + }, + ], + }, + { + path: "/tool/gen-edit", + component: Layout, + hidden: true, + permissions: ["tool:gen:edit"], + children: [ + { + path: "index/:tableId(\\d+)", + component: () => import("@/views/tool/gen/editTable"), + name: "GenEdit", + meta: { title: "修改生成配置", activeMenu: "/tool/gen" }, + }, + ], + }, +]; + +const router = createRouter({ + history: createWebHistory(), + routes: constantRoutes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition; + } else { + return { top: 0 }; + } + }, +}); + +export default router; diff --git a/src/settings.js b/src/settings.js index bd4b9e2..93c19be 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,47 +1,47 @@ -export default { - /** - * 网页标题 - */ - title: import.meta.env.VITE_APP_TITLE, - /** - * 侧边栏主题 深色主题theme-dark,浅色主题theme-light - */ - sideTheme: 'theme-dark', - /** - * 是否系统布局配置 - */ - showSettings: false, - - /** - * 是否显示顶部导航 - */ - topNav: false, - - /** - * 是否显示 tagsView - */ - tagsView: true, - - /** - * 是否固定头部 - */ - fixedHeader: false, - - /** - * 是否显示logo - */ - sidebarLogo: true, - - /** - * 是否显示动态标题 - */ - dynamicTitle: false, - - /** - * @type {string | array} 'production' | ['production', 'development'] - * @description Need show err logs component. - * 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' -} +export default { + /** + * 网页标题 + */ + title: import.meta.env.VITE_APP_TITLE, + /** + * 侧边栏主题 深色主题theme-dark,浅色主题theme-light + */ + sideTheme: "theme-dark", + /** + * 是否系统布局配置 + */ + showSettings: false, + + /** + * 是否显示顶部导航 + */ + topNav: false, + + /** + * 是否显示 tagsView + */ + tagsView: true, + + /** + * 是否固定头部 + */ + fixedHeader: false, + + /** + * 是否显示logo + */ + sidebarLogo: true, + + /** + * 是否显示动态标题 + */ + dynamicTitle: false, + + /** + * @type {string | array} 'production' | ['production', 'development'] + * @description Need show err logs component. + * 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", +}; diff --git a/src/store/index.js b/src/store/index.js index cd73385..069d54e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,3 +1,3 @@ -const store = createPinia() - -export default store \ No newline at end of file +const store = createPinia(); + +export default store; diff --git a/src/store/modules/app.js b/src/store/modules/app.js index 3b26cfe..51297dd 100644 --- a/src/store/modules/app.js +++ b/src/store/modules/app.js @@ -1,46 +1,46 @@ -import Cookies from 'js-cookie' - -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 }) { - 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 +import Cookies from "js-cookie"; + +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 }) { + 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 7e62a67..a20084f 100644 --- a/src/store/modules/dict.js +++ b/src/store/modules/dict.js @@ -1,57 +1,54 @@ -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; - } - } - } 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) { - bln = false; - } - return bln; - }, - // 清空字典 - cleanDict() { - this.dict = new Array(); - }, - // 初始字典 - initDict() { - } - } - }) - -export default useDictStore +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; + } + } + } 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) { + bln = false; + } + return bln; + }, + // 清空字典 + cleanDict() { + this.dict = new Array(); + }, + // 初始字典 + initDict() {}, + }, +}); + +export default useDictStore; diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index c1c862b..f2570c8 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,138 +1,138 @@ -import auth from '@/plugins/auth' -import router, { constantRoutes, dynamicRoutes } from '@/router' -import { getRouters } from '@/api/menu' -import Layout from '@/layout/index' -import ParentView from '@/components/ParentView' -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) - }) - }) - } - } - }) - -// 遍历后台传来的路由字符串,转换为组件对象 -function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { - return asyncRouterMap.filter(route => { - if (type && route.children) { - route.children = filterChildren(route.children) - } - if (route.component) { - // Layout ParentView 组件特殊处理 - if (route.component === 'Layout') { - route.component = Layout - } else if (route.component === 'ParentView') { - route.component = ParentView - } else if (route.component === 'InnerLink') { - route.component = InnerLink - } else { - route.component = loadView(route.component) - } - } - if (route.children != null && route.children && route.children.length) { - route.children = filterAsyncRouter(route.children, route, type) - } else { - delete route['children'] - delete route['redirect'] - } - return true - }) -} - -function filterChildren(childrenMap, lastRouter = false) { - var children = [] - childrenMap.forEach((el, index) => { - if (el.children && el.children.length) { - if (el.component === 'ParentView' && !lastRouter) { - el.children.forEach(c => { - c.path = el.path + '/' + c.path - if (c.children && c.children.length) { - children = children.concat(filterChildren(c.children, c)) - return - } - children.push(c) - }) - return - } - } - if (lastRouter) { - el.path = lastRouter.path + '/' + el.path - } - children = children.concat(el) - }) - return children -} - -// 动态路由遍历,验证是否具备权限 -export function filterDynamicRoutes(routes) { - const res = [] - routes.forEach(route => { - if (route.permissions) { - if (auth.hasPermiOr(route.permissions)) { - res.push(route) - } - } else if (route.roles) { - if (auth.hasRoleOr(route.roles)) { - res.push(route) - } - } - }) - return res -} - -export const loadView = (view) => { - let res; - for (const path in modules) { - const dir = path.split('views/')[1].split('.vue')[0]; - if (dir === view) { - res = () => modules[path](); - } - } - return res; -} - -export default usePermissionStore +import auth from "@/plugins/auth"; +import router, { constantRoutes, dynamicRoutes } from "@/router"; +import { getRouters } from "@/api/menu"; +import Layout from "@/layout/index"; +import ParentView from "@/components/ParentView"; +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); + }); + }); + }, + }, +}); + +// 遍历后台传来的路由字符串,转换为组件对象 +function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { + return asyncRouterMap.filter((route) => { + if (type && route.children) { + route.children = filterChildren(route.children); + } + if (route.component) { + // Layout ParentView 组件特殊处理 + if (route.component === "Layout") { + route.component = Layout; + } else if (route.component === "ParentView") { + route.component = ParentView; + } else if (route.component === "InnerLink") { + route.component = InnerLink; + } else { + route.component = loadView(route.component); + } + } + if (route.children != null && route.children && route.children.length) { + route.children = filterAsyncRouter(route.children, route, type); + } else { + delete route["children"]; + delete route["redirect"]; + } + return true; + }); +} + +function filterChildren(childrenMap, lastRouter = false) { + var children = []; + childrenMap.forEach((el, index) => { + if (el.children && el.children.length) { + if (el.component === "ParentView" && !lastRouter) { + el.children.forEach((c) => { + c.path = el.path + "/" + c.path; + if (c.children && c.children.length) { + children = children.concat(filterChildren(c.children, c)); + return; + } + children.push(c); + }); + return; + } + } + if (lastRouter) { + el.path = lastRouter.path + "/" + el.path; + } + children = children.concat(el); + }); + return children; +} + +// 动态路由遍历,验证是否具备权限 +export function filterDynamicRoutes(routes) { + const res = []; + routes.forEach((route) => { + if (route.permissions) { + if (auth.hasPermiOr(route.permissions)) { + res.push(route); + } + } else if (route.roles) { + if (auth.hasRoleOr(route.roles)) { + res.push(route); + } + } + }); + return res; +} + +export const loadView = (view) => { + let res; + for (const path in modules) { + const dir = path.split("views/")[1].split(".vue")[0]; + if (dir === view) { + res = () => modules[path](); + } + } + return res; +}; + +export default usePermissionStore; diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js index 3e41513..0f37c1e 100644 --- a/src/store/modules/settings.js +++ b/src/store/modules/settings.js @@ -1,38 +1,57 @@ -import defaultSettings from '@/settings' -import { useDynamicTitle } from '@/utils/dynamicTitle' - -const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings - -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(); - } - } - }) - -export default useSettingsStore +import defaultSettings from "@/settings"; +import { useDynamicTitle } from "@/utils/dynamicTitle"; + +const { + sideTheme, + showSettings, + topNav, + tagsView, + fixedHeader, + sidebarLogo, + dynamicTitle, +} = defaultSettings; + +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(); + }, + }, +}); + +export default useSettingsStore; diff --git a/src/store/modules/tagsView.js b/src/store/modules/tagsView.js index b0d4ca1..97c48fa 100644 --- a/src/store/modules/tagsView.js +++ b/src/store/modules/tagsView.js @@ -1,182 +1,186 @@ -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]) - }) - }, - 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]) - }) - }, - delAllViews(view) { - return new Promise(resolve => { - this.delAllVisitedViews(view) - this.delAllCachedViews(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]) - }) - }, - 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 - } - 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]) - }) - }, - 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 - } - 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 +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]); + }); + }, + 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]); + }); + }, + delAllViews(view) { + return new Promise((resolve) => { + this.delAllVisitedViews(view); + this.delAllCachedViews(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]); + }); + }, + 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; + } + 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]); + }); + }, + 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; + } + 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 7c2e6e8..43a4e5d 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,70 +1,78 @@ -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 => { - setToken(res.token) - this.token = res.token - resolve() - }).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; - - 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; - resolve(res) - }).catch(error => { - reject(error) - }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { - this.token = '' - this.roles = [] - this.permissions = [] - removeToken() - resolve() - }).catch(error => { - reject(error) - }) - }) - } - } - }) - -export default useUserStore +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) => { + setToken(res.token); + this.token = res.token; + resolve(); + }) + .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; + + 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; + resolve(res); + }) + .catch((error) => { + reject(error); + }); + }); + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token) + .then(() => { + this.token = ""; + this.roles = []; + this.permissions = []; + removeToken(); + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + }, + }, +}); + +export default useUserStore; diff --git a/src/utils/auth.js b/src/utils/auth.js index 88d7b6c..785a25d 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,15 +1,15 @@ -import Cookies from 'js-cookie' - -const TokenKey = 'Admin-Token' - -export function getToken() { - return Cookies.get(TokenKey) -} - -export function setToken(token) { - return Cookies.set(TokenKey, token) -} - -export function removeToken() { - return Cookies.remove(TokenKey) -} +import Cookies from "js-cookie"; + +const TokenKey = "Admin-Token"; + +export function getToken() { + return Cookies.get(TokenKey); +} + +export function setToken(token) { + return Cookies.set(TokenKey, token); +} + +export function removeToken() { + return Cookies.remove(TokenKey); +} diff --git a/src/utils/dict.js b/src/utils/dict.js index 40d0691..d10840e 100644 --- a/src/utils/dict.js +++ b/src/utils/dict.js @@ -1,24 +1,29 @@ -import useDictStore from '@/store/modules/dict' -import { getDicts } from '@/api/system/dict/data' - -/** - * 获取字典数据 - */ -export function useDict(...args) { - const res = ref({}); - return (() => { - args.forEach((dictType, index) => { - res.value[dictType] = []; - const dicts = useDictStore().getDict(dictType); - if (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]); - }) - } - }) - return toRefs(res.value); - })() -} \ No newline at end of file +import useDictStore from "@/store/modules/dict"; +import { getDicts } from "@/api/system/dict/data"; + +/** + * 获取字典数据 + */ +export function useDict(...args) { + const res = ref({}); + return (() => { + args.forEach((dictType, index) => { + res.value[dictType] = []; + const dicts = useDictStore().getDict(dictType); + if (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]); + }); + } + }); + return toRefs(res.value); + })(); +} diff --git a/src/utils/dynamicTitle.js b/src/utils/dynamicTitle.js index b55d6a1..85144a4 100644 --- a/src/utils/dynamicTitle.js +++ b/src/utils/dynamicTitle.js @@ -1,15 +1,15 @@ -import store from '@/store' -import defaultSettings from '@/settings' -import useSettingsStore from '@/store/modules/settings' - -/** - * 动态修改标题 - */ -export function useDynamicTitle() { - const settingsStore = useSettingsStore(); - if (settingsStore.dynamicTitle) { - document.title = settingsStore.title + ' - ' + defaultSettings.title; - } else { - document.title = defaultSettings.title; - } -} \ No newline at end of file +import store from "@/store"; +import defaultSettings from "@/settings"; +import useSettingsStore from "@/store/modules/settings"; + +/** + * 动态修改标题 + */ +export function useDynamicTitle() { + const settingsStore = useSettingsStore(); + if (settingsStore.dynamicTitle) { + document.title = settingsStore.title + " - " + defaultSettings.title; + } else { + document.title = defaultSettings.title; + } +} diff --git a/src/utils/errorCode.js b/src/utils/errorCode.js index b72d026..984fded 100644 --- a/src/utils/errorCode.js +++ b/src/utils/errorCode.js @@ -1,6 +1,6 @@ -export default { - '401': '认证失败,无法访问系统资源', - '403': '当前操作没有权限', - '404': '访问资源不存在', - 'default': '系统未知错误,请反馈给管理员' -} +export default { + 401: "认证失败,无法访问系统资源", + 403: "当前操作没有权限", + 404: "访问资源不存在", + default: "系统未知错误,请反馈给管理员", +}; diff --git a/src/utils/index.js b/src/utils/index.js index 9679e75..4490f41 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -1,390 +1,394 @@ -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 -} - -/** - * @param {number} time - * @param {string} option - * @returns {string} - */ -export function formatTime(time, option) { - if (('' + time).length === 10) { - time = parseInt(time) * 1000 - } else { - time = +time - } - const d = new Date(time) - const now = Date.now() - - const diff = (now - d) / 1000 - - if (diff < 30) { - return '刚刚' - } else 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 '1天前' - } - if (option) { - return parseTime(time, option) - } else { - return ( - d.getMonth() + - 1 + - '月' + - d.getDate() + - '日' + - d.getHours() + - '时' + - d.getMinutes() + - '分' - ) - } -} - -/** - * @param {string} url - * @returns {Object} - */ -export function getQueryObject(url) { - url = url == null ? window.location.href : url - const search = url.substring(url.lastIndexOf('?') + 1) - const obj = {} - const reg = /([^?&=]+)=([^?&=]*)/g - search.replace(reg, (rs, $1, $2) => { - const name = decodeURIComponent($1) - let val = decodeURIComponent($2) - val = String(val) - obj[name] = val - return rs - }) - return obj -} - -/** - * @param {string} input value - * @returns {number} output value - */ -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--) { - 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-- - } - return s -} - -/** - * @param {Array} actual - * @returns {Array} - */ -export function cleanArray(actual) { - const newArray = [] - for (let i = 0; i < actual.length; i++) { - if (actual[i]) { - newArray.push(actual[i]) - } - } - return newArray -} - -/** - * @param {Object} json - * @returns {Array} - */ -export function param(json) { - if (!json) return '' - return cleanArray( - Object.keys(json).map(key => { - if (json[key] === undefined) return '' - return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) - }) - ).join('&') -} - -/** - * @param {string} url - * @returns {Object} - */ -export function param2Obj(url) { - const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') - if (!search) { - return {} - } - const obj = {} - const searchArr = search.split('&') - searchArr.forEach(v => { - const index = v.indexOf('=') - if (index !== -1) { - const name = v.substring(0, index) - const val = v.substring(index + 1, v.length) - obj[name] = val - } - }) - return obj -} - -/** - * @param {string} val - * @returns {string} - */ -export function html2Text(val) { - const div = document.createElement('div') - div.innerHTML = val - return div.textContent || div.innerText -} - -/** - * Merges two objects, giving the last one precedence - * @param {Object} target - * @param {(Object|Array)} source - * @returns {Object} - */ -export function objectMerge(target, source) { - if (typeof target !== 'object') { - target = {} - } - if (Array.isArray(source)) { - return source.slice() - } - Object.keys(source).forEach(property => { - const sourceProperty = source[property] - if (typeof sourceProperty === 'object') { - target[property] = objectMerge(target[property], sourceProperty) - } else { - target[property] = sourceProperty - } - }) - return target -} - -/** - * @param {HTMLElement} element - * @param {string} className - */ -export function toggleClass(element, className) { - if (!element || !className) { - return - } - let classString = element.className - const nameIndex = classString.indexOf(className) - if (nameIndex === -1) { - classString += '' + className - } else { - classString = - classString.substr(0, nameIndex) + - classString.substr(nameIndex + className.length) - } - element.className = classString -} - -/** - * @param {string} type - * @returns {Date} - */ -export function getTime(type) { - if (type === 'start') { - return new Date().getTime() - 3600 * 1000 * 24 * 90 - } else { - return new Date(new Date().toDateString()) - } -} - -/** - * @param {Function} func - * @param {number} wait - * @param {boolean} immediate - * @return {*} - */ -export function debounce(func, wait, immediate) { - let timeout, args, context, timestamp, result - - const later = function() { - // 据上一次触发时间间隔 - const last = +new Date() - timestamp - - // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait - if (last < wait && last > 0) { - timeout = setTimeout(later, wait - last) - } else { - timeout = null - // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 - if (!immediate) { - result = func.apply(context, args) - if (!timeout) context = args = null - } - } - } - - return function(...args) { - context = this - timestamp = +new Date() - const callNow = immediate && !timeout - // 如果延时不存在,重新设定延时 - if (!timeout) timeout = setTimeout(later, wait) - if (callNow) { - result = func.apply(context, args) - context = args = null - } - - return result - } -} - -/** - * This is just a simple version of deep copy - * Has a lot of edge cases bug - * If you want to use a perfect deep copy, use lodash's _.cloneDeep - * @param {Object} source - * @returns {Object} - */ -export function deepClone(source) { - if (!source && typeof source !== 'object') { - throw new Error('error arguments', 'deepClone') - } - const targetObj = source.constructor === Array ? [] : {} - Object.keys(source).forEach(keys => { - if (source[keys] && typeof source[keys] === 'object') { - targetObj[keys] = deepClone(source[keys]) - } else { - targetObj[keys] = source[keys] - } - }) - return targetObj -} - -/** - * @param {Array} arr - * @returns {Array} - */ -export function uniqueArr(arr) { - return Array.from(new Set(arr)) -} - -/** - * @returns {string} - */ -export function createUniqueString() { - const timestamp = +new Date() + '' - const randomNum = parseInt((1 + Math.random()) * 65536) + '' - return (+(randomNum + timestamp)).toString(32) -} - -/** - * Check if an element has a class - * @param {HTMLElement} elm - * @param {string} cls - * @returns {boolean} - */ -export function hasClass(ele, cls) { - return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) -} - -/** - * Add class to element - * @param {HTMLElement} elm - * @param {string} cls - */ -export function addClass(ele, cls) { - if (!hasClass(ele, cls)) ele.className += ' ' + cls -} - -/** - * Remove class from element - * @param {HTMLElement} elm - * @param {string} cls - */ -export function removeClass(ele, cls) { - if (hasClass(ele, cls)) { - const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') - ele.className = ele.className.replace(reg, ' ') - } -} - -export function makeMap(str, expectsLowerCase) { - const map = Object.create(null) - const list = str.split(',') - for (let i = 0; i < list.length; i++) { - map[list[i]] = true - } - return expectsLowerCase - ? val => map[val.toLowerCase()] - : val => map[val] -} - -export const exportDefault = 'export default ' - -export const beautifierConf = { - html: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', - preserve_newlines: false, - keep_array_indentation: false, - break_chained_methods: false, - indent_scripts: 'separate', - brace_style: 'end-expand', - space_before_conditional: true, - unescape_strings: false, - jslint_happy: false, - end_with_newline: true, - wrap_line_length: '110', - indent_inner_html: true, - comma_first: false, - e4x: true, - indent_empty_lines: true - }, - js: { - indent_size: '2', - indent_char: ' ', - max_preserve_newlines: '-1', - preserve_newlines: false, - keep_array_indentation: false, - break_chained_methods: false, - indent_scripts: 'normal', - brace_style: 'end-expand', - space_before_conditional: true, - unescape_strings: false, - jslint_happy: true, - end_with_newline: true, - wrap_line_length: '110', - indent_inner_html: true, - comma_first: false, - e4x: true, - indent_empty_lines: true - } -} - -// 首字母大小 -export function titleCase(str) { - return str.replace(/( |^)[a-z]/g, L => L.toUpperCase()) -} - -// 下划转驼峰 -export function camelCase(str) { - return str.replace(/_[a-z]/g, str1 => str1.substr(-1).toUpperCase()) -} - -export function isNumberStr(str) { - return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) -} - +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 + ); +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (("" + time).length === 10) { + time = parseInt(time) * 1000; + } else { + time = +time; + } + const d = new Date(time); + const now = Date.now(); + + const diff = (now - d) / 1000; + + if (diff < 30) { + return "刚刚"; + } else 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 "1天前"; + } + if (option) { + return parseTime(time, option); + } else { + return ( + d.getMonth() + + 1 + + "月" + + d.getDate() + + "日" + + d.getHours() + + "时" + + d.getMinutes() + + "分" + ); + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url; + const search = url.substring(url.lastIndexOf("?") + 1); + const obj = {}; + const reg = /([^?&=]+)=([^?&=]*)/g; + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1); + let val = decodeURIComponent($2); + val = String(val); + obj[name] = val; + return rs; + }); + return obj; +} + +/** + * @param {string} input value + * @returns {number} output value + */ +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--) { + 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--; + } + return s; +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = []; + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]); + } + } + return newArray; +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return ""; + return cleanArray( + Object.keys(json).map((key) => { + if (json[key] === undefined) return ""; + return encodeURIComponent(key) + "=" + encodeURIComponent(json[key]); + }) + ).join("&"); +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split("?")[1]).replace(/\+/g, " "); + if (!search) { + return {}; + } + const obj = {}; + const searchArr = search.split("&"); + searchArr.forEach((v) => { + const index = v.indexOf("="); + if (index !== -1) { + const name = v.substring(0, index); + const val = v.substring(index + 1, v.length); + obj[name] = val; + } + }); + return obj; +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement("div"); + div.innerHTML = val; + return div.textContent || div.innerText; +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== "object") { + target = {}; + } + if (Array.isArray(source)) { + return source.slice(); + } + Object.keys(source).forEach((property) => { + const sourceProperty = source[property]; + if (typeof sourceProperty === "object") { + target[property] = objectMerge(target[property], sourceProperty); + } else { + target[property] = sourceProperty; + } + }); + return target; +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return; + } + let classString = element.className; + const nameIndex = classString.indexOf(className); + if (nameIndex === -1) { + classString += "" + className; + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length); + } + element.className = classString; +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === "start") { + return new Date().getTime() - 3600 * 1000 * 24 * 90; + } else { + return new Date(new Date().toDateString()); + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result; + + const later = function () { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp; + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function (...args) { + context = this; + timestamp = +new Date(); + const callNow = immediate && !timeout; + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== "object") { + throw new Error("error arguments", "deepClone"); + } + const targetObj = source.constructor === Array ? [] : {}; + Object.keys(source).forEach((keys) => { + if (source[keys] && typeof source[keys] === "object") { + targetObj[keys] = deepClone(source[keys]); + } else { + targetObj[keys] = source[keys]; + } + }); + return targetObj; +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)); +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + ""; + const randomNum = parseInt((1 + Math.random()) * 65536) + ""; + return (+(randomNum + timestamp)).toString(32); +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")); +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += " " + cls; +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); + ele.className = ele.className.replace(reg, " "); + } +} + +export function makeMap(str, expectsLowerCase) { + const map = Object.create(null); + const list = str.split(","); + for (let i = 0; i < list.length; i++) { + map[list[i]] = true; + } + return expectsLowerCase ? (val) => map[val.toLowerCase()] : (val) => map[val]; +} + +export const exportDefault = "export default "; + +export const beautifierConf = { + html: { + indent_size: "2", + indent_char: " ", + max_preserve_newlines: "-1", + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: "separate", + brace_style: "end-expand", + space_before_conditional: true, + unescape_strings: false, + jslint_happy: false, + end_with_newline: true, + wrap_line_length: "110", + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true, + }, + js: { + indent_size: "2", + indent_char: " ", + max_preserve_newlines: "-1", + preserve_newlines: false, + keep_array_indentation: false, + break_chained_methods: false, + indent_scripts: "normal", + brace_style: "end-expand", + space_before_conditional: true, + unescape_strings: false, + jslint_happy: true, + end_with_newline: true, + wrap_line_length: "110", + indent_inner_html: true, + comma_first: false, + e4x: true, + indent_empty_lines: true, + }, +}; + +// 首字母大小 +export function titleCase(str) { + return str.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()); +} + +// 下划转驼峰 +export function camelCase(str) { + 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 9f3a280..a8ecdc9 100644 --- a/src/utils/jsencrypt.js +++ b/src/utils/jsencrypt.js @@ -1,30 +1,31 @@ -import JSEncrypt from 'jsencrypt/bin/jsencrypt.min' - -// 密钥对生成 http://web.chacuo.net/netrsakeypair - -const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' + - 'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' - -const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' + - '7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n' + - 'PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n' + - 'kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n' + - 'cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n' + - 'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' + - 'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' + - 'UP8iWi1Qw0Y=' - -// 加密 -export function encrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPublicKey(publicKey) // 设置公钥 - return encryptor.encrypt(txt) // 对数据进行加密 -} - -// 解密 -export function decrypt(txt) { - const encryptor = new JSEncrypt() - encryptor.setPrivateKey(privateKey) // 设置私钥 - return encryptor.decrypt(txt) // 对数据进行解密 -} - +import JSEncrypt from "jsencrypt/bin/jsencrypt.min"; + +// 密钥对生成 http://web.chacuo.net/netrsakeypair + +const publicKey = + "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n" + + "nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=="; + +const privateKey = + "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n" + + "7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN\n" + + "PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA\n" + + "kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow\n" + + "cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv\n" + + "DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n" + + "YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n" + + "UP8iWi1Qw0Y="; + +// 加密 +export function encrypt(txt) { + const encryptor = new JSEncrypt(); + encryptor.setPublicKey(publicKey); // 设置公钥 + return encryptor.encrypt(txt); // 对数据进行加密 +} + +// 解密 +export function decrypt(txt) { + const encryptor = new JSEncrypt(); + encryptor.setPrivateKey(privateKey); // 设置私钥 + return encryptor.decrypt(txt); // 对数据进行解密 +} diff --git a/src/utils/permission.js b/src/utils/permission.js index 93b772d..e72724a 100644 --- a/src/utils/permission.js +++ b/src/utils/permission.js @@ -1,51 +1,55 @@ -import useUserStore from '@/store/modules/user' - -/** - * 字符权限校验 - * @param {Array} value 校验值 - * @returns {Boolean} - */ -export function checkPermi(value) { - if (value && value instanceof Array && value.length > 0) { - const permissions = useUserStore().permissions - const permissionDatas = value - const all_permission = "*:*:*"; - - const hasPermission = permissions.some(permission => { - return all_permission === 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 - } -} - -/** - * 角色权限校验 - * @param {Array} value 校验值 - * @returns {Boolean} - */ -export function checkRole(value) { - if (value && value instanceof Array && value.length > 0) { - const roles = useUserStore().roles - const permissionRoles = value - const super_admin = "admin"; - - const hasRole = roles.some(role => { - return super_admin === 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 +import useUserStore from "@/store/modules/user"; + +/** + * 字符权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = useUserStore().permissions; + const permissionDatas = value; + const all_permission = "*:*:*"; + + const hasPermission = permissions.some((permission) => { + return ( + all_permission === 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; + } +} + +/** + * 角色权限校验 + * @param {Array} value 校验值 + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = useUserStore().roles; + const permissionRoles = value; + const super_admin = "admin"; + + const hasRole = roles.some((role) => { + return super_admin === role || permissionRoles.includes(role); + }); + + if (!hasRole) { + return false; + } + return true; + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`); + return false; + } +} diff --git a/src/utils/request.js b/src/utils/request.js index 001ec11..5b69e5a 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,146 +1,195 @@ -import axios from 'axios' -import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' -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; -// 是否显示重新登录 -export let isRelogin = { show: false }; - -axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' -// 创建axios实例 -const service = axios.create({ - // axios中请求配置有baseURL选项,表示请求URL公共部分 - baseURL: import.meta.env.VITE_APP_BASE_API, - // 超时 - 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() - } - 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)) - } else { - cache.session.setJSON('sessionObj', requestObj) - } - } - } - return config -}, error => { - console.log(error) - Promise.reject(error) -}) - -// 响应拦截器 -service.interceptors.response.use(res => { - // 未设置状态码则默认成功状态 - const code = res.data.code || 200; - // 获取错误信息 - const msg = errorCode[code] || res.data.msg || errorCode['default'] - // 二进制数据则直接返回 - 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'; - }) - }).catch(() => { - isRelogin.show = false; - }); - } - return Promise.reject('无效的会话,或者会话已过期,请重新登录。') - } else if (code === 500) { - ElMessage({ message: msg, type: 'error' }) - return Promise.reject(new Error(msg)) - } else if (code === 601) { - ElMessage({ message: msg, type: 'warning' }) - return Promise.reject(new Error(msg)) - } else if (code !== 200) { - ElNotification.error({ title: msg }) - return Promise.reject('error') - } else { - 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) + "异常"; - } - ElMessage({ message: 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(); - }) -} - -export default service +import axios from "axios"; +import { + ElNotification, + ElMessageBox, + ElMessage, + ElLoading, +} from "element-plus"; +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; +// 是否显示重新登录 +export let isRelogin = { show: false }; + +axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8"; +// 创建axios实例 +const service = axios.create({ + // axios中请求配置有baseURL选项,表示请求URL公共部分 + baseURL: import.meta.env.VITE_APP_BASE_API, + // 超时 + 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(), + }; + 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)); + } else { + cache.session.setJSON("sessionObj", requestObj); + } + } + } + return config; + }, + (error) => { + console.log(error); + Promise.reject(error); + } +); + +// 响应拦截器 +service.interceptors.response.use( + (res) => { + // 未设置状态码则默认成功状态 + const code = res.data.code || 200; + // 获取错误信息 + const msg = errorCode[code] || res.data.msg || errorCode["default"]; + // 二进制数据则直接返回 + 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"; + }); + }) + .catch(() => { + isRelogin.show = false; + }); + } + return Promise.reject("无效的会话,或者会话已过期,请重新登录。"); + } else if (code === 500) { + ElMessage({ message: msg, type: "error" }); + return Promise.reject(new Error(msg)); + } else if (code === 601) { + ElMessage({ message: msg, type: "warning" }); + return Promise.reject(new Error(msg)); + } else if (code !== 200) { + ElNotification.error({ title: msg }); + return Promise.reject("error"); + } else { + 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) + "异常"; + } + ElMessage({ message: 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(); + }); +} + +export default service; diff --git a/src/utils/ruoyi.js b/src/utils/ruoyi.js index 3ba2868..4f49a28 100644 --- a/src/utils/ruoyi.js +++ b/src/utils/ruoyi.js @@ -1,252 +1,265 @@ - - -/** - * 通用js方法封装处理 - * Copyright (c) 2019 ruoyi - */ - -// 日期格式化 -export function parseTime(time, pattern) { - if (arguments.length === 0 || !time) { - return null - } - const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' - let date - if (typeof time === 'object') { - date = time - } else { - if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { - time = parseInt(time) - } else if (typeof time === 'string') { - time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); - } - if ((typeof time === 'number') && (time.toString().length === 10)) { - time = time * 1000 - } - date = new Date(time) - } - const formatObj = { - y: date.getFullYear(), - m: date.getMonth() + 1, - d: date.getDate(), - h: date.getHours(), - i: date.getMinutes(), - s: date.getSeconds(), - a: date.getDay() - } - const time_str = 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 (result.length > 0 && value < 10) { - value = '0' + value - } - return value || 0 - }) - return time_str -} - -// 表单重置 -export function resetForm(refName) { - if (this.$refs[refName]) { - 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]; - } else { - search.params['begin' + propName] = dateRange[0]; - search.params['end' + propName] = dateRange[1]; - } - return search; -} - -// 回显数据字典 -export function selectDictLabel(datas, value) { - if (value === undefined) { - return ""; - } - var actions = []; - Object.keys(datas).some((key) => { - if (datas[key].value == ('' + value)) { - actions.push(datas[key].label); - return true; - } - }) - if (actions.length === 0) { - actions.push(value); - } - return actions.join(''); -} - -// 回显数据字典(字符串数组) -export function selectDictLabels(datas, value, separator) { - if (value === undefined || value.length ===0) { - return ""; - } - if (Array.isArray(value)) { - value = value.join(","); - } - var actions = []; - var currentSeparator = undefined === separator ? "," : separator; - var temp = value.split(currentSeparator); - Object.keys(value.split(currentSeparator)).some((val) => { - var match = false; - Object.keys(datas).some((key) => { - if (datas[key].value == ('' + temp[val])) { - actions.push(datas[key].label + currentSeparator); - match = true; - } - }) - if (!match) { - actions.push(temp[val] + currentSeparator); - } - }) - return actions.join('').substring(0, actions.join('').length - 1); -} - -// 字符串格式化(%s ) -export function sprintf(str) { - var args = arguments, flag = true, i = 1; - str = str.replace(/%s/g, function () { - var arg = args[i++]; - if (typeof arg === 'undefined') { - flag = false; - return ''; - } - return arg; - }); - return flag ? str : ''; -} - -// 转换字符串,undefined,null等转化为"" -export function parseStrEmpty(str) { - if (!str || str == "undefined" || str == "null") { - return ""; - } - return str; -} - -// 数据合并 -export function mergeRecursive(source, target) { - for (var p in target) { - try { - if (target[p].constructor == Object) { - source[p] = mergeRecursive(source[p], target[p]); - } else { - source[p] = target[p]; - } - } catch (e) { - source[p] = target[p]; - } - } - return source; -}; - -/** - * 构造树型结构数据 - * @param {*} data 数据源 - * @param {*} id id字段 默认 'id' - * @param {*} parentId 父节点字段 默认 'parentId' - * @param {*} children 孩子节点字段 默认 'children' - */ -export function handleTree(data, id, parentId, children) { - let config = { - id: id || 'id', - parentId: parentId || 'parentId', - childrenList: children || 'children' - }; - - var childrenListMap = {}; - var nodeIds = {}; - var tree = []; - - for (let d of data) { - let parentId = d[config.parentId]; - if (childrenListMap[parentId] == null) { - childrenListMap[parentId] = []; - } - nodeIds[d[config.id]] = d; - childrenListMap[parentId].push(d); - } - - for (let d of data) { - let parentId = d[config.parentId]; - if (nodeIds[parentId] == null) { - tree.push(d); - } - } - - for (let t of tree) { - adaptToChildrenList(t); - } - - function adaptToChildrenList(o) { - if (childrenListMap[o[config.id]] !== null) { - o[config.childrenList] = childrenListMap[o[config.id]]; - } - if (o[config.childrenList]) { - for (let c of o[config.childrenList]) { - adaptToChildrenList(c); - } - } - } - return tree; -} - -/** -* 参数处理 -* @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") { - 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]) + "&"; - } - } - } else { - result += part + encodeURIComponent(value) + "&"; - } - } - } - return result -} - - -// 返回项目路径 -export function getNormalPath(p) { - if (p.length === 0 || !p || p == 'undefined') { - return p - }; - let res = p.replace('//', '/') - if (res[res.length - 1] === '/') { - return res.slice(0, res.length - 1) - } - return res; -} - -// 验证是否为blob格式 -export async function blobValidate(data) { - try { - const text = await data.text(); - JSON.parse(text); - return false; - } catch (error) { - return true; - } -} \ No newline at end of file +/** + * 通用js方法封装处理 + * Copyright (c) 2019 ruoyi + */ + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null; + } + const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}"; + let date; + if (typeof time === "object") { + date = time; + } else { + if (typeof time === "string" && /^[0-9]+$/.test(time)) { + time = parseInt(time); + } else if (typeof time === "string") { + time = time + .replace(new RegExp(/-/gm), "/") + .replace("T", " ") + .replace(new RegExp(/\.[\d]{3}/gm), ""); + } + if (typeof time === "number" && time.toString().length === 10) { + time = time * 1000; + } + date = new Date(time); + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay(), + }; + const time_str = 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 (result.length > 0 && value < 10) { + value = "0" + value; + } + return value || 0; + }); + return time_str; +} + +// 表单重置 +export function resetForm(refName) { + if (this.$refs[refName]) { + 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]; + } else { + search.params["begin" + propName] = dateRange[0]; + search.params["end" + propName] = dateRange[1]; + } + return search; +} + +// 回显数据字典 +export function selectDictLabel(datas, value) { + if (value === undefined) { + return ""; + } + var actions = []; + Object.keys(datas).some((key) => { + if (datas[key].value == "" + value) { + actions.push(datas[key].label); + return true; + } + }); + if (actions.length === 0) { + actions.push(value); + } + return actions.join(""); +} + +// 回显数据字典(字符串数组) +export function selectDictLabels(datas, value, separator) { + if (value === undefined || value.length === 0) { + return ""; + } + if (Array.isArray(value)) { + value = value.join(","); + } + var actions = []; + var currentSeparator = undefined === separator ? "," : separator; + var temp = value.split(currentSeparator); + Object.keys(value.split(currentSeparator)).some((val) => { + var match = false; + Object.keys(datas).some((key) => { + if (datas[key].value == "" + temp[val]) { + actions.push(datas[key].label + currentSeparator); + match = true; + } + }); + if (!match) { + actions.push(temp[val] + currentSeparator); + } + }); + return actions.join("").substring(0, actions.join("").length - 1); +} + +// 字符串格式化(%s ) +export function sprintf(str) { + var args = arguments, + flag = true, + i = 1; + str = str.replace(/%s/g, function () { + var arg = args[i++]; + if (typeof arg === "undefined") { + flag = false; + return ""; + } + return arg; + }); + return flag ? str : ""; +} + +// 转换字符串,undefined,null等转化为"" +export function parseStrEmpty(str) { + if (!str || str == "undefined" || str == "null") { + return ""; + } + return str; +} + +// 数据合并 +export function mergeRecursive(source, target) { + for (var p in target) { + try { + if (target[p].constructor == Object) { + source[p] = mergeRecursive(source[p], target[p]); + } else { + source[p] = target[p]; + } + } catch (e) { + source[p] = target[p]; + } + } + return source; +} + +/** + * 构造树型结构数据 + * @param {*} data 数据源 + * @param {*} id id字段 默认 'id' + * @param {*} parentId 父节点字段 默认 'parentId' + * @param {*} children 孩子节点字段 默认 'children' + */ +export function handleTree(data, id, parentId, children) { + let config = { + id: id || "id", + parentId: parentId || "parentId", + childrenList: children || "children", + }; + + var childrenListMap = {}; + var nodeIds = {}; + var tree = []; + + for (let d of data) { + let parentId = d[config.parentId]; + if (childrenListMap[parentId] == null) { + childrenListMap[parentId] = []; + } + nodeIds[d[config.id]] = d; + childrenListMap[parentId].push(d); + } + + for (let d of data) { + let parentId = d[config.parentId]; + if (nodeIds[parentId] == null) { + tree.push(d); + } + } + + for (let t of tree) { + adaptToChildrenList(t); + } + + function adaptToChildrenList(o) { + if (childrenListMap[o[config.id]] !== null) { + o[config.childrenList] = childrenListMap[o[config.id]]; + } + if (o[config.childrenList]) { + for (let c of o[config.childrenList]) { + adaptToChildrenList(c); + } + } + } + return tree; +} + +/** + * 参数处理 + * @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") { + 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]) + "&"; + } + } + } else { + result += part + encodeURIComponent(value) + "&"; + } + } + } + return result; +} + +// 返回项目路径 +export function getNormalPath(p) { + if (p.length === 0 || !p || p == "undefined") { + return p; + } + let res = p.replace("//", "/"); + if (res[res.length - 1] === "/") { + return res.slice(0, res.length - 1); + } + return res; +} + +// 验证是否为blob格式 +export async function blobValidate(data) { + try { + const text = await data.text(); + JSON.parse(text); + return false; + } catch (error) { + return true; + } +} diff --git a/src/utils/scroll-to.js b/src/utils/scroll-to.js index 709fa57..28d96c0 100644 --- a/src/utils/scroll-to.js +++ b/src/utils/scroll-to.js @@ -1,58 +1,69 @@ -Math.easeInOutQuad = function(t, b, c, d) { - t /= d / 2 - if (t < 1) { - return c / 2 * t * t + b - } - t-- - 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) } -})() - -/** - * Because it's so fucking difficult to detect the scrolling element, just move them all - * @param {number} amount - */ -function move(amount) { - document.documentElement.scrollTop = amount - document.body.parentNode.scrollTop = amount - document.body.scrollTop = amount -} - -function position() { - return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop -} - -/** - * @param {number} to - * @param {number} duration - * @param {Function} callback - */ -export function scrollTo(to, duration, callback) { - const start = position() - const change = to - start - const increment = 20 - let currentTime = 0 - duration = (typeof (duration) === 'undefined') ? 500 : duration - var 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) - // 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() - } - } - } - animateScroll() -} +Math.easeInOutQuad = function (t, b, c, d) { + t /= d / 2; + if (t < 1) { + return (c / 2) * t * t + b; + } + t--; + 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); + } + ); +})(); + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount; + document.body.parentNode.scrollTop = amount; + document.body.scrollTop = amount; +} + +function position() { + return ( + document.documentElement.scrollTop || + document.body.parentNode.scrollTop || + document.body.scrollTop + ); +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position(); + const change = to - start; + const increment = 20; + let currentTime = 0; + duration = typeof duration === "undefined" ? 500 : duration; + var 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); + // 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(); + } + } + }; + animateScroll(); +} diff --git a/src/utils/theme.js b/src/utils/theme.js index f4badc6..cf9091c 100644 --- a/src/utils/theme.js +++ b/src/utils/theme.js @@ -1,49 +1,55 @@ // 处理主题样式 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("#", ""); + let 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('')}` + 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("")}`; } // 变浅颜色值 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]) + 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]); } // 变深颜色值 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]) + 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]); } diff --git a/src/utils/validate.js b/src/utils/validate.js index 71d0d06..c5967db 100644 --- a/src/utils/validate.js +++ b/src/utils/validate.js @@ -1,93 +1,95 @@ -/** - * 判断url是否是http或https - * @param {string} path - * @returns {Boolean} - */ - export function isHttp(url) { - return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1 -} - -/** - * 判断path是否为外链 - * @param {string} path - * @returns {Boolean} - */ - export function isExternal(path) { - return /^(https?:|mailto:|tel:)/.test(path) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUsername(str) { - const valid_map = ['admin', 'editor'] - return valid_map.indexOf(str.trim()) >= 0 -} - -/** - * @param {string} url - * @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.,?'\\+&%$#=~_-]+))*$/ - return reg.test(url) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validLowerCase(str) { - const reg = /^[a-z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validUpperCase(str) { - const reg = /^[A-Z]+$/ - return reg.test(str) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function validAlphabets(str) { - const reg = /^[A-Za-z]+$/ - return reg.test(str) -} - -/** - * @param {string} email - * @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,}))$/ - return reg.test(email) -} - -/** - * @param {string} str - * @returns {Boolean} - */ -export function isString(str) { - if (typeof str === 'string' || str instanceof String) { - return true - } - return false -} - -/** - * @param {Array} arg - * @returns {Boolean} - */ -export function isArray(arg) { - if (typeof Array.isArray === 'undefined') { - return Object.prototype.toString.call(arg) === '[object Array]' - } - return Array.isArray(arg) -} +/** + * 判断url是否是http或https + * @param {string} path + * @returns {Boolean} + */ +export function isHttp(url) { + return url.indexOf("http://") !== -1 || url.indexOf("https://") !== -1; +} + +/** + * 判断path是否为外链 + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path); +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ["admin", "editor"]; + return valid_map.indexOf(str.trim()) >= 0; +} + +/** + * @param {string} url + * @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.,?'\\+&%$#=~_-]+))*$/; + return reg.test(url); +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validLowerCase(str) { + const reg = /^[a-z]+$/; + return reg.test(str); +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUpperCase(str) { + const reg = /^[A-Z]+$/; + return reg.test(str); +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validAlphabets(str) { + const reg = /^[A-Za-z]+$/; + return reg.test(str); +} + +/** + * @param {string} email + * @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,}))$/; + return reg.test(email); +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function isString(str) { + if (typeof str === "string" || str instanceof String) { + return true; + } + return false; +} + +/** + * @param {Array} arg + * @returns {Boolean} + */ +export function isArray(arg) { + if (typeof Array.isArray === "undefined") { + return Object.prototype.toString.call(arg) === "[object Array]"; + } + return Array.isArray(arg); +} diff --git a/src/views/error/401.vue b/src/views/error/401.vue index c656dee..bfb1936 100644 --- a/src/views/error/401.vue +++ b/src/views/error/401.vue @@ -1,82 +1,83 @@ - - - - - + + + + + diff --git a/src/views/error/404.vue b/src/views/error/404.vue index 08a617a..79935c7 100644 --- a/src/views/error/404.vue +++ b/src/views/error/404.vue @@ -1,227 +1,241 @@ - - - - - + + + + + diff --git a/src/views/iforgot.vue b/src/views/iforgot.vue new file mode 100644 index 0000000..bd5112d --- /dev/null +++ b/src/views/iforgot.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/views/index.vue b/src/views/index.vue index 4e98162..52d9290 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,981 +1,3 @@ - - - - - - + diff --git a/src/views/login.vue b/src/views/login.vue index c2a91ef..955c28c 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -1,215 +1,404 @@ - - - - - + + + + + diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue deleted file mode 100644 index 02d2f7a..0000000 --- a/src/views/monitor/cache/index.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - diff --git a/src/views/monitor/cache/list.vue b/src/views/monitor/cache/list.vue deleted file mode 100644 index 1cc5357..0000000 --- a/src/views/monitor/cache/list.vue +++ /dev/null @@ -1,246 +0,0 @@ - - - diff --git a/src/views/monitor/druid/index.vue b/src/views/monitor/druid/index.vue deleted file mode 100644 index 124a92d..0000000 --- a/src/views/monitor/druid/index.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue index 519760d..435277a 100644 --- a/src/views/monitor/job/index.vue +++ b/src/views/monitor/job/index.vue @@ -1,483 +1,625 @@ - - - + + + diff --git a/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue index 803dbbd..dca25d3 100644 --- a/src/views/monitor/job/log.vue +++ b/src/views/monitor/job/log.vue @@ -1,277 +1,346 @@ - - - + + + diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue index 59a5353..3a483e9 100644 --- a/src/views/monitor/logininfor/index.vue +++ b/src/views/monitor/logininfor/index.vue @@ -1,224 +1,298 @@ - - - + + + diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue deleted file mode 100644 index 2b51340..0000000 --- a/src/views/monitor/online/index.vue +++ /dev/null @@ -1,106 +0,0 @@ - - - diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index 077f20a..4bfdb25 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -1,283 +1,367 @@ - - - + + + diff --git a/src/views/monitor/server/index.vue b/src/views/monitor/server/index.vue index a21d195..d65a55a 100644 --- a/src/views/monitor/server/index.vue +++ b/src/views/monitor/server/index.vue @@ -1,187 +1,368 @@ - - - + + + diff --git a/src/views/product/category/index.vue b/src/views/product/category/index.vue new file mode 100644 index 0000000..916835b --- /dev/null +++ b/src/views/product/category/index.vue @@ -0,0 +1,366 @@ + + + diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue index e51beed..68b50ca 100644 --- a/src/views/redirect/index.vue +++ b/src/views/redirect/index.vue @@ -1,14 +1,14 @@ - - - \ No newline at end of file + + + diff --git a/src/views/register.vue b/src/views/register.vue index 5e21769..a8942a4 100644 --- a/src/views/register.vue +++ b/src/views/register.vue @@ -1,218 +1,323 @@ - - - - - + + + + + diff --git a/src/views/sign_in_with.vue b/src/views/sign_in_with.vue new file mode 100644 index 0000000..465f047 --- /dev/null +++ b/src/views/sign_in_with.vue @@ -0,0 +1,5 @@ + + + + + diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue index 064b36a..6d3a9f2 100644 --- a/src/views/system/config/index.vue +++ b/src/views/system/config/index.vue @@ -1,305 +1,396 @@ - - - + + + diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index 889867d..7c5d490 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -1,274 +1,371 @@ - - - + + + diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue index 6960f2e..e5df0e1 100644 --- a/src/views/system/dict/data.vue +++ b/src/views/system/dict/data.vue @@ -1,350 +1,438 @@ - - - + + + diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue index 33fa3c9..919df84 100644 --- a/src/views/system/dict/index.vue +++ b/src/views/system/dict/index.vue @@ -1,312 +1,399 @@ - - - + + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index c3f55a4..24e1a5d 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -1,441 +1,573 @@ - - - + + + diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue index 35e15c1..6bab47f 100644 --- a/src/views/system/notice/index.vue +++ b/src/views/system/notice/index.vue @@ -1,288 +1,369 @@ - - - + + + diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue index aee6034..4a1138a 100644 --- a/src/views/system/post/index.vue +++ b/src/views/system/post/index.vue @@ -1,277 +1,353 @@ - - - + + + diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue index de3efd8..b0ba9c2 100644 --- a/src/views/system/role/authUser.vue +++ b/src/views/system/role/authUser.vue @@ -1,172 +1,232 @@ - - - - + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index e446ded..2860a8f 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -1,559 +1,687 @@ - - - + + + diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue index fb9e362..7bcaab6 100644 --- a/src/views/system/role/selectUser.vue +++ b/src/views/system/role/selectUser.vue @@ -1,140 +1,175 @@ - - - + + + diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue new file mode 100644 index 0000000..7683c58 --- /dev/null +++ b/src/views/system/tenant/index.vue @@ -0,0 +1,628 @@ + + + diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue index 55a71f4..c7ac374 100644 --- a/src/views/system/user/authRole.vue +++ b/src/views/system/user/authRole.vue @@ -1,112 +1,133 @@ - - - + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 5b1ea25..c7164c0 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -1,607 +1,826 @@ - - - + + + diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue index ee644d9..6f7aa9a 100644 --- a/src/views/system/user/profile/index.vue +++ b/src/views/system/user/profile/index.vue @@ -1,87 +1,89 @@ - - - + + + diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue index 053e823..b5c59c2 100644 --- a/src/views/system/user/profile/resetPwd.vue +++ b/src/views/system/user/profile/resetPwd.vue @@ -1,57 +1,78 @@ - - - + + + diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue index 343968b..d13dc6d 100644 --- a/src/views/system/user/profile/userAvatar.vue +++ b/src/views/system/user/profile/userAvatar.vue @@ -1,169 +1,181 @@ - - - - - \ No newline at end of file + + + + + diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue index 24c2019..db9dd4a 100644 --- a/src/views/system/user/profile/userInfo.vue +++ b/src/views/system/user/profile/userInfo.vue @@ -1,56 +1,70 @@ - - - + + + diff --git a/src/views/tool/build/index.vue b/src/views/tool/build/index.vue deleted file mode 100644 index c39cbd4..0000000 --- a/src/views/tool/build/index.vue +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue index 025ae42..789983b 100644 --- a/src/views/tool/gen/basicInfoForm.vue +++ b/src/views/tool/gen/basicInfoForm.vue @@ -1,48 +1,48 @@ - - - + + + diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue index 125fd75..bc71c84 100644 --- a/src/views/tool/gen/editTable.vue +++ b/src/views/tool/gen/editTable.vue @@ -1,198 +1,234 @@ - - - + + + diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue index 520ebc7..8288d48 100644 --- a/src/views/tool/gen/genInfoForm.vue +++ b/src/views/tool/gen/genInfoForm.vue @@ -1,281 +1,328 @@ - - - + + + diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue index 67624e2..ba8406f 100644 --- a/src/views/tool/gen/importTable.vue +++ b/src/views/tool/gen/importTable.vue @@ -1,118 +1,140 @@ - - - + + + diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue index 8c9ce6a..a06e2d7 100644 --- a/src/views/tool/gen/index.vue +++ b/src/views/tool/gen/index.vue @@ -1,283 +1,388 @@ - - - + + + diff --git a/src/views/tool/swagger/index.vue b/src/views/tool/swagger/index.vue deleted file mode 100644 index f29c40f..0000000 --- a/src/views/tool/swagger/index.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/vite.config.js b/vite.config.js index 0567692..859205f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => { proxy: { // https://cn.vitejs.dev/config/#server-proxy '/dev-api': { - target: 'http://localhost:8080', + target: 'http://192.168.1.16:1616', changeOrigin: true, rewrite: (p) => p.replace(/^\/dev-api/, '') }