diff --git a/.gitignore b/.gitignore
index d76946210ae06d6d94da822c9eae8c88834fc08f..3878d2c1e6557efd6b924fc7665fe459893ccc9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@ target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
+.run
### IntelliJ IDEA ###
.idea
diff --git a/README.md b/README.md
index 445a3660c99b079a56329ed980b551fe4eeea203..3d0cf33d2d3c5a85bb387d214e044150fb28a155 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,8 @@
权限认证(SaToken)
+密码保护(BCrypt)
+
# 升级java21的问题
升级到java21以后的启动参数,不加会报错
diff --git a/milkbox-app/src/main/java/top/milkbox/Application.java b/milkbox-app/src/main/java/top/milkbox/Application.java
index 37e8e2ca39cc5b9a8e90422a2dd6716e08105e67..7914742271797517a594c050b56b74430c85c1f1 100644
--- a/milkbox-app/src/main/java/top/milkbox/Application.java
+++ b/milkbox-app/src/main/java/top/milkbox/Application.java
@@ -38,6 +38,7 @@ public class Application {
new Date() + "," + JSONUtil.toJsonStr(TimeZone.getDefault()));
log.info("当前服务器公共字段默认注入时间(DateTime.now()):" + DateTime.now());
// log.info("通用配置:\n" + JSONUtil.toJsonPrettyStr(app.getBean("commonProperties")));
+ log.info("文档地址:swagger-ui/index.html");
log.info(">>> {}", Application.class.getSimpleName().toUpperCase() + " STARTING SUCCESS 启动成功");
}
diff --git a/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java
index a425dcb21a2240057232153e22e0ebc648381471..84391904f9a781912470f1638cb6d3865c634b9d 100644
--- a/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java
+++ b/milkbox-app/src/main/java/top/milkbox/app/core/handler/mybatisPlus/MyMetaObjectHandler.java
@@ -1,5 +1,8 @@
package top.milkbox.app.core.handler.mybatisPlus;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotWebContextException;
+import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
@@ -9,21 +12,31 @@ import top.milkbox.common.enums.CommonDeleteFlagEnum;
import java.util.Date;
/**
- * 常用字段自动填充器
+ * 常用字段自动填充器
+ * 默认填充策略:如果原来的属性有值则不覆盖,如果手动在这里改为null则不填充
* 创建时间: 2024-01-15 下午 4:08
*
* @author milkbox
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
+
+ private Integer getLoginId() {
+ try {
+ return StpUtil.getLoginIdAsInt();
+ } catch (NotLoginException e) { // 未登录
+ return null;
+ } catch (NotWebContextException e) { // 非web上下文,无法使用sa-token
+ return null;
+ }
+ }
+
@Override
public void insertFill(MetaObject metaObject) {
// 删除字段
this.strictInsertFill(metaObject, "deleteFlag",
() -> CommonDeleteFlagEnum.NOT_DELETE, CommonDeleteFlagEnum.class);
- // TODO 创建人,这个需要saToken
- this.strictInsertFill(metaObject, "createUser",
- () -> -1, Integer.class);
+ this.strictInsertFill(metaObject, "createUser", this::getLoginId, Integer.class);
// 创建时间
this.strictInsertFill(metaObject, "createTime",
DateTime::now, Date.class);
@@ -31,9 +44,7 @@ public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void updateFill(MetaObject metaObject) {
- // TODO 更新人,这个需要saToken
- this.strictUpdateFill(metaObject, "updateUser",
- () -> -1, Integer.class);
+ this.strictUpdateFill(metaObject, "updateUser", this::getLoginId, Integer.class);
// 更新时间
this.strictUpdateFill(metaObject, "updateTime",
DateTime::now, Date.class);
diff --git a/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java b/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java
new file mode 100644
index 0000000000000000000000000000000000000000..db70c38a013d0a020497391273cd35833607403d
--- /dev/null
+++ b/milkbox-common/src/main/java/top/milkbox/common/bo/EntityColumnExistence.java
@@ -0,0 +1,30 @@
+package top.milkbox.common.bo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 存在性类,对应数据库的同一列中哪些是存在的字段,哪些是不存在的字段
+ * 创建时间: 2024-02-04 下午 1:48
+ *
+ * @param 列的类型
+ * @author milkbox
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class EntityColumnExistence {
+
+ /**
+ * 存在的列
+ */
+ private List existColumnList;
+
+ /**
+ * 不存在的列
+ */
+ private List doesNotExistColumnList;
+}
diff --git a/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java b/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7d977ef971194dab0aab3db1644440a2255bfc6
--- /dev/null
+++ b/milkbox-common/src/main/java/top/milkbox/common/service/CommonService.java
@@ -0,0 +1,30 @@
+package top.milkbox.common.service;
+
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.service.IService;
+import top.milkbox.common.bo.EntityColumnExistence;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+/**
+ * 抽取通用服务层接口
+ * 创建时间: 2024-02-04 下午 3:09
+ *
+ * @param 实体类类型
+ * @author milkbox
+ */
+public interface CommonService extends IService {
+
+ /**
+ * 过滤出在数据库中不存在的实体列
+ * 注意:此方法中包含一次数据库查询
+ *
+ * @param column 被操作的字段的get方法的引用
+ * @param entityColumnCollection 原始集合
+ * @param 列的类型
+ * @return 并返回一个包含存在和不存在实体列信息的对象
+ */
+ EntityColumnExistence filterDoesNotExistColumn(
+ SFunction column, Collection entityColumnCollection);
+}
diff --git a/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java b/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..08efb782e17eebe79a947020d858454691e7a872
--- /dev/null
+++ b/milkbox-common/src/main/java/top/milkbox/common/service/impl/CommonServiceImpl.java
@@ -0,0 +1,39 @@
+package top.milkbox.common.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import top.milkbox.common.bo.EntityColumnExistence;
+import top.milkbox.common.service.CommonService;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * 抽取通用服务
+ * 创建时间: 2024-02-04 下午 2:26
+ *
+ * @author milkbox
+ */
+public class CommonServiceImpl, E> extends ServiceImpl implements CommonService {
+
+ @Override
+ public EntityColumnExistence filterDoesNotExistColumn(
+ SFunction column, Collection entityColumnCollection) {
+ // 创建可见性对象,用于存储存在的和不存在的实体列集合
+ EntityColumnExistence entityColumnExistence = new EntityColumnExistence<>();
+ // 查询并保存存在的实体列
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.in(column, entityColumnCollection);
+ entityColumnExistence.setExistColumnList(super.list(queryWrapper).stream().map(column).toList());
+ // 在原实体中移除已经存在的实体
+ // 注意:removeAll方法仅支持可变类型的集合,即ArrayList类型
+ ArrayList entityColumnList = new ArrayList<>(entityColumnCollection);
+ entityColumnList.removeAll(entityColumnExistence.getExistColumnList());
+ // 将不存在的id集合保存到可见性对象
+ entityColumnExistence.setDoesNotExistColumnList(entityColumnList);
+ return entityColumnExistence;
+ }
+}
diff --git a/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java b/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java
new file mode 100644
index 0000000000000000000000000000000000000000..534ab5bd007a08b8bc938e0307de8b2e43b2b672
--- /dev/null
+++ b/milkbox-common/src/main/java/top/milkbox/common/validation/annotation/CollectionElementNotNull.java
@@ -0,0 +1,41 @@
+package top.milkbox.common.validation.annotation;
+
+import jakarta.validation.Constraint;
+import jakarta.validation.Payload;
+import top.milkbox.common.validation.validator.CollectionElementNotNullValidator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+// TODO 请参照此注解编写更多的自定义校验,例如手机号、邮箱等
+
+/**
+ * 自定义校验注解
+ * 校验集合中的每一个元素都不为空
+ * 如果校验对象为空、集合元素为0或集合中的所有元素都不为空则校验通过
+ * 创建时间: 2024-01-29 下午 2:22
+ *
+ * @author milkbox
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Constraint(validatedBy = CollectionElementNotNullValidator.class) // 校验的逻辑处理类
+public @interface CollectionElementNotNull {
+
+ /**
+ * 提示的信息
+ *
+ * @return 默认值:集合中不能出现空元素
+ */
+ String message() default "集合中不能出现空元素";
+
+ /**
+ * 分组验证
+ *
+ * @return 默认值:{}
+ */
+ Class>[] groups() default {};
+
+ Class extends Payload>[] payload() default {};
+}
diff --git a/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java b/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..f97708f95c6f0a8372eb7e362f2d4a00a577da77
--- /dev/null
+++ b/milkbox-common/src/main/java/top/milkbox/common/validation/validator/CollectionElementNotNullValidator.java
@@ -0,0 +1,24 @@
+package top.milkbox.common.validation.validator;
+
+import cn.hutool.core.util.ObjectUtil;
+import jakarta.validation.ConstraintValidator;
+import jakarta.validation.ConstraintValidatorContext;
+import top.milkbox.common.validation.annotation.CollectionElementNotNull;
+
+import java.util.Collection;
+
+/**
+ * 创建时间: 2024-01-29 下午 2:27
+ *
+ * @author milkbox
+ */
+public class CollectionElementNotNullValidator implements ConstraintValidator> {
+
+ @Override
+ public boolean isValid(Collection> value, ConstraintValidatorContext context) {
+ if (ObjectUtil.isNotEmpty(value)) {
+ return value.stream().noneMatch(ObjectUtil::isNull);
+ }
+ return true;
+ }
+}
diff --git a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java
index 874881f68f0996db0fbcec21e2d0c6d9a104511c..4d1d855a352c70120715a1477387e2d3b36f9011 100644
--- a/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java
+++ b/milkbox-service/service-log/src/main/java/top/milkbox/log/modular/main/controller/LogMainController.java
@@ -11,6 +11,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import top.milkbox.common.annotation.CommonLog;
import top.milkbox.common.enums.LogTypeEnum;
+import top.milkbox.common.validation.annotation.CollectionElementNotNull;
import top.milkbox.log.core.config.LogConfiguration;
import top.milkbox.log.modular.main.param.LogMainAddParam;
import top.milkbox.log.modular.main.param.LogMainEditParam;
@@ -50,9 +51,9 @@ public class LogMainController {
@Operation(summary = "批量删除")
@CommonLog(value = "批量删除", module = LogConfiguration.MODULE_NAME, type = LogTypeEnum.DELETE)
public CommonResult