diff --git a/README.md b/README.md
index a5ff454f..f2eabce6 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
-
+
@@ -225,16 +225,16 @@ public class DeptController extends BaseControllerVue | 3.5.4 | 渐进式 JavaScript 框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 |
| Arco Design | 2.57.0 | 字节跳动推出的前端 UI 框架,年轻化的色彩和组件设计。 |
| TypeScript | 5.0.4 | TypeScript 是微软开发的一个开源的编程语言,通过在 JavaScript 的基础上添加静态类型定义构建而成。 |
| Vite | 5.1.5 | 下一代的前端工具链,为开发提供极速响应。 |
-| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.10.0 | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken),可轻松集成到应用中,为开发人员减少手动引入依赖及配置的麻烦,为 Spring Boot Web 项目的灵活快速构建提供支持。 |
+| [ContiNew Starter](https://github.com/continew-org/continew-starter) | 2.11.0 | ContiNew Starter 包含了一系列经过企业实践优化的依赖包(如 MyBatis-Plus、SaToken),可轻松集成到应用中,为开发人员减少手动引入依赖及配置的麻烦,为 Spring Boot Web 项目的灵活快速构建提供支持。 |
| Spring Boot | 3.3.9 | 简化 Spring 应用的初始搭建和开发过程,基于“约定优于配置”的理念,使开发人员不再需要定义样板化的配置。(Spring Boot 3.0 开始,要求 Java 17 作为最低版本) |
| Undertow | 2.3.18.Final | 采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制。 |
-| Sa-Token + JWT | 1.40.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 |
+| Sa-Token + JWT | 1.41.0 | 轻量级 Java 权限认证框架,让鉴权变得简单、优雅。 |
| MyBatis Plus | 3.5.8 | MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。 |
| dynamic-datasource-spring-boot-starter | 4.3.1 | 基于 Spring Boot 的快速集成多数据源的启动器。 |
| Hikari | 5.1.0 | JDBC 连接池,号称 “史上最快连接池”,SpringBoot 在 2.0 之后,采用的默认数据库连接池就是 Hikari。 |
diff --git a/continew-module-system/src/main/java/top/continew/admin/auth/AbstractLoginHandler.java b/continew-module-system/src/main/java/top/continew/admin/auth/AbstractLoginHandler.java
index bb80cfdd..24280751 100644
--- a/continew-module-system/src/main/java/top/continew/admin/auth/AbstractLoginHandler.java
+++ b/continew-module-system/src/main/java/top/continew/admin/auth/AbstractLoginHandler.java
@@ -16,8 +16,8 @@
package top.continew.admin.auth;
-import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
+import cn.dev33.satoken.stp.parameter.SaLoginParameter;
import cn.hutool.core.bean.BeanUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
@@ -38,7 +38,7 @@ import top.continew.admin.system.service.RoleService;
import top.continew.admin.system.service.UserService;
import top.continew.starter.core.validation.CheckUtils;
import top.continew.starter.core.validation.Validator;
-import top.continew.starter.web.util.SpringWebUtils;
+import top.continew.starter.web.util.ServletUtils;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
@@ -101,16 +101,16 @@ public abstract class AbstractLoginHandler implements LoginH
.join(), passwordExpirationDaysFuture.join());
BeanUtil.copyProperties(user, userContext);
// 设置登录配置参数
- SaLoginModel model = new SaLoginModel();
- model.setActiveTimeout(client.getActiveTimeout());
- model.setTimeout(client.getTimeout());
- model.setDevice(client.getClientType());
+ SaLoginParameter loginParameter = new SaLoginParameter();
+ loginParameter.setActiveTimeout(client.getActiveTimeout());
+ loginParameter.setTimeout(client.getTimeout());
+ loginParameter.setDeviceType(client.getClientType());
userContext.setClientType(client.getClientType());
- model.setExtra(CLIENT_ID, client.getClientId());
+ loginParameter.setExtra(CLIENT_ID, client.getClientId());
userContext.setClientId(client.getClientId());
// 登录并缓存用户信息
- StpUtil.login(userContext.getId(), model.setExtraData(BeanUtil.beanToMap(new UserExtraContext(SpringWebUtils
- .getRequest()))));
+ StpUtil.login(userContext.getId(), loginParameter.setExtraData(BeanUtil
+ .beanToMap(new UserExtraContext(ServletUtils.getRequest()))));
UserContextHolder.setContext(userContext);
return StpUtil.getTokenValue();
}
diff --git a/continew-module-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java b/continew-module-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
index 3911e74b..f1d1b1f9 100644
--- a/continew-module-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
+++ b/continew-module-system/src/main/java/top/continew/admin/auth/handler/SocialLoginHandler.java
@@ -23,7 +23,6 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.json.JSONUtil;
-import com.xkcoding.justauth.AuthRequestFactory;
import com.xkcoding.justauth.autoconfigure.JustAuthProperties;
import jakarta.servlet.http.HttpServletRequest;
@@ -108,7 +107,7 @@ public class SocialLoginHandler extends AbstractLoginHandler {
user = new UserDO();
user.setUsername(username);
user.setNickname(nickname);
- if(Objects.nonNull(authUser.getGender())) {
+ if (Objects.nonNull(authUser.getGender())) {
user.setGender(GenderEnum.valueOf(authUser.getGender().name()));
}
user.setAvatar(authUser.getAvatar());
@@ -157,11 +156,7 @@ public class SocialLoginHandler extends AbstractLoginHandler {
private AuthRequest getAuthRequest(String source) {
try {
AuthConfig authConfig = authProperties.getType().get(source.toUpperCase());
- return AuthRequestBuilder
- .builder()
- .source(source)
- .authConfig(authConfig)
- .build();
+ return AuthRequestBuilder.builder().source(source).authConfig(authConfig).build();
} catch (Exception e) {
throw new BadRequestException("暂不支持 [%s] 平台账号登录".formatted(source));
}
diff --git a/continew-module-system/src/main/java/top/continew/admin/system/config/file/FileRecorderImpl.java b/continew-module-system/src/main/java/top/continew/admin/system/config/file/FileRecorderImpl.java
index 55e72246..dfaa593d 100644
--- a/continew-module-system/src/main/java/top/continew/admin/system/config/file/FileRecorderImpl.java
+++ b/continew-module-system/src/main/java/top/continew/admin/system/config/file/FileRecorderImpl.java
@@ -56,6 +56,7 @@ public class FileRecorderImpl implements FileRecorder {
/**
* 文件信息存储
+ *
* @param fileInfo 文件信息对象
* @return 是否保存成功
*/
@@ -67,8 +68,8 @@ public class FileRecorderImpl implements FileRecorder {
fileInfo.setId(String.valueOf(id.longValue()));
String originalFilename = EscapeUtil.unescape(fileInfo.getOriginalFilename());
file.setName(StrUtil.contains(originalFilename, StringConstants.DOT)
- ? StrUtil.subBefore(originalFilename, StringConstants.DOT, true)
- : originalFilename);
+ ? StrUtil.subBefore(originalFilename, StringConstants.DOT, true)
+ : originalFilename);
StorageDO storage = (StorageDO)fileInfo.getAttr().get(ClassUtil.getClassName(StorageDO.class, false));
String domain = StrUtil.appendIfMissing(storage.getDomain(), StringConstants.SLASH);
// 处理fileInfo中存储的地址
diff --git a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/DictDO.java b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/DictDO.java
index b514c635..8e578914 100644
--- a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/DictDO.java
+++ b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/DictDO.java
@@ -18,7 +18,7 @@ package top.continew.admin.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
-import top.continew.starter.extension.crud.annotation.DictField;
+import top.continew.starter.extension.crud.annotation.DictModel;
import top.continew.admin.common.model.entity.BaseDO;
import java.io.Serial;
@@ -30,7 +30,7 @@ import java.io.Serial;
* @since 2023/9/11 21:29
*/
@Data
-@DictField(valueKey = "code")
+@DictModel(valueKey = "code")
@TableName("sys_dict")
public class DictDO extends BaseDO {
diff --git a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/RoleDO.java b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/RoleDO.java
index 69ecff3f..975cfeab 100644
--- a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/RoleDO.java
+++ b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/RoleDO.java
@@ -19,8 +19,8 @@ package top.continew.admin.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import top.continew.admin.common.enums.DataScopeEnum;
-import top.continew.starter.extension.crud.annotation.DictField;
import top.continew.admin.common.model.entity.BaseDO;
+import top.continew.starter.extension.crud.annotation.DictModel;
import java.io.Serial;
@@ -31,7 +31,7 @@ import java.io.Serial;
* @since 2023/2/8 22:54
*/
@Data
-@DictField
+@DictModel
@TableName("sys_role")
public class RoleDO extends BaseDO {
diff --git a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/user/UserDO.java b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/user/UserDO.java
index abf56f5f..43cd1c68 100644
--- a/continew-module-system/src/main/java/top/continew/admin/system/model/entity/user/UserDO.java
+++ b/continew-module-system/src/main/java/top/continew/admin/system/model/entity/user/UserDO.java
@@ -23,7 +23,7 @@ import lombok.Data;
import top.continew.admin.common.config.mybatis.BCryptEncryptor;
import top.continew.admin.common.enums.DisEnableStatusEnum;
import top.continew.admin.common.enums.GenderEnum;
-import top.continew.starter.extension.crud.annotation.DictField;
+import top.continew.starter.extension.crud.annotation.DictModel;
import top.continew.admin.common.model.entity.BaseDO;
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
@@ -37,7 +37,7 @@ import java.time.LocalDateTime;
* @since 2022/12/21 20:42
*/
@Data
-@DictField(labelKey = "nickname", extraKeys = {"username"})
+@DictModel(labelKey = "nickname", extraKeys = {"username"})
@TableName("sys_user")
public class UserDO extends BaseDO {
diff --git a/continew-module-system/src/main/java/top/continew/admin/system/service/impl/MessageUserServiceImpl.java b/continew-module-system/src/main/java/top/continew/admin/system/service/impl/MessageUserServiceImpl.java
index 4a80b28f..92d7c5c2 100644
--- a/continew-module-system/src/main/java/top/continew/admin/system/service/impl/MessageUserServiceImpl.java
+++ b/continew-module-system/src/main/java/top/continew/admin/system/service/impl/MessageUserServiceImpl.java
@@ -80,9 +80,6 @@ public class MessageUserServiceImpl implements MessageUserService {
@Override
public void readMessage(List ids) {
- if (CollUtil.isEmpty(ids)) {
- return;
- }
baseMapper.lambdaUpdate()
.set(MessageUserDO::getIsRead, true)
.set(MessageUserDO::getReadTime, LocalDateTime.now())
diff --git a/continew-plugin/continew-plugin-generator/src/main/resources/templates/frontend/api.ftl b/continew-plugin/continew-plugin-generator/src/main/resources/templates/frontend/api.ftl
index 7890857d..11f2c535 100644
--- a/continew-plugin/continew-plugin-generator/src/main/resources/templates/frontend/api.ftl
+++ b/continew-plugin/continew-plugin-generator/src/main/resources/templates/frontend/api.ftl
@@ -57,7 +57,7 @@ export function update${classNamePrefix}(data: any, id: string) {
/** @desc 删除${businessName} */
export function delete${classNamePrefix}(id: string) {
- return http.del(`${'$'}{BASE_URL}/${'$'}{id}`)
+ return http.del(`${'$'}{BASE_URL}/`, { ids: [id] })
}
/** @desc 导出${businessName} */
diff --git a/continew-plugin/continew-plugin-open/src/main/java/top/continew/admin/open/sign/OpenApiSignTemplate.java b/continew-plugin/continew-plugin-open/src/main/java/top/continew/admin/open/sign/OpenApiSignTemplate.java
index 9a20ae72..4cbf4c38 100644
--- a/continew-plugin/continew-plugin-open/src/main/java/top/continew/admin/open/sign/OpenApiSignTemplate.java
+++ b/continew-plugin/continew-plugin-open/src/main/java/top/continew/admin/open/sign/OpenApiSignTemplate.java
@@ -16,6 +16,7 @@
package top.continew.admin.open.sign;
+import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.sign.SaSignTemplate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@@ -71,6 +72,6 @@ public class OpenApiSignTemplate extends SaSignTemplate {
// 移除 sign 参数
paramMap.remove(sign);
// 计算签名
- return super.abstractStr(super.joinParamsDictSort(paramMap));
+ return SaSecureUtil.md5(super.joinParamsDictSort(paramMap));
}
}
diff --git a/continew-webapi/src/main/java/top/continew/admin/controller/auth/AuthController.java b/continew-webapi/src/main/java/top/continew/admin/controller/auth/AuthController.java
index 495ee5f9..a199c8b6 100644
--- a/continew-webapi/src/main/java/top/continew/admin/controller/auth/AuthController.java
+++ b/continew-webapi/src/main/java/top/continew/admin/controller/auth/AuthController.java
@@ -116,11 +116,7 @@ public class AuthController {
private AuthRequest getAuthRequest(String source) {
try {
AuthConfig authConfig = authProperties.getType().get(source.toUpperCase());
- return AuthRequestBuilder
- .builder()
- .source(source)
- .authConfig(authConfig)
- .build();
+ return AuthRequestBuilder.builder().source(source).authConfig(authConfig).build();
} catch (Exception e) {
throw new BadRequestException("暂不支持 [%s] 平台账号登录".formatted(source));
}
diff --git a/continew-webapi/src/main/java/top/continew/admin/controller/system/MessageController.java b/continew-webapi/src/main/java/top/continew/admin/controller/system/MessageController.java
index 4e9da22f..8a23c406 100644
--- a/continew-webapi/src/main/java/top/continew/admin/controller/system/MessageController.java
+++ b/continew-webapi/src/main/java/top/continew/admin/controller/system/MessageController.java
@@ -30,11 +30,10 @@ import top.continew.admin.system.model.resp.message.MessageUnreadResp;
import top.continew.admin.system.service.MessageService;
import top.continew.admin.system.service.MessageUserService;
import top.continew.starter.extension.crud.model.query.PageQuery;
+import top.continew.starter.extension.crud.model.req.IdsReq;
import top.continew.starter.extension.crud.model.resp.PageResp;
import top.continew.starter.log.annotation.Log;
-import java.util.List;
-
/**
* 消息管理 API
*
@@ -58,24 +57,28 @@ public class MessageController {
}
@Operation(summary = "删除数据", description = "删除数据")
- @Parameter(name = "ids", description = "ID 列表", example = "1,2", in = ParameterIn.PATH)
- @DeleteMapping("/{ids}")
- public void delete(@PathVariable List ids) {
- baseService.delete(ids);
+ @DeleteMapping
+ public void delete(@Validated @RequestBody IdsReq req) {
+ baseService.delete(req.getIds());
}
@Operation(summary = "标记已读", description = "将消息标记为已读状态")
- @Parameter(name = "ids", description = "消息ID列表", example = "1,2", in = ParameterIn.QUERY)
@PatchMapping("/read")
- public void readMessage(@RequestParam(required = false) List ids) {
- messageUserService.readMessage(ids);
+ public void read(@Validated @RequestBody IdsReq req) {
+ messageUserService.readMessage(req.getIds());
+ }
+
+ @Operation(summary = "全部已读", description = "将所有消息标记为已读状态")
+ @PatchMapping("/readAll")
+ public void readAll() {
+ messageUserService.readMessage(null);
}
@Log(ignore = true)
@Operation(summary = "查询未读消息数量", description = "查询当前用户的未读消息数量")
@Parameter(name = "isDetail", description = "是否查询详情", example = "true", in = ParameterIn.QUERY)
@GetMapping("/unread")
- public MessageUnreadResp countUnreadMessage(@RequestParam(required = false) Boolean detail) {
+ public MessageUnreadResp countUnread(@RequestParam(required = false) Boolean detail) {
return messageUserService.countUnreadMessageByUserId(UserContextHolder.getUserId(), detail);
}
}
\ No newline at end of file
diff --git a/continew-webapi/src/main/java/top/continew/admin/controller/system/UserController.java b/continew-webapi/src/main/java/top/continew/admin/controller/system/UserController.java
index 8b8b4f5b..004dd6ca 100644
--- a/continew-webapi/src/main/java/top/continew/admin/controller/system/UserController.java
+++ b/continew-webapi/src/main/java/top/continew/admin/controller/system/UserController.java
@@ -29,8 +29,8 @@ import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import top.continew.admin.common.controller.BaseController;
import top.continew.admin.common.constant.RegexConstants;
+import top.continew.admin.common.controller.BaseController;
import top.continew.admin.common.util.SecureUtils;
import top.continew.admin.system.model.query.UserQuery;
import top.continew.admin.system.model.req.user.UserImportReq;
@@ -46,7 +46,7 @@ import top.continew.starter.core.util.ExceptionUtils;
import top.continew.starter.core.validation.ValidationUtils;
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
import top.continew.starter.extension.crud.enums.Api;
-import top.continew.starter.extension.crud.model.resp.BaseIdResp;
+import top.continew.starter.extension.crud.model.resp.IdResp;
import top.continew.starter.extension.crud.validation.CrudValidationGroup;
import java.io.IOException;
@@ -67,7 +67,7 @@ public class UserController extends BaseController create(@Validated(CrudValidationGroup.Create.class) @RequestBody UserReq req) {
+ public IdResp create(@Validated(CrudValidationGroup.Create.class) @RequestBody UserReq req) {
String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword()));
ValidationUtils.throwIfNull(rawPassword, "密码解密失败");
ValidationUtils.throwIf(!ReUtil
diff --git a/continew-webapi/src/main/resources/banner.txt b/continew-webapi/src/main/resources/banner.txt
index 16a9375b..2f688249 100644
--- a/continew-webapi/src/main/resources/banner.txt
+++ b/continew-webapi/src/main/resources/banner.txt
@@ -5,5 +5,5 @@
\____|\___/ |_| |_| \__||_||_| \_| \___| \_/\_/ /_/ \_\\__,_||_| |_| |_||_||_| |_|
:: ${project.name} :: v${project.version}
- :: ContiNew Starter :: v2.10.0
+ :: ContiNew Starter :: v2.11.0
:: Spring Boot :: v${spring-boot.version}
diff --git a/pom.xml b/pom.xml
index 4030369d..50d4f25c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
top.continew
continew-starter
- 2.10.0
+ 2.11.0
top.continew