From eb2be90e74adfa06ee251f80c08243d0301ce467 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期三, 28 七月 2021 10:49:16 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' --- ruoyi-ui/src/views/demo/demo/index.vue | 22 ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java | 22 ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm | 24 ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java | 45 ruoyi-oss/src/main/java/com/ruoyi/system/domain/vo/SysOssVo.java | 69 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestDemoVo.java | 52 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java | 4 ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java | 24 ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java | 187 ++ ruoyi-quartz/pom.xml | 2 ruoyi-ui/src/views/system/dict/index.vue | 2 ruoyi-ui/package.json | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java | 7 ruoyi-generator/src/main/resources/vm/java/controller.java.vm | 22 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java | 4 ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java | 90 + ruoyi-generator/src/main/resources/vm/java/bo.java.vm | 88 + ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestTree.java | 49 ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java | 16 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java | 136 + ruoyi-generator/pom.xml | 2 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoBo.java | 94 + ruoyi-oss/src/main/java/com/ruoyi/system/domain/bo/SysOssBo.java | 67 ruoyi-admin/src/main/resources/application-prod.yml | 48 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobLogService.java | 4 ruoyi-ui/src/components/RuoYi/Doc/index.vue | 42 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableService.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java | 4 ruoyi-ui/src/utils/ossdownload.js | 39 ruoyi-admin/src/main/resources/application-dev.yml | 48 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java | 4 ruoyi-ui/src/api/system/oss.js | 18 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java | 4 ruoyi-ui/src/views/tool/gen/index.vue | 2 ruoyi-ui/src/components/RuoYi/Git/index.vue | 4 ruoyi-ui/src/components/Editor/index.vue | 28 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java | 35 ruoyi-ui/src/views/index.vue | 33 ruoyi-ui/src/views/system/role/index.vue | 14 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java | 4 ruoyi-ui/src/views/system/menu/index.vue | 58 pom.xml | 28 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java | 4 ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestTreeService.java | 18 ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestDemoMapper.java | 8 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java | 9 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java | 4 docker/docker-compose.yml | 37 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java | 38 ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java | 117 + ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java | 55 ruoyi-common/src/main/java/com/ruoyi/common/core/validate/EditGroup.java | 9 ruoyi-framework/pom.xml | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java | 4 ruoyi-system/pom.xml | 2 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/TestDemo.java | 49 ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml | 5 ruoyi-ui/src/utils/request.js | 1 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java | 4 ruoyi-demo/pom.xml | 2 ruoyi-oss/pom.xml | 59 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java | 145 ++ docker/deploy.sh | 11 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java | 4 ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java | 74 + ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java | 357 ++--- ruoyi-oss/src/main/java/com/ruoyi/oss/entity/UploadResult.java | 26 ruoyi-ui/src/views/system/user/index.vue | 21 ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableColumnServiceImpl.java | 4 ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobLogServiceImpl.java | 4 ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml | 18 ruoyi-ui/src/api/demo/demo.js | 11 ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/PolicyType.java | 51 ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java | 80 + ruoyi-ui/src/router/index.js | 29 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java | 5 ruoyi-extend/ruoyi-monitor-admin/pom.xml | 2 ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java | 62 ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java | 51 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java | 4 ruoyi-generator/src/main/resources/vm/java/service.java.vm | 16 ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestTreeController.java | 29 ruoyi-ui/src/views/monitor/job/index.vue | 50 ruoyi-ui/src/views/system/oss/index.vue | 322 ++++ README.md | 8 ruoyi-extend/pom.xml | 2 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java | 5 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java | 4 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java | 195 ++ ruoyi-ui/src/views/monitor/job/log.vue | 28 ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java | 114 + ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java | 4 ruoyi-common/src/main/java/com/ruoyi/common/core/validate/AddGroup.java | 9 ruoyi-ui/src/components/TopNav/index.vue | 45 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java | 4 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestTreeBo.java | 79 + ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestDemoServiceImpl.java | 37 ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java | 22 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java | 4 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java | 8 ruoyi-demo/src/main/java/com/ruoyi/demo/service/ITestDemoService.java | 24 ruoyi-admin/pom.xml | 7 ruoyi-ui/src/views/system/user/profile/resetPwd.vue | 6 ruoyi-generator/src/main/java/com/ruoyi/generator/service/IGenTableColumnService.java | 4 ruoyi-ui/src/components/ImageUpload/index.vue | 10 ruoyi-common/pom.xml | 2 /dev/null | 68 ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java | 20 ruoyi-demo/src/main/java/com/ruoyi/demo/domain/vo/TestTreeVo.java | 34 ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java | 12 sql/oss.sql | 27 ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/TestTreeMapper.java | 3 ruoyi-ui/src/components/FileUpload/index.vue | 4 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java | 128 + ruoyi-generator/src/main/resources/vm/java/vo.java.vm | 2 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java | 12 121 files changed, 3,487 insertions(+), 721 deletions(-) diff --git a/README.md b/README.md index 1483d2f..2779fda 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ [](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/blob/master/LICENSE) [ <br> -[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) +[](https://gitee.com/JavaLionLi/RuoYi-Vue-Plus) []() []() []() RuoYi-Vue-Plus 鏄熀浜� RuoYi-Vue 閽堝 `鍒嗗竷寮忛泦缇 鍦烘櫙鍗囩骇 瀹氭湡涓� RuoYi-Vue 鍚屾 -闆嗘垚 Lock4j dynamic-datasource 绛夊垎甯冨紡鍦烘櫙瑙e喅鏂规 +闆嗘垚 Lock4j dynamic-datasource OSS瀛樺偍 绛夊垎甯冨紡鍦烘櫙瑙e喅鏂规 闆嗘垚 Mybatis-Plus Lombok Hutool 绛変究鎹峰紑鍙戝伐鍏� 閫傞厤閲嶅啓鐩稿叧涓氬姟 渚夸簬寮�鍙� @@ -33,6 +33,7 @@ * Redis瀹㈡埛绔� 閲囩敤 Redisson 鎬ц兘鏇村己 * 鍒嗗竷寮忛攣 Lock4j 娉ㄨВ閿併�佸伐鍏烽攣 澶氱澶氭牱 * 閮ㄧ讲鏂瑰紡 Docker 瀹瑰櫒缂栨帓 涓�閿儴缃蹭笟鍔¢泦缇� +* 鏂囦欢瀛樺偍 OSS 瀵硅薄瀛樺偍妯″潡 鏀寔(Minio銆佷竷鐗涖�侀樋閲屻�佽吘璁�) ## 鍙傝�冩枃妗� @@ -89,13 +90,14 @@ * 闆嗘垚 dynamic-datasource 澶氭暟鎹簮(榛樿鏀寔MySQL,鍏朵粬绉嶇被闇�鑷閫傞厤) * 闆嗘垚 Lock4j 瀹炵幇鍒嗗竷寮� 娉ㄨВ閿併�佸伐鍏烽攣 澶氱澶氭牱 * 澧炲姞 Docker 瀹瑰櫒缂栨帓 鎵撳寘鎻掍欢涓庨儴缃茶剼鏈� +* 绉婚櫎 鏈湴鏂囦欢涓婁紶 鏀逛负 OSS瀵硅薄瀛樺偍 鏀寔(Minio銆佷竷鐗涖�侀樋閲屻�佽吘璁�) ### 浠g爜鏀瑰姩 * 鎵�鏈夊師鐢熷姛鑳戒娇鐢� Mybatis-Plus 涓� Lombok 閲嶅啓 * 澧炲姞 IServicePlus 涓� BaseMapperPlus 鍙嚜瀹氫箟閫氱敤鏂规硶 * 浠g爜鐢熸垚妯℃澘 鏀逛负閫傞厤 Mybatis-Plus 鐨勪唬鐮� -* 浠g爜鐢熸垚妯℃澘 鎷嗗垎鍑� Vo,QueryBo,AddBo,EditBo 绛夐鍩熷璞� +* 浠g爜鐢熸垚妯℃澘 鏍规嵁 Alibaba 浠g爜瑙勭害 鎷嗗垎鍑� VO銆丅O 绛夐鍩熷璞� * 浠g爜鐢熸垚妯℃澘 澧炲姞 鏂囨。娉ㄨВ 涓� 鏍¢獙娉ㄨВ 绠�鍖栭�氱敤鎿嶄綔 * 椤圭洰淇敼涓� maven澶氱幆澧冮厤缃� * 椤圭洰閰嶇疆淇敼涓� application.yml 缁熶竴绠$悊 diff --git a/docker/deploy.sh b/docker/deploy.sh index 3b6e696..79fb9ae 100644 --- a/docker/deploy.sh +++ b/docker/deploy.sh @@ -6,10 +6,17 @@ 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 @@ #鍚姩鍩虹妯″潡 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 3413cf6..ac065c3 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -18,6 +18,8 @@ - /docker/mysql/data/:/var/lib/mysql/ # 閰嶇疆鎸傝浇 - /docker/mysql/conf/:/etc/mysql/conf.d/ + # 涓绘満鏈満鏃堕棿鏂囦欢鏄犲皠 涓庢湰鏈烘椂闂村悓姝� + - /etc/localtime:/etc/localtime:ro command: # 灏唌ysql8.0榛樿瀵嗙爜绛栫暐 淇敼涓� 鍘熷厛 绛栫暐 (mysql8.0瀵瑰叾榛樿绛栫暐鍋氫簡鏇存敼 浼氬鑷村瘑鐮佹棤娉曞尮閰�) --default-authentication-plugin=mysql_native_password @@ -68,6 +70,8 @@ - /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 @@ 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 @@ 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 @@ 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 426eec2..0454126 100644 --- a/pom.xml +++ b/pom.xml @@ -6,15 +6,15 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-vue-plus</artifactId> - <version>2.5.2</version> + <version>2.6.0</version> <name>RuoYi-Vue-Plus</name> <url>https://gitee.com/JavaLionLi/RuoYi-Vue-Plus</url> <description>RuoYi-Vue-Plus鍚庡彴绠$悊绯荤粺</description> <properties> - <ruoyi-vue-plus.version>2.5.2</ruoyi-vue-plus.version> - <spring-boot.version>2.4.8</spring-boot.version> + <ruoyi-vue-plus.version>2.6.0</ruoyi-vue-plus.version> + <spring-boot.version>2.5.3</spring-boot.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> @@ -25,19 +25,25 @@ <velocity.version>1.7</velocity.version> <jwt.version>0.9.1</jwt.version> <mybatis-plus.version>3.4.3</mybatis-plus.version> - <hutool.version>5.7.4</hutool.version> + <hutool.version>5.7.6</hutool.version> <feign.version>3.0.3</feign.version> <feign-okhttp.version>11.0</feign-okhttp.version> <spring-boot-admin.version>2.4.3</spring-boot-admin.version> - <redisson.version>3.16.0</redisson.version> + <redisson.version>3.16.1</redisson.version> <lock4j.version>2.2.1</lock4j.version> - <datasource.version>3.4.0</datasource.version> + <datasource.version>3.4.1</datasource.version> + + <!-- OSS 閰嶇疆 --> + <qiniu.version>7.8.0</qiniu.version> + <aliyun.oss.version>3.13.0</aliyun.oss.version> + <qcloud.cos.version>5.6.47</qcloud.cos.version> + <minio.version>8.3.0</minio.version> <!-- docker 閰嶇疆 --> <docker.registry.url>localhost</docker.registry.url> <docker.registry.host>http://${docker.registry.url}:2375</docker.registry.host> <docker.namespace>ruoyi</docker.namespace> - <docker.plugin.version>1.2.0</docker.plugin.version> + <docker.plugin.version>1.2.2</docker.plugin.version> </properties> <!-- 渚濊禆澹版槑 --> @@ -183,6 +189,13 @@ <!-- demo妯″潡 --> <dependency> <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-oss</artifactId> + <version>${ruoyi-vue-plus.version}</version> + </dependency> + + <!-- demo妯″潡 --> + <dependency> + <groupId>com.ruoyi</groupId> <artifactId>ruoyi-demo</artifactId> <version>${ruoyi-vue-plus.version}</version> </dependency> @@ -199,6 +212,7 @@ <module>ruoyi-common</module> <module>ruoyi-demo</module> <module>ruoyi-extend</module> + <module>ruoyi-oss</module> </modules> <packaging>pom</packaging> diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index f6b8d63..ba0ad32 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> @@ -42,6 +42,11 @@ <artifactId>ruoyi-quartz</artifactId> </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-oss</artifactId> + </dependency> + <!-- 浠g爜鐢熸垚--> <dependency> <groupId>com.ruoyi</groupId> 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 d61f99f..04aa77b 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 @@ 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; /** * 閫氱敤璇锋眰澶勭悊 @@ -31,9 +23,6 @@ public class CommonController { private static final Logger log = LoggerFactory.getLogger(CommonController.class); - - @Autowired - private ServerConfig serverConfig; /** * 閫氱敤涓嬭浇璇锋眰 @@ -64,30 +53,6 @@ catch (Exception e) { log.error("涓嬭浇鏂囦欢澶辫触", e); - } - } - - /** - * 閫氱敤涓婁紶璇锋眰 - */ - @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<String,Object> 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 31ca6dd..39f5bc6 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 @@ { 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 34e2c0c..6491c85 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -42,6 +42,10 @@ testOnReturn: false # 娉ㄦ剰杩欎釜鍊煎拰druid鍘熺敓涓嶄竴鑷达紝榛樿鍚姩浜唖tat filters: stat + +--- # druid 閰嶇疆 +spring: + datasource: druid: webStatFilter: enabled: true @@ -63,7 +67,9 @@ wall: config: multi-statement-allow: true - # redis 閰嶇疆 + +--- # redis 閰嶇疆 +spring: redis: # 鍦板潃 host: localhost @@ -78,7 +84,6 @@ # 鏄惁寮�鍚痵sl ssl: false ---- # redisson 瀹㈡埛绔厤缃� redisson: # 绾跨▼姹犳暟閲� threads: 16 @@ -137,3 +142,42 @@ 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 + # 鑵捐浜慴ucket鍚嶈鍒� 鏍煎紡涓� 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 7d9801f..2640bc0 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -42,6 +42,10 @@ testOnReturn: false # 娉ㄦ剰杩欎釜鍊煎拰druid鍘熺敓涓嶄竴鑷达紝榛樿鍚姩浜唖tat filters: stat + +--- # druid 閰嶇疆 +spring: + datasource: druid: webStatFilter: enabled: true @@ -63,7 +67,9 @@ wall: config: multi-statement-allow: true - # redis 閰嶇疆 + +--- # redis 閰嶇疆 +spring: redis: # 鍦板潃 host: 172.30.0.48 @@ -78,7 +84,6 @@ # 鏄惁寮�鍚痵sl ssl: false ---- # redisson 瀹㈡埛绔厤缃� redisson: # 绾跨▼姹犳暟閲� threads: 16 @@ -137,3 +142,42 @@ 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 + # 鑵捐浜慴ucket鍚嶈鍒� 鏍煎紡涓� 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 dc97609..016c457 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 21b0ecc..710f11a 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.List; import java.util.Map; import java.util.function.Function; -import java.util.stream.Collectors; /** * 鑷畾涔� Service 鎺ュ彛, 瀹炵幇 鏁版嵁搴撳疄浣撲笌 vo 瀵硅薄杞崲杩斿洖 @@ -19,225 +18,153 @@ * @author Lion Li * @since 2021-05-13 */ -public interface IServicePlus<T> extends IService<T> { +public interface IServicePlus<T, K> extends IService<T> { - /** - * 鏍规嵁 ID 鏌ヨ - * - * @param kClass vo绫诲瀷 - * @param id 涓婚敭ID - */ - default <K> K getVoById(Serializable id, Class<K> 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 <K> vo绫诲瀷 - */ - default <K> K getVoById(Serializable id, Function<T, K> convertor) { - T t = getBaseMapper().selectById(id); - return convertor.apply(t); - } - - /** - * 鏌ヨ锛堟牴鎹甀D 鎵归噺鏌ヨ锛� - * - * @param kClass vo绫诲瀷 - * @param idList 涓婚敭ID鍒楄〃 - */ - default <K> List<K> listVoByIds(Collection<? extends Serializable> idList, Class<K> kClass) { - List<T> list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return list.stream() - .map(any -> BeanUtil.toBean(any, kClass)) - .collect(Collectors.toList()); - } - - /** - * 鏌ヨ锛堟牴鎹甀D 鎵归噺鏌ヨ锛� - * - * @param convertor 杞崲鍑芥暟 - * @param idList 涓婚敭ID鍒楄〃 - */ - default <K> List<K> listVoByIds(Collection<? extends Serializable> idList, - Function<Collection<T>, List<K>> convertor) { - List<T> list = getBaseMapper().selectBatchIds(idList); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 鏌ヨ锛堟牴鎹� columnMap 鏉′欢锛� - * - * @param kClass vo绫诲瀷 - * @param columnMap 琛ㄥ瓧娈� map 瀵硅薄 - */ - default <K> List<K> listVoByMap(Map<String, Object> columnMap, Class<K> kClass) { - List<T> 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 <K> List<K> listVoByMap(Map<String, Object> columnMap, - Function<Collection<T>, List<K>> convertor) { - List<T> list = getBaseMapper().selectByMap(columnMap); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 鏍规嵁 Wrapper锛屾煡璇竴鏉¤褰� <br/> - * <p>缁撴灉闆嗭紝濡傛灉鏄涓細鎶涘嚭寮傚父锛岄殢鏈哄彇涓�鏉″姞涓婇檺鍒舵潯浠� wrapper.last("LIMIT 1")</p> - * - * @param kClass vo绫诲瀷 - * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default <K> K getVoOne(Wrapper<T> queryWrapper, Class<K> kClass) { - return BeanUtil.toBean(getOne(queryWrapper, true), kClass); - } - - /** - * 鏍规嵁 Wrapper锛屾煡璇竴鏉¤褰� <br/> - * <p>缁撴灉闆嗭紝濡傛灉鏄涓細鎶涘嚭寮傚父锛岄殢鏈哄彇涓�鏉″姞涓婇檺鍒舵潯浠� wrapper.last("LIMIT 1")</p> - * - * @param convertor 杞崲鍑芥暟 - * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default <K> K getVoOne(Wrapper<T> queryWrapper, Function<T, K> convertor) { - return convertor.apply(getOne(queryWrapper, true)); - } - - /** - * 鏌ヨ鍒楄〃 - * - * @param kClass vo绫诲瀷 - * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} - */ - default <K> List<K> listVo(Wrapper<T> queryWrapper, Class<K> kClass) { - List<T> 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 <K> List<K> listVo(Wrapper<T> queryWrapper, Function<Collection<T>, List<K>> convertor) { - List<T> list = getBaseMapper().selectList(queryWrapper); - if (list == null) { - return null; - } - return convertor.apply(list); - } - - /** - * 鏌ヨ鎵�鏈� - * - * @param kClass vo绫诲瀷 - * @see Wrappers#emptyWrapper() - */ - default <K> List<K> listVo(Class<K> kClass) { - return listVo(Wrappers.emptyWrapper(), kClass); - } - - /** - * 鏌ヨ鎵�鏈� - * - * @param convertor 杞崲鍑芥暟 - * @see Wrappers#emptyWrapper() - */ - default <K> List<K> listVo(Function<Collection<T>, List<K>> convertor) { - return listVo(Wrappers.emptyWrapper(), convertor); - } - - /** - * 缈婚〉鏌ヨ - * - * @param page 缈婚〉瀵硅薄 - * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� - */ - default <K> PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper, Class<K> kClass) { - PagePlus<T, K> result = getBaseMapper().selectPage(page, queryWrapper); - List<K> 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 <K> PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper, - Function<Collection<T>, List<K>> convertor) { - PagePlus<T, K> result = getBaseMapper().selectPage(page, queryWrapper); - return result.setRecordsVo(convertor.apply(result.getRecords())); - } - - /** - * 鏃犳潯浠剁炕椤垫煡璇� - * - * @param page 缈婚〉瀵硅薄 - */ - default <K> PagePlus<T, K> pageVo(PagePlus<T, K> page, Class<K> kClass) { - return pageVo(page, Wrappers.emptyWrapper(), kClass); - } - - /** - * 鏃犳潯浠剁炕椤垫煡璇� - * - * @param page 缈婚〉瀵硅薄 - * @param convertor 杞崲鍑芥暟 - */ - default <K> PagePlus<T, K> pageVo(PagePlus<T, K> page, Function<Collection<T>, List<K>> convertor) { - return pageVo(page, Wrappers.emptyWrapper(), convertor); - } - - @Override - default boolean saveBatch(Collection<T> entityList) { - return saveBatch(entityList, DEFAULT_BATCH_SIZE); + default K getVoById(Serializable id) { + return getVoById(id, new CopyOptions()); } - @Override - default boolean saveOrUpdateBatch(Collection<T> entityList) { - return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default K getVoById(Serializable id, Function<T, K> convertor) { + return convertor.apply(getById(id)); } - @Override - default boolean updateBatchById(Collection<T> entityList) { - return updateBatchById(entityList, DEFAULT_BATCH_SIZE); + /** + * @param idList id鍒楄〃 + * @param copyOptions copy鏉′欢 + * @return K瀵硅薄 + */ + List<K> listVoByIds(Collection<? extends Serializable> idList, CopyOptions copyOptions); + + default List<K> listVoByIds(Collection<? extends Serializable> idList) { + return listVoByIds(idList, new CopyOptions()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default List<K> listVoByIds(Collection<? extends Serializable> idList, + Function<Collection<T>, List<K>> convertor) { + List<T> list = getBaseMapper().selectBatchIds(idList); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + /** + * @param columnMap 琛ㄥ瓧娈� map 瀵硅薄 + * @param copyOptions copy鏉′欢 + * @return K瀵硅薄 + */ + List<K> listVoByMap(Map<String, Object> columnMap, CopyOptions copyOptions); + + default List<K> listVoByMap(Map<String, Object> columnMap) { + return listVoByMap(columnMap, new CopyOptions()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default List<K> listVoByMap(Map<String, Object> columnMap, + Function<Collection<T>, List<K>> convertor) { + List<T> list = getBaseMapper().selectByMap(columnMap); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + /** + * @param queryWrapper 鏌ヨ鏉′欢 + * @param copyOptions copy鏉′欢 + * @return K瀵硅薄 + */ + K getVoOne(Wrapper<T> queryWrapper, CopyOptions copyOptions); + + default K getVoOne(Wrapper<T> queryWrapper) { + return getVoOne(queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default K getVoOne(Wrapper<T> queryWrapper, Function<T, K> convertor) { + return convertor.apply(getOne(queryWrapper, true)); + } + + /** + * @param queryWrapper 鏌ヨ鏉′欢 + * @param copyOptions copy鏉′欢 + * @return K瀵硅薄 + */ + List<K> listVo(Wrapper<T> queryWrapper, CopyOptions copyOptions); + + default List<K> listVo(Wrapper<T> queryWrapper) { + return listVo(queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default List<K> listVo(Wrapper<T> queryWrapper, Function<Collection<T>, List<K>> convertor) { + List<T> list = getBaseMapper().selectList(queryWrapper); + if (list == null) { + return null; + } + return convertor.apply(list); + } + + default List<K> listVo() { + return listVo(Wrappers.emptyWrapper()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default List<K> listVo(Function<Collection<T>, List<K>> convertor) { + return listVo(Wrappers.emptyWrapper(), convertor); + } + + /** + * @param page 鍒嗛〉瀵硅薄 + * @param queryWrapper 鏌ヨ鏉′欢 + * @param copyOptions copy鏉′欢 + * @return K瀵硅薄 + */ + PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper, CopyOptions copyOptions); + + default PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper) { + return pageVo(page, queryWrapper, new CopyOptions()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper, + Function<Collection<T>, List<K>> convertor) { + PagePlus<T, K> result = getBaseMapper().selectPage(page, queryWrapper); + return result.setRecordsVo(convertor.apply(result.getRecords())); + } + + default PagePlus<T, K> pageVo(PagePlus<T, K> page) { + return pageVo(page, Wrappers.emptyWrapper()); + } + + /** + * @param convertor 鑷畾涔夎浆鎹㈠櫒 + */ + default PagePlus<T, K> pageVo(PagePlus<T, K> page, Function<Collection<T>, List<K>> convertor) { + return pageVo(page, Wrappers.emptyWrapper(), convertor); } boolean saveAll(Collection<T> 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 fb0998b..e00076e 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 @@ */ @Slf4j @SuppressWarnings("unchecked") -public class ServicePlusImpl<M extends BaseMapperPlus<T>, T> extends ServiceImpl<M, T> implements IServicePlus<T> { +public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, K> extends ServiceImpl<M, T> implements IServicePlus<T, K> { @Autowired protected M baseMapper; @@ -35,6 +42,12 @@ protected Class<T> mapperClass = currentMapperClass(); + protected Class<K> voClass = currentVoClass(); + + public Class<K> getVoClass() { + return voClass; + } + @Override protected Class<T> currentMapperClass() { return (Class<T>) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(0).getType(); @@ -43,6 +56,10 @@ @Override protected Class<T> currentModelClass() { return (Class<T>) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(1).getType(); + } + + protected Class<K> currentVoClass() { + return (Class<K>) this.getResolvableType().as(ServicePlusImpl.class).getGeneric(2).getType(); } @Override @@ -81,8 +98,106 @@ * 閫傜敤浜庢棤鑴戞彃鍏� */ @Override + public boolean saveBatch(Collection<T> entityList) { + return saveBatch(entityList, DEFAULT_BATCH_SIZE); + } + + @Override + public boolean saveOrUpdateBatch(Collection<T> entityList) { + return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE); + } + + @Override + public boolean updateBatchById(Collection<T> entityList) { + return updateBatchById(entityList, DEFAULT_BATCH_SIZE); + } + + /** + * 鍗晄ql鎵归噺鎻掑叆( 鍏ㄩ噺濉厖 鏃犺鏁版嵁搴撻粯璁ゅ�� ) + * 閫傜敤浜庢棤鑴戞彃鍏� + */ + @Override public boolean saveAll(Collection<T> entityList) { 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); + } + + /** + * 鏌ヨ锛堟牴鎹甀D 鎵归噺鏌ヨ锛� + * + * @param idList 涓婚敭ID鍒楄〃 + */ + @Override + public List<K> listVoByIds(Collection<? extends Serializable> idList, CopyOptions copyOptions) { + List<T> list = getBaseMapper().selectBatchIds(idList); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 鏌ヨ锛堟牴鎹� columnMap 鏉′欢锛� + * + * @param columnMap 琛ㄥ瓧娈� map 瀵硅薄 + */ + @Override + public List<K> listVoByMap(Map<String, Object> columnMap, CopyOptions copyOptions) { + List<T> list = getBaseMapper().selectByMap(columnMap); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 鏍规嵁 Wrapper锛屾煡璇竴鏉¤褰� <br/> + * <p>缁撴灉闆嗭紝濡傛灉鏄涓細鎶涘嚭寮傚父锛岄殢鏈哄彇涓�鏉″姞涓婇檺鍒舵潯浠� wrapper.last("LIMIT 1")</p> + * + * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} + */ + @Override + public K getVoOne(Wrapper<T> 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<K> listVo(Wrapper<T> queryWrapper, CopyOptions copyOptions) { + List<T> list = getBaseMapper().selectList(queryWrapper); + if (list == null) { + return null; + } + return BeanCopyUtils.listCopy(list, copyOptions, voClass); + } + + /** + * 缈婚〉鏌ヨ + * + * @param page 缈婚〉瀵硅薄 + * @param queryWrapper 瀹炰綋瀵硅薄灏佽鎿嶄綔绫� + */ + @Override + public PagePlus<T, K> pageVo(PagePlus<T, K> page, Wrapper<T> queryWrapper, CopyOptions copyOptions) { + PagePlus<T, K> result = getBaseMapper().selectPage(page, queryWrapper); + List<K> 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 0000000..e1934e1 --- /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 0000000..3c6ca7f --- /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 0000000..bea09f8 --- /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 { + + /** + * 鍗曞璞″熀浜巆lass鍒涘缓鎷疯礉 + * + * @param source 鏁版嵁鏉ユ簮瀹炰綋 + * @param copyOptions copy鏉′欢 + * @param desc 鎻忚堪瀵硅薄 杞崲鍚庣殑瀵硅薄 + * @return desc + */ + public static <T, V> V oneCopy(T source, CopyOptions copyOptions, Class<V> desc) { + V v = ReflectUtil.newInstanceIfPossible(desc); + return oneCopy(source, copyOptions, v); + } + + /** + * 鍗曞璞″熀浜庡璞″垱寤烘嫹璐� + * + * @param source 鏁版嵁鏉ユ簮瀹炰綋 + * @param copyOptions copy鏉′欢 + * @param desc 杞崲鍚庣殑瀵硅薄 + * @return desc + */ + public static <T, V> 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 <T, V> List<V> listCopy(List<T> sourceList, CopyOptions copyOptions, Class<V> 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 dcc2684..1066d2f 100644 --- a/ruoyi-demo/pom.xml +++ b/ruoyi-demo/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 10520ae..0000000 --- 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 639443b..0000000 --- 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 ca2bb5a..0000000 --- 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; - /** 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc */ - @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 a9a4b5e..0000000 --- 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 { - - /** 鐖秈d */ - @ApiModelProperty("鐖秈d") - 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 e3d359d..0000000 --- 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; - - - /** 鐖秈d */ - @ApiModelProperty("鐖秈d") - 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 3ed482b..0000000 --- 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; - /** 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc */ - @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 2ac99d6..ade20f8 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 @@ * 娴嬭瘯鍗曡〃Controller * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ +@Validated @Api(value = "娴嬭瘯鍗曡〃鎺у埗鍣�", tags = {"娴嬭瘯鍗曡〃绠$悊"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @@ -44,18 +46,28 @@ @ApiOperation("鏌ヨ娴嬭瘯鍗曡〃鍒楄〃") @PreAuthorize("@ss.hasPermi('demo:demo:list')") @GetMapping("/list") - public TableDataInfo<TestDemoVo> list(@Validated TestDemoQueryBo bo) { + public TableDataInfo<TestDemoVo> list(@Validated TestDemoBo bo) { return iTestDemoService.queryPageList(bo); } - /** + /** + * 鑷畾涔夊垎椤垫煡璇� + */ + @ApiOperation("鑷畾涔夊垎椤垫煡璇�") + @PreAuthorize("@ss.hasPermi('demo:demo:list')") + @GetMapping("/page") + public TableDataInfo<TestDemoVo> page(@Validated TestDemoBo bo) { + return iTestDemoService.customPageList(bo); + } + + /** * 瀵煎嚭娴嬭瘯鍗曡〃鍒楄〃 */ @ApiOperation("瀵煎嚭娴嬭瘯鍗曡〃鍒楄〃") @PreAuthorize("@ss.hasPermi('demo:demo:export')") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult<TestDemoVo> export(@Validated TestDemoQueryBo bo) { + public AjaxResult<TestDemoVo> export(@Validated TestDemoBo bo) { List<TestDemoVo> list = iTestDemoService.queryList(bo); ExcelUtil<TestDemoVo> util = new ExcelUtil<TestDemoVo>(TestDemoVo.class); return util.exportExcel(list, "娴嬭瘯鍗曡〃"); @@ -78,9 +90,10 @@ @ApiOperation("鏂板娴嬭瘯鍗曡〃") @PreAuthorize("@ss.hasPermi('demo:demo:add')") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.INSERT) + @RepeatSubmit @PostMapping() - public AjaxResult<Void> add(@Validated @RequestBody TestDemoAddBo bo) { - return toAjax(iTestDemoService.insertByAddBo(bo) ? 1 : 0); + public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody TestDemoBo bo) { + return toAjax(iTestDemoService.insertByBo(bo) ? 1 : 0); } /** @@ -89,9 +102,10 @@ @ApiOperation("淇敼娴嬭瘯鍗曡〃") @PreAuthorize("@ss.hasPermi('demo:demo:edit')") @Log(title = "娴嬭瘯鍗曡〃", businessType = BusinessType.UPDATE) + @RepeatSubmit @PutMapping() - public AjaxResult<Void> edit(@Validated @RequestBody TestDemoEditBo bo) { - return toAjax(iTestDemoService.updateByEditBo(bo) ? 1 : 0); + public AjaxResult<Void> 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 54f1027..8cab868 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 @@ * 娴嬭瘯鏍戣〃Controller * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ +@Validated @Api(value = "娴嬭瘯鏍戣〃鎺у埗鍣�", tags = {"娴嬭瘯鏍戣〃绠$悊"}) @RequiredArgsConstructor(onConstructor_ = @Autowired) @RestController @@ -43,8 +45,9 @@ @ApiOperation("鏌ヨ娴嬭瘯鏍戣〃鍒楄〃") @PreAuthorize("@ss.hasPermi('demo:tree:list')") @GetMapping("/list") - public AjaxResult<List<TestTreeVo>> list(@Validated TestTreeQueryBo bo) { - return AjaxResult.success(iTestTreeService.queryList(bo)); + public AjaxResult<List<TestTreeVo>> list(@Validated TestTreeBo bo) { + List<TestTreeVo> list = iTestTreeService.queryList(bo); + return AjaxResult.success(list); } /** @@ -54,7 +57,7 @@ @PreAuthorize("@ss.hasPermi('demo:tree:export')") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.EXPORT) @GetMapping("/export") - public AjaxResult<TestTreeVo> export(@Validated TestTreeQueryBo bo) { + public AjaxResult<TestTreeVo> export(@Validated TestTreeBo bo) { List<TestTreeVo> list = iTestTreeService.queryList(bo); ExcelUtil<TestTreeVo> util = new ExcelUtil<TestTreeVo>(TestTreeVo.class); return util.exportExcel(list, "娴嬭瘯鏍戣〃"); @@ -77,9 +80,10 @@ @ApiOperation("鏂板娴嬭瘯鏍戣〃") @PreAuthorize("@ss.hasPermi('demo:tree:add')") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.INSERT) + @RepeatSubmit @PostMapping() - public AjaxResult<Void> add(@Validated @RequestBody TestTreeAddBo bo) { - return toAjax(iTestTreeService.insertByAddBo(bo) ? 1 : 0); + public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) { + return toAjax(iTestTreeService.insertByBo(bo) ? 1 : 0); } /** @@ -88,9 +92,10 @@ @ApiOperation("淇敼娴嬭瘯鏍戣〃") @PreAuthorize("@ss.hasPermi('demo:tree:edit')") @Log(title = "娴嬭瘯鏍戣〃", businessType = BusinessType.UPDATE) + @RepeatSubmit @PutMapping() - public AjaxResult<Void> edit(@Validated @RequestBody TestTreeEditBo bo) { - return toAjax(iTestTreeService.updateByEditBo(bo) ? 1 : 0); + public AjaxResult<Void> 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 26f652a..13fdc24 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 @@ * 娴嬭瘯鍗曡〃瀵硅薄 test_demo * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @NoArgsConstructor @@ -32,43 +32,66 @@ @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 b9bd2ba..799a6d4 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 @@ * 娴嬭瘯鏍戣〃瀵硅薄 test_tree * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @NoArgsConstructor @@ -25,44 +23,65 @@ private static final long serialVersionUID=1L; - /** 涓婚敭 */ + /** + * 涓婚敭 + */ @TableId(value = "id") - @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 鐖秈d */ + /** + * 鐖秈d + */ 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 0000000..46018b1 --- /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; + + /** + * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc + */ + @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 0000000..2dfe1ff --- /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; + + /** + * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc + */ + @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 d1eb8bf..9ab4ba9 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 @@ * 娴嬭瘯鍗曡〃瑙嗗浘瀵硅薄 test_demo * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @ApiModel("娴嬭瘯鍗曡〃瑙嗗浘瀵硅薄") @@ -24,57 +21,70 @@ 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 c6ea558..a299c4a 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 @@ * 娴嬭瘯鏍戣〃瑙嗗浘瀵硅薄 test_tree * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Data @ApiModel("娴嬭瘯鏍戣〃瑙嗗浘瀵硅薄") @@ -24,34 +20,44 @@ private static final long serialVersionUID = 1L; - /** 涓婚敭 */ + /** + * 涓婚敭 + */ @ApiModelProperty("涓婚敭") - @JsonSerialize(using = ToStringSerializer.class) private Long id; - /** 鐖秈d */ + /** + * 鐖秈d + */ @Excel(name = "鐖秈d") @ApiModelProperty("鐖秈d") 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 aceaf6d..efbbffc 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<TestDemo> { + Page<TestDemoVo> customPageList(@Param("page") Page<TestDemo> page, @Param("ew") Wrapper<TestDemo> 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 20a3e9b..05b0153 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 @@ * 娴嬭瘯鏍戣〃Mapper鎺ュ彛 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -//@CacheNamespace(implementation = MybatisPlusRedisCache.class, eviction = MybatisPlusRedisCache.class) public interface TestTreeMapper extends BaseMapperPlus<TestTree> { } 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 c011325..eb4f21b 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 @@ * 娴嬭瘯鍗曡〃Service鎺ュ彛 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -public interface ITestDemoService extends IServicePlus<TestDemo> { +public interface ITestDemoService extends IServicePlus<TestDemo, TestDemoVo> { /** * 鏌ヨ鍗曚釜 @@ -28,25 +26,31 @@ /** * 鏌ヨ鍒楄〃 */ - TableDataInfo<TestDemoVo> queryPageList(TestDemoQueryBo bo); + TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo); + /** + * 鑷畾涔夊垎椤垫煡璇� + */ + TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo); + + /** * 鏌ヨ鍒楄〃 */ - List<TestDemoVo> queryList(TestDemoQueryBo bo); + List<TestDemoVo> 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 6f7be37..9b8acb9 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 @@ * 娴嬭瘯鏍戣〃Service鎺ュ彛 * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ -public interface ITestTreeService extends IServicePlus<TestTree> { +public interface ITestTreeService extends IServicePlus<TestTree, TestTreeVo> { /** * 鏌ヨ鍗曚釜 * @return @@ -26,21 +24,21 @@ /** * 鏌ヨ鍒楄〃 */ - List<TestTreeVo> queryList(TestTreeQueryBo bo); + List<TestTreeVo> 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 4d35efe..81893df 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.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 @@ * 娴嬭瘯鍗曡〃Service涓氬姟灞傚鐞� * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Service -public class TestDemoServiceImpl extends ServicePlusImpl<TestDemoMapper, TestDemo> implements ITestDemoService { +public class TestDemoServiceImpl extends ServicePlusImpl<TestDemoMapper, TestDemo, TestDemoVo> implements ITestDemoService { @Override public TestDemoVo queryById(Long id) { - return getVoById(id, TestDemoVo.class); + return getVoById(id); } @DataScope(isUser = true) @Override - public TableDataInfo<TestDemoVo> queryPageList(TestDemoQueryBo bo) { - PagePlus<TestDemo, TestDemoVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo), TestDemoVo.class); + public TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo) { + PagePlus<TestDemo, TestDemoVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); + return PageUtils.buildDataInfo(result); + } + + /** + * 鑷畾涔夊垎椤垫煡璇� + */ + @DataScope(isUser = true) + @Override + public TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo) { + Page<TestDemoVo> result = baseMapper.customPageList(PageUtils.buildPage(), buildQueryWrapper(bo)); return PageUtils.buildDataInfo(result); } @DataScope(isUser = true) @Override - public List<TestDemoVo> queryList(TestDemoQueryBo bo) { - return listVo(buildQueryWrapper(bo), TestDemoVo.class); + public List<TestDemoVo> queryList(TestDemoBo bo) { + return listVo(buildQueryWrapper(bo)); } - private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoQueryBo bo) { + private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) { Map<String, Object> params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery(); @@ -63,14 +72,14 @@ } @Override - public Boolean insertByAddBo(TestDemoAddBo bo) { + public Boolean insertByBo(TestDemoBo bo) { TestDemo add = BeanUtil.toBean(bo, TestDemo.class); validEntityBeforeSave(add); return save(add); } @Override - public Boolean updateByEditBo(TestDemoEditBo bo) { + public Boolean updateByBo(TestDemoBo bo) { TestDemo update = BeanUtil.toBean(bo, TestDemo.class); validEntityBeforeSave(update); return updateById(update); diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java index 36482f1..a953412 100644 --- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java +++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/TestTreeServiceImpl.java @@ -6,13 +6,11 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; -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.domain.bo.TestTreeBo; +import com.ruoyi.demo.domain.vo.TestTreeVo; import com.ruoyi.demo.mapper.TestTreeMapper; import com.ruoyi.demo.service.ITestTreeService; -import com.ruoyi.demo.vo.TestTreeVo; import org.springframework.stereotype.Service; import java.util.Collection; @@ -23,24 +21,24 @@ * 娴嬭瘯鏍戣〃Service涓氬姟灞傚鐞� * * @author Lion Li - * @date 2021-05-30 + * @date 2021-07-26 */ @Service -public class TestTreeServiceImpl extends ServicePlusImpl<TestTreeMapper, TestTree> implements ITestTreeService { +public class TestTreeServiceImpl extends ServicePlusImpl<TestTreeMapper, TestTree, TestTreeVo> 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<TestTreeVo> queryList(TestTreeQueryBo bo) { - return listVo(buildQueryWrapper(bo), TestTreeVo.class); + public List<TestTreeVo> queryList(TestTreeBo bo) { + return listVo(buildQueryWrapper(bo)); } - private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeQueryBo bo) { + private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeBo bo) { Map<String, Object> params = bo.getParams(); Object dataScope = params.get("dataScope"); LambdaQueryWrapper<TestTree> lqw = Wrappers.lambdaQuery(); @@ -53,14 +51,14 @@ } @Override - public Boolean insertByAddBo(TestTreeAddBo bo) { + public Boolean insertByBo(TestTreeBo bo) { TestTree add = BeanUtil.toBean(bo, TestTree.class); validEntityBeforeSave(add); return save(add); } @Override - public Boolean updateByEditBo(TestTreeEditBo bo) { + public Boolean updateByBo(TestTreeBo bo) { TestTree update = BeanUtil.toBean(bo, TestTree.class); validEntityBeforeSave(update); return updateById(update); diff --git a/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml b/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml index ec433d6..3caf98a 100644 --- a/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml +++ b/ruoyi-demo/src/main/resources/mapper/demo/TestDemoMapper.xml @@ -18,6 +18,9 @@ <result property="updateBy" column="update_by"/> <result property="delFlag" column="del_flag"/> </resultMap> + <select id="customPageList" resultType="com.ruoyi.demo.domain.vo.TestDemoVo"> + SELECT * FROM test_demo ${ew.customSqlSegment} + </select> -</mapper> \ No newline at end of file +</mapper> diff --git a/ruoyi-extend/pom.xml b/ruoyi-extend/pom.xml index 46a8cfc..4df48ba 100644 --- a/ruoyi-extend/pom.xml +++ b/ruoyi-extend/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ruoyi-extend</artifactId> diff --git a/ruoyi-extend/ruoyi-monitor-admin/pom.xml b/ruoyi-extend/ruoyi-monitor-admin/pom.xml index b09375a..9aca296 100644 --- a/ruoyi-extend/ruoyi-monitor-admin/pom.xml +++ b/ruoyi-extend/ruoyi-monitor-admin/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-extend</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml index 16b46e9..41e8ca4 100644 --- a/ruoyi-framework/pom.xml +++ b/ruoyi-framework/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 239825f..3aa6d18 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 @@ // 楠岃瘉鐮佸紑鍏� if (captchaOnOff) { - validateCapcha(username, code, uuid, request); + validateCaptcha(username, code, uuid, request); } // 鐢ㄦ埛楠岃瘉 Authentication authentication = null; @@ -103,7 +103,7 @@ * @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 8510c9f..5535bd7 100644 --- a/ruoyi-generator/pom.xml +++ b/ruoyi-generator/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 44baf82..40f0738 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 @@ * @author ruoyi */ @Service -public class GenTableColumnServiceImpl extends ServicePlusImpl<GenTableColumnMapper, GenTableColumn> implements IGenTableColumnService { +public class GenTableColumnServiceImpl extends ServiceImpl<GenTableColumnMapper, GenTableColumn> 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 9eceadf..bece86a 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.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.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 @@ */ @Slf4j @Service -public class GenTableServiceImpl extends ServicePlusImpl<GenTableMapper, GenTable> implements IGenTableService { +public class GenTableServiceImpl extends ServiceImpl<GenTableMapper, GenTable> 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 38d3854..e0111e5 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 @@ * * @author ruoyi */ -public interface IGenTableColumnService extends IServicePlus<GenTableColumn> { +public interface IGenTableColumnService extends IService<GenTableColumn> { /** * 鏌ヨ涓氬姟瀛楁鍒楄〃 * 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 a44dd5e..9903eca 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 @@ * * @author ruoyi */ -public interface IGenTableService extends IServicePlus<GenTable> { +public interface IGenTableService extends IService<GenTable> { TableDataInfo<GenTable> 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 76073c7..641cf1d 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 @@ List<String> templates = new ArrayList<String>(); 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 @@ } if (template.contains("vo.java.vm")) { - fileName = StrUtil.format("{}/vo/{}Vo.java", javaPath, className); + fileName = StrUtil.format("{}/domain/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); - } + 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 82d0862..0000000 --- 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 0000000..40174d5 --- /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; + + /** + * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc + */ + @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 a87c6cd..ba29e20 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.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 @@ @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<${ClassName}Vo>> list(@Validated ${ClassName}QueryBo bo) { + public AjaxResult<List<${ClassName}Vo>> list(@Validated ${ClassName}Bo bo) { List<${ClassName}Vo> list = i${ClassName}Service.queryList(bo); return AjaxResult.success(list); } @@ -66,7 +66,7 @@ @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 @@ @Log(title = "${functionName}", businessType = BusinessType.INSERT) @RepeatSubmit @PostMapping() - public AjaxResult<Void> add(@Validated @RequestBody ${ClassName}AddBo bo) { - return toAjax(i${ClassName}Service.insertByAddBo(bo) ? 1 : 0); + public AjaxResult<Void> add(@Validated(AddGroup.class) @RequestBody ${ClassName}Bo bo) { + return toAjax(i${ClassName}Service.insertByBo(bo) ? 1 : 0); } /** @@ -103,8 +103,8 @@ @Log(title = "${functionName}", businessType = BusinessType.UPDATE) @RepeatSubmit @PutMapping() - public AjaxResult<Void> edit(@Validated @RequestBody ${ClassName}EditBo bo) { - return toAjax(i${ClassName}Service.updateByEditBo(bo) ? 1 : 0); + public AjaxResult<Void> 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 6472fce..0000000 --- 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 537ff73..0000000 --- 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; - /** - * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc - */ - @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 9ae8620..0041c39 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 @@ * @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 @@ /** * 鏌ヨ鍒楄〃 */ - 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 2421f31..ec3cac6 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 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 @@ * @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<String, Object> params = bo.getParams(); LambdaQueryWrapper<${ClassName}> lqw = Wrappers.lambdaQuery(); #foreach($column in $columns) @@ -78,14 +76,14 @@ } @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 8e941a9..f14d914 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 0000000..6fd1bd7 --- /dev/null +++ b/ruoyi-oss/pom.xml @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>ruoyi-vue-plus</artifactId> + <groupId>com.ruoyi</groupId> + <version>2.6.0</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>ruoyi-oss</artifactId> + + <description> + OSS瀵硅薄瀛樺偍妯″潡 + </description> + + <dependencies> + + <!-- 閫氱敤宸ュ叿--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common</artifactId> + </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-system</artifactId> + </dependency> + + <dependency> + <groupId>com.qiniu</groupId> + <artifactId>qiniu-java-sdk</artifactId> + <version>${qiniu.version}</version> + </dependency> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + <version>${aliyun.oss.version}</version> + </dependency> + <dependency> + <groupId>com.qcloud</groupId> + <artifactId>cos_api</artifactId> + <version>${qcloud.cos.version}</version> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>io.minio</groupId> + <artifactId>minio</artifactId> + <version>${minio.version}</version> + </dependency> + + </dependencies> + +</project> 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 0000000..5b9da58 --- /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 { + + /** + * 浜戝瓨鍌ㄩ厤缃甂EY + */ + public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloudStorageService"; + + /** + * 棰勮鍒楄〃璧勬簮寮�鍏矺ey + */ + 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 0000000..cb4f620 --- /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 0000000..3191dc4 --- /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 0000000..c10dceb --- /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 0000000..48ab618 --- /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 0000000..bc7e7f3 --- /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<String, ICloudStorageService> 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 0000000..64784a0 --- /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; + + /** + * 闃块噷浜慉ccessKeyId + */ + private String accessKeyId; + + /** + * 闃块噷浜慉ccessKeySecret + */ + private String accessKeySecret; + + /** + * 闃块噷浜態ucketName + */ + 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; + + } + + /** + * 鑵捐浜慍OS 閰嶇疆灞炴�� + * + * @author Lion Li + */ + @Data + @NoArgsConstructor + public static class QcloudProperties { + + /** + * 鑵捐浜戠粦瀹氱殑鍩熷悕 + */ + private String endpoint; + + /** + * 鑵捐浜戣矾寰勫墠缂� + */ + private String prefix; + + /** + * 鑵捐浜慡ecretId + */ + private String secretId; + + /** + * 鑵捐浜慡ecretKey + */ + private String secretKey; + + /** + * 鑵捐浜態ucketName + */ + private String bucketName; + + /** + * 涓冪墰鏄惁浣跨敤https + */ + private Boolean isHttps; + + /** + * 鑵捐浜慍OS鎵�灞炲湴鍖� + */ + 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 0000000..a23c1f5 --- /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 0000000..c757ab4 --- /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; + +/** + * 浜戝瓨鍌�(鏀寔涓冪墰銆侀樋閲屼簯銆佽吘璁簯銆乵inio) + * + * @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 0000000..a4b43ec --- /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 0000000..70ed684 --- /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澶辫触, 璇锋牳瀵筂inio閰嶇疆淇℃伅"); + } + } + + @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 0000000..35f008a --- /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 鍗庡寳锛歵j 鍗庝笢锛歴h + 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 0000000..f7b4d4e --- /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 0000000..45f838a --- /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<SysOssVo> 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<Map<String, String>> upload(@RequestPart("file") MultipartFile file) { + if (file.isEmpty()) { + throw new CustomException("涓婁紶鏂囦欢涓嶈兘涓虹┖"); + } + SysOss oss = iSysOssService.upload(file); + Map<String, String> 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<Void> 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 0000000..7b7639c --- /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 0000000..a30ff32 --- /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; + /** + * 鎺掑簭鐨勬柟鍚慸esc鎴栬�卆sc + */ + @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 0000000..8bc59b2 --- /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 0000000..8eee53b --- /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<SysOss> { +} 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 0000000..4f998e0 --- /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<SysOss, SysOssVo> { + + TableDataInfo<SysOssVo> queryPageList(SysOssBo sysOss); + + SysOss upload(MultipartFile file); + + Boolean deleteWithValidByIds(Collection<Long> 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 0000000..5c34a5c --- /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<SysOssMapper, SysOss, SysOssVo> implements ISysOssService { + + @Override + public TableDataInfo<SysOssVo> queryPageList(SysOssBo bo) { + PagePlus<SysOss, SysOssVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo)); + return PageUtils.buildDataInfo(result); + } + + private LambdaQueryWrapper<SysOss> buildQueryWrapper(SysOssBo bo) { + Map<String, Object> params = bo.getParams(); + LambdaQueryWrapper<SysOss> 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<Long> ids, Boolean isValid) { + if (isValid) { + // 鍋氫竴浜涗笟鍔′笂鐨勬牎楠�,鍒ゆ柇鏄惁闇�瑕佹牎楠� + } + List<SysOss> 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 0000000..a1e4ca8 --- /dev/null +++ b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.system.mapper.SysOssMapper"> + + <resultMap type="com.ruoyi.system.domain.SysOss" id="SysOssResult"> + <result property="ossId" column="oss_id"/> + <result property="fileName" column="file_name"/> + <result property="fileSuffix" column="file_suffix"/> + <result property="url" column="url"/> + <result property="createTime" column="create_time"/> + <result property="createBy" column="create_by"/> + <result property="updateTime" column="update_time"/> + <result property="updateBy" column="update_by"/> + <result property="service" column="service"/> + </resultMap> + + +</mapper> diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml index f1d850c..ef70d32 100644 --- a/ruoyi-quartz/pom.xml +++ b/ruoyi-quartz/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 cb5b7d5..27f598a 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 @@ * * @author ruoyi */ -public interface ISysJobLogService extends IServicePlus<SysJobLog> { +public interface ISysJobLogService extends IService<SysJobLog> { TableDataInfo<SysJobLog> 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 11150c7..81eef93 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 @@ * * @author ruoyi */ -public interface ISysJobService extends IServicePlus<SysJob> { +public interface ISysJobService extends IService<SysJob> { /** * 鑾峰彇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 e10ad14..6494492 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysJobLogServiceImpl extends ServicePlusImpl<SysJobLogMapper, SysJobLog> implements ISysJobLogService { +public class SysJobLogServiceImpl extends ServiceImpl<SysJobLogMapper, SysJobLog> implements ISysJobLogService { @Override public TableDataInfo<SysJobLog> 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 7d111d7..3a7f053 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysJobServiceImpl extends ServicePlusImpl<SysJobMapper, SysJob> implements ISysJobService { +public class SysJobServiceImpl extends ServiceImpl<SysJobMapper, SysJob> implements ISysJobService { @Autowired private Scheduler scheduler; diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml index 0ec9ba9..3665c80 100644 --- a/ruoyi-system/pom.xml +++ b/ruoyi-system/pom.xml @@ -5,7 +5,7 @@ <parent> <artifactId>ruoyi-vue-plus</artifactId> <groupId>com.ruoyi</groupId> - <version>2.5.2</version> + <version>2.6.0</version> </parent> <modelVersion>4.0.0</modelVersion> 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 b649c7f..fdc76fb 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 @@ * * @author ruoyi */ -public interface ISysConfigService extends IServicePlus<SysConfig> { +public interface ISysConfigService extends IService<SysConfig> { TableDataInfo<SysConfig> 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 7afbf4b..f518ff5 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 @@ * * @author ruoyi */ -public interface ISysDeptService extends IServicePlus<SysDept> { +public interface ISysDeptService extends IService<SysDept> { /** * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁 * 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 570c7d1..25daa1a 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 @@ * * @author ruoyi */ -public interface ISysDictDataService extends IServicePlus<SysDictData> { +public interface ISysDictDataService extends IService<SysDictData> { TableDataInfo<SysDictData> 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 a5d8de5..ac1d6c9 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 @@ * * @author ruoyi */ -public interface ISysDictTypeService extends IServicePlus<SysDictType> { +public interface ISysDictTypeService extends IService<SysDictType> { TableDataInfo<SysDictType> 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 4976d3f..5a7d970 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 @@ * * @author ruoyi */ -public interface ISysLogininforService extends IServicePlus<SysLogininfor> { +public interface ISysLogininforService extends IService<SysLogininfor> { TableDataInfo<SysLogininfor> 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 d278743..391cf19 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 @@ * * @author ruoyi */ -public interface ISysMenuService extends IServicePlus<SysMenu> { +public interface ISysMenuService extends IService<SysMenu> { /** * 鏍规嵁鐢ㄦ埛鏌ヨ绯荤粺鑿滃崟鍒楄〃 * 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 2db8422..535e760 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 @@ * * @author ruoyi */ -public interface ISysNoticeService extends IServicePlus<SysNotice> { +public interface ISysNoticeService extends IService<SysNotice> { TableDataInfo<SysNotice> 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 dcd2c08..ecfadb1 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 @@ * * @author ruoyi */ -public interface ISysOperLogService extends IServicePlus<SysOperLog> { +public interface ISysOperLogService extends IService<SysOperLog> { TableDataInfo<SysOperLog> 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 f56c5fd..f6659c0 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 @@ * * @author ruoyi */ -public interface ISysPostService extends IServicePlus<SysPost> { +public interface ISysPostService extends IService<SysPost> { TableDataInfo<SysPost> 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 9d02ceb..77a7c26 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 @@ * * @author ruoyi */ -public interface ISysRoleService extends IServicePlus<SysRole> { +public interface ISysRoleService extends IService<SysRole> { TableDataInfo<SysRole> 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 e277d10..ea1b89b 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 @@ * * @author ruoyi */ -public interface ISysUserService extends IServicePlus<SysUser> { +public interface ISysUserService extends IService<SysUser> { TableDataInfo<SysUser> 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 41be807..eee0595 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.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 @@ * @author ruoyi */ @Service -public class SysConfigServiceImpl extends ServicePlusImpl<SysConfigMapper, SysConfig> implements ISysConfigService { +public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService { @Autowired private RedisCache redisCache; @@ -98,6 +98,7 @@ * * @return true寮�鍚紝false鍏抽棴 */ + @Override public boolean selectCaptchaOnOff() { String captchaOnOff = selectConfigByKey("sys.account.captchaOnOff"); if (StrUtil.isEmpty(captchaOnOff)) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java index 745e62f..54582a1 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java @@ -4,13 +4,13 @@ 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.TreeSelect; import com.ruoyi.common.core.domain.entity.SysDept; 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.exception.CustomException; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysRoleMapper; @@ -30,7 +30,7 @@ * @author ruoyi */ @Service -public class SysDeptServiceImpl extends ServicePlusImpl<SysDeptMapper, SysDept> implements ISysDeptService { +public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> 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 92be9d5..469c990 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 @@ 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.service.ISysDictDataService; import org.springframework.stereotype.Service; -import java.util.Arrays; import java.util.List; /** @@ -20,7 +19,7 @@ * @author ruoyi */ @Service -public class SysDictDataServiceImpl extends ServicePlusImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService { +public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService { @Override public TableDataInfo<SysDictData> selectPageDictDataList(SysDictData dictData) { @@ -84,10 +83,10 @@ public void deleteDictDataByIds(Long[] dictCodes) { for (Long dictCode : dictCodes) { SysDictData data = selectDictDataById(dictCode); + removeById(dictCode); List<SysDictData> 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 82f67c3..c4f9d95 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.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 @@ * @author ruoyi */ @Service -public class SysDictTypeServiceImpl extends ServicePlusImpl<SysDictTypeMapper, SysDictType> implements ISysDictTypeService { +public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> 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 0284ed7..c129525 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysLogininforServiceImpl extends ServicePlusImpl<SysLogininforMapper, SysLogininfor> implements ISysLogininforService { +public class SysLogininforServiceImpl extends ServiceImpl<SysLogininforMapper, SysLogininfor> implements ISysLogininforService { @Override public TableDataInfo<SysLogininfor> 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 e1b4314..2222e73 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysMenuServiceImpl extends ServicePlusImpl<SysMenuMapper, SysMenu> implements ISysMenuService { +public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService { public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired @@ -154,14 +154,14 @@ 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<RouterVo> childrenList = new ArrayList<RouterVo>(); 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 977e644..e063470 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysNoticeServiceImpl extends ServicePlusImpl<SysNoticeMapper, SysNotice> implements ISysNoticeService { +public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice> implements ISysNoticeService { @Override public TableDataInfo<SysNotice> 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 5d24356..238c015 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.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 @@ * @author ruoyi */ @Service -public class SysOperLogServiceImpl extends ServicePlusImpl<SysOperLogMapper, SysOperLog> implements ISysOperLogService { +public class SysOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOperLog> implements ISysOperLogService { @Override public TableDataInfo<SysOperLog> 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 93f8e98..d2aeab0 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysPostServiceImpl extends ServicePlusImpl<SysPostMapper, SysPost> implements ISysPostService { +public class SysPostServiceImpl extends ServiceImpl<SysPostMapper, SysPost> 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 df024ae..ddba9af 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 @@ 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 @@ * @author ruoyi */ @Service -public class SysRoleServiceImpl extends ServicePlusImpl<SysRoleMapper, SysRole> implements ISysRoleService { +public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService { @Autowired private SysRoleMenuMapper roleMenuMapper; @@ -364,13 +364,17 @@ @Override public int insertAuthUsers(Long roleId, Long[] userIds) { // 鏂板鐢ㄦ埛涓庤鑹茬鐞� - List<SysUserRole> list = new ArrayList<SysUserRole>(); + int rows = 1; + List<SysUserRole> list = new ArrayList<SysUserRole>(); 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 b5bcb70..69adbe1 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 @@ 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 @@ */ @Slf4j @Service -public class SysUserServiceImpl extends ServicePlusImpl<SysUserMapper, SysUser> implements ISysUserService { +public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService { @Autowired private SysRoleMapper roleMapper; diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index c9ca44b..c980bab 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 fc9937d..c7195af 100644 --- a/ruoyi-ui/src/api/demo/demo.js +++ b/ruoyi-ui/src/api/demo/demo.js @@ -9,6 +9,15 @@ }) } +// 鑷畾涔夊垎椤垫帴鍙� +export function pageDemo(query) { + return request({ + url: '/demo/demo/page', + method: 'get', + params: query + }) +} + // 鏌ヨ娴嬭瘯鍗曡〃璇︾粏 export function getDemo(id) { return request({ @@ -50,4 +59,4 @@ 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 0000000..39be597 --- /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 f78dfcc..bc2e7e1 100644 --- a/ruoyi-ui/src/components/Editor/index.vue +++ b/ruoyi-ui/src/components/Editor/index.vue @@ -2,6 +2,7 @@ <div> <el-upload :action="uploadUrl" + :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess" :on-error="handleUploadError" name="file" @@ -46,6 +47,11 @@ type: Boolean, default: false, }, + // 涓婁紶鏂囦欢澶у皬闄愬埗(MB) + fileSize: { + type: Number, + default: 5, + }, /* 绫诲瀷锛坆ase64鏍煎紡銆乽rl鏍煎紡锛� */ type: { type: String, @@ -54,7 +60,7 @@ }, data() { return { - uploadUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 + uploadUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 headers: { Authorization: "Bearer " + getToken() }, @@ -130,14 +136,6 @@ this.quill.format("image", false); } }); - // toolbar.addHandler("video", (value) => { - // 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 @@ 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 d47fb98..244ac28 100644 --- a/ruoyi-ui/src/components/FileUpload/index.vue +++ b/ruoyi-ui/src/components/FileUpload/index.vue @@ -27,7 +27,7 @@ <!-- 鏂囦欢鍒楄〃 --> <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> - <el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank"> + <el-link :href="`${file.url}`" :underline="false" target="_blank"> <span class="el-icon-document"> {{ getFileName(file.name) }} </span> </el-link> <div class="ele-upload-list__item-content-action"> @@ -70,7 +70,7 @@ 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 31940af..e074b38 100644 --- a/ruoyi-ui/src/components/ImageUpload/index.vue +++ b/ruoyi-ui/src/components/ImageUpload/index.vue @@ -74,7 +74,7 @@ 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 @@ // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� 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 @@ }, // 涓婁紶鎴愬姛鍥炶皟 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 3915c29..e267f90 100644 --- a/ruoyi-ui/src/components/RuoYi/Doc/index.vue +++ b/ruoyi-ui/src/components/RuoYi/Doc/index.vue @@ -1,21 +1,21 @@ -<template> - <div> - <svg-icon icon-class="question" @click="goto"/> - </div> -</template> - -<script> -export default { - name: 'RuoYiDoc', - data() { - return { - url: 'http://doc.ruoyi.vip/ruoyi-vue' - } - }, - methods: { - goto() { - window.open(this.url) - } - } -} -</script> \ No newline at end of file +<template> + <div> + <svg-icon icon-class="question" @click="goto"/> + </div> +</template> + +<script> +export default { + name: 'RuoYiDoc', + data() { + return { + url: 'https://gitee.com/JavaLionLi/RuoYi-Vue-Plus/wikis/pages' + } + }, + methods: { + goto() { + window.open(this.url) + } + } +} +</script> diff --git a/ruoyi-ui/src/components/RuoYi/Git/index.vue b/ruoyi-ui/src/components/RuoYi/Git/index.vue index 1d09a77..4d580e4 100644 --- a/ruoyi-ui/src/components/RuoYi/Git/index.vue +++ b/ruoyi-ui/src/components/RuoYi/Git/index.vue @@ -9,7 +9,7 @@ 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 @@ } } } -</script> \ No newline at end of file +</script> diff --git a/ruoyi-ui/src/components/TopNav/index.vue b/ruoyi-ui/src/components/TopNav/index.vue index c8837f2..1b7c4d9 100644 --- a/ruoyi-ui/src/components/TopNav/index.vue +++ b/ruoyi-ui/src/components/TopNav/index.vue @@ -12,7 +12,7 @@ </template> <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 --> - <el-submenu index="more" v-if="topMenus.length > visibleNumber"> + <el-submenu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> <template slot="title">鏇村鑿滃崟</template> <template v-for="(item, index) in topMenus"> <el-menu-item @@ -87,7 +87,7 @@ // 榛樿婵�娲荤殑鑿滃崟 activeMenu() { const path = this.$route.path; - let activePath = this.routers[0].path; + let activePath = this.defaultRouter(); if (path.lastIndexOf("/") > 0) { const tmpPath = path.substring(1, path.length); activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); @@ -100,7 +100,7 @@ } var routes = this.activeRoutes(activePath); if (routes.length === 0) { - activePath = this.currentIndex || this.routers[0].path + activePath = this.currentIndex || this.defaultRouter() this.activeRoutes(activePath); } return activePath; @@ -120,6 +120,17 @@ setVisibleNumber() { const width = document.body.getBoundingClientRect().width / 3; this.visibleNumber = parseInt(width / 85); + }, + // 榛樿婵�娲荤殑璺敱 + defaultRouter() { + let router; + Object.keys(this.routers).some((key) => { + if (!this.routers[key].hidden) { + router = this.routers[key].path; + return true; + } + }); + return router; }, // 鑿滃崟閫夋嫨浜嬩欢 handleSelect(key, keyPath) { @@ -158,25 +169,27 @@ </script> <style lang="scss"> -.el-menu--horizontal > .el-menu-item { +.topmenu-container.el-menu--horizontal > .el-menu-item { float: left; - height: 50px; - line-height: 50px; - margin: 0; - border-bottom: 3px solid transparent; - color: #999093; - padding: 0 5px; - margin: 0 10px; + height: 50px !important; + line-height: 50px !important; + color: #999093 !important; + padding: 0 5px !important; + margin: 0 10px !important; } -.el-menu--horizontal > .el-menu-item.is-active { - border-bottom: 3px solid #{'var(--theme)'}; +.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-submenu.is-active .el-submenu__title { + border-bottom: 2px solid #{'var(--theme)'} !important; color: #303133; } /* submenu item */ -.el-menu--horizontal > .el-submenu .el-submenu__title { - height: 50px !important; - line-height: 50px !important; +.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title { + float: left; + height: 50px !important; + line-height: 50px !important; + color: #999093 !important; + padding: 0 5px !important; + margin: 0 10px !important; } </style> diff --git a/ruoyi-ui/src/router/index.js b/ruoyi-ui/src/router/index.js index c7b9371..98f09ed 100644 --- a/ruoyi-ui/src/router/index.js +++ b/ruoyi-ui/src/router/index.js @@ -5,8 +5,6 @@ /* Layout */ import Layout from '@/layout' -import ParentView from '@/components/ParentView'; -import InnerLink from '@/layout/components/InnerLink' /** * Note: 璺敱閰嶇疆椤� @@ -23,6 +21,7 @@ title: 'title' // 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛� icon: 'svg-name' // 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/assets/icons/svg breadcrumb: false // 濡傛灉璁剧疆涓篺alse锛屽垯涓嶄細鍦╞readcrumb闈㈠寘灞戜腑鏄剧ず + activeMenu: '/system/user' // 褰撹矾鐢辫缃簡璇ュ睘鎬э紝鍒欎細楂樹寒鐩稿搴旂殑渚ц竟鏍忋�� } */ @@ -82,7 +81,7 @@ ] }, { - path: '/auth', + path: '/system/user-auth', component: Layout, hidden: true, children: [ @@ -90,12 +89,12 @@ path: 'role/:userId(\\d+)', component: (resolve) => require(['@/views/system/user/authRole'], resolve), name: 'AuthRole', - meta: { title: '鍒嗛厤瑙掕壊'} + meta: { title: '鍒嗛厤瑙掕壊', activeMenu: '/system/user'} } ] }, { - path: '/auth', + path: '/system/role-auth', component: Layout, hidden: true, children: [ @@ -103,46 +102,46 @@ path: 'user/:roleId(\\d+)', component: (resolve) => require(['@/views/system/role/authUser'], resolve), name: 'AuthUser', - meta: { title: '鍒嗛厤鐢ㄦ埛'} + meta: { title: '鍒嗛厤鐢ㄦ埛', activeMenu: '/system/role'} } ] }, { - path: '/dict', + path: '/system/dict-data', component: Layout, hidden: true, children: [ { - path: 'type/data/:dictId(\\d+)', + path: 'index/:dictId(\\d+)', component: (resolve) => require(['@/views/system/dict/data'], resolve), name: 'Data', - meta: { title: '瀛楀吀鏁版嵁', icon: '' } + meta: { title: '瀛楀吀鏁版嵁', activeMenu: '/system/dict'} } ] }, { - path: '/job', + path: '/monitor/job-log', component: Layout, hidden: true, children: [ { - path: 'log', + path: 'index', component: (resolve) => require(['@/views/monitor/job/log'], resolve), name: 'JobLog', - meta: { title: '璋冨害鏃ュ織' } + meta: { title: '璋冨害鏃ュ織', activeMenu: '/monitor/job'} } ] }, { - path: '/gen', + path: '/tool/gen-edit', component: Layout, hidden: true, children: [ { - path: 'edit/:tableId(\\d+)', + path: 'index/:tableId(\\d+)', component: (resolve) => require(['@/views/tool/gen/editTable'], resolve), name: 'GenEdit', - meta: { title: '淇敼鐢熸垚閰嶇疆' } + meta: { title: '淇敼鐢熸垚閰嶇疆', activeMenu: '/tool/gen'} } ] } diff --git a/ruoyi-ui/src/utils/ossdownload.js b/ruoyi-ui/src/utils/ossdownload.js new file mode 100644 index 0000000..0b9cf10 --- /dev/null +++ b/ruoyi-ui/src/utils/ossdownload.js @@ -0,0 +1,39 @@ +import axios from 'axios' +import { getToken } from '@/utils/auth' + +const mimeMap = { + oss: 'application/octet-stream' +} + +const baseUrl = process.env.VUE_APP_BASE_API +export function downLoadOss(ossId) { + var url = baseUrl + '/system/oss/download/' + ossId + axios({ + method: 'get', + url: url, + responseType: 'blob', + headers: { 'Authorization': 'Bearer ' + getToken() } + }).then(res => { + resolveBlob(res, mimeMap.oss) + }) +} +/** + * 瑙f瀽blob鍝嶅簲鍐呭骞朵笅杞� + * @param {*} res blob鍝嶅簲鍐呭 + * @param {String} mimeType MIME绫诲瀷 + */ +export function resolveBlob(res, mimeType) { + const aLink = document.createElement('a') + var blob = new Blob([res.data], { type: mimeType }) + // 浠巖esponse鐨刪eaders涓幏鍙杅ilename, 鍚庣response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 璁剧疆鐨勬枃浠跺悕; + var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*') + var contentDisposition = decodeURI(res.headers['content-disposition']) + var result = patt.exec(contentDisposition) + var fileName = result[1] + fileName = fileName.replace(/\"/g, '') + aLink.href = URL.createObjectURL(blob) + aLink.setAttribute('download', decodeURI(fileName)) // 璁剧疆涓嬭浇鏂囦欢鍚嶇О + document.body.appendChild(aLink) + aLink.click() + document.body.removeChild(aLink); +} diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index a510d2d..6a7cbfa 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -64,6 +64,7 @@ location.href = '/index'; }) }).catch(() => {}); + return Promise.reject('error') } else if (code === 500) { Message({ message: msg, diff --git a/ruoyi-ui/src/views/demo/demo/index.vue b/ruoyi-ui/src/views/demo/demo/index.vue index a6679f3..c2ef2e0 100644 --- a/ruoyi-ui/src/views/demo/demo/index.vue +++ b/ruoyi-ui/src/views/demo/demo/index.vue @@ -33,6 +33,7 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handlePage">鎼滅储(鑷畾涔夊垎椤垫帴鍙�)</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button> </el-form-item> </el-form> @@ -168,7 +169,7 @@ </template> <script> -import { listDemo, getDemo, delDemo, addDemo, updateDemo, exportDemo } from "@/api/demo/demo"; +import { listDemo, pageDemo, getDemo, delDemo, addDemo, updateDemo, exportDemo } from "@/api/demo/demo"; export default { name: "Demo", @@ -239,6 +240,20 @@ this.loading = false; }); }, + /** 鑷畾涔夊垎椤垫煡璇� */ + getPage() { + this.loading = true; + this.queryParams.params = {}; + if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) { + this.queryParams.params["beginCreateTime"] = this.daterangeCreateTime[0]; + this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1]; + } + pageDemo(this.queryParams).then(response => { + this.demoList = response.rows; + this.total = response.total; + this.loading = false; + }); + }, // 鍙栨秷鎸夐挳 cancel() { this.open = false; @@ -267,6 +282,11 @@ this.queryParams.pageNum = 1; this.getList(); }, + /** 鎼滅储鎸夐挳鎿嶄綔 */ + handlePage() { + this.queryParams.pageNum = 1; + this.getPage(); + }, /** 閲嶇疆鎸夐挳鎿嶄綔 */ resetQuery() { this.daterangeCreateTime = []; diff --git a/ruoyi-ui/src/views/index.vue b/ruoyi-ui/src/views/index.vue index 7824855..31f3379 100644 --- a/ruoyi-ui/src/views/index.vue +++ b/ruoyi-ui/src/views/index.vue @@ -22,6 +22,8 @@ * 澶氭暟鎹簮妗嗘灦 dynamic-datasource 鏀寔涓讳粠涓庡绉嶇被鏁版嵁搴撳紓鏋�<br/> * Redis瀹㈡埛绔� 閲囩敤 Redisson 鎬ц兘鏇村己<br/> * 鍒嗗竷寮忛攣 Lock4j 娉ㄨВ閿併�佸伐鍏烽攣 澶氱澶氭牱<br/> + * 閮ㄧ讲鏂瑰紡 Docker 瀹瑰櫒缂栨帓 涓�閿儴缃蹭笟鍔¢泦缇�<br/> + * 鏂囦欢瀛樺偍 OSS 瀵硅薄瀛樺偍妯″潡 鏀寔(Minio銆佷竷鐗涖�侀樋閲屻�佽吘璁�)<br/> </p> <p> <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span> @@ -91,6 +93,37 @@ <span>鏇存柊鏃ュ織</span> </div> <el-collapse accordion> + <el-collapse-item title="v2.6.0 - 2021-7-28"> + <ol> + <li>add [閲嶅ぇ鏂板] 澧炲姞 OSS 瀵硅薄瀛樺偍妯″潡</li> + <li>remove [閲嶅ぇ鏀瑰姩] 鍒犻櫎 鑷甫閫氱敤涓婁紶 鎺ュ彛 浣跨敤OSS妯″潡鏇挎崲<li> + <li>update [閲嶅ぇ鏀瑰姩] 閲嶅啓VO杞崲 鏀寔娣辨嫹璐� 灏哣O绫绘娊璞″埌 ServicePlus 娉涘瀷澶勭悊<li> + <li>update [閲嶅ぇ鏀瑰姩] 澶欱O鍚堝苟 浣跨敤鍒嗙粍鏍¢獙 鐢熸垚BO浠g爜<li> + <li>update [閲嶅ぇ鏀瑰姩] 閲嶆瀯 IServicePlus 鍔熻兘 澧炲姞 BeanCopyUtils 娣辨嫹璐濆伐鍏�<li> + <li>update springboot 2.4.9 => 2.5.3<li> + <li>update hutool 5.7.4 => 5.7.6<li> + <li>update minio 8.2.2 => 8.3.0<li> + <li>update docker plugin 1.2.0 => 1.2.2<li> + <li>update redisson 3.16.0 => 3.16.1<li> + <li>update datasource 3.4.0 => 3.4.1<li> + <li>update element-ui 2.15.2 => 2.15.3<li> + <li>add 婕旂ずDemo澧炲姞鑷畾涔夊垎椤垫帴鍙f渚�</li> + <li>add 瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li> + <li>update 鏇存柊druid閰嶇疆 鐙珛閰嶇疆鏇存槑鏄�</li> + <li>update 椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li> + <li>update 瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li> + <li>update 瀵煎叆鐢ㄦ埛鏍峰紡璋冩暣</li> + <li>update 椤堕儴鑿滃崟鏍峰紡璋冩暣</li> + <li>update 瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li> + <li>update 鍐呴摼璁剧疆meta淇℃伅</li> + <li>update 璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li> + <li>fix 淇澶氭暟鎹簮druid鍏ㄥ眬閰嶇疆缂╄繘閿欒 寮曡捣鏃犳晥閰嶇疆闂</li> + <li>fix 淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li> + <li>fix 淇 鎺堟潈瑙掕壊绌烘暟鎹棶棰�</li> + <li>fix 淇 DictData 鍒犻櫎閫昏緫闂</li> + <li>fix 淇浠绘剰璐︽埛瓒婃潈婕忔礊</li> + </ol> + </el-collapse-item> <el-collapse-item title="v2.5.2 - 2021-7-19"> <ol> <li>update 浼樺寲浠g爜鐢熸垚鍣ㄦ敞閲婃牸寮�</li> diff --git a/ruoyi-ui/src/views/monitor/job/index.vue b/ruoyi-ui/src/views/monitor/job/index.vue index 69fa8bd..0e0d943 100644 --- a/ruoyi-ui/src/views/monitor/job/index.vue +++ b/ruoyi-ui/src/views/monitor/job/index.vue @@ -115,17 +115,30 @@ <el-button size="mini" type="text" - icon="el-icon-caret-right" - @click="handleRun(scope.row)" - v-hasPermi="['monitor:job:changeStatus']" - >鎵ц涓�娆�</el-button> + icon="el-icon-edit" + @click="handleUpdate(scope.row)" + v-hasPermi="['monitor:job:edit']" + >淇敼</el-button> <el-button size="mini" type="text" - icon="el-icon-view" - @click="handleView(scope.row)" - v-hasPermi="['monitor:job:query']" - >璇︾粏</el-button> + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['monitor:job:remove']" + >鍒犻櫎</el-button> + <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['monitor:job:changeStatus', 'monitor:job:query']"> + <span class="el-dropdown-link"> + <i class="el-icon-d-arrow-right el-icon--right"></i>鏇村 + </span> + <el-dropdown-menu slot="dropdown"> + <el-dropdown-item command="handleRun" icon="el-icon-caret-right" + v-hasPermi="['monitor:job:changeStatus']">鎵ц涓�娆�</el-dropdown-item> + <el-dropdown-item command="handleView" icon="el-icon-view" + v-hasPermi="['monitor:job:query']">浠诲姟璇︾粏</el-dropdown-item> + <el-dropdown-item command="handleJobLog" icon="el-icon-s-operation" + v-hasPermi="['monitor:job:query']">璋冨害鏃ュ織</el-dropdown-item> + </el-dropdown-menu> + </el-dropdown> </template> </el-table-column> </el-table> @@ -385,6 +398,22 @@ this.single = selection.length != 1; this.multiple = !selection.length; }, + // 鏇村鎿嶄綔瑙﹀彂 + handleCommand(command, row) { + switch (command) { + case "handleRun": + this.handleRun(row); + break; + case "handleView": + this.handleView(row); + break; + case "handleJobLog": + this.handleJobLog(row); + break; + default: + break; + } + }, // 浠诲姟鐘舵�佷慨鏀� handleStatusChange(row) { let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; @@ -420,8 +449,9 @@ }); }, /** 浠诲姟鏃ュ織鍒楄〃鏌ヨ */ - handleJobLog() { - this.$router.push("/job/log"); + handleJobLog(row) { + const jobId = row.jobId || 0; + this.$router.push({ path: '/monitor/job-log/index', query: { jobId: jobId } }) }, /** 鏂板鎸夐挳鎿嶄綔 */ handleAdd() { diff --git a/ruoyi-ui/src/views/monitor/job/log.vue b/ruoyi-ui/src/views/monitor/job/log.vue index fa5976f..25db43f 100644 --- a/ruoyi-ui/src/views/monitor/job/log.vue +++ b/ruoyi-ui/src/views/monitor/job/log.vue @@ -94,6 +94,15 @@ v-hasPermi="['monitor:job:export']" >瀵煎嚭</el-button> </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + plain + icon="el-icon-close" + size="mini" + @click="handleClose" + >鍏抽棴</el-button> + </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> </el-row> @@ -168,6 +177,7 @@ </template> <script> +import { getJob} from "@/api/monitor/job"; import { listJobLog, delJobLog, exportJobLog, cleanJobLog } from "@/api/monitor/jobLog"; export default { @@ -209,8 +219,17 @@ }; }, created() { - this.getList(); - this.getDicts("sys_job_status").then(response => { + const jobId = this.$route.query.jobId; + if (jobId !== undefined && jobId != 0) { + getJob(jobId).then(response => { + this.queryParams.jobName = response.data.jobName; + this.queryParams.jobGroup = response.data.jobGroup; + this.getList(); + }); + } else { + this.getList(); + } + this.getDicts("sys_common_status").then(response => { this.statusOptions = response.data; }); this.getDicts("sys_job_group").then(response => { @@ -236,6 +255,11 @@ jobGroupFormat(row, column) { return this.selectDictLabel(this.jobGroupOptions, row.jobGroup); }, + // 杩斿洖鎸夐挳 + handleClose() { + this.$store.dispatch("tagsView/delView", this.$route); + this.$router.push({ path: "/monitor/job" }); + }, /** 鎼滅储鎸夐挳鎿嶄綔 */ handleQuery() { this.queryParams.pageNum = 1; diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/ruoyi-ui/src/views/system/dict/index.vue index 3ced195..b80dd37 100644 --- a/ruoyi-ui/src/views/system/dict/index.vue +++ b/ruoyi-ui/src/views/system/dict/index.vue @@ -118,7 +118,7 @@ <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true" /> <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true"> <template slot-scope="scope"> - <router-link :to="'/dict/type/data/' + scope.row.dictId" class="link-type"> + <router-link :to="'/system/dict-data/index/' + scope.row.dictId" class="link-type"> <span>{{ scope.row.dictType }}</span> </router-link> </template> diff --git a/ruoyi-ui/src/views/system/menu/index.vue b/ruoyi-ui/src/views/system/menu/index.vue index a7d3ce7..0558718 100644 --- a/ruoyi-ui/src/views/system/menu/index.vue +++ b/ruoyi-ui/src/views/system/menu/index.vue @@ -89,7 +89,7 @@ <!-- 娣诲姞鎴栦慨鏀硅彍鍗曞璇濇 --> <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body> - <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-row> <el-col :span="24"> <el-form-item label="涓婄骇鑿滃崟"> @@ -144,7 +144,13 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType != 'F'" label="鏄惁澶栭摼"> + <el-form-item v-if="form.menuType != 'F'"> + <span slot="label"> + <el-tooltip content="閫夋嫨鏄閾惧垯璺敱鍦板潃闇�瑕佷互`http(s)://`寮�澶�" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鏄惁澶栭摼 + </span> <el-radio-group v-model="form.isFrame"> <el-radio label="0">鏄�</el-radio> <el-radio label="1">鍚�</el-radio> @@ -152,22 +158,46 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType != 'F'" label="璺敱鍦板潃" prop="path"> + <el-form-item v-if="form.menuType != 'F'" prop="path"> + <span slot="label"> + <el-tooltip content="璁块棶鐨勮矾鐢卞湴鍧�锛屽锛歚user`锛屽澶栫綉鍦板潃闇�鍐呴摼璁块棶鍒欎互`http(s)://`寮�澶�" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 璺敱鍦板潃 + </span> <el-input v-model="form.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�" /> </el-form-item> </el-col> <el-col :span="12" v-if="form.menuType == 'C'"> - <el-form-item label="缁勪欢璺緞" prop="component"> + <el-form-item prop="component"> + <span slot="label"> + <el-tooltip content="璁块棶鐨勭粍浠惰矾寰勶紝濡傦細`system/user/index`锛岄粯璁ゅ湪`views`鐩綍涓�" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 缁勪欢璺緞 + </span> <el-input v-model="form.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�" /> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType != 'M'" label="鏉冮檺鏍囪瘑"> + <el-form-item v-if="form.menuType != 'M'"> <el-input v-model="form.perms" placeholder="璇疯緭鍏ユ潈闄愭爣璇�" maxlength="100" /> + <span slot="label"> + <el-tooltip content="鎺у埗鍣ㄤ腑瀹氫箟鐨勬潈闄愬瓧绗︼紝濡傦細@PreAuthorize(`@ss.hasPermi('system:user:list')`)" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鏉冮檺瀛楃 + </span> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType != 'F'" label="鏄剧ず鐘舵��"> + <el-form-item v-if="form.menuType != 'F'"> + <span slot="label"> + <el-tooltip content="閫夋嫨闅愯棌鍒欒矾鐢卞皢涓嶄細鍑虹幇鍦ㄤ晶杈规爮锛屼絾浠嶇劧鍙互璁块棶" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鏄剧ず鐘舵�� + </span> <el-radio-group v-model="form.visible"> <el-radio v-for="dict in visibleOptions" @@ -178,7 +208,13 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType != 'F'" label="鑿滃崟鐘舵��"> + <el-form-item v-if="form.menuType != 'F'"> + <span slot="label"> + <el-tooltip content="閫夋嫨鍋滅敤鍒欒矾鐢卞皢涓嶄細鍑虹幇鍦ㄤ晶杈规爮锛屼篃涓嶈兘琚闂�" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鑿滃崟鐘舵�� + </span> <el-radio-group v-model="form.status"> <el-radio v-for="dict in statusOptions" @@ -189,7 +225,13 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item v-if="form.menuType == 'C'" label="鏄惁缂撳瓨"> + <el-form-item v-if="form.menuType == 'C'"> + <span slot="label"> + <el-tooltip content="閫夋嫨鏄垯浼氳`keep-alive`缂撳瓨锛岄渶瑕佸尮閰嶇粍浠剁殑`name`鍜屽湴鍧�淇濇寔涓�鑷�" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鏄惁缂撳瓨 + </span> <el-radio-group v-model="form.isCache"> <el-radio label="0">缂撳瓨</el-radio> <el-radio label="1">涓嶇紦瀛�</el-radio> diff --git a/ruoyi-ui/src/views/system/oss/index.vue b/ruoyi-ui/src/views/system/oss/index.vue new file mode 100644 index 0000000..1171cc9 --- /dev/null +++ b/ruoyi-ui/src/views/system/oss/index.vue @@ -0,0 +1,322 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> + <el-form-item label="鏂囦欢鍚�" prop="fileName"> + <el-input + v-model="queryParams.fileName" + placeholder="璇疯緭鍏ユ枃浠跺悕" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="鍘熷悕" prop="originalName"> + <el-input + v-model="queryParams.originalName" + placeholder="璇疯緭鍏ュ師鍚�" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="鏂囦欢鍚庣紑" prop="fileSuffix"> + <el-input + v-model="queryParams.fileSuffix" + placeholder="璇疯緭鍏ユ枃浠跺悗缂�" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="鍒涘缓鏃堕棿"> + <el-date-picker + v-model="daterangeCreateTime" + size="small" + style="width: 240px" + value-format="yyyy-MM-dd" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + ></el-date-picker> + </el-form-item> + <el-form-item label="涓婁紶浜�" prop="createBy"> + <el-input + v-model="queryParams.createBy" + placeholder="璇疯緭鍏ヤ笂浼犱汉" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="鏈嶅姟鍟�" prop="service"> + <el-input + v-model="queryParams.service" + placeholder="璇疯緭鍏ユ湇鍔″晢" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="el-icon-plus" + size="mini" + @click="handleFile" + v-hasPermi="['system:oss:upload']" + >涓婁紶鏂囦欢</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="el-icon-plus" + size="mini" + @click="handleImage" + v-hasPermi="['system:oss:upload']" + >涓婁紶鍥剧墖</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + plain + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:oss:remove']" + >鍒犻櫎</el-button> + </el-col> + + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + + <el-table v-loading="loading" :data="ossList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="浜戝瓨鍌ㄤ富閿�" align="center" prop="ossId" v-if="false"/> + <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" /> + <el-table-column label="鍘熷悕" align="center" prop="originalName" /> + <el-table-column label="鏂囦欢鍚庣紑" align="center" prop="fileSuffix" /> + <el-table-column label="鏂囦欢灞曠ず" align="center" prop="url"> + <template slot-scope="scope"> + <el-image + v-if="previewListResource && scope.row.fileSuffix.indexOf('png','jpg','jpeg') > 0" + style="width: 100px; height: 100px;" + :src="scope.row.url" + :preview-src-list="[scope.row.url]"/> + <span v-text="scope.row.url" + v-if="scope.row.fileSuffix.indexOf('png','jpg','jpeg') < 0 || !previewListResource"/> + </template> + </el-table-column> + <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180"> + <template slot-scope="scope"> + <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span> + </template> + </el-table-column> + <el-table-column label="涓婁紶浜�" align="center" prop="createBy" /> + <el-table-column label="鏈嶅姟鍟�" align="center" prop="service" /> + <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button + size="mini" + type="text" + icon="el-icon-edit" + @click="handleDownload(scope.row)" + v-hasPermi="['system:oss:download']" + >涓嬭浇</el-button> + <el-button + size="mini" + type="text" + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['system:oss:remove']" + >鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + + <!-- 娣诲姞鎴栦慨鏀筄SS浜戝瓨鍌ㄥ璇濇 --> + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="鏂囦欢鍚�"> + <fileUpload v-model="form.file" v-if="type === 0"/> + <imageUpload v-model="form.file" v-if="type === 1"/> + </el-form-item> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { listOss, delOss } from "@/api/system/oss"; +import { downLoadOss } from "@/utils/ossdownload"; +import { updateConfig } from "@/api/system/config"; + + +export default { + name: "Oss", + data() { + return { + // 鎸夐挳loading + buttonLoading: false, + // 閬僵灞� + loading: true, + // 瀵煎嚭閬僵灞� + exportLoading: false, + // 閫変腑鏁扮粍 + ids: [], + // 闈炲崟涓鐢� + single: true, + // 闈炲涓鐢� + multiple: true, + // 鏄剧ず鎼滅储鏉′欢 + showSearch: true, + // 鎬绘潯鏁� + total: 0, + // OSS浜戝瓨鍌ㄨ〃鏍兼暟鎹� + ossList: [], + // 寮瑰嚭灞傛爣棰� + title: "", + // 寮瑰嚭灞傛爣棰� + type: 0, + // 鏄惁鏄剧ず寮瑰嚭灞� + open: false, + // 棰勮鍒楄〃鍥剧墖 + previewListResource: true, + // 鍒涘缓鏃堕棿鏃堕棿鑼冨洿 + daterangeCreateTime: [], + // 鏌ヨ鍙傛暟 + queryParams: { + pageNum: 1, + pageSize: 10, + fileName: undefined, + originalName: undefined, + fileSuffix: undefined, + url: undefined, + createTime: undefined, + createBy: undefined, + service: undefined + }, + // 琛ㄥ崟鍙傛暟 + form: {}, + // 琛ㄥ崟鏍¢獙 + rules: { + file: [ + { required: true, message: "鏂囦欢涓嶈兘涓虹┖", trigger: "blur" } + ] + } + }; + }, + created() { + this.getList(); + }, + methods: { + /** 鏌ヨOSS浜戝瓨鍌ㄥ垪琛� */ + getList() { + this.loading = true; + this.queryParams.params = {}; + if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) { + this.queryParams.params["beginCreateTime"] = this.daterangeCreateTime[0]; + this.queryParams.params["endCreateTime"] = this.daterangeCreateTime[1]; + } + this.getConfigKey("sys.oss.previewListResource").then(response => { + this.previewListResource = response.msg === undefined ? true : response.msg === 'true'; + }); + listOss(this.queryParams).then(response => { + this.ossList = response.rows; + this.total = response.total; + this.loading = false; + }); + }, + // 鍙栨秷鎸夐挳 + cancel() { + this.open = false; + this.reset(); + }, + // 琛ㄥ崟閲嶇疆 + reset() { + this.form = { + file: undefined, + }; + this.resetForm("form"); + }, + /** 鎼滅储鎸夐挳鎿嶄綔 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 閲嶇疆鎸夐挳鎿嶄綔 */ + resetQuery() { + this.daterangeCreateTime = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // 澶氶�夋閫変腑鏁版嵁 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.ossId) + this.single = selection.length!==1 + this.multiple = !selection.length + }, + /** 鏂囦欢鎸夐挳鎿嶄綔 */ + handleFile() { + this.reset(); + this.open = true; + this.title = "涓婁紶鏂囦欢"; + this.type = 0; + }, + /** 鍥剧墖鎸夐挳鎿嶄綔 */ + handleImage() { + this.reset(); + this.open = true; + this.title = "涓婁紶鍥剧墖"; + this.type = 1; + }, + /** 鎻愪氦鎸夐挳 */ + submitForm() { + this.open = false; + this.getList(); + }, + /** 涓嬭浇鎸夐挳鎿嶄綔 */ + handleDownload(row) { + downLoadOss(row.ossId) + }, + /** 鍒犻櫎鎸夐挳鎿嶄綔 */ + handleDelete(row) { + const ossIds = row.ossId || this.ids; + this.$confirm('鏄惁纭鍒犻櫎OSS浜戝瓨鍌ㄧ紪鍙蜂负"' + ossIds + '"鐨勬暟鎹」?', "璀﹀憡", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning" + }).then(() => { + this.loading = true; + return delOss(ossIds); + }).then(() => { + this.loading = false; + this.getList(); + this.msgSuccess("鍒犻櫎鎴愬姛"); + }).catch(() => {}); + } + } +}; +</script> diff --git a/ruoyi-ui/src/views/system/role/index.vue b/ruoyi-ui/src/views/system/role/index.vue index 5bedd49..53d4f8d 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']" >鍒犻櫎</el-button> - <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"> + <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']"> <span class="el-dropdown-link"> <i class="el-icon-d-arrow-right el-icon--right"></i>鏇村 </span> @@ -164,11 +164,17 @@ <!-- 娣诲姞鎴栦慨鏀硅鑹查厤缃璇濇 --> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> - <el-form ref="form" :model="form" :rules="rules" label-width="80px"> + <el-form ref="form" :model="form" :rules="rules" label-width="100px"> <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> <el-input v-model="form.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" /> </el-form-item> - <el-form-item label="鏉冮檺瀛楃" prop="roleKey"> + <el-form-item prop="roleKey"> + <span slot="label"> + <el-tooltip content="鎺у埗鍣ㄤ腑瀹氫箟鐨勬潈闄愬瓧绗︼紝濡傦細@PreAuthorize(`@ss.hasRole('admin')`)" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + 鏉冮檺瀛楃 + </span> <el-input v-model="form.roleKey" placeholder="璇疯緭鍏ユ潈闄愬瓧绗�" /> </el-form-item> <el-form-item label="瑙掕壊椤哄簭" prop="roleSort"> @@ -568,7 +574,7 @@ /** 鍒嗛厤鐢ㄦ埛鎿嶄綔 */ 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 605cf6e..1b97220 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']" >鍒犻櫎</el-button> - <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)"> + <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']"> <span class="el-dropdown-link"> <i class="el-icon-d-arrow-right el-icon--right"></i>鏇村 </span> @@ -242,7 +242,7 @@ </el-col> <el-col :span="12"> <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password"> - <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" /> + <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password/> </el-form-item> </el-col> </el-row> @@ -328,15 +328,14 @@ drag > <i class="el-icon-upload"></i> - <div class="el-upload__text"> - 灏嗘枃浠舵嫋鍒版澶勶紝鎴� - <em>鐐瑰嚮涓婁紶</em> + <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div> + <div class="el-upload__tip text-center" slot="tip"> + <div class="el-upload__tip" slot="tip"> + <el-checkbox v-model="upload.updateSupport" /> 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹� + </div> + <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span> + <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">涓嬭浇妯℃澘</el-link> </div> - <div class="el-upload__tip" slot="tip"> - <el-checkbox v-model="upload.updateSupport" />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹� - <el-link type="info" style="font-size:12px" @click="importTemplate">涓嬭浇妯℃澘</el-link> - </div> - <div class="el-upload__tip" style="color:red" slot="tip">鎻愮ず锛氫粎鍏佽瀵煎叆鈥渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒</div> </el-upload> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button> @@ -622,7 +621,7 @@ /** 鍒嗛厤瑙掕壊鎿嶄綔 */ handleAuthRole: function(row) { const userId = row.userId; - this.$router.push("/auth/role/" + userId); + this.$router.push("/system/user-auth/role/" + userId); }, /** 鎻愪氦鎸夐挳 */ submitForm: function() { diff --git a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue index ee65240..d567d6d 100644 --- a/ruoyi-ui/src/views/system/user/profile/resetPwd.vue +++ b/ruoyi-ui/src/views/system/user/profile/resetPwd.vue @@ -1,13 +1,13 @@ <template> <el-form ref="form" :model="user" :rules="rules" label-width="80px"> <el-form-item label="鏃у瘑鐮�" prop="oldPassword"> - <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" /> + <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" show-password/> </el-form-item> <el-form-item label="鏂板瘑鐮�" prop="newPassword"> - <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" /> + <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" show-password/> </el-form-item> <el-form-item label="纭瀵嗙爜" prop="confirmPassword"> - <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゅ瘑鐮�" type="password" /> + <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゅ瘑鐮�" type="password" show-password/> </el-form-item> <el-form-item> <el-button type="primary" size="mini" @click="submit">淇濆瓨</el-button> diff --git a/ruoyi-ui/src/views/tool/gen/index.vue b/ruoyi-ui/src/views/tool/gen/index.vue index 0efc75a..28074fe 100644 --- a/ruoyi-ui/src/views/tool/gen/index.vue +++ b/ruoyi-ui/src/views/tool/gen/index.vue @@ -319,7 +319,7 @@ /** 淇敼鎸夐挳鎿嶄綔 */ handleEditTable(row) { const tableId = row.tableId || this.ids[0]; - this.$router.push("/gen/edit/" + tableId); + this.$router.push("/tool/gen-edit/index/" + tableId); }, /** 鍒犻櫎鎸夐挳鎿嶄綔 */ handleDelete(row) { diff --git a/sql/oss.sql b/sql/oss.sql new file mode 100644 index 0000000..3b20c07 --- /dev/null +++ b/sql/oss.sql @@ -0,0 +1,27 @@ +-- ---------------------------- +-- OSS浜戝瓨鍌ㄨ〃 +-- ---------------------------- +drop table if exists sys_oss; +create table sys_oss ( + oss_id bigint(20) not null auto_increment comment '浜戝瓨鍌ㄤ富閿�', + file_name varchar(64) not null default '' comment '鏂囦欢鍚�', + original_name varchar(64) not null default '' comment '鍘熷悕', + file_suffix varchar(10) not null default '' comment '鏂囦欢鍚庣紑鍚�', + url varchar(200) not null comment 'URL鍦板潃', + create_time datetime default null comment '鍒涘缓鏃堕棿', + create_by varchar(64) default '' comment '涓婁紶浜�', + update_time datetime default null comment '鏇存柊鏃堕棿', + update_by varchar(64) default '' comment '鏇存柊浜�', + service varchar(10) not null default 'minio' comment '鏈嶅姟鍟�', + primary key (oss_id) +) engine=innodb comment ='OSS浜戝瓨鍌ㄨ〃'; + +insert into sys_config values(10, 'OSS浜戝瓨鍌ㄦ湇鍔″晢', 'sys.oss.cloudStorageService', 'minio', 'Y', 'admin', sysdate(), '', null, 'OSS浜戝瓨鍌ㄦ湇鍔″晢(qiniu:涓冪墰浜�, aliyun:闃块噷浜�, qcloud:鑵捐浜�, minio: Minio)'); +insert into sys_config values(11, 'OSS棰勮鍒楄〃璧勬簮寮�鍏�', 'sys.oss.previewListResource', 'true', 'Y', 'admin', sysdate(), '', null, 'true:寮�鍚�, false:鍏抽棴'); + +insert into sys_menu values('118', '鏂囦欢绠$悊', '1', '10', 'oss', 'system/oss/index', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 'admin', sysdate(), '', null, '鏂囦欢绠$悊鑿滃崟'); + +insert into sys_menu values('1600', '鏂囦欢鏌ヨ', '118', '1', '#', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1601', '鏂囦欢涓婁紶', '118', '2', '#', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1602', '鏂囦欢涓嬭浇', '118', '3', '#', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 'admin', sysdate(), '', null, ''); +insert into sys_menu values('1603', '鏂囦欢鍒犻櫎', '118', '4', '#', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 'admin', sysdate(), '', null, ''); -- Gitblit v1.9.3