mirror of
https://github.com/continew-org/continew-admin.git
synced 2025-10-19 10:57:21 +08:00
临时
This commit is contained in:
@@ -95,7 +95,7 @@ ContiNew Admin(Continue New Admin),页面现代美观,且专注设计与
|
||||
```java
|
||||
@Tag(name = "部门管理 API")
|
||||
@RestController
|
||||
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT, Api.DICT_TREE})
|
||||
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT, Api.TREE_DICT})
|
||||
public class DeptController extends BaseController<DeptService, DeptResp, DeptDetailResp, DeptQuery, DeptReq> {}
|
||||
```
|
||||
|
||||
|
@@ -108,10 +108,15 @@
|
||||
<artifactId>continew-starter-auth-justauth</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- ContiNew Starter 安全模块 - 加密 -->
|
||||
<!-- ContiNew Starter 加密模块 - 字段加密 -->
|
||||
<dependency>
|
||||
<groupId>top.continew.starter</groupId>
|
||||
<artifactId>continew-starter-security-crypto</artifactId>
|
||||
<artifactId>continew-starter-encrypt-field</artifactId>
|
||||
</dependency>
|
||||
<!-- ContiNew Starter 加密模块 - 密码编码器 -->
|
||||
<dependency>
|
||||
<groupId>top.continew.starter</groupId>
|
||||
<artifactId>continew-starter-encrypt-password-encoder</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- ContiNew Starter 安全模块 - 脱敏 -->
|
||||
|
@@ -74,7 +74,7 @@ public class BaseController<S extends BaseService<L, D, Q, C>, L, D, Q, C> exten
|
||||
}
|
||||
}
|
||||
// 不需要校验 DICT、DICT_TREE 接口权限
|
||||
if (Api.DICT.equals(crudApi.value()) || Api.DICT_TREE.equals(crudApi.value())) {
|
||||
if (Api.DICT.equals(crudApi.value()) || Api.TREE_DICT.equals(crudApi.value())) {
|
||||
return;
|
||||
}
|
||||
// 校验权限,例如:创建用户接口(POST /system/user) => 校验 system:user:create 权限
|
||||
|
@@ -34,8 +34,8 @@ public class RsaProperties {
|
||||
public static final String PUBLIC_KEY;
|
||||
|
||||
static {
|
||||
PRIVATE_KEY = SpringUtil.getProperty("continew-starter.security.crypto.private-key");
|
||||
PUBLIC_KEY = SpringUtil.getProperty("continew-starter.security.crypto.public-key");
|
||||
PRIVATE_KEY = SpringUtil.getProperty("continew-starter.encrypt.field.private-key");
|
||||
PUBLIC_KEY = SpringUtil.getProperty("continew-starter.encrypt.field.public-key");
|
||||
}
|
||||
|
||||
private RsaProperties() {
|
||||
|
@@ -171,7 +171,7 @@ public class OperationDescriptionCustomizer {
|
||||
if (crudRequestMapping == null || crudApi == null) {
|
||||
return StringConstants.EMPTY;
|
||||
}
|
||||
if (Api.DICT.equals(crudApi.value()) || Api.DICT_TREE.equals(crudApi.value())) {
|
||||
if (Api.DICT.equals(crudApi.value()) || Api.TREE_DICT.equals(crudApi.value())) {
|
||||
return StringConstants.EMPTY;
|
||||
}
|
||||
String permissionPrefix = CrudApiPermissionPrefixCache.get(targetClass);
|
||||
|
@@ -21,7 +21,7 @@ import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import top.continew.admin.open.model.entity.AppDO;
|
||||
import top.continew.starter.data.mapper.BaseMapper;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
/**
|
||||
* 应用 Mapper
|
||||
|
@@ -18,9 +18,9 @@ package top.continew.admin.open.model.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import top.continew.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.continew.admin.common.base.model.entity.BaseDO;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDateTime;
|
||||
|
@@ -33,9 +33,14 @@ import org.springframework.boot.SpringBootVersion;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import top.continew.admin.common.context.UserContext;
|
||||
import top.continew.admin.common.context.UserContextHolder;
|
||||
import top.continew.starter.core.autoconfigure.application.ApplicationProperties;
|
||||
import top.continew.starter.core.util.SpringUtils;
|
||||
import top.continew.starter.extension.crud.annotation.EnableCrudApi;
|
||||
import top.continew.starter.web.annotation.EnableGlobalResponse;
|
||||
import top.continew.starter.web.model.R;
|
||||
@@ -59,6 +64,7 @@ public class ContiNewAdminApplication implements ApplicationRunner {
|
||||
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private final ServerProperties serverProperties;
|
||||
private final ThreadPoolTaskExecutor threadPoolTaskExecutor;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ContiNewAdminApplication.class, args);
|
||||
@@ -93,5 +99,15 @@ public class ContiNewAdminApplication implements ApplicationRunner {
|
||||
log.info("更新日志: https://continew.top/docs/admin/changelog/");
|
||||
log.info("ContiNew Admin: 持续迭代优化的,高质量多租户中后台管理系统框架");
|
||||
log.info("--------------------------------------------------------");
|
||||
UserContext userContext = new UserContext();
|
||||
userContext.setId(222L);
|
||||
UserContextHolder.setContext(userContext);
|
||||
log.info("userId: {}", UserContextHolder.getUserId());
|
||||
SpringUtils.getProxy(this).async();
|
||||
}
|
||||
|
||||
@Async
|
||||
public void async() {
|
||||
log.info("async: {}", UserContextHolder.getUserId());
|
||||
}
|
||||
}
|
||||
|
@@ -119,8 +119,14 @@ logging:
|
||||
file:
|
||||
path: ./logs
|
||||
|
||||
--- ### 安全配置:加/解密配置
|
||||
continew-starter.security.crypto:
|
||||
--- ### 加密配置:密码编码器配置
|
||||
continew-starter.encrypt.password-encoder:
|
||||
enabled: true
|
||||
# 默认启用的编码器算法(默认:BCrypt 加密算法)
|
||||
algorithm: BCRYPT
|
||||
|
||||
--- ### 加密配置:字段加/解密配置
|
||||
continew-starter.encrypt.field:
|
||||
enabled: true
|
||||
# 默认算法,即 @FieldEncrypt 默认采用的算法(默认:AES 对称加密算法)
|
||||
algorithm: AES
|
||||
@@ -129,11 +135,6 @@ continew-starter.security.crypto:
|
||||
# 非对称加密算法密钥(在线生成 RSA 密钥对:http://web.chacuo.net/netrsakeypair)
|
||||
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM51dgYtMyF+tTQt80sfFOpSV27a7t9uaUVeFrdGiVxscuizE7H8SMntYqfn9lp8a5GH5P1/GGehVjUD2gF/4kcCAwEAAQ==
|
||||
private-key: MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAznV2Bi0zIX61NC3zSx8U6lJXbtru325pRV4Wt0aJXGxy6LMTsfxIye1ip+f2WnxrkYfk/X8YZ6FWNQPaAX/iRwIDAQABAkEAk/VcAusrpIqA5Ac2P5Tj0VX3cOuXmyouaVcXonr7f+6y2YTjLQuAnkcfKKocQI/juIRQBFQIqqW/m1nmz1wGeQIhAO8XaA/KxzOIgU0l/4lm0A2Wne6RokJ9HLs1YpOzIUmVAiEA3Q9DQrpAlIuiT1yWAGSxA9RxcjUM/1kdVLTkv0avXWsCIE0X8woEjK7lOSwzMG6RpEx9YHdopjViOj1zPVH61KTxAiBmv/dlhqkJ4rV46fIXELZur0pj6WC3N7a4brR8a+CLLQIhAMQyerWl2cPNVtE/8tkziHKbwW3ZUiBXU24wFxedT9iV
|
||||
## 密码编码器配置
|
||||
password-encoder:
|
||||
enabled: true
|
||||
# 默认启用的编码器算法(默认:BCrypt 加密算法)
|
||||
algorithm: BCRYPT
|
||||
|
||||
--- ### 验证码配置
|
||||
continew-starter.captcha:
|
||||
|
@@ -128,8 +128,14 @@ logging:
|
||||
file:
|
||||
path: ../logs
|
||||
|
||||
--- ### 安全配置:加/解密配置
|
||||
continew-starter.security.crypto:
|
||||
--- ### 加密配置:密码编码器配置
|
||||
continew-starter.encrypt.password-encoder:
|
||||
enabled: true
|
||||
# 默认启用的编码器算法(默认:BCrypt 加密算法)
|
||||
algorithm: BCRYPT
|
||||
|
||||
--- ### 加密配置:字段加/解密配置
|
||||
continew-starter.encrypt.field:
|
||||
enabled: true
|
||||
# 默认算法,即 @FieldEncrypt 默认采用的算法(默认:AES 对称加密算法)
|
||||
algorithm: AES
|
||||
@@ -138,11 +144,6 @@ continew-starter.security.crypto:
|
||||
# 非对称加密算法密钥(在线生成 RSA 密钥对:http://web.chacuo.net/netrsakeypair)
|
||||
public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAM51dgYtMyF+tTQt80sfFOpSV27a7t9uaUVeFrdGiVxscuizE7H8SMntYqfn9lp8a5GH5P1/GGehVjUD2gF/4kcCAwEAAQ==
|
||||
private-key: MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAznV2Bi0zIX61NC3zSx8U6lJXbtru325pRV4Wt0aJXGxy6LMTsfxIye1ip+f2WnxrkYfk/X8YZ6FWNQPaAX/iRwIDAQABAkEAk/VcAusrpIqA5Ac2P5Tj0VX3cOuXmyouaVcXonr7f+6y2YTjLQuAnkcfKKocQI/juIRQBFQIqqW/m1nmz1wGeQIhAO8XaA/KxzOIgU0l/4lm0A2Wne6RokJ9HLs1YpOzIUmVAiEA3Q9DQrpAlIuiT1yWAGSxA9RxcjUM/1kdVLTkv0avXWsCIE0X8woEjK7lOSwzMG6RpEx9YHdopjViOj1zPVH61KTxAiBmv/dlhqkJ4rV46fIXELZur0pj6WC3N7a4brR8a+CLLQIhAMQyerWl2cPNVtE/8tkziHKbwW3ZUiBXU24wFxedT9iV
|
||||
## 密码编码器配置
|
||||
password-encoder:
|
||||
enabled: true
|
||||
# 默认启用的编码器算法(默认:BCrypt 加密算法)
|
||||
algorithm: BCRYPT
|
||||
|
||||
--- ### 验证码配置
|
||||
continew-starter.captcha:
|
||||
|
@@ -182,8 +182,8 @@ continew-starter.trace:
|
||||
|
||||
--- ### CRUD 配置
|
||||
continew-starter.crud:
|
||||
## 全局树结构配置(简单树,对应前端 UI)
|
||||
tree:
|
||||
## 树型字典结构映射配置(简单树,对应前端 UI)
|
||||
tree-dict-model:
|
||||
id-key: key
|
||||
name-key: title
|
||||
weight-key: sort
|
||||
|
@@ -104,7 +104,7 @@ public class AuthServiceImpl implements AuthService {
|
||||
}
|
||||
// 构建路由树
|
||||
TreeField treeField = MenuResp.class.getDeclaredAnnotation(TreeField.class);
|
||||
TreeNodeConfig treeNodeConfig = crudProperties.getTree().genTreeNodeConfig(treeField);
|
||||
TreeNodeConfig treeNodeConfig = crudProperties.getTreeDictModel().genTreeNodeConfig(treeField);
|
||||
List<Tree<Long>> treeList = TreeUtil.build(menuList, treeField.rootId(), treeNodeConfig, (m, tree) -> {
|
||||
tree.setId(m.getId());
|
||||
tree.setParentId(m.getParentId());
|
||||
|
@@ -35,6 +35,6 @@ import top.continew.starter.extension.crud.enums.Api;
|
||||
@Tag(name = "部门管理 API")
|
||||
@RestController
|
||||
@CrudRequestMapping(value = "/system/dept", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE,
|
||||
Api.EXPORT, Api.DICT_TREE})
|
||||
Api.EXPORT, Api.TREE_DICT})
|
||||
public class DeptController extends BaseController<DeptService, DeptResp, DeptResp, DeptQuery, DeptReq> {
|
||||
}
|
||||
|
@@ -50,7 +50,7 @@ import java.lang.reflect.Method;
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@CrudRequestMapping(value = "/system/menu", api = {Api.TREE, Api.GET, Api.CREATE, Api.UPDATE, Api.BATCH_DELETE,
|
||||
Api.DICT_TREE})
|
||||
Api.TREE_DICT})
|
||||
public class MenuController extends BaseController<MenuService, MenuResp, MenuResp, MenuQuery, MenuReq> {
|
||||
|
||||
@Operation(summary = "清除缓存", description = "清除缓存")
|
||||
|
@@ -26,7 +26,7 @@ import top.continew.admin.common.base.mapper.DataPermissionMapper;
|
||||
import top.continew.admin.system.model.entity.user.UserDO;
|
||||
import top.continew.admin.system.model.resp.user.UserDetailResp;
|
||||
import top.continew.starter.extension.datapermission.annotation.DataPermission;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@@ -20,7 +20,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import top.continew.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.continew.admin.common.base.model.entity.BaseDO;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
|
@@ -26,7 +26,7 @@ import top.continew.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.continew.admin.common.base.model.entity.BaseDO;
|
||||
import top.continew.admin.system.enums.StorageTypeEnum;
|
||||
import top.continew.starter.core.constant.StringConstants;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.net.URL;
|
||||
|
@@ -23,9 +23,9 @@ import lombok.Data;
|
||||
import top.continew.admin.common.base.model.entity.BaseDO;
|
||||
import top.continew.admin.common.enums.DisEnableStatusEnum;
|
||||
import top.continew.admin.common.enums.GenderEnum;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.password.encoder.encryptor.PasswordEncoderEncryptor;
|
||||
import top.continew.starter.extension.crud.annotation.DictModel;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.security.crypto.enums.Algorithm;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDateTime;
|
||||
@@ -57,7 +57,7 @@ public class UserDO extends BaseDO {
|
||||
/**
|
||||
* 密码
|
||||
*/
|
||||
@FieldEncrypt(Algorithm.PASSWORD_ENCODER)
|
||||
@FieldEncrypt(encryptor = PasswordEncoderEncryptor.class)
|
||||
private String password;
|
||||
|
||||
/**
|
||||
|
@@ -36,7 +36,7 @@ import top.continew.admin.system.model.resp.DeptResp;
|
||||
import top.continew.admin.system.service.DeptService;
|
||||
import top.continew.starter.excel.converter.ExcelBaseEnumConverter;
|
||||
import top.continew.starter.excel.converter.ExcelListConverter;
|
||||
import top.continew.starter.security.crypto.annotation.FieldEncrypt;
|
||||
import top.continew.starter.encrypt.field.annotation.FieldEncrypt;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDateTime;
|
||||
|
@@ -290,7 +290,8 @@ public class FileServiceImpl extends BaseServiceImpl<FileMapper, FileDO, FileRes
|
||||
return;
|
||||
}
|
||||
// user/avatar/ => user、avatar
|
||||
String[] parentPathParts = StrUtil.split(parentPath, StringConstants.SLASH, false, true).toArray(String[]::new);
|
||||
String[] parentPathParts = StrUtil.split(parentPath, StringConstants.SLASH, false, true)
|
||||
.toArray(String[]::new);
|
||||
String lastPath = StringConstants.SLASH;
|
||||
StringBuilder currentPathBuilder = new StringBuilder();
|
||||
for (int i = 0; i < parentPathParts.length; i++) {
|
||||
|
@@ -80,10 +80,10 @@ import top.continew.starter.core.exception.BusinessException;
|
||||
import top.continew.starter.core.util.CollUtils;
|
||||
import top.continew.starter.core.util.FileUploadUtils;
|
||||
import top.continew.starter.core.util.validation.CheckUtils;
|
||||
import top.continew.starter.encrypt.field.util.EncryptHelper;
|
||||
import top.continew.starter.extension.crud.model.query.PageQuery;
|
||||
import top.continew.starter.extension.crud.model.query.SortQuery;
|
||||
import top.continew.starter.extension.crud.model.resp.PageResp;
|
||||
import top.continew.starter.security.crypto.util.EncryptHelper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.time.Duration;
|
||||
|
Reference in New Issue
Block a user