diff --git a/README.md b/README.md index 4597c708f..48490c8f7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## 平台简介 -**芋道** 是基于 [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) **重构**,一套**全部开源**的**企业级**的快速开发平台,毫无保留给个人及企业免费使用。 +**芋道**,一套**全部开源**的**企业级**的快速开发平台,毫无保留给个人及企业免费使用。 > 有任何问题,或者想要的功能,可以在 _Issues_ 中提给艿艿。 @@ -17,39 +17,63 @@ * 基础设施 * 研发工具 +> 友情提示:本项目基于 RuoYi-Vue 修改,**重构优化**后端的代码,**美化**前端的界面。 +> +> 额外新增的功能,我们使用 🚀 标记。 + +🙂 所有功能,都通过 **单元测试** 保证高质量。 + ### 系统功能 -1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置 -1. 在线用户:当前系统中活跃用户状态监控 -1. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分 -1. 菜单管理:配置系统菜单,操作权限,按钮权限标识等 -1. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 -1. 岗位管理:配置系统用户所属担任职务 -1. 字典管理:对系统中经常使用的一些较为固定的数据进行维护 -1. 通知公告:系统通知公告信息发布维护 -1. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询 -1. 登录日志:系统登录日志记录查询包含登录异常 + +| | 功能 | 描述 | +| --- | --- | --- | +| | 用户管理 | 用户是系统操作者,该功能主要完成系统用户配置 | +| | 在线用户 | 当前系统中活跃用户状态监控,支持手动踢下线 | +| | 角色管理 | 角色菜单权限分配、设置角色按机构进行数据范围权限划分 | +| | 菜单管理 | 配置系统菜单,操作权限,按钮权限标识等 | +| | 部门管理 | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | +| | 岗位管理 | 配置系统用户所属担任职务 | +| | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | +| | 通知公告 | 系统通知公告信息发布维护 | +| 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | +| | 登录日志 | 系统登录日志记录查询包含登录异常 | + +计划新增功能: +* 短信 +* 邮件 +* 钉钉、飞书等通知 ### 基础设施 -1. 配置管理:对系统动态配置常用参数 -1. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志 -1. API 日志:包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 -1. MySQL 监控:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 -1. Redis 监控:监控 Redis 数据库的使用情况,使用的 Redis Key 管理 -1. Java 监控:基于 Spring Boot Admin 实现 Java 应用的监控 -1. 链路追踪:基于 SkyWalking 实现性能监控,特别是链路的追踪 -1. 分布式锁:基于 Redis 实现分布式锁,满足并发场景 -1. 幂等组件:基于 Redis 实现幂等组件,解决重复请求问题 -1. 服务保障:基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 -1. 日志服务:轻量级日志中心,查看远程服务器的日志 +| | 功能 | 描述 | +| --- | --- | --- | +| 🚀 | 配置管理 | 对系统动态配置常用参数,支持 SpringBoot 加载 | +| | 定时任务 | 在线(添加、修改、删除)任务调度包含执行结果日志 | +| 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 | +| 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | +| | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | +| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | +| 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | +| 🚀 | 链路追踪 | 基于 SkyWalking 实现性能监控,特别是链路的追踪 | +| 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | +| 🚀 | 幂等组件 | 基于 Redis 实现幂等组件,解决重复请求问题 | +| 🚀 | 服务保障 | 基于 Resilience4j 实现服务的稳定性,包括限流、熔断等功能 | +| 🚀 | 日志服务 | 轻量级日志中心,查看远程服务器的日志 | +| 🚀 | 单元测试 |基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等 | + +计划新增: +* 工作流 +* 错误码 ### 研发工具 -1. 表单构建:拖动表单元素生成相应的 HTML 代码 -1. 代码生成:前后端代码的生成(Java、Vue、SQL),支持 CRUD 下载 -1. 系统接口:基于 Swagger 自动生成相关的 RESTful API 接口文档 -1. 数据库文档:基于 Screw 自动生成数据库文档 +| | 功能 | 描述 | +| --- | --- | --- | +| 🚀 | 代码生成 |前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载 | +| 🚀 | 系统接口 | 基于 Swagger 自动生成相关的 RESTful API 接口文档 | +| 🚀 | 数据库文档 | 基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式 | +| | 表单构建 | 拖动表单元素生成相应的 HTML 代码 | ## 在线体验 @@ -78,12 +102,14 @@ | [Hibernate Validator](https://github.com/hibernate/hibernate-validator) | 参数校验组件 | 6.1.7 | [文档](http://www.iocoder.cn/Spring-Boot/Validation/?yudao) | | [Quartz](https://github.com/quartz-scheduler) | 任务调度组件 | 2.3.2 | [文档](http://www.iocoder.cn/Spring-Boot/Job/?yudao) | | [Knife4j](https://gitee.com/xiaoym/knife4j) | Swagger 增强 UI 实现 | 3.0.2 | [文档](http://www.iocoder.cn/Spring-Boot/Swagger/?yudao) | -| [Resilience4j](https://github.com/quartz-scheduler) | 服务保障组件 | 1.7.0 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) | +| [Resilience4j](https://github.com/resilience4j/resilience4j) | 服务保障组件 | 1.7.0 | [文档](http://www.iocoder.cn/Spring-Boot/Resilience4j/?yudao) | | [SkyWalking](https://skywalking.apache.org/) | 分布式应用追踪系统 | 8.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/SkyWalking/?yudao) | -| [Spring Boot Admin](https://github.com/skywalking) | Spring Boot 监控平台 | 8.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) | +| [Spring Boot Admin](https://github.com/codecentric/spring-boot-admin) | Spring Boot 监控平台 | 8.6.0 | [文档](http://www.iocoder.cn/Spring-Boot/Admin/?yudao) | | [Jackson](https://github.com/FasterXML/jackson) | JSON 工具库 | 2.11.4 | | | [MapStruct](https://mapstruct.org/) | Java Bean 转换 | 1.4.1 | [文档](http://www.iocoder.cn/Spring-Boot/MapStruct/?yudao) | -| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码| 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) | +| [Lombok](https://projectlombok.org/) | 消除冗长的 Java 代码 | 1.16.14 | [文档](http://www.iocoder.cn/Spring-Boot/Lombok/?yudao) | +| [JUnit](https://junit.org/junit5/) | Java 单元测试框架 | 5.7.0 | - | +| [Mockito](https://github.com/mockito/mockito) | Java Mock 框架 | 3.6.28 | - | **前端** @@ -125,7 +151,7 @@ - + - diff --git a/lombok.config b/lombok.config new file mode 100644 index 000000000..c6488faea --- /dev/null +++ b/lombok.config @@ -0,0 +1,4 @@ +config.stopBubbling = true +lombok.tostring.callsuper=true +lombok.equalsandhashcode.callsuper=true +lombok.accessors.chain=true diff --git a/pom.xml b/pom.xml index 4fe238cb9..949978260 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ - 4.0.0 + 4.0.0 cn.iocoder dashboard @@ -22,14 +22,15 @@ ${java.version} 3.8.0 - 2.4.2 + 2.4.4 3.0.2 + 1.5.22 5.1.46 1.2.4 - 3.4.1 - 3.14.1 + 3.4.2 + 3.15.1 1.7.0 @@ -41,10 +42,11 @@ 1.16.14 1.4.1.Final - 5.5.6 + 5.6.1 2.2.7 2.2 1.0.5 + @@ -100,8 +102,21 @@ mapstruct org.mapstruct + + guava + com.google.guava + + + swagger-annotations + io.swagger + + + io.swagger + swagger-annotations + ${swagger-annotations.version} + @@ -144,6 +159,12 @@ com.baomidou lock4j-redisson-spring-boot-starter ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + @@ -175,6 +196,12 @@ org.springframework.boot spring-boot-starter-test test + + + asm + org.ow2.asm + + @@ -209,6 +236,12 @@ mapstruct ${mapstruct.version} + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + true + org.mapstruct mapstruct-jdk8 @@ -217,27 +250,7 @@ cn.hutool - hutool-core - ${hutool.version} - - - cn.hutool - hutool-extra - ${hutool.version} - - - cn.hutool - hutool-captcha - ${hutool.version} - - - cn.hutool - hutool-http - ${hutool.version} - - - cn.hutool - hutool-crypto + hutool-all ${hutool.version} @@ -259,6 +272,27 @@ ${screw.version} + + + + + com.yunpian.sdk + yunpian-java-sdk + 1.2.7 + + + + com.aliyun + aliyun-java-sdk-core + 4.5.18 + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.1.0 + + + diff --git a/ruoyi-ui/.env.demo1024 b/ruoyi-ui/.env.demo1024 new file mode 100644 index 000000000..ffeadbf8c --- /dev/null +++ b/ruoyi-ui/.env.demo1024 @@ -0,0 +1,7 @@ +NODE_ENV = production + +# 测试环境配置 +ENV = 'staging' + +# 芋道管理系统/测试环境 +VUE_APP_BASE_API = 'http://127.0.0.1:48080' diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 46718e1b0..1249d16b3 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -8,6 +8,7 @@ "dev": "vue-cli-service serve", "build:prod": "vue-cli-service build", "build:stage": "vue-cli-service build --mode staging", + "build:demo1024": "vue-cli-service build --mode demo1024", "preview": "node build/index.js --preview", "lint": "eslint --ext .js,.vue src" }, diff --git a/ruoyi-ui/src/api/infra/dbDoc.js b/ruoyi-ui/src/api/infra/dbDoc.js index de54981d1..015c6d71d 100644 --- a/ruoyi-ui/src/api/infra/dbDoc.js +++ b/ruoyi-ui/src/api/infra/dbDoc.js @@ -8,3 +8,19 @@ export function exportHtml() { responseType: 'blob' }) } + +export function exportWord() { + return request({ + url: '/infra/db-doc/export-word', + method: 'get', + responseType: 'blob' + }) +} + +export function exportMarkdown() { + return request({ + url: '/infra/db-doc/export-markdown', + method: 'get', + responseType: 'blob' + }) +} diff --git a/ruoyi-ui/src/api/infra/file.js b/ruoyi-ui/src/api/infra/file.js new file mode 100644 index 000000000..2aeda2e90 --- /dev/null +++ b/ruoyi-ui/src/api/infra/file.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 删除文件 +export function deleteFile(id) { + return request({ + url: '/infra/file/delete?id=' + id, + method: 'delete' + }) +} + +// 获得文件分页 +export function getFilePage(query) { + return request({ + url: '/infra/file/page', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/api/system/dept.js b/ruoyi-ui/src/api/system/dept.js index c22f0f4a8..d8c59cf9a 100644 --- a/ruoyi-ui/src/api/system/dept.js +++ b/ruoyi-ui/src/api/system/dept.js @@ -46,7 +46,7 @@ export function addDept(data) { export function updateDept(data) { return request({ url: '/system/dept/update', - method: 'post', + method: 'put', data: data }) } @@ -55,6 +55,6 @@ export function updateDept(data) { export function delDept(id) { return request({ url: '/system/dept/delete?id=' + id, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/dict/data.js b/ruoyi-ui/src/api/system/dict/data.js index c29b2f81f..00e614b15 100644 --- a/ruoyi-ui/src/api/system/dict/data.js +++ b/ruoyi-ui/src/api/system/dict/data.js @@ -38,7 +38,7 @@ export function addData(data) { export function updateData(data) { return request({ url: '/system/dict-data/update', - method: 'post', + method: 'put', data: data }) } @@ -47,7 +47,7 @@ export function updateData(data) { export function delData(dictCode) { return request({ url: '/system/dict-data/delete?id=' + dictCode, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/dict/type.js b/ruoyi-ui/src/api/system/dict/type.js index a1423f1d6..9fe10d418 100644 --- a/ruoyi-ui/src/api/system/dict/type.js +++ b/ruoyi-ui/src/api/system/dict/type.js @@ -30,7 +30,7 @@ export function addType(data) { export function updateType(data) { return request({ url: '/system/dict-type/update', - method: 'post', + method: 'put', data: data }) } @@ -39,7 +39,7 @@ export function updateType(data) { export function delType(dictId) { return request({ url: '/system/dict-type/delete?id=' + dictId, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/menu.js b/ruoyi-ui/src/api/system/menu.js index fb3fa6e98..b378b01d9 100644 --- a/ruoyi-ui/src/api/system/menu.js +++ b/ruoyi-ui/src/api/system/menu.js @@ -38,7 +38,7 @@ export function addMenu(data) { export function updateMenu(data) { return request({ url: '/system/menu/update', - method: 'post', + method: 'put', data: data }) } @@ -47,6 +47,6 @@ export function updateMenu(data) { export function delMenu(id) { return request({ url: '/system/menu/delete?id=' + id, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/notice.js b/ruoyi-ui/src/api/system/notice.js index 744bba745..b8c7cf709 100644 --- a/ruoyi-ui/src/api/system/notice.js +++ b/ruoyi-ui/src/api/system/notice.js @@ -30,7 +30,7 @@ export function addNotice(data) { export function updateNotice(data) { return request({ url: '/system/notice/update', - method: 'post', + method: 'put', data: data }) } @@ -39,6 +39,6 @@ export function updateNotice(data) { export function delNotice(noticeId) { return request({ url: '/system/notice/delete?id=' + noticeId, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/post.js b/ruoyi-ui/src/api/system/post.js index cb1dfc3e5..3ef4a9906 100644 --- a/ruoyi-ui/src/api/system/post.js +++ b/ruoyi-ui/src/api/system/post.js @@ -38,7 +38,7 @@ export function addPost(data) { export function updatePost(data) { return request({ url: '/system/post/update', - method: 'post', + method: 'put', data: data }) } @@ -47,7 +47,7 @@ export function updatePost(data) { export function delPost(postId) { return request({ url: '/system/post/delete?id=' + postId, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/role.js b/ruoyi-ui/src/api/system/role.js index 36edcc2dd..27bb0500b 100644 --- a/ruoyi-ui/src/api/system/role.js +++ b/ruoyi-ui/src/api/system/role.js @@ -38,7 +38,7 @@ export function addRole(data) { export function updateRole(data) { return request({ url: '/system/role/update', - method: 'post', + method: 'put', data: data }) } @@ -51,7 +51,7 @@ export function changeRoleStatus(id, status) { } return request({ url: '/system/role/update-status', - method: 'post', + method: 'put', data: data }) } @@ -60,7 +60,7 @@ export function changeRoleStatus(id, status) { export function delRole(roleId) { return request({ url: '/system/role/delete?id=' + roleId, - method: 'post' + method: 'delete' }) } diff --git a/ruoyi-ui/src/api/system/sms/smsChannel.js b/ruoyi-ui/src/api/system/sms/smsChannel.js new file mode 100644 index 000000000..4e38de05f --- /dev/null +++ b/ruoyi-ui/src/api/system/sms/smsChannel.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +// 创建短信渠道 +export function createSmsChannel(data) { + return request({ + url: '/system/sms-channel/create', + method: 'post', + data: data + }) +} + +// 更新短信渠道 +export function updateSmsChannel(data) { + return request({ + url: '/system/sms-channel/update', + method: 'put', + data: data + }) +} + +// 删除短信渠道 +export function deleteSmsChannel(id) { + return request({ + url: '/system/sms-channel/delete?id=' + id, + method: 'delete' + }) +} + +// 获得短信渠道 +export function getSmsChannel(id) { + return request({ + url: '/system/sms-channel/get?id=' + id, + method: 'get' + }) +} + +// 获得短信渠道分页 +export function getSmsChannelPage(query) { + return request({ + url: '/system/sms-channel/page', + method: 'get', + params: query + }) +} + +// 获得短信渠道精简列表 +export function getSimpleSmsChannels() { + return request({ + url: '/system/sms-channel/list-all-simple', + method: 'get', + }) +} diff --git a/ruoyi-ui/src/api/system/sms/smsLog.js b/ruoyi-ui/src/api/system/sms/smsLog.js new file mode 100644 index 000000000..8a9083b71 --- /dev/null +++ b/ruoyi-ui/src/api/system/sms/smsLog.js @@ -0,0 +1,20 @@ +import request from '@/utils/request' + +// 获得短信日志分页 +export function getSmsLogPage(query) { + return request({ + url: '/system/sms-log/page', + method: 'get', + params: query + }) +} + +// 导出短信日志 Excel +export function exportSmsLogExcel(query) { + return request({ + url: '/system/sms-log/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} diff --git a/ruoyi-ui/src/api/system/sms/smsTemplate.js b/ruoyi-ui/src/api/system/sms/smsTemplate.js new file mode 100644 index 000000000..d6d933044 --- /dev/null +++ b/ruoyi-ui/src/api/system/sms/smsTemplate.js @@ -0,0 +1,64 @@ +import request from '@/utils/request' + +// 创建短信模板 +export function createSmsTemplate(data) { + return request({ + url: '/system/sms-template/create', + method: 'post', + data: data + }) +} + +// 更新短信模板 +export function updateSmsTemplate(data) { + return request({ + url: '/system/sms-template/update', + method: 'put', + data: data + }) +} + +// 删除短信模板 +export function deleteSmsTemplate(id) { + return request({ + url: '/system/sms-template/delete?id=' + id, + method: 'delete' + }) +} + +// 获得短信模板 +export function getSmsTemplate(id) { + return request({ + url: '/system/sms-template/get?id=' + id, + method: 'get' + }) +} + +// 获得短信模板分页 +export function getSmsTemplatePage(query) { + return request({ + url: '/system/sms-template/page', + method: 'get', + params: query + }) +} + +// 创建短信模板 +export function sendSms(data) { + return request({ + url: '/system/sms-template/send-sms', + method: 'post', + data: data + }) +} + +// 导出短信模板 Excel +export function exportSmsTemplateExcel(query) { + return request({ + url: '/system/sms-template/export-excel', + method: 'get', + params: query, + responseType: 'blob' + }) +} + diff --git a/ruoyi-ui/src/api/system/user.js b/ruoyi-ui/src/api/system/user.js index 7676e2bcb..cf0f007d5 100644 --- a/ruoyi-ui/src/api/system/user.js +++ b/ruoyi-ui/src/api/system/user.js @@ -31,7 +31,7 @@ export function addUser(data) { export function updateUser(data) { return request({ url: '/system/user/update', - method: 'post', + method: 'put', data: data }) } @@ -62,7 +62,7 @@ export function resetUserPwd(id, password) { } return request({ url: '/system/user/update-password', - method: 'post', + method: 'put', data: data }) } @@ -75,7 +75,7 @@ export function changeUserStatus(id, status) { } return request({ url: '/system/user/update-status', - method: 'post', + method: 'put', data: data }) } @@ -83,7 +83,7 @@ export function changeUserStatus(id, status) { // 查询用户个人信息 export function getUserProfile() { return request({ - url: '/system/user/profile', + url: '/system/user/profile/get', method: 'get' }) } @@ -91,7 +91,7 @@ export function getUserProfile() { // 修改用户个人信息 export function updateUserProfile(data) { return request({ - url: '/system/user/profile', + url: '/system/user/profile/update', method: 'put', data: data }) @@ -104,9 +104,9 @@ export function updateUserPwd(oldPassword, newPassword) { newPassword } return request({ - url: '/system/user/profile/updatePwd', + url: '/system/user/profile/update-password', method: 'put', - params: data + data: data }) } @@ -114,7 +114,7 @@ export function updateUserPwd(oldPassword, newPassword) { export function uploadAvatar(data) { return request({ url: '/system/user/profile/avatar', - method: 'post', + method: 'put', data: data }) } diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 91556bf68..e1f067fa1 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -25,7 +25,10 @@ import { download, handleTree, downloadExcel, - downloadZip + downloadWord, + downloadZip, + downloadHtml, + downloadMarkdown, } from "@/utils/ruoyi"; import Pagination from "@/components/Pagination"; // 自定义表格工具扩展 @@ -48,6 +51,9 @@ Vue.prototype.getDictDataLabel = getDictDataLabel Vue.prototype.DICT_TYPE = DICT_TYPE Vue.prototype.download = download Vue.prototype.downloadExcel = downloadExcel +Vue.prototype.downloadWord = downloadWord +Vue.prototype.downloadHtml = downloadHtml +Vue.prototype.downloadMarkdown = downloadMarkdown Vue.prototype.downloadZip = downloadZip Vue.prototype.handleTree = handleTree diff --git a/ruoyi-ui/src/store/modules/user.js b/ruoyi-ui/src/store/modules/user.js index 82b2b18fa..f7084c59c 100644 --- a/ruoyi-ui/src/store/modules/user.js +++ b/ruoyi-ui/src/store/modules/user.js @@ -53,7 +53,7 @@ const user = { getInfo(state.token).then(res => { res = res.data; // 读取 data 数据 const user = res.user - const avatar = user.avatar === "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar; + const avatar = user.avatar === "" ? require("@/assets/images/profile.jpg") : user.avatar; if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 commit('SET_ROLES', res.roles) commit('SET_PERMISSIONS', res.permissions) diff --git a/ruoyi-ui/src/utils/dict.js b/ruoyi-ui/src/utils/dict.js index 3817a86fe..e3dc92d5b 100644 --- a/ruoyi-ui/src/utils/dict.js +++ b/ruoyi-ui/src/utils/dict.js @@ -17,6 +17,10 @@ export const DICT_TYPE = { SYS_OPERATE_TYPE: 'sys_operate_type', SYS_LOGIN_RESULT: 'sys_login_result', SYS_CONFIG_TYPE: 'sys_config_type', + SYS_SMS_CHANNEL_CODE: 'sys_sms_channel_code', + SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type', + SYS_SMS_SEND_STATUS: 'sys_sms_send_status', + SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status', INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type', INF_JOB_STATUS: 'inf_job_status', diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 759f03433..c063ec300 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -73,6 +73,18 @@ service.interceptors.response.use(res => { type: 'error' }) return Promise.reject(new Error(msg)) + } else if (code === 901) { + Message({ + type: 'error', + duration: 0, + dangerouslyUseHTMLString: true, + message: '
演示模式,不发进行写操作
' + + '
 
' + + '
参考 https://www.iocoder.cn/Yudao/build-debugger-environment 教程
' + + '
 
' + + '
5 分钟搭建本地环境
', + }) + return Promise.reject(new Error(msg)) } else if (code !== 200) { Notification.error({ title: msg diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index 17f235f22..82f8aecc5 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -120,11 +120,26 @@ export function downloadExcel(data, fileName) { download0(data, fileName, 'application/vnd.ms-excel'); } +// 下载 Word 方法 +export function downloadWord(data, fileName) { + download0(data, fileName, 'application/msword'); +} + // 下载 Zip 方法 export function downloadZip(data, fileName) { download0(data, fileName, 'application/zip'); } +// 下载 Html 方法 +export function downloadHtml(data, fileName) { + download0(data, fileName, 'text/html'); +} + +// 下载 Markdown 方法 +export function downloadMarkdown(data, fileName) { + download0(data, fileName, 'text/markdown'); +} + function download0(data, fileName, mineType) { // 创建 blob let blob = new Blob([data], {type: mineType}); diff --git a/ruoyi-ui/src/views/infra/config/index.vue b/ruoyi-ui/src/views/infra/config/index.vue index 592a40f6b..6b880d24c 100644 --- a/ruoyi-ui/src/views/infra/config/index.vue +++ b/ruoyi-ui/src/views/infra/config/index.vue @@ -2,24 +2,12 @@
- + - + @@ -56,7 +44,7 @@ icon="el-icon-plus" size="mini" @click="handleAdd" - v-hasPermi="['infra:config:add']" + v-hasPermi="['infra:config:create']" >新增 @@ -95,31 +83,15 @@ - + diff --git a/ruoyi-ui/src/views/infra/file/index.vue b/ruoyi-ui/src/views/infra/file/index.vue new file mode 100644 index 000000000..5eaf41655 --- /dev/null +++ b/ruoyi-ui/src/views/infra/file/index.vue @@ -0,0 +1,202 @@ + + + diff --git a/ruoyi-ui/src/views/system/dept/index.vue b/ruoyi-ui/src/views/system/dept/index.vue index 5485703ac..0fc5a8733 100644 --- a/ruoyi-ui/src/views/system/dept/index.vue +++ b/ruoyi-ui/src/views/system/dept/index.vue @@ -2,22 +2,11 @@
- + - + @@ -28,24 +17,13 @@ - 新增 + 新增 - + @@ -56,28 +34,12 @@ @@ -119,11 +81,8 @@ - {{dict.label}} + + {{dict.label}} diff --git a/ruoyi-ui/src/views/system/dict/data.vue b/ruoyi-ui/src/views/system/dict/data.vue index 262ea31bb..13d262303 100644 --- a/ruoyi-ui/src/views/system/dict/data.vue +++ b/ruoyi-ui/src/views/system/dict/data.vue @@ -3,31 +3,15 @@ - + - + - + @@ -38,22 +22,12 @@ - 新增 + 新增 - 导出 + 导出 @@ -72,31 +46,16 @@ - + @@ -115,11 +74,7 @@ - {{dict.label}} + {{dict.label}} diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/ruoyi-ui/src/views/system/dict/index.vue index 0e775eaf6..a730e61bf 100644 --- a/ruoyi-ui/src/views/system/dict/index.vue +++ b/ruoyi-ui/src/views/system/dict/index.vue @@ -2,52 +2,19 @@
- + - + - - + + - + 搜索 @@ -57,22 +24,12 @@ - 新增 + 新增 - 导出 + 导出 @@ -96,31 +53,16 @@ - + @@ -133,11 +75,7 @@ - {{dict.label}} + {{dict.label}} @@ -177,7 +115,7 @@ export default { // 状态数据字典 statusOptions: [], // 日期范围 - dateRange: [], + dateRangeCreateTime: [], // 查询参数 queryParams: { pageNo: 1, @@ -211,15 +149,15 @@ export default { /** 查询字典类型列表 */ getList() { this.loading = true; - listType(this.addDateRange(this.queryParams, [ - this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, - this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, - ])).then(response => { - this.typeList = response.data.list; - this.total = response.data.total; - this.loading = false; - } - ); + // 处理查询参数 + let params = {...this.queryParams}; + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); + // 执行查询 + listType(params).then(response => { + this.typeList = response.data.list; + this.total = response.data.total; + this.loading = false; + }); }, // 字典状态字典翻译 statusFormat(row, column) { @@ -248,7 +186,7 @@ export default { }, /** 重置按钮操作 */ resetQuery() { - this.dateRange = []; + this.dateRangeCreateTime = []; this.resetForm("queryForm"); this.handleQuery(); }, @@ -304,19 +242,21 @@ export default { }, /** 导出按钮操作 */ handleExport() { - const queryParams = this.addDateRange(this.queryParams, [ - this.dateRange[0] ? this.dateRange[0] + ' 00:00:00' : undefined, - this.dateRange[1] ? this.dateRange[1] + ' 23:59:59' : undefined, - ]); - this.$confirm('是否确认导出所有类型数据项?', "警告", { - confirmButtonText: "确定", - cancelButtonText: "取消", - type: "warning" - }).then(function() { - return exportType(queryParams); - }).then(response => { - this.downloadExcel(response, '数据类型.xls'); - }) + // 处理查询参数 + let params = {...this.queryParams}; + params.pageNo = undefined; + params.pageSize = undefined; + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); + // 执行导出 + this.$confirm('是否确认导出所有字典类型数据项?', "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(function() { + return exportType(params); + }).then(response => { + this.downloadExcel(response, '字典类型.xls'); + }) } } }; diff --git a/ruoyi-ui/src/views/system/loginlog/index.vue b/ruoyi-ui/src/views/system/loginlog/index.vue index 601c9420f..5e572aa94 100644 --- a/ruoyi-ui/src/views/system/loginlog/index.vue +++ b/ruoyi-ui/src/views/system/loginlog/index.vue @@ -2,56 +2,22 @@
- + - + - - - + + + - + 搜索 @@ -61,13 +27,8 @@ - 导出 + 导出 @@ -76,7 +37,7 @@ @@ -95,13 +56,8 @@ - +
diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue index e2e759eeb..767878e2e 100644 --- a/ruoyi-ui/src/views/system/menu/index.vue +++ b/ruoyi-ui/src/views/system/menu/index.vue @@ -2,22 +2,11 @@
- + - + @@ -28,23 +17,14 @@ - 新增 + 新增 - +