-
+
diff --git a/ZR.Vue/src/views/tool/email/sendEmail.vue b/ZR.Vue/src/views/tool/email/sendEmail.vue
index 5a1d414..b5b4ce8 100644
--- a/ZR.Vue/src/views/tool/email/sendEmail.vue
+++ b/ZR.Vue/src/views/tool/email/sendEmail.vue
@@ -42,7 +42,7 @@ export default {
},
],
},
- uploadActionUrl: process.env.VUE_APP_BASE_API + "common/uploadFile",
+ uploadActionUrl: process.env.VUE_APP_BASE_API + "/common/uploadFile",
rules: {
subject: [{ required: true, message: "主题不能为空", trigger: "blur" }],
content: [{ required: true, message: "内容不能为空", trigger: "blur" }],
diff --git a/ZR.Vue/src/views/tool/gen/editTable.vue b/ZR.Vue/src/views/tool/gen/editTable.vue
index 970dcdf..d4d4a89 100644
--- a/ZR.Vue/src/views/tool/gen/editTable.vue
+++ b/ZR.Vue/src/views/tool/gen/editTable.vue
@@ -27,7 +27,7 @@
-
+
@@ -117,25 +117,25 @@
diff --git a/ZR.Vue/src/views/tool/gen/genInfoForm.vue b/ZR.Vue/src/views/tool/gen/genInfoForm.vue
index e95184a..cee1e85 100644
--- a/ZR.Vue/src/views/tool/gen/genInfoForm.vue
+++ b/ZR.Vue/src/views/tool/gen/genInfoForm.vue
@@ -75,11 +75,7 @@
-
-
- 查询排序字段
-
-
+
@@ -89,7 +85,17 @@
倒序
-
+
+
+
+ 权限前缀
+
+
+
+
+
+
+
@@ -224,32 +230,32 @@
diff --git a/ZR.Vue/src/views/tool/gen/index.vue b/ZR.Vue/src/views/tool/gen/index.vue
index 7cd9614..db22125 100644
--- a/ZR.Vue/src/views/tool/gen/index.vue
+++ b/ZR.Vue/src/views/tool/gen/index.vue
@@ -68,29 +68,29 @@ import {
listTable,
delTable,
previewTable,
- synchDb,
-} from "@/api/tool/gen";
-import importTable from "./importTable";
-import { Loading } from "element-ui";
-import hljs from "highlight.js";
-import "highlight.js/styles/idea.css"; //这里有多个样式,自己可以根据需要切换
+ synchDb
+} from '@/api/tool/gen'
+import importTable from './importTable'
+import { Loading } from 'element-ui'
+import hljs from 'highlight.js'
+import 'highlight.js/styles/idea.css' // 这里有多个样式,自己可以根据需要切换
export default {
- name: "gen",
+ name: 'gen',
components: { importTable, hljs },
data() {
return {
queryParams: {
pageNum: 1,
pageSize: 20,
- tableName: "",
+ tableName: ''
},
// 预览参数
preview: {
open: false,
- title: "代码预览",
+ title: '代码预览',
data: {},
- activeName: "0",
+ activeName: '0'
},
showGenerate: false,
rules: {},
@@ -103,169 +103,169 @@ export default {
currentSelected: {},
// 选中的列
checkedQueryColumn: [],
- //是否覆盖原先代码
+ // 是否覆盖原先代码
coverd: true,
- // 生成SQL脚本的数据库类型
- dbType: 1,
// 选中的表
tableIds: [],
// 非多个禁用
- multiple: true,
- };
+ multiple: true
+ }
},
created() {
- this.handleSearch();
+ this.handleSearch()
},
methods: {
/**
* 点击查询
*/
handleSearch() {
- this.tableloading = true;
+ this.tableloading = true
listTable(this.queryParams).then((res) => {
- this.tableData = res.data.result;
- this.total = res.data.totalNum;
- this.tableloading = false;
- });
+ this.tableData = res.data.result
+ this.total = res.data.totalNum
+ this.tableloading = false
+ })
},
/**
* 编辑表格
*/
handleEditTable(row) {
- this.queryParams.tableName = row.tableName;
- this.handleSearch();
+ this.queryParams.tableName = row.tableName
+ this.handleSearch()
this.$router.push({
- path: "/gen/editTable",
- query: { tableId: row.tableId },
- });
+ path: '/gen/editTable',
+ query: { tableId: row.tableId }
+ })
},
// 代码预览
handlePreview(row) {
- this.$refs["codeform"].validate((valid) => {
+ this.$refs['codeform'].validate((valid) => {
if (!valid) {
- this.msgError("请先完成表格");
- return;
+ this.msgError('请先完成表格')
+ return
}
+ this.$modal.loading('请稍后...')
previewTable(row.tableId).then((res) => {
if (res.code === 200) {
- this.showGenerate = false;
- this.preview.open = true;
- this.preview.data = res.data;
+ this.showGenerate = false
+ this.preview.open = true
+ this.preview.data = res.data
+ this.$modal.closeLoading()
}
- });
- });
+ })
+ })
},
/**
* 点击生成服务端代码
*/
handleGenTable(row) {
- this.currentSelected = row;
+ this.currentSelected = row
if (!this.currentSelected) {
- this.msgError("请先选择要生成代码的数据表");
- return false;
+ this.msgError('请先选择要生成代码的数据表')
+ return false
}
- this.$refs["codeform"].validate((valid) => {
+ this.$refs['codeform'].validate((valid) => {
if (valid) {
var loadop = {
lock: true,
- text: "正在生成代码...",
- spinner: "el-icon-loading",
- background: "rgba(0, 0, 0, 0.7)",
- };
- const pageLoading = Loading.service(loadop);
+ text: '正在生成代码...',
+ spinner: 'el-icon-loading',
+ background: 'rgba(0, 0, 0, 0.7)'
+ }
+ const pageLoading = Loading.service(loadop)
var seachdata = {
tableId: this.currentSelected.tableId,
- tableName: this.currentSelected.name,
+ tableName: this.currentSelected.name
// queryColumn: this.checkedQueryColumn,
- };
+ }
codeGenerator(seachdata)
.then((res) => {
- const { data } = res;
- this.showGenerate = false;
- if (row.genType === "1") {
- this.msgSuccess("成功生成到自定义路径:" + row.genPath);
+ const { data } = res
+ this.showGenerate = false
+ if (row.genType === '1') {
+ this.msgSuccess('成功生成到自定义路径')
} else {
- this.msgSuccess("恭喜你,代码生成完成!");
- this.download(data.path);
+ this.msgSuccess('恭喜你,代码生成完成!')
+ this.download(data.path)
}
- pageLoading.close();
+ pageLoading.close()
})
.catch((erre) => {
- pageLoading.close();
- });
+ pageLoading.close()
+ })
} else {
- return false;
+ return false
}
- });
+ })
},
cancel() {
- this.showGenerate = false;
- this.currentSelected = {};
+ this.showGenerate = false
+ this.currentSelected = {}
},
/** 重置按钮操作 */
resetQuery() {
- this.resetForm("queryParams");
- this.handleSearch();
+ this.resetForm('queryParams')
+ this.handleSearch()
},
/** 打开导入表弹窗 */
openImportTable() {
- this.$refs.import.show();
+ this.$refs.import.show()
},
handleDelete(row) {
- const tableIds = row.tableId || this.tableIds;
- this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
+ const tableIds = row.tableId || this.tableIds
+ this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
})
.then(() => {
delTable(tableIds.toString()).then((res) => {
if (res.code == 200) {
- this.msgSuccess("删除成功");
+ this.msgSuccess('删除成功')
- this.handleSearch();
+ this.handleSearch()
}
- });
+ })
})
.catch(() => {
this.$message({
- type: "info",
- message: "已取消删除",
- });
- });
+ type: 'info',
+ message: '已取消删除'
+ })
+ })
},
/** 复制代码成功 */
clipboardSuccess() {
- this.msgSuccess("复制成功");
+ this.msgSuccess('复制成功')
},
// 多选框选中数据
handleSelectionChange(section) {
- this.tableIds = section.map((item) => item.tableId);
- this.multiple = !section.length;
- console.log(this.tableIds);
+ this.tableIds = section.map((item) => item.tableId)
+ this.multiple = !section.length
+ console.log(this.tableIds)
},
/** 高亮显示 */
highlightedCode(code, key) {
// var language = key.substring(key.lastIndexOf(".") , key.length)
- const result = hljs.highlightAuto(code || "");
- return result.value || " ";
+ const result = hljs.highlightAuto(code || '')
+ return result.value || ' '
},
// 同步代码
handleSynchDb(row) {
- const tableName = row.tableName;
+ const tableName = row.tableName
this.$confirm('确认要强制同步"' + tableName + '"表结构吗?')
- .then(function () {
- return synchDb(row.tableId, { tableName, dbName: row.dbName });
+ .then(function() {
+ return synchDb(row.tableId, { tableName, dbName: row.dbName })
})
.then(() => {
- this.msgSuccess("同步成功");
+ this.msgSuccess('同步成功')
})
- .catch(() => {});
- },
- },
-};
+ .catch(() => {})
+ }
+ }
+}
diff --git a/ZR.Vue3/.editorconfig b/ZR.Vue3/.editorconfig
new file mode 100644
index 0000000..7034f9b
--- /dev/null
+++ b/ZR.Vue3/.editorconfig
@@ -0,0 +1,22 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 设置字符集
+charset = utf-8
+# 缩进风格,可选space、tab
+indent_style = space
+# 缩进的空格数
+indent_size = 2
+# 结尾换行符,可选lf、cr、crlf
+end_of_line = lf
+# 在文件结尾插入新行
+insert_final_newline = true
+# 删除一行中的前后空格
+trim_trailing_whitespace = true
+
+# 匹配md结尾的文件
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/ZR.Vue3/.env.development b/ZR.Vue3/.env.development
new file mode 100644
index 0000000..68ab4bc
--- /dev/null
+++ b/ZR.Vue3/.env.development
@@ -0,0 +1,14 @@
+# 开发环境配置
+ENV = 'development'
+
+# 页面标题
+VITE_APP_TITLE = 'ZRAdmin.NET后台管理'
+
+# 开发环境
+VITE_APP_BASE_API = '/dev-api'
+
+# 路由前缀
+VITE_APP_ROUTER_PREFIX = '/'
+
+# 默认上传地址
+VITE_APP_UPLOAD_URL = '/Common/UploadFile'
\ No newline at end of file
diff --git a/ZR.Vue3/.env.production b/ZR.Vue3/.env.production
new file mode 100644
index 0000000..4e0e082
--- /dev/null
+++ b/ZR.Vue3/.env.production
@@ -0,0 +1,14 @@
+# 生产环境配置
+ENV = 'production'
+
+# 页面标题
+VITE_APP_TITLE = 'ZRAdmin.NET后台管理'
+
+# 生产环境
+VITE_APP_BASE_API = '/prod-api'
+
+# 路由前缀
+VITE_APP_ROUTER_PREFIX = '/'
+
+# 默认上传地址
+VITE_APP_UPLOAD_URL = '/Common/UploadFile'
diff --git a/ZR.Vue3/.env.staging b/ZR.Vue3/.env.staging
new file mode 100644
index 0000000..29d4dc2
--- /dev/null
+++ b/ZR.Vue3/.env.staging
@@ -0,0 +1,17 @@
+# 测试环境配置
+ENV = 'staging'
+
+# 页面标题
+VITE_APP_TITLE = 'ZRAdmin.NET后台管理'
+
+# 测试环境
+VITE_APP_BASE_API = '/stage-api'
+
+# 路由前缀
+VITE_APP_ROUTER_PREFIX = '/'
+
+# 默认上传地址
+VITE_APP_UPLOAD_URL = '/Common/UploadFile'
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
\ No newline at end of file
diff --git a/ZR.Vue3/.gitignore b/ZR.Vue3/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/ZR.Vue3/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/ZR.Vue3/.jsbeautifyrc b/ZR.Vue3/.jsbeautifyrc
new file mode 100644
index 0000000..d79fae6
--- /dev/null
+++ b/ZR.Vue3/.jsbeautifyrc
@@ -0,0 +1,12 @@
+{
+ "brace_style": "none,preserve-inline",
+ "indent_size": 2,
+ "indent_char": " ",
+ "jslint_happy": true,
+ "unformatted": [
+ ""
+ ],
+ "css": {
+ "indent_size": 2
+ }
+}
\ No newline at end of file
diff --git a/ZR.Vue3/.prettierrc b/ZR.Vue3/.prettierrc
new file mode 100644
index 0000000..c3481a7
--- /dev/null
+++ b/ZR.Vue3/.prettierrc
@@ -0,0 +1,4 @@
+{
+ "singleQuote": true,
+ "semi": false
+}
\ No newline at end of file
diff --git a/ZR.Vue3/LICENSE b/ZR.Vue3/LICENSE
new file mode 100644
index 0000000..c9d9dc2
--- /dev/null
+++ b/ZR.Vue3/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 791736813@qq.com zr
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/ZR.Vue3/README.md b/ZR.Vue3/README.md
new file mode 100644
index 0000000..3cce63f
--- /dev/null
+++ b/ZR.Vue3/README.md
@@ -0,0 +1,89 @@
+
ZRAdmin.NET后台管理系统
+
+
+
+
+
+
+## 🍟概述
+* 本项目适合有一定vue基础的开发人员
+* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
+* 配套后端代码仓库地址[ZRAdmin-Vue](https://gitee.com/izory/ZrAdminNetCore/) 版本。
+* 前端采用Vue3.0、Element UI Plus。
+* 支持加载动态权限菜单,多方式轻松权限控制
+* 七牛云通用云产品优惠券:[点我进入](https://s.qiniu.com/FzEfay)。
+* 腾讯云秒杀场:[点我进入](https://curl.qcloud.com/4yEoRquq)。
+* 腾讯云优惠券:[点我领取](https://curl.qcloud.com/5J4nag8D)。
+
+```
+如果对您有帮助,您可以点右上角 “Star” 收藏一下 ,这样作者才有继续免费下去的动力,谢谢!~
+```
+
+## 🍿在线体验
+- 官方文档:http://www.izhaorui.cn/doc
+- 体验地址:http://www.izhaorui.cn/admin
+- 管理员:admin
+- 密 码:123456
+
+```
+由于是个人项目,资金有限,体验服是低配,请大家爱惜,轻戳,不胜感激!!!
+```
+## 🍁前端运行
+
+```bash
+# 克隆项目
+git clone https://gitee.com/izory/ZrAdminNetCore
+
+# 进入项目目录
+cd ZR.vue3
+
+# 安装依赖
+yarn --registry=https://registry.npm.taobao.org
+
+# 启动服务
+yarn dev
+
+# 构建测试环境 yarn build:stage
+# 构建生产环境 yarn build:prod
+# 前端访问地址 http://localhost:8887
+```
+
+
+## 🍖内置功能
+
+1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
+2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现。
+3. 岗位管理:配置系统用户所属担任职务。
+4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
+5. 角色管理:角色菜单权限分配。
+6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
+6. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
+7. 登录日志:系统登录日志记录查询包含登录异常。
+8. 系统接口:使用swagger生成相关api接口文档。
+9. 参数设置:常用参数配置
+
+## 计划
+- [ ] 服务监控
+- [ ] 代码生成
+- [ ] 文章管理
+- [ ] 任务系统
+- [ ] 控制台
+
+## 🎉优势
+
+1. 前台系统不用编写登录、授权、认证模块;只负责编写业务模块即可
+2. 后台系统无需任何二次开发,直接发布即可使用
+3. 前台与后台系统分离,分别为不同的系统(域名可独立)
+4. 全局异常统一处理
+5. 自定义的代码生成功能
+
+## 💐 特别鸣谢
+- 👉Ruoyi.vue:[Ruoyi](http://www.ruoyi.vip/)
+
+## 🎀捐赠
+如果这个项目对您有所帮助,请扫下方二维码就当打发要饭的吧。
+
+
+## 源码地址
+- [Gitee](https://gitee.com/izory/ZrAdminNetCore/)
+- [Github](https://github.com/izhaorui/ZrAdmin.NET/)
\ No newline at end of file
diff --git a/ZR.Vue3/bat/build.bat b/ZR.Vue3/bat/build.bat
new file mode 100644
index 0000000..ecbb454
--- /dev/null
+++ b/ZR.Vue3/bat/build.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] Weḅdistļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn build:prod
+
+pause
\ No newline at end of file
diff --git a/ZR.Vue3/bat/package.bat b/ZR.Vue3/bat/package.bat
new file mode 100644
index 0000000..965883a
--- /dev/null
+++ b/ZR.Vue3/bat/package.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] װWeḅnode_modulesļ
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn --registry=https://registry.npm.taobao.org
+
+pause
\ No newline at end of file
diff --git a/ZR.Vue3/bat/run-web.bat b/ZR.Vue3/bat/run-web.bat
new file mode 100644
index 0000000..d2fe397
--- /dev/null
+++ b/ZR.Vue3/bat/run-web.bat
@@ -0,0 +1,12 @@
+@echo off
+echo.
+echo [Ϣ] ʹ Vite Web ̡
+echo.
+
+%~d0
+cd %~dp0
+
+cd ..
+yarn dev
+
+pause
\ No newline at end of file
diff --git a/ZR.Vue3/html/ie.html b/ZR.Vue3/html/ie.html
new file mode 100644
index 0000000..052ffcd
--- /dev/null
+++ b/ZR.Vue3/html/ie.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
请升级您的浏览器
+
+
+
+
+
+
+
请升级您的浏览器,以便我们更好的为您提供服务!
+
您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+
+
请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束
+
自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+
+
您可以选择更先进的浏览器
+
推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/index.html b/ZR.Vue3/index.html
new file mode 100644
index 0000000..db62c6a
--- /dev/null
+++ b/ZR.Vue3/index.html
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
ZRAdmin.NET管理系统
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/package.json b/ZR.Vue3/package.json
new file mode 100644
index 0000000..5c1b976
--- /dev/null
+++ b/ZR.Vue3/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "zr",
+ "version": "1.0.0",
+ "description": "ZRAdmin.NET管理系统",
+ "author": "ZR",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite",
+ "build:prod": "vite build",
+ "build:stage": "vite build --mode staging",
+ "preview": "vite preview"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/izory/ZrAdminNetCore"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "0.2.4",
+ "axios": "0.24.0",
+ "clipboard": "^2.0.10",
+ "echarts": "5.2.2",
+ "element-plus": "^2.1.8",
+ "file-saver": "2.0.5",
+ "fuse.js": "6.4.6",
+ "js-cookie": "3.0.1",
+ "jsencrypt": "3.2.1",
+ "mavon-editor": "^2.10.4",
+ "nprogress": "0.2.0",
+ "quill": "^1.3.7",
+ "vue": "3.2.26",
+ "vue-cropper": "1.0.2",
+ "vue-router": "4.0.12",
+ "vuex": "4.0.2"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "1.9.4",
+ "@vue/compiler-sfc": "3.2.22",
+ "sass": "1.45.0",
+ "unplugin-auto-import": "0.5.3",
+ "vite": "2.6.14",
+ "vite-plugin-compression": "0.3.6",
+ "vite-plugin-svg-icons": "1.0.5",
+ "vite-plugin-vue-setup-extend": "0.1.0"
+ }
+}
diff --git a/ZR.Vue3/public/favicon.ico b/ZR.Vue3/public/favicon.ico
new file mode 100644
index 0000000..fcb6999
Binary files /dev/null and b/ZR.Vue3/public/favicon.ico differ
diff --git a/ZR.Vue3/src/App.vue b/ZR.Vue3/src/App.vue
new file mode 100644
index 0000000..98240ae
--- /dev/null
+++ b/ZR.Vue3/src/App.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/ZR.Vue3/src/api/common.js b/ZR.Vue3/src/api/common.js
new file mode 100644
index 0000000..c57228f
--- /dev/null
+++ b/ZR.Vue3/src/api/common.js
@@ -0,0 +1,23 @@
+import request from '@/utils/request'
+
+export function upload(data) {
+ return request({
+ url: '/common/UploadFile',
+ method: 'POST',
+ data: data,
+ headers: { "Content-Type": "multipart/form-data" },
+ })
+}
+
+/**
+ * 发送邮件
+ * @param {*} data
+ * @returns
+ */
+export function sendEmail(data) {
+ return request({
+ url: '/common/SendEmail',
+ method: 'POST',
+ data: data,
+ })
+}
diff --git a/ZR.Vue3/src/api/login.js b/ZR.Vue3/src/api/login.js
new file mode 100644
index 0000000..6fd2f99
--- /dev/null
+++ b/ZR.Vue3/src/api/login.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, code, uuid) {
+ const data = {
+ username,
+ password,
+ code,
+ uuid
+ }
+ return request({
+ url: '/login',
+ 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',
+ method: 'get'
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/api/monitor/cache.js b/ZR.Vue3/src/api/monitor/cache.js
new file mode 100644
index 0000000..59d3505
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/cache.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询缓存详细
+export function getCache() {
+ return request({
+ url: '/monitor/cache',
+ method: 'get'
+ })
+}
diff --git a/ZR.Vue3/src/api/monitor/job.js b/ZR.Vue3/src/api/monitor/job.js
new file mode 100644
index 0000000..09107ff
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/job.js
@@ -0,0 +1,115 @@
+import request from '@/utils/request'
+
+export function queryTasks(data) {
+ return request({
+ url: '/system/tasks/list',
+ method: 'get',
+ data
+ })
+}
+
+export function getTasks(id) {
+ return request({
+ url: '/system/tasks/get?id=' + id,
+ method: 'get'
+ })
+}
+
+/**
+ *
+ * 获取所有任务
+ * @returns
+ */
+export function getAllTasks() {
+ return request({
+ url: '/system/tasks/getAll',
+ method: 'get'
+ })
+}
+
+/**
+ * 创建任务
+ * @param {*} data
+ * @returns
+ */
+export function createTasks(data) {
+ return request({
+ url: '/system/tasks/create',
+ method: 'post',
+ data
+ })
+}
+
+/**
+ * 更新任务
+ * @param {*} data
+ * @returns
+ */
+export function updateTasks(data) {
+ return request({
+ url: '/system/tasks/update',
+ method: 'post',
+ data
+ })
+}
+
+/**
+ * 删除任务
+ * @param {*} id
+ * @returns
+ */
+export function deleteTasks(id) {
+ return request({
+ url: '/system/tasks/delete?id=' + id,
+ method: 'delete'
+ })
+}
+
+/**
+ * 启动任务
+ * @param {*} id
+ * @returns
+ */
+export function startTasks(id) {
+ return request({
+ url: '/system/tasks/start?id=' + id,
+ method: 'get'
+ })
+}
+
+/**
+ * 停止任务
+ * @param {*} id
+ * @returns
+ */
+export function stopTasks(id) {
+ return request({
+ url: '/system/tasks/stop?id=' + id,
+ method: 'get'
+ })
+}
+
+/**
+ * 运行一次
+ * @param {*} id
+ * @returns
+ */
+export function runTasks(id) {
+ return request({
+ url: '/system/tasks/run?id=' + id,
+ method: 'get'
+ })
+}
+/**
+ * 导出
+ * @returns
+ */
+export function exportTasks() {
+ return request({
+ url: '/system/tasks/export',
+ method: 'get'
+ })
+}
+
+
+export default { queryTasks, getTasks, getAllTasks, createTasks, updateTasks, deleteTasks, startTasks, stopTasks, runTasks, exportTasks }
diff --git a/ZR.Vue3/src/api/monitor/jobLog.js b/ZR.Vue3/src/api/monitor/jobLog.js
new file mode 100644
index 0000000..be1fffd
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/jobLog.js
@@ -0,0 +1,35 @@
+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'
+ })
+}
+
+// 导出调度日志
+export function exportJobLog(query) {
+ return request({
+ url: '/monitor/jobLog/export',
+ method: 'get',
+ params: query
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/api/monitor/logininfor.js b/ZR.Vue3/src/api/monitor/logininfor.js
new file mode 100644
index 0000000..7ff412d
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/logininfor.js
@@ -0,0 +1,35 @@
+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 cleanLogininfor() {
+ return request({
+ url: '/monitor/logininfor/clean',
+ method: 'delete'
+ })
+}
+
+// 导出登录日志
+export function exportLogininfor(query) {
+ return request({
+ url: '/monitor/logininfor/export',
+ method: 'get',
+ params: query
+ })
+}
diff --git a/ZR.Vue3/src/api/monitor/online.js b/ZR.Vue3/src/api/monitor/online.js
new file mode 100644
index 0000000..bd22137
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/online.js
@@ -0,0 +1,18 @@
+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/ZR.Vue3/src/api/monitor/operlog.js b/ZR.Vue3/src/api/monitor/operlog.js
new file mode 100644
index 0000000..07e27ab
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/operlog.js
@@ -0,0 +1,35 @@
+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'
+ })
+}
+
+// 导出操作日志
+export function exportOperlog(query) {
+ return request({
+ url: '/monitor/operlog/export',
+ method: 'get',
+ params: query
+ })
+}
diff --git a/ZR.Vue3/src/api/monitor/server.js b/ZR.Vue3/src/api/monitor/server.js
new file mode 100644
index 0000000..bdcc62b
--- /dev/null
+++ b/ZR.Vue3/src/api/monitor/server.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 查询服务器详细
+export function getServer() {
+ return request({
+ url: '/monitor/server',
+ method: 'get'
+ })
+}
diff --git a/ZR.Vue3/src/api/system/article.js b/ZR.Vue3/src/api/system/article.js
new file mode 100644
index 0000000..05fb94d
--- /dev/null
+++ b/ZR.Vue3/src/api/system/article.js
@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+// 查询列表
+export function listArticle(query) {
+ return request({
+ url: '/Article/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询最新列表
+export function listNewArticle(query) {
+ return request({
+ url: '/Article/newList',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询详细
+export function getArticle(Id) {
+ return request({
+ url: '/Article/' + Id,
+ method: 'get',
+ })
+}
+
+// 新增
+export function addArticle(data) {
+ return request({
+ url: '/Article/add',
+ method: 'post',
+ data: data,
+ })
+}
+
+// 修改
+export function updateArticle(data) {
+ return request({
+ url: '/Article/edit',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除菜单
+export function delArticle(id) {
+ return request({
+ url: '/Article/' + id,
+ method: 'delete'
+ })
+}
+// 查询菜单目录
+export function listArticleCategory() {
+ return request({
+ url: '/Article/CategoryList',
+ method: 'get'
+ })
+}
+// 查询菜单目录树
+export function listArticleCategoryTree(){
+ return request({
+ url: '/Article/CategoryTreeList',
+ menubar: 'get'
+ })
+}
diff --git a/ZR.Vue3/src/api/system/config.js b/ZR.Vue3/src/api/system/config.js
new file mode 100644
index 0000000..3633ba1
--- /dev/null
+++ b/ZR.Vue3/src/api/system/config.js
@@ -0,0 +1,69 @@
+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'
+ })
+}
+
+// 导出参数
+// export function exportConfig(query) {
+// return request({
+// url: '/system/config/export',
+// method: 'get',
+// params: query
+// })
+// }
diff --git a/ZR.Vue3/src/api/system/dept.js b/ZR.Vue3/src/api/system/dept.js
new file mode 100644
index 0000000..2804676
--- /dev/null
+++ b/ZR.Vue3/src/api/system/dept.js
@@ -0,0 +1,68 @@
+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 treeselect() {
+ return request({
+ url: '/system/dept/treeselect',
+ method: 'get'
+ })
+}
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeselect(roleId) {
+ return request({
+ url: '/system/dept/roleDeptTreeselect/' + roleId,
+ 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
diff --git a/ZR.Vue3/src/api/system/dict/data.js b/ZR.Vue3/src/api/system/dict/data.js
new file mode 100644
index 0000000..0351dd6
--- /dev/null
+++ b/ZR.Vue3/src/api/system/dict/data.js
@@ -0,0 +1,69 @@
+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/info/' + dictCode,
+ method: 'get'
+ })
+}
+
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType) {
+ if (typeof (dictType) === "object") {
+ return request({
+ url: '/system/dict/data/types',
+ data: dictType,
+ method: 'post'
+ })
+ } else {
+ 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'
+ })
+}
+
+// 导出字典数据
+export function exportData(query) {
+ return request({
+ url: '/system/dict/data/export',
+ method: 'get',
+ params: query
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/api/system/dict/type.js b/ZR.Vue3/src/api/system/dict/type.js
new file mode 100644
index 0000000..27ae18f
--- /dev/null
+++ b/ZR.Vue3/src/api/system/dict/type.js
@@ -0,0 +1,69 @@
+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/edit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改字典类型
+export function updateType(data) {
+ return request({
+ url: '/system/dict/type/edit',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除字典类型
+export function delType(dictId) {
+ return request({
+ url: '/system/dict/type/' + dictId,
+ method: 'delete'
+ })
+}
+
+// 清理参数缓存
+export function clearCache() {
+ return request({
+ url: '/system/dict/type/clearCache',
+ method: 'delete'
+ })
+}
+
+// 导出字典类型
+export function exportType(query) {
+ return request({
+ url: '/system/dict/type/export',
+ method: 'get',
+ params: query
+ })
+}
+
+// 获取字典选择框列表
+export function optionselect() {
+ return request({
+ url: '/system/dict/type/optionselect',
+ method: 'get'
+ })
+}
diff --git a/ZR.Vue3/src/api/system/login.js b/ZR.Vue3/src/api/system/login.js
new file mode 100644
index 0000000..9adfb26
--- /dev/null
+++ b/ZR.Vue3/src/api/system/login.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 登录方法
+export function login(username, password, code, uuid) {
+ const data = {
+ username,
+ password,
+ code,
+ uuid
+ }
+ return request({
+ url: '/login',
+ 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',
+ method: 'get'
+ })
+}
diff --git a/ZR.Vue3/src/api/system/menu.js b/ZR.Vue3/src/api/system/menu.js
new file mode 100644
index 0000000..124538b
--- /dev/null
+++ b/ZR.Vue3/src/api/system/menu.js
@@ -0,0 +1,78 @@
+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 const addMenu = (data) => {
+ return request({
+ url: '/system/menu/add',
+ method: 'put',
+ data: data,
+ })
+}
+
+// 修改菜单
+export function updateMenu(data) {
+ return request({
+ url: '/system/Menu/edit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 删除菜单
+export function delMenu(menuId) {
+ return request({
+ url: '/system/Menu/' + menuId,
+ method: 'delete'
+ })
+}
+
+//排序
+export function changeMenuSort(data) {
+ return request({
+ url: '/system/Menu/ChangeSort',
+ method: 'post',
+ data: data
+ })
+}
+
+// 获取路由
+export const getRouters = (query) => {
+ return request({
+ url: '/getRouters',
+ method: 'get',
+ params: query
+ })
+}
diff --git a/ZR.Vue3/src/api/system/notice.js b/ZR.Vue3/src/api/system/notice.js
new file mode 100644
index 0000000..fc80afb
--- /dev/null
+++ b/ZR.Vue3/src/api/system/notice.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 导航栏查询公告列表
+export function queryNotice(query) {
+ return request({
+ url: '/system/notice/queryNotice',
+ method: 'get',
+ params: query
+ })
+}
+
+// 查询公告列表
+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'
+ })
+}
+
+// 发送通知公告
+export function sendNotice(noticeId) {
+ return request({
+ url: '/system/notice/send/' + noticeId,
+ method: 'PUT'
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/api/system/post.js b/ZR.Vue3/src/api/system/post.js
new file mode 100644
index 0000000..434cd35
--- /dev/null
+++ b/ZR.Vue3/src/api/system/post.js
@@ -0,0 +1,53 @@
+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'
+ })
+}
+
+// 导出岗位
+export function exportPost(query) {
+ return request({
+ url: '/system/post/export',
+ method: 'get',
+ params: query
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/api/system/role.js b/ZR.Vue3/src/api/system/role.js
new file mode 100644
index 0000000..25b8d1e
--- /dev/null
+++ b/ZR.Vue3/src/api/system/role.js
@@ -0,0 +1,75 @@
+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 const addRole = (data) => {
+ return request({
+ url: '/system/role/edit',
+ method: 'post',
+ data: data,
+ })
+}
+
+// 修改角色
+export function updateRole(data) {
+ return request({
+ url: '/system/role/edit',
+ 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 exportRole(query) {
+ return request({
+ url: '/system/role/export',
+ method: 'get',
+ params: query
+ })
+}
diff --git a/ZR.Vue3/src/api/system/user.js b/ZR.Vue3/src/api/system/user.js
new file mode 100644
index 0000000..0d3cf9b
--- /dev/null
+++ b/ZR.Vue3/src/api/system/user.js
@@ -0,0 +1,128 @@
+import request from '@/utils/request'
+import { praseStrZero } 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/' + praseStrZero(userId),
+ method: 'get'
+ })
+}
+
+// 新增用户
+export function addUser(data) {
+ return request({
+ url: '/system/user/edit',
+ method: 'post',
+ data: data
+ })
+}
+
+// 修改用户
+export function updateUser(data) {
+ return request({
+ url: '/system/user/edit',
+ method: 'put',
+ data: data
+ })
+}
+
+// 删除用户
+export function delUser(userId) {
+ return request({
+ url: '/system/user/' + userId,
+ method: 'delete'
+ })
+}
+
+// 导出用户
+export function exportUser(query) {
+ return request({
+ url: '/system/User/export',
+ method: 'get',
+ params: query
+ })
+}
+
+// 用户密码重置
+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 importTemplate() {
+ return request({
+ url: '/system/user/importTemplate',
+ method: 'get',
+ responseType: 'blob'//1.首先设置responseType对象格式为 blob:
+ })
+}
diff --git a/ZR.Vue3/src/api/system/userRoles.js b/ZR.Vue3/src/api/system/userRoles.js
new file mode 100644
index 0000000..d5d94b3
--- /dev/null
+++ b/ZR.Vue3/src/api/system/userRoles.js
@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+
+// 查询角色用户
+export function getRoleUsers(query) {
+ return request({
+ url: '/system/userRole/list',
+ method: 'get',
+ params: query,
+ })
+}
+
+// 添加角色用户
+export function createRoleUsers(data) {
+ return request({
+ url: '/system/userRole/create',
+ method: 'post',
+ data
+ })
+}
+// 删除角色用户
+export function deleteRoleUsers(data) {
+ return request({
+ url: '/system/userRole/delete',
+ method: 'post',
+ data
+ })
+}
+// 查询角色未添加用户列表
+export function getExcludeUsers(query) {
+ return request({
+ url: '/system/userRole/getExcludeUsers',
+ method: 'get',
+ params: query,
+ })
+}
+
+// export default { getRoleUsers, getExcludeUsers }
diff --git a/ZR.Vue3/src/api/tool/file.js b/ZR.Vue3/src/api/tool/file.js
new file mode 100644
index 0000000..03b64a8
--- /dev/null
+++ b/ZR.Vue3/src/api/tool/file.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+/**
+* 文件存储分页查询
+* @param {查询条件} data
+*/
+export function listSysfile(query) {
+ return request({
+ url: 'tool/file/list',
+ method: 'get',
+ params: query,
+ })
+}
+
+/**
+* 新增文件存储
+* @param data
+*/
+export function addSysfile(data) {
+ return request({
+ url: 'tool/file',
+ method: 'post',
+ data: data,
+ })
+}
+
+/**
+* 修改文件存储
+* @param data
+*/
+export function updateSysfile(data) {
+ return request({
+ url: 'tool/file',
+ method: 'PUT',
+ data: data,
+ })
+}
+
+/**
+* 获取文件存储详情
+* @param {Id}
+*/
+export function getSysfile(id) {
+ return request({
+ url: 'tool/file/' + id,
+ method: 'get'
+ })
+}
+
+/**
+* 删除文件存储
+* @param {主键} pid
+*/
+export function delSysfile(pid) {
+ return request({
+ url: 'tool/file/' + pid,
+ method: 'delete'
+ })
+}
+
+// 导出文件存储
+export function exportSysfile(query) {
+ return request({
+ url: 'tool/file/export',
+ method: 'get',
+ params: query
+ })
+}
+
diff --git a/ZR.Vue3/src/api/tool/gen.js b/ZR.Vue3/src/api/tool/gen.js
new file mode 100644
index 0000000..b28fe8e
--- /dev/null
+++ b/ZR.Vue3/src/api/tool/gen.js
@@ -0,0 +1,103 @@
+import request from '@/utils/request';
+
+/**
+ * 获取数据库
+ */
+export function codeGetDBList() {
+ return request({
+ url: 'tool/gen/getDbList',
+ method: 'get',
+ })
+}
+/**
+ * 获取数据库表
+ */
+export function listDbTable(data) {
+ return request({
+ url: 'tool/gen/getTableList',
+ method: 'get',
+ params: data,
+ })
+}
+/**
+ * 生成代码
+ */
+export async function codeGenerator(data) {
+ return await request({
+ url: 'tool/gen/genCode',
+ method: 'POST',
+ data: data,
+ })
+}
+
+/**
+ * 获取表格列信息
+ * @param {*} data
+ * @returns
+ */
+export function queryColumnInfo(tableId) {
+ return request({
+ url: 'tool/gen/Column/' + tableId,
+ method: 'GET',
+ })
+}
+
+// 查询生成表数据
+export function listTable(params) {
+ return request({
+ url: 'tool/gen/list',
+ method: 'get',
+ params: params
+ })
+}
+
+// 查询表详细信息
+export function getGenTable(tableId) {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'get'
+ })
+}
+
+// 导入表
+export function importTable(data) {
+ return request({
+ url: '/tool/gen/importTable',
+ method: 'post',
+ params: data
+ })
+}
+// 删除表数据
+export function delTable(tableId) {
+ return request({
+ url: '/tool/gen/' + tableId,
+ method: 'delete'
+ })
+}
+
+// 修改代码生成表信息
+export function updateGenTable(data) {
+ return request({
+ url: '/tool/gen/',
+ method: 'put',
+ data: data
+ })
+}
+
+// 预览生成代码
+export function previewTable(tableId) {
+ return request({
+ url: '/tool/gen/preview/' + tableId,
+ method: 'post',
+ // data: data
+ })
+}
+
+// 同步数据库
+export function synchDb(tableId, data) {
+ return request({
+ url: '/tool/gen/synchDb/' + tableId,
+ method: 'get',
+ params: data
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/401_images/401.gif b/ZR.Vue3/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
Binary files /dev/null and b/ZR.Vue3/src/assets/401_images/401.gif differ
diff --git a/ZR.Vue3/src/assets/404_images/404.png b/ZR.Vue3/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
Binary files /dev/null and b/ZR.Vue3/src/assets/404_images/404.png differ
diff --git a/ZR.Vue3/src/assets/404_images/404_cloud.png b/ZR.Vue3/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
Binary files /dev/null and b/ZR.Vue3/src/assets/404_images/404_cloud.png differ
diff --git a/ZR.Vue3/src/assets/icons/svg/404.svg b/ZR.Vue3/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/Steve-Jobs.svg b/ZR.Vue3/src/assets/icons/svg/Steve-Jobs.svg
new file mode 100644
index 0000000..53843e2
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/Steve-Jobs.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/alipay.svg b/ZR.Vue3/src/assets/icons/svg/alipay.svg
new file mode 100644
index 0000000..9138981
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/alipay.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/anq.svg b/ZR.Vue3/src/assets/icons/svg/anq.svg
new file mode 100644
index 0000000..a466608
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/anq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/app.svg b/ZR.Vue3/src/assets/icons/svg/app.svg
new file mode 100644
index 0000000..0796da3
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/app.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/backup.svg b/ZR.Vue3/src/assets/icons/svg/backup.svg
new file mode 100644
index 0000000..a3272a4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/backup.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/bug.svg b/ZR.Vue3/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/build.svg b/ZR.Vue3/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/button.svg b/ZR.Vue3/src/assets/icons/svg/button.svg
new file mode 100644
index 0000000..904fddc
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/button.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/cascader.svg b/ZR.Vue3/src/assets/icons/svg/cascader.svg
new file mode 100644
index 0000000..e256024
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/cascader.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/chain.svg b/ZR.Vue3/src/assets/icons/svg/chain.svg
new file mode 100644
index 0000000..ed3317f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/chain.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/chart.svg b/ZR.Vue3/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/checkbox.svg b/ZR.Vue3/src/assets/icons/svg/checkbox.svg
new file mode 100644
index 0000000..013fd3a
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/checkbox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/clipboard.svg b/ZR.Vue3/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/code.svg b/ZR.Vue3/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/codeConsole.svg b/ZR.Vue3/src/assets/icons/svg/codeConsole.svg
new file mode 100644
index 0000000..672ec6e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/codeConsole.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/color.svg b/ZR.Vue3/src/assets/icons/svg/color.svg
new file mode 100644
index 0000000..44a81aa
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/color.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/component.svg b/ZR.Vue3/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..29c3458
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/dashboard.svg b/ZR.Vue3/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/database.svg b/ZR.Vue3/src/assets/icons/svg/database.svg
new file mode 100644
index 0000000..7fbad9b
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/date-range.svg b/ZR.Vue3/src/assets/icons/svg/date-range.svg
new file mode 100644
index 0000000..fda571e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/date-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/date.svg b/ZR.Vue3/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..52dc73e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/deploy.svg b/ZR.Vue3/src/assets/icons/svg/deploy.svg
new file mode 100644
index 0000000..f4a1c56
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/deploy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/dept.svg b/ZR.Vue3/src/assets/icons/svg/dept.svg
new file mode 100644
index 0000000..894e4bf
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/dept.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/develop.svg b/ZR.Vue3/src/assets/icons/svg/develop.svg
new file mode 100644
index 0000000..e189223
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/develop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/dict.svg b/ZR.Vue3/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/dictionary.svg b/ZR.Vue3/src/assets/icons/svg/dictionary.svg
new file mode 100644
index 0000000..6e83c43
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/dictionary.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/doc.svg b/ZR.Vue3/src/assets/icons/svg/doc.svg
new file mode 100644
index 0000000..9160de8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/doc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/documentation.svg b/ZR.Vue3/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/download.svg b/ZR.Vue3/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/drag.svg b/ZR.Vue3/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/druid.svg b/ZR.Vue3/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/edit.svg b/ZR.Vue3/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/education.svg b/ZR.Vue3/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/email.svg b/ZR.Vue3/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/error.svg b/ZR.Vue3/src/assets/icons/svg/error.svg
new file mode 100644
index 0000000..fd935da
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/error.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/example.svg b/ZR.Vue3/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/excel.svg b/ZR.Vue3/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/exit-fullscreen.svg b/ZR.Vue3/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/eye-open.svg b/ZR.Vue3/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/eye.svg b/ZR.Vue3/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/form.svg b/ZR.Vue3/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/fullscreen.svg b/ZR.Vue3/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/fwb.svg b/ZR.Vue3/src/assets/icons/svg/fwb.svg
new file mode 100644
index 0000000..59933fc
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/fwb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/github.svg b/ZR.Vue3/src/assets/icons/svg/github.svg
new file mode 100644
index 0000000..db0a0d4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/gonggao.svg b/ZR.Vue3/src/assets/icons/svg/gonggao.svg
new file mode 100644
index 0000000..22aed08
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/gonggao.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/guide.svg b/ZR.Vue3/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..b271001
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/icon.svg b/ZR.Vue3/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/icon1.svg b/ZR.Vue3/src/assets/icons/svg/icon1.svg
new file mode 100644
index 0000000..82fbdd9
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/icon1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/image.svg b/ZR.Vue3/src/assets/icons/svg/image.svg
new file mode 100644
index 0000000..16d572f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/image.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/index.svg b/ZR.Vue3/src/assets/icons/svg/index.svg
new file mode 100644
index 0000000..fdb3826
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/index.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/input.svg b/ZR.Vue3/src/assets/icons/svg/input.svg
new file mode 100644
index 0000000..ab91381
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/input.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/international.svg b/ZR.Vue3/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/ipvisits.svg b/ZR.Vue3/src/assets/icons/svg/ipvisits.svg
new file mode 100644
index 0000000..4ca473d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/ipvisits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/java.svg b/ZR.Vue3/src/assets/icons/svg/java.svg
new file mode 100644
index 0000000..e2effbb
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/java.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/job.svg b/ZR.Vue3/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/language.svg b/ZR.Vue3/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/link.svg b/ZR.Vue3/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/list.svg b/ZR.Vue3/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/lock.svg b/ZR.Vue3/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/log.svg b/ZR.Vue3/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/login.svg b/ZR.Vue3/src/assets/icons/svg/login.svg
new file mode 100644
index 0000000..cc5a854
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/login.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/logininfor.svg b/ZR.Vue3/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/markdown.svg b/ZR.Vue3/src/assets/icons/svg/markdown.svg
new file mode 100644
index 0000000..7cd6747
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/markdown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/menu.svg b/ZR.Vue3/src/assets/icons/svg/menu.svg
new file mode 100644
index 0000000..e4360a0
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/message.svg b/ZR.Vue3/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/mnt.svg b/ZR.Vue3/src/assets/icons/svg/mnt.svg
new file mode 100644
index 0000000..502a7c0
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/mnt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/money.svg b/ZR.Vue3/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/monitor.svg b/ZR.Vue3/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/nested.svg b/ZR.Vue3/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/number.svg b/ZR.Vue3/src/assets/icons/svg/number.svg
new file mode 100644
index 0000000..ad5ce9a
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/number.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/online.svg b/ZR.Vue3/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/password.svg b/ZR.Vue3/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..6c64def
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/pdf.svg b/ZR.Vue3/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/people.svg b/ZR.Vue3/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/peoples.svg b/ZR.Vue3/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/permission.svg b/ZR.Vue3/src/assets/icons/svg/permission.svg
new file mode 100644
index 0000000..c4c7409
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/permission.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/phone.svg b/ZR.Vue3/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/post.svg b/ZR.Vue3/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/qiniu.svg b/ZR.Vue3/src/assets/icons/svg/qiniu.svg
new file mode 100644
index 0000000..c2f9f8b
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/qiniu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/qq.svg b/ZR.Vue3/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/question.svg b/ZR.Vue3/src/assets/icons/svg/question.svg
new file mode 100644
index 0000000..cf75bd4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/question.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/radio.svg b/ZR.Vue3/src/assets/icons/svg/radio.svg
new file mode 100644
index 0000000..0cde345
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/radio.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/rate.svg b/ZR.Vue3/src/assets/icons/svg/rate.svg
new file mode 100644
index 0000000..aa3b14d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/rate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/redis.svg b/ZR.Vue3/src/assets/icons/svg/redis.svg
new file mode 100644
index 0000000..2f1d62d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/redis.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/role.svg b/ZR.Vue3/src/assets/icons/svg/role.svg
new file mode 100644
index 0000000..76cb18f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/role.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/row.svg b/ZR.Vue3/src/assets/icons/svg/row.svg
new file mode 100644
index 0000000..0780992
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/row.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/search.svg b/ZR.Vue3/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/select.svg b/ZR.Vue3/src/assets/icons/svg/select.svg
new file mode 100644
index 0000000..d628382
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/select.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/server.svg b/ZR.Vue3/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..ca37b00
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/shopping.svg b/ZR.Vue3/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/size.svg b/ZR.Vue3/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/skill.svg b/ZR.Vue3/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/slider.svg b/ZR.Vue3/src/assets/icons/svg/slider.svg
new file mode 100644
index 0000000..fbe4f39
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/slider.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/source.svg b/ZR.Vue3/src/assets/icons/svg/source.svg
new file mode 100644
index 0000000..1c3a038
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/source.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/sqlMonitor.svg b/ZR.Vue3/src/assets/icons/svg/sqlMonitor.svg
new file mode 100644
index 0000000..950a430
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/sqlMonitor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/star.svg b/ZR.Vue3/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/swagger.svg b/ZR.Vue3/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/switch.svg b/ZR.Vue3/src/assets/icons/svg/switch.svg
new file mode 100644
index 0000000..0ba61e3
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/switch.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/sys-tools.svg b/ZR.Vue3/src/assets/icons/svg/sys-tools.svg
new file mode 100644
index 0000000..324aa04
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/sys-tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/system.svg b/ZR.Vue3/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..dba28cf
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/system1.svg b/ZR.Vue3/src/assets/icons/svg/system1.svg
new file mode 100644
index 0000000..37b0a0a
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/system1.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/tab.svg b/ZR.Vue3/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/table.svg b/ZR.Vue3/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/textarea.svg b/ZR.Vue3/src/assets/icons/svg/textarea.svg
new file mode 100644
index 0000000..2709f29
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/textarea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/theme.svg b/ZR.Vue3/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/time-range.svg b/ZR.Vue3/src/assets/icons/svg/time-range.svg
new file mode 100644
index 0000000..13c1202
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/time-range.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/time.svg b/ZR.Vue3/src/assets/icons/svg/time.svg
new file mode 100644
index 0000000..b376e32
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/time.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/tool.svg b/ZR.Vue3/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..c813067
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/tools.svg b/ZR.Vue3/src/assets/icons/svg/tools.svg
new file mode 100644
index 0000000..aba1a40
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/tools.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/tree-table.svg b/ZR.Vue3/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/tree.svg b/ZR.Vue3/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/unlock.svg b/ZR.Vue3/src/assets/icons/svg/unlock.svg
new file mode 100644
index 0000000..1219e41
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/unlock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/upload.svg b/ZR.Vue3/src/assets/icons/svg/upload.svg
new file mode 100644
index 0000000..bae49c0
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/upload.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/user.svg b/ZR.Vue3/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/validCode.svg b/ZR.Vue3/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/visits.svg b/ZR.Vue3/src/assets/icons/svg/visits.svg
new file mode 100644
index 0000000..8425662
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/visits.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/web.svg b/ZR.Vue3/src/assets/icons/svg/web.svg
new file mode 100644
index 0000000..9c57415
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/wechat.svg b/ZR.Vue3/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/weixin.svg b/ZR.Vue3/src/assets/icons/svg/weixin.svg
new file mode 100644
index 0000000..8dbcfa5
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/weixin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/zip.svg b/ZR.Vue3/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/icons/svg/zujian.svg b/ZR.Vue3/src/assets/icons/svg/zujian.svg
new file mode 100644
index 0000000..2aba32f
--- /dev/null
+++ b/ZR.Vue3/src/assets/icons/svg/zujian.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/images/dark.svg b/ZR.Vue3/src/assets/images/dark.svg
new file mode 100644
index 0000000..f646bd7
--- /dev/null
+++ b/ZR.Vue3/src/assets/images/dark.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/images/light.svg b/ZR.Vue3/src/assets/images/light.svg
new file mode 100644
index 0000000..ab7cc08
--- /dev/null
+++ b/ZR.Vue3/src/assets/images/light.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/images/login-background.jpg b/ZR.Vue3/src/assets/images/login-background.jpg
new file mode 100644
index 0000000..3066bd1
Binary files /dev/null and b/ZR.Vue3/src/assets/images/login-background.jpg differ
diff --git a/ZR.Vue3/src/assets/images/profile.jpg b/ZR.Vue3/src/assets/images/profile.jpg
new file mode 100644
index 0000000..997732a
Binary files /dev/null and b/ZR.Vue3/src/assets/images/profile.jpg differ
diff --git a/ZR.Vue3/src/assets/images/reward.jpg b/ZR.Vue3/src/assets/images/reward.jpg
new file mode 100644
index 0000000..68fe0d3
Binary files /dev/null and b/ZR.Vue3/src/assets/images/reward.jpg differ
diff --git a/ZR.Vue3/src/assets/logo/logo.png b/ZR.Vue3/src/assets/logo/logo.png
new file mode 100644
index 0000000..9838306
Binary files /dev/null and b/ZR.Vue3/src/assets/logo/logo.png differ
diff --git a/ZR.Vue3/src/assets/styles/btn.scss b/ZR.Vue3/src/assets/styles/btn.scss
new file mode 100644
index 0000000..3590d8d
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/btn.scss
@@ -0,0 +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;
+}
diff --git a/ZR.Vue3/src/assets/styles/element-ui.scss b/ZR.Vue3/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..a0db303
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/element-ui.scss
@@ -0,0 +1,144 @@
+// 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;
+// }
+
+
+// element ui 移动端组件适配
+.el-icon {
+ vertical-align: middle;
+}
+
+@media screen and (max-width: 500px) {
+ .el-message {
+ min-width: 300px !important;
+ }
+}
+
+@media screen and (max-width: 500px) {
+ .el-message-box {
+ width: 300px !important;
+ }
+
+ .el-pagination__jump {
+ display: none !important;
+ }
+
+ .el-pagination__sizes {
+ display: none !important;
+ }
+}
+
+// dialog
+@media screen and (max-width: 500px) {
+ .el-dialog__wrapper .el-dialog {
+ width: 95% !important;
+ }
+}
+
+/** 表格更多操作下拉样式 */
+.el-table .el-dropdown-link {
+ cursor: pointer;
+ color: #409EFF;
+ margin-left: 5px;
+}
+
+.el-table .el-dropdown,
+.el-icon-arrow-down {
+ font-size: 12px;
+}
+
+//适配完毕
+
+// 隐藏picture-card 上传按钮
+.hide .el-upload--picture-card {
+ display: none;
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/styles/index.scss b/ZR.Vue3/src/assets/styles/index.scss
new file mode 100644
index 0000000..909811c
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/index.scss
@@ -0,0 +1,265 @@
+@import './variables.module.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+
+body {
+ height: 100%;
+ -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: 0 !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;
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+/** 基础通用 **/
+.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;
+}
+
+.ml {
+ margin-left: auto;
+}
+
+.mr {
+ margin-right: auto;
+}
+
+.mt {
+ margin-top: auto;
+}
+
+.mb {
+ margin-bottom: auto;
+}
+
+.el-dialog:not(.is-fullscreen) {
+ margin-top: 6vh !important;
+}
+
+.pull-right {
+ float: right !important;
+}
+
+/* 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;
+}
+.text-orange {
+ color: orangered;
+}
+
+.text-hotpink {
+ color: hotpink;
+}
+.text-green {
+ color: green;
+}
+.text-greenyellow {
+ color: greenyellow;
+}
+/* image */
+.img-circle {
+ border-radius: 50%;
+}
+
+.card-box {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-bottom: 10px;
+}
+
+.icon {
+ width: 100px;
+}
+
+.table-td-thumb {
+ width: 56px;
+}
diff --git a/ZR.Vue3/src/assets/styles/mixin.scss b/ZR.Vue3/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@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/ZR.Vue3/src/assets/styles/sidebar.scss b/ZR.Vue3/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..365646a
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/sidebar.scss
@@ -0,0 +1,235 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $base-sidebar-width;
+ position: relative;
+ }
+
+ // 改动2022年3月31日
+ .el-menu-item .el-menu-tooltip__trigger {
+ // padding: 0 !important;
+ // justify-content: space-around;
+
+ // .svg-icon {
+ // margin-right: 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 14px rgba(0, 21, 41, .10);
+ box-shadow: 2px 0 14px rgba(0, 21, 41, .10);
+
+ // 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,
+ .el-submenu__title {
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .is-active>.el-submenu__title {
+ color: $base-menu-color-active !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $base-sidebar-width !important;
+
+ &:hover {
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ & .theme-dark .nest-menu .el-submenu>.el-submenu__title,
+ & .theme-dark .el-submenu .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;
+ }
+
+ .submenu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+ }
+ }
+
+ .el-submenu {
+ overflow: hidden;
+
+ &>.el-submenu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ }
+ }
+
+ .el-menu--collapse {
+ .el-submenu {
+ &>.el-submenu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ 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-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: rgba(0, 0, 0, 0.06) !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu 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;
+ }
+ }
+ }
\ No newline at end of file
diff --git a/ZR.Vue3/src/assets/styles/transition.scss b/ZR.Vue3/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/transition.scss
@@ -0,0 +1,48 @@
+// 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-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.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;
+}
diff --git a/ZR.Vue3/src/assets/styles/variables.module.scss b/ZR.Vue3/src/assets/styles/variables.module.scss
new file mode 100644
index 0000000..3dbfaa7
--- /dev/null
+++ b/ZR.Vue3/src/assets/styles/variables.module.scss
@@ -0,0 +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;
+}
diff --git a/ZR.Vue3/src/components/Breadcrumb/index.vue b/ZR.Vue3/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..489cba1
--- /dev/null
+++ b/ZR.Vue3/src/components/Breadcrumb/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+ {{ item.meta.title }}
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/DictTag/index.vue b/ZR.Vue3/src/components/DictTag/index.vue
new file mode 100644
index 0000000..c812079
--- /dev/null
+++ b/ZR.Vue3/src/components/DictTag/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ {{ item.dictLabel }} #{{item.dictValue}}
+
+ {{ item.dictLabel }}#{{item.dictValue}}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/Editor/index.vue b/ZR.Vue3/src/components/Editor/index.vue
new file mode 100644
index 0000000..723db42
--- /dev/null
+++ b/ZR.Vue3/src/components/Editor/index.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/FileUpload/index.vue b/ZR.Vue3/src/components/FileUpload/index.vue
new file mode 100644
index 0000000..3b9b581
--- /dev/null
+++ b/ZR.Vue3/src/components/FileUpload/index.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+ 选取文件
+
+
+
+ 请上传
+ 大小不超过 {{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+
+ {{ getFileName(file.name) }}
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/components/Hamburger/index.vue b/ZR.Vue3/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..18c201e
--- /dev/null
+++ b/ZR.Vue3/src/components/Hamburger/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/components/HeaderSearch/index.vue b/ZR.Vue3/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..182adb5
--- /dev/null
+++ b/ZR.Vue3/src/components/HeaderSearch/index.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/IconSelect/index.vue b/ZR.Vue3/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..bca47e0
--- /dev/null
+++ b/ZR.Vue3/src/components/IconSelect/index.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/IconSelect/requireIcons.js b/ZR.Vue3/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..ac22fd7
--- /dev/null
+++ b/ZR.Vue3/src/components/IconSelect/requireIcons.js
@@ -0,0 +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
diff --git a/ZR.Vue3/src/components/ImagePreview/index.vue b/ZR.Vue3/src/components/ImagePreview/index.vue
new file mode 100644
index 0000000..30fd088
--- /dev/null
+++ b/ZR.Vue3/src/components/ImagePreview/index.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/components/ImageUpload/index.vue b/ZR.Vue3/src/components/ImageUpload/index.vue
new file mode 100644
index 0000000..706de3d
--- /dev/null
+++ b/ZR.Vue3/src/components/ImageUpload/index.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+ 请上传
+ 大小不超过{{ fileSize }}MB
+ 格式为 {{ fileType.join("/") }}
+ 的文件
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/Pagination/index.vue b/ZR.Vue3/src/components/Pagination/index.vue
new file mode 100644
index 0000000..1377b19
--- /dev/null
+++ b/ZR.Vue3/src/components/Pagination/index.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/ParentView/index.vue b/ZR.Vue3/src/components/ParentView/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/ZR.Vue3/src/components/ParentView/index.vue
@@ -0,0 +1,3 @@
+
+
+
diff --git a/ZR.Vue3/src/components/RightToolbar/index.vue b/ZR.Vue3/src/components/RightToolbar/index.vue
new file mode 100644
index 0000000..8825591
--- /dev/null
+++ b/ZR.Vue3/src/components/RightToolbar/index.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/Screenfull/index.vue b/ZR.Vue3/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..7ad28ea
--- /dev/null
+++ b/ZR.Vue3/src/components/Screenfull/index.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/SizeSelect/index.vue b/ZR.Vue3/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..d7f13cb
--- /dev/null
+++ b/ZR.Vue3/src/components/SizeSelect/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/SvgIcon/index.vue b/ZR.Vue3/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..bb66d79
--- /dev/null
+++ b/ZR.Vue3/src/components/SvgIcon/index.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/components/SvgIcon/svgicon.js b/ZR.Vue3/src/components/SvgIcon/svgicon.js
new file mode 100644
index 0000000..4431719
--- /dev/null
+++ b/ZR.Vue3/src/components/SvgIcon/svgicon.js
@@ -0,0 +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);
+ }
+ },
+};
diff --git a/ZR.Vue3/src/components/TopNav/index.vue b/ZR.Vue3/src/components/TopNav/index.vue
new file mode 100644
index 0000000..510179d
--- /dev/null
+++ b/ZR.Vue3/src/components/TopNav/index.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+ 更多菜单
+
+
+
+ {{ item.meta.title }}
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/components/TreeSelect/index.vue b/ZR.Vue3/src/components/TreeSelect/index.vue
new file mode 100644
index 0000000..3baed21
--- /dev/null
+++ b/ZR.Vue3/src/components/TreeSelect/index.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/Zr/Doc/index.vue b/ZR.Vue3/src/components/Zr/Doc/index.vue
new file mode 100644
index 0000000..662b734
--- /dev/null
+++ b/ZR.Vue3/src/components/Zr/Doc/index.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/Zr/Git/index.vue b/ZR.Vue3/src/components/Zr/Git/index.vue
new file mode 100644
index 0000000..c9a4e36
--- /dev/null
+++ b/ZR.Vue3/src/components/Zr/Git/index.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/components/iFrame/index.vue b/ZR.Vue3/src/components/iFrame/index.vue
new file mode 100644
index 0000000..091b1a2
--- /dev/null
+++ b/ZR.Vue3/src/components/iFrame/index.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/directive/index.js b/ZR.Vue3/src/directive/index.js
new file mode 100644
index 0000000..74443bb
--- /dev/null
+++ b/ZR.Vue3/src/directive/index.js
@@ -0,0 +1,9 @@
+import hasRole from './permission/hasRole'
+import hasPermi from './permission/hasPermi'
+import clipboard from './module/clipboard'
+
+export default function directive(app){
+ app.directive('hasRole', hasRole)
+ app.directive('hasPermi', hasPermi)
+ app.directive('clipboard', clipboard)
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/directive/module/clipboard.js b/ZR.Vue3/src/directive/module/clipboard.js
new file mode 100644
index 0000000..635315a
--- /dev/null
+++ b/ZR.Vue3/src/directive/module/clipboard.js
@@ -0,0 +1,54 @@
+/**
+* v-clipboard 文字复制剪贴
+* Copyright (c) 2021 ruoyi
+*/
+
+import Clipboard from 'clipboard'
+export default {
+ bind(el, binding, vnode) {
+ switch (binding.arg) {
+ case 'success':
+ el._vClipBoard_success = binding.value;
+ break;
+ case 'error':
+ el._vClipBoard_error = binding.value;
+ break;
+ default: {
+ const clipboard = new Clipboard(el, {
+ text: () => binding.value,
+ action: () => binding.arg === 'cut' ? 'cut' : 'copy'
+ });
+ clipboard.on('success', e => {
+ const callback = el._vClipBoard_success;
+ callback && callback(e);
+ });
+ clipboard.on('error', e => {
+ const callback = el._vClipBoard_error;
+ callback && callback(e);
+ });
+ el._vClipBoard = clipboard;
+ }
+ }
+ },
+ update(el, binding) {
+ if (binding.arg === 'success') {
+ el._vClipBoard_success = binding.value;
+ } else if (binding.arg === 'error') {
+ el._vClipBoard_error = binding.value;
+ } else {
+ el._vClipBoard.text = function () { return binding.value; };
+ el._vClipBoard.action = () => binding.arg === 'cut' ? 'cut' : 'copy';
+ }
+ },
+ unbind(el, binding) {
+ if (!el._vClipboard) return
+ if (binding.arg === 'success') {
+ delete el._vClipBoard_success;
+ } else if (binding.arg === 'error') {
+ delete el._vClipBoard_error;
+ } else {
+ el._vClipBoard.destroy();
+ delete el._vClipBoard;
+ }
+ }
+}
diff --git a/ZR.Vue3/src/directive/permission/hasPermi.js b/ZR.Vue3/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..91777f1
--- /dev/null
+++ b/ZR.Vue3/src/directive/permission/hasPermi.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasPermi 操作权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+import store from '@/store'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ const all_permission = "*:*:*";
+ const permissions = store.getters && store.getters.permissions
+
+ if (value && value instanceof Array && value.length > 0) {
+ const permissionFlag = value
+
+ const hasPermissions = permissions.some(permission => {
+ return all_permission === permission || permissionFlag.includes(permission)
+ })
+
+ if (!hasPermissions) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置操作权限标签值`)
+ }
+ }
+}
diff --git a/ZR.Vue3/src/directive/permission/hasRole.js b/ZR.Vue3/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..a8776a6
--- /dev/null
+++ b/ZR.Vue3/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * v-hasRole 角色权限处理
+ * Copyright (c) 2019 ruoyi
+ */
+
+import store from '@/store'
+
+export default {
+ mounted(el, binding, vnode) {
+ const { value } = binding
+ const super_admin = "admin";
+ const roles = store.getters && store.getters.roles
+
+ if (value && value instanceof Array && value.length > 0) {
+ const roleFlag = value
+
+ const hasRole = roles.some(role => {
+ return super_admin === role || roleFlag.includes(role)
+ })
+
+ if (!hasRole) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ } else {
+ throw new Error(`请设置角色权限标签值"`)
+ }
+ }
+}
diff --git a/ZR.Vue3/src/layout/components/AppMain.vue b/ZR.Vue3/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..3b55860
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/AppMain.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/layout/components/InnerLink/index.vue b/ZR.Vue3/src/layout/components/InnerLink/index.vue
new file mode 100644
index 0000000..dbfa128
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/InnerLink/index.vue
@@ -0,0 +1,30 @@
+
diff --git a/ZR.Vue3/src/layout/components/Navbar.vue b/ZR.Vue3/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..315c1a0
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Navbar.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/layout/components/Settings/index.vue b/ZR.Vue3/src/layout/components/Settings/index.vue
new file mode 100644
index 0000000..15ca6a9
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Settings/index.vue
@@ -0,0 +1,266 @@
+
+
+
+
主题风格设置
+
+
+
+
+
+
+
+
+
+
+
+
+ 主题颜色
+
+
+
+
+
+
+ 系统布局配置
+
+
+ 开启 TopNav
+
+
+
+
+
+
+ 开启 Tags-Views
+
+
+
+
+
+
+ 固定 Header
+
+
+
+
+
+
+ 显示 Logo
+
+
+
+
+
+
+ 动态标题
+
+
+
+
+
+
+
+ 保存配置
+ 重置配置
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/layout/components/Sidebar/Link.vue b/ZR.Vue3/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..5566eee
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/layout/components/Sidebar/Logo.vue b/ZR.Vue3/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..1b8e5b5
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/layout/components/Sidebar/SidebarItem.vue b/ZR.Vue3/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..b997795
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/layout/components/Sidebar/index.vue b/ZR.Vue3/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..ce4c202
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/layout/components/TagsView/ScrollPane.vue b/ZR.Vue3/src/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000..2343bc7
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/layout/components/TagsView/index.vue b/ZR.Vue3/src/layout/components/TagsView/index.vue
new file mode 100644
index 0000000..03bc26a
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/TagsView/index.vue
@@ -0,0 +1,331 @@
+
+
+
+
+ {{ tag.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/layout/components/index.js b/ZR.Vue3/src/layout/components/index.js
new file mode 100644
index 0000000..fd57731
--- /dev/null
+++ b/ZR.Vue3/src/layout/components/index.js
@@ -0,0 +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'
diff --git a/ZR.Vue3/src/layout/index.vue b/ZR.Vue3/src/layout/index.vue
new file mode 100644
index 0000000..a7d13e3
--- /dev/null
+++ b/ZR.Vue3/src/layout/index.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/main.js b/ZR.Vue3/src/main.js
new file mode 100644
index 0000000..c88bb26
--- /dev/null
+++ b/ZR.Vue3/src/main.js
@@ -0,0 +1,80 @@
+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/index.vue'
+import elementIcons from '@/components/SvgIcon/svgicon'
+
+import './permission' // permission control
+
+import { getConfigKey } from "@/api/system/config";
+import { getDicts } from "@/api/system/dict/data";
+import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, download } 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.getConfigKey = getConfigKey
+app.config.globalProperties.getDicts = getDicts
+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.component('DictTag', DictTag)
+app.component('Pagination', Pagination)
+app.component('TreeSelect', TreeSelect)
+app.component('UploadFile', FileUpload)
+app.component('UploadImage', 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') || 'small'
+})
+
+app.mount('#app')
diff --git a/ZR.Vue3/src/permission.js b/ZR.Vue3/src/permission.js
new file mode 100644
index 0000000..6709673
--- /dev/null
+++ b/ZR.Vue3/src/permission.js
@@ -0,0 +1,58 @@
+import router from './router'
+import store from './store'
+import { ElMessage } from 'element-plus'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import { getToken } from '@/utils/auth'
+import { isHttp } from '@/utils/validate'
+
+NProgress.configure({ showSpinner: false });
+
+const whiteList = ['/login', '/auth-redirect', '/bind', '/register'];
+
+router.beforeEach((to, from, next) => {
+ NProgress.start()
+ if (getToken()) {
+ to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
+ /* has token*/
+ if (to.path === '/login') {
+ next({ path: '/' })
+ NProgress.done()
+ } else {
+ if (store.getters.roles.length === 0) {
+ // 判断当前用户是否已拉取完user_info信息
+ store.dispatch('GetInfo').then(() => {
+ store.dispatch('GenerateRoutes').then(accessRoutes => {
+ // 根据roles权限生成可访问的路由表
+ accessRoutes.forEach(route => {
+ if (!isHttp(route.path)) {
+ router.addRoute(route) // 动态添加可访问路由表
+ }
+ })
+ next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+ })
+ }).catch(err => {
+ store.dispatch('LogOut').then(() => {
+ ElMessage.error(err != undefined ? 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()
+})
\ No newline at end of file
diff --git a/ZR.Vue3/src/plugins/auth.js b/ZR.Vue3/src/plugins/auth.js
new file mode 100644
index 0000000..6c6bc24
--- /dev/null
+++ b/ZR.Vue3/src/plugins/auth.js
@@ -0,0 +1,60 @@
+import store from '@/store'
+
+function authPermission(permission) {
+ const all_permission = "*:*:*";
+ const permissions = store.getters && store.getters.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 = store.getters && store.getters.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/ZR.Vue3/src/plugins/cache.js b/ZR.Vue3/src/plugins/cache.js
new file mode 100644
index 0000000..6b5c00b
--- /dev/null
+++ b/ZR.Vue3/src/plugins/cache.js
@@ -0,0 +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
+}
diff --git a/ZR.Vue3/src/plugins/download.js b/ZR.Vue3/src/plugins/download.js
new file mode 100644
index 0000000..c31a064
--- /dev/null
+++ b/ZR.Vue3/src/plugins/download.js
@@ -0,0 +1,72 @@
+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=" + encodeURI(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, decodeURI(res.headers['download-filename']))
+ } else {
+ this.printErrMsg(res.data);
+ }
+ })
+ },
+ resource(resource) {
+ var url = baseURL + "/common/download/resource?resource=" + encodeURI(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, decodeURI(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/ZR.Vue3/src/plugins/index.js b/ZR.Vue3/src/plugins/index.js
new file mode 100644
index 0000000..47d1b41
--- /dev/null
+++ b/ZR.Vue3/src/plugins/index.js
@@ -0,0 +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
+}
diff --git a/ZR.Vue3/src/plugins/modal.js b/ZR.Vue3/src/plugins/modal.js
new file mode 100644
index 0000000..b59e14d
--- /dev/null
+++ b/ZR.Vue3/src/plugins/modal.js
@@ -0,0 +1,82 @@
+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/ZR.Vue3/src/plugins/tab.js b/ZR.Vue3/src/plugins/tab.js
new file mode 100644
index 0000000..ba27884
--- /dev/null
+++ b/ZR.Vue3/src/plugins/tab.js
@@ -0,0 +1,67 @@
+import store from '@/store'
+import router from '@/router'
+import { nextTick } from 'vue'
+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 };
+ }
+ }
+ });
+ }
+ store.dispatch('tagsView/delCachedView', obj).then(() => {
+ const { fullPath, query } = obj
+ nextTick(() => {
+ router.replace({
+ path: '/redirect' + fullPath,
+ query: query
+ })
+ })
+ })
+ },
+ // 关闭当前tab页签,打开新页签
+ closeOpenPage(obj) {
+ store.dispatch("tagsView/delView", router.currentRoute.value);
+ if (obj !== undefined) {
+ return router.push(obj);
+ }
+ },
+ // 关闭指定tab页签
+ closePage(obj) {
+ if (obj === undefined) {
+ return store.dispatch('tagsView/delView', router.currentRoute.value).then(({ lastPath }) => {
+ return router.push(lastPath || '/index');
+ });
+ }
+ return store.dispatch('tagsView/delView', obj);
+ },
+ // 关闭所有tab页签
+ closeAllPage() {
+ return store.dispatch('tagsView/delAllViews');
+ },
+ // 关闭左侧tab页签
+ closeLeftPage(obj) {
+ return store.dispatch('tagsView/delLeftTags', obj || router.currentRoute.value);
+ },
+ // 关闭右侧tab页签
+ closeRightPage(obj) {
+ return store.dispatch('tagsView/delRightTags', obj || router.currentRoute.value);
+ },
+ // 关闭其他tab页签
+ closeOtherPage(obj) {
+ return store.dispatch('tagsView/delOthersViews', obj || router.currentRoute.value);
+ },
+ // 打开tab页签
+ openPage(url) {
+ return router.push(url);
+ },
+ // 修改tab页签
+ updatePage(obj) {
+ return store.dispatch('tagsView/updateVisitedView', obj);
+ }
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/router/index.js b/ZR.Vue3/src/router/index.js
new file mode 100644
index 0000000..ca9c963
--- /dev/null
+++ b/ZR.Vue3/src/router/index.js
@@ -0,0 +1,94 @@
+import { createWebHistory, createRouter } from 'vue-router'
+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"}' // 访问路由的默认传递参数
+ * 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' }
+ }]
+}];
+
+const router = createRouter({
+ history: createWebHistory(),
+ routes: constantRoutes,
+ // scrollBehavior(to, from, savedPosition) {
+ // if (savedPosition) {
+ // return savedPosition
+ // } else {
+ // return { top: 0 }
+ // }
+ // },
+});
+
+export default router;
\ No newline at end of file
diff --git a/ZR.Vue3/src/settings.js b/ZR.Vue3/src/settings.js
new file mode 100644
index 0000000..39be17d
--- /dev/null
+++ b/ZR.Vue3/src/settings.js
@@ -0,0 +1,51 @@
+export default {
+ /**
+ * 框架版本号
+ */
+ version: '3.8.0',
+ /**
+ * 网页标题
+ */
+ 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/ZR.Vue3/src/store/getters.js b/ZR.Vue3/src/store/getters.js
new file mode 100644
index 0000000..5a50d6b
--- /dev/null
+++ b/ZR.Vue3/src/store/getters.js
@@ -0,0 +1,20 @@
+const getters = {
+ sidebar: state => state.app.sidebar,
+ size: state => state.app.size,
+ device: state => state.app.device,
+ visitedViews: state => state.tagsView.visitedViews,
+ cachedViews: state => state.tagsView.cachedViews,
+ token: state => state.user.token,
+ avatar: state => state.user.avatar,
+ name: state => state.user.name,
+ userId: state => state.user.userInfo.userId,
+ introduction: state => state.user.introduction,
+ roles: state => state.user.roles,
+ permissions: state => state.user.permissions,
+ permission_routes: state => state.permission.routes,
+ userinfo: state => state.user.userInfo,
+ topbarRouters:state => state.permission.topbarRouters,
+ defaultRoutes:state => state.permission.defaultRoutes,
+ sidebarRouters:state => state.permission.sidebarRouters,
+}
+export default getters
\ No newline at end of file
diff --git a/ZR.Vue3/src/store/index.js b/ZR.Vue3/src/store/index.js
new file mode 100644
index 0000000..d441545
--- /dev/null
+++ b/ZR.Vue3/src/store/index.js
@@ -0,0 +1,21 @@
+import { createStore } from 'vuex'
+import app from './modules/app'
+import user from './modules/user'
+import tagsView from './modules/tagsView'
+import permission from './modules/permission'
+import settings from './modules/settings'
+import getters from './getters'
+
+const store = createStore({
+ modules: {
+ app,
+ user,
+ tagsView,
+ permission,
+ settings
+ },
+ getters
+});
+
+
+export default store
\ No newline at end of file
diff --git a/ZR.Vue3/src/store/modules/app.js b/ZR.Vue3/src/store/modules/app.js
new file mode 100644
index 0000000..8c0dbae
--- /dev/null
+++ b/ZR.Vue3/src/store/modules/app.js
@@ -0,0 +1,66 @@
+import Cookies from 'js-cookie'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false,
+ hide: false
+ },
+ device: 'desktop',
+ size: Cookies.get('size') || 'default'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ if (state.sidebar.hide) {
+ return false;
+ }
+ state.sidebar.opened = !state.sidebar.opened
+ state.sidebar.withoutAnimation = false
+ if (state.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
+ Cookies.set('sidebarStatus', 0)
+ state.sidebar.opened = false
+ state.sidebar.withoutAnimation = withoutAnimation
+ },
+ TOGGLE_DEVICE: (state, device) => {
+ state.device = device
+ },
+ SET_SIZE: (state, size) => {
+ state.size = size
+ Cookies.set('size', size)
+ },
+ SET_SIDEBAR_HIDE: (state, status) => {
+ state.sidebar.hide = status
+ }
+}
+
+const actions = {
+ toggleSideBar({ commit }) {
+ commit('TOGGLE_SIDEBAR')
+ },
+ closeSideBar({ commit }, { withoutAnimation }) {
+ commit('CLOSE_SIDEBAR', withoutAnimation)
+ },
+ toggleDevice({ commit }, device) {
+ commit('TOGGLE_DEVICE', device)
+ },
+ setSize({ commit }, size) {
+ commit('SET_SIZE', size)
+ },
+ toggleSideBarHide({ commit }, status) {
+ commit('SET_SIDEBAR_HIDE', status)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/store/modules/permission.js b/ZR.Vue3/src/store/modules/permission.js
new file mode 100644
index 0000000..dd4398a
--- /dev/null
+++ b/ZR.Vue3/src/store/modules/permission.js
@@ -0,0 +1,120 @@
+import { constantRoutes } from '@/router'
+import { getRouters } from '@/api/system/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 permission = {
+ state: {
+ routes: [],
+ addRoutes: [],
+ defaultRoutes: [],
+ topbarRouters: [],
+ sidebarRouters: []
+ },
+ mutations: {
+ SET_ROUTES: (state, routes) => {
+ state.addRoutes = routes
+ state.routes = constantRoutes.concat(routes)
+ },
+ SET_DEFAULT_ROUTES: (state, routes) => {
+ state.defaultRoutes = constantRoutes.concat(routes)
+ },
+ SET_TOPBAR_ROUTES: (state, routes) => {
+ state.topbarRouters = routes
+ },
+ SET_SIDEBAR_ROUTERS: (state, routes) => {
+ state.sidebarRouters = routes
+ },
+ },
+ actions: {
+ // 生成路由
+ GenerateRoutes({ commit }) {
+ 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)
+ commit('SET_ROUTES', rewriteRoutes)
+ commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
+ commit('SET_DEFAULT_ROUTES', sidebarRoutes)
+ commit('SET_TOPBAR_ROUTES', 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 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 permission
\ No newline at end of file
diff --git a/ZR.Vue3/src/store/modules/settings.js b/ZR.Vue3/src/store/modules/settings.js
new file mode 100644
index 0000000..930f47f
--- /dev/null
+++ b/ZR.Vue3/src/store/modules/settings.js
@@ -0,0 +1,44 @@
+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 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
+}
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ // 修改布局设置
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ },
+ // 设置网页标题
+ setTitle({ commit }, title) {
+ state.title = title
+ useDynamicTitle();
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/ZR.Vue3/src/store/modules/tagsView.js b/ZR.Vue3/src/store/modules/tagsView.js
new file mode 100644
index 0000000..ef2fe4c
--- /dev/null
+++ b/ZR.Vue3/src/store/modules/tagsView.js
@@ -0,0 +1,207 @@
+const state = {
+ visitedViews: [],
+ cachedViews: []
+}
+
+const mutations = {
+ ADD_VISITED_VIEW: (state, view) => {
+ if (state.visitedViews.some(v => v.path === view.path)) return
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ ADD_CACHED_VIEW: (state, view) => {
+ if (state.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ state.cachedViews.push(view.name)
+ }
+ },
+
+ DEL_VISITED_VIEW: (state, view) => {
+ for (const [i, v] of state.visitedViews.entries()) {
+ if (v.path === view.path) {
+ state.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ DEL_CACHED_VIEW: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ index > -1 && state.cachedViews.splice(index, 1)
+ },
+
+ DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+ state.visitedViews = state.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ },
+ DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
+ } else {
+ state.cachedViews = []
+ }
+ },
+
+ DEL_ALL_VISITED_VIEWS: state => {
+ // keep affix tags
+ const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+ state.visitedViews = affixTags
+ },
+ DEL_ALL_CACHED_VIEWS: state => {
+ state.cachedViews = []
+ },
+
+ UPDATE_VISITED_VIEW: (state, view) => {
+ for (let v of state.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ },
+
+ DEL_RIGHT_VIEWS: (state, view) => {
+ const index = state.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ state.visitedViews = state.visitedViews.filter((item, idx) => {
+ if (idx <= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = state.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ state.cachedViews.splice(i, 1)
+ }
+ return false
+ })
+ },
+
+ DEL_LEFT_VIEWS: (state, view) => {
+ const index = state.visitedViews.findIndex(v => v.path === view.path)
+ if (index === -1) {
+ return
+ }
+ state.visitedViews = state.visitedViews.filter((item, idx) => {
+ if (idx >= index || (item.meta && item.meta.affix)) {
+ return true
+ }
+ const i = state.cachedViews.indexOf(item.name)
+ if (i > -1) {
+ state.cachedViews.splice(i, 1)
+ }
+ return false
+ })
+ }
+}
+
+const actions = {
+ addView({ dispatch }, view) {
+ dispatch('addVisitedView', view)
+ dispatch('addCachedView', view)
+ },
+ addVisitedView({ commit }, view) {
+ commit('ADD_VISITED_VIEW', view)
+ },
+ addCachedView({ commit }, view) {
+ commit('ADD_CACHED_VIEW', view)
+ },
+
+ delView({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delVisitedView', view)
+ dispatch('delCachedView', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delVisitedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_VISITED_VIEW', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delCachedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_CACHED_VIEW', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delOthersViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delOthersVisitedViews', view)
+ dispatch('delOthersCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_VISITED_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delOthersCachedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_CACHED_VIEWS', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delAllViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delAllVisitedViews', view)
+ dispatch('delAllCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_VISITED_VIEWS')
+ resolve([...state.visitedViews])
+ })
+ },
+ delAllCachedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_CACHED_VIEWS')
+ resolve([...state.cachedViews])
+ })
+ },
+
+ updateVisitedView({ commit }, view) {
+ commit('UPDATE_VISITED_VIEW', view)
+ },
+
+ delRightTags({ commit }, view) {
+ return new Promise(resolve => {
+ commit('DEL_RIGHT_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+
+ delLeftTags({ commit }, view) {
+ return new Promise(resolve => {
+ commit('DEL_LEFT_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/ZR.Vue3/src/store/modules/user.js b/ZR.Vue3/src/store/modules/user.js
new file mode 100644
index 0000000..f5085ab
--- /dev/null
+++ b/ZR.Vue3/src/store/modules/user.js
@@ -0,0 +1,110 @@
+import { login, logout, getInfo } from '@/api/system/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+import defAva from '@/assets/images/profile.jpg'
+
+const user = {
+ state: {
+ userInfo: '',
+ token: getToken(),
+ name: '',
+ avatar: '',
+ roles: [],
+ permissions: []
+ },
+
+ mutations: {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_NAME: (state, name) => {
+ state.name = name
+ },
+ SET_AVATAR: (state, avatar) => {
+ state.avatar = avatar
+ },
+ SET_ROLES: (state, roles) => {
+ state.roles = roles
+ },
+ SET_PERMISSIONS: (state, permissions) => {
+ state.permissions = permissions
+ },
+ SET_USERINFO: (state, value) => {
+ state.userInfo = value
+ }
+ },
+
+ actions: {
+ // 登录
+ Login({ commit }, 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 => {
+ if (res.code == 200) {
+ setToken(res.data)
+ //提交上面的mutaions方法
+ commit('SET_TOKEN', res.data)
+ resolve() //then处理
+ } else {
+ console.log('login error ' + res);
+ reject(res) //catch处理
+ }
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 获取用户信息
+ GetInfo({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ getInfo().then(res => {
+ const data = res.data
+ const avatar = data.user.avatar == "" ? require("@/assets/image/profile.jpg") : data.user.avatar;
+
+ if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+ commit('SET_ROLES', data.roles)
+ commit('SET_PERMISSIONS', data.permissions)
+ } else {
+ commit('SET_ROLES', ['ROLE_DEFAULT'])
+ }
+
+ commit('SET_NAME', data.user.nickName)
+ commit('SET_AVATAR', avatar)
+ commit('SET_USERINFO', data.user) //新加
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 退出系统
+ LogOut({ commit, state }) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then((res) => {
+ commit('SET_TOKEN', '')
+ commit('SET_ROLES', [])
+ commit('SET_PERMISSIONS', [])
+ removeToken()
+ resolve(res)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // 前端 登出
+ FedLogOut({ commit }) {
+ return new Promise(resolve => {
+ commit('SET_TOKEN', '')
+ removeToken()
+ resolve()
+ })
+ }
+ }
+}
+
+export default user
\ No newline at end of file
diff --git a/ZR.Vue3/src/utils/auth.js b/ZR.Vue3/src/utils/auth.js
new file mode 100644
index 0000000..08a43d6
--- /dev/null
+++ b/ZR.Vue3/src/utils/auth.js
@@ -0,0 +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)
+}
diff --git a/ZR.Vue3/src/utils/dynamicTitle.js b/ZR.Vue3/src/utils/dynamicTitle.js
new file mode 100644
index 0000000..768583e
--- /dev/null
+++ b/ZR.Vue3/src/utils/dynamicTitle.js
@@ -0,0 +1,13 @@
+import store from '@/store'
+import defaultSettings from '@/settings'
+
+/**
+ * 动态修改标题
+ */
+export function useDynamicTitle() {
+ if (store.state.settings.dynamicTitle) {
+ document.title = store.state.settings.title + ' - ' + defaultSettings.title;
+ } else {
+ document.title = defaultSettings.title;
+ }
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/utils/errorCode.js b/ZR.Vue3/src/utils/errorCode.js
new file mode 100644
index 0000000..d2111ee
--- /dev/null
+++ b/ZR.Vue3/src/utils/errorCode.js
@@ -0,0 +1,6 @@
+export default {
+ '401': '认证失败,无法访问系统资源',
+ '403': '当前操作没有权限',
+ '404': '访问资源不存在',
+ 'default': '系统未知错误,请反馈给管理员'
+}
diff --git a/ZR.Vue3/src/utils/index.js b/ZR.Vue3/src/utils/index.js
new file mode 100644
index 0000000..cbacab0
--- /dev/null
+++ b/ZR.Vue3/src/utils/index.js
@@ -0,0 +1,390 @@
+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/ZR.Vue3/src/utils/jsencrypt.js b/ZR.Vue3/src/utils/jsencrypt.js
new file mode 100644
index 0000000..78d9523
--- /dev/null
+++ b/ZR.Vue3/src/utils/jsencrypt.js
@@ -0,0 +1,30 @@
+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/ZR.Vue3/src/utils/permission.js b/ZR.Vue3/src/utils/permission.js
new file mode 100644
index 0000000..1730e33
--- /dev/null
+++ b/ZR.Vue3/src/utils/permission.js
@@ -0,0 +1,51 @@
+import store from '@/store'
+
+/**
+ * 字符权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkPermi(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const permissions = store.getters && store.getters.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 = store.getters && store.getters.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
diff --git a/ZR.Vue3/src/utils/request.js b/ZR.Vue3/src/utils/request.js
new file mode 100644
index 0000000..2563fa1
--- /dev/null
+++ b/ZR.Vue3/src/utils/request.js
@@ -0,0 +1,167 @@
+import axios from 'axios'
+import { ElNotification, ElMessageBox, ElMessage, ElLoading } from 'element-plus'
+import store from '@/store'
+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'
+
+let downloadLoadingInstance;
+// 是否显示重新登录
+let isReloginShow;
+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: 30000
+})
+
+// request拦截器
+service.interceptors.request.use(config => {
+ // 是否需要设置 token
+ if (getToken()) {
+ //将token放到请求头发送给服务器,将tokenkey放在请求头中
+ config.headers['Authorization'] = 'Bearer ' + getToken();
+ config.headers['userid'] = store.getters.userId;
+ } else {
+ // console.log(config)
+ }
+ // 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 => {
+ if (res.status !== 200) {
+ Promise.reject('network error');
+ return;
+ }
+ // 未设置状态码则默认成功状态
+ const { code, msg } = res.data;
+ // 获取错误信息
+
+ // 二进制数据则直接返回
+ if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
+ return res.data
+ }
+ if (code === 401) {
+ ElMessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
+ confirmButtonText: '重新登录',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ isReloginShow = false;
+ store.dispatch('LogOut').then(() => {
+ // 如果是登录页面不需要重新加载
+ if (window.location.hash.indexOf("#/login") != 0) {
+ location.href = '/index';
+ }
+ })
+ }).catch(() => {
+ isReloginShow = false;
+ });
+ return Promise.reject('无效的会话,或者会话已过期,请重新登录。')
+ } else if (code == 0 || code == 1 || code == 110 || code == 101 || code == 103 || code == 403 || code == 500 || code == 429) {
+ ElMessage({
+ message: msg,
+ type: 'error'
+ })
+ return Promise.reject(msg)
+ } else {
+ //返回标准 code/msg/data字段
+ return 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) {
+ 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'
+ }).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
\ No newline at end of file
diff --git a/ZR.Vue3/src/utils/ruoyi.js b/ZR.Vue3/src/utils/ruoyi.js
new file mode 100644
index 0000000..32b1e95
--- /dev/null
+++ b/ZR.Vue3/src/utils/ruoyi.js
@@ -0,0 +1,271 @@
+const baseURL = import.meta.env.VITE_APP_BASE_API
+/**
+ * 通用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();
+ }
+}
+
+/**
+ * 添加日期范围
+ * @param { beginTime: '', endTime: '', page: 1} params
+ * @param {*} dateRange 日期范围数组
+ * @param {*} propName C#属性名首字母大写
+ * @returns
+ */
+// 添加日期范围
+export function addDateRange(params, dateRange, propName) {
+ let search = params;
+ search = typeof (search) === 'object' && search !== null && !Array.isArray(search) ? search : {};
+ dateRange = Array.isArray(dateRange) ? dateRange : [];
+ if (typeof (propName) === 'undefined') {
+ search['beginTime'] = dateRange[0];
+ search['endTime'] = dateRange[1];
+ } else {
+ search['begin' + propName] = dateRange[0];
+ search['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].dictValue == ('' + value)) {
+ actions.push(datas[key].dictLabel);
+ return true;
+ }
+ })
+ if (actions.length === 0) {
+ actions.push(value);
+ }
+ return actions.join('');
+}
+
+// 回显数据字典(字符串数组)
+export function selectDictLabels(datas, value, separator) {
+ if(value === undefined) {
+ return "";
+ }
+ var actions = [];
+ var currentSeparator = undefined === separator ? "," : separator;
+ var temp = value.split(currentSeparator);
+ Object.keys(value.split(currentSeparator)).some((val) => {
+ Object.keys(datas).some((key) => {
+ if (datas[key].value == ('' + temp[val])) {
+ actions.push(datas[key].label + currentSeparator);
+ }
+ })
+ })
+ return actions.join('').substring(0, actions.join('').length - 1);
+}
+// 通用下载方法
+export function download(fileName) {
+ // window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
+ // window.open(baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true)
+ window.open(baseURL + fileName)
+}
+
+// 字符串格式化(%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 && typeof (value) !== "undefined") {
+ if (typeof value === 'object') {
+ for (const key of Object.keys(value)) {
+ if (value[key] !== null && 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;
+ }
+}
+
+// 转换字符串,undefined,null等转化为""
+export function praseStrEmpty(str) {
+ if (!str || str == "undefined" || str == "null") {
+ return "";
+ }
+ return str;
+}
+export function praseStrZero(str) {
+ if (!str || str == "undefined" || str == "null") {
+ console.log('zero')
+ return 0;
+ }
+ return str;
+}
\ No newline at end of file
diff --git a/ZR.Vue3/src/utils/scroll-to.js b/ZR.Vue3/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/ZR.Vue3/src/utils/scroll-to.js
@@ -0,0 +1,58 @@
+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/ZR.Vue3/src/utils/validate.js b/ZR.Vue3/src/utils/validate.js
new file mode 100644
index 0000000..702add4
--- /dev/null
+++ b/ZR.Vue3/src/utils/validate.js
@@ -0,0 +1,93 @@
+/**
+ * 判断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/ZR.Vue3/src/views/components/dictData.vue b/ZR.Vue3/src/views/components/dictData.vue
new file mode 100644
index 0000000..4c66b7b
--- /dev/null
+++ b/ZR.Vue3/src/views/components/dictData.vue
@@ -0,0 +1,363 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增数据
+
+
+
+
+
+
+
+ {{scope.row.dictLabel}}
+ {{scope.row.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/error/401.vue b/ZR.Vue3/src/views/error/401.vue
new file mode 100644
index 0000000..1ba3792
--- /dev/null
+++ b/ZR.Vue3/src/views/error/401.vue
@@ -0,0 +1,82 @@
+
+
+
+ 返回
+
+
+
+
+ 401错误!
+
+ 您没有访问权限!
+ 对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/error/404.vue b/ZR.Vue3/src/views/error/404.vue
new file mode 100644
index 0000000..f205303
--- /dev/null
+++ b/ZR.Vue3/src/views/error/404.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+ 404错误!
+
+
+ {{ message }}
+
+
+ 对不起,您正在寻找的页面不存在。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。
+
+
+ 返回首页
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/index.vue b/ZR.Vue3/src/views/index.vue
new file mode 100644
index 0000000..382aa9a
--- /dev/null
+++ b/ZR.Vue3/src/views/index.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+ 领取七牛云通用云产品优惠券
+
+
+ https://s.qiniu.com/FzEfay
+
+
+ 领取腾讯云通用云产品新用户专属大礼包2860优惠券,每种代金券限量500张,先到先得。
+
+ https://curl.qcloud.com/5J4nag8D
+
+
+ 腾讯云限时秒杀活动
+ https://curl.qcloud.com/4yEoRquq
+
+
+ 华为特惠专区,多款产品限时特价
+ ☛☛点我进入☚☚
+
+ 云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)
+
+
+
+
+
+
+ ZRAdmin.NET后台管理框架
+ ZRAdmin.NET借鉴了很多开源项目的优点,让你开发Web管理系统更简单,所以我也把它给开源了(前端 vue页面主要参考若依,在此表示感谢.)
+ 代码完全免费开源,易读易懂、界面简洁美观,给你的项目多一种选择与参考。
+
+ 当前版本: v{{ version }}
+ 更新日志
+
+
+
+ 访问码云
+
+ Github
+
+
+
+
+ 如果觉得不错欢迎给个⭐Star⭐收藏一下 ,这样作者才有继续免费下去的动力,谢谢!
+
+
+ 技术选型
+
+ 后端技术
+
+ NET6
+ JWT
+ SqlSugar
+ Quartz.Net
+ MySql
+ Mapster
+ Epplus
+ ...
+
+
+
+ 前端技术
+
+ Vue3
+ Vuex
+ Element-ui
+ Axios
+ Sass
+ Quill
+ ...
+
+
+
+
+
+
+
+
+
+ 联系信息
+
+
+
+
+
+ 官网:
+ http://www.izhaorui.cn/doc
+
+
+
+
+
+
+ QQ群:
+
+ 191349103
+
+
+
+
+
+
+
+ 捐赠支持
+
+
+
打赏作者喝杯咖啡表示鼓励
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/index_v1.vue b/ZR.Vue3/src/views/index_v1.vue
new file mode 100644
index 0000000..2d75c9e
--- /dev/null
+++ b/ZR.Vue3/src/views/index_v1.vue
@@ -0,0 +1,370 @@
+
+
+
+
+
+
+
+ 我的工作台
+
+
+
+
+
+
+
+
+
+ {{ userInfo.welcomeMessage }},{{ userInfo.nickName }},{{ userInfo.welcomeContent }}
+
+
+ 昵称:
+ {{ userInfo.nickName }}
+
+
+ 身份:
+
+ {{ item.roleName }}
+
+
+
+
+
+ IP:
+ {{ userInfo.loginIP }}
+
+
+ 时间:
+ {{ currentTime }}
+
+
+
+
+ 修改信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/login.vue b/ZR.Vue3/src/views/login.vue
new file mode 100644
index 0000000..8d73d70
--- /dev/null
+++ b/ZR.Vue3/src/views/login.vue
@@ -0,0 +1,208 @@
+
+
+
+ {{defaultSettings.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 记住密码
+
+
+ 登 录
+ 登 录 中...
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/monitor/logininfor/index.vue b/ZR.Vue3/src/views/monitor/logininfor/index.vue
new file mode 100644
index 0000000..9a872f1
--- /dev/null
+++ b/ZR.Vue3/src/views/monitor/logininfor/index.vue
@@ -0,0 +1,196 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 删除
+
+
+ 清空
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.loginTime }}
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/monitor/operlog/index.vue b/ZR.Vue3/src/views/monitor/operlog/index.vue
new file mode 100644
index 0000000..86cf5d5
--- /dev/null
+++ b/ZR.Vue3/src/views/monitor/operlog/index.vue
@@ -0,0 +1,290 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 删除
+
+
+ 清空
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.elapsed }}
+ ms
+
+
+
+
+
+ {{ scope.row.operTime }}
+
+
+
+
+ 详细
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ form.title }}
+ {{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}
+
+
+ {{ form.operUrl }}
+ {{ form.requestMethod }}
+
+
+ {{ form.method }}
+
+
+
+
+
+
+
+ {{ form.operParam }}
+
+
+
+ {{ form.jsonResult }}
+
+
+
+
+
+
+
+
+ {{ parseTime(form.operTime) }}
+
+
+ {{ form.errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/redirect/index.vue b/ZR.Vue3/src/views/redirect/index.vue
new file mode 100644
index 0000000..afd450a
--- /dev/null
+++ b/ZR.Vue3/src/views/redirect/index.vue
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/system/config/index.vue b/ZR.Vue3/src/views/system/config/index.vue
new file mode 100644
index 0000000..af4da9d
--- /dev/null
+++ b/ZR.Vue3/src/views/system/config/index.vue
@@ -0,0 +1,274 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{scope.row.createTime}}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/dept/index.vue b/ZR.Vue3/src/views/system/dept/index.vue
new file mode 100644
index 0000000..7a28fe2
--- /dev/null
+++ b/ZR.Vue3/src/views/system/dept/index.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/dict/index.vue b/ZR.Vue3/src/views/system/dict/index.vue
new file mode 100644
index 0000000..b80f984
--- /dev/null
+++ b/ZR.Vue3/src/views/system/dict/index.vue
@@ -0,0 +1,316 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+ {{ scope.row.dictType }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.createTime }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/menu/index.vue b/ZR.Vue3/src/views/system/menu/index.vue
new file mode 100644
index 0000000..4d65a13
--- /dev/null
+++ b/ZR.Vue3/src/views/system/menu/index.vue
@@ -0,0 +1,436 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 展开/折叠
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 链接
+ 菜单
+ 目录
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 新增
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 目录
+ 菜单
+ 按钮
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否外链
+
+
+
+ 是
+ 否
+
+
+
+
+
+
+
+
+
+
+
+
+ 路由地址
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 组件路径
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 权限字符
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 路由参数
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是否缓存
+
+
+
+ 缓存
+ 不缓存
+
+
+
+
+
+
+
+
+
+
+
+
+ 显示状态
+
+
+
+ {{ dict.dictLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 菜单状态
+
+
+
+ {{ dict.dictLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/notice/index.vue b/ZR.Vue3/src/views/system/notice/index.vue
new file mode 100644
index 0000000..e7bf54b
--- /dev/null
+++ b/ZR.Vue3/src/views/system/notice/index.vue
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/post/index.vue b/ZR.Vue3/src/views/system/post/index.vue
new file mode 100644
index 0000000..73e5cda
--- /dev/null
+++ b/ZR.Vue3/src/views/system/post/index.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ parseTime(scope.row.createTime) }}
+
+
+
+
+ 修改
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{dict.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/role/index.vue b/ZR.Vue3/src/views/system/role/index.vue
new file mode 100644
index 0000000..78efe51
--- /dev/null
+++ b/ZR.Vue3/src/views/system/role/index.vue
@@ -0,0 +1,619 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
修改
+
+
删除
+
+
+
handleCommand(command, scope.row)"
+ v-hasPermi="['system:role:edit', 'system:role:authorize', 'system:roleusers:list']">
+
+ 更多
+
+
+
+
+
+
+ 菜单权限
+ 分配用户
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{form.roleKey}}
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.dictLabel }}
+
+
+
+
+
+ 展开/折叠
+ 全选/全不选
+ 父子联动
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/system/roleusers/index.vue b/ZR.Vue3/src/views/system/roleusers/index.vue
new file mode 100644
index 0000000..9599dbb
--- /dev/null
+++ b/ZR.Vue3/src/views/system/roleusers/index.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+
+
+
+
+
+
+ 添加用户
+
+
+
+
+ 批量取消授权
+
+
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消授权
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/user/index.vue b/ZR.Vue3/src/views/system/user/index.vue
new file mode 100644
index 0000000..e1da6df
--- /dev/null
+++ b/ZR.Vue3/src/views/system/user/index.vue
@@ -0,0 +1,621 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 新增
+
+
+ 修改
+
+
+ 删除
+
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.dictLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+ 仅允许导入xls、xlsx格式文件。
+ 下载模板
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/user/profile/index.vue b/ZR.Vue3/src/views/system/user/profile/index.vue
new file mode 100644
index 0000000..8901902
--- /dev/null
+++ b/ZR.Vue3/src/views/system/user/profile/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+ 个人信息
+
+
+
+
+
+
+
+
+ 用户名称
+ {{ state.user.userName }}
+
+
+ 手机号码
+ {{ state.user.phonenumber }}
+
+
+ 用户邮箱
+ {{ state.user.email }}
+
+
+ 所属部门
+ {{ state.user.deptName }} / {{ state.postGroup }}
+
+
+ 所属角色
+
+ {{item}}
+
+
+
+ 创建日期
+ {{ state.user.createTime }}
+
+
+
+
+
+
+
+
+
+ 基本资料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/system/user/profile/resetPwd.vue b/ZR.Vue3/src/views/system/user/profile/resetPwd.vue
new file mode 100644
index 0000000..97bf23e
--- /dev/null
+++ b/ZR.Vue3/src/views/system/user/profile/resetPwd.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/system/user/profile/userAvatar.vue b/ZR.Vue3/src/views/system/user/profile/userAvatar.vue
new file mode 100644
index 0000000..c65fdf6
--- /dev/null
+++ b/ZR.Vue3/src/views/system/user/profile/userAvatar.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提 交
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/system/user/profile/userInfo.vue b/ZR.Vue3/src/views/system/user/profile/userInfo.vue
new file mode 100644
index 0000000..db6b188
--- /dev/null
+++ b/ZR.Vue3/src/views/system/user/profile/userInfo.vue
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
diff --git a/ZR.Vue3/src/views/tool/file/index.vue b/ZR.Vue3/src/views/tool/file/index.vue
new file mode 100644
index 0000000..43bcbf8
--- /dev/null
+++ b/ZR.Vue3/src/views/tool/file/index.vue
@@ -0,0 +1,360 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+ 上传文件
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.fileName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{scope.row.storeType}}
+
+
+
+
+
+
+
+ 查看
+
+ 复制
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.dictLabel}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{formView.id}}
+
+
+ {{formView.realName}}
+
+
+
+ {{formView.fileType}}
+
+
+
+
+ {{formView.fileExt}}
+
+
+
+ {{formView.fileName}}
+
+
+ {{formView.storePath}}
+
+
+ {{formView.fileSize}}
+
+
+ {{formView.create_by}}
+
+
+
+
+
+
+
+ {{formView.accessUrl}}
+
+ 复制
+
+
+
+
+ {{formView.fileUrl}}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ZR.Vue3/src/views/tool/swagger/index.vue b/ZR.Vue3/src/views/tool/swagger/index.vue
new file mode 100644
index 0000000..0e82527
--- /dev/null
+++ b/ZR.Vue3/src/views/tool/swagger/index.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
diff --git a/ZR.Vue3/vite.config.js b/ZR.Vue3/vite.config.js
new file mode 100644
index 0000000..77bf236
--- /dev/null
+++ b/ZR.Vue3/vite.config.js
@@ -0,0 +1,47 @@
+import { defineConfig, loadEnv } from 'vite'
+import path from 'path'
+import createVitePlugins from './vite/plugins'
+
+// https://vitejs.dev/config/
+export default defineConfig(({
+ mode,
+ command
+}) => {
+ const env = loadEnv(mode, process.cwd())
+ return {
+ plugins: createVitePlugins(env, command === 'build'),
+ resolve: {
+ // https://cn.vitejs.dev/config/#resolve-alias
+ alias: {
+ // 设置路径
+ '~': path.resolve(__dirname, './'),
+ // 设置别名
+ '@': path.resolve(__dirname, './src')
+ },
+ // https://cn.vitejs.dev/config/#resolve-extensions
+ extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
+ },
+ // 打包配置
+ build: {
+ sourcemap: command === 'build' ? false : true,
+ target: 'modules',
+ outDir: 'dist', //指定输出目录
+ assetsDir: 'assets', //指定静态资源存储目录
+ minify: 'terser' //混淆器,terser构建后文件体积更小
+ },
+ // vite 相关配置
+ server: {
+ port: 8887,
+ host: true,
+ open: true,
+ proxy: {
+ // https://cn.vitejs.dev/config/#server-proxy
+ '/dev-api': {
+ target: 'http://localhost:8888',
+ changeOrigin: true,
+ rewrite: (path) => path.replace(/^\/dev-api/, '')
+ }
+ },
+ },
+ }
+})
\ No newline at end of file
diff --git a/ZR.Vue3/vite/plugins/auto-import.js b/ZR.Vue3/vite/plugins/auto-import.js
new file mode 100644
index 0000000..62f1c1f
--- /dev/null
+++ b/ZR.Vue3/vite/plugins/auto-import.js
@@ -0,0 +1,14 @@
+import autoImport from 'unplugin-auto-import/vite'
+
+export default function createAutoImport() {
+ return autoImport({
+ imports: [
+ 'vue',
+ 'vue-router',
+ {
+ 'vuex': ['useStore']
+ }
+ ],
+ dts: false
+ })
+}
\ No newline at end of file
diff --git a/ZR.Vue3/vite/plugins/compression.js b/ZR.Vue3/vite/plugins/compression.js
new file mode 100644
index 0000000..2f6fd50
--- /dev/null
+++ b/ZR.Vue3/vite/plugins/compression.js
@@ -0,0 +1,30 @@
+import compression from 'vite-plugin-compression'
+
+export default function createCompression(env) {
+ const {
+ VITE_BUILD_COMPRESS
+ } = env
+ const plugin = []
+ if (VITE_BUILD_COMPRESS) {
+ const compressList = VITE_BUILD_COMPRESS.split(',')
+ if (compressList.includes('gzip')) {
+ // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
+ plugin.push(
+ compression({
+ ext: '.gz',
+ deleteOriginFile: false
+ })
+ )
+ }
+ if (compressList.includes('brotli')) {
+ plugin.push(
+ compression({
+ ext: '.br',
+ algorithm: 'brotliCompress',
+ deleteOriginFile: false
+ })
+ )
+ }
+ }
+ return plugin
+}
\ No newline at end of file
diff --git a/ZR.Vue3/vite/plugins/index.js b/ZR.Vue3/vite/plugins/index.js
new file mode 100644
index 0000000..979843f
--- /dev/null
+++ b/ZR.Vue3/vite/plugins/index.js
@@ -0,0 +1,15 @@
+import vue from '@vitejs/plugin-vue'
+
+import createAutoImport from './auto-import'
+import createSvgIcon from './svg-icon'
+import createCompression from './compression'
+import createSetupExtend from './setup-extend'
+
+export default function createVitePlugins(viteEnv, isBuild = false) {
+ const vitePlugins = [vue()]
+ vitePlugins.push(createAutoImport())
+ vitePlugins.push(createSetupExtend())
+ vitePlugins.push(createSvgIcon(isBuild))
+ isBuild && vitePlugins.push(...createCompression(viteEnv))
+ return vitePlugins
+}
\ No newline at end of file
diff --git a/ZR.Vue3/vite/plugins/setup-extend.js b/ZR.Vue3/vite/plugins/setup-extend.js
new file mode 100644
index 0000000..060dd2b
--- /dev/null
+++ b/ZR.Vue3/vite/plugins/setup-extend.js
@@ -0,0 +1,5 @@
+import setupExtend from 'vite-plugin-vue-setup-extend'
+
+export default function createSetupExtend() {
+ return setupExtend()
+}
\ No newline at end of file
diff --git a/ZR.Vue3/vite/plugins/svg-icon.js b/ZR.Vue3/vite/plugins/svg-icon.js
new file mode 100644
index 0000000..e739bc4
--- /dev/null
+++ b/ZR.Vue3/vite/plugins/svg-icon.js
@@ -0,0 +1,10 @@
+import svgIcon from 'vite-plugin-svg-icons'
+import path from 'path'
+
+export default function createSvgIcon(isBuild) {
+ return svgIcon({
+ iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
+ symbolId: 'icon-[dir]-[name]',
+ svgoOptions: isBuild
+ })
+}
\ No newline at end of file
diff --git a/document/admin-mysql.sql b/document/admin-mysql.sql
index 31a599c..d8da0fe 100644
--- a/document/admin-mysql.sql
+++ b/document/admin-mysql.sql
@@ -680,6 +680,7 @@ insert into sys_config values(2, '用户管理-账号初始密码', 'sys
insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' );
insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(off、关闭,1、动态验证码 2、动态gif泡泡 3、泡泡 4、静态验证码)');
INSERT INTO `sys_config`(`configId`, `configName`, `configKey`, `configValue`, `configType`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (5, '本地文件上传访问域名', 'sys.file.uploadurl', 'http://localhost:8888', 'Y', '', '2022-04-10 10:11:27', '', NULL, NULL);
+INSERT INTO `sys_config`(`configId`, `configName`, `configKey`, `configValue`, `configType`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (6, '开启注册功能', 'sys.account.register', 'true', 'Y', 'admin', '2022-04-14 00:00:00', 'admin', NULL, NULL);
-- ----------------------------
-- 18、代码生成业务表
diff --git a/document/admin-sqlserver.sql b/document/admin-sqlserver.sql
index c116fd4..ad28447 100644
--- a/document/admin-sqlserver.sql
+++ b/document/admin-sqlserver.sql
@@ -698,6 +698,7 @@ insert into sys_config values('用户管理-账号初始密码', 'sys.us
insert into sys_config values('主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', GETDATE(), '', null, '深色主题theme-dark,浅色主题theme-light' );
insert into sys_config values('账号自助-验证码开关', 'sys.account.captchaOnOff', '1', 'Y', 'admin', GETDATE(), '', null, '开启验证码功能(off、关闭,1、动态验证码 2、动态gif泡泡 3、泡泡 4、静态验证码)');
INSERT INTO sys_config VALUES('本地文件上传访问域名', 'sys.file.uploadurl', 'http://localhost:8888', 'Y', 'admin', GETDATE(), '', NULL, NULL);
+INSERT INTO sys_config VALUES('开启注册功能', 'sys.account.register', 'true', 'Y', 'admin', GETDATE(), '', NULL, NULL);
GO