diff --git a/README.md b/README.md index 1483d2f8..2779fda9 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=RuoYi-Vue-Plus)
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-2.5.2-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-2.6.0-success.svg)](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.4-blue.svg)]() [![JDK-8+](https://img.shields.io/badge/JDK-8+-green.svg)]() [![JDK-11](https://img.shields.io/badge/JDK-11-green.svg)]() RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期与 RuoYi-Vue 同步 -集成 Lock4j dynamic-datasource 等分布式场景解决方案 +集成 Lock4j dynamic-datasource OSS存储 等分布式场景解决方案 集成 Mybatis-Plus Lombok Hutool 等便捷开发工具 适配重写相关业务 便于开发 @@ -33,6 +33,7 @@ RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期 * Redis客户端 采用 Redisson 性能更强 * 分布式锁 Lock4j 注解锁、工具锁 多种多样 * 部署方式 Docker 容器编排 一键部署业务集群 +* 文件存储 OSS 对象存储模块 支持(Minio、七牛、阿里、腾讯) ## 参考文档 @@ -89,13 +90,14 @@ RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 `分布式集群` 场景升级 定期 * 集成 dynamic-datasource 多数据源(默认支持MySQL,其他种类需自行适配) * 集成 Lock4j 实现分布式 注解锁、工具锁 多种多样 * 增加 Docker 容器编排 打包插件与部署脚本 +* 移除 本地文件上传 改为 OSS对象存储 支持(Minio、七牛、阿里、腾讯) ### 代码改动 * 所有原生功能使用 Mybatis-Plus 与 Lombok 重写 * 增加 IServicePlus 与 BaseMapperPlus 可自定义通用方法 * 代码生成模板 改为适配 Mybatis-Plus 的代码 -* 代码生成模板 拆分出 Vo,QueryBo,AddBo,EditBo 等领域对象 +* 代码生成模板 根据 Alibaba 代码规约 拆分出 VO、BO 等领域对象 * 代码生成模板 增加 文档注解 与 校验注解 简化通用操作 * 项目修改为 maven多环境配置 * 项目配置修改为 application.yml 统一管理 diff --git a/docker/deploy.sh b/docker/deploy.sh index 3b6e6965..79fb9ae5 100644 --- a/docker/deploy.sh +++ b/docker/deploy.sh @@ -6,10 +6,17 @@ usage() { exit 1 } -#开启所需端口 +#开启所需端口(生产环境不推荐开启) port(){ + # mysql 端口 firewall-cmd --add-port=3306/tcp --permanent + # redis 端口 firewall-cmd --add-port=6379/tcp --permanent + # minio api 端口 + firewall-cmd --add-port=9000/tcp --permanent + # minio 控制台端口 + firewall-cmd --add-port=9001/tcp --permanent + # 重启防火墙 service firewalld restart } @@ -24,7 +31,7 @@ mount(){ #启动基础模块 base(){ - docker-compose up -d mysql nginx-web redis + docker-compose up -d mysql nginx-web redis minio } #启动基础模块 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 3413cf61..ac065c35 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -18,6 +18,8 @@ services: - /docker/mysql/data/:/var/lib/mysql/ # 配置挂载 - /docker/mysql/conf/:/etc/mysql/conf.d/ + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro command: # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配) --default-authentication-plugin=mysql_native_password @@ -68,6 +70,8 @@ services: - /docker/redis/conf/redis.conf:/redis.conf:rw # 数据文件 - /docker/redis/data:/data:rw + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro command: "redis-server --appendonly yes" privileged: true restart: always @@ -75,8 +79,35 @@ services: ruoyi_net: ipv4_address: 172.30.0.48 + minio: + image: minio/minio:RELEASE.2021-07-08T01-15-01Z + hostname: "minio" + ports: + # api 端口 + - 9000:9000 + # 控制台端口 + - 9001:9001 + environment: + # 管理后台用户名 + MINIO_ACCESS_KEY: ruoyi + # 管理后台密码,最小8个字符 + MINIO_SECRET_KEY: ruoyi123 + volumes: + # 映射当前目录下的data目录至容器内/data目录 + - /docker/minio/data:/data + # 映射配置目录 + - /docker/minio/config:/root/.minio/ + # 主机本机时间文件映射 与本机时间同步 + - /etc/localtime:/etc/localtime:ro + command: server --console-address ':9001' /data # 指定容器中的目录 /data + privileged: true + restart: always + networks: + ruoyi_net: + ipv4_address: 172.30.0.54 + ruoyi-server1: - image: "ruoyi/ruoyi-server:2.5.2" + image: "ruoyi/ruoyi-server:2.6.0" environment: - TZ=Asia/Shanghai volumes: @@ -90,7 +121,7 @@ services: ipv4_address: 172.30.0.60 ruoyi-server2: - image: "ruoyi/ruoyi-server:2.5.2" + image: "ruoyi/ruoyi-server:2.6.0" environment: - TZ=Asia/Shanghai volumes: @@ -104,7 +135,7 @@ services: ipv4_address: 172.30.0.61 ruoyi-monitor-admin: - image: "ruoyi/ruoyi-monitor-admin:2.5.2" + image: "ruoyi/ruoyi-monitor-admin:2.6.0" environment: - TZ=Asia/Shanghai privileged: true diff --git a/pom.xml b/pom.xml index 426eec2b..0454126e 100644 --- a/pom.xml +++ b/pom.xml @@ -6,15 +6,15 @@ com.ruoyi ruoyi-vue-plus - 2.5.2 + 2.6.0 RuoYi-Vue-Plus https://gitee.com/JavaLionLi/RuoYi-Vue-Plus RuoYi-Vue-Plus后台管理系统 - 2.5.2 - 2.4.8 + 2.6.0 + 2.5.3 UTF-8 UTF-8 1.8 @@ -25,19 +25,25 @@ 1.7 0.9.1 3.4.3 - 5.7.4 + 5.7.6 3.0.3 11.0 2.4.3 - 3.16.0 + 3.16.1 2.2.1 - 3.4.0 + 3.4.1 + + + 7.8.0 + 3.13.0 + 5.6.47 + 8.3.0 localhost http://${docker.registry.url}:2375 ruoyi - 1.2.0 + 1.2.2 @@ -180,6 +186,13 @@ ${ruoyi-vue-plus.version} + + + com.ruoyi + ruoyi-oss + ${ruoyi-vue-plus.version} + + com.ruoyi @@ -199,6 +212,7 @@ ruoyi-common ruoyi-demo ruoyi-extend + ruoyi-oss pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index f6b8d633..ba0ad325 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 jar @@ -42,6 +42,11 @@ ruoyi-quartz + + com.ruoyi + ruoyi-oss + + com.ruoyi diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index d61f99f2..04aa77b3 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -3,24 +3,16 @@ package com.ruoyi.web.controller.common; import cn.hutool.core.util.StrUtil; import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.constant.Constants; -import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; -import com.ruoyi.framework.config.ServerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.util.HashMap; -import java.util.Map; /** * 通用请求处理 @@ -32,9 +24,6 @@ public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); - @Autowired - private ServerConfig serverConfig; - /** * 通用下载请求 * @@ -67,30 +56,6 @@ public class CommonController } } - /** - * 通用上传请求 - */ - @PostMapping("/common/upload") - public AjaxResult uploadFile(MultipartFile file) throws Exception - { - try - { - // 上传文件路径 - String filePath = RuoYiConfig.getUploadPath(); - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - String url = serverConfig.getUrl() + fileName; - Map ajax = new HashMap<>(); - ajax.put("fileName", fileName); - ajax.put("url", url); - return AjaxResult.success(ajax); - } - catch (Exception e) - { - return AjaxResult.error(e.getMessage()); - } - } - /** * 本地资源通用下载 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java index 31ca6dda..39f5bc6d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java @@ -69,9 +69,12 @@ public class SysProfileController extends BaseController { return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + SysUser sysUser = loginUser.getUser(); + user.setUserId(sysUser.getUserId()); + user.setPassword(null); if (userService.updateUserProfile(user) > 0) { - LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); // 更新缓存用户信息 loginUser.getUser().setNickName(user.getNickName()); loginUser.getUser().setPhonenumber(user.getPhonenumber()); diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 34e2c0c5..6491c855 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -42,6 +42,10 @@ spring: testOnReturn: false # 注意这个值和druid原生不一致,默认启动了stat filters: stat + +--- # druid 配置 +spring: + datasource: druid: webStatFilter: enabled: true @@ -63,7 +67,9 @@ spring: wall: config: multi-statement-allow: true - # redis 配置 + +--- # redis 配置 +spring: redis: # 地址 host: localhost @@ -78,7 +84,6 @@ spring: # 是否开启ssl ssl: false ---- # redisson 客户端配置 redisson: # 线程池数量 threads: 16 @@ -137,3 +142,42 @@ management: endpoint: logfile: external-file: ./logs/sys-console.log + +--- # OSS 云存储(界面 <参数设置> 可切换) +cloud-storage: + # minio配置 + minio: + endpoint: http://localhost:9000 + accessKey: ruoyi + secretKey: ruoyi123 + bucketName: ruoyi + # 七牛云配置 + qiniu: + domain: http://XXX.XXXX.com + prefix: + accessKey: XXXXXXXXXXXXXXX + secretKey: XXXXXXXXXXXXXXX + bucketName: ruoyi + isHttps: false + # z0 华东 z1 华北 z2 华南 na0 北美 as0 东南亚 + # 不填为自动获取(性能低 易出问题) + region: z0 + # 阿里云配置 + aliyun: + endpoint: http://oss-cn-beijing.aliyuncs.com + prefix: + accessKeyId: XXXXXXXXXXXXXXX + accessKeySecret: XXXXXXXXXXXXXXX + bucketName: ruoyi + # 腾讯云配置 + qcloud: + endpoint: http://cos.ap-beijing.myqcloud.com + prefix: + secretId: XXXXXXXXXXXXXXX + secretKey: XXXXXXXXXXXXXXX + # 腾讯云bucket名规则 格式为 BucketName-APPID 此处填写的存储桶名称必须为此格式 + bucketName: ruoyi-1250000000 + isHttps: false + # 地域名参考官方文档 + # https://cloud.tencent.com/document/product/436/6224 + region: ap-beijing diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 7d9801f2..2640bc0e 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -42,6 +42,10 @@ spring: testOnReturn: false # 注意这个值和druid原生不一致,默认启动了stat filters: stat + +--- # druid 配置 +spring: + datasource: druid: webStatFilter: enabled: true @@ -63,7 +67,9 @@ spring: wall: config: multi-statement-allow: true - # redis 配置 + +--- # redis 配置 +spring: redis: # 地址 host: 172.30.0.48 @@ -78,7 +84,6 @@ spring: # 是否开启ssl ssl: false ---- # redisson 客户端配置 redisson: # 线程池数量 threads: 16 @@ -137,3 +142,42 @@ management: endpoint: logfile: external-file: ./logs/sys-console.log + +--- # OSS 云存储(界面 <参数设置> 可切换) +cloud-storage: + # minio配置 + minio: + endpoint: http://172.30.0.54:9000 + accessKey: ruoyi + secretKey: ruoyi123 + bucketName: ruoyi + # 七牛云配置 + qiniu: + domain: http://XXX.XXXX.com + prefix: + accessKey: XXXXXXXXXXXXXXX + secretKey: XXXXXXXXXXXXXXX + bucketName: ruoyi + isHttps: false + # z0 华东 z1 华北 z2 华南 na0 北美 as0 东南亚 + # 不填为自动获取(性能低 易出问题) + region: z0 + # 阿里云配置 + aliyun: + endpoint: http://oss-cn-beijing.aliyuncs.com + prefix: + accessKeyId: XXXXXXXXXXXXXXX + accessKeySecret: XXXXXXXXXXXXXXX + bucketName: ruoyi + # 腾讯云配置 + qcloud: + endpoint: http://cos.ap-beijing.myqcloud.com + prefix: + secretId: XXXXXXXXXXXXXXX + secretKey: XXXXXXXXXXXXXXX + # 腾讯云bucket名规则 格式为 BucketName-APPID 此处填写的存储桶名称必须为此格式 + bucketName: ruoyi-1250000000 + isHttps: false + # 地域名参考官方文档 + # https://cloud.tencent.com/document/product/436/6224 + region: ap-beijing diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index dc97609a..016c4576 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java index 21b0ecce..710f11af 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java @@ -1,6 +1,6 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; @@ -11,7 +11,6 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.function.Function; -import java.util.stream.Collectors; /** * 自定义 Service 接口, 实现 数据库实体与 vo 对象转换返回 @@ -19,225 +18,153 @@ import java.util.stream.Collectors; * @author Lion Li * @since 2021-05-13 */ -public interface IServicePlus extends IService { +public interface IServicePlus extends IService { - /** - * 根据 ID 查询 - * - * @param kClass vo类型 - * @param id 主键ID - */ - default K getVoById(Serializable id, Class kClass) { - T t = getBaseMapper().selectById(id); - return BeanUtil.toBean(t, kClass); - } + /** + * @param id 主键id + * @param copyOptions copy条件 + * @return K对象 + */ + K getVoById(Serializable id, CopyOptions copyOptions); - /** - * 根据 ID 查询 - * - * @param id 主键ID - * @param convertor 转换函数 - * @param vo类型 - */ - default K getVoById(Serializable id, Function convertor) { - T t = getBaseMapper().selectById(id); - return convertor.apply(t); - } - - /** - * 查询(根据ID 批量查询) - * - * @param kClass vo类型 - * @param idList 主键ID列表 - */ - default List listVoByIds(Collection idList, Class kClass) { - List list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return list.stream() - .map(any -> BeanUtil.toBean(any, kClass)) - .collect(Collectors.toList()); - } - - /** - * 查询(根据ID 批量查询) - * - * @param convertor 转换函数 - * @param idList 主键ID列表 - */ - default List listVoByIds(Collection idList, - Function, List> convertor) { - List list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 查询(根据 columnMap 条件) - * - * @param kClass vo类型 - * @param columnMap 表字段 map 对象 - */ - default List listVoByMap(Map columnMap, Class kClass) { - List list = getBaseMapper().selectByMap(columnMap); - if (list == null) { - return null; - } - return list.stream() - .map(any -> BeanUtil.toBean(any, kClass)) - .collect(Collectors.toList()); - } - - /** - * 查询(根据 columnMap 条件) - * - * @param convertor 转换函数 - * @param columnMap 表字段 map 对象 - */ - default List listVoByMap(Map columnMap, - Function, List> convertor) { - List list = getBaseMapper().selectByMap(columnMap); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 根据 Wrapper,查询一条记录
- *

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

- * - * @param kClass vo类型 - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default K getVoOne(Wrapper queryWrapper, Class kClass) { - return BeanUtil.toBean(getOne(queryWrapper, true), kClass); - } - - /** - * 根据 Wrapper,查询一条记录
- *

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

- * - * @param convertor 转换函数 - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default K getVoOne(Wrapper queryWrapper, Function convertor) { - return convertor.apply(getOne(queryWrapper, true)); - } - - /** - * 查询列表 - * - * @param kClass vo类型 - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default List listVo(Wrapper queryWrapper, Class kClass) { - List list = getBaseMapper().selectList(queryWrapper); - if (list == null) { - return null; - } - return list.stream() - .map(any -> BeanUtil.toBean(any, kClass)) - .collect(Collectors.toList()); - } - - /** - * 查询列表 - * - * @param convertor 转换函数 - * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default List listVo(Wrapper queryWrapper, Function, List> convertor) { - List list = getBaseMapper().selectList(queryWrapper); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 查询所有 - * - * @param kClass vo类型 - * @see Wrappers#emptyWrapper() - */ - default List listVo(Class kClass) { - return listVo(Wrappers.emptyWrapper(), kClass); - } - - /** - * 查询所有 - * - * @param convertor 转换函数 - * @see Wrappers#emptyWrapper() - */ - default List listVo(Function, List> convertor) { - return listVo(Wrappers.emptyWrapper(), convertor); - } - - /** - * 翻页查询 - * - * @param page 翻页对象 - * @param queryWrapper 实体对象封装操作类 - */ - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper, Class kClass) { - PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - List volist = result.getRecords().stream() - .map(any -> BeanUtil.toBean(any, kClass)) - .collect(Collectors.toList()); - result.setRecordsVo(volist); - return result; - } - - /** - * 翻页查询 - * - * @param page 翻页对象 - * @param queryWrapper 实体对象封装操作类 - * @param convertor 转换函数 - */ - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper, - Function, List> convertor) { - PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - return result.setRecordsVo(convertor.apply(result.getRecords())); - } - - /** - * 无条件翻页查询 - * - * @param page 翻页对象 - */ - default PagePlus pageVo(PagePlus page, Class kClass) { - return pageVo(page, Wrappers.emptyWrapper(), kClass); - } - - /** - * 无条件翻页查询 - * - * @param page 翻页对象 - * @param convertor 转换函数 - */ - default PagePlus pageVo(PagePlus page, Function, List> convertor) { - return pageVo(page, Wrappers.emptyWrapper(), convertor); - } - - @Override - default boolean saveBatch(Collection entityList) { - return saveBatch(entityList, DEFAULT_BATCH_SIZE); + default K getVoById(Serializable id) { + return getVoById(id, new CopyOptions()); } - @Override - default boolean saveOrUpdateBatch(Collection entityList) { - return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); + /** + * @param convertor 自定义转换器 + */ + default K getVoById(Serializable id, Function convertor) { + return convertor.apply(getById(id)); } - @Override - default boolean updateBatchById(Collection entityList) { - return updateBatchById(entityList, DEFAULT_BATCH_SIZE); + /** + * @param idList id列表 + * @param copyOptions copy条件 + * @return K对象 + */ + List listVoByIds(Collection idList, CopyOptions copyOptions); + + default List listVoByIds(Collection idList) { + return listVoByIds(idList, new CopyOptions()); + } + + /** + * @param convertor 自定义转换器 + */ + default List listVoByIds(Collection idList, + Function, List> convertor) { + List list = getBaseMapper().selectBatchIds(idList); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + /** + * @param columnMap 表字段 map 对象 + * @param copyOptions copy条件 + * @return K对象 + */ + List listVoByMap(Map columnMap, CopyOptions copyOptions); + + default List listVoByMap(Map columnMap) { + return listVoByMap(columnMap, new CopyOptions()); + } + + /** + * @param convertor 自定义转换器 + */ + default List listVoByMap(Map columnMap, + Function, List> convertor) { + List list = getBaseMapper().selectByMap(columnMap); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + /** + * @param queryWrapper 查询条件 + * @param copyOptions copy条件 + * @return K对象 + */ + K getVoOne(Wrapper queryWrapper, CopyOptions copyOptions); + + default K getVoOne(Wrapper queryWrapper) { + return getVoOne(queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 自定义转换器 + */ + default K getVoOne(Wrapper queryWrapper, Function convertor) { + return convertor.apply(getOne(queryWrapper, true)); + } + + /** + * @param queryWrapper 查询条件 + * @param copyOptions copy条件 + * @return K对象 + */ + List listVo(Wrapper queryWrapper, CopyOptions copyOptions); + + default List listVo(Wrapper queryWrapper) { + return listVo(queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 自定义转换器 + */ + default List listVo(Wrapper queryWrapper, Function, List> convertor) { + List list = getBaseMapper().selectList(queryWrapper); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + default List listVo() { + return listVo(Wrappers.emptyWrapper()); + } + + /** + * @param convertor 自定义转换器 + */ + default List listVo(Function, List> convertor) { + return listVo(Wrappers.emptyWrapper(), convertor); + } + + /** + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @param copyOptions copy条件 + * @return K对象 + */ + PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions); + + default PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { + return pageVo(page, queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 自定义转换器 + */ + default PagePlus pageVo(PagePlus page, Wrapper queryWrapper, + Function, List> convertor) { + PagePlus result = getBaseMapper().selectPage(page, queryWrapper); + return result.setRecordsVo(convertor.apply(result.getRecords())); + } + + default PagePlus pageVo(PagePlus page) { + return pageVo(page, Wrappers.emptyWrapper()); + } + + /** + * @param convertor 自定义转换器 + */ + default PagePlus pageVo(PagePlus page, Function, List> convertor) { + return pageVo(page, Wrappers.emptyWrapper(), convertor); } boolean saveAll(Collection entityList); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java index fb0998b7..e00076e0 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java @@ -1,12 +1,19 @@ package com.ruoyi.common.core.mybatisplus.core; +import cn.hutool.core.bean.copier.CopyOptions; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.ClassUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.page.PagePlus; +import com.ruoyi.common.utils.BeanCopyUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ResolvableType; +import java.io.Serializable; import java.util.Collection; +import java.util.List; +import java.util.Map; /** * IServicePlus 实现类 @@ -15,7 +22,7 @@ import java.util.Collection; */ @Slf4j @SuppressWarnings("unchecked") -public class ServicePlusImpl, T> extends ServiceImpl implements IServicePlus { +public class ServicePlusImpl, T, K> extends ServiceImpl implements IServicePlus { @Autowired protected M baseMapper; @@ -35,6 +42,12 @@ public class ServicePlusImpl, T> extends ServiceImpl protected Class mapperClass = currentMapperClass(); + protected Class voClass = currentVoClass(); + + public Class getVoClass() { + return voClass; + } + @Override protected Class currentMapperClass() { return (Class) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(0).getType(); @@ -45,6 +58,10 @@ public class ServicePlusImpl, T> extends ServiceImpl return (Class) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(1).getType(); } + protected Class currentVoClass() { + return (Class) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(2).getType(); + } + @Override protected ResolvableType getResolvableType() { return ResolvableType.forClass(ClassUtils.getUserClass(getClass())); @@ -76,6 +93,25 @@ public class ServicePlusImpl, T> extends ServiceImpl return super.updateBatchById(entityList, batchSize); } + /** + * 单sql批量插入( 全量填充 无视数据库默认值 ) + * 适用于无脑插入 + */ + @Override + public boolean saveBatch(Collection entityList) { + return saveBatch(entityList, DEFAULT_BATCH_SIZE); + } + + @Override + public boolean saveOrUpdateBatch(Collection entityList) { + return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); + } + + @Override + public boolean updateBatchById(Collection entityList) { + return updateBatchById(entityList, DEFAULT_BATCH_SIZE); + } + /** * 单sql批量插入( 全量填充 无视数据库默认值 ) * 适用于无脑插入 @@ -85,4 +121,83 @@ public class ServicePlusImpl, T> extends ServiceImpl return baseMapper.insertAll(entityList) == entityList.size(); } + /** + * 根据 ID 查询 + * + * @param id 主键ID + */ + @Override + public K getVoById(Serializable id, CopyOptions copyOptions) { + T t = getBaseMapper().selectById(id); + return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + } + + /** + * 查询(根据ID 批量查询) + * + * @param idList 主键ID列表 + */ + @Override + public List listVoByIds(Collection idList, CopyOptions copyOptions) { + List list = getBaseMapper().selectBatchIds(idList); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 查询(根据 columnMap 条件) + * + * @param columnMap 表字段 map 对象 + */ + @Override + public List listVoByMap(Map columnMap, CopyOptions copyOptions) { + List list = getBaseMapper().selectByMap(columnMap); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 根据 Wrapper,查询一条记录
+ *

结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")

+ * + * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} + */ + @Override + public K getVoOne(Wrapper queryWrapper, CopyOptions copyOptions) { + T t = getOne(queryWrapper, true); + return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + } + + /** + * 查询列表 + * + * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} + */ + @Override + public List listVo(Wrapper queryWrapper, CopyOptions copyOptions) { + List list = getBaseMapper().selectList(queryWrapper); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 翻页查询 + * + * @param page 翻页对象 + * @param queryWrapper 实体对象封装操作类 + */ + @Override + public PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions) { + PagePlus result = getBaseMapper().selectPage(page, queryWrapper); + List volist = BeanCopyUtils.listCopy(result.getRecords(), copyOptions, voClass); + result.setRecordsVo(volist); + return result; + } + } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java new file mode 100644 index 00000000..e1934e1e --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.core.validate; + +/** + * 校验分组 add + * + * @author Lion Li + */ +public interface AddGroup { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java new file mode 100644 index 00000000..3c6ca7f8 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java @@ -0,0 +1,9 @@ +package com.ruoyi.common.core.validate; + +/** + * 校验分组 edit + * + * @author Lion Li + */ +public interface EditGroup { +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java new file mode 100644 index 00000000..bea09f8b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -0,0 +1,55 @@ +package com.ruoyi.common.utils; + +import cn.hutool.core.bean.copier.BeanCopier; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.util.ReflectUtil; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * bean深拷贝工具 + * + * @author Lion Li + */ +public class BeanCopyUtils { + + /** + * 单对象基于class创建拷贝 + * + * @param source 数据来源实体 + * @param copyOptions copy条件 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static V oneCopy(T source, CopyOptions copyOptions, Class desc) { + V v = ReflectUtil.newInstanceIfPossible(desc); + return oneCopy(source, copyOptions, v); + } + + /** + * 单对象基于对象创建拷贝 + * + * @param source 数据来源实体 + * @param copyOptions copy条件 + * @param desc 转换后的对象 + * @return desc + */ + public static V oneCopy(T source, CopyOptions copyOptions, V desc) { + return BeanCopier.create(source, desc, copyOptions).copy(); + } + + /** + * 列表对象基于class创建拷贝 + * + * @param sourceList 数据来源实体列表 + * @param copyOptions copy条件 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static List listCopy(List sourceList, CopyOptions copyOptions, Class desc) { + return sourceList.stream() + .map(source -> oneCopy(source, copyOptions, desc)) + .collect(Collectors.toList()); + } +} diff --git a/ruoyi-demo/pom.xml b/ruoyi-demo/pom.xml index dcc2684d..1066d2f6 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoAddBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoAddBo.java deleted file mode 100644 index 10520aed..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoAddBo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.demo.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.util.Date; - - -/** - * 测试单表添加对象 test_demo - * - * @author Lion Li - * @date 2021-05-30 - */ -@Data -@ApiModel("测试单表添加对象") -public class TestDemoAddBo { - - /** 部门id */ - @ApiModelProperty("部门id") - private Long deptId; - - /** 用户id */ - @ApiModelProperty("用户id") - private Long userId; - - /** 排序号 */ - @ApiModelProperty("排序号") - private Long orderNum; - - /** key键 */ - @ApiModelProperty("key键") - @NotBlank(message = "key键不能为空") - private String testKey; - - /** 值 */ - @ApiModelProperty("值") - @NotBlank(message = "值不能为空") - private String value; - - /** 创建时间 */ - @ApiModelProperty("创建时间") - private Date createTime; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoEditBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoEditBo.java deleted file mode 100644 index 639443b0..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoEditBo.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ruoyi.demo.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - - -/** - * 测试单表编辑对象 test_demo - * - * @author Lion Li - * @date 2021-05-30 - */ -@Data -@ApiModel("测试单表编辑对象") -public class TestDemoEditBo { - - - /** 主键 */ - @ApiModelProperty("主键") - private Long id; - - - /** 部门id */ - @ApiModelProperty("部门id") - private Long deptId; - - - /** 用户id */ - @ApiModelProperty("用户id") - private Long userId; - - - /** 排序号 */ - @ApiModelProperty("排序号") - private Long orderNum; - - - /** key键 */ - @ApiModelProperty("key键") - @NotBlank(message = "key键不能为空") - private String testKey; - - - /** 值 */ - @ApiModelProperty("值") - @NotBlank(message = "值不能为空") - private String value; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoQueryBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoQueryBo.java deleted file mode 100644 index ca2bb5a3..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestDemoQueryBo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ruoyi.demo.bo; - -import com.ruoyi.common.core.domain.BaseEntity; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 测试单表分页查询对象 test_demo - * - * @author Lion Li - * @date 2021-05-30 - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("测试单表分页查询对象") -public class TestDemoQueryBo extends BaseEntity { - - /** 分页大小 */ - @ApiModelProperty("分页大小") - private Integer pageSize; - /** 当前页数 */ - @ApiModelProperty("当前页数") - private Integer pageNum; - /** 排序列 */ - @ApiModelProperty("排序列") - private String orderByColumn; - /** 排序的方向desc或者asc */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - - - /** key键 */ - @ApiModelProperty("key键") - private String testKey; - /** 值 */ - @ApiModelProperty("值") - private String value; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeAddBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeAddBo.java deleted file mode 100644 index a9a4b5e3..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeAddBo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ruoyi.demo.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import java.util.Date; -import javax.validation.constraints.*; - - - -/** - * 测试树表添加对象 test_tree - * - * @author Lion Li - * @date 2021-05-30 - */ -@Data -@ApiModel("测试树表添加对象") -public class TestTreeAddBo { - - /** 父id */ - @ApiModelProperty("父id") - private Long parentId; - - /** 部门id */ - @ApiModelProperty("部门id") - private Long deptId; - - /** 用户id */ - @ApiModelProperty("用户id") - private Long userId; - - /** 树节点名 */ - @ApiModelProperty("树节点名") - @NotBlank(message = "树节点名不能为空") - private String treeName; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeEditBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeEditBo.java deleted file mode 100644 index e3d359d0..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeEditBo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.demo.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import java.util.Date; -import javax.validation.constraints.*; - - -/** - * 测试树表编辑对象 test_tree - * - * @author Lion Li - * @date 2021-05-30 - */ -@Data -@ApiModel("测试树表编辑对象") -public class TestTreeEditBo { - - - /** 主键 */ - @ApiModelProperty("主键") - private Long id; - - - /** 父id */ - @ApiModelProperty("父id") - private Long parentId; - - - /** 部门id */ - @ApiModelProperty("部门id") - private Long deptId; - - - /** 用户id */ - @ApiModelProperty("用户id") - private Long userId; - - - /** 树节点名 */ - @ApiModelProperty("树节点名") - @NotBlank(message = "树节点名不能为空") - private String treeName; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeQueryBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeQueryBo.java deleted file mode 100644 index 3ed482b3..00000000 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/bo/TestTreeQueryBo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ruoyi.demo.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -import com.ruoyi.common.core.domain.BaseEntity; - -/** - * 测试树表分页查询对象 test_tree - * - * @author Lion Li - * @date 2021-05-30 - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("测试树表分页查询对象") -public class TestTreeQueryBo extends BaseEntity { - - /** 分页大小 */ - @ApiModelProperty("分页大小") - private Integer pageSize; - /** 当前页数 */ - @ApiModelProperty("当前页数") - private Integer pageNum; - /** 排序列 */ - @ApiModelProperty("排序列") - private String orderByColumn; - /** 排序的方向desc或者asc */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - - - /** 树节点名 */ - @ApiModelProperty("树节点名") - private String treeName; - -} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java index 2ac99d66..ade20f8d 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java @@ -1,16 +1,17 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.demo.bo.TestDemoAddBo; -import com.ruoyi.demo.bo.TestDemoEditBo; -import com.ruoyi.demo.bo.TestDemoQueryBo; +import com.ruoyi.demo.domain.bo.TestDemoBo; +import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.service.ITestDemoService; -import com.ruoyi.demo.vo.TestDemoVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -28,8 +29,9 @@ import java.util.List; * 测试单表Controller * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ +@Validated @Api(value = "测试单表控制器", tags = {"测试单表管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @@ -44,18 +46,28 @@ public class TestDemoController extends BaseController { @ApiOperation("查询测试单表列表") @PreAuthorize("@ss.hasPermi('demo:demo:list')") @GetMapping("/list") - public TableDataInfo list(@Validated TestDemoQueryBo bo) { + public TableDataInfo list(@Validated TestDemoBo bo) { return iTestDemoService.queryPageList(bo); } - /** + /** + * 自定义分页查询 + */ + @ApiOperation("自定义分页查询") + @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @GetMapping("/page") + public TableDataInfo page(@Validated TestDemoBo bo) { + return iTestDemoService.customPageList(bo); + } + + /** * 导出测试单表列表 */ @ApiOperation("导出测试单表列表") @PreAuthorize("@ss.hasPermi('demo:demo:export')") @Log(title = "测试单表", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult export(@Validated TestDemoQueryBo bo) { + public AjaxResult export(@Validated TestDemoBo bo) { List list = iTestDemoService.queryList(bo); ExcelUtil util = new ExcelUtil(TestDemoVo.class); return util.exportExcel(list, "测试单表"); @@ -78,9 +90,10 @@ public class TestDemoController extends BaseController { @ApiOperation("新增测试单表") @PreAuthorize("@ss.hasPermi('demo:demo:add')") @Log(title = "测试单表", businessType = BusinessType.INSERT) + @RepeatSubmit @PostMapping() - public AjaxResult add(@Validated @RequestBody TestDemoAddBo bo) { - return toAjax(iTestDemoService.insertByAddBo(bo) ? 1 : 0); + public AjaxResult add(@Validated(AddGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(iTestDemoService.insertByBo(bo) ? 1 : 0); } /** @@ -89,9 +102,10 @@ public class TestDemoController extends BaseController { @ApiOperation("修改测试单表") @PreAuthorize("@ss.hasPermi('demo:demo:edit')") @Log(title = "测试单表", businessType = BusinessType.UPDATE) + @RepeatSubmit @PutMapping() - public AjaxResult edit(@Validated @RequestBody TestDemoEditBo bo) { - return toAjax(iTestDemoService.updateByEditBo(bo) ? 1 : 0); + public AjaxResult edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(iTestDemoService.updateByBo(bo) ? 1 : 0); } /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java index 54f1027e..8cab868c 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java @@ -1,15 +1,16 @@ package com.ruoyi.demo.controller; import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; -import com.ruoyi.demo.bo.TestTreeAddBo; -import com.ruoyi.demo.bo.TestTreeEditBo; -import com.ruoyi.demo.bo.TestTreeQueryBo; +import com.ruoyi.demo.domain.bo.TestTreeBo; +import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.service.ITestTreeService; -import com.ruoyi.demo.vo.TestTreeVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -27,8 +28,9 @@ import java.util.List; * 测试树表Controller * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ +@Validated @Api(value = "测试树表控制器", tags = {"测试树表管理"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @@ -43,8 +45,9 @@ public class TestTreeController extends BaseController { @ApiOperation("查询测试树表列表") @PreAuthorize("@ss.hasPermi('demo:tree:list')") @GetMapping("/list") - public AjaxResult> list(@Validated TestTreeQueryBo bo) { - return AjaxResult.success(iTestTreeService.queryList(bo)); + public AjaxResult> list(@Validated TestTreeBo bo) { + List list = iTestTreeService.queryList(bo); + return AjaxResult.success(list); } /** @@ -54,7 +57,7 @@ public class TestTreeController extends BaseController { @PreAuthorize("@ss.hasPermi('demo:tree:export')") @Log(title = "测试树表", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult export(@Validated TestTreeQueryBo bo) { + public AjaxResult export(@Validated TestTreeBo bo) { List list = iTestTreeService.queryList(bo); ExcelUtil util = new ExcelUtil(TestTreeVo.class); return util.exportExcel(list, "测试树表"); @@ -77,9 +80,10 @@ public class TestTreeController extends BaseController { @ApiOperation("新增测试树表") @PreAuthorize("@ss.hasPermi('demo:tree:add')") @Log(title = "测试树表", businessType = BusinessType.INSERT) + @RepeatSubmit @PostMapping() - public AjaxResult add(@Validated @RequestBody TestTreeAddBo bo) { - return toAjax(iTestTreeService.insertByAddBo(bo) ? 1 : 0); + public AjaxResult add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.insertByBo(bo) ? 1 : 0); } /** @@ -88,9 +92,10 @@ public class TestTreeController extends BaseController { @ApiOperation("修改测试树表") @PreAuthorize("@ss.hasPermi('demo:tree:edit')") @Log(title = "测试树表", businessType = BusinessType.UPDATE) + @RepeatSubmit @PutMapping() - public AjaxResult edit(@Validated @RequestBody TestTreeEditBo bo) { - return toAjax(iTestTreeService.updateByEditBo(bo) ? 1 : 0); + public AjaxResult edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.updateByBo(bo) ? 1 : 0); } /** diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java index 26f652a9..13fdc240 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java @@ -14,7 +14,7 @@ import java.util.Date; * 测试单表对象 test_demo * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @NoArgsConstructor @@ -32,43 +32,66 @@ public class TestDemo implements Serializable { @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 部门id */ + /** + * 部门id + */ private Long deptId; - /** 用户id */ + /** + * 用户id + */ private Long userId; - /** 排序号 */ - @OrderBy(isDesc = false, sort = 1) + /** + * 排序号 + */ + @OrderBy(isDesc = false, sort = 1) private Long orderNum; - /** key键 */ + /** + * key键 + */ private String testKey; - /** 值 */ + /** + * 值 + */ private String value; - /** 版本 */ + /** + * 版本 + */ @Version private Long version; - /** 创建时间 */ + /** + * 创建时间 + */ @TableField(fill = FieldFill.INSERT) private Date createTime; - /** 创建人 */ + /** + * 创建人 + */ @TableField(fill = FieldFill.INSERT) private String createBy; - /** 更新时间 */ + /** + * 更新时间 + */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; - /** 更新人 */ + /** + * 更新人 + */ @TableField(fill = FieldFill.INSERT_UPDATE) private String updateBy; - /** 删除标志 */ + /** + * 删除标志 + */ + @TableLogic private Long delFlag; } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java index b9bd2ba6..799a6d41 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java @@ -1,8 +1,6 @@ package com.ruoyi.demo.domain; import com.baomidou.mybatisplus.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -14,7 +12,7 @@ import java.util.Date; * 测试树表对象 test_tree * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @NoArgsConstructor @@ -25,44 +23,65 @@ public class TestTree implements Serializable { private static final long serialVersionUID=1L; - /** 主键 */ + /** + * 主键 + */ @TableId(value = "id") - @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 父id */ + /** + * 父id + */ private Long parentId; - /** 部门id */ + /** + * 部门id + */ private Long deptId; - /** 用户id */ + /** + * 用户id + */ private Long userId; - /** 树节点名 */ + /** + * 树节点名 + */ private String treeName; - /** 版本 */ + /** + * 版本 + */ @Version private Long version; - /** 创建时间 */ + /** + * 创建时间 + */ @TableField(fill = FieldFill.INSERT) private Date createTime; - /** 创建人 */ + /** + * 创建人 + */ @TableField(fill = FieldFill.INSERT) private String createBy; - /** 更新时间 */ + /** + * 更新时间 + */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; - /** 更新人 */ + /** + * 更新人 + */ @TableField(fill = FieldFill.INSERT_UPDATE) private String updateBy; - /** 删除标志 */ + /** + * 删除标志 + */ @TableLogic private Long delFlag; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java new file mode 100644 index 00000000..46018b10 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java @@ -0,0 +1,94 @@ +package com.ruoyi.demo.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 测试单表业务对象 test_demo + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("测试单表业务对象") +public class TestDemoBo extends BaseEntity { + + /** + * 主键 + */ + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 部门id + */ + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 排序号 + */ + @ApiModelProperty("排序号") + @NotNull(message = "排序号不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long orderNum; + + /** + * key键 + */ + @ApiModelProperty("key键") + @NotBlank(message = "key键不能为空", groups = { AddGroup.class, EditGroup.class }) + private String testKey; + + /** + * 值 + */ + @ApiModelProperty("值") + @NotBlank(message = "值不能为空", groups = { AddGroup.class, EditGroup.class }) + private String value; + + + /** + * 分页大小 + */ + @ApiModelProperty("分页大小") + private Integer pageSize; + + /** + * 当前页数 + */ + @ApiModelProperty("当前页数") + private Integer pageNum; + + /** + * 排序列 + */ + @ApiModelProperty("排序列") + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + @ApiModelProperty(value = "排序的方向", example = "asc,desc") + private String isAsc; + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java new file mode 100644 index 00000000..2dfe1ff0 --- /dev/null +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java @@ -0,0 +1,79 @@ +package com.ruoyi.demo.domain.bo; + +import com.ruoyi.common.core.domain.TreeEntity; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 测试树表业务对象 test_tree + * + * @author Lion Li + * @date 2021-07-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("测试树表业务对象") +public class TestTreeBo extends TreeEntity { + + /** + * 主键 + */ + @ApiModelProperty("主键") + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 部门id + */ + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + @NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 树节点名 + */ + @ApiModelProperty("树节点名") + @NotBlank(message = "树节点名不能为空", groups = { AddGroup.class, EditGroup.class }) + private String treeName; + + + /** + * 分页大小 + */ + @ApiModelProperty("分页大小") + private Integer pageSize; + + /** + * 当前页数 + */ + @ApiModelProperty("当前页数") + private Integer pageNum; + + /** + * 排序列 + */ + @ApiModelProperty("排序列") + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + @ApiModelProperty(value = "排序的方向", example = "asc,desc") + private String isAsc; + +} diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestDemoVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java similarity index 67% rename from ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestDemoVo.java rename to ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java index d1eb8bf6..9ab4ba95 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestDemoVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java @@ -1,12 +1,9 @@ -package com.ruoyi.demo.vo; +package com.ruoyi.demo.domain.vo; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; - import java.util.Date; @@ -15,7 +12,7 @@ import java.util.Date; * 测试单表视图对象 test_demo * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @ApiModel("测试单表视图对象") @@ -24,57 +21,70 @@ public class TestDemoVo { private static final long serialVersionUID = 1L; /** - * 主键 - * 如果是自定义id 或者 雪花id - * 需要增加序列化为字符串注解 因为Long到前端会失真 - */ + * 主键 + */ @ApiModelProperty("主键") - @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 部门id */ + /** + * 部门id + */ @Excel(name = "部门id") @ApiModelProperty("部门id") private Long deptId; - /** 用户id */ + /** + * 用户id + */ @Excel(name = "用户id") @ApiModelProperty("用户id") private Long userId; - /** 排序号 */ + /** + * 排序号 + */ @Excel(name = "排序号") @ApiModelProperty("排序号") private Long orderNum; - /** key键 */ + /** + * key键 + */ @Excel(name = "key键") @ApiModelProperty("key键") private String testKey; - /** 值 */ + /** + * 值 + */ @Excel(name = "值") @ApiModelProperty("值") private String value; - /** 创建时间 */ + /** + * 创建时间 + */ @Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd") -// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("创建时间") private Date createTime; - /** 创建人 */ + /** + * 创建人 + */ @Excel(name = "创建人") @ApiModelProperty("创建人") private String createBy; - /** 更新时间 */ + /** + * 更新时间 + */ @Excel(name = "更新时间" , width = 30, dateFormat = "yyyy-MM-dd") -// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("更新时间") private Date updateTime; - /** 更新人 */ + /** + * 更新人 + */ @Excel(name = "更新人") @ApiModelProperty("更新人") private String updateBy; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestTreeVo.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java similarity index 67% rename from ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestTreeVo.java rename to ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java index c6ea5587..a299c4a4 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/vo/TestTreeVo.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java @@ -1,13 +1,9 @@ -package com.ruoyi.demo.vo; +package com.ruoyi.demo.domain.vo; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.ruoyi.common.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; - import java.util.Date; @@ -16,7 +12,7 @@ import java.util.Date; * 测试树表视图对象 test_tree * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @ApiModel("测试树表视图对象") @@ -24,34 +20,44 @@ public class TestTreeVo { private static final long serialVersionUID = 1L; - /** 主键 */ + /** + * 主键 + */ @ApiModelProperty("主键") - @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 父id */ + /** + * 父id + */ @Excel(name = "父id") @ApiModelProperty("父id") private Long parentId; - /** 部门id */ + /** + * 部门id + */ @Excel(name = "部门id") @ApiModelProperty("部门id") private Long deptId; - /** 用户id */ + /** + * 用户id + */ @Excel(name = "用户id") @ApiModelProperty("用户id") private Long userId; - /** 树节点名 */ + /** + * 树节点名 + */ @Excel(name = "树节点名") @ApiModelProperty("树节点名") private String treeName; - /** 创建时间 */ + /** + * 创建时间 + */ @Excel(name = "创建时间" , width = 30, dateFormat = "yyyy-MM-dd") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty("创建时间") private Date createTime; diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java index aceaf6d8..efbbffc4 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java @@ -1,18 +1,24 @@ package com.ruoyi.demo.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.mybatisplus.cache.MybatisPlusRedisCache; import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; import com.ruoyi.demo.domain.TestDemo; +import com.ruoyi.demo.domain.vo.TestDemoVo; import org.apache.ibatis.annotations.CacheNamespace; +import org.apache.ibatis.annotations.Param; /** * 测试单表Mapper接口 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ // 如使需切换数据源 请勿使用缓存 会造成数据不一致现象 @CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class) public interface TestDemoMapper extends BaseMapperPlus { + Page customPageList(@Param("page") Page page, @Param("ew") Wrapper wrapper); + } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java index 20a3e9be..05b0153b 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java @@ -7,9 +7,8 @@ import com.ruoyi.demo.domain.TestTree; * 测试树表Mapper接口 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -//@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class) public interface TestTreeMapper extends BaseMapperPlus { } diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java index c011325a..eb4f21be 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java @@ -1,10 +1,8 @@ package com.ruoyi.demo.service; import com.ruoyi.demo.domain.TestDemo; -import com.ruoyi.demo.vo.TestDemoVo; -import com.ruoyi.demo.bo.TestDemoQueryBo; -import com.ruoyi.demo.bo.TestDemoAddBo; -import com.ruoyi.demo.bo.TestDemoEditBo; +import com.ruoyi.demo.domain.vo.TestDemoVo; +import com.ruoyi.demo.domain.bo.TestDemoBo; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; @@ -15,9 +13,9 @@ import java.util.List; * 测试单表Service接口 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -public interface ITestDemoService extends IServicePlus { +public interface ITestDemoService extends IServicePlus { /** * 查询单个 @@ -28,25 +26,31 @@ public interface ITestDemoService extends IServicePlus { /** * 查询列表 */ - TableDataInfo queryPageList(TestDemoQueryBo bo); + TableDataInfo queryPageList(TestDemoBo bo); + /** + * 自定义分页查询 + */ + TableDataInfo customPageList(TestDemoBo bo); + + /** * 查询列表 */ - List queryList(TestDemoQueryBo bo); + List queryList(TestDemoBo bo); /** * 根据新增业务对象插入测试单表 * @param bo 测试单表新增业务对象 * @return */ - Boolean insertByAddBo(TestDemoAddBo bo); + Boolean insertByBo(TestDemoBo bo); /** * 根据编辑业务对象修改测试单表 * @param bo 测试单表编辑业务对象 * @return */ - Boolean updateByEditBo(TestDemoEditBo bo); + Boolean updateByBo(TestDemoBo bo); /** * 校验并删除数据 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java index 6f7be37c..9b8acb9c 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java @@ -1,11 +1,9 @@ package com.ruoyi.demo.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; -import com.ruoyi.demo.bo.TestTreeAddBo; -import com.ruoyi.demo.bo.TestTreeEditBo; -import com.ruoyi.demo.bo.TestTreeQueryBo; import com.ruoyi.demo.domain.TestTree; -import com.ruoyi.demo.vo.TestTreeVo; +import com.ruoyi.demo.domain.vo.TestTreeVo; +import com.ruoyi.demo.domain.bo.TestTreeBo; +import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import java.util.Collection; import java.util.List; @@ -14,9 +12,9 @@ import java.util.List; * 测试树表Service接口 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -public interface ITestTreeService extends IServicePlus { +public interface ITestTreeService extends IServicePlus { /** * 查询单个 * @return @@ -26,21 +24,21 @@ public interface ITestTreeService extends IServicePlus { /** * 查询列表 */ - List queryList(TestTreeQueryBo bo); + List queryList(TestTreeBo bo); /** * 根据新增业务对象插入测试树表 * @param bo 测试树表新增业务对象 * @return */ - Boolean insertByAddBo(TestTreeAddBo bo); + Boolean insertByBo(TestTreeBo bo); /** * 根据编辑业务对象修改测试树表 * @param bo 测试树表编辑业务对象 * @return */ - Boolean updateByEditBo(TestTreeEditBo bo); + Boolean updateByBo(TestTreeBo bo); /** * 校验并删除数据 diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java index 4d35efe0..81893dff 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java @@ -4,18 +4,17 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; -import com.ruoyi.demo.bo.TestDemoAddBo; -import com.ruoyi.demo.bo.TestDemoEditBo; -import com.ruoyi.demo.bo.TestDemoQueryBo; import com.ruoyi.demo.domain.TestDemo; +import com.ruoyi.demo.domain.bo.TestDemoBo; +import com.ruoyi.demo.domain.vo.TestDemoVo; import com.ruoyi.demo.mapper.TestDemoMapper; import com.ruoyi.demo.service.ITestDemoService; -import com.ruoyi.demo.vo.TestDemoVo; import org.springframework.stereotype.Service; import java.util.Collection; @@ -26,30 +25,40 @@ import java.util.Map; * 测试单表Service业务层处理 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Service -public class TestDemoServiceImpl extends ServicePlusImpl implements ITestDemoService { +public class TestDemoServiceImpl extends ServicePlusImpl implements ITestDemoService { @Override public TestDemoVo queryById(Long id) { - return getVoById(id, TestDemoVo.class); + return getVoById(id); } @DataScope(isUser = true) @Override - public TableDataInfo queryPageList(TestDemoQueryBo bo) { - PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), TestDemoVo.class); + public TableDataInfo queryPageList(TestDemoBo bo) { + PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); + return PageUtils.buildDataInfo(result); + } + + /** + * 自定义分页查询 + */ + @DataScope(isUser = true) + @Override + public TableDataInfo customPageList(TestDemoBo bo) { + Page result = baseMapper.customPageList(PageUtils.buildPage(), buildQueryWrapper(bo)); return PageUtils.buildDataInfo(result); } @DataScope(isUser = true) @Override - public List queryList(TestDemoQueryBo bo) { - return listVo(buildQueryWrapper(bo), TestDemoVo.class); + public List queryList(TestDemoBo bo) { + return listVo(buildQueryWrapper(bo)); } - private LambdaQueryWrapper buildQueryWrapper(TestDemoQueryBo bo) { + private LambdaQueryWrapper buildQueryWrapper(TestDemoBo bo) { Map params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); @@ -63,14 +72,14 @@ public class TestDemoServiceImpl extends ServicePlusImpl implements ITestTreeService { +public class TestTreeServiceImpl extends ServicePlusImpl implements ITestTreeService { @Override public TestTreeVo queryById(Long id) { - return getVoById(id, TestTreeVo.class); + return getVoById(id); } // @DataSource(DataSourceType.SLAVE) // 切换从库查询 @DataScope(isUser = true) @Override - public List queryList(TestTreeQueryBo bo) { - return listVo(buildQueryWrapper(bo), TestTreeVo.class); + public List queryList(TestTreeBo bo) { + return listVo(buildQueryWrapper(bo)); } - private LambdaQueryWrapper buildQueryWrapper(TestTreeQueryBo bo) { + private LambdaQueryWrapper buildQueryWrapper(TestTreeBo bo) { Map params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); @@ -53,14 +51,14 @@ public class TestTreeServiceImpl extends ServicePlusImpl + - \ No newline at end of file + diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index 46a8cfc7..4df48bab 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 ruoyi-extend diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index b09375a0..9aca296c 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ ruoyi-extend com.ruoyi - 2.5.2 + 2.6.0 4.0.0 jar diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 16b46e9a..41e8ca43 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index 239825f0..3aa6d180 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -65,7 +65,7 @@ public class SysLoginService // 验证码开关 if (captchaOnOff) { - validateCapcha(username, code, uuid, request); + validateCaptcha(username, code, uuid, request); } // 用户验证 Authentication authentication = null; @@ -103,7 +103,7 @@ public class SysLoginService * @param uuid 唯一标识 * @return 结果 */ - public void validateCapcha(String username, String code, String uuid, HttpServletRequest request) { + public void validateCaptcha(String username, String code, String uuid, HttpServletRequest request) { String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; String captcha = redisCache.getCacheObject(verifyKey); redisCache.deleteObject(verifyKey); diff --git a/ruoyi-generator/pom.xml b/ruoyi-generator/pom.xml index 8510c9fa..5535bd77 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java index 44baf825..40f0738c 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java @@ -1,7 +1,7 @@ package com.ruoyi.generator.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.generator.domain.GenTableColumn; import com.ruoyi.generator.mapper.GenTableColumnMapper; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import java.util.List; * @author ruoyi */ @Service -public class GenTableColumnServiceImpl extends ServicePlusImpl implements IGenTableColumnService { +public class GenTableColumnServiceImpl extends ServiceImpl implements IGenTableColumnService { /** * 查询业务字段列表 diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java index 9eceadf0..bece86a9 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java @@ -6,9 +6,9 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.GenConstants; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.JsonUtils; @@ -35,7 +35,10 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.StringWriter; -import java.util.*; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -47,7 +50,7 @@ import java.util.zip.ZipOutputStream; */ @Slf4j @Service -public class GenTableServiceImpl extends ServicePlusImpl implements IGenTableService { +public class GenTableServiceImpl extends ServiceImpl implements IGenTableService { @Autowired private GenTableColumnMapper genTableColumnMapper; diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java index 38d38540..e0111e5d 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java @@ -1,6 +1,6 @@ package com.ruoyi.generator.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.generator.domain.GenTableColumn; import java.util.List; @@ -10,7 +10,7 @@ import java.util.List; * * @author ruoyi */ -public interface IGenTableColumnService extends IServicePlus { +public interface IGenTableColumnService extends IService { /** * 查询业务字段列表 * diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java index a44dd5e2..9903ecaf 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java @@ -1,6 +1,6 @@ package com.ruoyi.generator.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.generator.domain.GenTable; @@ -12,7 +12,7 @@ import java.util.Map; * * @author ruoyi */ -public interface IGenTableService extends IServicePlus { +public interface IGenTableService extends IService { TableDataInfo selectPageGenTableList(GenTable genTable); diff --git a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java index 76073c79..641cf1d1 100644 --- a/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java +++ b/ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java @@ -132,9 +132,7 @@ public class VelocityUtils List templates = new ArrayList(); templates.add("vm/java/domain.java.vm"); templates.add("vm/java/vo.java.vm"); - templates.add("vm/java/queryBo.java.vm"); - templates.add("vm/java/addBo.java.vm"); - templates.add("vm/java/editBo.java.vm"); + templates.add("vm/java/bo.java.vm"); templates.add("vm/java/mapper.java.vm"); templates.add("vm/java/service.java.vm"); templates.add("vm/java/serviceImpl.java.vm"); @@ -184,20 +182,12 @@ public class VelocityUtils } if (template.contains("vo.java.vm")) { - fileName = StrUtil.format("{}/vo/{}Vo.java", javaPath, className); - } - if (template.contains("queryBo.java.vm")) - { - fileName = StrUtil.format("{}/bo/{}QueryBo.java", javaPath, className); - } - if (template.contains("addBo.java.vm")) - { - fileName = StrUtil.format("{}/bo/{}AddBo.java", javaPath, className); - } - if (template.contains("editBo.java.vm")) - { - fileName = StrUtil.format("{}/bo/{}EditBo.java", javaPath, className); + fileName = StrUtil.format("{}/domain/vo/{}Vo.java", javaPath, className); } + if (template.contains("bo.java.vm")) + { + fileName = StrUtil.format("{}/domain/bo/{}Bo.java", javaPath, className); + } if (template.contains("sub-domain.java.vm") && StrUtil.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { fileName = StrUtil.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); diff --git a/ruoyi-generator/src/main/resources/vm/java/addBo.java.vm b/ruoyi-generator/src/main/resources/vm/java/addBo.java.vm deleted file mode 100644 index 82d08627..00000000 --- a/ruoyi-generator/src/main/resources/vm/java/addBo.java.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${packageName}.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import java.util.Date; -import javax.validation.constraints.*; - - -#foreach ($import in $importList) -import ${import}; -#end - -/** - * ${functionName}添加对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -@Data -@ApiModel("${functionName}添加对象") -public class ${ClassName}AddBo { - -#foreach ($column in $columns) -#if($column.isInsert && $column.isPk!=1) - - /** $column.columnComment */ - @ApiModelProperty("$column.columnComment") -#if($column.isRequired==1) -#if($column.javaType == 'String') - @NotBlank(message = "$column.columnComment不能为空") -#else - @NotNull(message = "$column.columnComment不能为空") -#end -#end - private $column.javaType $column.javaField; -#end -#end -#if($table.sub) - - /** $table.subTable.functionName信息 */ - @ApiModelProperty("$table.subTable.functionName") - private List<${subClassName}> ${subclassName}List; -#end -} diff --git a/ruoyi-generator/src/main/resources/vm/java/bo.java.vm b/ruoyi-generator/src/main/resources/vm/java/bo.java.vm new file mode 100644 index 00000000..40174d5c --- /dev/null +++ b/ruoyi-generator/src/main/resources/vm/java/bo.java.vm @@ -0,0 +1,88 @@ +package ${packageName}.domain.bo; + +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.util.Date; + +#foreach ($import in $importList) +import ${import}; +#end +#if($table.crud || $table.sub) +import com.ruoyi.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.ruoyi.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}业务对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end + +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("${functionName}业务对象") +public class ${ClassName}Bo extends ${Entity} { + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField) && ($column.query || $column.isInsert || $column.isEdit)) + /** + * $column.columnComment + */ + @ApiModelProperty("$column.columnComment") +#if($column.isInsert && $column.isEdit) +#set($Group="AddGroup.class, EditGroup.class") +#elseif($column.isInsert) +#set($Group="AddGroup.class") +#elseif($column.isEdit) +#set($Group="EditGroup.class") +#end +#if($column.isRequired == 1) +#if($column.javaType == 'String') + @NotBlank(message = "$column.columnComment不能为空", groups = { $Group }) +#else + @NotNull(message = "$column.columnComment不能为空", groups = { $Group }) +#end +#end + private $column.javaType $column.javaField; + +#end +#end + + /** + * 分页大小 + */ + @ApiModelProperty("分页大小") + private Integer pageSize; + + /** + * 当前页数 + */ + @ApiModelProperty("当前页数") + private Integer pageNum; + + /** + * 排序列 + */ + @ApiModelProperty("排序列") + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + @ApiModelProperty(value = "排序的方向", example = "asc,desc") + private String isAsc; + +} diff --git a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm index a87c6cdd..ba29e201 100644 --- a/ruoyi-generator/src/main/resources/vm/java/controller.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/controller.java.vm @@ -13,11 +13,11 @@ import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.validate.AddGroup; +import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.enums.BusinessType; -import ${packageName}.vo.${ClassName}Vo; -import ${packageName}.bo.${ClassName}QueryBo; -import ${packageName}.bo.${ClassName}AddBo; -import ${packageName}.bo.${ClassName}EditBo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; import ${packageName}.service.I${ClassName}Service; import com.ruoyi.common.utils.poi.ExcelUtil; #if($table.crud || $table.sub) @@ -49,11 +49,11 @@ public class ${ClassName}Controller extends BaseController { @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')") @GetMapping("/list") #if($table.crud || $table.sub) - public TableDataInfo<${ClassName}Vo> list(@Validated ${ClassName}QueryBo bo) { + public TableDataInfo<${ClassName}Vo> list(@Validated ${ClassName}Bo bo) { return i${ClassName}Service.queryPageList(bo); } #elseif($table.tree) - public AjaxResult> list(@Validated ${ClassName}QueryBo bo) { + public AjaxResult> list(@Validated ${ClassName}Bo bo) { List<${ClassName}Vo> list = i${ClassName}Service.queryList(bo); return AjaxResult.success(list); } @@ -66,7 +66,7 @@ public class ${ClassName}Controller extends BaseController { @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')") @Log(title = "${functionName}", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult<${ClassName}Vo> export(@Validated ${ClassName}QueryBo bo) { + public AjaxResult<${ClassName}Vo> export(@Validated ${ClassName}Bo bo) { List<${ClassName}Vo> list = i${ClassName}Service.queryList(bo); ExcelUtil<${ClassName}Vo> util = new ExcelUtil<${ClassName}Vo>(${ClassName}Vo.class); return util.exportExcel(list, "${functionName}"); @@ -91,8 +91,8 @@ public class ${ClassName}Controller extends BaseController { @Log(title = "${functionName}", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping() - public AjaxResult add(@Validated @RequestBody ${ClassName}AddBo bo) { - return toAjax(i${ClassName}Service.insertByAddBo(bo) ? 1 : 0); + public AjaxResult add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(i${ClassName}Service.insertByBo(bo) ? 1 : 0); } /** @@ -103,8 +103,8 @@ public class ${ClassName}Controller extends BaseController { @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() - public AjaxResult edit(@Validated @RequestBody ${ClassName}EditBo bo) { - return toAjax(i${ClassName}Service.updateByEditBo(bo) ? 1 : 0); + public AjaxResult edit(@Validated(EditGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(i${ClassName}Service.updateByBo(bo) ? 1 : 0); } /** diff --git a/ruoyi-generator/src/main/resources/vm/java/editBo.java.vm b/ruoyi-generator/src/main/resources/vm/java/editBo.java.vm deleted file mode 100644 index 6472fce6..00000000 --- a/ruoyi-generator/src/main/resources/vm/java/editBo.java.vm +++ /dev/null @@ -1,46 +0,0 @@ -package ${packageName}.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import java.util.Date; -import javax.validation.constraints.*; - -#foreach ($import in $importList) -import ${import}; -#end - -/** - * ${functionName}编辑对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -@Data -@ApiModel("${functionName}编辑对象") -public class ${ClassName}EditBo { - -#foreach ($column in $columns) -#if($column.isEdit || $column.isPk==1) - - /** - * $column.columnComment - */ - @ApiModelProperty("$column.columnComment") -#if($column.isRequired==1) -#if($column.javaType == 'String') - @NotBlank(message = "$column.columnComment不能为空") -#else - @NotNull(message = "$column.columnComment不能为空") -#end -#end - private $column.javaType $column.javaField; -#end -#end -#if($table.sub) - - /** $table.subTable.functionName信息 */ - @ApiModelProperty("$table.subTable.functionName") - private List<${subClassName}> ${subclassName}List; -#end -} diff --git a/ruoyi-generator/src/main/resources/vm/java/queryBo.java.vm b/ruoyi-generator/src/main/resources/vm/java/queryBo.java.vm deleted file mode 100644 index 537ff73a..00000000 --- a/ruoyi-generator/src/main/resources/vm/java/queryBo.java.vm +++ /dev/null @@ -1,68 +0,0 @@ -package ${packageName}.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.Date; - -#foreach ($import in $importList) -import ${import}; -#end -#if($table.crud || $table.sub) -import com.ruoyi.common.core.domain.BaseEntity; -#elseif($table.tree) -import com.ruoyi.common.core.domain.TreeEntity; -#end - -/** - * ${functionName}分页查询对象 ${tableName} - * - * @author ${author} - * @date ${datetime} - */ -#if($table.crud || $table.sub) -#set($Entity="BaseEntity") -#elseif($table.tree) -#set($Entity="TreeEntity") -#end - -@Data -@EqualsAndHashCode(callSuper = true) -@ApiModel("${functionName}分页查询对象") -public class ${ClassName}QueryBo extends ${Entity} { - - /** - * 分页大小 - */ - @ApiModelProperty("分页大小") - private Integer pageSize; - /** - * 当前页数 - */ - @ApiModelProperty("当前页数") - private Integer pageNum; - /** - * 排序列 - */ - @ApiModelProperty("排序列") - private String orderByColumn; - /** - * 排序的方向desc或者asc - */ - @ApiModelProperty(value = "排序的方向", example = "asc,desc") - private String isAsc; - - -#foreach ($column in $columns) -#if(!$table.isSuperColumn($column.javaField) && $column.query) - /** - * $column.columnComment - */ - @ApiModelProperty("$column.columnComment") - private $column.javaType $column.javaField; -#end -#end - -} diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm index 9ae8620b..0041c398 100644 --- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm @@ -1,10 +1,8 @@ package ${packageName}.service; import ${packageName}.domain.${ClassName}; -import ${packageName}.vo.${ClassName}Vo; -import ${packageName}.bo.${ClassName}QueryBo; -import ${packageName}.bo.${ClassName}AddBo; -import ${packageName}.bo.${ClassName}EditBo; +import ${packageName}.domain.vo.${ClassName}Vo; +import ${packageName}.domain.bo.${ClassName}Bo; import com.ruoyi.common.core.mybatisplus.core.IServicePlus; #if($table.crud || $table.sub) import com.ruoyi.common.core.page.TableDataInfo; @@ -19,7 +17,7 @@ import java.util.List; * @author ${author} * @date ${datetime} */ -public interface I${ClassName}Service extends IServicePlus<${ClassName}> { +public interface I${ClassName}Service extends IServicePlus<${ClassName}, ${ClassName}Vo> { /** * 查询单个 * @return @@ -30,27 +28,27 @@ public interface I${ClassName}Service extends IServicePlus<${ClassName}> { /** * 查询列表 */ - TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}QueryBo bo); + TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo); #end /** * 查询列表 */ - List<${ClassName}Vo> queryList(${ClassName}QueryBo bo); + List<${ClassName}Vo> queryList(${ClassName}Bo bo); /** * 根据新增业务对象插入${functionName} * @param bo ${functionName}新增业务对象 * @return */ - Boolean insertByAddBo(${ClassName}AddBo bo); + Boolean insertByBo(${ClassName}Bo bo); /** * 根据编辑业务对象修改${functionName} * @param bo ${functionName}编辑业务对象 * @return */ - Boolean updateByEditBo(${ClassName}EditBo bo); + Boolean updateByBo(${ClassName}Bo bo); /** * 校验并删除数据 diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm index 2421f310..ec3cac60 100644 --- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -11,12 +11,10 @@ import org.springframework.stereotype.Service; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import ${packageName}.bo.${ClassName}AddBo; -import ${packageName}.bo.${ClassName}QueryBo; -import ${packageName}.bo.${ClassName}EditBo; +import ${packageName}.domain.bo.${ClassName}Bo; +import ${packageName}.domain.vo.${ClassName}Vo; import ${packageName}.domain.${ClassName}; import ${packageName}.mapper.${ClassName}Mapper; -import ${packageName}.vo.${ClassName}Vo; import ${packageName}.service.I${ClassName}Service; import java.util.List; @@ -30,27 +28,27 @@ import java.util.Collection; * @date ${datetime} */ @Service -public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service { +public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, ${ClassName}, ${ClassName}Vo> implements I${ClassName}Service { @Override public ${ClassName}Vo queryById(${pkColumn.javaType} ${pkColumn.javaField}){ - return getVoById(${pkColumn.javaField}, ${ClassName}Vo.class); + return getVoById(${pkColumn.javaField}); } #if($table.crud || $table.sub) @Override - public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}QueryBo bo) { - PagePlus<${ClassName}, ${ClassName}Vo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), ${ClassName}Vo.class); + public TableDataInfo<${ClassName}Vo> queryPageList(${ClassName}Bo bo) { + PagePlus<${ClassName}, ${ClassName}Vo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); return PageUtils.buildDataInfo(result); } #end @Override - public List<${ClassName}Vo> queryList(${ClassName}QueryBo bo) { - return listVo(buildQueryWrapper(bo), ${ClassName}Vo.class); + public List<${ClassName}Vo> queryList(${ClassName}Bo bo) { + return listVo(buildQueryWrapper(bo)); } - private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}QueryBo bo) { + private LambdaQueryWrapper<${ClassName}> buildQueryWrapper(${ClassName}Bo bo) { Map params = bo.getParams(); LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); #foreach($column in $columns) @@ -78,14 +76,14 @@ public class ${ClassName}ServiceImpl extends ServicePlusImpl<${ClassName}Mapper, } @Override - public Boolean insertByAddBo(${ClassName}AddBo bo) { + public Boolean insertByBo(${ClassName}Bo bo) { ${ClassName} add = BeanUtil.toBean(bo, ${ClassName}.class); validEntityBeforeSave(add); return save(add); } @Override - public Boolean updateByEditBo(${ClassName}EditBo bo) { + public Boolean updateByBo(${ClassName}Bo bo) { ${ClassName} update = BeanUtil.toBean(bo, ${ClassName}.class); validEntityBeforeSave(update); return updateById(update); diff --git a/ruoyi-generator/src/main/resources/vm/java/vo.java.vm b/ruoyi-generator/src/main/resources/vm/java/vo.java.vm index 8e941a99..f14d914c 100644 --- a/ruoyi-generator/src/main/resources/vm/java/vo.java.vm +++ b/ruoyi-generator/src/main/resources/vm/java/vo.java.vm @@ -1,4 +1,4 @@ -package ${packageName}.vo; +package ${packageName}.domain.vo; import com.ruoyi.common.annotation.Excel; #foreach ($import in $importList) diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml new file mode 100644 index 00000000..6fd1bd7d --- /dev/null +++ b/ruoyi-oss/pom.xml @@ -0,0 +1,59 @@ + + + + ruoyi-vue-plus + com.ruoyi + 2.6.0 + + 4.0.0 + + ruoyi-oss + + + OSS对象存储模块 + + + + + + + com.ruoyi + ruoyi-common + + + com.ruoyi + ruoyi-system + + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.oss.version} + + + com.qcloud + cos_api + ${qcloud.cos.version} + + + org.slf4j + slf4j-log4j12 + + + + + io.minio + minio + ${minio.version} + + + + + diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java new file mode 100644 index 00000000..5b9da585 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java @@ -0,0 +1,20 @@ +package com.ruoyi.oss.constant; + +/** + * 云存储常量 + * + * @author Lion Li + */ +public class CloudConstant { + + /** + * 云存储配置KEY + */ + public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloudStorageService"; + + /** + * 预览列表资源开关Key + */ + public final static String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java new file mode 100644 index 00000000..cb4f6205 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java @@ -0,0 +1,26 @@ +package com.ruoyi.oss.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 上传返回体 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class UploadResult { + + /** + * 文件路径 + */ + private String url; + + /** + * 文件名 + */ + private String filename; +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java new file mode 100644 index 00000000..3191dc44 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java @@ -0,0 +1,51 @@ +package com.ruoyi.oss.enumd; + +import com.ruoyi.oss.service.impl.AliyunCloudStorageServiceImpl; +import com.ruoyi.oss.service.impl.MinioCloudStorageServiceImpl; +import com.ruoyi.oss.service.impl.QcloudCloudStorageServiceImpl; +import com.ruoyi.oss.service.impl.QiniuCloudStorageServiceImpl; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 云存储服务商枚举 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum CloudServiceEnumd { + + /** + * 七牛云 + */ + QINIU("qiniu", QiniuCloudStorageServiceImpl.class), + + /** + * 阿里云 + */ + ALIYUN("aliyun", AliyunCloudStorageServiceImpl.class), + + /** + * 腾讯云 + */ + QCLOUD("qcloud", QcloudCloudStorageServiceImpl.class), + + /** + * minio + */ + MINIO("minio", MinioCloudStorageServiceImpl.class); + + private final String value; + + private final Class serviceClass; + + public static Class getServiceClass(String value) { + for (CloudServiceEnumd clazz : values()) { + if (clazz.getValue().equals(value)) { + return clazz.getServiceClass(); + } + } + return null; + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java new file mode 100644 index 00000000..c10dceb0 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the dreamlu.net developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: Chill 庄骞 (smallchill@163.com) + */ +package com.ruoyi.oss.enumd; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * minio策略配置 + * + * @author Lion Li + */ +@Getter +@AllArgsConstructor +public enum PolicyType { + + /** + * 只读 + */ + READ("read-only"), + + /** + * 只写 + */ + WRITE("write-only"), + + /** + * 读写 + */ + READ_WRITE("read-write"); + + /** + * 类型 + */ + private final String type; + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java new file mode 100644 index 00000000..48ab618a --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java @@ -0,0 +1,16 @@ +package com.ruoyi.oss.exception; + +/** + * OSS异常类 + * + * @author Lion Li + */ +public class OssException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public OssException(String msg) { + super(msg); + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java new file mode 100644 index 00000000..bc7e7f31 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java @@ -0,0 +1,45 @@ +package com.ruoyi.oss.factory; + +import cn.hutool.core.lang.Assert; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.ruoyi.oss.constant.CloudConstant; +import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.service.ICloudStorageService; +import com.ruoyi.system.service.ISysConfigService; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 文件上传Factory + * + * @author Lion Li + */ +public class OssFactory { + + private static ISysConfigService sysConfigService; + + static { + OssFactory.sysConfigService = SpringUtils.getBean(ISysConfigService.class); + } + + private static final Map SERVICES = new ConcurrentHashMap<>(); + + public static ICloudStorageService instance() { + String type = sysConfigService.selectConfigByKey(CloudConstant.CLOUD_STORAGE_CONFIG_KEY); + return instance(type); + } + + public static ICloudStorageService instance(String type) { + ICloudStorageService service = SERVICES.get(type); + if (service == null) { + service = (ICloudStorageService) SpringUtils.getBean(CloudServiceEnumd.getServiceClass(type)); + } + return service; + } + + public static void register(String type, ICloudStorageService iCloudStorageService) { + Assert.notNull(type, "type can't be null"); + SERVICES.put(type, iCloudStorageService); + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java new file mode 100644 index 00000000..64784a05 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java @@ -0,0 +1,187 @@ +package com.ruoyi.oss.properties; + +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * OSS云存储 配置属性 + * + * @author Lion Li + */ +@Data +@Component +@ConfigurationProperties(prefix = "cloud-storage") +public class CloudStorageProperties { + + private Boolean previewListImage; + + private QiniuProperties qiniu; + + private AliyunProperties aliyun; + + private QcloudProperties qcloud; + + private MinioProperties minio; + + /** + * 阿里云 配置属性 + * + * @author Lion Li + */ + @Data + @NoArgsConstructor + public static class AliyunProperties { + + /** + * 阿里云绑定的域名 + */ + private String endpoint; + + /** + * 阿里云路径前缀 + */ + private String prefix; + + /** + * 阿里云AccessKeyId + */ + private String accessKeyId; + + /** + * 阿里云AccessKeySecret + */ + private String accessKeySecret; + + /** + * 阿里云BucketName + */ + private String bucketName; + + } + + /** + * Minio 配置属性 + * + * @author Lion Li + */ + @Data + @NoArgsConstructor + public static class MinioProperties { + + /** + * minio域名 + */ + private String endpoint; + + /** + * minio ACCESS_KEY + */ + private String accessKey; + + /** + * minio SECRET_KEY + */ + private String secretKey; + + /** + * minio 存储空间名 + */ + private String bucketName; + + } + + /** + * 腾讯云COS 配置属性 + * + * @author Lion Li + */ + @Data + @NoArgsConstructor + public static class QcloudProperties { + + /** + * 腾讯云绑定的域名 + */ + private String endpoint; + + /** + * 腾讯云路径前缀 + */ + private String prefix; + + /** + * 腾讯云SecretId + */ + private String secretId; + + /** + * 腾讯云SecretKey + */ + private String secretKey; + + /** + * 腾讯云BucketName + */ + private String bucketName; + + /** + * 七牛是否使用https + */ + private Boolean isHttps; + + /** + * 腾讯云COS所属地区 + */ + private String region; + + } + + /** + * 七牛云 配置属性 + * + * @author Lion Li + */ + @Data + @NoArgsConstructor + public static class QiniuProperties { + + /** + * 七牛绑定的域名 + */ + private String domain; + + /** + * 七牛路径前缀 + */ + private String prefix; + + /** + * 七牛ACCESS_KEY + */ + private String accessKey; + + /** + * 七牛SECRET_KEY + */ + private String secretKey; + + /** + * 七牛存储空间名 + */ + private String bucketName; + + /** + * 七牛存储区域 + */ + private String region; + + /** + * 七牛是否使用https + */ + private Boolean isHttps; + + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java new file mode 100644 index 00000000..a23c1f5b --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java @@ -0,0 +1,74 @@ +package com.ruoyi.oss.service; + +import com.ruoyi.oss.entity.UploadResult; + +import java.io.InputStream; + +/** + * 云存储服务接口 + * + * @author Lion Li + */ +public interface ICloudStorageService { + + void createBucket(); + + /** + * 获取服务商类型 + */ + String getServiceType(); + + /** + * 文件路径 + * + * @param prefix 前缀 + * @param suffix 后缀 + * @return 返回上传路径 + */ + String getPath(String prefix, String suffix); + + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + UploadResult upload(byte[] data, String path, String contentType); + + /** + * 文件删除 + * + * @param path 文件路径,包含文件名 + */ + void delete(String path); + + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param suffix 后缀 + * @return 返回http地址 + */ + UploadResult uploadSuffix(byte[] data, String suffix, String contentType); + + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + UploadResult upload(InputStream inputStream, String path, String contentType); + + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param suffix 后缀 + * @return 返回http地址 + */ + UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); + + String getEndpointLink(); +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java new file mode 100644 index 00000000..c757ab40 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java @@ -0,0 +1,62 @@ +package com.ruoyi.oss.service.abstractd; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.service.ICloudStorageService; +import org.springframework.beans.factory.InitializingBean; + +import java.io.InputStream; +import java.util.Date; + +/** + * 云存储(支持七牛、阿里云、腾讯云、minio) + * + * @author Lion Li + */ +public abstract class AbstractCloudStorageService implements ICloudStorageService, InitializingBean { + + @Override + public abstract void createBucket(); + + @Override + public abstract String getServiceType(); + + @Override + public String getPath(String prefix, String suffix) { + // 生成uuid + String uuid = IdUtil.fastSimpleUUID(); + // 文件路径 + String path = DateUtil.format(new Date(), "yyyyMMdd") + "/" + uuid; + if (StrUtil.isNotBlank(prefix)) { + path = prefix + "/" + path; + } + return path + suffix; + } + + @Override + public abstract UploadResult upload(byte[] data, String path, String contentType); + + @Override + public abstract void delete(String path); + + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + byte[] data = IoUtil.readBytes(inputStream); + return this.upload(data, path, contentType); + } + + @Override + public abstract UploadResult uploadSuffix(byte[] data, String suffix, String contentType); + + @Override + public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); + + @Override + public abstract void afterPropertiesSet() throws Exception; + + @Override + public abstract String getEndpointLink(); +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java new file mode 100644 index 00000000..a4b43ec4 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java @@ -0,0 +1,128 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.aliyun.oss.ClientConfiguration; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.common.auth.DefaultCredentialProvider; +import com.aliyun.oss.model.CannedAccessControlList; +import com.aliyun.oss.model.CreateBucketRequest; +import com.aliyun.oss.model.ObjectMetadata; +import com.aliyun.oss.model.PutObjectRequest; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.properties.CloudStorageProperties.AliyunProperties; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * 阿里云存储 + * + * @author Lion Li + */ +@Lazy +@Service +public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { + + private final OSSClient client; + private final AliyunProperties properties; + + @Autowired + public AliyunCloudStorageServiceImpl(CloudStorageProperties properties) { + this.properties = properties.getAliyun(); + try { + ClientConfiguration configuration = new ClientConfiguration(); + DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider( + this.properties.getAccessKeyId(), + this.properties.getAccessKeySecret()); + client = new OSSClient(this.properties.getEndpoint(), credentialProvider, configuration); + createBucket(); + } catch (Exception e) { + throw new IllegalArgumentException("阿里云存储配置错误! 请检查系统配置!"); + } + } + + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (client.doesBucketExist(bucketName)) { + return; + } + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); + client.createBucket(createBucketRequest); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对阿里云配置信息"); + } + } + + @Override + public String getServiceType() { + return CloudServiceEnumd.ALIYUN.getValue(); + } + + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } + + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(contentType); + client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查阿里云配置信息"); + } + return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); + } + + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + client.deleteObject(properties.getBucketName(), path); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查阿里云配置信息"); + } + } + + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public void afterPropertiesSet() throws Exception { + OssFactory.register(getServiceType(), this); + } + + @Override + public String getEndpointLink() { + String endpoint = properties.getEndpoint(); + StringBuilder sb = new StringBuilder(endpoint); + if (StrUtil.containsAnyIgnoreCase(endpoint, "http://")) { + sb.insert(7, properties.getBucketName() + "."); + } else if (StrUtil.containsAnyIgnoreCase(endpoint, "https://")) { + sb.insert(8, properties.getBucketName() + "."); + } else { + throw new OssException("Endpoint配置错误"); + } + return sb.toString(); + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java new file mode 100644 index 00000000..70ed6848 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java @@ -0,0 +1,195 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.enumd.PolicyType; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.properties.CloudStorageProperties.MinioProperties; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import io.minio.*; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * minio存储 + * + * @author Lion Li + */ +@Lazy +@Service +public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { + + private final MinioClient minioClient; + private final MinioProperties properties; + + @Autowired + public MinioCloudStorageServiceImpl(CloudStorageProperties properties) { + this.properties = properties.getMinio(); + try { + minioClient = MinioClient.builder() + .endpoint(this.properties.getEndpoint()) + .credentials(this.properties.getAccessKey(), this.properties.getSecretKey()) + .build(); + createBucket(); + } catch (Exception e) { + throw new IllegalArgumentException("Minio存储配置错误! 请检查系统配置!"); + } + } + + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + if (exists) { + return; + } + // 不存在就创建桶 + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + minioClient.setBucketPolicy(SetBucketPolicyArgs.builder() + .bucket(bucketName) + .config(getPolicy(bucketName, PolicyType.READ)) + .build()); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对Minio配置信息"); + } + } + + @Override + public String getServiceType() { + return CloudServiceEnumd.MINIO.getValue(); + } + + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } + + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + minioClient.putObject(PutObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .contentType(StrUtil.blankToDefault(contentType, MediaType.APPLICATION_OCTET_STREAM_VALUE)) + .stream(inputStream, inputStream.available(), -1) + .build()); + } catch (Exception e) { + throw new OssException("上传文件失败,请核对Minio配置信息"); + } + return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); + } + + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + minioClient.removeObject(RemoveObjectArgs.builder() + .bucket(properties.getBucketName()) + .object(path) + .build()); + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } + + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath("", suffix), contentType); + } + + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath("", suffix), contentType); + } + + @Override + public void afterPropertiesSet() throws Exception { + OssFactory.register(getServiceType(), this); + } + + @Override + public String getEndpointLink() { + return properties.getEndpoint() + "/" + properties.getBucketName(); + } + + private String getPolicy(String bucketName, PolicyType policyType) { + StringBuilder builder = new StringBuilder(); + builder.append("{\n"); + builder.append(" \"Statement\": [\n"); + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + if (policyType == PolicyType.WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else if (policyType == PolicyType.READ_WRITE) { + builder.append(" \"s3:GetBucketLocation\",\n"); + builder.append(" \"s3:ListBucket\",\n"); + builder.append(" \"s3:ListBucketMultipartUploads\"\n"); + } else { + builder.append(" \"s3:GetBucketLocation\"\n"); + } + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + if (PolicyType.READ.equals(policyType)) { + builder.append(" {\n"); + builder.append(" \"Action\": [\n"); + builder.append(" \"s3:ListBucket\"\n"); + builder.append(" ],\n"); + builder.append(" \"Effect\": \"Deny\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("\"\n"); + builder.append(" },\n"); + } + builder.append(" {\n"); + builder.append(" \"Action\": "); + switch (policyType) { + case WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + case READ_WRITE: + builder.append("[\n"); + builder.append(" \"s3:AbortMultipartUpload\",\n"); + builder.append(" \"s3:DeleteObject\",\n"); + builder.append(" \"s3:GetObject\",\n"); + builder.append(" \"s3:ListMultipartUploadParts\",\n"); + builder.append(" \"s3:PutObject\"\n"); + builder.append(" ],\n"); + break; + default: + builder.append("\"s3:GetObject\",\n"); + break; + } + builder.append(" \"Effect\": \"Allow\",\n"); + builder.append(" \"Principal\": \"*\",\n"); + builder.append(" \"Resource\": \"arn:aws:s3:::"); + builder.append(bucketName); + builder.append("/*\"\n"); + builder.append(" }\n"); + builder.append(" ],\n"); + builder.append(" \"Version\": \"2012-10-17\"\n"); + builder.append("}\n"); + return builder.toString(); + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java new file mode 100644 index 00000000..35f008a1 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java @@ -0,0 +1,136 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.qcloud.cos.COSClient; +import com.qcloud.cos.ClientConfig; +import com.qcloud.cos.auth.BasicCOSCredentials; +import com.qcloud.cos.auth.COSCredentials; +import com.qcloud.cos.http.HttpProtocol; +import com.qcloud.cos.model.*; +import com.qcloud.cos.region.Region; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.properties.CloudStorageProperties.QcloudProperties; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * 腾讯云存储 + * + * @author Lion Li + */ +@Lazy +@Service +public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { + + private final COSClient client; + private final QcloudProperties properties; + + @Autowired + public QcloudCloudStorageServiceImpl(CloudStorageProperties properties) { + this.properties = properties.getQcloud(); + try { + COSCredentials credentials = new BasicCOSCredentials( + this.properties.getSecretId(), + this.properties.getSecretKey()); + // 初始化客户端配置 + ClientConfig clientConfig = new ClientConfig(); + // 设置bucket所在的区域,华南:gz 华北:tj 华东:sh + clientConfig.setRegion(new Region(this.properties.getRegion())); + if (this.properties.getIsHttps()) { + clientConfig.setHttpProtocol(HttpProtocol.https); + } else { + clientConfig.setHttpProtocol(HttpProtocol.http); + } + client = new COSClient(credentials, clientConfig); + createBucket(); + } catch (Exception e) { + throw new IllegalArgumentException("腾讯云存储配置错误! 请检查系统配置!"); + } + } + + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (client.doesBucketExist(bucketName)) { + return; + } + CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); + createBucketRequest.setCannedAcl(CannedAccessControlList.PublicRead); + client.createBucket(createBucketRequest); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对腾讯云配置信息"); + } + } + + @Override + public String getServiceType() { + return CloudServiceEnumd.QCLOUD.getValue(); + } + + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + return upload(new ByteArrayInputStream(data), path, contentType); + } + + @Override + public UploadResult upload(InputStream inputStream, String path, String contentType) { + try { + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentType(contentType); + client.putObject(new PutObjectRequest(properties.getBucketName(), path, inputStream, metadata)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查腾讯云配置信息"); + } + return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); + } + + @Override + public void delete(String path) { + path = path.replace(getEndpointLink() + "/", ""); + try { + client.deleteObject(new DeleteObjectRequest(properties.getBucketName(), path)); + } catch (Exception e) { + throw new OssException("上传文件失败,请检腾讯云查配置信息"); + } + } + + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public void afterPropertiesSet() throws Exception { + OssFactory.register(getServiceType(),this); + } + + @Override + public String getEndpointLink() { + String endpoint = properties.getEndpoint(); + StringBuilder sb = new StringBuilder(endpoint); + if (StrUtil.containsAnyIgnoreCase(endpoint, "http://")) { + sb.insert(7, properties.getBucketName() + "."); + } else if (StrUtil.containsAnyIgnoreCase(endpoint, "https://")) { + sb.insert(8, properties.getBucketName() + "."); + } else { + throw new OssException("Endpoint配置错误"); + } + return sb.toString(); + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java new file mode 100644 index 00000000..f7b4d4e2 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java @@ -0,0 +1,145 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.enumd.CloudServiceEnumd; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.properties.CloudStorageProperties.QiniuProperties; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import java.io.InputStream; + +/** + * 七牛云存储 + * + * @author Lion Li + */ +@Lazy +@Service +public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { + + private final UploadManager uploadManager; + private final BucketManager bucketManager; + private final String token; + private final QiniuProperties properties; + + @Autowired + public QiniuCloudStorageServiceImpl(CloudStorageProperties properties) { + this.properties = properties.getQiniu(); + try { + Configuration config = new Configuration(getRegion(this.properties.getRegion())); + // https设置 + config.useHttpsDomains = false; + if (this.properties.getIsHttps() != null) { + config.useHttpsDomains = this.properties.getIsHttps(); + } + uploadManager = new UploadManager(config); + Auth auth = Auth.create( + this.properties.getAccessKey(), + this.properties.getSecretKey()); + String bucketName = this.properties.getBucketName(); + token = auth.uploadToken(bucketName); + bucketManager = new BucketManager(auth, config); + + if (!ArrayUtil.contains(bucketManager.buckets(), bucketName)) { + bucketManager.createBucket(bucketName, this.properties.getRegion()); + } + } catch (Exception e) { + throw new IllegalArgumentException("七牛云存储配置错误! 请检查系统配置!"); + } + } + + @Override + public void createBucket() { + try { + String bucketName = properties.getBucketName(); + if (ArrayUtil.contains(bucketManager.buckets(), bucketName)) { + return; + } + bucketManager.createBucket(bucketName, properties.getRegion()); + } catch (Exception e) { + throw new OssException("创建Bucket失败, 请核对七牛云配置信息"); + } + } + + @Override + public String getServiceType() { + return CloudServiceEnumd.QINIU.getValue(); + } + + @Override + public UploadResult upload(byte[] data, String path, String contentType) { + try { + Response res = uploadManager.put(data, path, token, null, contentType, false); + if (!res.isOK()) { + throw new RuntimeException("上传七牛出错:" + res.toString()); + } + } catch (Exception e) { + throw new OssException("上传文件失败,请核对七牛配置信息"); + } + return new UploadResult().setUrl(getEndpointLink() + "/" + path).setFilename(path); + } + + @Override + public void delete(String path) { + try { + path = path.replace(getEndpointLink() + "/", ""); + Response res = bucketManager.delete(properties.getBucketName(), path); + if (!res.isOK()) { + throw new RuntimeException("删除七牛文件出错:" + res.toString()); + } + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } + + @Override + public UploadResult uploadSuffix(byte[] data, String suffix, String contentType) { + return upload(data, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType) { + return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); + } + + @Override + public void afterPropertiesSet() throws Exception { + OssFactory.register(getServiceType(),this); + } + + @Override + public String getEndpointLink() { + return properties.getDomain(); + } + + private Region getRegion(String region) { + switch (region) { + case "z0": + return Region.region0(); + case "z1": + return Region.region1(); + case "z2": + return Region.region2(); + case "na0": + return Region.regionNa0(); + case "as0": + return Region.regionAs0(); + default: + return Region.autoRegion(); + } + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java new file mode 100644 index 00000000..45f838af --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java @@ -0,0 +1,114 @@ +package com.ruoyi.system.controller; + + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.HttpUtil; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.annotation.RepeatSubmit; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.file.FileUtils; +import com.ruoyi.system.domain.bo.SysOssBo; +import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.service.ISysOssService; +import com.ruoyi.system.domain.vo.SysOssVo; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@Api(value = "OSS云存储控制器", tags = {"OSS云存储管理"}) +@RequiredArgsConstructor(onConstructor_ = @Autowired) +@RestController +@RequestMapping("/system/oss") +public class SysOssController extends BaseController { + + private final ISysOssService iSysOssService; + + /** + * 查询OSS云存储列表 + */ + @ApiOperation("查询OSS云存储列表") + @PreAuthorize("@ss.hasPermi('system:oss:list')") + @GetMapping("/list") + public TableDataInfo list(@Validated SysOssBo bo) { + return iSysOssService.queryPageList(bo); + } + + /** + * 上传OSS云存储 + */ + @ApiOperation("上传OSS云存储") + @ApiImplicitParams({ + @ApiImplicitParam(name = "file", value = "文件", dataType = "java.io.File", required = true), + }) + @PreAuthorize("@ss.hasPermi('system:oss:upload')") + @Log(title = "OSS云存储", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping("/upload") + public AjaxResult> upload(@RequestPart("file") MultipartFile file) { + if (file.isEmpty()) { + throw new CustomException("上传文件不能为空"); + } + SysOss oss = iSysOssService.upload(file); + Map map = new HashMap<>(2); + map.put("url", oss.getUrl()); + map.put("fileName", oss.getFileName()); + return AjaxResult.success(map); + } + + @ApiOperation("下载OSS云存储") + @PreAuthorize("@ss.hasPermi('system:oss:download')") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + SysOss sysOss = iSysOssService.getById(ossId); + if (sysOss == null) { + throw new CustomException("文件数据不存在!"); + } + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + FileUtils.setAttachmentResponseHeader(response, URLEncoder.encode(sysOss.getOriginalName(), StandardCharsets.UTF_8)); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + long data = HttpUtil.download(sysOss.getUrl(), response.getOutputStream(), false); + response.setContentLength(Convert.toInt(data)); + } + + /** + * 删除OSS云存储 + */ + @ApiOperation("删除OSS云存储") + @PreAuthorize("@ss.hasPermi('system:oss:remove')") + @Log(title = "OSS云存储" , businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public AjaxResult remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + return toAjax(iSysOssService.deleteWithValidByIds(Arrays.asList(ossIds), true) ? 1 : 0); + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java new file mode 100644 index 00000000..7b7639c3 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java @@ -0,0 +1,80 @@ +package com.ruoyi.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * OSS云存储对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +@TableName("sys_oss") +public class SysOss implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 云存储主键 + */ + @TableId(value = "oss_id", type = IdType.AUTO) + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 上传人 + */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private String updateBy; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java new file mode 100644 index 00000000..a30ff322 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java @@ -0,0 +1,67 @@ +package com.ruoyi.system.domain.bo; + +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * OSS云存储分页查询对象 sys_oss + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("OSS云存储分页查询对象") +public class SysOssBo extends BaseEntity { + + /** + * 分页大小 + */ + @ApiModelProperty("分页大小") + private Integer pageSize; + /** + * 当前页数 + */ + @ApiModelProperty("当前页数") + private Integer pageNum; + /** + * 排序列 + */ + @ApiModelProperty("排序列") + private String orderByColumn; + /** + * 排序的方向desc或者asc + */ + @ApiModelProperty(value = "排序的方向", example = "asc,desc") + private String isAsc; + + + /** + * 文件名 + */ + @ApiModelProperty("文件名") + private String fileName; + /** + * 原名 + */ + @ApiModelProperty("原名") + private String originalName; + /** + * 文件后缀名 + */ + @ApiModelProperty("文件后缀名") + private String fileSuffix; + /** + * URL地址 + */ + @ApiModelProperty("URL地址") + private String url; + /** + * 服务商 + */ + @ApiModelProperty("服务商") + private String service; + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/vo/SysOssVo.java b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/vo/SysOssVo.java new file mode 100644 index 00000000..8bc59b2c --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/vo/SysOssVo.java @@ -0,0 +1,69 @@ +package com.ruoyi.system.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + * OSS云存储视图对象 sys_oss + * + * @author Lion Li + */ +@Data +@ApiModel("OSS云存储视图对象") +public class SysOssVo { + + private static final long serialVersionUID = 1L; + + /** + * 云存储主键 + */ + @ApiModelProperty("云存储主键") + private Long ossId; + + /** + * 文件名 + */ + @ApiModelProperty("文件名") + private String fileName; + + /** + * 原名 + */ + @ApiModelProperty("原名") + private String originalName; + + /** + * 文件后缀名 + */ + @ApiModelProperty("文件后缀名") + private String fileSuffix; + + /** + * URL地址 + */ + @ApiModelProperty("URL地址") + private String url; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createTime; + + /** + * 上传人 + */ + @ApiModelProperty("上传人") + private String createBy; + + /** + * 服务商 + */ + @ApiModelProperty("服务商") + private String service; + + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java b/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java new file mode 100644 index 00000000..8eee53b6 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java @@ -0,0 +1,12 @@ +package com.ruoyi.system.mapper; + +import com.ruoyi.common.core.mybatisplus.core.BaseMapperPlus; +import com.ruoyi.system.domain.SysOss; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +public interface SysOssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java new file mode 100644 index 00000000..4f998e0f --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.system.domain.bo.SysOssBo; +import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.domain.vo.SysOssVo; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collection; + +/** + * 文件上传 服务层 + * + * @author Lion Li + */ +public interface ISysOssService extends IServicePlus { + + TableDataInfo queryPageList(SysOssBo sysOss); + + SysOss upload(MultipartFile file); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java new file mode 100644 index 00000000..5c34a5c0 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -0,0 +1,90 @@ +package com.ruoyi.system.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.ruoyi.common.core.page.PagePlus; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.oss.entity.UploadResult; +import com.ruoyi.oss.factory.OssFactory; +import com.ruoyi.oss.service.ICloudStorageService; +import com.ruoyi.system.domain.bo.SysOssBo; +import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.mapper.SysOssMapper; +import com.ruoyi.system.service.ISysOssService; +import com.ruoyi.system.domain.vo.SysOssVo; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@Service +public class SysOssServiceImpl extends ServicePlusImpl implements ISysOssService { + + @Override + public TableDataInfo queryPageList(SysOssBo bo) { + PagePlus result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); + return PageUtils.buildDataInfo(result); + } + + private LambdaQueryWrapper buildQueryWrapper(SysOssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StrUtil.isNotBlank(bo.getFileName()), SysOss::getFileName, bo.getFileName()); + lqw.like(StrUtil.isNotBlank(bo.getOriginalName()), SysOss::getOriginalName, bo.getOriginalName()); + lqw.eq(StrUtil.isNotBlank(bo.getFileSuffix()), SysOss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StrUtil.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(StrUtil.isNotBlank(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(StrUtil.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); + return lqw; + } + + @Override + public SysOss upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StrUtil.sub(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + ICloudStorageService storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType()); + } catch (IOException e) { + throw new CustomException("文件读取异常!!!", e); + } + // 保存文件信息 + SysOss oss = new SysOss() + .setUrl(uploadResult.getUrl()) + .setFileSuffix(suffix) + .setFileName(uploadResult.getFilename()) + .setOriginalName(originalfileName) + .setService(storage.getServiceType()); + save(oss); + return oss; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = listByIds(ids); + for (SysOss sysOss : list) { + ICloudStorageService storage = OssFactory.instance(sysOss.getService()); + storage.delete(sysOss.getUrl()); + } + return removeByIds(ids); + } + +} diff --git a/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml new file mode 100644 index 00000000..a1e4ca8a --- /dev/null +++ b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml index f1d850c1..ef70d323 100644 --- a/ruoyi-quartz/pom.xml +++ b/ruoyi-quartz/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java index cb5b7d5f..27f598ac 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java @@ -1,6 +1,6 @@ package com.ruoyi.quartz.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.quartz.domain.SysJobLog; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysJobLogService extends IServicePlus { +public interface ISysJobLogService extends IService { TableDataInfo selectPageJobLogList(SysJobLog jobLog); diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java index 11150c75..81eef937 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java @@ -1,6 +1,6 @@ package com.ruoyi.quartz.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.quartz.domain.SysJob; @@ -13,7 +13,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysJobService extends IServicePlus { +public interface ISysJobService extends IService { /** * 获取quartz调度器的计划任务 * diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java index e10ad14b..6494492a 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.quartz.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.quartz.domain.SysJobLog; @@ -21,7 +21,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysJobLogServiceImpl extends ServicePlusImpl implements ISysJobLogService { +public class SysJobLogServiceImpl extends ServiceImpl implements ISysJobLogService { @Override public TableDataInfo selectPageJobLogList(SysJobLog jobLog) { diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java index 7d111d77..3a7f0536 100644 --- a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java +++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java @@ -2,8 +2,8 @@ package com.ruoyi.quartz.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.ScheduleConstants; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.utils.PageUtils; @@ -29,7 +29,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysJobServiceImpl extends ServicePlusImpl implements ISysJobService { +public class SysJobServiceImpl extends ServiceImpl implements ISysJobService { @Autowired private Scheduler scheduler; diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 0ec9ba9b..3665c805 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ ruoyi-vue-plus com.ruoyi - 2.5.2 + 2.6.0 4.0.0 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java index b649c7f8..fdc76fb4 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysConfig; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysConfigService extends IServicePlus { +public interface ISysConfigService extends IService { TableDataInfo selectPageConfigList(SysConfig config); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java index 7afbf4b5..f518ff5f 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java @@ -1,8 +1,8 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import java.util.List; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysDeptService extends IServicePlus { +public interface ISysDeptService extends IService { /** * 查询部门管理数据 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java index 570c7d1a..25daa1a8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysDictData; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import java.util.List; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysDictDataService extends IServicePlus { +public interface ISysDictDataService extends IService { TableDataInfo selectPageDictDataList(SysDictData dictData); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java index a5d8de58..ac1d6c9a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java @@ -1,8 +1,8 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import java.util.List; @@ -12,7 +12,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysDictTypeService extends IServicePlus { +public interface ISysDictTypeService extends IService { TableDataInfo selectPageDictTypeList(SysDictType dictType); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java index 4976d3f4..5a7d9700 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysLogininfor; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysLogininforService extends IServicePlus { +public interface ISysLogininforService extends IService { TableDataInfo selectPageLogininforList(SysLogininfor logininfor); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java index d2787435..391cf190 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java @@ -1,8 +1,8 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysMenu; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.system.domain.vo.RouterVo; import java.util.List; @@ -13,7 +13,7 @@ import java.util.Set; * * @author ruoyi */ -public interface ISysMenuService extends IServicePlus { +public interface ISysMenuService extends IService { /** * 根据用户查询系统菜单列表 * diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java index 2db8422a..535e7608 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysNotice; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysNoticeService extends IServicePlus { +public interface ISysNoticeService extends IService { TableDataInfo selectPageNoticeList(SysNotice notice); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java index dcd2c085..ecfadb19 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysOperLog; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysOperLogService extends IServicePlus { +public interface ISysOperLogService extends IService { TableDataInfo selectPageOperLogList(SysOperLog operLog); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java index f56c5fdc..f6659c05 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java @@ -1,6 +1,6 @@ package com.ruoyi.system.service; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.system.domain.SysPost; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysPostService extends IServicePlus { +public interface ISysPostService extends IService { TableDataInfo selectPagePostList(SysPost post); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java index 9d02ceb2..77a7c26d 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java @@ -1,9 +1,8 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; -import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.system.domain.SysUserRole; import java.util.List; @@ -14,7 +13,7 @@ import java.util.Set; * * @author ruoyi */ -public interface ISysRoleService extends IServicePlus { +public interface ISysRoleService extends IService { TableDataInfo selectPageRoleList(SysRole role); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java index e277d108..ea1b89b1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java @@ -1,7 +1,7 @@ package com.ruoyi.system.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.IServicePlus; import com.ruoyi.common.core.page.TableDataInfo; import java.util.List; @@ -11,7 +11,7 @@ import java.util.List; * * @author ruoyi */ -public interface ISysUserService extends IServicePlus { +public interface ISysUserService extends IService { TableDataInfo selectPageUserList(SysUser user); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java index 41be8077..eee05950 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -4,10 +4,10 @@ import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.DataSourceType; @@ -31,7 +31,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysConfigServiceImpl extends ServicePlusImpl implements ISysConfigService { +public class SysConfigServiceImpl extends ServiceImpl implements ISysConfigService { @Autowired private RedisCache redisCache; @@ -98,6 +98,7 @@ public class SysConfigServiceImpl extends ServicePlusImpl implements ISysDeptService { +public class SysDeptServiceImpl extends ServiceImpl implements ISysDeptService { @Autowired private SysRoleMapper roleMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java index 92be9d5e..469c9908 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java @@ -2,8 +2,8 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.entity.SysDictData; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.PageUtils; @@ -11,7 +11,6 @@ import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.service.ISysDictDataService; import org.springframework.stereotype.Service; -import java.util.Arrays; import java.util.List; /** @@ -20,7 +19,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysDictDataServiceImpl extends ServicePlusImpl implements ISysDictDataService { +public class SysDictDataServiceImpl extends ServiceImpl implements ISysDictDataService { @Override public TableDataInfo selectPageDictDataList(SysDictData dictData) { @@ -84,10 +83,10 @@ public class SysDictDataServiceImpl extends ServicePlusImpl dictDatas = baseMapper.selectDictDataByType(data.getDictType()); DictUtils.setDictCache(data.getDictType(), dictDatas); } - baseMapper.deleteBatchIds(Arrays.asList(dictCodes)); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java index 82f67c3a..c4f9d955 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java @@ -5,10 +5,10 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.domain.entity.SysDictType; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.DictUtils; @@ -31,7 +31,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysDictTypeServiceImpl extends ServicePlusImpl implements ISysDictTypeService { +public class SysDictTypeServiceImpl extends ServiceImpl implements ISysDictTypeService { @Autowired private SysDictDataMapper dictDataMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java index 0284ed7e..c1295255 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java @@ -3,7 +3,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysLogininfor; @@ -22,7 +22,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysLogininforServiceImpl extends ServicePlusImpl implements ISysLogininforService { +public class SysLogininforServiceImpl extends ServiceImpl implements ISysLogininforService { @Override public TableDataInfo selectPageLogininforList(SysLogininfor logininfor) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java index e1b43145..2222e738 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java @@ -3,13 +3,13 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.TreeSelect; import com.ruoyi.common.core.domain.entity.SysMenu; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.SysRoleMenu; import com.ruoyi.system.domain.vo.MetaVo; @@ -31,7 +31,7 @@ import java.util.stream.Collectors; * @author ruoyi */ @Service -public class SysMenuServiceImpl extends ServicePlusImpl implements ISysMenuService { +public class SysMenuServiceImpl extends ServiceImpl implements ISysMenuService { public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired @@ -154,14 +154,14 @@ public class SysMenuServiceImpl extends ServicePlusImpl childrenList.add(children); router.setChildren(childrenList); } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { - router.setMeta(null); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setPath("/inner"); List childrenList = new ArrayList(); RouterVo children = new RouterVo(); String routerPath = StringUtils.replaceEach(menu.getPath(), new String[] { Constants.HTTP, Constants.HTTPS }, new String[] { "", "" }); children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); - children.setName(StringUtils.capitalize(routerPath)); + children.setName(StrUtil.upperFirst(routerPath)); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); childrenList.add(children); router.setChildren(childrenList); diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java index 977e6446..e0634701 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java @@ -2,7 +2,7 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysNotice; @@ -19,7 +19,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysNoticeServiceImpl extends ServicePlusImpl implements ISysNoticeService { +public class SysNoticeServiceImpl extends ServiceImpl implements ISysNoticeService { @Override public TableDataInfo selectPageNoticeList(SysNotice notice) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java index 5d243566..238c015a 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java @@ -4,7 +4,7 @@ import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.system.domain.SysOperLog; @@ -23,7 +23,7 @@ import java.util.Map; * @author ruoyi */ @Service -public class SysOperLogServiceImpl extends ServicePlusImpl implements ISysOperLogService { +public class SysOperLogServiceImpl extends ServiceImpl implements ISysOperLogService { @Override public TableDataInfo selectPageOperLogList(SysOperLog operLog) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java index 93f8e989..d2aeab07 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java @@ -3,8 +3,8 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.UserConstants; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -25,7 +25,7 @@ import java.util.List; * @author ruoyi */ @Service -public class SysPostServiceImpl extends ServicePlusImpl implements ISysPostService { +public class SysPostServiceImpl extends ServiceImpl implements ISysPostService { @Autowired private SysUserPostMapper userPostMapper; diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java index df024ae6..ddba9af8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java @@ -2,10 +2,10 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -30,7 +30,7 @@ import java.util.*; * @author ruoyi */ @Service -public class SysRoleServiceImpl extends ServicePlusImpl implements ISysRoleService { +public class SysRoleServiceImpl extends ServiceImpl implements ISysRoleService { @Autowired private SysRoleMenuMapper roleMenuMapper; @@ -364,13 +364,17 @@ public class SysRoleServiceImpl extends ServicePlusImpl @Override public int insertAuthUsers(Long roleId, Long[] userIds) { // 新增用户与角色管理 - List list = new ArrayList(); + int rows = 1; + List list = new ArrayList(); for (Long userId : userIds) { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); list.add(ur); } - return userRoleMapper.insertAll(list); + if (list.size() > 0) { + rows = userRoleMapper.insertAll(list); + } + return rows; } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index b5bcb70d..69adbe19 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -3,11 +3,11 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.lang.Validator; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; -import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.PageUtils; @@ -34,7 +34,7 @@ import java.util.List; */ @Slf4j @Service -public class SysUserServiceImpl extends ServicePlusImpl implements ISysUserService { +public class SysUserServiceImpl extends ServiceImpl implements ISysUserService { @Autowired private SysRoleMapper roleMapper; diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index c9ca44bf..c980bab8 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi-vue-plus", - "version": "2.5.2", + "version": "2.6.0", "description": "RuoYi-Vue-Plus后台管理系统", "author": "LionLi", "license": "MIT", @@ -41,7 +41,7 @@ "clipboard": "2.0.6", "core-js": "3.8.1", "echarts": "4.9.0", - "element-ui": "2.15.2", + "element-ui": "2.15.3", "file-saver": "2.0.4", "fuse.js": "6.4.3", "highlight.js": "9.18.5", diff --git a/ruoyi-ui/src/api/demo/demo.js b/ruoyi-ui/src/api/demo/demo.js index fc9937df..c7195afb 100644 --- a/ruoyi-ui/src/api/demo/demo.js +++ b/ruoyi-ui/src/api/demo/demo.js @@ -9,6 +9,15 @@ export function listDemo(query) { }) } +// 自定义分页接口 +export function pageDemo(query) { + return request({ + url: '/demo/demo/page', + method: 'get', + params: query + }) +} + // 查询测试单表详细 export function getDemo(id) { return request({ @@ -50,4 +59,4 @@ export function exportDemo(query) { method: 'get', params: query }) -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/api/system/oss.js b/ruoyi-ui/src/api/system/oss.js new file mode 100644 index 00000000..39be5971 --- /dev/null +++ b/ruoyi-ui/src/api/system/oss.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 查询OSS云存储列表 +export function listOss(query) { + return request({ + url: '/system/oss/list', + method: 'get', + params: query + }) +} + +// 删除OSS云存储 +export function delOss(ossId) { + return request({ + url: '/system/oss/' + ossId, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/components/Editor/index.vue b/ruoyi-ui/src/components/Editor/index.vue index f78dfcc5..bc2e7e1d 100644 --- a/ruoyi-ui/src/components/Editor/index.vue +++ b/ruoyi-ui/src/components/Editor/index.vue @@ -2,6 +2,7 @@
{ - // this.uploadType = "video"; - // if (value) { - // this.$refs.upload.$children[0].$refs.input.click(); - // } else { - // this.quill.format("video", false); - // } - // }); } this.Quill.pasteHTML(this.currentValue); this.Quill.on("text-change", (delta, oldDelta, source) => { @@ -158,6 +156,18 @@ export default { this.$emit("on-editor-change", eventName, ...args); }); }, + // 上传前校检格式和大小 + handleBeforeUpload(file) { + // 校检文件大小 + if (this.fileSize) { + const isLt = file.size / 1024 / 1024 < this.fileSize; + if (!isLt) { + this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`); + return false; + } + } + return true; + }, handleUploadSuccess(res, file) { // 获取富文本组件实例 let quill = this.Quill; diff --git a/ruoyi-ui/src/components/FileUpload/index.vue b/ruoyi-ui/src/components/FileUpload/index.vue index d47fb98f..244ac289 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -27,7 +27,7 @@
  • - + {{ getFileName(file.name) }}
    @@ -70,7 +70,7 @@ export default { data() { return { baseUrl: process.env.VUE_APP_BASE_API, - uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址 + uploadFileUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传的图片服务器地址 headers: { Authorization: "Bearer " + getToken(), }, diff --git a/ruoyi-ui/src/components/ImageUpload/index.vue b/ruoyi-ui/src/components/ImageUpload/index.vue index 31940af2..e074b381 100644 --- a/ruoyi-ui/src/components/ImageUpload/index.vue +++ b/ruoyi-ui/src/components/ImageUpload/index.vue @@ -74,7 +74,7 @@ export default { dialogVisible: false, hideUpload: false, baseUrl: process.env.VUE_APP_BASE_API, - uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址 + uploadImgUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传的图片服务器地址 headers: { Authorization: "Bearer " + getToken(), }, @@ -90,11 +90,7 @@ export default { // 然后将数组转为对象数组 this.fileList = list.map(item => { if (typeof item === "string") { - if (item.indexOf(this.baseUrl) === -1) { - item = { name: this.baseUrl + item, url: this.baseUrl + item }; - } else { - item = { name: item, url: item }; - } + item = { name: item, url: item }; } return item; }); @@ -122,7 +118,7 @@ export default { }, // 上传成功回调 handleUploadSuccess(res) { - this.fileList.push({ name: res.data.fileName, url: res.data.fileName }); + this.fileList.push({ name: res.data.fileName, url: res.data.url }); this.$emit("input", this.listToString(this.fileList)); this.loading.close(); }, diff --git a/ruoyi-ui/src/components/RuoYi/Doc/index.vue b/ruoyi-ui/src/components/RuoYi/Doc/index.vue index 3915c296..e267f902 100644 --- a/ruoyi-ui/src/components/RuoYi/Doc/index.vue +++ b/ruoyi-ui/src/components/RuoYi/Doc/index.vue @@ -1,21 +1,21 @@ - - - \ No newline at end of file + + + diff --git a/ruoyi-ui/src/components/RuoYi/Git/index.vue b/ruoyi-ui/src/components/RuoYi/Git/index.vue index 1d09a774..4d580e41 100644 --- a/ruoyi-ui/src/components/RuoYi/Git/index.vue +++ b/ruoyi-ui/src/components/RuoYi/Git/index.vue @@ -9,7 +9,7 @@ export default { name: 'RuoYiGit', data() { return { - url: 'https://gitee.com/y_project/RuoYi-Vue' + url: 'https://gitee.com/JavaLionLi/RuoYi-Vue-Plus' } }, methods: { @@ -18,4 +18,4 @@ export default { } } } - \ No newline at end of file + diff --git a/ruoyi-ui/src/components/TopNav/index.vue b/ruoyi-ui/src/components/TopNav/index.vue index c8837f2a..1b7c4d9e 100644 --- a/ruoyi-ui/src/components/TopNav/index.vue +++ b/ruoyi-ui/src/components/TopNav/index.vue @@ -12,7 +12,7 @@ - + diff --git a/ruoyi-ui/src/views/system/role/index.vue b/ruoyi-ui/src/views/system/role/index.vue index 5bedd490..53d4f8d2 100644 --- a/ruoyi-ui/src/views/system/role/index.vue +++ b/ruoyi-ui/src/views/system/role/index.vue @@ -139,7 +139,7 @@ @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']" >删除 - + 更多 @@ -164,11 +164,17 @@ - + - + + + + + + 权限字符 + @@ -568,7 +574,7 @@ export default { /** 分配用户操作 */ handleAuthUser: function(row) { const roleId = row.roleId; - this.$router.push("/auth/user/" + roleId); + this.$router.push("/system/role-auth/user/" + roleId); }, /** 提交按钮 */ submitForm: function() { diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 605cf6ee..1b972206 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -182,7 +182,7 @@ @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']" >删除 - + 更多 @@ -242,7 +242,7 @@ - + @@ -328,15 +328,14 @@ drag > -
    - 将文件拖到此处,或 - 点击上传 +
    将文件拖到此处,或点击上传
    +
    +
    + 是否更新已经存在的用户数据 +
    + 仅允许导入xls、xlsx格式文件。 + 下载模板
    -
    - 是否更新已经存在的用户数据 - 下载模板 -
    -
    提示:仅允许导入“xls”或“xlsx”格式文件!