Browse Source

代码生成模板 增删查改

zrd 3 months ago
parent
commit
6e980984a2
31 changed files with 2289 additions and 11 deletions
  1. 40 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/BaseErrorCodeConstants.java
  2. 336 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/util/CommonValidationUtils.java
  3. 643 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/util/FrameworkStringUtils.java
  4. 93 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/CodegenTempleController.java
  5. 42 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTemplePageReqVO.java
  6. 50 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTempleRespVO.java
  7. 36 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTempleSaveReqVO.java
  8. 56 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegentemple/CodegenTempleDO.java
  9. 30 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegentemple/CodegenTempleMapper.java
  10. 15 11
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java
  11. 54 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegentemple/CodegenTempleService.java
  12. 69 0
      yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegentemple/CodegenTempleServiceImpl.java
  13. 12 0
      yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/codegentemple/CodegenTempleMapper.xml
  14. 93 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/UserInfoAiController.java
  15. 93 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/UserInfoFilesController.java
  16. 36 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiPageReqVO.java
  17. 39 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiRespVO.java
  18. 27 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiSaveReqVO.java
  19. 36 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesPageReqVO.java
  20. 42 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesRespVO.java
  21. 27 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesSaveReqVO.java
  22. 46 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/userinfoai/UserInfoAiDO.java
  23. 48 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/userinfoai/UserInfoFilesDO.java
  24. 28 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/userinfoai/UserInfoAiMapper.java
  25. 28 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/userinfoai/UserInfoFilesMapper.java
  26. 54 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoAiService.java
  27. 69 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoAiServiceImpl.java
  28. 54 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoFilesService.java
  29. 69 0
      yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoFilesServiceImpl.java
  30. 12 0
      yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/userinfoai/UserInfoAiMapper.xml
  31. 12 0
      yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/userinfoai/UserInfoFilesMapper.xml

+ 40 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/BaseErrorCodeConstants.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.framework.common.exception;
+
+/**
+ * Member 错误码枚举类
+ * <p>
+ * member 系统,使用 1-004-000-000 段
+ */
+public interface BaseErrorCodeConstants {
+    
+    // ========== 数据资产  1-001-001-000 ============
+    ErrorCode BASIC_NOT_EXISTS = new ErrorCode(1_001_001_000, "{}数据不存在");
+    ErrorCode BASIC_TYPE_ERROR = new ErrorCode(1_001_001_000, "{}类型错误");
+    ErrorCode BASIC_PARAM_MISS = new ErrorCode(1_001_001_000, "{}参数缺失");
+    ErrorCode BASIC_PARAM_VALID = new ErrorCode(1_001_001_000, "{}参数非法");
+    ErrorCode BASIC_ALEADY_EXISTS = new ErrorCode(1_001_001_000, "数据【{}】已经存在");
+    ErrorCode CHECK_NOT_NULL = new ErrorCode(1_001_001_000, "{}数据{}不能为空!");
+    
+    ErrorCode CHECK_NOT_NULL2 = new ErrorCode(1_001_001_000, "【{}】不能为空!");
+    
+    ErrorCode CHECK_NOT_NULL3 = new ErrorCode(1_001_001_000, "第{}行数据{}不能为空");
+    ErrorCode CHECK_NOT_NULL_BASE = new ErrorCode(1_001_001_000, "{}!");
+    
+    ErrorCode PATERNAL_NOT_EXISTS = new ErrorCode(1_001_001_001, "{}不存在");
+    ErrorCode PATERNAL_EXISTS_CHILDREN = new ErrorCode(1_001_001_002, "存在存在子{},无法删除");
+    ErrorCode PATERNAL_PARENT_NOT_EXITS = new ErrorCode(1_001_001_003, "父级{}不存在");
+    ErrorCode PATERNAL_PARENT_ERROR = new ErrorCode(1_001_001_004, "不能设置自己为父{}");
+    ErrorCode PATERNAL_NAME_DUPLICATE = new ErrorCode(1_001_001_005, "已经存在该分类名称的{}");
+    ErrorCode PATERNAL_PARENT_IS_CHILD = new ErrorCode(1_001_001_006, "不能设置自己的子GasType为父GasType");
+    
+    ErrorCode CURRENT_MONTH_NOT_AMORTIZABLE = new ErrorCode(1_001_001_007, "本月不可摊销,可在次月开始摊销");
+    
+    ErrorCode AMOUNT_CANNOT_EXCEED_TOTAL_VALUE = new ErrorCode(1_001_001_008, "当前累计减值额度已经超过资产成本总额度,剩余可减值额度为{}元");
+    ErrorCode NUMBER_CANNOT_EXCEED_TOTAL_COUNT = new ErrorCode(1_001_001_009, "当前累计减少数量已经超过资产总存货数量,剩余可减少数量为{}个");
+    ErrorCode CURRENT_MONTH_AMORTIZABLE = new ErrorCode(1_001_001_010, "本月已经摊销,不可再次摊销");
+    
+    ErrorCode END_DATE_OVERDUE = new ErrorCode(1_001_001_011, "{}的结束日期已过,无法发布!");
+    
+    ErrorCode MIN_DATA_LT_MAX_DATA = new ErrorCode(1_001_001_012, "{}的最小值应小于最大值");
+    
+}

+ 336 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/util/CommonValidationUtils.java

@@ -0,0 +1,336 @@
+package cn.iocoder.yudao.framework.common.exception.util;
+
+
+import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * author: zrd
+ *
+ * @author zrd
+ * @date 2024/09/19
+ */
+public class CommonValidationUtils {
+    
+    /**
+     * 通用验证
+     */
+    public CommonValidationUtils() {
+    }
+    
+    /**
+     * 失败
+     *
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void fail(ErrorCode errorCode, Object... args) {
+        makeError(errorCode, args);
+    }
+    
+    /**
+     * 不为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notNull(Object input, ErrorCode errorCode, Object... args) {
+        if (input != null) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 为 null
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void isNull(Object input, ErrorCode errorCode, Object... args) {
+        if (input == null) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notEmpty(String input, ErrorCode errorCode, Object... args) {
+        if (FrameworkStringUtils.isNotEmpty(input)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void isEmpty(String input, ErrorCode errorCode, Object... args) {
+        if (FrameworkStringUtils.isEmpty(input)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static <E> void isEmpty(Collection<E> input, ErrorCode errorCode, Object... args) {
+        if (input == null || input.isEmpty()) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static <E> void notEmpty(Collection<E> input, ErrorCode errorCode, Object... args) {
+        if (input != null && !input.isEmpty()) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static <K, V> void isEmpty(Map<K, V> input, ErrorCode errorCode, Object... args) {
+        if (input == null || input.isEmpty()) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不为空
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static <K, V> void notEmpty(Map<K, V> input, ErrorCode errorCode, Object... args) {
+        if (input != null && !input.isEmpty()) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 零
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void zero(int input, ErrorCode errorCode, Object... args) {
+        if (input == 0) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不为零
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notZero(int input, ErrorCode errorCode, Object... args) {
+        if (input != 0) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不是十进制数字
+     *
+     * @param decimal   十进制
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notDecimalDigits(String decimal, ErrorCode errorCode, Object... args) {
+        if (!FrameworkStringUtils.isDecimalDigits(decimal)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 是真
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void isTrue(boolean input, ErrorCode errorCode, Object... args) {
+        if (input) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 为 false
+     *
+     * @param input     输入
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void isFalse(boolean input, ErrorCode errorCode, Object... args) {
+        if (!input) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 等于
+     *
+     * @param input     输入
+     * @param another   另一个
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void equals(String input, String another, ErrorCode errorCode, Object... args) {
+        if (FrameworkStringUtils.equals(input, another)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不等于
+     *
+     * @param input     输入
+     * @param another   另一个
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notEquals(Object input, Object another, ErrorCode errorCode, Object... args) {
+        if (input == null || !input.equals(another)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不等于
+     *
+     * @param input     输入
+     * @param another   另一个
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notEquals(String input, String another, ErrorCode errorCode, Object... args) {
+        if (!FrameworkStringUtils.equals(input, another)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 等于忽略大小写
+     *
+     * @param input     输入
+     * @param another   另一个
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void equalsIgnoreCase(String input, String another, ErrorCode errorCode, Object... args) {
+        if (FrameworkStringUtils.equalsIgnoreCase(input, another)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 不等于忽略大小写
+     *
+     * @param input     输入
+     * @param another   另一个
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notEqualsIgnoreCase(String input, String another, ErrorCode errorCode, Object... args) {
+        if (!FrameworkStringUtils.equalsIgnoreCase(input, another)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * 在
+     *
+     * @param value     价值
+     * @param values    值
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void in(String value, String[] values, ErrorCode errorCode, Object... args) {
+        if (FrameworkStringUtils.isContains(values, value)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    /**
+     * notin
+     *
+     * @param value     价值
+     * @param values    值
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    public static void notin(String value, String[] values, ErrorCode errorCode, Object... args) {
+        if (!FrameworkStringUtils.isContains(values, value)) {
+            makeError(errorCode, args);
+        }
+        
+    }
+    
+    
+    /**
+     * 制造错误
+     *
+     * @param errorCode 错误代码
+     * @param args      参数
+     */
+    private static void makeError(ErrorCode errorCode, Object... args) {
+        
+        
+        throw new ServiceException(errorCode.getCode(), StrUtil.format(errorCode.getMsg(), args));
+    }
+    
+    
+}

+ 643 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/util/FrameworkStringUtils.java

@@ -0,0 +1,643 @@
+package cn.iocoder.yudao.framework.common.exception.util;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Pattern;
+
+/**
+ * author: zrd
+ *
+ * @author zrd
+ * @date 2024/09/19
+ */
+public class FrameworkStringUtils {
+    /**
+     * 前缀
+     */
+    private static final String PREFIX = "\\u";
+    /**
+     * int 模式
+     */
+    private static final Pattern INT_PATTERN = Pattern.compile("^\\d+$");
+    
+    /**
+     * 框架字符串 utils
+     */
+    private FrameworkStringUtils() {
+    }
+    
+    /**
+     * 为空
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean isEmpty(Object str) {
+        return str == null || "".equals(str);
+    }
+    
+    /**
+     * 具有长度
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean hasLength(CharSequence str) {
+        return str != null && str.length() > 0;
+    }
+    
+    /**
+     * 具有长度
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean hasLength(String str) {
+        return hasLength((CharSequence) str);
+    }
+    
+    /**
+     * 有文字
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean hasText(CharSequence str) {
+        if (!hasLength(str)) {
+            return false;
+        } else {
+            int strLen = str.length();
+            
+            for (int i = 0; i < strLen; ++i) {
+                if (!Character.isWhitespace(str.charAt(i))) {
+                    return true;
+                }
+            }
+            
+            return false;
+        }
+    }
+    
+    /**
+     * 有文字
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean hasText(String str) {
+        return hasText((CharSequence) str);
+    }
+    
+    /**
+     * 是整数
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean isInteger(String str) {
+        return str != null && str.length() != 0 && INT_PATTERN.matcher(str).matches();
+    }
+    
+    /**
+     * convert bool (转换布尔值)
+     *
+     * @param value 价值
+     * @return {@link String }
+     */
+    public static String convertBool(String value) {
+        if ("true".equalsIgnoreCase(value)) {
+            return "1";
+        } else {
+            return "false".equalsIgnoreCase(value) ? "0" : value;
+        }
+    }
+    
+    /**
+     * 获取布尔
+     *
+     * @param value 价值
+     * @return boolean
+     */
+    public static boolean getBool(String value) {
+        return value != null && !"false".equalsIgnoreCase(value) && !"0".equals(value) && !value.isEmpty();
+    }
+    
+    /**
+     * 全部替换
+     *
+     * @param string    字符串
+     * @param oldString 旧字符串
+     * @param newString 新建字符串
+     * @return {@link String }
+     */
+    public static String replaceAll(String string, String oldString, String newString) {
+        return innerReplace(string, oldString, newString, true);
+    }
+    
+    /**
+     * 先替换
+     *
+     * @param string    字符串
+     * @param oldString 旧字符串
+     * @param newString 新建字符串
+     * @return {@link String }
+     */
+    public static String replaceFirst(String string, String oldString, String newString) {
+        return innerReplace(string, oldString, newString, false);
+    }
+    
+    /**
+     * 内部替换
+     *
+     * @param string    字符串
+     * @param oldString 旧字符串
+     * @param newString 新建字符串
+     * @param isAll     就是全部
+     * @return {@link String }
+     */
+    private static String innerReplace(String string, String oldString, String newString, boolean isAll) {
+        int index = string.indexOf(oldString);
+        if (index == -1) {
+            return string;
+        } else {
+            int start = 0;
+            int len = oldString.length();
+            if (len == 0) {
+                return string;
+            } else {
+                StringBuilder buffer = new StringBuilder(string.length());
+                
+                do {
+                    buffer.append(string, start, index);
+                    buffer.append(newString);
+                    start = index + len;
+                    if (!isAll) {
+                        break;
+                    }
+                    
+                    index = string.indexOf(oldString, start);
+                } while (index != -1);
+                
+                buffer.append(string.substring(start));
+                return buffer.toString();
+            }
+        }
+    }
+    
+    /**
+     * 连接
+     *
+     * @param string 字符串
+     * @return {@link String }
+     */
+    public static String concat(String... string) {
+        int length = 0;
+        String[] var2 = string;
+        int var3 = string.length;
+        
+        int var4;
+        for (var4 = 0; var4 < var3; ++var4) {
+            String str = var2[var4];
+            length += str.length();
+        }
+        
+        StringBuilder buf = new StringBuilder(length);
+        String[] var8 = string;
+        var4 = string.length;
+        
+        for (int var9 = 0; var9 < var4; ++var9) {
+            String str = var8[var9];
+            buf.append(str);
+        }
+        
+        return buf.toString();
+    }
+    
+    /**
+     * 加入地图
+     *
+     * @param maps 地图
+     * @return {@link String }
+     */
+    public static String joinMap(Map<String, String> maps) {
+        if (maps != null && !maps.isEmpty()) {
+            StringBuilder builder = new StringBuilder();
+            Iterator var2 = maps.entrySet().iterator();
+            
+            while (var2.hasNext()) {
+                Map.Entry<String, String> entry = (Map.Entry) var2.next();
+                builder.append(entry.getKey()).append("=").append(entry.getValue()).append(",");
+            }
+            
+            if (builder.length() > 0) {
+                builder.setLength(builder.length() - 1);
+            }
+            
+            return builder.toString();
+        } else {
+            return "";
+        }
+    }
+    
+    /**
+     * 分割到地图
+     *
+     * @param value 价值
+     * @return {@link Map }<{@link String }, {@link String }>
+     */
+    public static Map<String, String> splitToMap(String value) {
+        if (!hasLength(value)) {
+            return Collections.emptyMap();
+        } else {
+            Map<String, String> maps = new HashMap(16);
+            String[] var2 = value.split(",");
+            int var3 = var2.length;
+            
+            for (int var4 = 0; var4 < var3; ++var4) {
+                String kav = var2[var4];
+                String[] kavv = kav.split("=");
+                switch (kavv.length) {
+                    case 0:
+                        break;
+                    case 1:
+                        maps.put(kavv[0], "");
+                        break;
+                    case 2:
+                        maps.put(kavv[0], kavv[1]);
+                        break;
+                    default:
+                        throw new IllegalArgumentException("Value (" + value + ") is Invalid.");
+                }
+            }
+            
+            return maps;
+        }
+    }
+    
+    /**
+     * 是布尔值
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean isBooleanValue(String str) {
+        return Boolean.TRUE.toString().equalsIgnoreCase(str) || Boolean.FALSE.toString().equalsIgnoreCase(str);
+    }
+    
+    /**
+     * 是 int 值
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean isIntValue(String str) {
+        try {
+            Integer.parseInt(str);
+            return true;
+        } catch (NumberFormatException var2) {
+            return false;
+        }
+    }
+    
+    /**
+     * 是 long value
+     *
+     * @param str str
+     * @return boolean
+     */
+    public static boolean isLongValue(String str) {
+        try {
+            Long.parseLong(str);
+            return true;
+        } catch (NumberFormatException var2) {
+            return false;
+        }
+    }
+    
+    /**
+     * 是十进制数字
+     *
+     * @param decimal 十进制
+     * @return boolean
+     */
+    public static boolean isDecimalDigits(String decimal) {
+        return isDecimalDigits(decimal, 2);
+    }
+    
+    /**
+     * 是十进制数字
+     *
+     * @param decimal 十进制
+     * @param scale   规模
+     * @return boolean
+     */
+    public static boolean isDecimalDigits(String decimal, int scale) {
+        BigDecimal decimalValue;
+        try {
+            decimalValue = new BigDecimal(decimal);
+        } catch (NumberFormatException var4) {
+            return false;
+        }
+        
+        return decimalValue.scale() <= scale;
+    }
+    
+    /**
+     * 加入
+     *
+     * @param arrays     阵 列
+     * @param delimiters 分隔符
+     * @return {@link String }
+     */
+    public static String join(String[] arrays, String delimiters) {
+        if (arrays == null) {
+            return "";
+        } else if (arrays.length == 1) {
+            return arrays[0];
+        } else {
+            int length = arrays.length;
+            StringBuilder buffer = new StringBuilder(arrays[0]);
+            
+            for (int i = 1; i < length; ++i) {
+                buffer.append(delimiters).append(arrays[i]);
+            }
+            
+            return buffer.toString();
+        }
+    }
+    
+    /**
+     * 加入
+     *
+     * @param arrays     阵 列
+     * @param delimiters 分隔符
+     * @return {@link String }
+     */
+    public static String join(Collection<String> arrays, String delimiters) {
+        if (arrays == null) {
+            return "";
+        } else if (arrays.size() == 1) {
+            return arrays.iterator().next();
+        } else {
+            Iterator<String> iterator = arrays.iterator();
+            StringBuilder buffer = new StringBuilder(iterator.next());
+            
+            while (iterator.hasNext()) {
+                buffer.append(delimiters).append(iterator.next());
+            }
+            
+            return buffer.toString();
+        }
+    }
+    
+    /**
+     * 设置正常日期格式
+     *
+     * @param date 日期
+     * @return {@link String }
+     */
+    public static String formatNormalDate(Date date) {
+        return isEmpty(date) ? "null" : (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(date);
+    }
+    
+    /**
+     * 等于
+     *
+     * @param input1 输入1
+     * @param input2 输入2
+     * @return boolean
+     */
+    public static boolean equals(String input1, String input2) {
+        if (input1 == input2) {
+            return true;
+        } else {
+            boolean hasLength1 = hasLength(input1);
+            boolean hasLength2 = hasLength(input2);
+            if (!hasLength1 && !hasLength2) {
+                return true;
+            } else {
+                return (hasLength1 && hasLength2) && input1.equals(input2);
+            }
+        }
+    }
+    
+    /**
+     * 等于忽略大小写
+     *
+     * @param input1 输入1
+     * @param input2 输入2
+     * @return boolean
+     */
+    public static boolean equalsIgnoreCase(String input1, String input2) {
+        if (input1 == input2) {
+            return true;
+        } else {
+            boolean hasLength1 = hasLength(input1);
+            boolean hasLength2 = hasLength(input2);
+            if (!hasLength1 && !hasLength2) {
+                return true;
+            } else {
+                return (hasLength1 && hasLength2) && input1.equalsIgnoreCase(input2);
+            }
+        }
+    }
+    
+    /**
+     * 为空
+     *
+     * @param input 输入
+     * @return boolean
+     */
+    public static boolean isEmpty(String input) {
+        return input == null || input.trim().length() == 0;
+    }
+    
+    /**
+     * 不为空
+     *
+     * @param input 输入
+     * @return boolean
+     */
+    public static boolean isNotEmpty(String input) {
+        return !isEmpty(input);
+    }
+    
+    /**
+     * 安全配平
+     *
+     * @param text 发短信
+     * @return {@link String }
+     */
+    public static String safeTrim(String text) {
+        return text == null ? null : text.trim();
+    }
+    
+    /**
+     * safe to string
+     *
+     * @param input 输入
+     * @return {@link String }
+     */
+    public static String safeToString(Object input) {
+        return input == null ? null : input.toString();
+    }
+    
+    /**
+     * 默认值
+     *
+     * @param text         发短信
+     * @param defaultValue 默认值
+     * @return {@link String }
+     */
+    public static String defaultValue(String text, String defaultValue) {
+        text = safeTrim(text);
+        return isNotEmpty(text) ? text : defaultValue;
+    }
+    
+    /**
+     * 默认值
+     *
+     * @param text         发短信
+     * @param defaultValue 默认值
+     * @return int
+     */
+    public static int defaultValue(String text, int defaultValue) {
+        text = safeTrim(text);
+        if (isNotEmpty(text)) {
+            try {
+                return Integer.parseInt(text);
+            } catch (NumberFormatException var3) {
+            }
+        }
+        
+        return defaultValue;
+    }
+    
+    /**
+     * 默认值
+     *
+     * @param text         发短信
+     * @param defaultValue 默认值
+     * @return boolean
+     */
+    public static boolean defaultValue(String text, boolean defaultValue) {
+        text = safeTrim(text);
+        return !isNotEmpty(text) || !Boolean.TRUE.toString().equalsIgnoreCase(text) && !Boolean.FALSE.toString().equalsIgnoreCase(text) ? defaultValue : Boolean.parseBoolean(text);
+    }
+    
+    /**
+     * 包含
+     *
+     * @param values 值
+     * @param value  价值
+     * @return boolean
+     */
+    public static boolean isContains(String[] values, String value) {
+        if (value != null && value.length() > 0 && values != null && values.length > 0) {
+            String[] var2 = values;
+            int var3 = values.length;
+            
+            for (int var4 = 0; var4 < var3; ++var4) {
+                String v = var2[var4];
+                if (value.equals(v)) {
+                    return true;
+                }
+            }
+        }
+        
+        return false;
+    }
+    
+    /**
+     * native2 ASCII
+     *
+     * @param str str
+     * @return {@link String }
+     */
+    public static String native2Ascii(String str) {
+        char[] charArray = str.toCharArray();
+        StringBuffer sb = new StringBuffer();
+        char[] var3 = charArray;
+        int var4 = charArray.length;
+        
+        for (int var5 = 0; var5 < var4; ++var5) {
+            char c = var3[var5];
+            sb.append(char2Ascii(c));
+        }
+        
+        return sb.toString();
+    }
+    
+    /**
+     * char2 ascii
+     *
+     * @param c c
+     * @return {@link String }
+     */
+    public static String char2Ascii(char c) {
+        if (c > 255) {
+            StringBuffer sb = new StringBuffer();
+            sb.append("\\u");
+            int code = c >> 8;
+            String tmp = Integer.toHexString(code);
+            if (tmp.length() == 1) {
+                sb.append("0");
+            }
+            
+            sb.append(tmp);
+            code = c & 255;
+            tmp = Integer.toHexString(code);
+            if (tmp.length() == 1) {
+                sb.append("0");
+            }
+            
+            sb.append(tmp);
+            return sb.toString();
+        } else {
+            return Character.toString(c);
+        }
+    }
+    
+    /**
+     * ACSII2 天然
+     *
+     * @param str str
+     * @return {@link String }
+     */
+    public static String acsii2Native(String str) {
+        StringBuffer sb = new StringBuffer();
+        int begin = 0;
+        
+        for (int index = str.indexOf("\\u"); index != -1; index = str.indexOf("\\u", begin)) {
+            sb.append(str, begin, index);
+            sb.append(ascii2Char(str.substring(index, index + 6)));
+            begin = index + 6;
+        }
+        
+        sb.append(str.substring(begin));
+        return sb.toString();
+    }
+    
+    /**
+     * ASCII 2 字符
+     *
+     * @param str str
+     * @return char
+     */
+    private static char ascii2Char(String str) {
+        if (str.length() != 6) {
+            throw new IllegalArgumentException("Ascii string of a native character must be 6 character.");
+        } else if (!"\\u".equals(str.substring(0, 2))) {
+            throw new IllegalArgumentException("Ascii string of a native character must start with \"\\u\".");
+        } else {
+            String tmp = str.substring(2, 4);
+            int code = Integer.parseInt(tmp, 16) << 8;
+            tmp = str.substring(4, 6);
+            code += Integer.parseInt(tmp, 16);
+            return (char) code;
+        }
+    }
+    
+    
+}

+ 93 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/CodegenTempleController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegentemple;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTemplePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTempleRespVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTempleSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.codegentemple.CodegenTempleDO;
+import cn.iocoder.yudao.module.infra.service.codegentemple.CodegenTempleService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 代码生成表定义")
+@RestController
+@RequestMapping("/infra/codegen-temple")
+@Validated
+public class CodegenTempleController {
+    
+    @Resource
+    private CodegenTempleService codegenTempleService;
+    
+    @PostMapping("/create")
+    @Operation(summary = "创建代码生成表定义")
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:create')")
+    public CommonResult<Long> createCodegenTemple(@Valid @RequestBody CodegenTempleSaveReqVO createReqVO) {
+        return success(codegenTempleService.createCodegenTemple(createReqVO));
+    }
+    
+    @PutMapping("/update")
+    @Operation(summary = "更新代码生成表定义")
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:update')")
+    public CommonResult<Boolean> updateCodegenTemple(@Valid @RequestBody CodegenTempleSaveReqVO updateReqVO) {
+        codegenTempleService.updateCodegenTemple(updateReqVO);
+        return success(true);
+    }
+    
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除代码生成表定义")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:delete')")
+    public CommonResult<Boolean> deleteCodegenTemple(@RequestParam("id") Long id) {
+        codegenTempleService.deleteCodegenTemple(id);
+        return success(true);
+    }
+    
+    @GetMapping("/get")
+    @Operation(summary = "获得代码生成表定义")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:query')")
+    public CommonResult<CodegenTempleRespVO> getCodegenTemple(@RequestParam("id") Long id) {
+        CodegenTempleDO codegenTemple = codegenTempleService.getCodegenTemple(id);
+        return success(BeanUtils.toBean(codegenTemple, CodegenTempleRespVO.class));
+    }
+    
+    @GetMapping("/page")
+    @Operation(summary = "获得代码生成表定义分页")
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:query')")
+    public CommonResult<PageResult<CodegenTempleRespVO>> getCodegenTemplePage(@Valid CodegenTemplePageReqVO pageReqVO) {
+        PageResult<CodegenTempleDO> pageResult = codegenTempleService.getCodegenTemplePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, CodegenTempleRespVO.class));
+    }
+    
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出代码生成表定义 Excel")
+    @PreAuthorize("@ss.hasPermission('infra:codegen-temple:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportCodegenTempleExcel(@Valid CodegenTemplePageReqVO pageReqVO,
+                                         HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<CodegenTempleDO> list = codegenTempleService.getCodegenTemplePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "代码生成表定义.xls", "数据", CodegenTempleRespVO.class,
+                BeanUtils.toBean(list, CodegenTempleRespVO.class));
+    }
+    
+}

+ 42 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTemplePageReqVO.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo;
+
+import cn.iocoder.yudao.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 cn.iocoder.yudao.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 CodegenTemplePageReqVO extends PageParam {
+    
+    @Schema(description = "生成场景")
+    private Integer scene;
+    
+    @Schema(description = "表名称", example = "王五")
+    private String templeName;
+    
+    @Schema(description = "表描述")
+    private String templeComment;
+    
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+    
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+    
+    @Schema(description = "文件名称", example = "芋艿")
+    private String fileName;
+    
+    @Schema(description = "目标包路径")
+    private String targetPackage;
+    
+}

+ 50 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTempleRespVO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 代码生成表定义 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class CodegenTempleRespVO {
+    
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "753")
+    @ExcelProperty("编号")
+    private Long id;
+    
+    @Schema(description = "生成场景", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty(value = "生成场景", converter = DictConvert.class)
+    @DictFormat("infra_codegen_scene") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+    private Integer scene;
+    
+    @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty("表名称")
+    private String templeName;
+    
+    @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("表描述")
+    private String templeComment;
+    
+    @Schema(description = "备注", example = "你猜")
+    @ExcelProperty("备注")
+    private String remark;
+    
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+    
+    @Schema(description = "文件名称", example = "芋艿")
+    @ExcelProperty("文件名称")
+    private String fileName;
+    
+    @Schema(description = "目标包路径")
+    @ExcelProperty("目标包路径")
+    private String targetPackage;
+    
+}

+ 36 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/codegentemple/vo/CodegenTempleSaveReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 代码生成表定义新增/修改 Request VO")
+@Data
+public class CodegenTempleSaveReqVO {
+    
+    @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "753")
+    private Long id;
+    
+    @Schema(description = "生成场景", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "生成场景不能为空")
+    private Integer scene;
+    
+    @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @NotEmpty(message = "表名称不能为空")
+    private String templeName;
+    
+    @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "表描述不能为空")
+    private String templeComment;
+    
+    @Schema(description = "备注", example = "你猜")
+    private String remark;
+    
+    @Schema(description = "文件名称", example = "芋艿")
+    private String fileName;
+    
+    @Schema(description = "目标包路径")
+    private String targetPackage;
+    
+}

+ 56 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/codegentemple/CodegenTempleDO.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.infra.dal.dataobject.codegentemple;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 代码生成表定义 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("infra_codegen_temple")
+@KeySequence("infra_codegen_temple_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CodegenTempleDO extends BaseDO {
+    
+    /**
+     * 编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 生成场景
+     * <p>
+     * 枚举 {@link TODO infra_codegen_scene 对应的类}
+     */
+    private Integer scene;
+    /**
+     * 表名称
+     */
+    private String templeName;
+    /**
+     * 表描述
+     */
+    private String templeComment;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 文件名称
+     */
+    private String fileName;
+    /**
+     * 目标包路径
+     */
+    private String targetPackage;
+    
+}

+ 30 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/codegentemple/CodegenTempleMapper.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.infra.dal.mysql.codegentemple;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTemplePageReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.codegentemple.CodegenTempleDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 代码生成表定义 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface CodegenTempleMapper extends BaseMapperX<CodegenTempleDO> {
+    
+    default PageResult<CodegenTempleDO> selectPage(CodegenTemplePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<CodegenTempleDO>()
+                .eqIfPresent(CodegenTempleDO::getScene, reqVO.getScene())
+                .likeIfPresent(CodegenTempleDO::getTempleName, reqVO.getTempleName())
+                .eqIfPresent(CodegenTempleDO::getTempleComment, reqVO.getTempleComment())
+                .eqIfPresent(CodegenTempleDO::getRemark, reqVO.getRemark())
+                .betweenIfPresent(CodegenTempleDO::getCreateTime, reqVO.getCreateTime())
+                .likeIfPresent(CodegenTempleDO::getFileName, reqVO.getFileName())
+                .eqIfPresent(CodegenTempleDO::getTargetPackage, reqVO.getTargetPackage())
+                .orderByDesc(CodegenTempleDO::getId));
+    }
+    
+}

+ 15 - 11
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenBuilder.java

@@ -29,7 +29,15 @@ import static cn.hutool.core.util.RandomUtil.randomInt;
  */
 @Component
 public class CodegenBuilder {
-
+    
+    /**
+     * 多租户编号的字段名
+     */
+    public static final String TENANT_ID_FIELD = "tenantId";
+    /**
+     * {@link cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO} 的字段
+     */
+    public static final Set<String> BASE_DO_FIELDS = new HashSet<>();
     /**
      * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射
      * 注意,字段的匹配以后缀的方式
@@ -40,7 +48,6 @@ public class CodegenBuilder {
                     .put("time", CodegenColumnListConditionEnum.BETWEEN)
                     .put("date", CodegenColumnListConditionEnum.BETWEEN)
                     .build();
-
     /**
      * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射
      * 注意,字段的匹配以后缀的方式
@@ -58,15 +65,6 @@ public class CodegenBuilder {
                     .put("time", CodegenColumnHtmlTypeEnum.DATETIME)
                     .put("date", CodegenColumnHtmlTypeEnum.DATETIME)
                     .build();
-
-    /**
-     * 多租户编号的字段名
-     */
-    public static final String TENANT_ID_FIELD = "tenantId";
-    /**
-     * {@link cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO} 的字段
-     */
-    public static final Set<String> BASE_DO_FIELDS = new HashSet<>();
     /**
      * 新增操作,不需要传递的字段
      */
@@ -132,6 +130,12 @@ public class CodegenBuilder {
             if (Byte.class.getSimpleName().equals(column.getJavaType())) {
                 column.setJavaType(Integer.class.getSimpleName());
             }
+            //特殊处理注释如果 #则 #之后的为数据字典
+            if (column.getColumnComment().contains("#")) {
+                column.setDictType(subAfter(column.getColumnComment(), "#", false));
+                column.setHtmlType(CodegenColumnHtmlTypeEnum.SELECT.getType());
+                column.setColumnComment(subBefore(column.getColumnComment(), "#", false));
+            }
             // 初始化 Column 列的默认字段
             processColumnOperation(column); // 处理 CRUD 相关的字段的默认值
             processColumnUI(column); // 处理 UI 相关的字段的默认值

+ 54 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegentemple/CodegenTempleService.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.infra.service.codegentemple;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTemplePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTempleSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.codegentemple.CodegenTempleDO;
+import jakarta.validation.Valid;
+
+/**
+ * 代码生成表定义 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface CodegenTempleService {
+    
+    /**
+     * 创建代码生成表定义
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createCodegenTemple(@Valid CodegenTempleSaveReqVO createReqVO);
+    
+    /**
+     * 更新代码生成表定义
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateCodegenTemple(@Valid CodegenTempleSaveReqVO updateReqVO);
+    
+    /**
+     * 删除代码生成表定义
+     *
+     * @param id 编号
+     */
+    void deleteCodegenTemple(Long id);
+    
+    /**
+     * 获得代码生成表定义
+     *
+     * @param id 编号
+     * @return 代码生成表定义
+     */
+    CodegenTempleDO getCodegenTemple(Long id);
+    
+    /**
+     * 获得代码生成表定义分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 代码生成表定义分页
+     */
+    PageResult<CodegenTempleDO> getCodegenTemplePage(CodegenTemplePageReqVO pageReqVO);
+    
+}

+ 69 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegentemple/CodegenTempleServiceImpl.java

@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.infra.service.codegentemple;
+
+import cn.iocoder.yudao.framework.common.exception.BaseErrorCodeConstants;
+import cn.iocoder.yudao.framework.common.exception.util.CommonValidationUtils;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTemplePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.codegentemple.vo.CodegenTempleSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.codegentemple.CodegenTempleDO;
+import cn.iocoder.yudao.module.infra.dal.mysql.codegentemple.CodegenTempleMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 代码生成表定义 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class CodegenTempleServiceImpl implements CodegenTempleService {
+    
+    @Resource
+    private CodegenTempleMapper codegenTempleMapper;
+    
+    @Override
+    public Long createCodegenTemple(CodegenTempleSaveReqVO createReqVO) {
+        // 插入
+        CodegenTempleDO codegenTemple = BeanUtils.toBean(createReqVO, CodegenTempleDO.class);
+        codegenTempleMapper.insert(codegenTemple);
+        // 返回
+        return codegenTemple.getId();
+    }
+    
+    @Override
+    public void updateCodegenTemple(CodegenTempleSaveReqVO updateReqVO) {
+        // 校验存在
+        validateCodegenTempleExists(updateReqVO.getId());
+        // 更新
+        CodegenTempleDO updateObj = BeanUtils.toBean(updateReqVO, CodegenTempleDO.class);
+        codegenTempleMapper.updateById(updateObj);
+    }
+    
+    @Override
+    public void deleteCodegenTemple(Long id) {
+        // 校验存在
+        validateCodegenTempleExists(id);
+        // 删除
+        codegenTempleMapper.deleteById(id);
+    }
+    
+    private void validateCodegenTempleExists(Long id) {
+        if (codegenTempleMapper.selectById(id) == null) {
+            CommonValidationUtils.fail(BaseErrorCodeConstants.BASIC_NOT_EXISTS, "模板");
+        }
+    }
+    
+    @Override
+    public CodegenTempleDO getCodegenTemple(Long id) {
+        return codegenTempleMapper.selectById(id);
+    }
+    
+    @Override
+    public PageResult<CodegenTempleDO> getCodegenTemplePage(CodegenTemplePageReqVO pageReqVO) {
+        return codegenTempleMapper.selectPage(pageReqVO);
+    }
+    
+}

+ 12 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/resources/mapper/codegentemple/CodegenTempleMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.infra.dal.mysql.codegentemple.CodegenTempleMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 93 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/UserInfoAiController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoAiDO;
+import cn.iocoder.yudao.module.member.service.userinfoai.UserInfoAiService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 用户信息")
+@RestController
+@RequestMapping("/member/user-info-ai")
+@Validated
+public class UserInfoAiController {
+    
+    @Resource
+    private UserInfoAiService userInfoAiService;
+    
+    @PostMapping("/create")
+    @Operation(summary = "创建用户信息")
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:create')")
+    public CommonResult<Long> createUserInfoAi(@Valid @RequestBody UserInfoAiSaveReqVO createReqVO) {
+        return success(userInfoAiService.createUserInfoAi(createReqVO));
+    }
+    
+    @PutMapping("/update")
+    @Operation(summary = "更新用户信息")
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:update')")
+    public CommonResult<Boolean> updateUserInfoAi(@Valid @RequestBody UserInfoAiSaveReqVO updateReqVO) {
+        userInfoAiService.updateUserInfoAi(updateReqVO);
+        return success(true);
+    }
+    
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:delete')")
+    public CommonResult<Boolean> deleteUserInfoAi(@RequestParam("id") Long id) {
+        userInfoAiService.deleteUserInfoAi(id);
+        return success(true);
+    }
+    
+    @GetMapping("/get")
+    @Operation(summary = "获得用户信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:query')")
+    public CommonResult<UserInfoAiRespVO> getUserInfoAi(@RequestParam("id") Long id) {
+        UserInfoAiDO userInfoAi = userInfoAiService.getUserInfoAi(id);
+        return success(BeanUtils.toBean(userInfoAi, UserInfoAiRespVO.class));
+    }
+    
+    @GetMapping("/page")
+    @Operation(summary = "获得用户信息分页")
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:query')")
+    public CommonResult<PageResult<UserInfoAiRespVO>> getUserInfoAiPage(@Valid UserInfoAiPageReqVO pageReqVO) {
+        PageResult<UserInfoAiDO> pageResult = userInfoAiService.getUserInfoAiPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserInfoAiRespVO.class));
+    }
+    
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户信息 Excel")
+    @PreAuthorize("@ss.hasPermission('member:user-info-ai:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserInfoAiExcel(@Valid UserInfoAiPageReqVO pageReqVO,
+                                      HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserInfoAiDO> list = userInfoAiService.getUserInfoAiPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户信息.xls", "数据", UserInfoAiRespVO.class,
+                BeanUtils.toBean(list, UserInfoAiRespVO.class));
+    }
+    
+}

+ 93 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/UserInfoFilesController.java

@@ -0,0 +1,93 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai;
+
+import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoFilesDO;
+import cn.iocoder.yudao.module.member.service.userinfoai.UserInfoFilesService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.io.IOException;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 用户信息-文件")
+@RestController
+@RequestMapping("/member/user-info-files")
+@Validated
+public class UserInfoFilesController {
+    
+    @Resource
+    private UserInfoFilesService userInfoFilesService;
+    
+    @PostMapping("/create")
+    @Operation(summary = "创建用户信息-文件")
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:create')")
+    public CommonResult<Long> createUserInfoFiles(@Valid @RequestBody UserInfoFilesSaveReqVO createReqVO) {
+        return success(userInfoFilesService.createUserInfoFiles(createReqVO));
+    }
+    
+    @PutMapping("/update")
+    @Operation(summary = "更新用户信息-文件")
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:update')")
+    public CommonResult<Boolean> updateUserInfoFiles(@Valid @RequestBody UserInfoFilesSaveReqVO updateReqVO) {
+        userInfoFilesService.updateUserInfoFiles(updateReqVO);
+        return success(true);
+    }
+    
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除用户信息-文件")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:delete')")
+    public CommonResult<Boolean> deleteUserInfoFiles(@RequestParam("id") Long id) {
+        userInfoFilesService.deleteUserInfoFiles(id);
+        return success(true);
+    }
+    
+    @GetMapping("/get")
+    @Operation(summary = "获得用户信息-文件")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:query')")
+    public CommonResult<UserInfoFilesRespVO> getUserInfoFiles(@RequestParam("id") Long id) {
+        UserInfoFilesDO userInfoFiles = userInfoFilesService.getUserInfoFiles(id);
+        return success(BeanUtils.toBean(userInfoFiles, UserInfoFilesRespVO.class));
+    }
+    
+    @GetMapping("/page")
+    @Operation(summary = "获得用户信息-文件分页")
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:query')")
+    public CommonResult<PageResult<UserInfoFilesRespVO>> getUserInfoFilesPage(@Valid UserInfoFilesPageReqVO pageReqVO) {
+        PageResult<UserInfoFilesDO> pageResult = userInfoFilesService.getUserInfoFilesPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, UserInfoFilesRespVO.class));
+    }
+    
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出用户信息-文件 Excel")
+    @PreAuthorize("@ss.hasPermission('member:user-info-files:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportUserInfoFilesExcel(@Valid UserInfoFilesPageReqVO pageReqVO,
+                                         HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<UserInfoFilesDO> list = userInfoFilesService.getUserInfoFilesPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "用户信息-文件.xls", "数据", UserInfoFilesRespVO.class,
+                BeanUtils.toBean(list, UserInfoFilesRespVO.class));
+    }
+    
+}

+ 36 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import cn.iocoder.yudao.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 cn.iocoder.yudao.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 UserInfoAiPageReqVO extends PageParam {
+    
+    @Schema(description = "用户编号", example = "25439")
+    private Long userId;
+    
+    @Schema(description = "提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+    
+    @Schema(description = "材料类型", example = "1")
+    private String informationType;
+    
+    @Schema(description = "是否选中#info_status", example = "1")
+    private String infoStatus;
+    
+}

+ 39 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiRespVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserInfoAiRespVO {
+    
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15743")
+    @ExcelProperty("自增主键")
+    private Long id;
+    
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25439")
+    @ExcelProperty("用户编号")
+    private Long userId;
+    
+    @Schema(description = "提取有效信息")
+    @ExcelProperty("提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+    
+    @Schema(description = "材料类型", example = "1")
+    @ExcelProperty("材料类型")
+    private String informationType;
+    
+    @Schema(description = "是否选中#info_status", example = "1")
+    @ExcelProperty("是否选中#info_status")
+    private String infoStatus;
+    
+}

+ 27 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoAiSaveReqVO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 用户信息新增/修改 Request VO")
+@Data
+public class UserInfoAiSaveReqVO {
+    
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15743")
+    private Long id;
+    
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25439")
+    @NotNull(message = "用户编号不能为空")
+    private Long userId;
+    
+    @Schema(description = "提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "材料类型", example = "1")
+    private String informationType;
+    
+    @Schema(description = "是否选中#info_status", example = "1")
+    private String infoStatus;
+    
+}

+ 36 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import cn.iocoder.yudao.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 cn.iocoder.yudao.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 UserInfoFilesPageReqVO extends PageParam {
+    
+    @Schema(description = "用户编号", example = "31953")
+    private Long infoAiId;
+    
+    @Schema(description = "提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+    
+    @Schema(description = "材料类型", example = "1")
+    private String informationType;
+    
+    @Schema(description = "是否选中", example = "2")
+    private String fileStatus;
+    
+}

+ 42 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesRespVO.java

@@ -0,0 +1,42 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
+import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户信息-文件 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class UserInfoFilesRespVO {
+    
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24073")
+    @ExcelProperty("自增主键")
+    private Long id;
+    
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31953")
+    @ExcelProperty("用户编号")
+    private Long infoAiId;
+    
+    @Schema(description = "提取有效信息")
+    @ExcelProperty("提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+    
+    @Schema(description = "材料类型", example = "1")
+    @ExcelProperty("材料类型")
+    private String informationType;
+    
+    @Schema(description = "是否选中", example = "2")
+    @ExcelProperty(value = "是否选中", converter = DictConvert.class)
+    @DictFormat("file_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+    private String fileStatus;
+    
+}

+ 27 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/userinfoai/vo/UserInfoFilesSaveReqVO.java

@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 用户信息-文件新增/修改 Request VO")
+@Data
+public class UserInfoFilesSaveReqVO {
+    
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24073")
+    private Long id;
+    
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31953")
+    @NotNull(message = "用户编号不能为空")
+    private Long infoAiId;
+    
+    @Schema(description = "提取有效信息")
+    private String textInformation;
+    
+    @Schema(description = "材料类型", example = "1")
+    private String informationType;
+    
+    @Schema(description = "是否选中", example = "2")
+    private String fileStatus;
+    
+}

+ 46 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/userinfoai/UserInfoAiDO.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.userinfoai;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 用户信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("member_user_info_ai")
+@KeySequence("member_user_info_ai_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserInfoAiDO extends BaseDO {
+    
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户编号
+     */
+    private Long userId;
+    /**
+     * 提取有效信息
+     */
+    private String textInformation;
+    /**
+     * 材料类型
+     */
+    private String informationType;
+    /**
+     * 是否选中#info_status
+     */
+    private String infoStatus;
+    
+}

+ 48 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/userinfoai/UserInfoFilesDO.java

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.userinfoai;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 用户信息-文件 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("member_user_info_files")
+@KeySequence("member_user_info_files_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserInfoFilesDO extends BaseDO {
+    
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户编号
+     */
+    private Long infoAiId;
+    /**
+     * 提取有效信息
+     */
+    private String textInformation;
+    /**
+     * 材料类型
+     */
+    private String informationType;
+    /**
+     * 是否选中
+     * <p>
+     * 枚举 {@link TODO file_status 对应的类}
+     */
+    private String fileStatus;
+    
+}

+ 28 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/userinfoai/UserInfoAiMapper.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.member.dal.mysql.userinfoai;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiPageReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoAiDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface UserInfoAiMapper extends BaseMapperX<UserInfoAiDO> {
+    
+    default PageResult<UserInfoAiDO> selectPage(UserInfoAiPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserInfoAiDO>()
+                .eqIfPresent(UserInfoAiDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(UserInfoAiDO::getTextInformation, reqVO.getTextInformation())
+                .betweenIfPresent(UserInfoAiDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(UserInfoAiDO::getInformationType, reqVO.getInformationType())
+                .eqIfPresent(UserInfoAiDO::getInfoStatus, reqVO.getInfoStatus())
+                .orderByDesc(UserInfoAiDO::getId));
+    }
+    
+}

+ 28 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/userinfoai/UserInfoFilesMapper.java

@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.member.dal.mysql.userinfoai;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesPageReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoFilesDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户信息-文件 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface UserInfoFilesMapper extends BaseMapperX<UserInfoFilesDO> {
+    
+    default PageResult<UserInfoFilesDO> selectPage(UserInfoFilesPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<UserInfoFilesDO>()
+                .eqIfPresent(UserInfoFilesDO::getInfoAiId, reqVO.getInfoAiId())
+                .eqIfPresent(UserInfoFilesDO::getTextInformation, reqVO.getTextInformation())
+                .betweenIfPresent(UserInfoFilesDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(UserInfoFilesDO::getInformationType, reqVO.getInformationType())
+                .eqIfPresent(UserInfoFilesDO::getFileStatus, reqVO.getFileStatus())
+                .orderByDesc(UserInfoFilesDO::getId));
+    }
+    
+}

+ 54 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoAiService.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.member.service.userinfoai;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoAiDO;
+import jakarta.validation.Valid;
+
+/**
+ * 用户信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface UserInfoAiService {
+    
+    /**
+     * 创建用户信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserInfoAi(@Valid UserInfoAiSaveReqVO createReqVO);
+    
+    /**
+     * 更新用户信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserInfoAi(@Valid UserInfoAiSaveReqVO updateReqVO);
+    
+    /**
+     * 删除用户信息
+     *
+     * @param id 编号
+     */
+    void deleteUserInfoAi(Long id);
+    
+    /**
+     * 获得用户信息
+     *
+     * @param id 编号
+     * @return 用户信息
+     */
+    UserInfoAiDO getUserInfoAi(Long id);
+    
+    /**
+     * 获得用户信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户信息分页
+     */
+    PageResult<UserInfoAiDO> getUserInfoAiPage(UserInfoAiPageReqVO pageReqVO);
+    
+}

+ 69 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoAiServiceImpl.java

@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.member.service.userinfoai;
+
+import cn.iocoder.yudao.framework.common.exception.BaseErrorCodeConstants;
+import cn.iocoder.yudao.framework.common.exception.util.CommonValidationUtils;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoAiSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoAiDO;
+import cn.iocoder.yudao.module.member.dal.mysql.userinfoai.UserInfoAiMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 用户信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class UserInfoAiServiceImpl implements UserInfoAiService {
+    
+    @Resource
+    private UserInfoAiMapper userInfoAiMapper;
+    
+    @Override
+    public Long createUserInfoAi(UserInfoAiSaveReqVO createReqVO) {
+        // 插入
+        UserInfoAiDO userInfoAi = BeanUtils.toBean(createReqVO, UserInfoAiDO.class);
+        userInfoAiMapper.insert(userInfoAi);
+        // 返回
+        return userInfoAi.getId();
+    }
+    
+    @Override
+    public void updateUserInfoAi(UserInfoAiSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserInfoAiExists(updateReqVO.getId());
+        // 更新
+        UserInfoAiDO updateObj = BeanUtils.toBean(updateReqVO, UserInfoAiDO.class);
+        userInfoAiMapper.updateById(updateObj);
+    }
+    
+    @Override
+    public void deleteUserInfoAi(Long id) {
+        // 校验存在
+        validateUserInfoAiExists(id);
+        // 删除
+        userInfoAiMapper.deleteById(id);
+    }
+    
+    private void validateUserInfoAiExists(Long id) {
+        if (userInfoAiMapper.selectById(id) == null) {
+            CommonValidationUtils.fail(BaseErrorCodeConstants.BASIC_NOT_EXISTS, "文件");
+        }
+    }
+    
+    @Override
+    public UserInfoAiDO getUserInfoAi(Long id) {
+        return userInfoAiMapper.selectById(id);
+    }
+    
+    @Override
+    public PageResult<UserInfoAiDO> getUserInfoAiPage(UserInfoAiPageReqVO pageReqVO) {
+        return userInfoAiMapper.selectPage(pageReqVO);
+    }
+    
+}

+ 54 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoFilesService.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.member.service.userinfoai;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoFilesDO;
+import jakarta.validation.Valid;
+
+/**
+ * 用户信息-文件 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface UserInfoFilesService {
+    
+    /**
+     * 创建用户信息-文件
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createUserInfoFiles(@Valid UserInfoFilesSaveReqVO createReqVO);
+    
+    /**
+     * 更新用户信息-文件
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateUserInfoFiles(@Valid UserInfoFilesSaveReqVO updateReqVO);
+    
+    /**
+     * 删除用户信息-文件
+     *
+     * @param id 编号
+     */
+    void deleteUserInfoFiles(Long id);
+    
+    /**
+     * 获得用户信息-文件
+     *
+     * @param id 编号
+     * @return 用户信息-文件
+     */
+    UserInfoFilesDO getUserInfoFiles(Long id);
+    
+    /**
+     * 获得用户信息-文件分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 用户信息-文件分页
+     */
+    PageResult<UserInfoFilesDO> getUserInfoFilesPage(UserInfoFilesPageReqVO pageReqVO);
+    
+}

+ 69 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/userinfoai/UserInfoFilesServiceImpl.java

@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.member.service.userinfoai;
+
+import cn.iocoder.yudao.framework.common.exception.BaseErrorCodeConstants;
+import cn.iocoder.yudao.framework.common.exception.util.CommonValidationUtils;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.userinfoai.vo.UserInfoFilesSaveReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.userinfoai.UserInfoFilesDO;
+import cn.iocoder.yudao.module.member.dal.mysql.userinfoai.UserInfoFilesMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * 用户信息-文件 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class UserInfoFilesServiceImpl implements UserInfoFilesService {
+    
+    @Resource
+    private UserInfoFilesMapper userInfoFilesMapper;
+    
+    @Override
+    public Long createUserInfoFiles(UserInfoFilesSaveReqVO createReqVO) {
+        // 插入
+        UserInfoFilesDO userInfoFiles = BeanUtils.toBean(createReqVO, UserInfoFilesDO.class);
+        userInfoFilesMapper.insert(userInfoFiles);
+        // 返回
+        return userInfoFiles.getId();
+    }
+    
+    @Override
+    public void updateUserInfoFiles(UserInfoFilesSaveReqVO updateReqVO) {
+        // 校验存在
+        validateUserInfoFilesExists(updateReqVO.getId());
+        // 更新
+        UserInfoFilesDO updateObj = BeanUtils.toBean(updateReqVO, UserInfoFilesDO.class);
+        userInfoFilesMapper.updateById(updateObj);
+    }
+    
+    @Override
+    public void deleteUserInfoFiles(Long id) {
+        // 校验存在
+        validateUserInfoFilesExists(id);
+        // 删除
+        userInfoFilesMapper.deleteById(id);
+    }
+    
+    private void validateUserInfoFilesExists(Long id) {
+        if (userInfoFilesMapper.selectById(id) == null) {
+            CommonValidationUtils.fail(BaseErrorCodeConstants.BASIC_NOT_EXISTS, "用户信息");
+        }
+    }
+    
+    @Override
+    public UserInfoFilesDO getUserInfoFiles(Long id) {
+        return userInfoFilesMapper.selectById(id);
+    }
+    
+    @Override
+    public PageResult<UserInfoFilesDO> getUserInfoFilesPage(UserInfoFilesPageReqVO pageReqVO) {
+        return userInfoFilesMapper.selectPage(pageReqVO);
+    }
+    
+}

+ 12 - 0
yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/userinfoai/UserInfoAiMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.member.dal.mysql.userinfoai.UserInfoAiMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

+ 12 - 0
yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/userinfoai/UserInfoFilesMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.member.dal.mysql.userinfoai.UserInfoFilesMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>