Explorar el Código

1、优化知识图谱mq消息推送
2、增加用户实名制

rayson hace 9 meses
padre
commit
944cf55c88
Se han modificado 26 ficheros con 811 adiciones y 32 borrados
  1. 2 0
      citu-framework/citu-common/src/main/java/com/citu/framework/common/util/date/DateUtils.java
  2. 4 4
      citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/AipOcrClient.java
  3. 1 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/python/GraphApi.java
  4. 4 4
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/python/GraphSendDTO.java
  5. 3 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  6. 94 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAuthController.java
  7. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppMdeUserController.java
  8. 70 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthPageReqVO.java
  9. 81 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthRespVO.java
  10. 64 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthSaveReqVO.java
  11. 89 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAuthDO.java
  12. 39 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserAuthMapper.java
  13. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/GraphConsumer.java
  14. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/GraphProducer.java
  15. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java
  16. 3 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  17. 3 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/PersonIntegrationServiceImpl.java
  18. 4 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  19. 56 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAuthService.java
  20. 72 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAuthServiceImpl.java
  21. 3 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  22. 3 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties
  23. 1 1
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/MdeUserMapperServiceImplTest.java
  24. 180 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserAuthServiceImplTest.java
  25. 2 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  26. 26 1
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

+ 2 - 0
citu-framework/citu-common/src/main/java/com/citu/framework/common/util/date/DateUtils.java

@@ -26,6 +26,8 @@ public class DateUtils {
 
     public static final String FORMAT_YEAR_MONTH_DAY = "yyyy-MM-dd";
 
+    public static final String FORMAT_YEAR_MONTH_DAY2= "yyyyMMdd";
+
     public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
 
     public static final String FORMAT_YEAR_MONTH_DAY_CHINESE = "yyyy年MM月dd日";

+ 4 - 4
citu-framework/citu-spring-boot-starter-baidu-aip/src/main/java/com/citu/framework/baiduaip/core/AipOcrClient.java

@@ -95,7 +95,7 @@ public class AipOcrClient {
             byte[] back = HttpUtil.downloadBytes(backUrl);
             JSONObject frontRes = client.idcard(front, "front", new HashMap<String, String>());
             JSONObject backRes = client.idcard(back, "back", new HashMap<String, String>());
-            log.info("身份证识别 - 头像面: {} \r\n 国徽面", frontRes, backRes);
+            log.info("身份证识别 - 头像面: {} \r\n 国徽面: {}", frontRes, backRes);
             IDCardInfo idCardInfo = new IDCardInfo();
             // image_status
             //  normal-识别正常
@@ -112,7 +112,7 @@ public class AipOcrClient {
                 idCardInfo.setName(getWordsResultAttribute("姓名", wordsResult));
                 idCardInfo.setGender(getWordsResultAttribute("性别", wordsResult));
                 idCardInfo.setBirthDate(DateUtils.of(getWordsResultAttribute("出生", wordsResult),
-                        DateUtils.FORMAT_YEAR_MONTH_DAY_CHINESE));
+                        DateUtils.FORMAT_YEAR_MONTH_DAY2));
                 idCardInfo.setAddress(getWordsResultAttribute("住址", wordsResult));
                 idCardInfo.setIdNumber(getWordsResultAttribute("公民身份号码", wordsResult));
                 idCardInfo.setEthnicity(getWordsResultAttribute("民族", wordsResult));
@@ -122,9 +122,9 @@ public class AipOcrClient {
                 JSONObject wordsResult = backRes.getJSONObject("words_result");
                 idCardInfo.setIssuingAuthority(getWordsResultAttribute("签发机关", wordsResult));
                 idCardInfo.setIssueDate(DateUtils.of(getWordsResultAttribute("签发日期", wordsResult),
-                        DateUtils.FORMAT_YEAR_MONTH_DAY_CHINESE));
+                        DateUtils.FORMAT_YEAR_MONTH_DAY2));
                 idCardInfo.setExpiryDate(DateUtils.of(getWordsResultAttribute("失效日期", wordsResult),
-                        DateUtils.FORMAT_YEAR_MONTH_DAY_CHINESE));
+                        DateUtils.FORMAT_YEAR_MONTH_DAY2));
 
             }
             return idCardInfo;

+ 1 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/python/GraphApi.java

@@ -15,7 +15,7 @@ public interface GraphApi {
 
     @PostMapping("/rocket/receive/data")
     @Operation(summary = "发送数据到知识图谱")
-    <T> CommonResult<Boolean> send(@RequestBody GraphSendDTO<T> sendDTO);
+     CommonResult<Boolean> send(@RequestBody GraphSendDTO sendDTO);
 
     @PostMapping("/rocket/query/graph")
     @Operation(summary = "查询知识图谱数据")

+ 4 - 4
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/api/python/GraphSendDTO.java

@@ -8,7 +8,7 @@ import java.util.List;
 
 @Data
 @Schema(description = "知识图谱同步")
-public class GraphSendDTO<T> {
+public class GraphSendDTO {
 
 
     public final static String SYNC_GRAPH_TOPIC = "SYNC_GRAPH_TOPIC";
@@ -27,19 +27,19 @@ public class GraphSendDTO<T> {
     /**
      * 数据
      **/
-    private List<T> dataList;
+    private List<Object> dataList;
 
     public GraphSendDTO() {
 
     }
 
-    public GraphSendDTO(String operate, String type, List<T> dataList) {
+    public GraphSendDTO(String operate, String type, List<Object> dataList) {
         this.operate = operate;
         this.type = type;
         this.dataList = dataList;
     }
 
-    public GraphSendDTO(String operate, String type, T data) {
+    public GraphSendDTO(String operate, String type, Object data) {
         this.operate = operate;
         this.type = type;
         this.dataList = Collections.singletonList(data);

+ 3 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -477,4 +477,7 @@ public interface ErrorCodeConstants {
     ErrorCode ORDER_GOODS_PRICE_NOT_NULL = new ErrorCode(1_100_046_013, "商品金额不能为空");
 
     ErrorCode ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID = new ErrorCode(1_100_046_014, "交易订单取消失败,订单不是【待支付】状态");
+
+    // ========== 用户实名制 1_100_047_000 ==========
+    ErrorCode USER_AUTH_NOT_EXISTS = new ErrorCode(1_100_047_001, "用户实名制不存在");
 }

+ 94 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/user/UserAuthController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.system.controller.admin.user;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthRespVO;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAuthDO;
+import com.citu.module.menduner.system.service.user.UserAuthService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 用户实名制")
+@RestController
+@RequestMapping("/menduner/system/user-auth")
+@Validated
+public class UserAuthController {
+
+    @Resource
+    private UserAuthService userAuthService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建用户实名制")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:create')")
+    public CommonResult<Long> createUserAuth(@Valid @RequestBody UserAuthSaveReqVO createReqVO) {
+        return success(userAuthService.createUserAuth(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新用户实名制")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:update')")
+    public CommonResult<Boolean> updateUserAuth(@Valid @RequestBody UserAuthSaveReqVO updateReqVO) {
+        userAuthService.updateUserAuth(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户实名制")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:delete')")
+    public CommonResult<Boolean> deleteUserAuth(@RequestParam("id") Long id) {
+        userAuthService.deleteUserAuth(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户实名制")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:query')")
+    public CommonResult<UserAuthRespVO> getUserAuth(@RequestParam("id") Long id) {
+        UserAuthDO userAuth = userAuthService.getUserAuth(id);
+        return success(BeanUtils.toBean(userAuth, UserAuthRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户实名制分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:query')")
+    public CommonResult<PageResult<UserAuthRespVO>> getUserAuthPage(@Valid UserAuthPageReqVO pageReqVO) {
+        PageResult<UserAuthDO> pageResult = userAuthService.getUserAuthPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserAuthRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户实名制 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:user-auth:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserAuthExcel(@Valid UserAuthPageReqVO pageReqVO,
+                                    HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserAuthDO> list = userAuthService.getUserAuthPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户实名制.xls", "数据", UserAuthRespVO.class,
+                BeanUtils.toBean(list, UserAuthRespVO.class));
+    }
+
+}

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/user/AppMdeUserController.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.controller.app.jobhunt.user;
 
 
+import com.citu.framework.baiduaip.core.AipOcrClient;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.security.core.annotations.PreAuthenticated;

+ 70 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthPageReqVO.java

@@ -0,0 +1,70 @@
+package com.citu.module.menduner.system.controller.base.user.auth;
+
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户实名制分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class UserAuthPageReqVO extends PageParam {
+
+    @Schema(description = "认证用户id", example = "14718")
+    private Long userId;
+
+    @Schema(description = "正面", example = "https://www.iocoder.cn")
+    private String frontUrl;
+
+    @Schema(description = "反面", example = "https://www.iocoder.cn")
+    private String backUrl;
+
+    @Schema(description = "姓名", example = "王五")
+    private String name;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "民族")
+    private String ethnicity;
+
+    @Schema(description = "出生日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] birthDate;
+
+    @Schema(description = "住址")
+    private String address;
+
+    @Schema(description = "身份证号码")
+    private String idNumber;
+
+    @Schema(description = "签发机关")
+    private String issuingAuthority;
+
+    @Schema(description = "签发日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] issueDate;
+
+    @Schema(description = "失效日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] expiryDate;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", example = "1")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不对")
+    private String reason;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 81 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthRespVO.java

@@ -0,0 +1,81 @@
+package com.citu.module.menduner.system.controller.base.user.auth;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 用户实名制 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserAuthRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20280")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "认证用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14718")
+    @ExcelProperty("认证用户id")
+    private Long userId;
+
+    @Schema(description = "正面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @ExcelProperty("正面")
+    private String frontUrl;
+
+    @Schema(description = "反面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @ExcelProperty("反面")
+    private String backUrl;
+
+    @Schema(description = "姓名", example = "王五")
+    @ExcelProperty("姓名")
+    private String name;
+
+    @Schema(description = "性别")
+    @ExcelProperty("性别")
+    private String gender;
+
+    @Schema(description = "民族")
+    @ExcelProperty("民族")
+    private String ethnicity;
+
+    @Schema(description = "出生日期")
+    @ExcelProperty("出生日期")
+    private LocalDateTime birthDate;
+
+    @Schema(description = "住址")
+    @ExcelProperty("住址")
+    private String address;
+
+    @Schema(description = "身份证号码")
+    @ExcelProperty("身份证号码")
+    private String idNumber;
+
+    @Schema(description = "签发机关")
+    @ExcelProperty("签发机关")
+    private String issuingAuthority;
+
+    @Schema(description = "签发日期")
+    @ExcelProperty("签发日期")
+    private LocalDateTime issueDate;
+
+    @Schema(description = "失效日期")
+    @ExcelProperty("失效日期")
+    private LocalDateTime expiryDate;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("审核状态(0审核中 1审核通过 2审核不通过)")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不对")
+    @ExcelProperty("审核原因")
+    private String reason;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 64 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/user/auth/UserAuthSaveReqVO.java

@@ -0,0 +1,64 @@
+package com.citu.module.menduner.system.controller.base.user.auth;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户实名制新增/修改 Request VO")
+@Data
+public class UserAuthSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20280")
+    private Long id;
+
+    @Schema(description = "认证用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14718")
+    @NotNull(message = "认证用户id不能为空")
+    private Long userId;
+
+    @Schema(description = "正面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "正面不能为空")
+    private String frontUrl;
+
+    @Schema(description = "反面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "反面不能为空")
+    private String backUrl;
+
+    @Schema(description = "姓名", example = "王五")
+    private String name;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "民族")
+    private String ethnicity;
+
+    @Schema(description = "出生日期")
+    private LocalDateTime birthDate;
+
+    @Schema(description = "住址")
+    private String address;
+
+    @Schema(description = "身份证号码")
+    private String idNumber;
+
+    @Schema(description = "签发机关")
+    private String issuingAuthority;
+
+    @Schema(description = "签发日期")
+    private LocalDateTime issueDate;
+
+    @Schema(description = "失效日期")
+    private LocalDateTime expiryDate;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "审核状态(0审核中 1审核通过 2审核不通过)不能为空")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不对")
+    private String reason;
+
+}

+ 89 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/user/UserAuthDO.java

@@ -0,0 +1,89 @@
+package com.citu.module.menduner.system.dal.dataobject.user;
+
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 用户实名制 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_user_auth")
+@KeySequence("mde_user_auth_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserAuthDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 认证用户id
+     */
+    private Long userId;
+    /**
+     * 正面
+     */
+    private String frontUrl;
+    /**
+     * 反面
+     */
+    private String backUrl;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 性别
+     */
+    private String gender;
+    /**
+     * 民族
+     */
+    private String ethnicity;
+    /**
+     * 出生日期
+     */
+    private LocalDateTime birthDate;
+    /**
+     * 住址
+     */
+    private String address;
+    /**
+     * 身份证号码
+     */
+    private String idNumber;
+    /**
+     * 签发机关
+     */
+    private String issuingAuthority;
+    /**
+     * 签发日期
+     */
+    private LocalDateTime issueDate;
+    /**
+     * 失效日期
+     */
+    private LocalDateTime expiryDate;
+    /**
+     * 审核状态(0审核中 1审核通过 2审核不通过)
+     */
+    private String status;
+    /**
+     * 审核原因
+     */
+    private String reason;
+
+}

+ 39 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/UserAuthMapper.java

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.system.dal.mysql.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAuthDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户实名制 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface UserAuthMapper extends BaseMapperX<UserAuthDO> {
+
+    default PageResult<UserAuthDO> selectPage(UserAuthPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserAuthDO>()
+                .eqIfPresent(UserAuthDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserAuthDO::getFrontUrl, reqVO.getFrontUrl())
+                .eqIfPresent(UserAuthDO::getBackUrl, reqVO.getBackUrl())
+                .likeIfPresent(UserAuthDO::getName, reqVO.getName())
+                .eqIfPresent(UserAuthDO::getGender, reqVO.getGender())
+                .eqIfPresent(UserAuthDO::getEthnicity, reqVO.getEthnicity())
+                .betweenIfPresent(UserAuthDO::getBirthDate, reqVO.getBirthDate())
+                .eqIfPresent(UserAuthDO::getAddress, reqVO.getAddress())
+                .eqIfPresent(UserAuthDO::getIdNumber, reqVO.getIdNumber())
+                .eqIfPresent(UserAuthDO::getIssuingAuthority, reqVO.getIssuingAuthority())
+                .betweenIfPresent(UserAuthDO::getIssueDate, reqVO.getIssueDate())
+                .betweenIfPresent(UserAuthDO::getExpiryDate, reqVO.getExpiryDate())
+                .eqIfPresent(UserAuthDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(UserAuthDO::getReason, reqVO.getReason())
+                .betweenIfPresent(UserAuthDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(UserAuthDO::getId));
+    }
+
+}

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/GraphConsumer.java

@@ -22,13 +22,13 @@ import javax.annotation.Resource;
         topic = GraphSendDTO.SYNC_GRAPH_TOPIC,
         consumerGroup = GraphSendDTO.SYNC_GRAPH_TOPIC + "_CONSUMER"
 )
-public class GraphConsumer<T> implements RocketMQListener<GraphSendDTO<T>> {
+public class GraphConsumer implements RocketMQListener<GraphSendDTO> {
 
     @Resource
     private GraphApi graphApi;
 
     @Override
-    public  void onMessage(GraphSendDTO<T> message) {
+    public  void onMessage(GraphSendDTO message) {
         log.info("GraphConsumer-接收到队列消息[{}]", message);
         graphApi.send(message).getCheckedData();
         log.info("GraphConsumer-消息处理完备[{}]", message);

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/GraphProducer.java

@@ -25,7 +25,7 @@ public class GraphProducer {
     private RocketMQTemplate rocketMQTemplate;
 
 
-    public <T> void send(GraphSendDTO<T> dto)  {
+    public void send(GraphSendDTO dto)  {
         Message<?> message = MessageBuilder.withPayload(dto).build();
         rocketMQTemplate.syncSend(
                 SYNC_GRAPH_TOPIC,

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java

@@ -300,7 +300,7 @@ public class EnterpriseServiceImpl implements EnterpriseService {
             resp.setStatus(DictFrameworkUtils.getDictDataLabel(MENDUNER_STATUS, resp.getStatus()));
         }
         graphProducer.send(
-                new GraphSendDTO<EnterpriseDetailRespVO>
+                new GraphSendDTO
                         (
                                 SyncConstants.SYNC_ALL,
                                 SyncConstants.ENTERPRISE,
@@ -363,13 +363,13 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         if (SyncConstants.DELETE.equals(operate)) {
             // 删除
             graphProducer.send(
-                    new GraphSendDTO<Long>
+                    new GraphSendDTO
                             (SyncConstants.DELETE, SyncConstants.ENTERPRISE, id)
             );
         } else {
             // 修改 || 新增
             graphProducer.send(
-                    new GraphSendDTO<EnterpriseDetailRespVO>
+                    new GraphSendDTO
                             (
                                     operate,
                                     SyncConstants.ENTERPRISE,

+ 3 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -332,8 +332,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         }
 
         producer.send(
-                new GraphSendDTO<JobAdvertisedRespVO>
-                        (
+                new GraphSendDTO(
                                 SyncConstants.SYNC_ALL,
                                 SyncConstants.JOB,
                                 respList
@@ -511,7 +510,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             esProducer.send(SyncConstants.JOB, SyncConstants.ADD, job.getId());
             // 图数据库
             producer.send(
-                    new GraphSendDTO<JobAdvertisedRespVO>
+                    new GraphSendDTO
                             (
                                     SyncConstants.ADD,
                                     SyncConstants.JOB,
@@ -523,7 +522,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             esProducer.send(SyncConstants.JOB, SyncConstants.UPDATE, job.getId());
             // 图数据库
             producer.send(
-                    new GraphSendDTO<JobAdvertisedRespVO>
+                    new GraphSendDTO
                             (
                                     SyncConstants.UPDATE,
                                     SyncConstants.JOB,

+ 3 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/PersonIntegrationServiceImpl.java

@@ -187,9 +187,8 @@ public class PersonIntegrationServiceImpl implements PersonIntegrationService {
             list.add(resp);
 
             graphProducer.send(
-                    new GraphSendDTO<PersonDetailRespVO>
-                            (
-                                    SyncConstants.ADD,
+                    new GraphSendDTO(
+                                    SyncConstants.SYNC_ALL,
                                     SyncConstants.PERSON,
                                     resp
                             )
@@ -198,7 +197,7 @@ public class PersonIntegrationServiceImpl implements PersonIntegrationService {
         }
 
 //        graphApi.send(
-//                new GraphSendDTO<PersonDetailRespVO>
+//                new GraphSendDTO
 //                        (
 //                                SyncConstants.SYNC_ALL,
 //                                SyncConstants.PERSON,

+ 4 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java

@@ -110,7 +110,7 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         if (null == info) {
             personInfoMapper.insert(userInfo);
             graphProducer.send(
-                    new GraphSendDTO<PersonInfoDO>
+                    new GraphSendDTO
                             (
                                     SyncConstants.ADD,
                                     SyncConstants.PERSON,
@@ -121,7 +121,7 @@ public class PersonInfoServiceImpl implements PersonInfoService {
             userInfo.setId(info.getId());
             personInfoMapper.updateById(userInfo);
             graphProducer.send(
-                    new GraphSendDTO<PersonInfoDO>
+                    new GraphSendDTO
                             (
                                     SyncConstants.UPDATE,
                                     SyncConstants.PERSON,
@@ -139,7 +139,7 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         info.setTagList(reqVO.getTagList());
         personInfoMapper.updateById(info);
         graphProducer.send(
-                new GraphSendDTO<PersonInfoDO>
+                new GraphSendDTO
                         (
                                 SyncConstants.UPDATE,
                                 SyncConstants.PERSON,
@@ -188,7 +188,7 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         info.setAdvantage(reqVO.getContent());
         personInfoMapper.updateById(info);
         graphProducer.send(
-                new GraphSendDTO<PersonInfoDO>
+                new GraphSendDTO
                         (
                                 SyncConstants.UPDATE,
                                 SyncConstants.PERSON,

+ 56 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAuthService.java

@@ -0,0 +1,56 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAuthDO;
+
+import javax.validation.Valid;
+
+/**
+ * 用户实名制 Service 接口
+ *
+ * @author Rayson
+ */
+public interface UserAuthService {
+
+    /**
+     * 创建用户实名制
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserAuth(@Valid UserAuthSaveReqVO createReqVO);
+
+    /**
+     * 更新用户实名制
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserAuth(@Valid UserAuthSaveReqVO updateReqVO);
+
+    /**
+     * 删除用户实名制
+     *
+     * @param id 编号
+     */
+    void deleteUserAuth(Long id);
+
+    /**
+     * 获得用户实名制
+     *
+     * @param id 编号
+     * @return 用户实名制
+     */
+    UserAuthDO getUserAuth(Long id);
+
+    /**
+     * 获得用户实名制分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户实名制分页
+     */
+    PageResult<UserAuthDO> getUserAuthPage(UserAuthPageReqVO pageReqVO);
+
+}

+ 72 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/UserAuthServiceImpl.java

@@ -0,0 +1,72 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAuthDO;
+import com.citu.module.menduner.system.dal.mysql.user.UserAuthMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_AUTH_NOT_EXISTS;
+
+/**
+ * 用户实名制 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class UserAuthServiceImpl implements UserAuthService {
+
+    @Resource
+    private UserAuthMapper userAuthMapper;
+
+    @Override
+    public Long createUserAuth(UserAuthSaveReqVO createReqVO) {
+        // 插入
+        UserAuthDO userAuth = BeanUtils.toBean(createReqVO, UserAuthDO.class);
+        userAuthMapper.insert(userAuth);
+        // 返回
+        return userAuth.getId();
+    }
+
+    @Override
+    public void updateUserAuth(UserAuthSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserAuthExists(updateReqVO.getId());
+        // 更新
+        UserAuthDO updateObj = BeanUtils.toBean(updateReqVO, UserAuthDO.class);
+        userAuthMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteUserAuth(Long id) {
+        // 校验存在
+        validateUserAuthExists(id);
+        // 删除
+        userAuthMapper.deleteById(id);
+    }
+
+    private void validateUserAuthExists(Long id) {
+        if (userAuthMapper.selectById(id) == null) {
+            throw exception(USER_AUTH_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public UserAuthDO getUserAuth(Long id) {
+        return userAuthMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<UserAuthDO> getUserAuthPage(UserAuthPageReqVO pageReqVO) {
+        return userAuthMapper.selectPage(pageReqVO);
+    }
+
+}

+ 3 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties

@@ -337,4 +337,6 @@
 1_100_046_011=Failed to initiate refund, refund amount does not match
 1_100_046_012=Product name cannot be empty
 1_100_046_013=Product amount cannot be empty
-1_100_046_014=Transaction order cancellation failed, order is not in the 'Pending Payment' status
+1_100_046_014=Transaction order cancellation failed, order is not in the 'Pending Payment' status
+# ========== 用户实名制 1_100_047_000 ==========
+1_100_047_001=User real name system does not exist

+ 3 - 1
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -340,4 +340,6 @@
 1_100_046_011=发起退款失败,退款单金额不匹配
 1_100_046_012=商品名称不能为空
 1_100_046_013=商品金额不能为空
-1_100_046_014=交易订单取消失败,订单不是【待支付】状态
+1_100_046_014=交易订单取消失败,订单不是【待支付】状态
+# ========== 用户实名制 1_100_047_000 ==========
+1_100_047_001=用户实名制不存在

+ 1 - 1
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/OldOldMdeUserMapperServiceImplTest.java → menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/MdeUserMapperServiceImplTest.java

@@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.*;
  * @author Rayson
  */
 @Import(MdeUserServiceImpl.class)
-public class OldOldMdeUserMapperServiceImplTest extends BaseDbUnitTest {
+public class MdeUserMapperServiceImplTest extends BaseDbUnitTest {
 
     @Resource
     private MdeUserServiceImpl mdeUserService;

+ 180 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/user/UserAuthServiceImplTest.java

@@ -0,0 +1,180 @@
+package com.citu.module.menduner.system.service.user;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.user.auth.UserAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.user.UserAuthDO;
+import com.citu.module.menduner.system.dal.mysql.user.UserAuthMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.USER_AUTH_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link UserAuthServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(UserAuthServiceImpl.class)
+public class UserAuthServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private UserAuthServiceImpl userAuthService;
+
+    @Resource
+    private UserAuthMapper userAuthMapper;
+
+    @Test
+    public void testCreateUserAuth_success() {
+        // 准备参数
+        UserAuthSaveReqVO createReqVO = randomPojo(UserAuthSaveReqVO.class).setId(null);
+
+        // 调用
+        Long userAuthId = userAuthService.createUserAuth(createReqVO);
+        // 断言
+        assertNotNull(userAuthId);
+        // 校验记录的属性是否正确
+        UserAuthDO userAuth = userAuthMapper.selectById(userAuthId);
+        assertPojoEquals(createReqVO, userAuth, "id");
+    }
+
+    @Test
+    public void testUpdateUserAuth_success() {
+        // mock 数据
+        UserAuthDO dbUserAuth = randomPojo(UserAuthDO.class);
+        userAuthMapper.insert(dbUserAuth);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        UserAuthSaveReqVO updateReqVO = randomPojo(UserAuthSaveReqVO.class, o -> {
+            o.setId(dbUserAuth.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        userAuthService.updateUserAuth(updateReqVO);
+        // 校验是否更新正确
+        UserAuthDO userAuth = userAuthMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, userAuth);
+    }
+
+    @Test
+    public void testUpdateUserAuth_notExists() {
+        // 准备参数
+        UserAuthSaveReqVO updateReqVO = randomPojo(UserAuthSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userAuthService.updateUserAuth(updateReqVO), USER_AUTH_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteUserAuth_success() {
+        // mock 数据
+        UserAuthDO dbUserAuth = randomPojo(UserAuthDO.class);
+        userAuthMapper.insert(dbUserAuth);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbUserAuth.getId();
+
+        // 调用
+        userAuthService.deleteUserAuth(id);
+        // 校验数据不存在了
+        assertNull(userAuthMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteUserAuth_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> userAuthService.deleteUserAuth(id), USER_AUTH_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetUserAuthPage() {
+        // mock 数据
+        UserAuthDO dbUserAuth = randomPojo(UserAuthDO.class, o -> { // 等会查询到
+            o.setUserId(null);
+            o.setFrontUrl(null);
+            o.setBackUrl(null);
+            o.setName(null);
+            o.setGender(null);
+            o.setEthnicity(null);
+            o.setBirthDate(null);
+            o.setAddress(null);
+            o.setIdNumber(null);
+            o.setIssuingAuthority(null);
+            o.setIssueDate(null);
+            o.setExpiryDate(null);
+            o.setStatus(null);
+            o.setReason(null);
+            o.setCreateTime(null);
+        });
+        userAuthMapper.insert(dbUserAuth);
+        // 测试 userId 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setUserId(null)));
+        // 测试 frontUrl 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setFrontUrl(null)));
+        // 测试 backUrl 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setBackUrl(null)));
+        // 测试 name 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setName(null)));
+        // 测试 gender 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setGender(null)));
+        // 测试 ethnicity 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setEthnicity(null)));
+        // 测试 birthDate 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setBirthDate(null)));
+        // 测试 address 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setAddress(null)));
+        // 测试 idNumber 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setIdNumber(null)));
+        // 测试 issuingAuthority 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setIssuingAuthority(null)));
+        // 测试 issueDate 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setIssueDate(null)));
+        // 测试 expiryDate 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setExpiryDate(null)));
+        // 测试 status 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setStatus(null)));
+        // 测试 reason 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setReason(null)));
+        // 测试 createTime 不匹配
+        userAuthMapper.insert(cloneIgnoreId(dbUserAuth, o -> o.setCreateTime(null)));
+        // 准备参数
+        UserAuthPageReqVO reqVO = new UserAuthPageReqVO();
+        reqVO.setUserId(null);
+        reqVO.setFrontUrl(null);
+        reqVO.setBackUrl(null);
+        reqVO.setName(null);
+        reqVO.setGender(null);
+        reqVO.setEthnicity(null);
+        reqVO.setBirthDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setAddress(null);
+        reqVO.setIdNumber(null);
+        reqVO.setIssuingAuthority(null);
+        reqVO.setIssueDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setExpiryDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setStatus(null);
+        reqVO.setReason(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<UserAuthDO> pageResult = userAuthService.getUserAuthPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbUserAuth, pageResult.getList().get(0));
+    }
+
+}

+ 2 - 1
menduner/menduner-system-biz/src/test/resources/sql/clean.sql

@@ -37,4 +37,5 @@ DELETE FROM "mde_interview_invite";
 
 DELETE FROM "mde_enterprise_auth";
 DELETE FROM "mde_tag";
-DELETE FROM "mde_hunt";
+DELETE FROM "mde_hunt";
+DELETE FROM "mde_user_auth";

+ 26 - 1
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -655,4 +655,29 @@ CREATE TABLE IF NOT EXISTS "mde_hunt" (
     "status" varchar NOT NULL,
     "remark" varchar,
     PRIMARY KEY ("id")
-) COMMENT '猎寻服务';
+) COMMENT '猎寻服务';
+
+CREATE TABLE IF NOT EXISTS "mde_user_auth" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "user_id" bigint NOT NULL,
+    "front_url" varchar NOT NULL,
+    "back_url" varchar NOT NULL,
+    "name" varchar,
+    "gender" varchar,
+    "ethnicity" varchar,
+    "birth_date" varchar,
+    "address" varchar,
+    "id_number" varchar,
+    "issuing_authority" varchar,
+    "issue_date" varchar,
+    "expiry_date" varchar,
+    "status" varchar NOT NULL,
+    "reason" varchar,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '用户实名制';