+ 暂无数据,请添加
++ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+```
+
+> **重要**:本工程为开源版本,**不要**写入 BladeX 商业许可证头部。若需要迁移为商业版本,请以商业项目代码样例为准。
+
+---
+
+## 11. 构建与部署
+
+### 11.1 Maven 构建
+
+```bash
+mvn clean compile -DskipTests # 根目录执行:编译所有子模块
+mvn clean package -DskipTests # 打包所有服务为 FatJar
+mvn clean package -DskipTests -pl blade-service/blade-system -am # 只打包 system 服务及其依赖模块
+```
+
+- 父 POM 使用 `${revision}` 占位符管理版本,由 `flatten-maven-plugin` 在 `process-resources` 阶段展开
+- 各服务打包产物通过 `directory-maven-plugin` 汇总复制到根目录 `target/`
+- `finalName` 使用 `${project.name}`,产物命名与 artifactId 一致
+
+### 11.2 Nacos 配置
+
+- 配置文件位于 `doc/nacos/`:`blade.yaml`(公共配置)+ `blade-dev.yaml`/`blade-test.yaml`/`blade-prod.yaml`(环境差异)
+- 数据源、密钥、Swagger、Sentinel、Feign 等共享参数统一在 Nacos 配置
+- 各服务 `src/main/resources/application-{env}.yml` 仅保留 `server.port` 与 `spring.datasource.url` 等少量本地覆盖
+
+### 11.3 Docker 部署
+
+- `script/docker/docker-compose.yml` 提供一体化编排:Nacos + Sentinel + Redis + Nginx + 全部微服务
+- 默认网段 `blade_net`,Nacos `172.30.0.48`,Sentinel `172.30.0.58`
+- Harbor 镜像推送通过父 POM 的 `docker.registry.url` 属性控制
+
+### 11.4 必备环境变量
+
+```bash
+BLADE_OAUTH2_PUBLIC_KEY # SM2 公钥
+BLADE_OAUTH2_PRIVATE_KEY # SM2 私钥
+BLADE_TOKEN_SIGN_KEY # JWT 签名密钥
+BLADE_TOKEN_CRYPTO_KEY # Token AES 加密密钥
+```
+
+### 11.5 服务端口(默认)
+
+| 服务 | 端口 |
+| --- | --- |
+| blade-gateway | 80 |
+| blade-auth | 8100 |
+| blade-admin | 7002 |
+| blade-system | 8106 |
+| blade-desk | 8103 |
+| blade-log | 8102 |
+| blade-develop | 8108 |
+| blade-report | 8109 |
+| blade-resource | 8110 |
+
+> 实际端口以 `src/main/resources/application-{env}.yml` 中 `server.port` 为准。
+
+---
+
+## 12. Git 提交规范
+
+当需要提交代码时,优先使用 **`/blade-commit`** skill,它会自动分析变更内容并生成符合项目规范的 Gitmoji 提交信息。
+
+采用 **Gitmoji** 风格,中文描述。格式:`:
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## 核心技术栈
+
+| 技术栈 | 版本 |
+|----------------------|------------|
+| Java | 21+ |
+| NodeJS | 18+ |
+| Spring | 7.0.8 |
+| Spring Boot | 4.1.0 |
+| Spring Cloud | 2025.1.2 |
+| Spring Cloud Alibaba | 2025.1.0.0 |
+| Nacos Alibaba | 3.2.2 |
+| Mybatis Plus | 3.5.17 |
+
## 工程结构
```
SpringBlade
-├── blade-auth -- 授权服务提供
-├── blade-common -- 常用工具封装包
-├── blade-gateway -- Spring Cloud 网关
-├── blade-ops -- 运维中心
-├ ├── blade-admin -- spring-cloud后台管理
-├ ├── blade-develop -- 代码生成
-├ ├── blade-resource -- 资源管理
-├ ├── blade-seata-order -- seata分布式事务demo
-├ ├── blade-seata-storage -- seata分布式事务demo
-├── blade-service -- 业务模块
-├ ├── blade-desk -- 工作台模块
-├ ├── blade-log -- 日志模块
-├ ├── blade-system -- 系统模块
-├ └── blade-user -- 用户模块
-├── blade-service-api -- 业务模块api封装
-├ ├── blade-desk-api -- 工作台api
-├ ├── blade-dict-api -- 字典api
-├ ├── blade-system-api -- 系统api
-└── └── blade-user-api -- 用户api
+├── src/main/java/org/springblade
+│ ├── Application.java -- 启动类
+│ ├── common -- 公共模块
+│ │ ├── cache -- 缓存配置
+│ │ ├── config -- 系统配置
+│ │ ├── constant -- 常量定义
+│ │ ├── launch -- 启动配置
+│ │ └── tool -- 工具类
+│ ├── core -- 核心模块
+│ │ ├── log -- 日志拓展
+│ │ └── secure -- 安全拓展
+│ └── modules -- 业务模块
+│ ├── auth -- 认证授权模块
+│ ├── desk -- 工作台模块
+│ ├── develop -- 代码生成模块
+│ ├── resource -- 资源管理模块
+│ └── system -- 系统管理模块
+├── src/main/resources
+│ ├── application.yml -- 主配置文件
+│ ├── application-dev.yml -- 开发环境配置
+│ ├── application-test.yml -- 测试环境配置
+│ ├── application-prod.yml -- 生产环境配置
+│ └── config -- 其他配置文件
+├── doc -- 文档目录
+│ ├── script -- 启动脚本
+│ └── sql -- 数据库脚本
+└── pom.xml -- Maven配置文件
```
-## 官网
-* 官网地址:[https://bladex.vip](https://bladex.vip)
-* 问答社区:[https://sns.bladex.vip](https://sns.bladex.vip)
-* 会员计划:[SpringBlade会员计划](https://gitee.com/smallc/SpringBlade/wikis/SpringBlade会员计划)
-* 交流一群:`477853168`(满)
-* 交流二群:`751253339`(满)
-* 交流三群:`784729540`(满)
-* 交流四群:`1034621754`(满)
-* 交流五群:`946350912`
-
-## 在线演示
-* Saber-基于Vue:[https://saber.bladex.vip](https://saber.bladex.vip)
-* Sword-基于React:[https://sword.bladex.vip](https://sword.bladex.vip)
-* Archer-全能代码生成系统:[https://archer.bladex.vip](https://archer.bladex.vip)
-* Caster-数据大屏展示系统:[https://data.avuejs.com](https://data.avuejs.com)
+## 官方信息
-## 技术文档
-* [SpringBlade开发手册一览](https://gitee.com/smallc/SpringBlade/wikis/SpringBlade开发手册)
-* [常见问题集锦](https://sns.bladex.vip/article-14966.html)
-
-## 项目地址
-* 后端Gitee地址:[https://gitee.com/smallc/SpringBlade](https://gitee.com/smallc/SpringBlade)
-* 后端Github地址:[https://github.com/chillzhuang/SpringBlade](https://github.com/chillzhuang/SpringBlade)
-* 后端SpringBoot版:[https://gitee.com/smallc/SpringBlade/tree/2.0-boot/](https://gitee.com/smallc/SpringBlade/tree/2.0-boot/)
-* 前端框架Sword(基于React):[https://gitee.com/smallc/Sword](https://gitee.com/smallc/Sword)
-* 前端框架Saber(基于Vue):[https://gitee.com/smallc/Saber](https://gitee.com/smallc/Saber)
-* 核心框架项目地址:[https://github.com/chillzhuang/blade-tool](https://github.com/chillzhuang/blade-tool)
-
-# 开源协议
-Apache Licence 2.0 ([英文原文](http://www.apache.org/licenses/LICENSE-2.0.html))
-Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。
-需要满足的条件如下:
-* 需要给代码的用户一份Apache Licence
-* 如果你修改了代码,需要在被修改的文件中说明。
-* 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
-* 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。
-Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。
+| 简介 | 内容 |
+|------|-------------------------------------------------------------------------------|
+| 官网地址 | [https://bladex.cn](https://bladex.cn) |
+| 问答社区 | [https://sns.bladex.cn](https://sns.bladex.cn) |
+| 会员计划 | [SpringBlade会员计划](https://gitee.com/smallc/SpringBlade/wikis/SpringBlade会员计划) |
+| 交流一群 | `477853168` (满) |
+| 交流二群 | `751253339` (满) |
+| 交流三群 | `784729540` (满) |
+| 交流四群 | `1034621754` (满) |
+| 交流五群 | `946350912` (满) |
+| 交流六群 | `511624269` (满) |
+| 交流七群 | `298061704` (满) |
+| 交流八群 | `1078507904` |
-## 用户权益
-* 允许免费用于学习、毕设、公司项目、私活等。
-* 对未经过授权和不遵循 Apache 2.0 协议二次开源或者商业化我们将追究到底。
-* 参考请注明:参考自 SpringBlade:https://gitee.com/smallc/SpringBlade 。另请遵循 Apache 2.0 协议。
-* `注意`:若禁止条款被发现有权追讨 **19999** 的授权费。
+## 官方产品
-# 界面
+| 简介 | 演示地址 |
+|-----------------|------------------------------------------------------|
+| BladeX企业级开发平台 | [https://saber3.bladex.cn](https://saber3.bladex.cn) |
+| BladeX可视化数据大屏 | [https://data.bladex.cn](https://data.bladex.cn) |
+| BladeX物联网开发平台 | [https://iot.bladex.cn](https://iot.bladex.cn) |
+| BladeXAI大模型平台 | [https://ai.bladex.cn/](https://ai.bladex.cn/) |
-## [BladeX](https://bladex.vip/#/vip) 工作流一览
-![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- |
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
-
![]() |
- ![]() |
- ||
![]() |
- ![]() |
- ||
![]() |
- ![]() |
- ||
![]() |
- ![]() |
- ||
![]() |
- ![]() |
- ||
![]() |
- ![]() |
+ ![]() |
+ ![]() |
* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,18 +16,16 @@ package org.springblade.auth; +import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; import org.springblade.core.launch.constant.AppConstant; -import org.springframework.cloud.client.SpringCloudApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; /** * 用户认证服务器 * * @author Chill */ -@SpringCloudApplication -@EnableFeignClients(AppConstant.BASE_PACKAGES) +@BladeCloudApplication public class AuthApplication { public static void main(String[] args) { diff --git a/blade-auth/src/main/java/org/springblade/auth/controller/AuthController.java b/blade-auth/src/main/java/org/springblade/auth/controller/AuthController.java index 529264b3..5c565f51 100644 --- a/blade-auth/src/main/java/org/springblade/auth/controller/AuthController.java +++ b/blade-auth/src/main/java/org/springblade/auth/controller/AuthController.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com). + * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com). *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,20 +16,21 @@
package org.springblade.auth.controller;
import com.wf.captcha.SpecCaptcha;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.auth.granter.ITokenGranter;
import org.springblade.auth.granter.TokenGranterBuilder;
import org.springblade.auth.granter.TokenParameter;
import org.springblade.auth.utils.TokenUtil;
import org.springblade.common.cache.CacheNames;
+import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.AuthInfo;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.RedisUtil;
import org.springblade.core.tool.utils.WebUtil;
import org.springblade.system.user.entity.UserInfo;
import org.springframework.web.bind.annotation.GetMapping;
@@ -47,18 +48,19 @@
*/
@RestController
@AllArgsConstructor
-@Api(value = "用户授权认证", tags = "授权接口")
+@ApiOrder
+@Tag(name = "用户授权认证", description = "授权接口")
public class AuthController {
- private RedisUtil redisUtil;
+ private BladeRedis bladeRedis;
@PostMapping("token")
- @ApiOperation(value = "获取认证token", notes = "传入租户ID:tenantId,账号:account,密码:password")
- public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
*/
package org.springblade.auth.controller;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhyd.oauth.model.AuthCallback;
@@ -25,12 +25,13 @@
import me.zhyd.oauth.utils.AuthStateUtils;
import org.springblade.core.social.props.SocialProperties;
import org.springblade.core.social.utils.SocialUtil;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
@@ -42,7 +43,8 @@
@RestController
@AllArgsConstructor
@ConditionalOnProperty(value = "social.enabled", havingValue = "true")
-@Api(value = "第三方登陆", tags = "第三方登陆端点")
+@ApiOrder
+@Tag(name = "第三方登陆", description = "第三方登陆端点")
public class SocialController {
private final SocialProperties socialProperties;
@@ -50,7 +52,7 @@ public class SocialController {
/**
* 授权完毕跳转
*/
- @ApiOperation(value = "授权完毕跳转")
+ @Operation(summary = "授权完毕跳转")
@RequestMapping("/oauth/render/{source}")
public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {
AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);
@@ -61,7 +63,7 @@ public void renderAuth(@PathVariable("source") String source, HttpServletRespons
/**
* 获取认证信息
*/
- @ApiOperation(value = "获取认证信息")
+ @Operation(summary = "获取认证信息")
@RequestMapping("/oauth/callback/{source}")
public Object login(@PathVariable("source") String source, AuthCallback callback) {
AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);
@@ -71,7 +73,7 @@ public Object login(@PathVariable("source") String source, AuthCallback callback
/**
* 撤销授权
*/
- @ApiOperation(value = "撤销授权")
+ @Operation(summary = "撤销授权")
@RequestMapping("/oauth/revoke/{source}/{token}")
public Object revokeAuth(@PathVariable("source") String source, @PathVariable("token") String token) {
AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);
@@ -81,7 +83,7 @@ public Object revokeAuth(@PathVariable("source") String source, @PathVariable("t
/**
* 续期accessToken
*/
- @ApiOperation(value = "续期令牌")
+ @Operation(summary = "续期令牌")
@RequestMapping("/oauth/refresh/{source}")
public Object refreshAuth(@PathVariable("source") String source, String token) {
AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties);
diff --git a/blade-auth/src/main/java/org/springblade/auth/enums/BladeUserEnum.java b/blade-auth/src/main/java/org/springblade/auth/enums/BladeUserEnum.java
index 4d0d538a..2b218d54 100644
--- a/blade-auth/src/main/java/org/springblade/auth/enums/BladeUserEnum.java
+++ b/blade-auth/src/main/java/org/springblade/auth/enums/BladeUserEnum.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/CaptchaTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/CaptchaTokenGranter.java
index a3d9e7ca..7e0db1c2 100644
--- a/blade-auth/src/main/java/org/springblade/auth/granter/CaptchaTokenGranter.java
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/CaptchaTokenGranter.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,24 +15,31 @@
*/
package org.springblade.auth.granter;
-import lombok.AllArgsConstructor;
import org.springblade.auth.enums.BladeUserEnum;
import org.springblade.auth.utils.TokenUtil;
import org.springblade.common.cache.CacheNames;
import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.props.BladeAuthProperties;
import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.*;
+import org.springblade.core.tool.utils.DigestUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.core.tool.utils.WebUtil;
import org.springblade.system.user.entity.UserInfo;
import org.springblade.system.user.feign.IUserClient;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
/**
* 验证码TokenGranter
*
* @author Chill
*/
+@Slf4j
@Component
@AllArgsConstructor
public class CaptchaTokenGranter implements ITokenGranter {
@@ -40,7 +47,9 @@ public class CaptchaTokenGranter implements ITokenGranter {
public static final String GRANT_TYPE = "captcha";
private IUserClient userClient;
- private RedisUtil redisUtil;
+ private BladeRedis bladeRedis;
+
+ private BladeAuthProperties authProperties;
@Override
public UserInfo grant(TokenParameter tokenParameter) {
@@ -49,7 +58,7 @@ public UserInfo grant(TokenParameter tokenParameter) {
String key = request.getHeader(TokenUtil.CAPTCHA_HEADER_KEY);
String code = request.getHeader(TokenUtil.CAPTCHA_HEADER_CODE);
// 获取验证码
- String redisCode = String.valueOf(redisUtil.get(CacheNames.CAPTCHA_KEY + key));
+ String redisCode = Func.toStr(bladeRedis.getAndDel(CacheNames.CAPTCHA_KEY + key));
// 判断验证码
if (code == null || !StringUtil.equalsIgnoreCase(redisCode, code)) {
throw new ServiceException(TokenUtil.CAPTCHA_NOT_CORRECT);
@@ -58,21 +67,38 @@ public UserInfo grant(TokenParameter tokenParameter) {
String tenantId = tokenParameter.getArgs().getStr("tenantId");
String account = tokenParameter.getArgs().getStr("account");
String password = tokenParameter.getArgs().getStr("password");
+
+ // 判断账号和IP是否锁定
+ TokenUtil.checkAccountAndIpLock(bladeRedis, tenantId, account);
+
UserInfo userInfo = null;
if (Func.isNoneBlank(account, password)) {
// 获取用户类型
String userType = tokenParameter.getArgs().getStr("userType");
+ // 解密密码
+ String decryptPassword = TokenUtil.decryptPassword(password, authProperties.getPublicKey(), authProperties.getPrivateKey());
+ // 定义返回结果
R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/PasswordTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/PasswordTokenGranter.java
index 9572a6a5..977eb951 100644
--- a/blade-auth/src/main/java/org/springblade/auth/granter/PasswordTokenGranter.java
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/PasswordTokenGranter.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,20 +15,28 @@
*/
package org.springblade.auth.granter;
-import lombok.AllArgsConstructor;
import org.springblade.auth.enums.BladeUserEnum;
+import org.springblade.auth.utils.TokenUtil;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.redis.cache.BladeRedis;
+import org.springblade.core.secure.props.BladeAuthProperties;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DigestUtil;
import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.WebUtil;
import org.springblade.system.user.entity.UserInfo;
import org.springblade.system.user.feign.IUserClient;
import org.springframework.stereotype.Component;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
/**
* PasswordTokenGranter
*
* @author Chill
*/
+@Slf4j
@Component
@AllArgsConstructor
public class PasswordTokenGranter implements ITokenGranter {
@@ -36,27 +44,47 @@ public class PasswordTokenGranter implements ITokenGranter {
public static final String GRANT_TYPE = "password";
private IUserClient userClient;
+ private BladeRedis bladeRedis;
+
+ private BladeAuthProperties authProperties;
@Override
public UserInfo grant(TokenParameter tokenParameter) {
String tenantId = tokenParameter.getArgs().getStr("tenantId");
String account = tokenParameter.getArgs().getStr("account");
String password = tokenParameter.getArgs().getStr("password");
+
+ // 判断账号和IP是否锁定
+ TokenUtil.checkAccountAndIpLock(bladeRedis, tenantId, account);
+
UserInfo userInfo = null;
if (Func.isNoneBlank(account, password)) {
// 获取用户类型
String userType = tokenParameter.getArgs().getStr("userType");
+ // 解密密码
+ String decryptPassword = TokenUtil.decryptPassword(password, authProperties.getPublicKey(), authProperties.getPrivateKey());
+ // 定义返回结果
R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/SocialTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/SocialTokenGranter.java
index 905312d6..ff1513b3 100644
--- a/blade-auth/src/main/java/org/springblade/auth/granter/SocialTokenGranter.java
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/SocialTokenGranter.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@
import org.springblade.system.user.feign.IUserClient;
import org.springframework.stereotype.Component;
-import javax.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
@@ -79,7 +79,7 @@ public UserInfo grant(TokenParameter tokenParameter) {
}
// 组装数据
- UserOauth userOauth = Objects.requireNonNull(BeanUtil.copy(authUser, UserOauth.class));
+ UserOauth userOauth = Objects.requireNonNull(BeanUtil.copyProperties(authUser, UserOauth.class));
userOauth.setSource(authUser.getSource());
userOauth.setTenantId(tenantId);
userOauth.setUuid(authUser.getUuid());
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/TokenGranterBuilder.java b/blade-auth/src/main/java/org/springblade/auth/granter/TokenGranterBuilder.java
index e8700f7d..d872128b 100644
--- a/blade-auth/src/main/java/org/springblade/auth/granter/TokenGranterBuilder.java
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/TokenGranterBuilder.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/TokenParameter.java b/blade-auth/src/main/java/org/springblade/auth/granter/TokenParameter.java
index 368c83ef..e992b969 100644
--- a/blade-auth/src/main/java/org/springblade/auth/granter/TokenParameter.java
+++ b/blade-auth/src/main/java/org/springblade/auth/granter/TokenParameter.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java b/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
index 912a1a83..f5de6684 100644
--- a/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
+++ b/blade-auth/src/main/java/org/springblade/auth/utils/TokenUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,14 +15,18 @@
*/
package org.springblade.auth.utils;
+import org.springblade.common.cache.CacheNames;
import org.springblade.core.launch.constant.TokenConstant;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.AuthInfo;
import org.springblade.core.secure.TokenInfo;
import org.springblade.core.secure.utils.SecureUtil;
-import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.*;
import org.springblade.system.user.entity.User;
import org.springblade.system.user.entity.UserInfo;
+import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
@@ -43,7 +47,10 @@ public class TokenUtil {
public final static String USER_NOT_FOUND = "用户名或密码错误";
public final static String HEADER_KEY = "Authorization";
public final static String HEADER_PREFIX = "Basic ";
- public final static String DEFAULT_AVATAR = "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png";
+ public final static String ENCRYPT_PREFIX = "04";
+ public final static String USER_HAS_TOO_MANY_FAILS = "用户登录失败次数过多";
+ public final static String IP_HAS_TOO_MANY_FAILS = "用户登录失败次数过多,请稍后再试";
+ public final static String DEFAULT_AVATAR = "https://bladex.cn/images/logo.png";
/**
* 创建认证token
@@ -61,6 +68,7 @@ public static AuthInfo createAuthInfo(UserInfo userInfo) {
param.put(TokenConstant.OAUTH_ID, userInfo.getOauthId());
param.put(TokenConstant.USER_ID, Func.toStr(user.getId()));
param.put(TokenConstant.ROLE_ID, user.getRoleId());
+ param.put(TokenConstant.DEPT_ID, user.getDeptId());
param.put(TokenConstant.ACCOUNT, user.getAccount());
param.put(TokenConstant.USER_NAME, user.getAccount());
param.put(TokenConstant.ROLE_NAME, Func.join(userInfo.getRoles()));
@@ -96,4 +104,95 @@ private static TokenInfo createRefreshToken(UserInfo userInfo) {
return SecureUtil.createJWT(param, "audience", "issuser", TokenConstant.REFRESH_TOKEN);
}
+ /**
+ * 解析国密sm2加密密码
+ *
+ * @param rawPassword 请求时提交的原密码
+ * @param publicKey 公钥
+ * @param privateKey 私钥
+ * @return 解密后的密码
+ */
+ public static String decryptPassword(String rawPassword, String publicKey, String privateKey) {
+ // 其中有空则匹配失败
+ if (StringUtil.isAnyBlank(publicKey, privateKey)) {
+ return StringPool.EMPTY;
+ }
+ // 处理部分工具类加密不带04前缀的情况
+ if (!StringUtil.startsWithIgnoreCase(rawPassword, ENCRYPT_PREFIX)) {
+ rawPassword = ENCRYPT_PREFIX + rawPassword;
+ }
+ // 解密密码
+ String decryptPassword = SM2Util.decrypt(rawPassword, privateKey);
+ // 签名校验
+ boolean isVerified = SM2Util.verify(decryptPassword, SM2Util.sign(decryptPassword, privateKey), publicKey);
+ if (!isVerified) {
+ return StringPool.EMPTY;
+ }
+ return decryptPassword;
+ }
+
+ /**
+ * 失败次数上限
+ */
+ public final static Integer FAIL_COUNT = 5;
+
+ /**
+ * 检查账号和IP是否被锁定
+ *
+ * @param bladeRedis Redis缓存
+ * @param tenantId 租户ID
+ * @param account 账号
+ */
+ public static void checkAccountAndIpLock(BladeRedis bladeRedis, String tenantId, String account) {
+ String ip = WebUtil.getIP();
+
+ // 检查账号锁定
+ int userFailCount = Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, account)), 0);
+ if (userFailCount >= FAIL_COUNT) {
+ throw new ServiceException(USER_HAS_TOO_MANY_FAILS);
+ }
+
+ // 检查IP锁定
+ int ipFailCount = Func.toInt(bladeRedis.get(CacheNames.IP_FAIL_KEY + ip), 0);
+ if (ipFailCount >= FAIL_COUNT) {
+ throw new ServiceException(IP_HAS_TOO_MANY_FAILS);
+ }
+ }
+
+ /**
+ * 处理登录失败,增加失败次数
+ *
+ * @param bladeRedis Redis缓存
+ * @param tenantId 租户ID
+ * @param account 账号
+ */
+ public static void handleLoginFailure(BladeRedis bladeRedis, String tenantId, String account) {
+ String ip = WebUtil.getIP();
+
+ // 增加账号错误锁定次数
+ int userFailCount = Func.toInt(bladeRedis.get(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, account)), 0);
+ bladeRedis.setEx(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, account), userFailCount + 1, Duration.ofMinutes(30));
+
+ // 增加IP错误锁定次数
+ int ipFailCount = Func.toInt(bladeRedis.get(CacheNames.IP_FAIL_KEY + ip), 0);
+ bladeRedis.setEx(CacheNames.IP_FAIL_KEY + ip, ipFailCount + 1, Duration.ofMinutes(30));
+ }
+
+ /**
+ * 处理登录成功,清除失败缓存
+ *
+ * @param bladeRedis Redis缓存
+ * @param tenantId 租户ID
+ * @param account 账号
+ */
+ public static void handleLoginSuccess(BladeRedis bladeRedis, String tenantId, String account) {
+ String ip = WebUtil.getIP();
+
+ // 清除账号登录失败缓存
+ bladeRedis.del(CacheNames.tenantKey(tenantId, CacheNames.USER_FAIL_KEY, account));
+
+ // 清除IP登录失败缓存
+ bladeRedis.del(CacheNames.IP_FAIL_KEY + ip);
+ }
+
}
diff --git a/blade-auth/src/test/java/org/springblade/test/SignKeyGenerator.java b/blade-auth/src/test/java/org/springblade/test/SignKeyGenerator.java
new file mode 100644
index 00000000..0878fc35
--- /dev/null
+++ b/blade-auth/src/test/java/org/springblade/test/SignKeyGenerator.java
@@ -0,0 +1,24 @@
+package org.springblade.test;
+
+import org.springblade.core.tool.utils.AesUtil;
+import org.springblade.core.tool.utils.RandomType;
+import org.springblade.core.tool.utils.StringUtil;
+
+/**
+ * signKey生成器
+ *
+ * @author Chill
+ */
+public class SignKeyGenerator {
+
+ public static void main(String[] args) {
+ System.out.println("=========== blade.token.sign-key 配置如下 ==============");
+ System.out.println("#blade配置\n" +
+ "blade:\n" +
+ " token:\n" +
+ " sign-key: " + StringUtil.random(32, RandomType.ALL) +"\n" +
+ " aes-key: " + AesUtil.genAesKey() );
+ System.out.println("=======================================================");
+ }
+
+}
diff --git a/blade-auth/src/test/java/org/springblade/test/Sm2KeyGenerator.java b/blade-auth/src/test/java/org/springblade/test/Sm2KeyGenerator.java
new file mode 100644
index 00000000..e527cbf6
--- /dev/null
+++ b/blade-auth/src/test/java/org/springblade/test/Sm2KeyGenerator.java
@@ -0,0 +1,46 @@
+package org.springblade.test;
+
+import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
+import org.bouncycastle.util.encoders.Hex;
+import org.springblade.core.tool.utils.SM2Util;
+import org.springblade.core.tool.utils.StringPool;
+
+/**
+ * signKey生成器
+ *
+ * @author Chill
+ */
+public class Sm2KeyGenerator {
+
+ public static void main(String[] args) {
+ System.out.println("================ blade.auth 配置如下 =================");
+ AsymmetricCipherKeyPair keyPair = SM2Util.generateKeyPair();
+ String publicKey = SM2Util.getPublicKeyString(keyPair);
+ String privateKey = SM2Util.getPrivateKeyString(keyPair);
+ System.out.println("#blade配置 \n" +
+ "blade:\n" +
+ " auth:\n" +
+ " public-key: " + publicKey + "\n" +
+ " private-key: " + privateKey);
+ System.out.println("=======================================================");
+ System.out.println(StringPool.EMPTY);
+ System.out.println("============== saber website.js 配置如下 ===============");
+ System.out.println("//saber配置\n" +
+ "auth: {\n" +
+ " publicKey: '" + publicKey + "',\n" +
+ "}");
+ System.out.println("=======================================================");
+ System.out.println(StringPool.EMPTY);
+ System.out.println("============== 密码:[admin] 加密流程如下 ================");
+ String password = "admin";
+ byte[] encryptedData = SM2Util.encrypt(password, publicKey);
+ String decryptedText = SM2Util.decrypt(encryptedData, privateKey);
+ System.out.println("加密前: " + password);
+ System.out.println("加密后: " + Hex.toHexString(encryptedData));
+ System.out.println("解密后: " + decryptedText);
+ System.out.println("请注意: 此密文为前端加密后调用token接口的密码参数");
+ System.out.println("=======================================================");
+
+ }
+
+}
diff --git a/blade-common/pom.xml b/blade-common/pom.xml
index 2e7fee04..4f014b10 100644
--- a/blade-common/pom.xml
+++ b/blade-common/pom.xml
@@ -5,25 +5,26 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,9 +24,31 @@ public interface CacheNames {
String NOTICE_ONE = "notice:one";
- String DICT_VALUE = "dict:value";
- String DICT_LIST = "dict:list";
+ /**
+ * 验证码key
+ */
+ String CAPTCHA_KEY = "blade:auth::blade:captcha:";
- String CAPTCHA_KEY = "blade:auth::captcha:";
+ /**
+ * 登录失败key
+ */
+ String USER_FAIL_KEY = "blade:user::blade:fail:";
+
+ /**
+ * IP锁定key
+ */
+ String IP_FAIL_KEY = "blade:ip::blade:fail:";
+
+ /**
+ * 返回租户格式的key
+ *
+ * @param tenantId 租户编号
+ * @param cacheKey 缓存key
+ * @param cacheKeyValue 缓存key值
+ * @return tenantKey
+ */
+ static String tenantKey(String tenantId, String cacheKey, String cacheKeyValue) {
+ return tenantId.concat(":").concat(cacheKey).concat(cacheKeyValue);
+ }
}
diff --git a/blade-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java b/blade-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java
index e8bfb1ab..ed34ca23 100644
--- a/blade-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java
+++ b/blade-common/src/main/java/org/springblade/common/config/BladeCommonConfiguration.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
*
* @author Chill
*/
-@Configuration
+@Configuration(proxyBeanMethods = false)
@AllArgsConstructor
public class BladeCommonConfiguration {
diff --git a/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java b/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java
index 698604fa..0c859e62 100644
--- a/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java
+++ b/blade-common/src/main/java/org/springblade/common/constant/CommonConstant.java
@@ -33,4 +33,14 @@ public interface CommonConstant {
*/
String DEFAULT_PASSWORD = "123456";
+ /**
+ * 数据权限类型
+ */
+ Integer DATA_SCOPE_CATEGORY = 1;
+
+ /**
+ * 接口权限类型
+ */
+ Integer API_SCOPE_CATEGORY = 2;
+
}
diff --git a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
index abc21078..76136482 100644
--- a/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
+++ b/blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
@@ -9,6 +9,16 @@
*/
public interface LauncherConstant {
+ /**
+ * nacos 用户名
+ */
+ String NACOS_USERNAME = "nacos";
+
+ /**
+ * nacos 密码
+ */
+ String NACOS_PASSWORD = "nacos";
+
/**
* nacos namespace id
*/
@@ -44,21 +54,6 @@ public interface LauncherConstant {
*/
String SENTINEL_TEST_ADDR = "172.30.0.58:8858";
- /**
- * zipkin dev 地址
- */
- String ZIPKIN_DEV_ADDR = "http://127.0.0.1:9411";
-
- /**
- * zipkin prod 地址
- */
- String ZIPKIN_PROD_ADDR = "http://172.30.0.58:9411";
-
- /**
- * zipkin test 地址
- */
- String ZIPKIN_TEST_ADDR = "http://172.30.0.58:9411";
-
/**
* 动态获取nacos地址
*
@@ -93,21 +88,4 @@ static String sentinelAddr(String profile) {
}
}
- /**
- * 动态获取zipkin地址
- *
- * @param profile 环境变量
- * @return addr
- */
- static String zipkinAddr(String profile) {
- switch (profile) {
- case (AppConstant.PROD_CODE):
- return ZIPKIN_PROD_ADDR;
- case (AppConstant.TEST_CODE):
- return ZIPKIN_TEST_ADDR;
- default:
- return ZIPKIN_DEV_ADDR;
- }
- }
-
}
diff --git a/blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java b/blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
index 150c14cb..f998f9c3 100644
--- a/blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
+++ b/blade-common/src/main/java/org/springblade/common/launch/LauncherServiceImpl.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,9 +15,9 @@
*/
package org.springblade.common.launch;
-import org.springblade.common.constant.CommonConstant;
import org.springblade.common.constant.LauncherConstant;
import org.springblade.core.launch.service.LauncherService;
+import org.springblade.core.launch.utils.PropsUtil;
import org.springframework.boot.builder.SpringApplicationBuilder;
import java.util.Properties;
@@ -32,10 +32,11 @@ public class LauncherServiceImpl implements LauncherService {
@Override
public void launcher(SpringApplicationBuilder builder, String appName, String profile) {
Properties props = System.getProperties();
- props.setProperty("spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
- props.setProperty("spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
- props.setProperty("spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
- props.setProperty("spring.zipkin.base-url", LauncherConstant.zipkinAddr(profile));
+ PropsUtil.setProperty(props, "spring.cloud.nacos.username", LauncherConstant.NACOS_USERNAME);
+ PropsUtil.setProperty(props, "spring.cloud.nacos.password", LauncherConstant.NACOS_PASSWORD);
+ PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.server-addr", LauncherConstant.nacosAddr(profile));
+ PropsUtil.setProperty(props, "spring.cloud.nacos.config.server-addr", LauncherConstant.nacosAddr(profile));
+ PropsUtil.setProperty(props, "spring.cloud.sentinel.transport.dashboard", LauncherConstant.sentinelAddr(profile));
}
}
diff --git a/blade-common/src/main/java/org/springblade/common/tool/CommonUtil.java b/blade-common/src/main/java/org/springblade/common/tool/CommonUtil.java
index 4fd9d10e..5785606b 100644
--- a/blade-common/src/main/java/org/springblade/common/tool/CommonUtil.java
+++ b/blade-common/src/main/java/org/springblade/common/tool/CommonUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-service/blade-user/src/main/java/org/springblade/system/user/UserApplication.java b/blade-common/src/main/java/org/springblade/common/tool/PropsUtil.java
similarity index 50%
rename from blade-service/blade-user/src/main/java/org/springblade/system/user/UserApplication.java
rename to blade-common/src/main/java/org/springblade/common/tool/PropsUtil.java
index 938a342e..0801fb22 100644
--- a/blade-service/blade-user/src/main/java/org/springblade/system/user/UserApplication.java
+++ b/blade-common/src/main/java/org/springblade/common/tool/PropsUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,24 +13,30 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springblade.system.user;
+package org.springblade.common.tool;
-import org.springblade.core.launch.BladeApplication;
-import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
-import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.util.StringUtils;
+
+import java.util.Properties;
/**
- * 用户启动器
+ * 配置工具类
*
* @author Chill
*/
-@SpringCloudApplication
-@EnableFeignClients(AppConstant.BASE_PACKAGES)
-public class UserApplication {
+public class PropsUtil {
- public static void main(String[] args) {
- BladeApplication.run(AppConstant.APPLICATION_USER_NAME, UserApplication.class, args);
+ /**
+ * 设置配置值,已存在则跳过
+ *
+ * @param props property
+ * @param key key
+ * @param value value
+ */
+ public static void setProperty(Properties props, String key, String value) {
+ if (StringUtils.isEmpty(props.getProperty(key))) {
+ props.setProperty(key, value);
+ }
}
}
diff --git a/blade-gateway/Dockerfile b/blade-gateway/Dockerfile
index e0ae9f9c..250bc00c 100644
--- a/blade-gateway/Dockerfile
+++ b/blade-gateway/Dockerfile
@@ -1,6 +1,6 @@
-FROM anapsix/alpine-java:8_server-jre_unlimited
+FROM bladex/alpine-java:openjdk21_cn_slim
-MAINTAINER smallchill@163.com
+MAINTAINER bladejava@qq.com
RUN mkdir -p /blade/gateway
@@ -10,6 +10,6 @@ EXPOSE 80
ADD ./target/blade-gateway.jar ./app.jar
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
diff --git a/blade-gateway/pom.xml b/blade-gateway/pom.xml
index 5e7b147c..fa1d5ee4 100644
--- a/blade-gateway/pom.xml
+++ b/blade-gateway/pom.xml
@@ -5,13 +5,12 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,20 +15,18 @@
*/
package org.springblade.gateway;
-import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.launch.BladeApplication;
-import org.springframework.cloud.client.SpringCloudApplication;
-import org.springframework.cloud.netflix.hystrix.EnableHystrix;
-import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 项目启动
*
* @author Chill
*/
-@EnableHystrix
-@EnableScheduling
-@SpringCloudApplication
+@EnableDiscoveryClient
+@SpringBootApplication
public class GateWayApplication {
public static void main(String[] args) {
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/config/ErrorHandlerConfiguration.java b/blade-gateway/src/main/java/org/springblade/gateway/config/ErrorHandlerConfiguration.java
deleted file mode 100644
index 8caaccef..00000000
--- a/blade-gateway/src/main/java/org/springblade/gateway/config/ErrorHandlerConfiguration.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.springblade.gateway.config;
-
-
-import org.springblade.gateway.handler.ErrorExceptionHandler;
-import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.boot.autoconfigure.web.ResourceProperties;
-import org.springframework.boot.autoconfigure.web.ServerProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.web.reactive.error.ErrorAttributes;
-import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.http.codec.ServerCodecConfigurer;
-import org.springframework.web.reactive.result.view.ViewResolver;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * 异常处理配置类
- *
- * @author Chill
- */
-@Configuration
-@EnableConfigurationProperties({ServerProperties.class, ResourceProperties.class})
-public class ErrorHandlerConfiguration {
-
- private final ServerProperties serverProperties;
-
- private final ApplicationContext applicationContext;
-
- private final ResourceProperties resourceProperties;
-
- private final List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springblade.gateway.config;
+
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.gateway.props.JwtProperties;
+import org.springblade.gateway.utils.JwtUtil;
+import org.springframework.beans.factory.SmartInitializingSingleton;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * JWT配置信息
+ *
+ * @author Chill
+ */
+@Slf4j
+@Configuration(proxyBeanMethods = false)
+@AllArgsConstructor
+@EnableConfigurationProperties({JwtProperties.class})
+public class JwtConfiguration implements SmartInitializingSingleton {
+
+ private final JwtProperties properties;
+
+ @Override
+ public void afterSingletonsInstantiated() {
+ JwtUtil.setJwtProperties(properties);
+ }
+}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/config/RouterFunctionConfiguration.java b/blade-gateway/src/main/java/org/springblade/gateway/config/RouterFunctionConfiguration.java
index ed519825..e2ef767c 100644
--- a/blade-gateway/src/main/java/org/springblade/gateway/config/RouterFunctionConfiguration.java
+++ b/blade-gateway/src/main/java/org/springblade/gateway/config/RouterFunctionConfiguration.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,18 +18,13 @@
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springblade.gateway.handler.SwaggerResourceHandler;
-import org.springblade.gateway.handler.SwaggerSecurityHandler;
-import org.springblade.gateway.handler.SwaggerUiHandler;
+import org.springblade.gateway.filter.GatewayFilter;
import org.springblade.gateway.props.AuthProperties;
-import org.springblade.gateway.props.RouteProperties;
+import org.springblade.gateway.props.RequestProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.http.MediaType;
-import org.springframework.web.reactive.function.server.RequestPredicates;
-import org.springframework.web.reactive.function.server.RouterFunction;
-import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.server.WebFilter;
/**
* 路由配置信息
@@ -37,23 +32,17 @@
* @author Chill
*/
@Slf4j
-@Configuration
+@Configuration(proxyBeanMethods = false)
@AllArgsConstructor
-@EnableConfigurationProperties({RouteProperties.class, AuthProperties.class})
+@EnableConfigurationProperties({AuthProperties.class, RequestProperties.class})
public class RouterFunctionConfiguration {
- private final SwaggerResourceHandler swaggerResourceHandler;
- private final SwaggerSecurityHandler swaggerSecurityHandler;
- private final SwaggerUiHandler swaggerUiHandler;
-
+ /**
+ * 全局配置
+ */
@Bean
- public RouterFunction routerFunction() {
- return RouterFunctions.route(RequestPredicates.GET("/swagger-resources")
- .and(RequestPredicates.accept(MediaType.ALL)), swaggerResourceHandler)
- .andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui")
- .and(RequestPredicates.accept(MediaType.ALL)), swaggerUiHandler)
- .andRoute(RequestPredicates.GET("/swagger-resources/configuration/security")
- .and(RequestPredicates.accept(MediaType.ALL)), swaggerSecurityHandler);
+ public WebFilter gatewayFilter(RequestProperties requestProperties) {
+ return new GatewayFilter(requestProperties);
}
}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/config/SwaggerAggregationConfiguration.java b/blade-gateway/src/main/java/org/springblade/gateway/config/SwaggerAggregationConfiguration.java
new file mode 100644
index 00000000..dfc3c2b7
--- /dev/null
+++ b/blade-gateway/src/main/java/org/springblade/gateway/config/SwaggerAggregationConfiguration.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.config;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.gateway.props.SwaggerDiscoveryProperties;
+import org.springdoc.core.properties.AbstractSwaggerUiConfigProperties.SwaggerUrl;
+import org.springdoc.core.properties.SwaggerUiConfigProperties;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.util.LinkedHashSet;
+import java.util.stream.Collectors;
+
+/**
+ * 接口文档聚合配置
+ *
+ *
+ * 从 注册中心 拉取在册服务动态生成聚合下拉列表,无需手工维护 文档路径;各服务文档经网关同源路由 /{serviceId}/v3/api-docs
+ * 暴露、规避跨域。swagger-config 端点每次请求都会重新拷贝 SwaggerUiConfigProperties 的 文档路径,故运行期整表替换即在
+ * 下一次拉取时生效。
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java b/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java
index 47adfaea..cef89b25 100644
--- a/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java
+++ b/blade-gateway/src/main/java/org/springblade/gateway/filter/AuthFilter.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,15 +15,17 @@
*/
package org.springblade.gateway.filter;
+import com.alibaba.nacos.common.utils.StringUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
+import org.springblade.core.launch.props.BladeProperties;
import org.springblade.gateway.props.AuthProperties;
import org.springblade.gateway.provider.AuthProvider;
import org.springblade.gateway.provider.ResponseProvider;
+import org.springblade.gateway.utils.JwtCrypto;
import org.springblade.gateway.utils.JwtUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
@@ -32,12 +34,15 @@
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
+import static org.springblade.gateway.utils.JwtCrypto.BLADE_CRYPTO_AES_KEY;
+
/**
* 鉴权认证
*
@@ -47,8 +52,10 @@
@Component
@AllArgsConstructor
public class AuthFilter implements GlobalFilter, Ordered {
- private AuthProperties authProperties;
- private ObjectMapper objectMapper;
+ private final AuthProperties authProperties;
+ private final ObjectMapper objectMapper;
+ private final BladeProperties bladeProperties;
+ private final AntPathMatcher antPathMatcher = new AntPathMatcher();
@Override
public Mono
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.filter;
+
+import lombok.RequiredArgsConstructor;
+import org.springblade.gateway.props.RequestProperties;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.jspecify.annotations.NonNull;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.util.PatternMatchUtils;
+import org.springframework.web.cors.reactive.CorsUtils;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 全局拦截器
+ *
+ * @author Chill
+ */
+@RequiredArgsConstructor
+public class GatewayFilter implements WebFilter, Ordered {
+
+ /**
+ * 请求配置
+ */
+ private final RequestProperties requestProperties;
+ /**
+ * 路径匹配
+ */
+ private final AntPathMatcher antPathMatcher = new AntPathMatcher();
+
+ /**
+ * 默认拦截地址
+ */
+ private final List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.filter;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.jspecify.annotations.NonNull;
+import org.springblade.gateway.provider.RequestProvider;
+import org.springblade.gateway.provider.ResponseProvider;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.util.UriUtils;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.List;
+
+/**
+ * 内部接口隔离,拒绝外部对 Feign 内部接口的访问。
+ *
+ * Feign 接口统一以 {@code /feign/client} 为前缀,仅供服务间调用。服务间调用经注册中心直连、不经过网关,
+ * 故抵达网关且命中该前缀的请求必来自外部,一律拒绝,与是否持有合法令牌无关。
+ *
+ * 前缀由连续两段构成,判定依赖段间的相邻关系,故归一化须与容器映射前的处理及其顺序保持等价,
+ * 否则相邻关系会被路径变形撑开而失配。归一化按容器顺序进行:切分 → 剥离矩阵参数 → 解码 → 再次切分 → 消解相对段。
+ *
+ * @author Chill
+ */
+@Slf4j
+@Component
+@AllArgsConstructor
+public class InnerFilter implements GlobalFilter, Ordered {
+
+ private static final String MSG_INNER_FORBIDDEN = "禁止访问内部接口";
+
+ /**
+ * Feign 内部接口保留段序列,业务接口不得占用
+ */
+ private static final String[] FEIGN_SEGMENTS = {"feign", "client"};
+
+ /**
+ * 路径分隔符,反斜杠一并纳入以对齐容器归一化
+ */
+ private static final String PATH_SEPARATORS = "/\\";
+
+ /**
+ * 段内矩阵参数分隔符
+ */
+ private static final char MATRIX_SEPARATOR = ';';
+
+ /**
+ * 相对路径段
+ */
+ private static final String CURRENT_SEGMENT = ".";
+
+ private static final String PARENT_SEGMENT = "..";
+
+ private final ObjectMapper objectMapper;
+
+ @NonNull
+ @Override
+ public Mono
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,17 +13,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.springblade.gateway.handler;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
import org.springblade.gateway.provider.ResponseProvider;
-import org.springframework.boot.autoconfigure.web.ErrorProperties;
-import org.springframework.boot.autoconfigure.web.ResourceProperties;
-import org.springframework.boot.autoconfigure.web.reactive.error.DefaultErrorWebExceptionHandler;
-import org.springframework.boot.web.reactive.error.ErrorAttributes;
-import org.springframework.cloud.gateway.support.NotFoundException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.web.reactive.function.server.*;
+import org.springframework.boot.webflux.error.ErrorWebExceptionHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.core.io.buffer.DataBufferFactory;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ResponseStatusException;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
import java.util.Map;
@@ -32,62 +38,51 @@
*
* @author Chill
*/
-public class ErrorExceptionHandler extends DefaultErrorWebExceptionHandler {
+@Order(-1)
+@Configuration(proxyBeanMethods = false)
+@RequiredArgsConstructor
+public class ErrorExceptionHandler implements ErrorWebExceptionHandler {
- public ErrorExceptionHandler(ErrorAttributes errorAttributes, ResourceProperties resourceProperties,
- ErrorProperties errorProperties, ApplicationContext applicationContext) {
- super(errorAttributes, resourceProperties, errorProperties, applicationContext);
- }
+ private final ObjectMapper objectMapper;
- /**
- * 获取异常属性
- */
@Override
- protected Map
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springblade.gateway.handler;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Component;
-import org.springframework.web.reactive.function.BodyInserters;
-import org.springframework.web.reactive.function.server.HandlerFunction;
-import org.springframework.web.reactive.function.server.ServerRequest;
-import org.springframework.web.reactive.function.server.ServerResponse;
-import reactor.core.publisher.Mono;
-import springfox.documentation.swagger.web.SwaggerResourcesProvider;
-
-/**
- * SwaggerResourceHandler
- *
- * @author lengleng
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class SwaggerResourceHandler implements HandlerFunction
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springblade.gateway.handler;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Component;
-import org.springframework.web.reactive.function.BodyInserters;
-import org.springframework.web.reactive.function.server.HandlerFunction;
-import org.springframework.web.reactive.function.server.ServerRequest;
-import org.springframework.web.reactive.function.server.ServerResponse;
-import reactor.core.publisher.Mono;
-import springfox.documentation.swagger.web.SecurityConfigurationBuilder;
-
-/**
- * SwaggerSecurityHandler
- *
- * @author lengleng
- */
-@Slf4j
-@Component
-public class SwaggerSecurityHandler implements HandlerFunction
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springblade.gateway.handler;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Component;
-import org.springframework.web.reactive.function.BodyInserters;
-import org.springframework.web.reactive.function.server.HandlerFunction;
-import org.springframework.web.reactive.function.server.ServerRequest;
-import org.springframework.web.reactive.function.server.ServerResponse;
-import reactor.core.publisher.Mono;
-import springfox.documentation.swagger.web.UiConfigurationBuilder;
-
-/**
- * SwaggerUiHandler
- *
- * @author lengleng
- */
-@Slf4j
-@Component
-public class SwaggerUiHandler implements HandlerFunction
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/props/JwtProperties.java b/blade-gateway/src/main/java/org/springblade/gateway/props/JwtProperties.java
new file mode 100644
index 00000000..7baef528
--- /dev/null
+++ b/blade-gateway/src/main/java/org/springblade/gateway/props/JwtProperties.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.props;
+
+import io.jsonwebtoken.JwtException;
+import lombok.Data;
+import org.springblade.core.launch.constant.TokenConstant;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * JWT配置
+ *
+ * @author Chill
+ */
+@Data
+@ConfigurationProperties("blade.token")
+public class JwtProperties {
+
+ /**
+ * token是否有状态
+ */
+ private Boolean state = Boolean.FALSE;
+
+ /**
+ * 是否只可同时在线一人
+ */
+ private Boolean single = Boolean.FALSE;
+
+ /**
+ * token签名
+ */
+ private String signKey = "";
+
+ /**
+ * 获取签名规则
+ */
+ public String getSignKey() {
+ if (this.signKey.length() < TokenConstant.SIGN_KEY_LENGTH) {
+ throw new JwtException("请配置 blade.token.sign-key 的值, 长度32位以上");
+ }
+ return this.signKey;
+ }
+
+}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/props/RequestProperties.java b/blade-gateway/src/main/java/org/springblade/gateway/props/RequestProperties.java
new file mode 100644
index 00000000..3250e008
--- /dev/null
+++ b/blade-gateway/src/main/java/org/springblade/gateway/props/RequestProperties.java
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.props;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Request配置类
+ *
+ * @author Chill
+ */
+@Data
+@ConfigurationProperties("blade.request")
+public class RequestProperties {
+
+ /**
+ * 开启自定义request
+ */
+ private Boolean enabled = true;
+
+ /**
+ * 放行url
+ */
+ private List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.props;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 接口文档聚合发现配置
+ *
+ * @author Chill
+ */
+@Getter
+@Setter
+@ConfigurationProperties("blade.swagger.discovery")
+public class SwaggerDiscoveryProperties {
+
+ /**
+ * 各微服务 OpenAPI 文档路径
+ */
+ private String apiDocsPath = "/v3/api-docs";
+
+ /**
+ * 聚合下拉项刷新间隔(毫秒)
+ */
+ private long refreshInterval = 30000L;
+
+ /**
+ * 不纳入聚合的服务,网关自身与无业务文档的服务应排除
+ */
+ private List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,34 +27,34 @@
*/
public class AuthProvider {
- public static String TARGET = "/**";
- public static String REPLACEMENT = "";
public static String AUTH_KEY = TokenConstant.HEADER;
- private static List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.provider;
+
+import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.web.server.ServerWebExchange;
+
+import java.net.URI;
+import java.util.LinkedHashSet;
+
+/**
+ * RequestProvider
+ *
+ * @author Chill
+ */
+public class RequestProvider {
+
+ /**
+ * 获取原始请求路径
+ *
+ * 取裁剪服务名前缀之前的路径,避免路径判定依赖裁剪结果。返回未解码的 rawPath 且不含查询串,
+ * 解码与归一化交由判定方按自身语义处理,此处不做加工。
+ *
+ * @param exchange 当前请求上下文
+ * @return 原始请求路径(未解码,不含查询串)
+ */
+ public static String getOriginalRequestPath(ServerWebExchange exchange) {
+ ServerHttpRequest request = exchange.getRequest();
+ LinkedHashSet
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ public static Map
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springblade.gateway.provider;
-
-import lombok.AllArgsConstructor;
-import org.springblade.gateway.props.RouteProperties;
-import org.springblade.gateway.props.RouteResource;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
-import springfox.documentation.swagger.web.SwaggerResource;
-import springfox.documentation.swagger.web.SwaggerResourcesProvider;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 聚合接口文档注册
- *
- * @author Chill
- */
-@Primary
-@Component
-@AllArgsConstructor
-public class SwaggerProvider implements SwaggerResourcesProvider {
- private static final String API_URI = "/v2/api-docs";
-
- private RouteProperties routeProperties;
-
- @Override
- public List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.gateway.utils;
+
+import lombok.SneakyThrows;
+import org.jspecify.annotations.Nullable;
+import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Objects;
+
+/**
+ * JwtCrypto
+ *
+ * @author Chill
+ */
+public class JwtCrypto {
+
+ public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
+ public static final String BLADE_CRYPTO_AES_KEY = "blade.token.aes-key";
+
+
+ /**
+ * Base64加密
+ *
+ * @param content 文本内容
+ * @param aesTextKey 文本密钥
+ * @return {String}
+ */
+ public static String encryptToString(String content, String aesTextKey) {
+ return Base64.getEncoder().encodeToString(encrypt(content, aesTextKey));
+ }
+
+ /**
+ * Base64加密
+ *
+ * @param content 内容
+ * @param aesTextKey 文本密钥
+ * @return {String}
+ */
+ public static String encryptToString(byte[] content, String aesTextKey) {
+ return Base64.getEncoder().encodeToString(encrypt(content, aesTextKey));
+ }
+
+ /**
+ * 加密
+ *
+ * @param content 文本内容
+ * @param aesTextKey 文本密钥
+ * @return byte[]
+ */
+ public static byte[] encrypt(String content, String aesTextKey) {
+ return encrypt(content.getBytes(DEFAULT_CHARSET), aesTextKey);
+ }
+
+ /**
+ * 加密
+ *
+ * @param content 文本内容
+ * @param charset 编码
+ * @param aesTextKey 文本密钥
+ * @return byte[]
+ */
+ public static byte[] encrypt(String content, Charset charset, String aesTextKey) {
+ return encrypt(content.getBytes(charset), aesTextKey);
+ }
+
+ /**
+ * 加密
+ *
+ * @param content 内容
+ * @param aesTextKey 文本密钥
+ * @return byte[]
+ */
+ public static byte[] encrypt(byte[] content, String aesTextKey) {
+ return encrypt(content, Objects.requireNonNull(aesTextKey).getBytes(DEFAULT_CHARSET));
+ }
+
+ /**
+ * Base64解密
+ *
+ * @param content 文本内容
+ * @param aesTextKey 文本密钥
+ * @return {String}
+ */
+ @Nullable
+ public static String decryptToString(@Nullable String content, @Nullable String aesTextKey) {
+ if (!StringUtils.hasText(content) || !StringUtils.hasText(aesTextKey)) {
+ return null;
+ }
+ byte[] hexBytes = decrypt(Base64.getDecoder().decode(content.getBytes(DEFAULT_CHARSET)), aesTextKey);
+ return new String(hexBytes, DEFAULT_CHARSET);
+ }
+
+
+ /**
+ * 解密
+ *
+ * @param content 内容
+ * @param aesTextKey 文本密钥
+ * @return byte[]
+ */
+ public static byte[] decrypt(byte[] content, String aesTextKey) {
+ return decrypt(content, Objects.requireNonNull(aesTextKey).getBytes(DEFAULT_CHARSET));
+ }
+
+
+ /**
+ * 解密
+ *
+ * @param content 内容
+ * @param aesKey 密钥
+ * @return byte[]
+ */
+ public static byte[] encrypt(byte[] content, byte[] aesKey) {
+ return aes(Pkcs7Encoder.encode(content), aesKey, Cipher.ENCRYPT_MODE);
+ }
+
+ /**
+ * 加密
+ *
+ * @param encrypted 内容
+ * @param aesKey 密钥
+ * @return byte[]
+ */
+ public static byte[] decrypt(byte[] encrypted, byte[] aesKey) {
+ return Pkcs7Encoder.decode(aes(encrypted, aesKey, Cipher.DECRYPT_MODE));
+ }
+
+ /**
+ * ase加密
+ *
+ * @param encrypted 内容
+ * @param aesKey 密钥
+ * @param mode 模式
+ * @return byte[]
+ */
+ @SneakyThrows
+ private static byte[] aes(byte[] encrypted, byte[] aesKey, int mode) {
+ Assert.isTrue(aesKey.length == 32, "IllegalAesKey, aesKey's length must be 32");
+ Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+ IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+ cipher.init(mode, keySpec, iv);
+ return cipher.doFinal(encrypted);
+ }
+
+ /**
+ * 提供基于PKCS7算法的加解密接口.
+ */
+ private static class Pkcs7Encoder {
+ private static final int BLOCK_SIZE = 32;
+
+ private static byte[] encode(byte[] src) {
+ int count = src.length;
+ // 计算需要填充的位数
+ int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+ // 获得补位所用的字符
+ byte pad = (byte) (amountToPad & 0xFF);
+ byte[] pads = new byte[amountToPad];
+ for (int index = 0; index < amountToPad; index++) {
+ pads[index] = pad;
+ }
+ int length = count + amountToPad;
+ byte[] dest = new byte[length];
+ System.arraycopy(src, 0, dest, 0, count);
+ System.arraycopy(pads, 0, dest, count, amountToPad);
+ return dest;
+ }
+
+ private static byte[] decode(byte[] decrypted) {
+ int pad = decrypted[decrypted.length - 1];
+ if (pad < 1 || pad > BLOCK_SIZE) {
+ pad = 0;
+ }
+ if (pad > 0) {
+ return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+ }
+ return decrypted;
+ }
+ }
+}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/utils/JwtUtil.java b/blade-gateway/src/main/java/org/springblade/gateway/utils/JwtUtil.java
index 2d05163d..f7163caf 100644
--- a/blade-gateway/src/main/java/org/springblade/gateway/utils/JwtUtil.java
+++ b/blade-gateway/src/main/java/org/springblade/gateway/utils/JwtUtil.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,7 +17,10 @@
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.security.Keys;
+import lombok.Getter;
import org.springblade.core.launch.constant.TokenConstant;
+import org.springblade.gateway.props.JwtProperties;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
@@ -29,27 +32,68 @@
*/
public class JwtUtil {
- public static String SIGN_KEY = TokenConstant.SIGN_KEY;
public static String BEARER = TokenConstant.BEARER;
+ public static String CRYPTO = TokenConstant.CRYPTO;
public static Integer AUTH_LENGTH = 7;
- public static String BASE64_SECURITY = Base64.getEncoder().encodeToString(SIGN_KEY.getBytes(StandardCharsets.UTF_8));
+ /**
+ * jwt配置
+ */
+ @Getter
+ private static JwtProperties jwtProperties;
+
+ public static void setJwtProperties(JwtProperties properties) {
+ if (JwtUtil.jwtProperties == null) {
+ JwtUtil.jwtProperties = properties;
+ }
+ }
/**
- * 获取token串
+ * 签名加密
+ */
+ public static String getBase64Security() {
+ return Base64.getEncoder().encodeToString(getJwtProperties().getSignKey().getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * 获取请求传递的token串
*
* @param auth token
* @return String
*/
public static String getToken(String auth) {
+ if (isBearer(auth) || isCrypto(auth)) {
+ return auth.substring(AUTH_LENGTH);
+ }
+ return null;
+ }
+
+ /**
+ * 判断token类型为bearer
+ *
+ * @param auth token
+ * @return String
+ */
+ public static Boolean isBearer(String auth) {
if ((auth != null) && (auth.length() > AUTH_LENGTH)) {
String headStr = auth.substring(0, 6).toLowerCase();
- if (headStr.compareTo(BEARER) == 0) {
- auth = auth.substring(7);
- }
- return auth;
+ return headStr.compareTo(BEARER) == 0;
}
- return null;
+ return false;
+ }
+
+ /**
+ * 判断token类型为crypto
+ *
+ * @param auth token
+ * @return String
+ */
+ public static Boolean isCrypto(String auth) {
+ if ((auth != null) && (auth.length() > AUTH_LENGTH)) {
+ String headStr = auth.substring(0, 6).toLowerCase();
+ return headStr.compareTo(CRYPTO) == 0;
+ }
+ return false;
}
/**
@@ -60,9 +104,10 @@ public static String getToken(String auth) {
*/
public static Claims parseJWT(String jsonWebToken) {
try {
- return Jwts.parserBuilder()
- .setSigningKey(Base64.getDecoder().decode(JwtUtil.BASE64_SECURITY)).build()
- .parseClaimsJws(jsonWebToken).getBody();
+ return Jwts.parser()
+ .verifyWith(Keys.hmacShaKeyFor(Base64.getDecoder().decode(getBase64Security()))).build()
+ .parseSignedClaims(jsonWebToken)
+ .getPayload();
} catch (Exception ex) {
return null;
}
diff --git a/blade-gateway/src/main/resources/application-dev.yml b/blade-gateway/src/main/resources/application-dev.yml
new file mode 100644
index 00000000..b8eaf546
--- /dev/null
+++ b/blade-gateway/src/main/resources/application-dev.yml
@@ -0,0 +1,11 @@
+blade:
+ #多团队协作服务配置
+ loadbalancer:
+ #开启配置
+ enabled: true
+ #灰度版本
+ #version: 3.0.0
+ #负载均衡优先调用的ip段
+ prior-ip-pattern:
+ - 192.168.0.*
+ - 127.0.0.1
diff --git a/blade-gateway/src/main/resources/application.yml b/blade-gateway/src/main/resources/application.yml
new file mode 100644
index 00000000..a0e5c623
--- /dev/null
+++ b/blade-gateway/src/main/resources/application.yml
@@ -0,0 +1,18 @@
+# 接口文档聚合:各微服务经网关同源路由 /{serviceId}/v3/api-docs 暴露,由网关 Swagger-UI 下拉聚合
+springdoc:
+ api-docs:
+ # 必须保持开启,关闭会连锁禁用聚合所依赖的 SwaggerUiConfigProperties
+ enabled: true
+ swagger-ui:
+ # 去掉默认的 petstore 示例下拉项
+ disable-swagger-default-url: true
+blade:
+ swagger:
+ discovery:
+ # 聚合下拉项刷新间隔(毫秒)
+ refresh-interval: 30000
+ # 无业务文档、不纳入聚合的服务
+ excluded-services:
+ - blade-gateway
+ - blade-admin
+ - blade-log
diff --git a/blade-gateway/src/main/resources/bootstrap.yml b/blade-gateway/src/main/resources/bootstrap.yml
index e875240d..75094876 100644
--- a/blade-gateway/src/main/resources/bootstrap.yml
+++ b/blade-gateway/src/main/resources/bootstrap.yml
@@ -3,26 +3,14 @@ server:
spring:
cloud:
- discovery:
- reactive:
- enabled: false
gateway:
- discovery:
- locator:
- enabled: true
+ server:
+ webflux:
+ discovery:
+ locator:
+ enabled: true
loadbalancer:
retry:
enabled: true
-# 聚合文档配置
-blade:
- document:
- resources:
- - name: 授权模块
- location: /blade-auth
- - name: 工作台模块
- location: /blade-desk
- - name: 系统模块
- location: /blade-system
-
diff --git a/blade-ops/blade-admin/Dockerfile b/blade-ops/blade-admin/Dockerfile
index 67119b9b..a5c26a87 100644
--- a/blade-ops/blade-admin/Dockerfile
+++ b/blade-ops/blade-admin/Dockerfile
@@ -1,6 +1,6 @@
-FROM anapsix/alpine-java:8_server-jre_unlimited
+FROM bladex/alpine-java:openjdk21_cn_slim
-MAINTAINER smallchill@163.com
+MAINTAINER bladejava@qq.com
RUN mkdir -p /blade/admin
@@ -10,6 +10,6 @@ EXPOSE 7002
ADD ./target/blade-admin.jar ./app.jar
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
diff --git a/blade-ops/blade-admin/pom.xml b/blade-ops/blade-admin/pom.xml
index 39eaf49a..9c150af2 100644
--- a/blade-ops/blade-admin/pom.xml
+++ b/blade-ops/blade-admin/pom.xml
@@ -5,13 +5,12 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,9 +16,9 @@
package org.springblade.admin;
import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
/**
* admin启动器
@@ -26,7 +26,7 @@
* @author Chill
*/
@EnableAdminServer
-@SpringCloudApplication
+@BladeCloudApplication
public class AdminApplication {
public static void main(String[] args) {
diff --git a/blade-ops/blade-admin/src/main/resources/bootstrap.yml b/blade-ops/blade-admin/src/main/resources/bootstrap.yml
index 7e296f7a..10c3cd28 100644
--- a/blade-ops/blade-admin/src/main/resources/bootstrap.yml
+++ b/blade-ops/blade-admin/src/main/resources/bootstrap.yml
@@ -1,14 +1,12 @@
server:
port: 7002
- undertow:
- # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
- io-threads: 4
- # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
- worker-threads: 20
- # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
- buffer-size: 1024
- # 是否分配的直接内存
- direct-buffers: true
+ tomcat:
+ # 线程配置
+ threads:
+ # 最大工作线程数(可同时处理请求的线程上限)
+ max: 400
+ # 最小空闲工作线程数(保持存活的常驻线程数)
+ min-spare: 16
spring:
boot:
@@ -17,3 +15,9 @@ spring:
ignored-services:
- consul
- serverAddr
+
+management:
+ endpoints:
+ web:
+ discovery:
+ enabled: false
diff --git a/blade-ops/blade-develop/Dockerfile b/blade-ops/blade-develop/Dockerfile
new file mode 100644
index 00000000..266bc1b2
--- /dev/null
+++ b/blade-ops/blade-develop/Dockerfile
@@ -0,0 +1,15 @@
+FROM bladex/alpine-java:openjdk21_cn_slim
+
+MAINTAINER bladejava@qq.com
+
+RUN mkdir -p /blade/develop
+
+WORKDIR /blade/develop
+
+EXPOSE 7007
+
+ADD ./target/blade-develop.jar ./app.jar
+
+ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+
+CMD ["--spring.profiles.active=test"]
diff --git a/blade-ops/blade-develop/pom.xml b/blade-ops/blade-develop/pom.xml
index ab6b6fbf..f0fe0304 100644
--- a/blade-ops/blade-develop/pom.xml
+++ b/blade-ops/blade-develop/pom.xml
@@ -6,14 +6,13 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,18 +15,16 @@
*/
package org.springblade.develop;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
-import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* Develop启动器
*
* @author Chill
*/
-@SpringCloudApplication
-@EnableFeignClients(AppConstant.BASE_PACKAGES)
+@BladeCloudApplication
public class DevelopApplication {
public static void main(String[] args) {
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/CodeController.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/CodeController.java
index 2e6908ed..497f0f40 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/CodeController.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/CodeController.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,13 +16,20 @@
package org.springblade.develop.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.*;
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.annotation.PreAuth;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.utils.Func;
@@ -32,9 +39,7 @@
import org.springblade.develop.service.IDatasourceService;
import org.springblade.develop.support.BladeCodeGenerator;
import org.springframework.web.bind.annotation.*;
-import springfox.documentation.annotations.ApiIgnore;
-import javax.validation.Valid;
import java.util.Collection;
import java.util.Map;
@@ -43,11 +48,12 @@
*
* @author Chill
*/
-@ApiIgnore
+@Hidden
@RestController
@AllArgsConstructor
@RequestMapping("/code")
-@Api(value = "代码生成", tags = "代码生成")
+@ApiOrder
+@Tag(name = "代码生成", description = "代码生成")
@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
public class CodeController extends BladeController {
@@ -58,8 +64,7 @@ public class CodeController extends BladeController {
* 详情
*/
@GetMapping("/detail")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "详情", notes = "传入code")
+ @Operation(summary = "详情", description = "传入code")
public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,21 +16,23 @@
package org.springblade.develop.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.annotation.PreAuth;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.constant.RoleConstant;
import org.springblade.core.tool.utils.Func;
import org.springblade.develop.entity.Datasource;
import org.springblade.develop.service.IDatasourceService;
import org.springframework.web.bind.annotation.*;
-import javax.validation.Valid;
+import jakarta.validation.Valid;
import java.util.List;
/**
@@ -41,7 +43,9 @@
@RestController
@AllArgsConstructor
@RequestMapping("/datasource")
-@Api(value = "数据源配置表", tags = "数据源配置表接口")
+@ApiOrder
+@Tag(name = "数据源配置表", description = "数据源配置表接口")
+@PreAuth(RoleConstant.HAS_ROLE_ADMIN)
public class DatasourceController extends BladeController {
private IDatasourceService datasourceService;
@@ -50,8 +54,7 @@ public class DatasourceController extends BladeController {
* 详情
*/
@GetMapping("/detail")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "详情", notes = "传入datasource")
+ @Operation(summary = "详情", description = "传入datasource")
public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,10 +21,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -34,15 +34,16 @@
*/
@Data
@TableName("blade_code")
-@ApiModel(value = "Code对象", description = "Code对象")
+@Schema(description = "Code对象")
public class Code implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,75 +51,75 @@ public class Code implements Serializable {
/**
* 数据源主键
*/
- @ApiModelProperty(value = "数据源主键")
+ @Schema(description = "数据源主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long datasourceId;
/**
* 模块名称
*/
- @ApiModelProperty(value = "服务名称")
+ @Schema(description = "服务名称")
private String serviceName;
/**
* 模块名称
*/
- @ApiModelProperty(value = "模块名称")
+ @Schema(description = "模块名称")
private String codeName;
/**
* 表名
*/
- @ApiModelProperty(value = "表名")
+ @Schema(description = "表名")
private String tableName;
/**
* 实体名
*/
- @ApiModelProperty(value = "表前缀")
+ @Schema(description = "表前缀")
private String tablePrefix;
/**
* 主键名
*/
- @ApiModelProperty(value = "主键名")
+ @Schema(description = "主键名")
private String pkName;
/**
* 基础业务模式
*/
- @ApiModelProperty(value = "基础业务模式")
+ @Schema(description = "基础业务模式")
private Integer baseMode;
/**
* 包装器模式
*/
- @ApiModelProperty(value = "包装器模式")
+ @Schema(description = "包装器模式")
private Integer wrapMode;
/**
* 后端包名
*/
- @ApiModelProperty(value = "后端包名")
+ @Schema(description = "后端包名")
private String packageName;
/**
* 后端路径
*/
- @ApiModelProperty(value = "后端路径")
+ @Schema(description = "后端路径")
private String apiPath;
/**
* 前端路径
*/
- @ApiModelProperty(value = "前端路径")
+ @Schema(description = "前端路径")
private String webPath;
/**
* 是否已删除
*/
@TableLogic
- @ApiModelProperty(value = "是否已删除")
+ @Schema(description = "是否已删除")
private Integer isDeleted;
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/entity/Datasource.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/entity/Datasource.java
index c48085c1..1ea5e15a 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/entity/Datasource.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/entity/Datasource.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
+
/**
* 数据源配置表实体类
*
@@ -34,15 +35,16 @@
@Data
@TableName("blade_datasource")
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "Datasource对象", description = "数据源配置表")
+@Schema(description = "Datasource对象")
public class Datasource extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,32 +52,32 @@ public class Datasource extends BaseEntity {
/**
* 名称
*/
- @ApiModelProperty(value = "名称")
+ @Schema(description = "名称")
private String name;
/**
* 驱动类
*/
- @ApiModelProperty(value = "驱动类")
+ @Schema(description = "驱动类")
private String driverClass;
/**
* 连接地址
*/
- @ApiModelProperty(value = "连接地址")
+ @Schema(description = "连接地址")
private String url;
/**
* 用户名
*/
- @ApiModelProperty(value = "用户名")
+ @Schema(description = "用户名")
private String username;
/**
* 密码
*/
- @ApiModelProperty(value = "密码")
+ @Schema(description = "密码")
private String password;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
private String remark;
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/CodeMapper.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/CodeMapper.java
index ac38043b..8ed52191 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/CodeMapper.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/CodeMapper.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/DatasourceMapper.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/DatasourceMapper.java
index 3f3be53c..bb816518 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/DatasourceMapper.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/mapper/DatasourceMapper.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/ICodeService.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/ICodeService.java
index 38e25a77..c294f22f 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/ICodeService.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/ICodeService.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
package org.springblade.develop.service;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.spring.service.IService;
import org.springblade.develop.entity.Code;
/**
@@ -29,8 +29,8 @@ public interface ICodeService extends IService
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/CodeServiceImpl.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/CodeServiceImpl.java
index 83aaa96a..5d95976f 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/CodeServiceImpl.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/CodeServiceImpl.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
*/
package org.springblade.develop.service.impl;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.develop.entity.Code;
import org.springblade.develop.mapper.CodeMapper;
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/DatasourceServiceImpl.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/DatasourceServiceImpl.java
index c14222e8..5d7cc075 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/DatasourceServiceImpl.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/impl/DatasourceServiceImpl.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-develop/src/main/resources/templates/controller.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/controller.java.vm
similarity index 57%
rename from blade-ops/blade-develop/src/main/resources/templates/controller.java.vm
rename to blade-ops/blade-develop/src/main/resources/templates/api/controller.java.vm
index 58762e2d..32934fe3 100644
--- a/blade-ops/blade-develop/src/main/resources/templates/controller.java.vm
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/controller.java.vm
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,34 +15,30 @@
*/
package $!{package.Controller};
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiParam;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
+#if($!{superControllerClassPackage})
+import $!{superControllerClassPackage};
+#end
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
-import org.springframework.web.bind.annotation.*;
-#if($!{superEntityClass})
-import org.springframework.web.bind.annotation.RequestParam;
-#end
-import com.baomidou.mybatisplus.core.metadata.IPage;
import $!{package.Entity}.$!{entity};
#set($voPackage=$package.Entity.replace("entity","vo"))
import $!{voPackage}.$!{entity}VO;
-#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
+#if($!{hasWrapper})
+#set($wrapperPackage=$package.Entity.replace("pojo.entity","wrapper"))
import $!{wrapperPackage}.$!{entity}Wrapper;
-import $!{package.Service}.$!{table.serviceName};
-#if($!{superControllerClassPackage})
-import $!{superControllerClassPackage};
-#end
-#if(!$!{superEntityClass})
#end
-import java.util.List;
+import $!{package.Service}.$!{table.serviceName};
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.validation.Valid;
/**
* $!{table.comment} 控制器
@@ -52,8 +48,9 @@ import java.util.List;
*/
@RestController
@AllArgsConstructor
-@RequestMapping("#if($!{package.ModuleName})/$!{package.ModuleName}#end/$!{cfg.entityKey}")
-@Api(value = "$!{table.comment}", tags = "$!{table.comment}接口")
+@RequestMapping("#if($!{hasServiceName})/$!{serviceName}#end/$!{entityKey}")
+@ApiOrder
+@Tag(name = "$!{table.comment}", description = "$!{table.comment}接口")
#if($!{superControllerClass})
public class $!{table.controllerName} extends $!{superControllerClass} {
#else
@@ -62,93 +59,104 @@ public class $!{table.controllerName} {
private $!{table.serviceName} $!{table.entityPath}Service;
+#if($!{hasWrapper})
/**
- * 详情
- */
+ * 详情
+ */
@GetMapping("/detail")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "详情", notes = "传入$!{table.entityPath}")
+ @Operation(summary = "详情", description = "传入$!{table.entityPath}")
public R<$!{entity}VO> detail($!{entity} $!{table.entityPath}) {
$!{entity} detail = $!{table.entityPath}Service.getOne(Condition.getQueryWrapper($!{table.entityPath}));
return R.data($!{entity}Wrapper.build().entityVO(detail));
}
/**
- * 分页 $!{table.comment}
- */
+ * 分页 $!{table.comment}
+ */
@GetMapping("/list")
- @ApiOperationSupport(order = 2)
- @ApiOperation(value = "分页", notes = "传入$!{table.entityPath}")
+ @Operation(summary = "分页", description = "传入$!{table.entityPath}")
public R
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package $!{package.Entity};
+
+#foreach($pkg in $!{table.importPackages})
+#if($useTenantEntity && $!{pkg} == "org.springblade.core.mp.base.BaseEntity")
+import org.springblade.core.mp.base.TenantEntity;
+#elseif($!{pkg} == "java.io.Serializable" && $!{superEntityClass} && !$!{activeRecord})
+## 继承父类时不直接实现 Serializable,跳过强制注入的导入
+#elseif(!$hasKeyField && ($!{pkg} == "com.baomidou.mybatisplus.annotation.IdType" || $!{pkg} == "com.baomidou.mybatisplus.annotation.TableId"))
+## 主键列归入公共字段时实体内不产出主键注解,跳过全局 idType 注入的导入
+#else
+import $!{pkg};
+#end
+#end
+#if($hasLongKey)
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+#end
+#if($!{entityLombokModel})
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+#end
+#if($!{swagger})
+import io.swagger.v3.oas.annotations.media.Schema;
+#end
+import java.io.Serial;
+
+/**
+ * $!{table.comment}实体类
+ *
+ * @author $!{author}
+ * @since $!{date}
+ */
+#if($!{entityLombokModel})
+@Data
+#end
+#if($!{table.convert})
+@TableName("$!{table.name}")
+#end
+#if($!{superEntityClass})
+@EqualsAndHashCode(callSuper = true)
+#end
+#if($!{swagger})
+@Schema(description = #if ("$!{table.comment}"=="")"$!{entity}对象"#else"$!{table.comment}"#end)
+#end
+#if($!{superEntityClass})
+public class $!{entity} extends #if($useTenantEntity)TenantEntity#{else}$!{superEntityClass}#end#if($!{activeRecord})<$!{entity}>#end {
+#elseif($!{activeRecord})
+@Accessors(chain = true)
+public class $!{entity} extends Model<$!{entity}> {
+#else
+public class $!{entity} implements Serializable {
+#end
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+## ---------- BEGIN 字段循环遍历 ----------
+#foreach($field in $!{table.fields})
+#if($!{field.name} != $!{tenantColumn} || !$useTenantEntity)
+#if($!{field.keyFlag})
+#set($keyPropertyName=$!{field.propertyName})
+#end
+#if("$!field.comment" != "")
+ /**
+ * $!{field.comment}
+ */
+ #if($!{swagger})
+ @Schema(description = "$!{field.comment}")
+ #end
+#end
+#if($!{field.keyFlag})
+## 主键
+#if($!{field.keyIdentityFlag})
+ @TableId(value = "$!{field.name}", type = IdType.AUTO)
+#elseif(!$null.isNull($!{idType}) && "$!idType" != "")
+ @TableId(value = "$!{field.name}", type = IdType.$!{idType})
+#elseif($!{field.convert})
+ @TableId("$!{field.name}")
+#end
+#if($!{field.propertyType} == "Long")
+ @JsonSerialize(using = ToStringSerializer.class)
+#end
+## 普通字段
+#elseif($!{field.fill})
+## ----- 存在字段填充设置 -----
+#if($!{field.convert})
+ @TableField(value = "$!{field.name}", fill = FieldFill.$!{field.fill})
+#else
+ @TableField(fill = FieldFill.$!{field.fill})
+#end
+#elseif($!{field.convert})
+ @TableField("$!{field.name}")
+#end
+## 乐观锁注解
+#if($!{versionFieldName}==$!{field.name})
+ @Version
+#end
+## 逻辑删除注解
+#if($!{logicDeleteFieldName}==$!{field.name})
+ @TableLogic
+#end
+ private $!{field.propertyType} $!{field.propertyName};
+#end
+#end
+## ---------- END 字段循环遍历 ----------
+
+#if(!$!{entityLombokModel})
+#foreach($field in $!{table.fields})
+#if($!{field.propertyType.equals("boolean")})
+#set($getprefix="is")
+#else
+#set($getprefix="get")
+#end
+
+ public $!{field.propertyType} $!{getprefix}$!{field.capitalName}() {
+ return $!{field.propertyName};
+ }
+
+#if($!{entityBuilderModel})
+ public $!{entity} set$!{field.capitalName}($!{field.propertyType} $!{field.propertyName}) {
+#else
+ public void set$!{field.capitalName}($!{field.propertyType} $!{field.propertyName}) {
+#end
+ this.$!{field.propertyName} = $!{field.propertyName};
+#if($!{entityBuilderModel})
+ return this;
+#end
+ }
+#end
+#end
+
+#if($!{entityColumnConstant})
+#foreach($field in $!{table.fields})
+ public static final String $!{field.name.toUpperCase()} = "$!{field.name}";
+
+#end
+#end
+#if($!{activeRecord})
+ @Override
+ protected Serializable pkVal() {
+#if($!{keyPropertyName})
+ return this.$!{keyPropertyName};
+#else
+ return this.id;
+#end
+ }
+
+#end
+#if(!$!{entityLombokModel})
+ @Override
+ public String toString() {
+ return "$!{entity}{" +
+#foreach($field in $!{table.fields})
+#if($!{velocityCount}==1)
+ "$!{field.propertyName}=" + $!{field.propertyName} +
+#else
+ ", $!{field.propertyName}=" + $!{field.propertyName} +
+#end
+#end
+ "}";
+ }
+#end
+}
diff --git a/blade-ops/blade-develop/src/main/resources/templates/api/entityDTO.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/entityDTO.java.vm
new file mode 100644
index 00000000..16782224
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/entityDTO.java.vm
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#set($dtoPackage=$package.Entity.replace("entity","dto"))
+package $!{dtoPackage};
+
+import $!{package.Entity}.$!{entity};
+#if($!{entityLombokModel})
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+#end
+import java.io.Serial;
+
+/**
+ * $!{table.comment}数据传输对象实体类
+ *
+ * @author $!{author}
+ * @since $!{date}
+ */
+#if($!{entityLombokModel})
+@Data
+@EqualsAndHashCode(callSuper = true)
+#end
+public class $!{entity}DTO extends $!{entity} {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/blade-ops/blade-develop/src/main/resources/templates/api/entityVO.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/entityVO.java.vm
new file mode 100644
index 00000000..45a4af32
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/entityVO.java.vm
@@ -0,0 +1,46 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#set($voPackage=$package.Entity.replace("entity","vo"))
+package $!{voPackage};
+
+import $!{package.Entity}.$!{entity};
+#if($!{entityLombokModel})
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+#end
+#if($!{swagger})
+import io.swagger.v3.oas.annotations.media.Schema;
+#end
+import java.io.Serial;
+
+/**
+ * $!{table.comment}视图实体类
+ *
+ * @author $!{author}
+ * @since $!{date}
+ */
+#if($!{entityLombokModel})
+@Data
+@EqualsAndHashCode(callSuper = true)
+#end
+#if($!{swagger})
+@Schema(description = #if ("$!{table.comment}"=="")"$!{entity}VO对象"#else"$!{table.comment}"#end)
+#end
+public class $!{entity}VO extends $!{entity} {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/blade-ops/blade-develop/src/test/resources/templates/wrapper.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/mapper.java.vm
similarity index 50%
rename from blade-ops/blade-develop/src/test/resources/templates/wrapper.java.vm
rename to blade-ops/blade-develop/src/main/resources/templates/api/mapper.java.vm
index 64a8b015..7b1b89c8 100644
--- a/blade-ops/blade-develop/src/test/resources/templates/wrapper.java.vm
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/mapper.java.vm
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,33 +13,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
-package $!{wrapperPackage};
+package $!{package.Mapper};
-import lombok.AllArgsConstructor;
-import org.springblade.core.mp.support.BaseEntityWrapper;
-import org.springblade.core.tool.utils.BeanUtil;
+import $!{superMapperClassPackage};
+import com.baomidou.mybatisplus.core.metadata.IPage;
import $!{package.Entity}.$!{entity};
#set($voPackage=$package.Entity.replace("entity","vo"))
import $!{voPackage}.$!{entity}VO;
+import java.util.List;
+
/**
- * $!{table.comment}包装类,返回视图层所需的字段
+ * $!{table.comment} Mapper 接口
*
* @author $!{author}
* @since $!{date}
*/
-public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> {
-
- public static $!{entity}Wrapper build() {
- return new $!{entity}Wrapper();
- }
-
- @Override
- public $!{entity}VO entityVO($!{entity} $!{table.entityPath}) {
- $!{entity}VO $!{table.entityPath}VO = BeanUtil.copy($!{table.entityPath}, $!{entity}VO.class);
+#if($!{kotlin})
+interface $!{table.mapperName} : $!{superMapperClass}<$!{entity}>
+#else
+public interface $!{table.mapperName} extends $!{superMapperClass}<$!{entity}> {
- return $!{table.entityPath}VO;
- }
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param $!{table.entityPath} $!{table.comment}查询条件
+ * @return $!{table.comment}分页数据
+ */
+ List<$!{entity}VO> select$!{entity}Page(IPage page, $!{entity}VO $!{table.entityPath});
}
+#end
diff --git a/blade-ops/blade-develop/src/main/resources/templates/api/mapper.xml.vm b/blade-ops/blade-develop/src/main/resources/templates/api/mapper.xml.vm
new file mode 100644
index 00000000..0a6d82b9
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/mapper.xml.vm
@@ -0,0 +1,48 @@
+#set($hasTenant = false)
+#foreach($field in $!{table.fields})
+#if($!{field.name} == $!{tenantColumn})
+#set($hasTenant = true)
+#end
+#end
+#set($useTenantEntity = false)
+#if($hasTenant && "$!superEntityClass" == "BaseEntity")
+#set($useTenantEntity = true)
+#end
+
+
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package $!{package.Service};
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import $!{superServiceClassPackage};
+import $!{package.Entity}.$!{entity};
+#set($voPackage=$package.Entity.replace("entity","vo"))
+import $!{voPackage}.$!{entity}VO;
+
+/**
+ * $!{table.comment} 服务类
+ *
+ * @author $!{author}
+ * @since $!{date}
+ */
+#if($!{kotlin})
+interface $!{table.serviceName} : $!{superServiceClass}<$!{entity}>
+#else
+public interface $!{table.serviceName} extends $!{superServiceClass}<$!{entity}> {
+
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param $!{table.entityPath} $!{table.comment}查询条件
+ * @return $!{table.comment}分页数据
+ */
+ IPage<$!{entity}VO> select$!{entity}Page(IPage<$!{entity}VO> page, $!{entity}VO $!{table.entityPath});
+
+}
+#end
diff --git a/blade-ops/blade-develop/src/main/resources/templates/api/serviceImpl.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/serviceImpl.java.vm
new file mode 100644
index 00000000..ec8f37b3
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/serviceImpl.java.vm
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package $!{package.ServiceImpl};
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import $!{superServiceImplClassPackage};
+import $!{package.Entity}.$!{entity};
+#set($voPackage=$package.Entity.replace("entity","vo"))
+import $!{voPackage}.$!{entity}VO;
+import $!{package.Mapper}.$!{table.mapperName};
+import $!{package.Service}.$!{table.serviceName};
+import org.springframework.stereotype.Service;
+
+/**
+ * $!{table.comment} 服务实现类
+ *
+ * @author $!{author}
+ * @since $!{date}
+ */
+@Service
+#if($!{kotlin})
+open class $!{table.serviceImplName} : $!{superServiceImplClass}<$!{table.mapperName}, $!{entity}>(), $!{table.serviceName} {
+
+}
+#else
+public class $!{table.serviceImplName} extends $!{superServiceImplClass}<$!{table.mapperName}, $!{entity}> implements $!{table.serviceName} {
+
+ @Override
+ public IPage<$!{entity}VO> select$!{entity}Page(IPage<$!{entity}VO> page, $!{entity}VO $!{table.entityPath}) {
+ return page.setRecords(baseMapper.select$!{entity}Page(page, $!{table.entityPath}));
+ }
+
+}
+#end
diff --git a/blade-ops/blade-develop/src/main/resources/templates/wrapper.java.vm b/blade-ops/blade-develop/src/main/resources/templates/api/wrapper.java.vm
similarity index 74%
rename from blade-ops/blade-develop/src/main/resources/templates/wrapper.java.vm
rename to blade-ops/blade-develop/src/main/resources/templates/api/wrapper.java.vm
index 64a8b015..ad0090d6 100644
--- a/blade-ops/blade-develop/src/main/resources/templates/wrapper.java.vm
+++ b/blade-ops/blade-develop/src/main/resources/templates/api/wrapper.java.vm
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,10 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
+#set($wrapperPackage=$package.Entity.replace("pojo.entity","wrapper"))
package $!{wrapperPackage};
-import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import $!{package.Entity}.$!{entity};
@@ -29,15 +28,15 @@ import $!{voPackage}.$!{entity}VO;
* @author $!{author}
* @since $!{date}
*/
-public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> {
+public class $!{entity}Wrapper extends BaseEntityWrapper<$!{entity}, $!{entity}VO> {
- public static $!{entity}Wrapper build() {
- return new $!{entity}Wrapper();
- }
+ public static $!{entity}Wrapper build() {
+ return new $!{entity}Wrapper();
+ }
@Override
public $!{entity}VO entityVO($!{entity} $!{table.entityPath}) {
- $!{entity}VO $!{table.entityPath}VO = BeanUtil.copy($!{table.entityPath}, $!{entity}VO.class);
+ $!{entity}VO $!{table.entityPath}VO = BeanUtil.copyProperties($!{table.entityPath}, $!{entity}VO.class);
return $!{table.entityPath}VO;
}
diff --git a/blade-ops/blade-develop/src/main/resources/templates/saber/api.ts.vm b/blade-ops/blade-develop/src/main/resources/templates/saber/api.ts.vm
new file mode 100644
index 00000000..995ad2ec
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/saber/api.ts.vm
@@ -0,0 +1,50 @@
+import request from '@/axios';
+
+export const getList = (current, size, params) => {
+ return request({
+ url: '/$!{serviceName}/$!{entityKey}/list',
+ method: 'get',
+ params: {
+ ...params,
+ current,
+ size,
+ }
+ })
+}
+
+export const getDetail = (id) => {
+ return request({
+ url: '/$!{serviceName}/$!{entityKey}/detail',
+ method: 'get',
+ params: {
+ id
+ }
+ })
+}
+
+export const remove = (ids) => {
+ return request({
+ url: '/$!{serviceName}/$!{entityKey}/remove',
+ method: 'post',
+ params: {
+ ids,
+ }
+ })
+}
+
+export const add = (row) => {
+ return request({
+ url: '/$!{serviceName}/$!{entityKey}/submit',
+ method: 'post',
+ data: row
+ })
+}
+
+export const update = (row) => {
+ return request({
+ url: '/$!{serviceName}/$!{entityKey}/submit',
+ method: 'post',
+ data: row
+ })
+}
+
diff --git a/blade-ops/blade-develop/src/main/resources/templates/saber/crud.vue.vm b/blade-ops/blade-develop/src/main/resources/templates/saber/crud.vue.vm
new file mode 100644
index 00000000..ca36701f
--- /dev/null
+++ b/blade-ops/blade-develop/src/main/resources/templates/saber/crud.vue.vm
@@ -0,0 +1,268 @@
+#set($hasTenant = false)
+#foreach($field in $!{table.fields})
+#if($!{field.name} == $!{tenantColumn})
+#set($hasTenant = true)
+#end
+#end
+#set($useTenantEntity = false)
+#if($hasTenant && "$!superEntityClass" == "BaseEntity")
+#set($useTenantEntity = true)
+#end
+
+
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,11 +40,11 @@ public class CodeGenerator {
/**
* 前端代码生成所属系统
*/
- public static String SYSTEM_NAME = "sword";
+ public static String SYSTEM_NAME = "saber";
/**
* 前端代码生成地址
*/
- public static String PACKAGE_WEB_DIR = "/Users/chill/Workspaces/product/Sword";
+ public static String PACKAGE_WEB_DIR = "/Users/chill/Workspaces/test/Saber";
/**
* 需要去掉的表前缀
*/
@@ -64,7 +64,7 @@ public class CodeGenerator {
/**
* 基础业务字段
*/
- public static String[] SUPER_ENTITY_COLUMNS = {"create_time", "create_user", "update_time", "update_user", "status", "is_deleted"};
+ public static String[] SUPER_ENTITY_COLUMNS = {"create_time", "create_user", "create_dept", "update_time", "update_user", "status", "is_deleted"};
/**
diff --git a/blade-ops/blade-develop/src/test/resources/templates/controller.java.vm b/blade-ops/blade-develop/src/test/resources/templates/controller.java.vm
deleted file mode 100644
index 58762e2d..00000000
--- a/blade-ops/blade-develop/src/test/resources/templates/controller.java.vm
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package $!{package.Controller};
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.ApiParam;
-import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
-import org.springblade.core.mp.support.Condition;
-import org.springblade.core.mp.support.Query;
-import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.Func;
-import org.springframework.web.bind.annotation.*;
-#if($!{superEntityClass})
-import org.springframework.web.bind.annotation.RequestParam;
-#end
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import $!{package.Entity}.$!{entity};
-#set($voPackage=$package.Entity.replace("entity","vo"))
-import $!{voPackage}.$!{entity}VO;
-#set($wrapperPackage=$package.Entity.replace("entity","wrapper"))
-import $!{wrapperPackage}.$!{entity}Wrapper;
-import $!{package.Service}.$!{table.serviceName};
-#if($!{superControllerClassPackage})
-import $!{superControllerClassPackage};
-#end
-#if(!$!{superEntityClass})
-#end
-import java.util.List;
-
-/**
- * $!{table.comment} 控制器
- *
- * @author $!{author}
- * @since $!{date}
- */
-@RestController
-@AllArgsConstructor
-@RequestMapping("#if($!{package.ModuleName})/$!{package.ModuleName}#end/$!{cfg.entityKey}")
-@Api(value = "$!{table.comment}", tags = "$!{table.comment}接口")
-#if($!{superControllerClass})
-public class $!{table.controllerName} extends $!{superControllerClass} {
-#else
-public class $!{table.controllerName} {
-#end
-
- private $!{table.serviceName} $!{table.entityPath}Service;
-
- /**
- * 详情
- */
- @GetMapping("/detail")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "详情", notes = "传入$!{table.entityPath}")
- public R<$!{entity}VO> detail($!{entity} $!{table.entityPath}) {
- $!{entity} detail = $!{table.entityPath}Service.getOne(Condition.getQueryWrapper($!{table.entityPath}));
- return R.data($!{entity}Wrapper.build().entityVO(detail));
- }
-
- /**
- * 分页 $!{table.comment}
- */
- @GetMapping("/list")
- @ApiOperationSupport(order = 2)
- @ApiOperation(value = "分页", notes = "传入$!{table.entityPath}")
- public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,16 +15,16 @@
*/
package org.springblade.report;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
/**
* UReport启动器
*
* @author Chill
*/
-@SpringCloudApplication
+@BladeCloudApplication
public class ReportApplication {
public static void main(String[] args) {
diff --git a/blade-ops/blade-report/src/main/java/org/springblade/report/config/BladeReportConfiguration.java b/blade-ops/blade-report/src/main/java/org/springblade/report/config/BladeReportConfiguration.java
index 28171a91..10122bfe 100644
--- a/blade-ops/blade-report/src/main/java/org/springblade/report/config/BladeReportConfiguration.java
+++ b/blade-ops/blade-report/src/main/java/org/springblade/report/config/BladeReportConfiguration.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
*
* @author Chill
*/
-@Configuration
+@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "report.enabled", havingValue = "true", matchIfMissing = true)
public class BladeReportConfiguration {
diff --git a/blade-ops/blade-resource/Dockerfile b/blade-ops/blade-resource/Dockerfile
index 72ee5432..4f75e488 100644
--- a/blade-ops/blade-resource/Dockerfile
+++ b/blade-ops/blade-resource/Dockerfile
@@ -1,6 +1,6 @@
-FROM anapsix/alpine-java:8_server-jre_unlimited
+FROM bladex/alpine-java:openjdk21_cn_slim
-MAINTAINER smallchill@163.com
+MAINTAINER bladejava@qq.com
RUN mkdir -p /blade/resource
@@ -10,6 +10,6 @@ EXPOSE 8010
ADD ./target/blade-resource.jar ./app.jar
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
diff --git a/blade-ops/blade-resource/pom.xml b/blade-ops/blade-resource/pom.xml
index e31e735f..7dc3b602 100644
--- a/blade-ops/blade-resource/pom.xml
+++ b/blade-ops/blade-resource/pom.xml
@@ -5,30 +5,26 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,16 +15,16 @@
*/
package org.springblade.resource;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
/**
* 资源启动器
*
* @author Chill
*/
-@SpringCloudApplication
+@BladeCloudApplication
public class ResourceApplication {
public static void main(String[] args) {
diff --git a/blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java b/blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
index 7cddd8f8..b7ff5c80 100644
--- a/blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
+++ b/blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,12 +15,13 @@
*/
package org.springblade.resource.endpoint;
-import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.springblade.core.oss.QiniuTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.oss.model.OssFile;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
@@ -34,16 +35,14 @@
@RestController
@AllArgsConstructor
@RequestMapping("/oss/endpoint")
-@Api(value = "对象存储端点", tags = "对象存储端点")
+@ApiOrder
+@Tag(name = "对象存储端点", description = "对象存储端点")
public class OssEndpoint {
private QiniuTemplate qiniuTemplate;
/**
* 创建存储桶
- *
- * @param bucketName 存储桶名称
- * @return Bucket
*/
@SneakyThrows
@PostMapping("/make-bucket")
@@ -54,9 +53,6 @@ public R makeBucket(@RequestParam String bucketName) {
/**
* 创建存储桶
- *
- * @param bucketName 存储桶名称
- * @return R
*/
@SneakyThrows
@PostMapping("/remove-bucket")
@@ -67,11 +63,6 @@ public R removeBucket(@RequestParam String bucketName) {
/**
* 拷贝文件
- *
- * @param fileName 存储桶对象名称
- * @param destBucketName 目标存储桶名称
- * @param destFileName 目标存储桶对象名称
- * @return R
*/
@SneakyThrows
@PostMapping("/copy-file")
@@ -82,9 +73,6 @@ public R copyFile(@RequestParam String fileName, @RequestParam String destBucket
/**
* 获取文件信息
- *
- * @param fileName 存储桶对象名称
- * @return InputStream
*/
@SneakyThrows
@GetMapping("/stat-file")
@@ -94,9 +82,6 @@ public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java
index 93085687..90cbbede 100644
--- a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java
+++ b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/controller/OrderController.java
@@ -20,11 +20,6 @@ public class OrderController {
/**
* 创建订单
- *
- * @param userId 用户id
- * @param commodityCode 商品代码
- * @param count 数量
- * @return boolean
*/
@RequestMapping("/create")
public R createOrder(String userId, String commodityCode, Integer count) {
diff --git a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java
index 8ccac26a..48ac3976 100644
--- a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java
+++ b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/entity/Order.java
@@ -6,6 +6,7 @@
import lombok.Data;
import lombok.experimental.Accessors;
+import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -19,6 +20,7 @@
@TableName("tb_order")
public class Order implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
diff --git a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java
index 1605f1d3..397c0a28 100644
--- a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java
+++ b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/feign/IStorageClient.java
@@ -19,7 +19,7 @@ public interface IStorageClient {
* @param count 数量
* @return boolean
*/
- @GetMapping("/storage/deduct")
+ @GetMapping("/feign/client/storage/deduct")
int deduct(@RequestParam("commodityCode") String commodityCode, @RequestParam("count") Integer count);
}
diff --git a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java
index 81a3a4d3..eb0e8ed0 100644
--- a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java
+++ b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/IOrderService.java
@@ -1,6 +1,6 @@
package org.springblade.seata.order.service;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.spring.service.IService;
import org.springblade.seata.order.entity.Order;
/**
diff --git a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java
index 388d75fb..96f4a405 100644
--- a/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java
+++ b/blade-ops/blade-seata-order/src/main/java/org/springblade/seata/order/service/impl/OrderServiceImpl.java
@@ -1,6 +1,6 @@
package org.springblade.seata.order.service.impl;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.AllArgsConstructor;
import org.springblade.core.log.exception.ServiceException;
diff --git a/blade-ops/blade-seata-storage/pom.xml b/blade-ops/blade-seata-storage/pom.xml
index 9dead690..42014a4e 100644
--- a/blade-ops/blade-seata-storage/pom.xml
+++ b/blade-ops/blade-seata-storage/pom.xml
@@ -5,32 +5,44 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java
index f4447097..3c1fc4fe 100644
--- a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java
+++ b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/controller/StorageController.java
@@ -11,7 +11,7 @@
* @author Chill
*/
@RestController
-@RequestMapping("storage")
+@RequestMapping("/feign/client/storage")
@AllArgsConstructor
public class StorageController {
@@ -19,9 +19,6 @@ public class StorageController {
/**
* 减库存
- *
- * @param commodityCode 商品代码
- * @param count 数量
*/
@RequestMapping(path = "/deduct")
public int deduct(String commodityCode, Integer count) {
diff --git a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java
index 73e4935e..b1e80ac6 100644
--- a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java
+++ b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/entity/Storage.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -15,6 +16,7 @@
@TableName("tb_storage")
public class Storage implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
private Long id;
diff --git a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java
index 1b2fe400..81f12a43 100644
--- a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java
+++ b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/IStorageService.java
@@ -1,6 +1,6 @@
package org.springblade.seata.storage.service;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.spring.service.IService;
import org.springblade.seata.storage.entity.Storage;
/**
diff --git a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java
index fc1eaccd..9723dfa3 100644
--- a/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java
+++ b/blade-ops/blade-seata-storage/src/main/java/org/springblade/seata/storage/service/impl/StorageServiceImpl.java
@@ -1,7 +1,7 @@
package org.springblade.seata.storage.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
import org.springblade.seata.storage.entity.Storage;
import org.springblade.seata.storage.mapper.StorageMapper;
import org.springblade.seata.storage.service.IStorageService;
diff --git a/blade-ops/pom.xml b/blade-ops/pom.xml
index d1395992..650a1676 100644
--- a/blade-ops/pom.xml
+++ b/blade-ops/pom.xml
@@ -5,11 +5,12 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,11 +20,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
import java.util.Date;
/**
@@ -37,12 +38,13 @@
@EqualsAndHashCode(callSuper = true)
public class Notice extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,25 +52,25 @@ public class Notice extends BaseEntity {
/**
* 标题
*/
- @ApiModelProperty(value = "标题")
+ @Schema(description = "标题")
private String title;
/**
* 通知类型
*/
- @ApiModelProperty(value = "通知类型")
+ @Schema(description = "通知类型")
private Integer category;
/**
* 发布日期
*/
- @ApiModelProperty(value = "发布日期")
+ @Schema(description = "发布日期")
private Date releaseTime;
/**
* 内容
*/
- @ApiModelProperty(value = "内容")
+ @Schema(description = "内容")
private String content;
diff --git a/blade-service-api/blade-demo-api/src/main/java/com/example/demo/feign/INoticeClient.java b/blade-service-api/blade-demo-api/src/main/java/com/example/demo/feign/INoticeClient.java
index 911be4d7..908faafa 100644
--- a/blade-service-api/blade-demo-api/src/main/java/com/example/demo/feign/INoticeClient.java
+++ b/blade-service-api/blade-demo-api/src/main/java/com/example/demo/feign/INoticeClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@
)
public interface INoticeClient {
- String API_PREFIX = "/client";
+ String API_PREFIX = "/feign/client/notice";
String TOP = API_PREFIX + "/top";
/**
diff --git a/blade-service-api/blade-demo-api/src/main/java/com/example/demo/vo/NoticeVO.java b/blade-service-api/blade-demo-api/src/main/java/com/example/demo/vo/NoticeVO.java
index dfb0a660..f8a200e4 100644
--- a/blade-service-api/blade-demo-api/src/main/java/com/example/demo/vo/NoticeVO.java
+++ b/blade-service-api/blade-demo-api/src/main/java/com/example/demo/vo/NoticeVO.java
@@ -1,6 +1,6 @@
package com.example.demo.vo;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.example.demo.entity.Notice;
@@ -14,7 +14,7 @@
@EqualsAndHashCode(callSuper = true)
public class NoticeVO extends Notice {
- @ApiModelProperty(value = "通知类型名")
+ @Schema(description = "通知类型名")
private String categoryName;
}
diff --git a/blade-service-api/blade-desk-api/pom.xml b/blade-service-api/blade-desk-api/pom.xml
index 6cf838b9..f9e538e3 100644
--- a/blade-service-api/blade-desk-api/pom.xml
+++ b/blade-service-api/blade-desk-api/pom.xml
@@ -5,13 +5,12 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,11 +20,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
import java.util.Date;
/**
@@ -37,12 +38,13 @@
@TableName("blade_notice")
public class Notice extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,25 +52,25 @@ public class Notice extends BaseEntity {
/**
* 标题
*/
- @ApiModelProperty(value = "标题")
+ @Schema(description = "标题")
private String title;
/**
* 通知类型
*/
- @ApiModelProperty(value = "通知类型")
+ @Schema(description = "通知类型")
private Integer category;
/**
* 发布日期
*/
- @ApiModelProperty(value = "发布日期")
+ @Schema(description = "发布日期")
private Date releaseTime;
/**
* 内容
*/
- @ApiModelProperty(value = "内容")
+ @Schema(description = "内容")
private String content;
diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/feign/INoticeClient.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/feign/INoticeClient.java
index 1c964004..7df325fc 100644
--- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/feign/INoticeClient.java
+++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/feign/INoticeClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@
)
public interface INoticeClient {
- String API_PREFIX = "/dashboard";
+ String API_PREFIX = "/feign/client/notice";
/**
* 获取notice列表
diff --git a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/vo/NoticeVO.java b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/vo/NoticeVO.java
index 49e23748..fecf067c 100644
--- a/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/vo/NoticeVO.java
+++ b/blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/vo/NoticeVO.java
@@ -1,8 +1,10 @@
package org.springblade.desk.vo;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.jackson.BladeView;
+import org.springblade.core.tool.jackson.Views;
import org.springblade.desk.entity.Notice;
/**
@@ -14,7 +16,8 @@
@EqualsAndHashCode(callSuper = true)
public class NoticeVO extends Notice {
- @ApiModelProperty(value = "通知类型名")
+ @BladeView(Views.Summary.class)
+ @Schema(description = "通知类型名")
private String categoryName;
}
diff --git a/blade-service-api/blade-dict-api/pom.xml b/blade-service-api/blade-dict-api/pom.xml
index 50e5a9fa..31d0a38b 100644
--- a/blade-service-api/blade-dict-api/pom.xml
+++ b/blade-service-api/blade-dict-api/pom.xml
@@ -5,13 +5,12 @@
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.cache;
+
+import org.springblade.core.cache.constant.CacheConstant;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.system.entity.Dict;
+import org.springblade.system.feign.IDictClient;
+
+import java.util.List;
+
+/**
+ * 字典缓存工具类
+ *
+ * 通过 {@link SpringUtil} 在运行时懒加载 Feign 客户端,供各服务复用字典数据缓存。
+ *
+ * @author Chill
+ */
+public class DictCache {
+
+ private static final String DICT_VALUE = "dict:value:";
+ private static final String DICT_LIST = "dict:list:";
+
+ private static IDictClient dictClient;
+
+ private static IDictClient getDictClient() {
+ if (dictClient == null) {
+ dictClient = SpringUtil.getBean(IDictClient.class);
+ }
+ return dictClient;
+ }
+
+ /**
+ * 获取字典值
+ *
+ * @param code 字典编号
+ * @param dictKey 字典键
+ * @return 字典值
+ */
+ public static String getValue(String code, Integer dictKey) {
+ return CacheUtil.get(CacheConstant.DICT_CACHE, DICT_VALUE + code + StringPool.COLON, String.valueOf(dictKey), () -> getDictClient().getValue(code, dictKey).getData());
+ }
+
+ /**
+ * 获取字典集合
+ *
+ * @param code 字典编号
+ * @return 字典集合
+ */
+ public static List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Dict;
+import java.io.Serial;
+
/**
* 数据传输对象实体类
*
@@ -28,6 +30,7 @@
@Data
@EqualsAndHashCode(callSuper = true)
public class DictDTO extends Dict {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/entity/Dict.java b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/entity/Dict.java
index ea05ce27..1ca169c0 100644
--- a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/entity/Dict.java
+++ b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/entity/Dict.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,10 +21,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -35,15 +35,16 @@
*/
@Data
@TableName("blade_dict")
-@ApiModel(value = "Dict对象", description = "Dict对象")
+@Schema(description = "Dict对象")
public class Dict implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -51,45 +52,45 @@ public class Dict implements Serializable {
/**
* 父主键
*/
- @ApiModelProperty(value = "父主键")
+ @Schema(description = "父主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
/**
* 字典码
*/
- @ApiModelProperty(value = "字典码")
+ @Schema(description = "字典码")
private String code;
/**
* 字典值
*/
- @ApiModelProperty(value = "字典值")
+ @Schema(description = "字典值")
private Integer dictKey;
/**
* 字典名称
*/
- @ApiModelProperty(value = "字典名称")
+ @Schema(description = "字典名称")
private String dictValue;
/**
* 排序
*/
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
private Integer sort;
/**
* 字典备注
*/
- @ApiModelProperty(value = "字典备注")
+ @Schema(description = "字典备注")
private String remark;
/**
* 是否已删除
*/
@TableLogic
- @ApiModelProperty(value = "是否已删除")
+ @Schema(description = "是否已删除")
private Integer isDeleted;
diff --git a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClient.java b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClient.java
index 9aeabeeb..c7b9895d 100644
--- a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClient.java
+++ b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@
)
public interface IDictClient {
- String API_PREFIX = "/dict";
+ String API_PREFIX = "/feign/client/dict";
/**
* 获取字典表对应值
diff --git a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClientFallback.java b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClientFallback.java
index 82f671de..b5483123 100644
--- a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClientFallback.java
+++ b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/feign/IDictClientFallback.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/vo/DictVO.java b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/vo/DictVO.java
index 739d87e3..a7e2e9f9 100644
--- a/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/vo/DictVO.java
+++ b/blade-service-api/blade-dict-api/src/main/java/org/springblade/system/vo/DictVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.system.entity.Dict;
+import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -35,8 +36,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "DictVO对象", description = "DictVO对象")
-public class DictVO extends Dict implements INode {
+@Schema(description = "DictVO对象")
+public class DictVO extends Dict implements INode
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.cache;
+
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.system.feign.IApiScopeClient;
+
+import java.util.List;
+
+import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
+
+/**
+ * 接口权限缓存
+ *
+ * @author Chill
+ */
+public class ApiScopeCache {
+
+ private static final String SCOPE_CACHE_ROLE = "apiScope:role:";
+
+ private static final String SCOPE_CACHE_CODE = "apiScope:code:";
+
+ private static IApiScopeClient apiScopeClient;
+
+ private static IApiScopeClient getApiScopeClient() {
+ if (apiScopeClient == null) {
+ apiScopeClient = SpringUtil.getBean(IApiScopeClient.class);
+ }
+ return apiScopeClient;
+ }
+
+ /**
+ * 获取接口权限地址
+ *
+ * @param roleId 角色id
+ * @return permissions
+ */
+ public static List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.cache;
+
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.datascope.model.DataScopeModel;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.core.tool.utils.StringUtil;
+import org.springblade.system.feign.IDataScopeClient;
+
+import java.util.List;
+
+import static org.springblade.core.cache.utils.CacheUtil.SYS_CACHE;
+
+
+/**
+ * 数据权限缓存
+ *
+ * @author Chill
+ */
+public class DataScopeCache {
+
+ private static final String SCOPE_CACHE_CODE = "dataScope:code:";
+ private static final String SCOPE_CACHE_CLASS = "dataScope:class:";
+ private static final String DEPT_CACHE_ANCESTORS = "dept:ancestors:";
+
+ private static IDataScopeClient dataScopeClient;
+
+ private static IDataScopeClient getDataScopeClient() {
+ if (dataScopeClient == null) {
+ dataScopeClient = SpringUtil.getBean(IDataScopeClient.class);
+ }
+ return dataScopeClient;
+ }
+
+ /**
+ * 获取数据权限
+ *
+ * @param mapperId 数据权限mapperId
+ * @param roleId 用户角色集合
+ * @return DataScopeModel
+ */
+ public static DataScopeModel getDataScopeByMapper(String mapperId, String roleId) {
+ DataScopeModel dataScope = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_CLASS, mapperId + StringPool.COLON + roleId, DataScopeModel.class);
+ if (dataScope == null || !dataScope.getSearched()) {
+ dataScope = getDataScopeClient().getDataScopeByMapper(mapperId, roleId);
+ CacheUtil.put(SYS_CACHE, SCOPE_CACHE_CLASS, mapperId + StringPool.COLON + roleId, dataScope);
+ }
+ return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null;
+ }
+
+ /**
+ * 获取数据权限
+ *
+ * @param code 数据权限资源编号
+ * @return DataScopeModel
+ */
+ public static DataScopeModel getDataScopeByCode(String code) {
+ DataScopeModel dataScope = CacheUtil.get(SYS_CACHE, SCOPE_CACHE_CODE, code, DataScopeModel.class);
+ if (dataScope == null || !dataScope.getSearched()) {
+ dataScope = getDataScopeClient().getDataScopeByCode(code);
+ CacheUtil.put(SYS_CACHE, SCOPE_CACHE_CODE, code, dataScope);
+ }
+ return StringUtil.isNotBlank(dataScope.getResourceCode()) ? dataScope : null;
+ }
+
+ /**
+ * 获取部门子级
+ *
+ * @param deptId 部门id
+ * @return deptIds
+ */
+ public static List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.config;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.datascope.handler.ScopeModelHandler;
+import org.springblade.core.secure.config.RegistryConfiguration;
+import org.springblade.core.secure.handler.IPermissionHandler;
+import org.springblade.system.handler.ApiScopePermissionHandler;
+import org.springblade.system.handler.DataScopeModelHandler;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 公共封装包配置类
+ *
+ * @author Chill
+ */
+@Configuration(proxyBeanMethods = false)
+@AllArgsConstructor
+@AutoConfigureBefore(RegistryConfiguration.class)
+public class ScopeConfiguration {
+
+ @Bean
+ public ScopeModelHandler scopeModelHandler() {
+ return new DataScopeModelHandler();
+ }
+
+ @Bean
+ public IPermissionHandler permissionHandler() {
+ return new ApiScopePermissionHandler();
+ }
+
+}
diff --git a/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java
new file mode 100644
index 00000000..f51f37e0
--- /dev/null
+++ b/blade-service-api/blade-scope-api/src/main/java/org/springblade/system/feign/IApiScopeClient.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.feign;
+
+import org.springblade.core.launch.constant.AppConstant;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 接口权限Feign接口类
+ *
+ * @author Chill
+ */
+@FeignClient(value = AppConstant.APPLICATION_SYSTEM_NAME, fallback = IApiScopeClientFallback.class)
+public interface IApiScopeClient {
+
+ String API_PREFIX = "/feign/client/api-scope";
+ String PERMISSION_PATH = API_PREFIX + "/permission-path";
+ String PERMISSION_CODE = API_PREFIX + "/permission-code";
+
+ /**
+ * 获取接口权限地址
+ *
+ * @param roleId 角色id
+ * @return permissions
+ */
+ @GetMapping(PERMISSION_PATH)
+ List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.feign;
+
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * IApiScopeClientFallback
+ *
+ * @author Chill
+ */
+@Component
+public class IApiScopeClientFallback implements IApiScopeClient {
+ @Override
+ public List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.feign;
+
+import org.springblade.core.datascope.model.DataScopeModel;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 数据权限Feign接口类
+ *
+ * @author Chill
+ */
+@FeignClient(
+ value = AppConstant.APPLICATION_SYSTEM_NAME,
+ fallback = IDataScopeClientFallback.class
+)
+public interface IDataScopeClient {
+
+ String API_PREFIX = "/feign/client/data-scope";
+ String GET_DATA_SCOPE_BY_MAPPER = API_PREFIX + "/by-mapper";
+ String GET_DATA_SCOPE_BY_CODE = API_PREFIX + "/by-code";
+ String GET_DEPT_ANCESTORS = API_PREFIX + "/dept-ancestors";
+
+ /**
+ * 获取数据权限
+ *
+ * @param mapperId 数据权限mapperId
+ * @param roleId 用户角色集合
+ * @return DataScopeModel
+ */
+ @GetMapping(GET_DATA_SCOPE_BY_MAPPER)
+ DataScopeModel getDataScopeByMapper(@RequestParam("mapperId") String mapperId, @RequestParam("roleId") String roleId);
+
+ /**
+ * 获取数据权限
+ *
+ * @param code 数据权限资源编号
+ * @return DataScopeModel
+ */
+ @GetMapping(GET_DATA_SCOPE_BY_CODE)
+ DataScopeModel getDataScopeByCode(@RequestParam("code") String code);
+
+ /**
+ * 获取部门子级
+ *
+ * @param deptId 部门id
+ * @return deptIds
+ */
+ @GetMapping(GET_DEPT_ANCESTORS)
+ List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.feign;
+
+import org.springblade.core.datascope.model.DataScopeModel;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * IDataScopeClientFallback
+ *
+ * @author Chill
+ */
+@Component
+public class IDataScopeClientFallback implements IDataScopeClient {
+ @Override
+ public DataScopeModel getDataScopeByMapper(String mapperId, String roleId) {
+ return null;
+ }
+
+ @Override
+ public DataScopeModel getDataScopeByCode(String code) {
+ return null;
+ }
+
+ @Override
+ public List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.handler;
+
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.handler.IPermissionHandler;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.utils.WebUtil;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import java.util.List;
+
+import static org.springblade.system.cache.ApiScopeCache.*;
+
+/**
+ * 接口权限校验类
+ *
+ * @author Chill
+ */
+public class ApiScopePermissionHandler implements IPermissionHandler {
+
+ @Override
+ public boolean permissionAll() {
+ HttpServletRequest request = WebUtil.getRequest();
+ BladeUser user = AuthUtil.getUser();
+ if (request == null || user == null) {
+ return false;
+ }
+ String uri = request.getRequestURI();
+ List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.handler;
+
+import org.springblade.core.datascope.handler.ScopeModelHandler;
+import org.springblade.core.datascope.model.DataScopeModel;
+import org.springblade.system.cache.DataScopeCache;
+
+import java.util.List;
+
+/**
+ * 通用数据权限规则
+ *
+ * @author Chill
+ */
+public class DataScopeModelHandler implements ScopeModelHandler {
+
+ /**
+ * 获取数据权限
+ *
+ * @param mapperId 数据权限mapperId
+ * @param roleId 用户角色集合
+ * @return DataScopeModel
+ */
+ @Override
+ public DataScopeModel getDataScopeByMapper(String mapperId, String roleId) {
+ return DataScopeCache.getDataScopeByMapper(mapperId, roleId);
+ }
+
+ /**
+ * 获取数据权限
+ *
+ * @param code 数据权限资源编号
+ * @return DataScopeModel
+ */
+ @Override
+ public DataScopeModel getDataScopeByCode(String code) {
+ return DataScopeCache.getDataScopeByCode(code);
+ }
+
+ /**
+ * 获取部门子级
+ *
+ * @param deptId 部门id
+ * @return deptIds
+ */
+ @Override
+ public List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.cache;
+
+import org.springblade.core.cache.constant.CacheConstant;
+import org.springblade.core.cache.utils.CacheUtil;
+import org.springblade.core.tool.utils.SpringUtil;
+import org.springblade.core.tool.utils.StringPool;
+import org.springblade.system.entity.Dept;
+import org.springblade.system.entity.Role;
+import org.springblade.system.entity.Tenant;
+import org.springblade.system.feign.ISysClient;
+
+import java.util.List;
+
+/**
+ * 系统缓存工具类
+ *
+ * 通过 {@link SpringUtil} 在运行时懒加载 Feign 客户端,供各服务复用系统级数据缓存。
+ * 部门、岗位、角色、租户等数据统一缓存在 {@link CacheConstant#SYS_CACHE} 域中,
+ * 对应数据变更时由各 Service 清理该缓存域。
+ *
+ * @author Chill
+ */
+public class SysCache {
+
+ private static final String DEPT_ID = "dept:id:";
+ private static final String DEPT_IDS = "dept:ids:";
+ private static final String DEPT_NAMES = "dept:names:";
+ private static final String POST_IDS = "post:ids:";
+ private static final String POST_NAMES = "post:names:";
+ private static final String ROLE_ID = "role:id:";
+ private static final String ROLE_IDS = "role:ids:";
+ private static final String ROLE_NAMES = "role:names:";
+ private static final String TENANT_ID = "tenant:id:";
+ private static final String TENANT_TENANT_ID = "tenant:tenantId:";
+
+ private static ISysClient sysClient;
+
+ private static ISysClient getSysClient() {
+ if (sysClient == null) {
+ sysClient = SpringUtil.getBean(ISysClient.class);
+ }
+ return sysClient;
+ }
+
+ /**
+ * 获取部门
+ *
+ * @param id 主键
+ * @return Dept
+ */
+ public static Dept getDept(Long id) {
+ return CacheUtil.get(CacheConstant.SYS_CACHE, DEPT_ID, id, () -> getSysClient().getDept(id));
+ }
+
+ /**
+ * 获取部门主键集合
+ *
+ * @param tenantId 租户id
+ * @param deptNames 部门名称集合
+ * @return 部门主键集合
+ */
+ public static String getDeptIds(String tenantId, String deptNames) {
+ return CacheUtil.get(CacheConstant.SYS_CACHE, DEPT_IDS, tenantId + StringPool.DASH + deptNames, () -> getSysClient().getDeptIds(tenantId, deptNames));
+ }
+
+ /**
+ * 获取部门名称集合
+ *
+ * @param deptIds 部门主键集合
+ * @return 部门名称集合
+ */
+ public static List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Dept;
+import java.io.Serial;
+
/**
* 数据传输对象实体类
*
@@ -27,6 +29,7 @@
@Data
@EqualsAndHashCode(callSuper = true)
public class DeptDTO extends Dept {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/MenuDTO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/MenuDTO.java
index 80513cef..899ca500 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/MenuDTO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/MenuDTO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -26,6 +27,7 @@
*/
@Data
public class MenuDTO implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
private String alias;
private String path;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/ParamDTO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/ParamDTO.java
index c5b9631e..893cd192 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/ParamDTO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/ParamDTO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Param;
+import java.io.Serial;
+
/**
* 数据传输对象实体类
*
@@ -27,6 +29,7 @@
@Data
@EqualsAndHashCode(callSuper = true)
public class ParamDTO extends Param {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleDTO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleDTO.java
index c1c8dc14..066d5aa1 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleDTO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleDTO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Role;
+import java.io.Serial;
+
/**
* 数据传输对象实体类
*
@@ -27,6 +29,7 @@
@Data
@EqualsAndHashCode(callSuper = true)
public class RoleDTO extends Role {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleMenuDTO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleMenuDTO.java
index 2d7e8990..c37aec17 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleMenuDTO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/dto/RoleMenuDTO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.RoleMenu;
+import java.io.Serial;
+
/**
* 数据传输对象实体类
*
@@ -27,6 +29,7 @@
@Data
@EqualsAndHashCode(callSuper = true)
public class RoleMenuDTO extends RoleMenu {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java
new file mode 100644
index 00000000..4a87ebe2
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/ApiScope.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 实体类
+ *
+ * @author BladeX
+ */
+@Data
+@TableName("blade_scope_api")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "ApiScope对象")
+public class ApiScope extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 菜单主键
+ */
+ @Schema(description = "菜单主键")
+ private Long menuId;
+ /**
+ * 资源编号
+ */
+ @Schema(description = "资源编号")
+ private String resourceCode;
+ /**
+ * 接口权限名称
+ */
+ @Schema(description = "接口权限名称")
+ private String scopeName;
+ /**
+ * 接口权限字段
+ */
+ @Schema(description = "接口权限字段")
+ private String scopePath;
+ /**
+ * 接口权限类型
+ */
+ @Schema(description = "接口权限类型")
+ private Integer scopeType;
+ /**
+ * 接口权限备注
+ */
+ @Schema(description = "接口权限备注")
+ private String remark;
+
+
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AuthClient.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AuthClient.java
index 0d2cee13..136d84ff 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AuthClient.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/AuthClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
+
/**
* 实体类
*
@@ -35,15 +36,16 @@
@Data
@TableName("blade_client")
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "Client对象", description = "Client对象")
+@Schema(description = "Client对象")
public class AuthClient extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -51,57 +53,57 @@ public class AuthClient extends BaseEntity {
/**
* 客户端id
*/
- @ApiModelProperty(value = "客户端id")
+ @Schema(description = "客户端id")
private String clientId;
/**
* 客户端密钥
*/
- @ApiModelProperty(value = "客户端密钥")
+ @Schema(description = "客户端密钥")
private String clientSecret;
/**
* 资源集合
*/
- @ApiModelProperty(value = "资源集合")
+ @Schema(description = "资源集合")
private String resourceIds;
/**
* 授权范围
*/
- @ApiModelProperty(value = "授权范围")
+ @Schema(description = "授权范围")
private String scope;
/**
* 授权类型
*/
- @ApiModelProperty(value = "授权类型")
+ @Schema(description = "授权类型")
private String authorizedGrantTypes;
/**
* 回调地址
*/
- @ApiModelProperty(value = "回调地址")
+ @Schema(description = "回调地址")
private String webServerRedirectUri;
/**
* 权限
*/
- @ApiModelProperty(value = "权限")
+ @Schema(description = "权限")
private String authorities;
/**
* 令牌过期秒数
*/
- @ApiModelProperty(value = "令牌过期秒数")
+ @Schema(description = "令牌过期秒数")
private Integer accessTokenValidity;
/**
* 刷新令牌过期秒数
*/
- @ApiModelProperty(value = "刷新令牌过期秒数")
+ @Schema(description = "刷新令牌过期秒数")
private Integer refreshTokenValidity;
/**
* 附加说明
*/
- @ApiModelProperty(value = "附加说明")
+ @Schema(description = "附加说明")
private String additionalInformation;
/**
* 自动授权
*/
- @ApiModelProperty(value = "自动授权")
+ @Schema(description = "自动授权")
private String autoapprove;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/DataScope.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/DataScope.java
new file mode 100644
index 00000000..b08d8930
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/DataScope.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.io.Serial;
+
+/**
+ * 实体类
+ *
+ * @author BladeX
+ */
+@Data
+@TableName("blade_scope_data")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "DataScope对象")
+public class DataScope extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @Schema(description = "主键")
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ @JsonSerialize(using = ToStringSerializer.class)
+ private Long id;
+
+ /**
+ * 菜单主键
+ */
+ @Schema(description = "菜单主键")
+ private Long menuId;
+ /**
+ * 资源编号
+ */
+ @Schema(description = "资源编号")
+ private String resourceCode;
+ /**
+ * 数据权限名称
+ */
+ @Schema(description = "数据权限名称")
+ private String scopeName;
+ /**
+ * 数据权限可见字段
+ */
+ @Schema(description = "数据权限可见字段")
+ private String scopeField;
+ /**
+ * 数据权限类名
+ */
+ @Schema(description = "数据权限类名")
+ private String scopeClass;
+ /**
+ * 数据权限字段
+ */
+ @Schema(description = "数据权限字段")
+ private String scopeColumn;
+ /**
+ * 数据权限类型
+ */
+ @Schema(description = "数据权限类型")
+ private Integer scopeType;
+ /**
+ * 数据权限值域
+ */
+ @Schema(description = "数据权限值域")
+ private String scopeValue;
+ /**
+ * 数据权限备注
+ */
+ @Schema(description = "数据权限备注")
+ private String remark;
+
+
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java
index 9350877f..48c1040b 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Dept.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,10 +21,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -34,15 +34,16 @@
*/
@Data
@TableName("blade_dept")
-@ApiModel(value = "Dept对象", description = "Dept对象")
+@Schema(description = "Dept对象")
public class Dept implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,45 +51,51 @@ public class Dept implements Serializable {
/**
* 租户ID
*/
- @ApiModelProperty(value = "租户ID")
+ @Schema(description = "租户ID")
private String tenantId;
/**
* 父主键
*/
- @ApiModelProperty(value = "父主键")
+ @Schema(description = "父主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
+ /**
+ * 祖级机构主键
+ */
+ @Schema(description = "祖级机构主键")
+ private String ancestors;
+
/**
* 部门名
*/
- @ApiModelProperty(value = "部门名")
+ @Schema(description = "部门名")
private String deptName;
/**
* 部门全称
*/
- @ApiModelProperty(value = "部门全称")
+ @Schema(description = "部门全称")
private String fullName;
/**
* 排序
*/
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
private Integer sort;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
private String remark;
/**
* 是否已删除
*/
@TableLogic
- @ApiModelProperty(value = "是否已删除")
+ @Schema(description = "是否已删除")
private Integer isDeleted;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java
index f0448976..ec61d889 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Menu.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,12 +21,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springblade.core.tool.utils.Func;
+import java.io.Serial;
import java.io.Serializable;
+import java.util.Objects;
/**
* 实体类
@@ -35,15 +36,16 @@
*/
@Data
@TableName("blade_menu")
-@ApiModel(value = "Menu对象", description = "Menu对象")
+@Schema(description = "Menu对象")
public class Menu implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -51,75 +53,75 @@ public class Menu implements Serializable {
/**
* 菜单父主键
*/
- @ApiModelProperty(value = "父主键")
+ @Schema(description = "父主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
/**
* 菜单编号
*/
- @ApiModelProperty(value = "菜单编号")
+ @Schema(description = "菜单编号")
private String code;
/**
* 菜单名称
*/
- @ApiModelProperty(value = "菜单名称")
+ @Schema(description = "菜单名称")
private String name;
/**
* 菜单别名
*/
- @ApiModelProperty(value = "菜单别名")
+ @Schema(description = "菜单别名")
private String alias;
/**
* 请求地址
*/
- @ApiModelProperty(value = "请求地址")
+ @Schema(description = "请求地址")
private String path;
/**
* 菜单资源
*/
- @ApiModelProperty(value = "菜单资源")
+ @Schema(description = "菜单资源")
private String source;
/**
* 排序
*/
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
private Integer sort;
/**
* 菜单类型
*/
- @ApiModelProperty(value = "菜单类型")
+ @Schema(description = "菜单类型")
private Integer category;
/**
* 操作按钮类型
*/
- @ApiModelProperty(value = "操作按钮类型")
+ @Schema(description = "操作按钮类型")
private Integer action;
/**
* 是否打开新页面
*/
- @ApiModelProperty(value = "是否打开新页面")
+ @Schema(description = "是否打开新页面")
private Integer isOpen;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
private String remark;
/**
* 是否已删除
*/
@TableLogic
- @ApiModelProperty(value = "是否已删除")
+ @Schema(description = "是否已删除")
private Integer isDeleted;
@@ -132,10 +134,12 @@ public boolean equals(Object obj) {
return false;
}
Menu other = (Menu) obj;
- if (Func.equals(this.getId(), other.getId())) {
- return true;
- }
- return false;
+ return Func.equals(this.getId(), other.getId());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, parentId, code);
}
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Param.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Param.java
index 18cd575d..59df84f1 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Param.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Param.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
+
/**
* 实体类
*
@@ -34,15 +35,16 @@
@Data
@TableName("blade_param")
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "Param对象", description = "Param对象")
+@Schema(description = "Param对象")
public class Param extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,25 +52,25 @@ public class Param extends BaseEntity {
/**
* 参数名
*/
- @ApiModelProperty(value = "参数名")
+ @Schema(description = "参数名")
private String paramName;
/**
* 参数键
*/
- @ApiModelProperty(value = "参数键")
+ @Schema(description = "参数键")
private String paramKey;
/**
* 参数值
*/
- @ApiModelProperty(value = "参数值")
+ @Schema(description = "参数值")
private String paramValue;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
private String remark;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Post.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Post.java
index 782dd94f..66dc2548 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Post.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Post.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.TenantEntity;
+import java.io.Serial;
+
/**
* 岗位表实体类
*
@@ -34,15 +35,16 @@
@Data
@TableName("blade_post")
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "Post对象", description = "岗位表")
+@Schema(description = "Post对象")
public class Post extends TenantEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,27 +52,27 @@ public class Post extends TenantEntity {
/**
* 类型
*/
- @ApiModelProperty(value = "类型")
+ @Schema(description = "类型")
private Integer category;
/**
* 岗位编号
*/
- @ApiModelProperty(value = "岗位编号")
+ @Schema(description = "岗位编号")
private String postCode;
/**
* 岗位名称
*/
- @ApiModelProperty(value = "岗位名称")
+ @Schema(description = "岗位名称")
private String postName;
/**
* 岗位排序
*/
- @ApiModelProperty(value = "岗位排序")
+ @Schema(description = "岗位排序")
private Integer sort;
/**
* 岗位描述
*/
- @ApiModelProperty(value = "岗位描述")
+ @Schema(description = "岗位描述")
private String remark;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Region.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Region.java
index 2447890e..7e1e49b6 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Region.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Region.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,10 +18,10 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -31,96 +31,97 @@
*/
@Data
@TableName("blade_region")
-@ApiModel(value = "Region对象", description = "行政区划表")
+@Schema(description = "Region对象")
public class Region implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 区划编号
*/
@TableId(value = "code", type = IdType.INPUT)
- @ApiModelProperty(value = "区划编号")
+ @Schema(description = "区划编号")
private String code;
/**
* 父区划编号
*/
- @ApiModelProperty(value = "父区划编号")
+ @Schema(description = "父区划编号")
private String parentCode;
/**
* 祖区划编号
*/
- @ApiModelProperty(value = "祖区划编号")
+ @Schema(description = "祖区划编号")
private String ancestors;
/**
* 区划名称
*/
- @ApiModelProperty(value = "区划名称")
+ @Schema(description = "区划名称")
private String name;
/**
* 省级区划编号
*/
- @ApiModelProperty(value = "省级区划编号")
+ @Schema(description = "省级区划编号")
private String provinceCode;
/**
* 省级名称
*/
- @ApiModelProperty(value = "省级名称")
+ @Schema(description = "省级名称")
private String provinceName;
/**
* 市级区划编号
*/
- @ApiModelProperty(value = "市级区划编号")
+ @Schema(description = "市级区划编号")
private String cityCode;
/**
* 市级名称
*/
- @ApiModelProperty(value = "市级名称")
+ @Schema(description = "市级名称")
private String cityName;
/**
* 区级区划编号
*/
- @ApiModelProperty(value = "区级区划编号")
+ @Schema(description = "区级区划编号")
private String districtCode;
/**
* 区级名称
*/
- @ApiModelProperty(value = "区级名称")
+ @Schema(description = "区级名称")
private String districtName;
/**
* 镇级区划编号
*/
- @ApiModelProperty(value = "镇级区划编号")
+ @Schema(description = "镇级区划编号")
private String townCode;
/**
* 镇级名称
*/
- @ApiModelProperty(value = "镇级名称")
+ @Schema(description = "镇级名称")
private String townName;
/**
* 村级区划编号
*/
- @ApiModelProperty(value = "村级区划编号")
+ @Schema(description = "村级区划编号")
private String villageCode;
/**
* 村级名称
*/
- @ApiModelProperty(value = "村级名称")
+ @Schema(description = "村级名称")
private String villageName;
/**
* 层级
*/
- @ApiModelProperty(value = "层级")
+ @Schema(description = "层级")
private Integer level;
/**
* 排序
*/
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
private Integer sort;
/**
* 备注
*/
- @ApiModelProperty(value = "备注")
+ @Schema(description = "备注")
private String remark;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java
index d83cd7d5..642e45aa 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Role.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,10 +21,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -34,15 +34,16 @@
*/
@Data
@TableName("blade_role")
-@ApiModel(value = "Role对象", description = "Role对象")
+@Schema(description = "Role对象")
public class Role implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,39 +51,39 @@ public class Role implements Serializable {
/**
* 租户ID
*/
- @ApiModelProperty(value = "租户ID")
+ @Schema(description = "租户ID")
private String tenantId;
/**
* 父主键
*/
- @ApiModelProperty(value = "父主键")
+ @Schema(description = "父主键")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;
/**
* 角色名
*/
- @ApiModelProperty(value = "角色名")
+ @Schema(description = "角色名")
private String roleName;
/**
* 排序
*/
- @ApiModelProperty(value = "排序")
+ @Schema(description = "排序")
private Integer sort;
/**
* 角色别名
*/
- @ApiModelProperty(value = "角色别名")
+ @Schema(description = "角色别名")
private String roleAlias;
/**
* 是否已删除
*/
@TableLogic
- @ApiModelProperty(value = "是否已删除")
+ @Schema(description = "是否已删除")
private Integer isDeleted;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java
index 66d9eaea..e7470cc2 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleMenu.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,10 +20,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -33,15 +33,16 @@
*/
@Data
@TableName("blade_role_menu")
-@ApiModel(value = "RoleMenu对象", description = "RoleMenu对象")
+@Schema(description = "RoleMenu对象")
public class RoleMenu implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -49,14 +50,14 @@ public class RoleMenu implements Serializable {
/**
* 菜单id
*/
- @ApiModelProperty(value = "菜单id")
+ @Schema(description = "菜单id")
@JsonSerialize(using = ToStringSerializer.class)
private Long menuId;
/**
* 角色id
*/
- @ApiModelProperty(value = "角色id")
+ @Schema(description = "角色id")
@JsonSerialize(using = ToStringSerializer.class)
private Long roleId;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java
new file mode 100644
index 00000000..94028e25
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/RoleScope.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 实体类
+ *
+ * @author Chill
+ */
+@Data
+@TableName("blade_role_scope")
+@Schema(description = "RoleScope对象")
+public class RoleScope implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ @Schema(description = "主键")
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 权限类型
+ */
+ @Schema(description = "权限类型")
+ private Integer scopeCategory;
+
+ /**
+ * 权限id
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ @Schema(description = "权限id")
+ private Long scopeId;
+
+ /**
+ * 角色id
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ @Schema(description = "角色id")
+ private Long roleId;
+
+
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
index a9b6915b..6272bb55 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/Tenant.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,12 +20,13 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
+import java.io.Serial;
+
/**
* 实体类
*
@@ -34,15 +35,16 @@
@Data
@TableName("blade_tenant")
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "Tenant对象", description = "Tenant对象")
+@Schema(description = "Tenant对象")
public class Tenant extends BaseEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@@ -50,32 +52,32 @@ public class Tenant extends BaseEntity {
/**
* 租户ID
*/
- @ApiModelProperty(value = "租户ID")
+ @Schema(description = "租户ID")
private String tenantId;
/**
* 租户名称
*/
- @ApiModelProperty(value = "租户名称")
+ @Schema(description = "租户名称")
private String tenantName;
/**
* 域名地址
*/
- @ApiModelProperty(value = "域名地址")
+ @Schema(description = "域名地址")
private String domain;
/**
* 联系人
*/
- @ApiModelProperty(value = "联系人")
+ @Schema(description = "联系人")
private String linkman;
/**
* 联系电话
*/
- @ApiModelProperty(value = "联系电话")
+ @Schema(description = "联系电话")
private String contactNumber;
/**
* 联系地址
*/
- @ApiModelProperty(value = "联系地址")
+ @Schema(description = "联系地址")
private String address;
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenu.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenu.java
new file mode 100644
index 00000000..e17a660d
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenu.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * 顶部菜单表实体类
+ *
+ * @author BladeX
+ */
+@Data
+@TableName("blade_top_menu")
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "顶部菜单表")
+public class TopMenu extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 顶部菜单编号
+ */
+ @Schema(description = "顶部菜单编号")
+ private String code;
+ /**
+ * 顶部菜单名
+ */
+ @Schema(description = "顶部菜单名")
+ private String name;
+ /**
+ * 顶部菜单资源
+ */
+ @Schema(description = "顶部菜单资源")
+ private String source;
+ /**
+ * 顶部菜单路由
+ */
+ @Schema(description = "顶部菜单路由")
+ private String path;
+ /**
+ * 顶部菜单排序
+ */
+ @Schema(description = "顶部菜单排序")
+ private Integer sort;
+
+
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenuSetting.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenuSetting.java
new file mode 100644
index 00000000..967fc632
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/entity/TopMenuSetting.java
@@ -0,0 +1,38 @@
+package org.springblade.system.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import lombok.Data;
+
+/**
+ * TopMenuSetting
+ *
+ * @author Chill
+ */
+@Data
+@TableName("blade_top_menu_setting")
+public class TopMenuSetting {
+
+ /**
+ * 主键id
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ @TableId(value = "id", type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 顶部菜单id
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ private Long topMenuId;
+
+ /**
+ * 菜单id
+ */
+ @JsonSerialize(using = ToStringSerializer.class)
+ private Long menuId;
+
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
index 302b5f25..da23da69 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -37,7 +37,7 @@
)
public interface ISysClient {
- String API_PREFIX = "/sys";
+ String API_PREFIX = "/feign/client/system";
/**
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
index f4578ab1..83958bab 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java
new file mode 100644
index 00000000..0826e5e1
--- /dev/null
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/ApiScopeVO.java
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.entity.ApiScope;
+
+import java.io.Serial;
+
+/**
+ * 视图实体类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "ApiScopeVO对象")
+public class ApiScopeVO extends ApiScope {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 规则类型名
+ */
+ private String scopeTypeName;
+}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/props/RouteResource.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java
similarity index 60%
rename from blade-gateway/src/main/java/org/springblade/gateway/props/RouteResource.java
rename to blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java
index a279a400..023ec611 100644
--- a/blade-gateway/src/main/java/org/springblade/gateway/props/RouteResource.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/CheckedTreeVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,32 +13,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springblade.gateway.props;
+package org.springblade.system.vo;
import lombok.Data;
-import org.springblade.core.launch.constant.AppConstant;
+
+import java.util.List;
/**
- * Swagger聚合文档属性
+ * CheckedTreeVO
*
* @author Chill
*/
@Data
-public class RouteResource {
+public class CheckedTreeVO {
- /**
- * 文档名
- */
- private String name;
+ private List
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.springblade.system.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.system.entity.DataScope;
+
+import java.io.Serial;
+
+/**
+ * 视图实体类
+ *
+ * @author Chill
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Schema(description = "DataScopeVO对象")
+public class DataScopeVO extends DataScope {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 规则类型名
+ */
+ private String scopeTypeName;
+}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java
index 80bcb39b..511d1900 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/DeptVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.system.entity.Dept;
+import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -34,8 +35,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "DeptVO对象", description = "DeptVO对象")
-public class DeptVO extends Dept implements INode {
+@Schema(description = "DeptVO对象")
+public class DeptVO extends Dept implements INode
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,25 +13,28 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.springblade.gateway.props;
+package org.springblade.system.vo;
import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
-import java.util.ArrayList;
+import java.io.Serial;
+import java.io.Serializable;
import java.util.List;
/**
- * 路由配置类
+ * GrantTreeVO
*
* @author Chill
*/
@Data
-@RefreshScope
-@ConfigurationProperties("blade.document")
-public class RouteProperties {
+public class GrantTreeVO implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
- private final List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,9 +15,10 @@
*/
package org.springblade.system.vo;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@@ -28,12 +29,22 @@
*/
@Data
public class GrantVO implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
- @ApiModelProperty(value = "roleIds集合")
+ @Schema(description = "roleIds集合")
private List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.system.entity.Menu;
+import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -34,8 +35,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "MenuVO对象", description = "MenuVO对象")
-public class MenuVO extends Menu implements INode {
+@Schema(description = "MenuVO对象")
+public class MenuVO extends Menu implements INode
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,11 +15,13 @@
*/
package org.springblade.system.vo;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Param;
+import java.io.Serial;
+
/**
* 视图实体类
*
@@ -27,8 +29,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "ParamVO对象", description = "ParamVO对象")
+@Schema(description = "ParamVO对象")
public class ParamVO extends Param {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/PostVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/PostVO.java
index dff4c498..55bcff67 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/PostVO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/PostVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,11 +15,13 @@
*/
package org.springblade.system.vo;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.Post;
+import java.io.Serial;
+
/**
* 岗位表视图实体类
*
@@ -27,8 +29,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "PostVO对象", description = "岗位表")
+@Schema(description = "PostVO对象")
public class PostVO extends Post {
+ @Serial
private static final long serialVersionUID = 1L;
/**
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RegionVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RegionVO.java
index 9ff9259b..4ebcdba3 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RegionVO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RegionVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,13 +18,14 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.entity.Region;
+import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -35,8 +36,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "RegionVO对象", description = "行政区划表")
-public class RegionVO extends Region implements INode {
+@Schema(description = "RegionVO对象")
+public class RegionVO extends Region implements INode
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,11 +15,13 @@
*/
package org.springblade.system.vo;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.system.entity.RoleMenu;
+import java.io.Serial;
+
/**
* 视图实体类
*
@@ -27,8 +29,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "RoleMenuVO对象", description = "RoleMenuVO对象")
+@Schema(description = "RoleMenuVO对象")
public class RoleMenuVO extends RoleMenu {
+ @Serial
private static final long serialVersionUID = 1L;
}
diff --git a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO.java b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO.java
index 53f7bec4..e5e9a073 100644
--- a/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO.java
+++ b/blade-service-api/blade-system-api/src/main/java/org/springblade/system/vo/RoleVO.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,12 +18,13 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.system.entity.Role;
+import java.io.Serial;
import java.util.ArrayList;
import java.util.List;
@@ -34,8 +35,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "RoleVO对象", description = "RoleVO对象")
-public class RoleVO extends Role implements INode {
+@Schema(description = "RoleVO对象")
+public class RoleVO extends Role implements INode
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,11 +20,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.TenantEntity;
+import java.io.Serial;
import java.util.Date;
/**
@@ -37,12 +38,13 @@
@EqualsAndHashCode(callSuper = true)
public class User extends TenantEntity {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/UserInfo.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/UserInfo.java
index bb171c6e..5290b21a 100644
--- a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/UserInfo.java
+++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/entity/UserInfo.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,10 +15,10 @@
*/
package org.springblade.system.user.entity;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@@ -28,33 +28,34 @@
* @author Chill
*/
@Data
-@ApiModel(description = "用户信息")
+@Schema(description = "用户信息")
public class UserInfo implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
/**
* 用户基础信息
*/
- @ApiModelProperty(value = "用户")
+ @Schema(description = "用户")
private User user;
/**
* 权限标识集合
*/
- @ApiModelProperty(value = "权限集合")
+ @Schema(description = "权限集合")
private List
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,9 +20,10 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.io.Serial;
import java.io.Serializable;
/**
@@ -34,6 +35,7 @@
@TableName("blade_user_oauth")
public class UserOauth implements Serializable {
+ @Serial
private static final long serialVersionUID = 1L;
@@ -41,7 +43,7 @@ public class UserOauth implements Serializable {
* 主键
*/
@JsonSerialize(using = ToStringSerializer.class)
- @ApiModelProperty(value = "主键")
+ @Schema(description = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@@ -59,7 +61,7 @@ public class UserOauth implements Serializable {
* 用户ID
*/
@JsonSerialize(using = ToStringSerializer.class)
- @ApiModelProperty(value = "用户主键")
+ @Schema(description = "用户主键")
private Long userId;
/**
diff --git a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
index d23693a2..ef222bc1 100644
--- a/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
+++ b/blade-service-api/blade-user-api/src/main/java/org/springblade/system/user/feign/IUserClient.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
-import org.springblade.system.user.entity.User;
import org.springblade.system.user.entity.UserInfo;
import org.springblade.system.user.entity.UserOauth;
import org.springframework.cloud.openfeign.FeignClient;
@@ -33,12 +32,12 @@
* @author Chill
*/
@FeignClient(
- value = AppConstant.APPLICATION_USER_NAME,
+ value = AppConstant.APPLICATION_SYSTEM_NAME,
fallback = IUserClientFallback.class
)
public interface IUserClient {
- String API_PREFIX = "/user";
+ String API_PREFIX = "/feign/client/user";
/**
* 获取用户信息
@@ -68,14 +67,4 @@ public interface IUserClient {
*/
@PostMapping(API_PREFIX + "/user-auth-info")
R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@
package org.springblade.system.user.feign;
import org.springblade.core.tool.api.R;
-import org.springblade.system.user.entity.User;
import org.springblade.system.user.entity.UserInfo;
import org.springblade.system.user.entity.UserOauth;
import org.springframework.stereotype.Component;
@@ -44,8 +43,4 @@ public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,11 +17,15 @@
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModel;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import org.springblade.core.tool.jackson.BladeView;
+import org.springblade.core.tool.jackson.Views;
import org.springblade.system.user.entity.User;
+import java.io.Serial;
+
/**
* 视图实体类
*
@@ -29,8 +33,9 @@
*/
@Data
@EqualsAndHashCode(callSuper = true)
-@ApiModel(value = "UserVO对象", description = "UserVO对象")
+@Schema(description = "UserVO对象")
public class UserVO extends User {
+ @Serial
private static final long serialVersionUID = 1L;
/**
@@ -42,20 +47,24 @@ public class UserVO extends User {
/**
* 角色名
*/
+ @BladeView(Views.Summary.class)
private String roleName;
/**
* 部门名
*/
+ @BladeView(Views.Summary.class)
private String deptName;
/**
* 岗位名
*/
+ @BladeView(Views.Detail.class)
private String postName;
/**
* 性别
*/
+ @BladeView(Views.Detail.class)
private String sexName;
}
diff --git a/blade-service-api/pom.xml b/blade-service-api/pom.xml
index 887d7423..b8d623a2 100644
--- a/blade-service-api/pom.xml
+++ b/blade-service-api/pom.xml
@@ -5,13 +5,12 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,15 +15,15 @@
*/
package com.example.demo;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
-import org.springframework.cloud.client.SpringCloudApplication;
/**
* Demo启动器
*
* @author Chill
*/
-@SpringCloudApplication
+@BladeCloudApplication
public class DemoApplication {
public static void main(String[] args) {
diff --git a/blade-service/blade-demo/src/main/java/com/example/demo/config/DemoConfiguration.java b/blade-service/blade-demo/src/main/java/com/example/demo/config/DemoConfiguration.java
index 16295150..d54045c1 100644
--- a/blade-service/blade-demo/src/main/java/com/example/demo/config/DemoConfiguration.java
+++ b/blade-service/blade-demo/src/main/java/com/example/demo/config/DemoConfiguration.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
*
* @author Chill
*/
-@Configuration
+@Configuration(proxyBeanMethods = false)
@EnableFeignClients({"org.springblade", "com.example"})
@MapperScan({"org.springblade.**.mapper.**", "com.example.**.mapper.**"})
@EnableConfigurationProperties(DemoProperties.class)
diff --git a/blade-service/blade-demo/src/main/java/com/example/demo/controller/DemoController.java b/blade-service/blade-demo/src/main/java/com/example/demo/controller/DemoController.java
index 62106fe7..f99653fe 100644
--- a/blade-service/blade-demo/src/main/java/com/example/demo/controller/DemoController.java
+++ b/blade-service/blade-demo/src/main/java/com/example/demo/controller/DemoController.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,7 +16,8 @@
package com.example.demo.controller;
import com.example.demo.props.DemoProperties;
-import io.swagger.annotations.Api;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
@@ -31,10 +32,11 @@
@RefreshScope
@RestController
@RequestMapping("demo")
-@Api(value = "配置接口", tags = "即时刷新配置")
+@ApiOrder
+@Tag(name = "配置接口", description = "即时刷新配置")
public class DemoController {
- @Value("${demo.name}")
+ @Value("${demo.name:1}")
private String name;
private final DemoProperties properties;
diff --git a/blade-service/blade-demo/src/main/java/com/example/demo/controller/DynamicController.java b/blade-service/blade-demo/src/main/java/com/example/demo/controller/DynamicController.java
index 6ba52cdd..842700a8 100644
--- a/blade-service/blade-demo/src/main/java/com/example/demo/controller/DynamicController.java
+++ b/blade-service/blade-demo/src/main/java/com/example/demo/controller/DynamicController.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,10 +17,10 @@
import com.example.demo.entity.Notice;
import com.example.demo.service.IDynamicService;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -36,7 +36,8 @@
@RestController
@AllArgsConstructor
@RequestMapping("dynamic")
-@Api(value = "多数据源接口", tags = "多数据源")
+@ApiOrder
+@Tag(name = "多数据源接口", description = "多数据源")
public class DynamicController {
private IDynamicService dynamicService;
@@ -45,8 +46,7 @@ public class DynamicController {
* master列表
*/
@GetMapping("/master-list")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "master列表", notes = "master列表")
+ @Operation(summary = "master列表", description = "master列表")
public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,17 +18,21 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.demo.entity.Notice;
import com.example.demo.service.INoticeService;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import io.swagger.annotations.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springblade.common.cache.CacheNames;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.web.bind.annotation.*;
-import springfox.documentation.annotations.ApiIgnore;
import java.util.Map;
@@ -40,7 +44,8 @@
@RestController
@RequestMapping("notice")
@AllArgsConstructor
-@Api(value = "用户博客", tags = "博客接口")
+@ApiOrder
+@Tag(name = "用户博客", description = "博客接口")
public class NoticeController extends BladeController implements CacheNames {
private INoticeService noticeService;
@@ -49,8 +54,7 @@ public class NoticeController extends BladeController implements CacheNames {
* 详情
*/
@GetMapping("/detail")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "详情", notes = "传入notice")
+ @Operation(summary = "详情", description = "传入notice")
public R
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
-import springfox.documentation.annotations.ApiIgnore;
+import io.swagger.v3.oas.annotations.Hidden;
import java.util.List;
@@ -30,7 +30,7 @@
*
* @author Chill
*/
-@ApiIgnore()
+@Hidden
@RestController
@AllArgsConstructor
public class NoticeClient implements INoticeClient {
diff --git a/blade-service/blade-demo/src/main/java/com/example/demo/launcher/DemoLauncherServiceImpl.java b/blade-service/blade-demo/src/main/java/com/example/demo/launcher/DemoLauncherServiceImpl.java
index c1f967d4..8f2b0ea3 100644
--- a/blade-service/blade-demo/src/main/java/com/example/demo/launcher/DemoLauncherServiceImpl.java
+++ b/blade-service/blade-demo/src/main/java/com/example/demo/launcher/DemoLauncherServiceImpl.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,8 @@ public void launcher(SpringApplicationBuilder builder, String appName, String pr
PropsUtil.setProperty(props, "spring.cloud.nacos.config.ext-config[0].data-id", NacosConstant.dataId("blade-demo", profile));
PropsUtil.setProperty(props, "spring.cloud.nacos.config.ext-config[0].group", NacosConstant.NACOS_CONFIG_GROUP);
PropsUtil.setProperty(props, "spring.cloud.nacos.config.ext-config[0].refresh", NacosConstant.NACOS_CONFIG_REFRESH);
+ // 开启多数据源
+ PropsUtil.setProperty(props, "spring.datasource.dynamic.enabled", "true");
// 自定义命名空间
// PropsUtil.setProperty(props, "spring.cloud.nacos.config.namespace", LauncherConstant.NACOS_NAMESPACE);
// PropsUtil.setProperty(props, "spring.cloud.nacos.discovery.namespace", LauncherConstant.NACOS_NAMESPACE);
diff --git a/blade-service/blade-demo/src/main/java/com/example/demo/mapper/NoticeMapper.java b/blade-service/blade-demo/src/main/java/com/example/demo/mapper/NoticeMapper.java
index a69dbd8d..93b50286 100644
--- a/blade-service/blade-demo/src/main/java/com/example/demo/mapper/NoticeMapper.java
+++ b/blade-service/blade-demo/src/main/java/com/example/demo/mapper/NoticeMapper.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,16 +30,16 @@ public interface NoticeMapper extends BaseMapper
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,14 +30,14 @@ public interface IDynamicService extends BaseService
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,9 +28,9 @@ public interface INoticeService extends BaseService
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/blade-service/blade-demo/src/main/resources/application-dev.yml b/blade-service/blade-demo/src/main/resources/application-dev.yml
index 38426fa1..600cbdcc 100644
--- a/blade-service/blade-demo/src/main/resources/application-dev.yml
+++ b/blade-service/blade-demo/src/main/resources/application-dev.yml
@@ -12,7 +12,7 @@ server:
spring:
#排除DruidDataSourceAutoConfigure
autoconfigure:
- exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master
diff --git a/blade-service/blade-demo/src/main/resources/application-prod.yml b/blade-service/blade-demo/src/main/resources/application-prod.yml
index da892629..053bf056 100644
--- a/blade-service/blade-demo/src/main/resources/application-prod.yml
+++ b/blade-service/blade-demo/src/main/resources/application-prod.yml
@@ -12,7 +12,7 @@ server:
spring:
#排除DruidDataSourceAutoConfigure
autoconfigure:
- exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master
diff --git a/blade-service/blade-demo/src/main/resources/application-test.yml b/blade-service/blade-demo/src/main/resources/application-test.yml
index 4b4e157a..42ce581e 100644
--- a/blade-service/blade-demo/src/main/resources/application-test.yml
+++ b/blade-service/blade-demo/src/main/resources/application-test.yml
@@ -12,7 +12,7 @@ server:
spring:
#排除DruidDataSourceAutoConfigure
autoconfigure:
- exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
+ exclude: com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure
datasource:
dynamic:
#设置默认的数据源或者数据源组,默认值即为master
diff --git a/blade-service/blade-desk/Dockerfile b/blade-service/blade-desk/Dockerfile
index 728663e8..392abd1a 100644
--- a/blade-service/blade-desk/Dockerfile
+++ b/blade-service/blade-desk/Dockerfile
@@ -1,6 +1,6 @@
-FROM anapsix/alpine-java:8_server-jre_unlimited
+FROM bladex/alpine-java:openjdk21_cn_slim
-MAINTAINER smallchill@163.com
+MAINTAINER bladejava@qq.com
RUN mkdir -p /blade/desk
@@ -10,6 +10,6 @@ EXPOSE 8105
ADD ./target/blade-desk.jar ./app.jar
-ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
+ENTRYPOINT ["java", "--add-opens", "java.base/java.lang=ALL-UNNAMED", "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
diff --git a/blade-service/blade-desk/pom.xml b/blade-service/blade-desk/pom.xml
index e0240bdd..aaf44d55 100644
--- a/blade-service/blade-desk/pom.xml
+++ b/blade-service/blade-desk/pom.xml
@@ -6,41 +6,35 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,18 +15,16 @@
*/
package org.springblade.desk;
+import org.springblade.core.cloud.client.BladeCloudApplication;
import org.springblade.core.launch.BladeApplication;
import org.springblade.core.launch.constant.AppConstant;
-import org.springframework.cloud.client.SpringCloudApplication;
-import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* Desk启动器
*
* @author Chill
*/
-@SpringCloudApplication
-@EnableFeignClients(AppConstant.BASE_PACKAGES)
+@BladeCloudApplication
public class DeskApplication {
public static void main(String[] args) {
diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/controller/DashBoardController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/controller/DashBoardController.java
index 6f5b4e49..a6d23774 100644
--- a/blade-service/blade-desk/src/main/java/org/springblade/desk/controller/DashBoardController.java
+++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/controller/DashBoardController.java
@@ -1,8 +1,9 @@
package org.springblade.desk.controller;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
import lombok.AllArgsConstructor;
+import org.springblade.core.swagger.annotation.ApiOrder;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.support.Kv;
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,16 +23,15 @@
@RestController
@RequestMapping("dashboard")
@AllArgsConstructor
-@Api(value = "首页", tags = "首页")
+@ApiOrder
+@Tag(name = "首页", description = "首页")
public class DashBoardController {
/**
* 活跃用户
- *
- * @return
*/
@GetMapping("/activities")
- @ApiOperation(value = "活跃用户", notes = "活跃用户")
+ @Operation(summary = "活跃用户", description = "活跃用户")
public R activities() {
List> viewResolversProvider,
- ServerCodecConfigurer serverCodecConfigurer,
- ApplicationContext applicationContext) {
- this.serverProperties = serverProperties;
- this.applicationContext = applicationContext;
- this.resourceProperties = resourceProperties;
- this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
- this.serverCodecConfigurer = serverCodecConfigurer;
- }
-
- @Bean
- @Order(Ordered.HIGHEST_PRECEDENCE)
- public ErrorWebExceptionHandler errorWebExceptionHandler(ErrorAttributes errorAttributes) {
- ErrorExceptionHandler exceptionHandler = new ErrorExceptionHandler(
- errorAttributes,
- this.resourceProperties,
- this.serverProperties.getError(),
- this.applicationContext);
- exceptionHandler.setViewResolvers(this.viewResolvers);
- exceptionHandler.setMessageWriters(this.serverCodecConfigurer.getWriters());
- exceptionHandler.setMessageReaders(this.serverCodecConfigurer.getReaders());
- return exceptionHandler;
- }
-
-}
diff --git a/blade-gateway/src/main/java/org/springblade/gateway/config/JwtConfiguration.java b/blade-gateway/src/main/java/org/springblade/gateway/config/JwtConfiguration.java
new file mode 100644
index 00000000..45b35262
--- /dev/null
+++ b/blade-gateway/src/main/java/org/springblade/gateway/config/JwtConfiguration.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
+ *
detail(Code code) {
Code detail = codeService.getOne(Condition.getQueryWrapper(code));
return R.data(detail);
@@ -69,14 +74,13 @@ public R detail(Code code) {
* 分页
*/
@GetMapping("/list")
- @ApiImplicitParams({
- @ApiImplicitParam(name = "codeName", value = "模块名", paramType = "query", dataType = "string"),
- @ApiImplicitParam(name = "tableName", value = "表名", paramType = "query", dataType = "string"),
- @ApiImplicitParam(name = "modelName", value = "实体名", paramType = "query", dataType = "string")
+ @Parameters({
+ @Parameter(name = "codeName", description = "模块名", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
+ @Parameter(name = "tableName", description = "表名", in = ParameterIn.QUERY, schema = @Schema(type = "string")),
+ @Parameter(name = "modelName", description = "实体名", in = ParameterIn.QUERY, schema = @Schema(type = "string"))
})
- @ApiOperationSupport(order = 2)
- @ApiOperation(value = "分页", notes = "传入code")
- public R pages = codeService.page(Condition.getPage(query), Condition.getQueryWrapper(code, Code.class));
return R.data(pages);
}
@@ -85,8 +89,7 @@ public R codes = codeService.listByIds(Func.toLongList(ids));
codes.forEach(code -> {
BladeCodeGenerator generator = new BladeCodeGenerator();
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java
index 4ca5a887..b7b04325 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/DatasourceController.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
* > select() {
List
{
/**
* 提交
*
- * @param code
- * @return
+ * @param code 代码生成配置对象
+ * @return 是否提交成功
*/
boolean submit(Code code);
diff --git a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/IDatasourceService.java b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/IDatasourceService.java
index d8109f3e..0321b49d 100644
--- a/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/IDatasourceService.java
+++ b/blade-ops/blade-develop/src/main/java/org/springblade/develop/service/IDatasourceService.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
+ * Copyright (c) 2018-2099, Chill Zhuang 庄骞 (bladejava@qq.com).
* > masterList() {
List
> masterList() {
* slave列表
*/
@GetMapping("/slave-list")
- @ApiOperationSupport(order = 1)
- @ApiOperation(value = "slave列表", notes = "slave列表")
+ @Operation(summary = "slave列表", description = "slave列表")
public R
> slaveList() {
List