Kaynağa Gözat

【feat】【第一版开发】
1.修改配置文件
2.更换持久层框架为tk mybatis
3.完善即实体类基类
4.增加mybatis审计数据自动填充拦截器
5.增加获取用户信息工具类
6.完善开发设计文档

ChenYL 1 yıl önce
ebeveyn
işleme
6fa5186980
23 değiştirilmiş dosya ile 458 ekleme ve 85 silme
  1. 0 1
      .idea/encodings.xml
  2. 66 0
      .idea/inspectionProfiles/Project_Default.xml
  3. 29 1
      doc/技术文档.md
  4. 4 10
      pom.xml
  5. 14 8
      src/main/java/com/punchsettle/server/atomic/entity/PunchIn.java
  6. 11 5
      src/main/java/com/punchsettle/server/atomic/entity/PunchInRecord.java
  7. 11 5
      src/main/java/com/punchsettle/server/atomic/entity/PunchInRecordSettlementRela.java
  8. 18 12
      src/main/java/com/punchsettle/server/atomic/entity/PunchInSettlement.java
  9. 18 8
      src/main/java/com/punchsettle/server/atomic/entity/SettlementNotifyTask.java
  10. 15 9
      src/main/java/com/punchsettle/server/atomic/entity/SettlementTask.java
  11. 12 6
      src/main/java/com/punchsettle/server/atomic/entity/User.java
  12. 6 5
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInMapper.java
  13. 6 5
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInRecordMapper.java
  14. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInRecordSettlementRelaMapper.java
  15. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/PunchInSettlementMapper.java
  16. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/SettlementNotifyTaskMapper.java
  17. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/SettlementTaskMapper.java
  18. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/UserMapper.java
  19. 17 7
      src/main/java/com/punchsettle/server/common/entity/BaseEntity.java
  20. 18 2
      src/main/java/com/punchsettle/server/core/config/MyBatisConfig.java
  21. 115 0
      src/main/java/com/punchsettle/server/core/interceptor/MybatisAuditDataInterceptor.java
  22. 28 0
      src/main/java/com/punchsettle/server/utiis/UserUtils.java
  23. 5 1
      src/main/resources/application.yaml

+ 0 - 1
.idea/encodings.xml

@@ -2,6 +2,5 @@
 <project version="4">
   <component name="Encoding">
     <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
   </component>
 </project>

+ 66 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -1,6 +1,72 @@
 <component name="InspectionProjectProfileManager">
   <profile version="1.0">
     <option name="myName" value="Project Default" />
+    <inspection_tool class="AliAccessStaticViaInstance" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliArrayNamingShouldHaveBracket" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliControlFlowStatementWithoutBraces" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliDeprecation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliEqualsAvoidNull" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliLongLiteralsEndingWithLowercaseL" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliMissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AliWrapperTypeEquality" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAbstractClassShouldStartWithAbstractNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAbstractMethodOrInterfaceMethodMustUseJavadoc" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidApacheBeanUtilsCopy" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidCallStaticSimpleDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidCommentBehindStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidComplexCondition" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidConcurrentCompetitionRandom" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidDoubleOrFloatEqualCompare" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidManuallyCreateThread" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidMissUseOfMathRandom" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidNegationOperator" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidNewDateGetTime" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidPatternCompileInMethod" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidReturnInFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidStartWithDollarAndUnderLineNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaAvoidUseTimer" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaBigDecimalAvoidDoubleConstructor" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaBooleanPropertyShouldNotStartWithIs" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassCastExceptionWithSubListToArrayList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassCastExceptionWithToArray" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassMustHaveAuthor" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaClassNamingShouldBeCamel" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCollectionInitShouldAssignCapacity" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCommentsMustBeJavadocFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaConcurrentExceptionWithModifyOriginSubList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaConstantFieldShouldBeUpperCase" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaCountDownShouldInFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaDontModifyInForeachCircle" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaEnumConstantsMustHaveComment" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaExceptionClassShouldEndWithException" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaIbatisMethodQueryForList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaLockShouldWithTryFinally" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaLowerCamelCaseVariableNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaMethodReturnWrapperType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaMethodTooLong" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPackageNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoMustOverrideToString" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoMustUsePrimitiveField" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaPojoNoDefaultValue" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaRemoveCommentedCode" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaServiceOrDaoClassShouldEndWithImpl" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSneakyThrowsWithoutExceptionType" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaStringConcat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSwitchExpression" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaSwitchStatement" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTestClassShouldEndWithTestNaming" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadLocalShouldRemove" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadPoolCreation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaThreadShouldSetName" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaTransactionMustHaveRollback" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUndefineMagicConstant" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUnsupportedExceptionWithModifyAsList" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUseQuietReferenceNotation" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="AlibabaUseRightCaseForDateFormat" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ADDITIONAL_TAGS" value="ClassName,Date,Author,Version,Description,className,description,date" />
+    </inspection_tool>
+    <inspection_tool class="MapOrSetKeyShouldOverrideHashCodeEquals" enabled="true" level="WARNING" enabled_by_default="true" />
     <inspection_tool class="SerializableHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true" />
   </profile>
 </component>

+ 29 - 1
doc/技术文档.md

@@ -6,7 +6,7 @@ ui设计工具:即时设计
 
 小程序框架:uniapp
 
-后端框架:spring boot + mybatis + mybatis mapper + spring mvc
+后端框架:spring boot + mybatis + tk mybatis+ spring mvc
 
 数据库:mysql
 
@@ -196,6 +196,14 @@ ui设计工具:即时设计
 
 
 
+#### 开发参考
+
+* [两种优雅的获取当前登录用户ID的方式](https://blog.csdn.net/tomorrow9813/article/details/131736382)
+* [学会自己编写Mybatis插件(拦截器)实现自定义需求](https://juejin.cn/post/7220321558103097404#heading-3)
+* [Mybatis拦截器教程及几个实用自定义拦截器分享](https://juejin.cn/post/7242129949179248700#heading-5)
+
+
+
 ## 常用命令
 
 
@@ -234,3 +242,23 @@ net stop mysql
 * [MySQL中的basedir和datadir的作用](https://blog.csdn.net/wolfalcon/article/details/80528678)
 * [MYSQL8.0安装、配置、启动、登入与卸载详细步骤总结](https://blog.csdn.net/qq_51688022/article/details/137105751)
 
+
+
+## IDEA设置
+
+
+
+### 类注释模板
+
+模板
+
+```java
+/**
+ * @author ${USER}
+ * @version 1.0.0
+ * @date ${DATE} ${TIME}
+ * @description TODO
+ */
+```
+
+参考:[IDEA 创建类注释模板](https://blog.csdn.net/GyaoG/article/details/120415660)

+ 4 - 10
pom.xml

@@ -21,9 +21,8 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <java.version>21</java.version>
         <spring-cloud.version>2023.0.3</spring-cloud.version>
-        <mybatis-mapper.version>2.2.3</mybatis-mapper.version>
         <jwt.version>4.4.0</jwt.version>
-        <mybatis-springboot-starter.version>3.0.3</mybatis-springboot-starter.version>
+        <tk-mybatis.version>5.0.1</tk-mybatis.version>
     </properties>
 
     <dependencyManagement>
@@ -83,14 +82,9 @@
             <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>io.mybatis</groupId>
-            <artifactId>mybatis-mapper</artifactId>
-            <version>${mybatis-mapper.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mybatis.spring.boot</groupId>
-            <artifactId>mybatis-spring-boot-starter</artifactId>
-            <version>${mybatis-springboot-starter.version}</version>
+            <groupId>tk.mybatis</groupId>
+            <artifactId>mapper-spring-boot-starter</artifactId>
+            <version>${tk-mybatis.version}</version>
         </dependency>
         <dependency>
             <groupId>com.auth0</groupId>

+ 14 - 8
src/main/java/com/punchsettle/server/atomic/entity/PunchIn.java

@@ -1,17 +1,23 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 打卡任务表
+ * @description 打卡任务表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("punch_in")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "punch_in")
 public class PunchIn extends BaseEntity implements Serializable {
 
     @Serial
@@ -20,30 +26,30 @@ public class PunchIn extends BaseEntity implements Serializable {
     /**
      * 任务名称
      */
-    @Entity.Column("task_name")
+    @Column(name = "task_name")
     private String taskName;
 
     /**
      * 奖励倍数
      */
-    @Entity.Column("reward_num")
+    @Column(name = "reward_num")
     private Integer rewardNum;
 
     /**
      * 是否启用周末双倍标志(0-不是,1-是)
      */
-    @Entity.Column("weekend_double_flag")
+    @Column(name = "weekend_double_flag")
     private Boolean weekendDoubleFlag;
 
     /**
      * 是否启用全勤奖励标志(0-不是,1-是)
      */
-    @Entity.Column("full_attendance_flag")
+    @Column(name = "full_attendance_flag")
     private Boolean fullAttendanceFlag;
 
     /**
      * 是否归档标志(0-不是,1-是)
      */
-    @Entity.Column("archive_flag")
+    @Column(name = "archive_flag")
     private Boolean archiveFlag;
 }

+ 11 - 5
src/main/java/com/punchsettle/server/atomic/entity/PunchInRecord.java

@@ -1,18 +1,24 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 import java.sql.Timestamp;
 
 /**
- * 打卡任务记录表
+ * @description 打卡任务记录表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("punch_in_record")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "punch_in_record")
 public class PunchInRecord extends BaseEntity implements Serializable {
 
     @Serial
@@ -21,12 +27,12 @@ public class PunchInRecord extends BaseEntity implements Serializable {
     /**
      * 打卡任务表主键
      */
-    @Entity.Column("punch_in_id")
+    @Column(name = "punch_in_id")
     private Long punchInId;
 
     /**
      * 打卡任务表主键
      */
-    @Entity.Column("punch_in_id")
+    @Column(name = "punch_in_id")
     private Timestamp punchInTime;
 }

+ 11 - 5
src/main/java/com/punchsettle/server/atomic/entity/PunchInRecordSettlementRela.java

@@ -1,17 +1,23 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 打卡任务记录与结算关联表
+ * @description 打卡任务记录与结算关联表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("punch_in_record_settlement_rela")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "punch_in_record_settlement_rela")
 public class PunchInRecordSettlementRela extends BaseEntity implements Serializable {
 
     @Serial
@@ -20,12 +26,12 @@ public class PunchInRecordSettlementRela extends BaseEntity implements Serializa
     /**
      * 打卡任务记录表ID
      */
-    @Entity.Column("record_id")
+    @Column(name = "record_id")
     private Long recordId;
 
     /**
      * 打卡任务结算表ID
      */
-    @Entity.Column("settlement_id")
+    @Column(name = "settlement_id")
     private Long settlementId;
 }

+ 18 - 12
src/main/java/com/punchsettle/server/atomic/entity/PunchInSettlement.java

@@ -1,18 +1,24 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 import java.sql.Timestamp;
 
 /**
- * 打卡任务结算表
+ * @description 打卡任务结算表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("punch_in_settlement")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "punch_in_settlement")
 public class PunchInSettlement extends BaseEntity implements Serializable {
 
     @Serial
@@ -21,54 +27,54 @@ public class PunchInSettlement extends BaseEntity implements Serializable {
     /**
      * 用户表主键
      */
-    @Entity.Column("user_id")
+    @Column(name = "user_id")
     private Long userId;
 
     /**
      * 结算奖励数
      */
-    @Entity.Column("reward_num")
+    @Column(name = "reward_num")
     private Integer rewardNum;
 
     /**
      * 是否已领取奖励(0-未领取,1-已领取)
      */
-    @Entity.Column("claim_reward_flag")
+    @Column(name = "claim_reward_flag")
     private Integer claimRewardFlag;
 
     /**
      * 领取奖励时间
      */
-    @Entity.Column("claim_reward_time")
+    @Column(name = "claim_reward_time")
     private Timestamp claimRewardTime;
 
     /**
      * 结算任务表id
      */
-    @Entity.Column("settlement_task_id")
+    @Column(name = "settlement_task_id")
     private Timestamp settlementTaskId;
 
     /**
      * 结算时间
      */
-    @Entity.Column("settlement_time")
+    @Column(name = "settlement_time")
     private Timestamp settlement_time;
 
     /**
      * 通知表ID
      */
-    @Entity.Column("notify_id")
+    @Column(name = "notify_id")
     private Long notifyId;
 
     /**
      * 结算通知状态(fail-通知失败,success-成功通知,pending-待通知)
      */
-    @Entity.Column("notify_status")
+    @Column(name = "notify_status")
     private String notifyStatus;
 
     /**
      * 结算通知时间
      */
-    @Entity.Column("notify_time")
+    @Column(name = "notify_time")
     private Timestamp notifyTime;
 }

+ 18 - 8
src/main/java/com/punchsettle/server/atomic/entity/SettlementNotifyTask.java

@@ -1,8 +1,10 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -10,9 +12,17 @@ import java.sql.Timestamp;
 
 /**
  * 通知定时任务执行记录表
+ * @author tyuio
+ */
+/**
+ * @description 通知定时任务执行记录表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("settlement_notify_task")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "settlement_notify_task")
 public class SettlementNotifyTask extends BaseEntity implements Serializable {
 
     @Serial
@@ -21,36 +31,36 @@ public class SettlementNotifyTask extends BaseEntity implements Serializable {
     /**
      * 任务开始时间
      */
-    @Entity.Column("start_time")
+    @Column(name = "start_time")
     private Timestamp startTime;
 
     /**
      * 任务结束时间
      */
-    @Entity.Column("end_time")
+    @Column(name = "end_time")
     private Timestamp endTime;
 
     /**
      * 任务状态(success-成功,fail-失败,processing-处理中)
      */
-    @Entity.Column("task_status")
+    @Column(name = "task_status")
     private String taskStatus;
 
     /**
      * 通知数量
      */
-    @Entity.Column("notify_num")
+    @Column(name = "notify_num")
     private Integer notifyNum;
 
     /**
      * 通知成功数量
      */
-    @Entity.Column("notify_success_num")
+    @Column(name = "notify_success_num")
     private Integer notifySuccessNum;
 
     /**
      * 通知失败数量
      */
-    @Entity.Column("notify_fail_num")
+    @Column(name = "notify_fail_num")
     private Integer notifyFailNum;
 }

+ 15 - 9
src/main/java/com/punchsettle/server/atomic/entity/SettlementTask.java

@@ -1,18 +1,24 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 import java.sql.Timestamp;
 
 /**
- * 奖励结算定时任务执行记录表
+ * @description 奖励结算定时任务执行记录表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("settlement_task")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "settlement_task")
 public class SettlementTask extends BaseEntity implements Serializable {
 
     @Serial
@@ -21,36 +27,36 @@ public class SettlementTask extends BaseEntity implements Serializable {
     /**
      * 任务开始时间
      */
-    @Entity.Column("start_time")
+    @Column(name = "start_time")
     private Timestamp startTime;
 
     /**
      * 任务结束时间
      */
-    @Entity.Column("end_time")
+    @Column(name = "end_time")
     private Timestamp endTime;
 
     /**
      * 任务状态(success-成功,fail-失败,processing-处理中)
      */
-    @Entity.Column("task_status")
+    @Column(name = "task_status")
     private String taskStatus;
 
     /**
      * 处理数量
      */
-    @Entity.Column("processed_num")
+    @Column(name = "processed_num")
     private Integer processedNum;
 
     /**
      * 处理成功数量
      */
-    @Entity.Column("processed_success_num")
+    @Column(name = "processed_success_num")
     private Integer processedSuccessNum;
 
     /**
      * 处理失败数量
      */
-    @Entity.Column("processed_fail_num")
+    @Column(name = "processed_fail_num")
     private Integer processedFailNum;
 }

+ 12 - 6
src/main/java/com/punchsettle/server/atomic/entity/User.java

@@ -1,17 +1,23 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Table;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 用户表
+ * @description 用户表 实体
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
-@Entity.Table("user")
+@EqualsAndHashCode(callSuper = true)
+@Table(name = "user")
 public class User extends BaseEntity implements Serializable {
 
     @Serial
@@ -20,18 +26,18 @@ public class User extends BaseEntity implements Serializable {
     /**
      * 微信id
      */
-    @Entity.Column("open_id")
+    @Column(name = "open_id")
     private String openId;
 
     /**
      * 微信昵称
      */
-    @Entity.Column("nickname")
+    @Column(name = "nickname")
     private String nickname;
 
     /**
      * 微信头像url
      */
-    @Entity.Column("avator")
+    @Column(name = "avator")
     private String avator;
 }

+ 6 - 5
src/main/java/com/punchsettle/server/atomic/mapper/PunchInMapper.java

@@ -1,12 +1,13 @@
 package com.punchsettle.server.atomic.mapper;
 
 import com.punchsettle.server.atomic.entity.PunchIn;
-import io.mybatis.mapper.logical.LogicalMapper;
-import org.apache.ibatis.annotations.Mapper;
+import tk.mybatis.mapper.common.Mapper;
 
 /**
- * 打卡任务表 Mapper
+ * @description 打卡任务表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
-@Mapper
-public interface PunchInMapper extends LogicalMapper<PunchIn, Long> {
+public interface PunchInMapper extends Mapper<PunchIn> {
 }

+ 6 - 5
src/main/java/com/punchsettle/server/atomic/mapper/PunchInRecordMapper.java

@@ -1,12 +1,13 @@
 package com.punchsettle.server.atomic.mapper;
 
 import com.punchsettle.server.atomic.entity.PunchInRecord;
-import io.mybatis.mapper.logical.LogicalMapper;
-import org.apache.ibatis.annotations.Mapper;
+import tk.mybatis.mapper.common.Mapper;
 
 /**
- * 打卡任务记录表 Mapper
+ * @description 打卡任务记录表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
-@Mapper
-public interface PunchInRecordMapper extends LogicalMapper<PunchInRecord, Long> {
+public interface PunchInRecordMapper extends Mapper<PunchInRecord> {
 }

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/PunchInRecordSettlementRelaMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.PunchInRecordSettlementRela;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @description 打卡任务记录与结算关联表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
+ */
+public interface PunchInRecordSettlementRelaMapper extends Mapper<PunchInRecordSettlementRela> {
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/PunchInSettlementMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.PunchInSettlement;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @description 打卡任务结算表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
+ */
+public interface PunchInSettlementMapper extends Mapper<PunchInSettlement> {
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/SettlementNotifyTaskMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.SettlementNotifyTask;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @description 通知定时任务执行记录表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
+ */
+public interface SettlementNotifyTaskMapper extends Mapper<SettlementNotifyTask> {
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/SettlementTaskMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.SettlementTask;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @description 奖励结算定时任务执行记录表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
+ */
+public interface SettlementTaskMapper extends Mapper<SettlementTask> {
+}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/UserMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.User;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @description 用户表 mapper
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
+ */
+public interface UserMapper extends Mapper<User> {
+}

+ 17 - 7
src/main/java/com/punchsettle/server/common/entity/BaseEntity.java

@@ -1,13 +1,18 @@
 package com.punchsettle.server.common.entity;
 
-import io.mybatis.mapper.logical.LogicalColumn;
-import io.mybatis.provider.Entity;
+import jakarta.persistence.Column;
+import jakarta.persistence.Id;
 import lombok.Data;
+import tk.mybatis.mapper.annotation.LogicDelete;
+import tk.mybatis.mapper.annotation.Version;
 
 import java.sql.Timestamp;
 
 /**
- * 实体类基础属性
+ * @description 实体类基类(6个通用审计字段)
+ * @version 1.0.0
+ * @date 2024/11/25 10:57
+ * @author tyuio
  */
 @Data
 public class BaseEntity {
@@ -15,40 +20,45 @@ public class BaseEntity {
     /**
      * 主键
      */
-    @Entity.Column(id = true, updatable = false, insertable = false)
+    @Id
+    @Column(name = "id")
     private Long id;
 
     /**
      * 创建人
      */
+    @Column(name = "created_by")
     private Long createdBy;
 
     /**
      * 创建时间
      */
+    @Column(name = "creation_time")
     private Timestamp creationTime;
 
     /**
      * 最后更新人
      */
+    @Column(name = "last_updated_by")
     private Long lastUpdatedBy;
 
     /**
      * 最后更新时间
      */
+    @Column(name = "last_update_time")
     private Timestamp lastUpdateTime;
 
     /**
      * 版本号
      */
+    @Version
+    @Column(name = "version")
     private Integer version;
 
     /**
      * 逻辑删除标志(0-未删除,1-已删除)
      */
-
-    @LogicalColumn(delete = "1")
-    @Entity.Column(updatable = false, insertable = false)
+    @LogicDelete
     private Boolean deleteFlag;
 
 }

+ 18 - 2
src/main/java/com/punchsettle/server/core/config/MyBatisConfig.java

@@ -1,11 +1,27 @@
 package com.punchsettle.server.core.config;
 
-import org.mybatis.spring.annotation.MapperScan;
+import com.punchsettle.server.core.interceptor.MybatisAuditDataInterceptor;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import tk.mybatis.mapper.autoconfigure.ConfigurationCustomizer;
+import tk.mybatis.spring.annotation.MapperScan;
 
 /**
  * mybatis配置扫描路径
  */
 @Configuration
 @MapperScan(basePackages = "com.punchsettle.server.atomic.mapper")
-public class MyBatisConfig {}
+public class MyBatisConfig {
+
+    @Bean
+    public ConfigurationCustomizer configurationCustomizer() {
+        // 添加审计数据插件
+        return new ConfigurationCustomizer() {
+            @Override
+            public void customize(org.apache.ibatis.session.Configuration configuration) {
+                MybatisAuditDataInterceptor auditDataInterceptor = new MybatisAuditDataInterceptor();
+                configuration.addInterceptor(auditDataInterceptor);
+            }
+        };
+    }
+}

+ 115 - 0
src/main/java/com/punchsettle/server/core/interceptor/MybatisAuditDataInterceptor.java

@@ -0,0 +1,115 @@
+package com.punchsettle.server.core.interceptor;
+
+import com.punchsettle.server.common.entity.BaseEntity;
+import com.punchsettle.server.utiis.UserUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.mapping.SqlCommandType;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.plugin.Intercepts;
+import org.apache.ibatis.plugin.Invocation;
+import org.apache.ibatis.plugin.Signature;
+
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2024/11/25 9:56
+ * @description 审计数据拦截器 Mybatis插入/更新时自动填充创建人、创建时间、最后修改人、最后修改时间
+ */
+@Intercepts({
+        @Signature(
+                type = Executor.class,
+                method = "update",
+                args = {MappedStatement.class, Object.class}),
+})
+@Slf4j
+public class MybatisAuditDataInterceptor implements Interceptor {
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+        // 对应上面类注解的args,获取需要的MappedStatement对象
+        final Object[] args = invocation.getArgs();
+        MappedStatement statement = (MappedStatement) args[0];
+
+        // 插入对象,即实体类如:SysUser
+        Object obj = args[1];
+
+        /**
+         * 插入或更新的时候,赋予createBy、updateBy、creationTime、lastUpdateTime值
+         */
+        Long currentUserId = Optional.ofNullable(UserUtils.getCurrentId()).orElse(1L);
+        Timestamp currentTime = new Timestamp(System.currentTimeMillis());
+
+        // 识别SQL类型,看是INSERT还是UPDATE
+        if (SqlCommandType.INSERT.equals(statement.getSqlCommandType())) {
+            // 单个插入,BaseEntity是我的实体类的父类,该类有id、createBy、updateBy等通用属性
+            if (obj instanceof BaseEntity) {
+                BaseEntity entity = ((BaseEntity) obj);
+                assignInsertDefaultValue(entity, currentUserId, currentTime);
+            }
+            // 批量插入
+            if (obj instanceof Map) {
+                Map<?, ?> map = (Map<?, ?>) obj;
+                List<?> list = (List<?>) map.get("list");
+                if (list != null) {
+                    for (Object entity : list) {
+                        assignInsertDefaultValue((BaseEntity) entity, currentUserId, currentTime);
+                    }
+                }
+            }
+        }
+
+        if (SqlCommandType.UPDATE.equals(statement.getSqlCommandType())) {
+            // 单个更新
+            if (obj instanceof BaseEntity) {
+                BaseEntity entity = ((BaseEntity) obj);
+                assignUpdateDefaultValue(entity, currentUserId, currentTime);
+            }
+            // 批量更新
+            if (obj instanceof Map) {
+                Map<?, ?> map = (Map<?, ?>) obj;
+                List<?> list = (List<?>) map.get("list");
+                if (list != null) {
+                    for (Object item : list) {
+                        BaseEntity entity = ((BaseEntity) item);
+                        assignUpdateDefaultValue(entity, currentUserId, currentTime);
+                    }
+                }
+            }
+        }
+
+        return invocation.proceed();
+    }
+
+    /**
+     * 插入时 赋予createdBy、creationTime、lastUpdatedBy、lastUpdateTime值
+     * @param entity 实体对象
+     * @param currentUserId 当前用户ID
+     * @param currentTime 当前时间时间
+     */
+    private void assignInsertDefaultValue(BaseEntity entity, Long currentUserId, Timestamp currentTime) {
+        entity.setCreatedBy(currentUserId);
+        entity.setCreationTime(currentTime);
+        entity.setLastUpdatedBy(currentUserId);
+        entity.setLastUpdateTime(currentTime);
+        entity.setVersion(1);
+    }
+
+    /**
+     * 更新时 赋予lastUpdatedBy、lastUpdateTime值
+     * @param entity 实体对象
+     * @param currentUserId 当前用户ID
+     * @param currentTime 当前时间时间
+     */
+    private void assignUpdateDefaultValue(BaseEntity entity, Long currentUserId, Timestamp currentTime) {
+        entity.setLastUpdatedBy(currentUserId);
+        entity.setLastUpdateTime(currentTime);
+    }
+
+}

+ 28 - 0
src/main/java/com/punchsettle/server/utiis/UserUtils.java

@@ -0,0 +1,28 @@
+package com.punchsettle.server.utiis;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @date 2024/11/25 10:15
+ * @description 用户信息相关工具类
+ */
+public class UserUtils {
+
+    public static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
+
+    /**
+     * 设置当前用户的ID
+     * @param id
+     */
+    public static void setCurrentId(Long id) {
+        threadLocal.set(id);
+    }
+
+    /**
+     * 获取当前用户的ID
+     * @return
+     */
+    public static Long getCurrentId() {
+        return threadLocal.get();
+    }
+}

+ 5 - 1
src/main/resources/application.yaml

@@ -7,10 +7,14 @@ spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     username: root
-    url: url=jdbc:mysql://localhost:3306/punch_settle?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://localhost:3306/punch_settle?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
   cache:
     type: caffeine
 
+logging:
+  level:
+    com.punchsettle.server: debug
+
 biz:
   wechat:
     mini-program: