first commit

This commit is contained in:
2023-07-02 21:43:18 +08:00
parent 71125d997e
commit 6c36460d89
37 changed files with 943 additions and 111 deletions

View File

@ -52,7 +52,7 @@
<!-- easy poi -->
<easypoi.version>4.4.0</easypoi.version>
<!-- knife4接口文档 -->
<knife4j.version>4.0.0</knife4j.version>
<knife4j.version>4.1.0</knife4j.version>
<!-- spring doc -->
<springdoc.version>1.6.14</springdoc.version>
<!-- 数据校验 -->
@ -163,6 +163,11 @@
<artifactId>qiaoba-module-monitor</artifactId>
<version>${qiaoba.version}</version>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-module-generator</artifactId>
<version>${qiaoba.version}</version>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-module-demo</artifactId>

View File

@ -2,7 +2,6 @@ package com.qiaoba.api.system.service;
import com.qiaoba.api.system.entity.SysMenu;
import com.qiaoba.api.system.entity.param.SysMenuParam;
import com.qiaoba.api.system.entity.vo.SysMenuVo;
import java.util.List;

View File

@ -30,6 +30,10 @@
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-module-tenant</artifactId>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-module-generator</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -115,6 +115,9 @@ springdoc:
- group: '监控管理'
paths-to-match: '/**'
packages-to-scan: com.qiaoba.module.monitor.controller
- group: '代码生成'
paths-to-match: '/**'
packages-to-scan: com.qiaoba.module.generator.controller
# knife4j的增强配置不需要增强可以不配
knife4j:
enable: true

View File

@ -0,0 +1,26 @@
package com.qiaoba.common.base.utils;
import cn.hutool.core.util.StrUtil;
import java.util.Objects;
/**
* ArrayUtil
*
* @author ailanyin
* @version 1.0
* @since 2023/5/22 16:41
*/
public class ArrayUtil extends cn.hutool.core.util.ArrayUtil {
public static boolean containsValueIgnoreCase(CharSequence[] array, CharSequence value) {
if (Objects.nonNull(array)) {
for (CharSequence charSequence : array) {
if (StrUtil.containsIgnoreCase(value, charSequence)) {
return true;
}
}
}
return false;
}
}

View File

@ -31,7 +31,7 @@ public class MybatisPlusConfig {
/**
* 不需要拼接租户ID的表 租户表/租户数据源表
*/
private static final List<String> IGNORE_TABLES = ListUtil.toList("sys_tenant", "sys_tenant_datasource");
private static final List<String> IGNORE_TABLES = ListUtil.toList("sys_tenant", "sys_tenant_datasource", "generator_table", "generator_table_column");
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {

View File

@ -27,6 +27,7 @@ public class DynamicDataSourceFactory {
public void setSchemaPrefix() {
TenantSchema.setSchemaPrefix(schemaPrefix);
}
@Bean
public DynamicDataSourceContext dataSource() {
return new DynamicDataSourceContext();

View File

@ -2,7 +2,6 @@ package com.qiaoba.common.database.interceptors;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.database.properties.TenantSchema;
import com.qiaoba.common.database.utils.DbUtil;

View File

@ -76,21 +76,4 @@ public class DbUtil {
}
}
public static void main(String[] args) {
Connection connection = null;
try {
connection = JdbcUtil.getConnection(
DataBaseEnum.getDriver("Oracle"),
"jdbc:oracle:thin:@//192.168.0.205:1521/ORCL",
"system",
"root"
);
setSchema("Oracle", connection, "QIAOBA1");
runSql(connection, "delete FROM SYS_USER where user_id = '1'");
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
IoUtil.close(connection);
}
}
}

View File

@ -82,9 +82,4 @@ public class JdbcUtil {
return DriverManager.getConnection(url, username, password);
}
public static void main(String[] args) throws Exception {
Connection connection = getConnection("oracle.jdbc.OracleDriver", "jdbc:oracle:thin:@//192.168.0.205:1521/ORCL", "QIAOBA-BOOT-1", "123456");
DbUtil.runSql(connection, "delete from sys_post where post_id = '1'");
}
}

View File

@ -11,7 +11,7 @@
<artifactId>qiaoba-module-generator</artifactId>
<description> 代码生成 </description>
<description>代码生成</description>
<dependencies>
<dependency>

View File

@ -0,0 +1,30 @@
package com.qiaoba.module.generator.config;
/**
* 代码生成 默认配置
*
* @author ruoyi
*/
public class GeneratorConfig {
/**
* 作者
*/
public static String AUTHOR = "Ailanyin";
/**
* 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
*/
public static String PACKAGE_NAME = "com.qiaoba.module.generator";
/**
* 自动去除表前缀默认是false
*/
public static boolean AUTO_REMOVE_PREFIX;
/**
* 表前缀 生成类名不会包含表前缀, 多个用逗号分隔
*/
public static String TABLE_PREFIX;
}

View File

@ -0,0 +1,216 @@
package com.qiaoba.module.generator.constant;
/**
* 代码生成通用常量
*
* @author ruoyi
*/
public class GenConstants {
/**
* 单表(增删改查)
*/
public static final String TPL_CRUD = "crud";
/**
* 树表(增删改查)
*/
public static final String TPL_TREE = "tree";
/**
* 主子表(增删改查)
*/
public static final String TPL_SUB = "sub";
/**
* 树编码字段
*/
public static final String TREE_CODE = "treeCode";
/**
* 树父编码字段
*/
public static final String TREE_PARENT_CODE = "treeParentCode";
/**
* 树名称字段
*/
public static final String TREE_NAME = "treeName";
/**
* 上级菜单ID字段
*/
public static final String PARENT_MENU_ID = "parentMenuId";
/**
* 上级菜单名称字段
*/
public static final String PARENT_MENU_NAME = "parentMenuName";
/**
* 数据库字符串类型
*/
public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"};
/**
* 数据库文本类型
*/
public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"};
/**
* 数据库时间类型
*/
public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"};
/**
* 数据库数字类型
*/
public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer",
"bit", "bigint", "float", "double", "decimal"};
/**
* 页面不需要编辑字段
*/
public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"};
/**
* 页面不需要显示的列表字段
*/
public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by",
"update_time"};
/**
* 页面不需要查询字段
*/
public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by",
"update_time", "remark"};
/**
* Entity基类字段
*/
public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"};
/**
* Tree基类字段
*/
public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"};
/**
* 文本框
*/
public static final String HTML_INPUT = "input";
/**
* 文本域
*/
public static final String HTML_TEXTAREA = "textarea";
/**
* 下拉框
*/
public static final String HTML_SELECT = "select";
/**
* 单选框
*/
public static final String HTML_RADIO = "radio";
/**
* 复选框
*/
public static final String HTML_CHECKBOX = "checkbox";
/**
* 日期控件
*/
public static final String HTML_DATETIME = "datetime";
/**
* 图片上传控件
*/
public static final String HTML_IMAGE_UPLOAD = "imageUpload";
/**
* 文件上传控件
*/
public static final String HTML_FILE_UPLOAD = "fileUpload";
/**
* 富文本控件
*/
public static final String HTML_EDITOR = "editor";
/**
* 字符串类型
*/
public static final String TYPE_STRING = "String";
/**
* 整型
*/
public static final String TYPE_INTEGER = "Integer";
/**
* 长整型
*/
public static final String TYPE_LONG = "Long";
/**
* 浮点型
*/
public static final String TYPE_DOUBLE = "Double";
/**
* 高精度计算类型
*/
public static final String TYPE_BIGDECIMAL = "BigDecimal";
/**
* 时间类型
*/
public static final String TYPE_DATE = "Date";
/**
* 模糊查询
*/
public static final String QUERY_LIKE = "LIKE";
/**
* 相等查询
*/
public static final String QUERY_EQ = "EQ";
/**
* 需要
*/
public static final String REQUIRE = "1";
/**
* 需求处理成 模糊搜索 的字段
*/
public static final String[] HTML_LIKE_COLUMN = {"name", "code", "phone"};
/**
* 需求处理成 单选框 的字段
*/
public static final String[] HTML_RADIO_COLUMN = {"status"};
/**
* 需求处理成 下拉框 的字段
*/
public static final String[] HTML_SELECT_COLUMN = {"type", "sex", "gender"};
/**
* 需求处理成 图片上传控件 的字段
*/
public static final String[] HTML_IMAGE_COLUMN = {"image", "pic"};
/**
* 需求处理成 文件上传控件 的字段
*/
public static final String[] HTML_FILE_COLUMN = {"file"};
/**
* 需求处理成 富文本 的字段
*/
public static final String[] HTML_EDITOR_COLUMN = {"content", "description"};
}

View File

@ -1,20 +0,0 @@
package com.qiaoba.module.generator.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 代码生成 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 9:09
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tool/gen")
public class GenController {
}

View File

@ -0,0 +1,35 @@
package com.qiaoba.module.generator.controller;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.module.generator.entity.dto.TableDto;
import com.qiaoba.module.generator.service.GeneratorTableService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 代码生成 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 9:09
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/tool/gen")
public class GeneratorController {
private final GeneratorTableService generatorTableService;
/**
* 导入表结构(保存)
*/
@PostMapping("/importTable")
public AjaxResult importTable(@RequestBody TableDto dto) {
return AjaxResult.toAjax(generatorTableService.importTable(dto));
}
}

View File

@ -0,0 +1,73 @@
package com.qiaoba.module.generator.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 业务表 gen_table
*
* @author ruoyi
*/
@Data
@TableName("generator_table")
public class GeneratorTable implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 编号
*/
@TableId
private String tableId;
/**
* 表名称
*/
private String tableName;
/**
* 表描述
*/
private String tableComment;
/**
* 实体类名称(首字母大写)
*/
private String className;
/**
* 生成包路径
*/
private String packageName;
/**
* 生成模块名
*/
private String moduleName;
/**
* 生成业务名
*/
private String businessName;
/**
* 生成功能名
*/
private String functionName;
/**
* 生成作者
*/
private String author;
/**
* 生成路径(不填默认项目路径)
*/
private String genPath;
}

View File

@ -0,0 +1,107 @@
package com.qiaoba.module.generator.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
/**
* 表字段
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@Data
@TableName("generator_table_column")
public class GeneratorTableColumn implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 编号
*/
@TableId
private String columnId;
/**
* 归属表编号
*/
private String tableId;
/**
* 列名称
*/
private String columnName;
/**
* 列描述
*/
private String columnComment;
/**
* 列类型
*/
private String columnType;
/**
* JAVA类型
*/
private String javaType;
/**
* JAVA字段名
*/
private String javaField;
/**
* 是否主键1是
*/
private String isPk;
/**
* 是否必填1是
*/
private String isRequired;
/**
* 是否为插入字段1是
*/
private String isInsert;
/**
* 是否编辑字段1是
*/
private String isEdit;
/**
* 是否列表字段1是
*/
private String isList;
/**
* 是否查询字段1是
*/
private String isQuery;
/**
* 查询方式EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围
*/
private String queryType;
/**
* 显示类型input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件
*/
private String htmlType;
/**
* 字典类型
*/
private String dictType;
/**
* 排序
*/
private Integer sort;
}

View File

@ -0,0 +1,46 @@
package com.qiaoba.module.generator.entity.vo;
import lombok.Data;
import java.io.Serializable;
/**
* 表字段信息
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@Data
public class TableColumnVo implements Serializable {
/**
* 列名称
*/
private String columnName;
/**
* 列描述
*/
private String columnComment;
/**
* 是否必填1是
*/
private String isRequired;
/**
* 是否主键1是
*/
private String isPk;
/**
* 排序
*/
private Integer sort;
/**
* 列类型
*/
private String columnType;
}

View File

@ -0,0 +1,27 @@
package com.qiaoba.module.generator.mapper;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.module.generator.entity.GeneratorTableColumn;
import com.qiaoba.module.generator.entity.vo.TableColumnVo;
import java.util.List;
/**
* 表字段 数据层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@InterceptorIgnore(tenantLine = "true")
public interface GeneratorTableColumnMapper extends BaseMapper<GeneratorTableColumn> {
/**
* 查询表的字段信息
*
* @param tableName 表名
* @return list
*/
List<TableColumnVo> selectListByTableName(String tableName);
}

View File

@ -1,6 +1,8 @@
package com.qiaoba.module.generator.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiaoba.module.generator.entity.GeneratorTable;
import com.qiaoba.module.generator.entity.dto.TableDto;
import com.qiaoba.module.generator.entity.vo.DbTableVo;
import org.apache.ibatis.annotations.Param;
@ -12,7 +14,7 @@ import org.apache.ibatis.annotations.Param;
* @version 1.0
* @since 2023/6/26 9:24
*/
public interface TableMapper {
public interface GeneratorTableMapper extends BaseMapper<GeneratorTable> {
/**
* 查询数据库表
@ -22,4 +24,5 @@ public interface TableMapper {
* @return list
*/
Page<DbTableVo> selectPageDbTableList(Page page, @Param("dto") TableDto dto);
}

View File

@ -0,0 +1,32 @@
package com.qiaoba.module.generator.service;
import com.qiaoba.module.generator.entity.GeneratorTableColumn;
import com.qiaoba.module.generator.entity.vo.TableColumnVo;
import java.util.List;
/**
* 表字段 服务层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
public interface GeneratorTableColumnService {
/**
* 查询表的字段信息
*
* @param tableName 表名
* @return list
*/
List<TableColumnVo> selectListByTableName(String tableName);
/**
* 新增
*
* @param generatorTableColumn column
* @return 结果
*/
Integer insert(GeneratorTableColumn generatorTableColumn);
}

View File

@ -12,14 +12,23 @@ import com.qiaoba.module.generator.entity.vo.DbTableVo;
* @version 1.0
* @since 2023/6/26 9:24
*/
public interface TableService {
public interface GeneratorTableService {
/**
* 分页查询数据库表
*
* @param dto 查询条件
* @param dto 查询条件
* @param pageQuery 分页信息
* @return list
*/
TableDataInfo<DbTableVo> selectPageDbTableList(TableDto dto, PageQuery pageQuery);
/**
* 导入表结构
*
* @param dto dto
* @return 结果
*/
int importTable(TableDto dto);
}

View File

@ -0,0 +1,34 @@
package com.qiaoba.module.generator.service.impl;
import com.qiaoba.module.generator.entity.GeneratorTableColumn;
import com.qiaoba.module.generator.entity.vo.TableColumnVo;
import com.qiaoba.module.generator.mapper.GeneratorTableColumnMapper;
import com.qiaoba.module.generator.service.GeneratorTableColumnService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 表字段 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@Service
@RequiredArgsConstructor
public class GeneratorTableColumnServiceImpl implements GeneratorTableColumnService {
private final GeneratorTableColumnMapper generatorTableColumnMapper;
@Override
public List<TableColumnVo> selectListByTableName(String tableName) {
return generatorTableColumnMapper.selectListByTableName(tableName);
}
@Override
public Integer insert(GeneratorTableColumn generatorTableColumn) {
return generatorTableColumnMapper.insert(generatorTableColumn);
}
}

View File

@ -0,0 +1,62 @@
package com.qiaoba.module.generator.service.impl;
import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.generator.entity.GeneratorTable;
import com.qiaoba.module.generator.entity.GeneratorTableColumn;
import com.qiaoba.module.generator.entity.dto.TableDto;
import com.qiaoba.module.generator.entity.vo.DbTableVo;
import com.qiaoba.module.generator.entity.vo.TableColumnVo;
import com.qiaoba.module.generator.mapper.GeneratorTableMapper;
import com.qiaoba.module.generator.service.GeneratorTableColumnService;
import com.qiaoba.module.generator.service.GeneratorTableService;
import com.qiaoba.module.generator.util.GeneratorUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 数据库表 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@Service
@RequiredArgsConstructor
public class GeneratorTableServiceImpl implements GeneratorTableService {
private final GeneratorTableMapper generatorTableMapper;
private final GeneratorTableColumnService generatorTableColumnService;
@Override
public TableDataInfo<DbTableVo> selectPageDbTableList(TableDto dto, PageQuery pageQuery) {
dto.setDbType(TenantDbTypeContext.getDefault());
dto.setSchema(selectSchema());
return TableDataInfo.build(generatorTableMapper.selectPageDbTableList(pageQuery.build(), dto));
}
@Override
public int importTable(TableDto dto) {
GeneratorTable generatorTable = GeneratorUtil.dtoToGeneratorTable(dto);
int result = generatorTableMapper.insert(generatorTable);
if (result > BaseConstant.HANDLE_ERROR) {
List<TableColumnVo> columnVos = generatorTableColumnService.selectListByTableName(dto.getTableName());
for (TableColumnVo columnVo : columnVos) {
GeneratorTableColumn generatorTableColumn = GeneratorUtil.initColumn(columnVo, generatorTable.getTableId());
generatorTableColumnService.insert(generatorTableColumn);
}
}
return result;
}
private String selectSchema() {
// PgSQL 需要设置 schema
//DataBaseEnum.POSTGRE_SQL.getType().equals(dbType)
return null;
}
}

View File

@ -1,41 +0,0 @@
package com.qiaoba.module.generator.service.impl;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.generator.entity.dto.TableDto;
import com.qiaoba.module.generator.entity.vo.DbTableVo;
import com.qiaoba.module.generator.mapper.TableMapper;
import com.qiaoba.module.generator.service.TableService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* 数据库表 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 10:12
*/
@Service
@RequiredArgsConstructor
public class TableServiceImpl implements TableService {
private final TableMapper tableMapper;
@Override
public TableDataInfo<DbTableVo> selectPageDbTableList(TableDto dto, PageQuery pageQuery) {
String dbType = DynamicDataSourceConfig.TENANT_DATASOURCE_TYPE_MAP.get(BaseContext.getTenantId());
dto.setDbType(dbType);
dto.setSchema(selectSchema());
return TableDataInfo.build(tableMapper.selectPageDbTableList(pageQuery.build(), dto));
}
private String selectSchema() {
// PgSQL 需要设置 schema
//DataBaseEnum.POSTGRE_SQL.getType().equals(dbType)
return null;
}
}

View File

@ -0,0 +1,184 @@
package com.qiaoba.module.generator.util;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.utils.ArrayUtil;
import com.qiaoba.module.generator.config.GeneratorConfig;
import com.qiaoba.module.generator.constant.GenConstants;
import com.qiaoba.module.generator.entity.GeneratorTable;
import com.qiaoba.module.generator.entity.GeneratorTableColumn;
import com.qiaoba.module.generator.entity.dto.TableDto;
import com.qiaoba.module.generator.entity.vo.TableColumnVo;
import java.util.List;
/**
* GeneratorUtil
*
* @author ailanyin
* @version 1.0
* @since 2023/6/26 9:24
*/
public class GeneratorUtil {
public static GeneratorTableColumn initColumn(TableColumnVo vo, String tableId) {
GeneratorTableColumn column = new GeneratorTableColumn();
column.setTableId(tableId);
column.setSort(vo.getSort());
column.setColumnName(vo.getColumnName());
column.setColumnComment(vo.getColumnComment());
// 设置java字段名
column.setJavaField(StrUtil.toCamelCase(column.getColumnName()));
// 设置默认类型
column.setJavaType(GenConstants.TYPE_STRING);
column.setQueryType(GenConstants.QUERY_EQ);
column.setColumnType(vo.getColumnType());
setType(column, vo.getColumnType());
// 插入字段(默认所有字段都需要插入)
column.setIsInsert(GenConstants.REQUIRE);
column.setIsPk(vo.getIsPk());
column.setIsRequired(vo.getIsRequired());
// 编辑字段
if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_EDIT, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) {
column.setIsEdit(GenConstants.REQUIRE);
}
// 列表字段
if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_LIST, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) {
column.setIsList(GenConstants.REQUIRE);
}
// 查询字段
if (!ArrayUtil.contains(GenConstants.COLUMNNAME_NOT_QUERY, column.getColumnName()) && !BaseConstant.YES.equals(column.getIsPk())) {
column.setIsQuery(GenConstants.REQUIRE);
}
return column;
}
public static GeneratorTable dtoToGeneratorTable(TableDto dto) {
GeneratorTable generatorTable = new GeneratorTable();
generatorTable.setTableName(dto.getTableName());
generatorTable.setTableComment(dto.getTableComment());
generatorTable.setClassName(tableNameToClassName(dto.getTableName()));
generatorTable.setPackageName(GeneratorConfig.PACKAGE_NAME);
generatorTable.setModuleName(packageNameToModuleName(GeneratorConfig.PACKAGE_NAME));
generatorTable.setBusinessName(tableNameToBusinessName(dto.getTableName()));
generatorTable.setFunctionName(commentToBusinessName(dto.getTableComment()));
generatorTable.setAuthor(GeneratorConfig.AUTHOR);
return generatorTable;
}
private static String tableNameToClassName(String tableName) {
// 去除前缀
// eg: 表名: bz_sys_user 前缀: bz_ 去除后 sys_user
if (GeneratorConfig.AUTO_REMOVE_PREFIX && StrUtil.isNotBlank(GeneratorConfig.TABLE_PREFIX)) {
List<String> prefixList = StrUtil.split(GeneratorConfig.TABLE_PREFIX, BaseConstant.DEFAULT_SPLIT_STR);
for (String prefix : prefixList) {
if (tableName.startsWith(prefix)) {
tableName = StrUtil.removePrefix(tableName, prefix);
break;
}
}
}
// 下划线转驼峰 sys_user -> sysUser
tableName = StrUtil.toCamelCase(tableName);
// 首字符大写 sysUser -> SysUser
return StrUtil.upperFirst(tableName);
}
private static String packageNameToModuleName(String packageName) {
int lastIndex = packageName.lastIndexOf(".");
int nameLength = packageName.length();
return StrUtil.sub(packageName, lastIndex + 1, nameLength);
}
private static String tableNameToBusinessName(String tableName) {
int lastIndex = tableName.lastIndexOf("_");
int nameLength = tableName.length();
return StrUtil.sub(tableName, lastIndex + 1, nameLength);
}
private static String commentToBusinessName(String comment) {
// 用户表 -> 用户
return StrUtil.isNotBlank(comment) ? StrUtil.replaceLast(comment, "", "") : comment;
}
private static void setType(GeneratorTableColumn column, String columnType) {
// varchar(50) -> varchar
columnType = StrUtil.subBefore(columnType, "(", false);
// 字符串 or 长文本
if (ArrayUtil.contains(GenConstants.COLUMNTYPE_STR, columnType) || ArrayUtil.contains(GenConstants.COLUMNTYPE_TEXT, columnType)) {
// 字符串长度超过500设置为文本域
Integer columnLength = getColumnLength(column.getColumnType());
String htmlType = columnLength >= 500 || ArrayUtil.contains(GenConstants.COLUMNTYPE_TEXT, columnType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
column.setHtmlType(htmlType);
}
// 时间类型
if (ArrayUtil.contains(GenConstants.COLUMNTYPE_TIME, columnType)) {
column.setJavaType(GenConstants.TYPE_DATE);
column.setHtmlType(GenConstants.HTML_DATETIME);
}
// 数字类型
if (ArrayUtil.contains(GenConstants.COLUMNTYPE_NUMBER, columnType)) {
column.setHtmlType(GenConstants.HTML_INPUT);
// 如果是浮点型 统一用BigDecimal
List<String> strList = StrUtil.split(StrUtil.subBetween(column.getColumnType(), "(", ")"), ",");
if (strList != null && strList.size() == 2 && Integer.parseInt(strList.get(1)) > 0) {
column.setJavaType(GenConstants.TYPE_BIGDECIMAL);
}
// 如果是整形
else if (strList != null && strList.size() == 1 && Integer.parseInt(strList.get(0)) <= 10) {
column.setJavaType(GenConstants.TYPE_INTEGER);
}
// 长整形
else {
column.setJavaType(GenConstants.TYPE_LONG);
}
}
// 字段包含中 LIKE_COLUMN 设置 type = like
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_LIKE_COLUMN, column.getColumnName())) {
column.setQueryType(GenConstants.QUERY_LIKE);
}
// 单选框
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_RADIO_COLUMN, column.getColumnName())) {
column.setHtmlType(GenConstants.HTML_RADIO);
}
// 下拉框
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_SELECT_COLUMN, column.getColumnName())) {
column.setHtmlType(GenConstants.HTML_SELECT);
}
// 图片上传控件
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_IMAGE_COLUMN, column.getColumnName())) {
column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
}
// 文件上传控件
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_FILE_COLUMN, column.getColumnName())) {
column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
}
// 富文本控件
if (ArrayUtil.containsValueIgnoreCase(GenConstants.HTML_EDITOR_COLUMN, column.getColumnName())) {
column.setHtmlType(GenConstants.HTML_EDITOR);
}
}
/**
* 获取字段长度
*
* @param columnType 列类型
* @return 截取后的列类型
*/
private static Integer getColumnLength(String columnType) {
// bigint(20)
try {
String length = StrUtil.subBetween(columnType, "(", ")");
return Integer.valueOf(length);
} catch (NumberFormatException e) {
return 0;
}
}
}

View File

@ -0,0 +1,22 @@
<?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="com.qiaoba.module.generator.mapper.GeneratorTableColumnMapper">
<resultMap type="com.qiaoba.module.generator.entity.vo.TableColumnVo" id="DbTableColumnVoResult">
<result property="columnName" column="column_name"/>
<result property="columnComment" column="column_comment"/>
<result property="columnType" column="column_type"/>
<result property="isRequired" column="is_required"/>
<result property="isPk" column="is_pk"/>
<result property="sort" column="sort"/>
</resultMap>
<select id="selectListByTableName" resultMap="DbTableColumnVoResult">
select column_name, (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else null end) as is_required, (case when column_key = 'PRI' then '1' else '0' end) as is_pk, ordinal_position as sort, column_comment, column_type
from information_schema.columns where table_schema = (select database()) and table_name = (#{tableName})
order by ordinal_position
</select>
</mapper>

View File

@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoba.module.generator.mapper.TableMapper">
<mapper namespace="com.qiaoba.module.generator.mapper.GeneratorTableMapper">
<resultMap type="com.qiaoba.module.generator.entity.vo.DbTableVo" id="DbTableVoResult">
<result property="tableName" column="table_name"/>
@ -27,7 +27,8 @@
</if>
<if test="dto.dbType=='Oracle'.toString()">
select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time, uo.last_ddl_time as update_time
select lower(dt.table_name) as table_name, dtc.comments as table_comment, uo.created as create_time,
uo.last_ddl_time as update_time
from user_tables dt, user_tab_comments dtc, user_objects uo
where dt.table_name = dtc.table_name
and dt.table_name = uo.object_name
@ -68,4 +69,5 @@
order by create_time desc
</if>
</select>
</mapper>

View File

@ -11,7 +11,6 @@ import com.qiaoba.api.system.entity.dto.DataScopeDto;
import com.qiaoba.api.system.entity.dto.SysRoleDto;
import com.qiaoba.api.system.entity.param.SysRoleParam;
import com.qiaoba.auth.utils.SecurityUtil;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;

View File

@ -1,14 +1,14 @@
package com.qiaoba.module.tenant.controller;
import cn.hutool.core.bean.BeanUtil;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.base.validate.AddGroup;
import com.qiaoba.common.base.validate.EditGroup;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.module.tenant.entity.dto.TenantSettingDto;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
import com.qiaoba.module.tenant.service.SysTenantService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -1,9 +1,9 @@
package com.qiaoba.module.tenant.controller;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.base.validate.AddGroup;
import com.qiaoba.common.base.validate.EditGroup;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;

View File

@ -2,18 +2,16 @@ package com.qiaoba.module.tenant.filters;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.enums.TenantStatusEnum;
import com.qiaoba.api.tenant.utils.TenantUtil;
import com.qiaoba.common.base.code.TenantErrorCode;
import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.constants.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.web.utils.ResponseUtil;
import com.qiaoba.common.web.utils.UriUtil;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.enums.TenantModeEnum;
import com.qiaoba.api.tenant.enums.TenantStatusEnum;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;

View File

@ -25,7 +25,7 @@ public interface InitTablesStrategy {
/**
* 创建表
*
* @param conn 连接对象
* @param conn 连接对象
* @return 结果
*/
TenantInitVo create(Connection conn);

View File

@ -1,11 +1,10 @@
package com.qiaoba.module.tenant.service;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
/**
* 租户管理 服务层
*

View File

@ -2,13 +2,13 @@ package com.qiaoba.module.tenant.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.database.entity.DynamicDataSource;
import com.qiaoba.common.database.service.DynamicDatasourceService;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

View File

@ -2,12 +2,12 @@ package com.qiaoba.module.tenant.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.common.base.code.DatasourceErrorCode;
import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;

View File

@ -4,6 +4,9 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.druid.pool.DruidDataSource;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.enums.TenantModeEnum;
import com.qiaoba.common.base.code.DatasourceErrorCode;
import com.qiaoba.common.base.code.TenantErrorCode;
import com.qiaoba.common.base.enums.DataBaseEnum;
@ -12,11 +15,8 @@ import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.database.properties.TenantSchema;
import com.qiaoba.common.database.utils.DbUtil;
import com.qiaoba.common.database.utils.JdbcUtil;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import com.qiaoba.api.tenant.enums.TenantModeEnum;
import com.qiaoba.module.tenant.init.InitTablesStrategyFactory;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import com.qiaoba.module.tenant.service.SysTenantInitService;