微服务版后端初始化

This commit is contained in:
yaoyn
2025-02-08 17:51:37 +08:00
parent 54af6be188
commit da009a7cc4
1897 changed files with 429541 additions and 81 deletions

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xjrsoft-service-api</artifactId>
<groupId>com.xjrsoft</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>xjrsoft-service-generate-api</artifactId>
<properties>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<dependencies>
<!--引入hutool依赖-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--引入Lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.xjrsoft</groupId>
<artifactId>xjrsoft-common-generate</artifactId>
<version>${xjrsoft.framework.version}</version>
</dependency>
<dependency>
<groupId>com.xjrsoft</groupId>
<artifactId>xjrsoft-common-mybatis</artifactId>
<version>${xjrsoft.framework.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,34 @@
package com.xjrsoft.generate.client;
import com.xjrsoft.common.core.constant.GlobalConstant;
import com.xjrsoft.generate.dto.DataFirstPreviewDto;
import com.xjrsoft.generate.dto.GeneratorAppDto;
import com.xjrsoft.generate.fallback.GenerateClientFallBack;
import com.xjrsoft.generate.vo.GeneratorCodeVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @Author: tzx
* @Date: 2023/10/10 19:05
*/
@FeignClient(value = GlobalConstant.CLIENT_GENERATE_NAME,fallback = GenerateClientFallBack.class)
public interface IGenerateClient {
/**
* 生成代码
* @param dto
*/
@PostMapping(GlobalConstant.CLIENT_API_PRE + GlobalConstant.MODULE_GENERETOR_NAME + "/generateAppCodes")
void generateAppCodesFeign(@RequestBody GeneratorAppDto dto);
/**
* 生成预览代码
* @param dto
* @return
*/
@PostMapping(GlobalConstant.CLIENT_API_PRE + GlobalConstant.MODULE_GENERETOR_NAME + "/getPreviewCodesFeign")
GeneratorCodeVo getPreviewCodesFeign(@RequestParam("dto") DataFirstPreviewDto dto);
}

View File

@ -0,0 +1,165 @@
package com.xjrsoft.generate.constant;
public interface ComponentTypeConstant {
/**
* 子表单
*/
String SUB_FORM = "form";
/**
* 子表单
*/
String ONE_FOR_ONE_FORM = "one-for-one";
/**
* 选项卡
*/
String TAB = "tab";
/**
* 卡片布局
*/
String CARD = "card";
/**
* 栅格布局
*/
String GRID = "grid";
/**
* 表格布局
*/
String TABLE_LAYOUT = "table-layout";
/**
*信息体
*/
String INFO = "info";
/**
*下拉选择框
*/
String SELECT = "select";
/**
*联想下拉
*/
String ASSOCIATE_SELECT = "associate-select";
/**
*联想弹层
*/
String ASSOCIATE_POPUP = "associate-popup";
/**
*多选弹层
*/
String MULTIPLE_POPUP = "multiple-popup";
/**
*级联组件
*/
String CASCADE = "cascader";
/**
*行政区域
*/
String AREA = "area";
/**
*多选组件
*/
String CHECKBOX = "checkbox";
/**
*单选组件
*/
String RADIO = "radio";
/**
*人员选择
*/
String USER = "user";
/**
*组织架构
*/
String ORGANIZATION = "organization";
/**
*时间组件
*/
String TIME = "time";
/**
*时间范围
*/
String TIME_RANGE = "time-range";
/**
*日期
*/
String DATE = "date";
/**
*日期范围
*/
String DATE_RANGE = "date-range";
/**
* 意见簿
*/
String OPINION = "opinion";
/**
* 自动编码
*/
String AUTO_CODE = "auto-code";
/**
* 导入按钮
*/
String BUTTON_IMPORT = "import";
/**
* 导出按钮
*/
String BUTTON_EXPORT = "export";
/**
* 分隔符
*/
String SEPARATOR = "separator";
/**
* 显示格式
*/
String SHOW_FORMAT = "showFormat";
/**
* 自定编码的编码
*/
String AUTO_CODE_RULE = "autoCodeRule";
/**
* iframe组件
*/
String IFRAME = "iframe";
/**
* 文本
*/
String TEXT = "text";
/**
* 分割线
*/
String DIVIDER = "divider";
/**
* 标题
*/
String TITLE = "title";
}

View File

@ -0,0 +1,135 @@
package com.xjrsoft.generate.constant;
/**
* @title: 实体类模板引擎常量
* @Author tzx
* @Date: 2022/4/17 14:29
* @Version 1.0
*/
public interface EntityConstant {
/**
* @des 包名
* */
String PACKAGE = "package";
/**
* @des 创建人
* */
String AUTH_NAME = "author";
/**
* @des 创建时间
* */
String DATE = "date";
/**
* @des 表备注
* */
String TABLE_COMMENT = "tableComment";
/**
* @des 表名
* */
String TABLE_NAME = "tableName";
/**
* @des 实体类名
* */
String ENTITY_CLASS_NAME = "entityClass";
/**
* @des 功能类名
* */
String FUNCTION_CLASS_NAME = "className";
/**
* @des 表里面所有列
* */
String TABLE_FIELDS = "fields";
/**
* 主键名
*/
String PK_FIELD = "pkField";
/**
* 主键类型
*/
String PK_TYPE = "pkType";
/**
* @des 是否分页
* */
String IS_PAGE = "isPage";
/**
* @des 是否多表
* */
String IS_MULTI = "isMulti";
/**
* @des 默认排序类型
* */
String ORDER_TYPE = "orderType";
/**
* @des 默认排序字段
* */
String ORDER_FIELD = "orderField";
/**
* @des 子表
* */
String CHILD_TABLES = "childTables";
/**
* @des 主表主键
* */
String PARENT_TABLE_KEY = "parentKey";
/**
* @des 子表所关联的主表字段
* */
String PARENT_RELATION_FIELD_KEY = "relationTableField";
/**
* @des 输出区域
* */
String OUTPUT_AREA = "outputArea";
/**
* 导入按钮
*/
String IS_IMPORT = "isImport";
/**
* 导出按钮
*/
String IS_EXPORT = "isExport";
/**
* 导出excel必填字段标识符
*/
String REQUIRED_SUFFIX = "requiredSuffix";
/**
* 数据源id
*/
String DATASOURCE_ID = "databaseId";
/**
* 权限字段
*/
String IS_DATA_AUTH = "isDataAuth";
/**
* 自动编码值,逗号隔开
*/
String CODE_RULES = "codeRules";
}

View File

@ -0,0 +1,34 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.generate.model.FrontCode;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @Author: tzx
* @Date: 2023/9/1 17:43
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class BatchGeneratorDto extends DataFirstPreviewDto {
/**
* 代码模板id
*/
private Long id;
/**
* 前端代码
*/
private FrontCode frontCode;
/**
* 分类id
*/
private Long categoryId;
/**
* 代码模板名称
*/
private String name;
}

View File

@ -0,0 +1,44 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.generate.model.FrontCode;
import com.xjrsoft.common.generate.model.MenuConfig;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
/**
* @Author: tzx
* @Date: 2022/6/6 16:05
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CodeFirstGeneratorDto extends CodeFirstPreviewDto {
/**
* 代码模板id
*/
private Long id;
/**
* 前端代码
*/
private FrontCode frontCode;
/**
* 分类id
*/
private Long categoryId;
/**
* 代码模板名称
*/
private String name;
/**
* 菜单配置
*/
@NotNull(message = "菜单配置不能为空!")
@Valid
private MenuConfig menuConfig;
}

View File

@ -0,0 +1,70 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.core.domain.generator.FormConfig;
import com.xjrsoft.common.generate.model.ListConfig;
import com.xjrsoft.common.generate.model.OutputConfig;
import com.xjrsoft.common.generate.model.TableConfig;
import com.xjrsoft.common.generate.model.TableStructureConfig;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
/**
* @title: CodeFirstDto
* @Author tzx
* @Date: 2022/4/30 22:42
* @Version 1.0
*/
@Data
public class CodeFirstPreviewDto {
/**
* 数据库id
*/
@NotNull(message = "数据库id不能为空")
private String databaseId;
/**
* 表关联信息
*/
private List<TableConfig> tableConfigs;
/**
* 表结构配置
*/
@Valid
@NotNull(message = "表结构配置不能为空!")
private List<TableStructureConfig> tableStructureConfigs;
/**
* 表单设计json
*/
@NotNull(message = "表单设计不能为空!")
private FormConfig formJson;
/**
* 列表配置
*/
@NotNull(message = "列表配置不能为空!")
@Valid
private ListConfig listConfig;
/**
* 输出配置
*/
@NotNull(message = "输出配置不能为空!")
@Valid
private OutputConfig outputConfig;
@Schema(name = "表单事件")
private Map<String, Object> formEventConfig;
/**
* 是否配置数据权限
*/
@Schema(name = "是否数据权限")
private Boolean isDataAuth;
}

View File

@ -0,0 +1,44 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.generate.model.FrontCode;
import com.xjrsoft.common.generate.model.MenuConfig;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
/**
* 数据优先生成代码
*
* @Author: tzx
* @Date: 2022/6/2 15:45
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class DataFirstGeneratorDto extends DataFirstPreviewDto {
/**
* 代码模板id
*/
private Long id;
/**
* 前端代码
*/
private FrontCode frontCode;
/**
* 分类id
*/
private Long categoryId;
/**
* 代码模板名称
*/
private String name;
/**
* 菜单配置
*/
@NotNull(message = "菜单配置不能为空!")
@Valid
private MenuConfig menuConfig;
}

View File

@ -0,0 +1,65 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.core.domain.generator.FormConfig;
import com.xjrsoft.common.generate.model.ListConfig;
import com.xjrsoft.common.generate.model.OutputConfig;
import com.xjrsoft.common.generate.model.TableConfig;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;
/**
* @title: 预览代码
* @Author tzx
* @Date: 2022/4/12 21:08
* @Version 1.0
*/
@Data
public class DataFirstPreviewDto {
/**
* 数据库id
*/
@NotNull(message = "数据库id不能为空")
private String databaseId;
/**
* 表关联信息
*/
@NotNull(message = "表配置不能为空!")
@Valid
private List<TableConfig> tableConfigs;
/**
* 表单设计json
*/
@NotNull(message = "表单设计不能为空!")
private FormConfig formJson;
/**
* 列表配置
*/
@NotNull(message = "列表配置不能为空!")
@Valid
private ListConfig listConfig;
/**
* 输出配置
*/
@NotNull(message = "输出配置不能为空!")
@Valid
private OutputConfig outputConfig;
@Schema(name = "表单事件")
private Map<String, Object> formEventConfig;
/**
* 是否配置数据权限
*/
private Boolean isDataAuth;
}

View File

@ -0,0 +1,60 @@
package com.xjrsoft.generate.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: tzx
* @Date: 2023/7/19 17:46
*/
@Data
public class GeneratorAppDto implements Serializable {
/**
* 功能类名
*/
private String className;
/**
* 输出区域
*/
private String outputArea;
/**
* 输出区域
*/
private String outputValue;
/**
* components\system-form\index.vue 文件替换内容
*/
private String tagString;
/**
* 列表页面代码
*/
private String listCode;
/**
* 表单页面代码
*/
private String formCode;
/**
* 接口请求代码
*/
private String apiCode;
/**
* 配置json 代码
*/
private String configJsonCode;
/**
* 表单容器代码
*/
private String containerCode;
}

View File

@ -0,0 +1,16 @@
package com.xjrsoft.generate.dto;
import com.xjrsoft.common.generate.model.TableConfig;
import lombok.Data;
import java.util.List;
/**
* @Author: tzx
* @Date: 2022/5/27 9:53
*/
@Data
public class TableInfoDto {
private String databaseId;
private List<TableConfig> tableConfigs;
}

View File

@ -0,0 +1,26 @@
package com.xjrsoft.generate.fallback;
import com.xjrsoft.generate.client.IGenerateClient;
import com.xjrsoft.generate.dto.DataFirstPreviewDto;
import com.xjrsoft.generate.dto.GeneratorAppDto;
import com.xjrsoft.generate.vo.GeneratorCodeVo;
import org.springframework.stereotype.Component;
/**
* @Author: tzx
* @Date: 2023/10/10 19:06
*/
@Component
public class GenerateClientFallBack implements IGenerateClient {
@Override
public void generateAppCodesFeign(GeneratorAppDto dto) {
}
@Override
public GeneratorCodeVo getPreviewCodesFeign(DataFirstPreviewDto dto) {
return null;
}
}

View File

@ -0,0 +1,75 @@
package com.xjrsoft.generate.utils;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.annotation.DbType;
import com.xjrsoft.common.core.enums.PostgreSqlFieldsType;
import com.xjrsoft.tenant.config.TenantConfig;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: tzx
* @Date: 2022/5/5 11:54
*/
public class SqlUtil {
public static List<String> buildAddDataAuthFieldSqls(DbType dbType, String tableName) {
List<String> sqlList = new ArrayList<>();
switch (dbType) {
case MYSQL:
sqlList.add("ALTER TABLE " + tableName + " ADD rule_user_id bigint NULL COMMENT '权限所属人员id'");
break;
case SQL_SERVER:
case SQL_SERVER2005:
sqlList.add("ALTER TABLE " + tableName + " ADD rule_user_id bigint NULL");
sqlList.add("EXEC sp_addextendedproperty 'MS_Description', '权限所属人员id', 'user', 'dbo', 'table', '" + tableName + "', 'column', 'rule_user_id'");
break;
case ORACLE:
case ORACLE_12C:
case DM:
case DB2:
sqlList.add("ALTER TABLE " + tableName + " ADD rule_user_id NUMBER(20,0)");
sqlList.add("COMMENT ON COLUMN " + tableName + ".rule_user_id IS '权限所属人员id'");
break;
case POSTGRE_SQL:
case KINGBASE_ES:
case GAUSS:
sqlList.add("ALTER TABLE " + tableName + " ADD rule_user_id " + PostgreSqlFieldsType.FK.getType());
sqlList.add("COMMENT ON COLUMN " + tableName + ".rule_user_id IS '租户id'");
break;
}
return sqlList;
}
public static List<String> buildAddTenantFieldSqls(DbType dbType, String tableName) {
TenantConfig tenantConfig = SpringUtil.getBean(TenantConfig.class);
List<String> sqlList = new ArrayList<>();
String tenantField = tenantConfig.getTenantField();
switch (dbType) {
case MYSQL:
sqlList.add("ALTER TABLE " + tableName + " ADD " + tenantField + " bigint NULL COMMENT '租户id'");
break;
case SQL_SERVER:
case SQL_SERVER2005:
sqlList.add("ALTER TABLE " + tableName + " ADD " + tenantField + " bigint NULL");
sqlList.add("EXEC sp_addextendedproperty 'MS_Description', '租户id', 'user', 'dbo', 'table', '" + tableName + "', 'column', '" + tenantField + "'");
break;
case ORACLE:
case ORACLE_12C:
case DM:
case DB2:
sqlList.add("ALTER TABLE " + tableName + " ADD " + tenantField + " NUMBER(20,0)");
sqlList.add("COMMENT ON COLUMN " + tableName + "." + tenantField + " IS '租户id'");
break;
case POSTGRE_SQL:
case KINGBASE_ES:
case GAUSS:
sqlList.add("ALTER TABLE " + tableName + " ADD " + tenantField + PostgreSqlFieldsType.FK.getType());
sqlList.add("COMMENT ON COLUMN " + tableName + "." + tenantField + " IS '租户id'");
break;
}
return sqlList;
}
}

View File

@ -0,0 +1,31 @@
package com.xjrsoft.generate.vo;
import lombok.Data;
/**
* @Author: tzx
* @Date: 2022/5/27 9:43
*/
@Data
public class ColumnInfoVo {
/**
* 列名
*/
private String columnName;
/**
* 列名类型
*/
private Integer columnType;
/**
* 列长度
*/
private Long columnLength;
/**
* 是否主键
*/
private Boolean isPrimaryKey;
/**
* 是否可空
*/
private Boolean isNullable;
}

View File

@ -0,0 +1,28 @@
package com.xjrsoft.generate.vo;
import lombok.Data;
import java.util.Map;
/**
* @title: GeneratorCodeVo
* @Author tzx
* @Date: 2022/4/16 23:20
* @Version 1.0
*/
@Data
public class GeneratorCodeVo {
private Map<String, String> controllerCode;
private Map<String, String> entityCode;
private Map<String, String> dtoCode;
private Map<String, String> voCode;
private Map<String, String> serviceCode;
private Map<String, String> implCode;
private Map<String, String> mapperCode;
}

View File

@ -0,0 +1,19 @@
package com.xjrsoft.generate.vo;
import lombok.Data;
import java.util.List;
/**
* @Author: tzx
* @Date: 2022/5/27 9:42
*/
@Data
public class TableInfoVo {
private String tableName;
private String tableComment;
private List<ColumnInfoVo> columnInfos;
}