This commit is contained in:
2023-07-13 17:30:09 +08:00
parent 672f66b40e
commit 6ed1224410
373 changed files with 566 additions and 409 deletions

View File

@ -0,0 +1,35 @@
<?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>qiaoba-modules</artifactId>
<groupId>com.qiaoba</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>qiaoba-module-tenant</artifactId>
<description>租户模块</description>
<dependencies>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-log</artifactId>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-system</artifactId>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-auth</artifactId>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-tenant</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,88 @@
package com.qiaoba.module.tenant.controller;
import cn.hutool.core.bean.BeanUtil;
import com.qiaoba.api.job.annotation.Log;
import com.qiaoba.api.job.enums.BusinessType;
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.module.tenant.entity.dto.TenantSettingDto;
import com.qiaoba.module.tenant.service.SysTenantService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* 租户管理 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 10:52
*/
@RestController
@RequestMapping("/tenant")
@RequiredArgsConstructor
@Tag(name = "租户管理")
public class SysTenantController {
private final SysTenantService sysTenantService;
@PreAuthorize("hasAuthority('tenant:add')")
@PostMapping
@Operation(summary = "新增租户")
@Log(title = "新增租户", businessType = BusinessType.INSERT)
public AjaxResult add(@Validated(AddGroup.class) @RequestBody SysTenant sysTenant) {
return AjaxResult.toAjax(sysTenantService.insert(sysTenant));
}
@PreAuthorize("hasAuthority('tenant:query')")
@GetMapping(value = "/{tenantId}")
@Operation(summary = "获取详情")
public AjaxResult getInfo(@PathVariable String tenantId) {
return AjaxResult.success(sysTenantService.selectById(tenantId));
}
@PreAuthorize("hasAuthority('tenant:edit')")
@PutMapping
@Operation(summary = "修改租户")
@Log(title = "修改租户", businessType = BusinessType.UPDATE)
public AjaxResult edit(@Validated(EditGroup.class) @RequestBody SysTenant sysTenant) {
return AjaxResult.toAjax(sysTenantService.update(sysTenant));
}
@PreAuthorize("hasAuthority('tenant:list')")
@GetMapping("/list")
@Operation(summary = "获取列表")
public TableDataInfo<SysTenant> list(SysTenantParam param, PageQuery pageQuery) {
return sysTenantService.selectPageList(param, pageQuery);
}
@GetMapping("/normal-list")
@Operation(summary = "获取正常列表[开放接口]")
public TableDataInfo<SysTenant> normalPageList(PageQuery pageQuery) {
return sysTenantService.selectPageList(SysTenantParam.buildNormalSelectParam(), pageQuery);
}
@PreAuthorize("hasAuthority('tenant:edit')")
@PutMapping("/setting")
@Operation(summary = "修改模式")
public AjaxResult setting(TenantSettingDto dto) {
return AjaxResult.success(sysTenantService.update(BeanUtil.copyProperties(dto, SysTenant.class)));
}
@PreAuthorize("hasAuthority('tenant:remove')")
@DeleteMapping("/refreshCache")
@Operation(summary = "刷新缓存")
public AjaxResult refreshCache() {
sysTenantService.resetCache();
return AjaxResult.success();
}
}

View File

@ -0,0 +1,66 @@
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.module.tenant.service.SysTenantDatasourceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 租户数据源管理 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 10:52
*/
@RestController
@RequestMapping("/tenant/datasource")
@RequiredArgsConstructor
@Tag(name = "租户数据源管理")
public class SysTenantDatasourceController {
private final SysTenantDatasourceService sysTenantDatasourceService;
@PreAuthorize("hasAuthority('tenant:datasource:add')")
@PostMapping
@Operation(summary = "新增数据源")
public AjaxResult add(@Validated(AddGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
return AjaxResult.toAjax(sysTenantDatasourceService.insert(sysTenantDatasource));
}
@PreAuthorize("hasAuthority('tenant:datasource:edit')")
@PutMapping
@Operation(summary = "修改数据源")
public AjaxResult edit(@Validated(EditGroup.class) @RequestBody SysTenantDatasource sysTenantDatasource) {
return AjaxResult.toAjax(sysTenantDatasourceService.updateById(sysTenantDatasource));
}
@DeleteMapping("/{ids}")
@PreAuthorize("hasAuthority('tenant:datasource:remove')")
@Operation(summary = "删除数据源")
public AjaxResult remove(@PathVariable List<String> ids) {
return AjaxResult.toAjax(sysTenantDatasourceService.deleteByIds(ids));
}
@PreAuthorize("hasAuthority('tenant:datasource:list')")
@GetMapping("/list")
@Operation(summary = "获取列表")
public AjaxResult list(@RequestParam String tenantId) {
return AjaxResult.success(sysTenantDatasourceService.selectList(tenantId));
}
@PreAuthorize("hasAuthority('tenant:datasource:edit')")
@PutMapping("/switchPrimary/{tenantId}/{id}")
@Operation(summary = "切换为主数据源")
public AjaxResult switchPrimary(@PathVariable String tenantId, @PathVariable String id) {
return AjaxResult.toAjax(sysTenantDatasourceService.switchPrimary(tenantId, id));
}
}

View File

@ -0,0 +1,53 @@
package com.qiaoba.module.tenant.controller;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import com.qiaoba.module.tenant.service.SysTenantInitService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 租户初始化 Web层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 9:03
*/
@RestController
@RequestMapping("/tenant/init")
@RequiredArgsConstructor
@Tag(name = "租户初始化管理")
public class SysTenantInitController {
private final SysTenantInitService sysTenantInitService;
@PostMapping(value = "/check/{tenantId}")
@Operation(summary = "步骤一: 检查各项参数")
public TenantInitCheckVo check(@PathVariable String tenantId) {
return sysTenantInitService.check(tenantId);
}
@PostMapping(value = "/createTables/{tenantId}")
@Operation(summary = "步骤二: 创建数据库表")
public TenantInitVo createTables(@PathVariable String tenantId) {
return sysTenantInitService.createTables(tenantId);
}
@PostMapping(value = "/initData/{tenantId}")
@Operation(summary = "步骤三: 导入数据")
public TenantInitVo initData(@PathVariable String tenantId) throws Exception {
return sysTenantInitService.initData(tenantId);
}
@PostMapping(value = "/initCompleted/{tenantId}")
@Operation(summary = "初始化完毕")
public AjaxResult initCompleted(@PathVariable String tenantId) {
sysTenantInitService.initCompleted(tenantId);
return AjaxResult.success();
}
}

View File

@ -0,0 +1,22 @@
package com.qiaoba.module.tenant.entity.dto;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
/**
* 租户设置
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 17:13
*/
@Getter
@Setter
public class TenantSettingDto implements Serializable {
private String tenantId;
private String mode;
}

View File

@ -0,0 +1,45 @@
package com.qiaoba.module.tenant.entity.vo;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 租户初始化之前的检查
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 9:09
*/
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
public class TenantInitCheckVo extends TenantInitVo {
@Schema(description = "租户名称")
private String tenantName;
@Schema(description = "1-字段,2-SCHEMA,3数据源")
private String mode;
private SysTenantDatasource datasource;
public TenantInitCheckVo(String tenantName, String mode, Integer result, String msg) {
this.tenantName = tenantName;
this.mode = mode;
this.result = result;
this.msg = msg;
}
public TenantInitCheckVo(String tenantName, String mode, SysTenantDatasource datasource, Integer result, String msg) {
this.tenantName = tenantName;
this.mode = mode;
this.datasource = datasource;
this.result = result;
this.msg = msg;
}
}

View File

@ -0,0 +1,27 @@
package com.qiaoba.module.tenant.entity.vo;
import cn.hutool.http.HttpStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* TenantInitVo
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 16:16
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TenantInitVo implements Serializable {
private final Integer code = HttpStatus.HTTP_OK;
public Integer result;
public String msg;
}

View File

@ -0,0 +1,29 @@
package com.qiaoba.module.tenant.entity.vo;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.List;
/**
* 租户设置
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 17:13
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TenantSettingVo implements Serializable {
private String tenantId;
private String mode;
private List<SysTenantDatasource> datasourceList;
}

View File

@ -0,0 +1,141 @@
package com.qiaoba.module.tenant.filter;
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.constant.BaseConstant;
import com.qiaoba.common.base.constant.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.base.order.FilterOrder;
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
import com.qiaoba.common.web.util.ResponseUtil;
import com.qiaoba.common.web.util.UriUtil;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 动态切换不同租户的数据源
*
* @author ailanyin
* @version 1.0
* @since 2023-04-25 22:48:43
*/
@Component
@Order(FilterOrder.DYNAMIC_DATASOURCE_FILTER_ORDER)
@Slf4j
public class DynamicDataSourceFilter extends OncePerRequestFilter {
@Resource
private SysTenantService sysTenantService;
@Resource
private DynamicDataSourceConfig dynamicDataSourceConfig;
private static final List<String> NOT_NEED_TENANT_URIS = ListUtil.toList(
// 静态资源
"/**/*.html", "/**/*.css", "/**/*.js",
// Knife4j
"/swagger-resources", "/v3/api-docs/**", "/favicon.ico",
// Druid 可视化web监控
"/druid/**",
// File
BaseConstant.RESOURCE_PATTERN);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
log.debug("Start run DynamicDataSourceFilter, Uri: {}", request.getRequestURI());
String tenantId = request.getHeader(TenantConstant.HEADER_KEY_TENANT);
// 主系统 or 登录入口获取租户列表
if (TenantConstant.DEFAULT_TENANT_ID.equals(tenantId) || TenantConstant.LOGIN_TENANT_LIST_URI.equals(request.getRequestURI())) {
dynamicDataSourceConfig.setDefaultSetting();
filterChain.doFilter(request, response);
return;
}
// 不需要租户ID的接口
for (String uri : NOT_NEED_TENANT_URIS) {
if (UriUtil.match(uri, request.getRequestURI())) {
filterChain.doFilter(request, response);
return;
}
}
SysTenant sysTenant = sysTenantService.selectFromCache(tenantId);
// 检查租户是否允许访问
if (checkTenantIsNotAllow(response, sysTenant)) {
return;
}
// 设置租户信息
before(sysTenant);
filterChain.doFilter(request, response);
} finally {
after();
}
}
private void before(SysTenant sysTenant) {
log.debug("设置租户信息, 租户ID: {},租户模式: {}", sysTenant.getTenantId(), sysTenant.getMode());
TenantUtil.setContext(sysTenant);
}
private void after() {
log.debug("clear the BaseContext");
BaseContext.clearAllHolder();
}
/**
* 检查租户是否不允许访问
*
* @param sysTenant sysTenant
* @return 是->不允许
*/
private boolean checkTenantIsNotAllow(HttpServletResponse response, SysTenant sysTenant) throws IOException {
if (Objects.isNull(sysTenant)) {
// 未找到租户信息
log.debug("未找到租户信息");
ResponseUtil.errorAuth(response, TenantErrorCode.NOT_FIND.getCode(), TenantErrorCode.NOT_FIND.getMsg());
return true;
}
if (TenantStatusEnum.isDisable(sysTenant.getStatus())) {
// 封禁状态
log.debug("租户已封禁, 租户ID: {}", sysTenant.getTenantId());
ResponseUtil.errorAuth(response, TenantErrorCode.DISABLE.getCode(), TenantErrorCode.DISABLE.getMsg());
return true;
}
if (TenantStatusEnum.isExpire(sysTenant.getStatus())) {
// 已过期
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
ResponseUtil.errorAuth(response, TenantErrorCode.EXPIRE.getCode(), TenantErrorCode.EXPIRE.getMsg());
return true;
}
// 检查是否过期
if (DateUtil.compare(sysTenant.getExpireTime(), new Date()) < 0) {
// 已过期
log.debug("租户已过期, 租户ID: {}", sysTenant.getTenantId());
ResponseUtil.errorAuth(response, TenantErrorCode.EXPIRE.getCode(), TenantErrorCode.EXPIRE.getMsg());
// 更新租户状态为已过期
dynamicDataSourceConfig.setDefaultSetting();
sysTenantService.updateStatus(sysTenant.getTenantId(), TenantStatusEnum.EXPIRE.getStatus());
return true;
}
return false;
}
}

View File

@ -0,0 +1,32 @@
package com.qiaoba.module.tenant.init;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import java.sql.Connection;
/**
* 初始化表策略
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 13:05
*/
public interface InitTablesStrategy {
/**
* 创建表
*
* @param conn 连接对象
* @param schema 模式
* @return 结果
*/
TenantInitVo create(Connection conn, String schema);
/**
* 创建表
*
* @param conn 连接对象
* @return 结果
*/
TenantInitVo create(Connection conn);
}

View File

@ -0,0 +1,45 @@
package com.qiaoba.module.tenant.init;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.base.exception.ServiceException;
import com.qiaoba.module.tenant.init.impl.MysqlInitTablesStrategy;
import com.qiaoba.module.tenant.init.impl.PgSqlInitTablesStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
* 策略工厂-租户初始化-创建表
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 16:41
*/
@Component
@RequiredArgsConstructor
public class InitTablesStrategyFactory {
private static Map<String, InitTablesStrategy> FACTORY = new ConcurrentHashMap<>();
private final MysqlInitTablesStrategy mysqlInitTablesStrategy;
private final PgSqlInitTablesStrategy pgSqlInitTablesStrategy;
@PostConstruct
public void register() {
FACTORY.put(DataBaseEnum.MY_SQL.getType(), mysqlInitTablesStrategy);
FACTORY.put(DataBaseEnum.POSTGRE_SQL.getType(), pgSqlInitTablesStrategy);
}
public static InitTablesStrategy getStrategy(String name) {
InitTablesStrategy strategy = FACTORY.get(name);
if (Objects.isNull(strategy)) {
throw new ServiceException("[ InitTablesStrategy ]策略工厂异常, 类型:[" + name + "]找不到相对应的策略");
}
return strategy;
}
}

View File

@ -0,0 +1,67 @@
package com.qiaoba.module.tenant.init.impl;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.sql.SqlExecutor;
import cn.hutool.http.HttpStatus;
import com.qiaoba.common.base.code.DatasourceErrorCode;
import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.database.util.DbUtil;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import com.qiaoba.module.tenant.init.InitTablesStrategy;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 初始化表策略-Mysql
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 16:01
*/
@Service
public class MysqlInitTablesStrategy implements InitTablesStrategy {
public static final String CREATE_MYSQL_DB_SQL = "CREATE DATABASE `{}` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';";
@Override
public TenantInitVo create(Connection conn, String schema) {
try {
// 创建库
SqlExecutor.execute(conn, StrUtil.format(CREATE_MYSQL_DB_SQL, schema, schema));
} catch (SQLException e) {
IoUtil.close(conn);
return new TenantInitVo(DatasourceErrorCode.CREATE_SCHEMA_ERROR.getCode(), e.getMessage());
}
try {
// 切换 Schema
DbUtil.setSchema(TenantDbTypeContext.getDefault(), conn, schema);
DbUtil.runScript(conn, "MySQL/table/base_tables");
return new TenantInitVo(HttpStatus.HTTP_OK, null);
} catch (SQLException e) {
return new TenantInitVo(DatasourceErrorCode.SWITCH_SCHEMA_ERROR.getCode(), e.getMessage());
} catch (IOException e) {
return new TenantInitVo(DatasourceErrorCode.CREATE_TABLE_ERROR.getCode(), e.getMessage());
} finally {
IoUtil.close(conn);
}
}
@Override
public TenantInitVo create(Connection conn) {
try {
DbUtil.runScript(conn, "MySQL/table/base_tables");
return new TenantInitVo(HttpStatus.HTTP_OK, null);
} catch (IOException e) {
return new TenantInitVo(DatasourceErrorCode.CREATE_TABLE_ERROR.getCode(), e.getMessage());
} finally {
IoUtil.close(conn);
}
}
}

View File

@ -0,0 +1,56 @@
package com.qiaoba.module.tenant.init.impl;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpStatus;
import com.qiaoba.common.base.code.DatasourceErrorCode;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.database.util.DbUtil;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import com.qiaoba.module.tenant.init.InitTablesStrategy;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 初始化表策略-Mysql
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 16:01
*/
@Service
public class PgSqlInitTablesStrategy implements InitTablesStrategy {
private static final String CREATE_PGSQL_SCHEMA_SQL = "CREATE SCHEMA \"{}\";";
@Override
public TenantInitVo create(Connection conn, String schema) {
try {
// 新建模式
DbUtil.runSql(conn, StrUtil.format(CREATE_PGSQL_SCHEMA_SQL, schema));
// 切换模式
DbUtil.setSchema(DataBaseEnum.POSTGRE_SQL.getType(), conn, schema);
// 执行SQL
return create(conn);
} catch (SQLException e) {
return new TenantInitVo(DatasourceErrorCode.CREATE_SCHEMA_ERROR.getCode(), e.getMessage());
} finally {
IoUtil.close(conn);
}
}
@Override
public TenantInitVo create(Connection conn) {
try {
DbUtil.runScript(conn, "init/table/PostgreSQL/create_tables");
return new TenantInitVo(HttpStatus.HTTP_OK, null);
} catch (IOException e) {
return new TenantInitVo(DatasourceErrorCode.CREATE_TABLE_ERROR.getCode(), e.getMessage());
} finally {
IoUtil.close(conn);
}
}
}

View File

@ -0,0 +1,42 @@
package com.qiaoba.module.tenant.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 租户数据源 数据层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:47
*/
public interface SysTenantDatasourceMapper extends BaseMapper<SysTenantDatasource> {
/**
* 查询所有数据源模式的租户ID
*
* @return tenantIds
*/
List<String> selectTenantIds();
/**
* 通过IP查询租户数据源信息 todo select *
*
* @param tenantId 租户ID
* @param ip ip
* @return 数据源信息
*/
SysTenantDatasource selectByIp(@Param("tenantId") String tenantId, @Param("ip") String ip);
/**
* 将租户下的除datasourceId之外的其他数据源设置为备用
*
* @param tenantId tenantId
* @param excludeId 排除Id
* @param code 否
*/
void setBackupDatasourceExcludeId(@Param("tenantId") String tenantId, @Param("excludeId") String excludeId, @Param("code") String code);
}

View File

@ -0,0 +1,24 @@
package com.qiaoba.module.tenant.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.api.tenant.entity.SysTenant;
import com.qiaoba.common.database.annotation.SelectOneRow;
/**
* 租户管理 数据层
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 11:08
*/
public interface SysTenantMapper extends BaseMapper<SysTenant> {
/**
* 检查公司名称是否存在
*
* @param sysTenant sysTenant
* @return 已存在的名称
*/
@SelectOneRow
String checkCompanyNameIsExist(SysTenant sysTenant);
}

View File

@ -0,0 +1,30 @@
package com.qiaoba.module.tenant.runner;
import com.qiaoba.common.base.constant.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Service;
/**
* 项目启动完成后-将主库中的租户信息同步到 Redis 中
*
* @author ailanyin
* @version 1.0
* @since 2022-09-22 04:20:28
*/
@Service
@RequiredArgsConstructor
public class SysTenantRunner implements ApplicationRunner {
private final SysTenantService sysTenantService;
@Override
public void run(ApplicationArguments args) throws Exception {
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
sysTenantService.resetCache();
BaseContext.clearTenantId();
}
}

View File

@ -0,0 +1,115 @@
package com.qiaoba.module.tenant.service;
import com.qiaoba.api.tenant.entity.SysTenantDatasource;
import com.qiaoba.api.tenant.entity.param.SysTenantDatasourceParam;
import com.qiaoba.common.database.entity.DynamicDataSource;
import java.util.List;
/**
* 租户数据源 服务层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:48
*/
public interface SysTenantDatasourceService {
/**
* 查询租户的主要数据源
*
* @param tenantId 租户ID
* @return 数据源
*/
SysTenantDatasource selectPrimary(String tenantId);
/**
* 查询租户的主要数据源
*
* @param tenantId 租户ID
* @param allowNull 允许空
* @return 数据源
*/
SysTenantDatasource selectPrimary(String tenantId, boolean allowNull);
/**
* 通过IP查询
*
* @param tenantId tenantId
* @param ip ip
* @return obj
*/
SysTenantDatasource selectByIp(String tenantId, String ip);
/**
* 新增
*
* @param sysTenantDatasource sysTenantDatasource
* @return 结果
*/
int insert(SysTenantDatasource sysTenantDatasource);
/**
* 修改
*
* @param sysTenantDatasource sysTenantDatasource
* @return 结果
*/
int updateById(SysTenantDatasource sysTenantDatasource);
/**
* 批量删除
*
* @param ids ids
* @return 结果
*/
int deleteByIds(List<String> ids);
/**
* 查询租户的所有数据源
*
* @param tenantId tenantId
* @return list
*/
List<SysTenantDatasource> selectList(String tenantId);
/**
* 查询租户数据源
*
* @param param 条件
* @return list
*/
List<SysTenantDatasource> selectList(SysTenantDatasourceParam param);
/**
* 查询所有数据源模式的租户ID
*
* @return tenantIds
*/
List<String> selectTenantIds();
/**
* 将租户下的除datasourceId之外的其他数据源设置为备用
*
* @param tenantId tenantId
* @param excludeId 排除Id
*/
void setBackupDatasourceExcludeId(String tenantId, String excludeId);
/**
* 切换为主数据源
*
* @param tenantId 租户ID
* @param datasourceId 数据源ID
* @return 结果
*/
int switchPrimary(String tenantId, String datasourceId);
/**
* datasource2DynamicDataSource
*
* @param datasource 数据源
* @return 数据源
*/
DynamicDataSource transform(SysTenantDatasource datasource);
}

View File

@ -0,0 +1,48 @@
package com.qiaoba.module.tenant.service;
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import java.sql.SQLException;
/**
* 租户初始化 服务层
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 9:06
*/
public interface SysTenantInitService {
/**
* 初始化之前的检查
*
* @param tenantId 租户ID
* @return 检查结果信息
*/
TenantInitCheckVo check(String tenantId);
/**
* 创建表
*
* @param tenantId 租户ID
* @return 结果
*/
TenantInitVo createTables(String tenantId);
/**
* 导入表数据
*
* @param tenantId 租户ID
* @return 结果
* @throws SQLException SQLException
*/
TenantInitVo initData(String tenantId) throws SQLException;
/**
* 初始化完毕
*
* @param tenantId 租户ID
*/
void initCompleted(String tenantId);
}

View File

@ -0,0 +1,79 @@
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;
/**
* 租户管理 服务层
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 10:55
*/
public interface SysTenantService {
/**
* 新增租户
*
* @param sysTenant 租户信息
* @return 结果
*/
int insert(SysTenant sysTenant);
/**
* 修改租户
*
* @param sysTenant 租户信息
* @return 结果
*/
int update(SysTenant sysTenant);
/**
* 获取租户列表
*
* @param param param
* @param pageQuery 分页参数
* @return list
*/
TableDataInfo<SysTenant> selectPageList(SysTenantParam param, PageQuery pageQuery);
/**
* 查询详情
*
* @param tenantId tenantId
* @return info
*/
SysTenant selectById(String tenantId);
/**
* 查询租户信息
*
* @param tenantId 租户ID
* @param allowNull 是否允许为空
* @return 租户信息
*/
SysTenant selectById(String tenantId, Boolean allowNull);
/**
* 在缓存中查询详情
*
* @param tenantId tenantId
* @return info
*/
SysTenant selectFromCache(String tenantId);
/**
* 更改状态
*
* @param tenantId tenantId
* @param status status
*/
void updateStatus(String tenantId, String status);
/**
* 更新缓存
*/
void resetCache();
}

View File

@ -0,0 +1,73 @@
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.exception.ServiceException;
import com.qiaoba.common.database.entity.DynamicDataSource;
import com.qiaoba.common.database.service.DynamicDatasourceService;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 动态数据源接口
*
* @author ailanyin
* @version 1.0
* @since 2023/6/9 13:16
*/
@Service
@RequiredArgsConstructor
public class DynamicDatasourceServiceImpl implements DynamicDatasourceService {
private final SysTenantDatasourceService sysTenantDatasourceService;
@Override
public Map<String, List<DynamicDataSource>> loadAllTenantDatasource() {
Map<String, List<DynamicDataSource>> datasourceMap = new LinkedHashMap<>();
List<String> tenantIds = sysTenantDatasourceService.selectTenantIds();
for (String tenantId : tenantIds) {
List<SysTenantDatasource> datasourceList = sysTenantDatasourceService.selectList(new SysTenantDatasourceParam(tenantId));
datasourceMap.put(tenantId, transformList(datasourceList));
}
return datasourceMap;
}
@Override
public void changePrimaryDatasource(String tenantId, String datasourceId) {
// 将该数据源设置为主要数据源
SysTenantDatasource sysTenantDatasource = new SysTenantDatasource();
sysTenantDatasource.setDatasourceId(datasourceId);
sysTenantDatasource.setIsPrimary(BaseEnum.YES.getCode());
sysTenantDatasourceService.updateById(sysTenantDatasource);
// 将该租户下的其他数据源设置为非主要数据源
sysTenantDatasourceService.setBackupDatasourceExcludeId(tenantId, datasourceId);
}
@Override
public DynamicDataSource selectByIp(String tenantId, String ip) {
SysTenantDatasource sysTenantDatasource = sysTenantDatasourceService.selectByIp(tenantId, ip);
if (Objects.isNull(sysTenantDatasource)) {
throw new ServiceException(StrUtil.format("未找到数据源,查询方式: {}", ip));
}
return transform(sysTenantDatasource);
}
private List<DynamicDataSource> transformList(List<SysTenantDatasource> datasourceList) {
List<DynamicDataSource> dynamicDataSourceList = new ArrayList<>();
for (SysTenantDatasource datasource : datasourceList) {
dynamicDataSourceList.add(transform(datasource));
}
return dynamicDataSourceList;
}
private DynamicDataSource transform(SysTenantDatasource datasource) {
return sysTenantDatasourceService.transform(datasource);
}
}

View File

@ -0,0 +1,180 @@
package com.qiaoba.module.tenant.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.pool.DruidDataSource;
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.constant.BaseConstant;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.base.exception.ServiceException;
import com.qiaoba.common.database.config.DynamicDataSourceConfig;
import com.qiaoba.common.database.context.BackupDatasourceContext;
import com.qiaoba.common.database.context.PrimaryDatasourceContext;
import com.qiaoba.common.database.entity.DynamicDataSource;
import com.qiaoba.common.database.util.DatasourceUtil;
import com.qiaoba.common.database.util.JdbcUtil;
import com.qiaoba.module.tenant.mapper.SysTenantDatasourceMapper;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
/**
* 租户数据源 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 14:49
*/
@Service
@RequiredArgsConstructor
public class SysTenantDatasourceServiceImpl implements SysTenantDatasourceService {
private final SysTenantDatasourceMapper sysTenantDatasourceMapper;
@Override
public SysTenantDatasource selectPrimary(String tenantId) {
return sysTenantDatasourceMapper.selectOne(paramToWrapper(new SysTenantDatasourceParam(tenantId, BaseEnum.YES.getCode())));
}
@Override
public SysTenantDatasource selectPrimary(String tenantId, boolean allowNull) {
SysTenantDatasource primary = selectPrimary(tenantId);
if (!allowNull && Objects.isNull(primary)) {
throw new ServiceException(DatasourceErrorCode.NOT_FIND.getCode(), DatasourceErrorCode.NOT_FIND.getMsg());
}
return primary;
}
@Override
public SysTenantDatasource selectByIp(String tenantId, String ip) {
SysTenantDatasourceParam param = new SysTenantDatasourceParam(tenantId);
param.setIp(ip);
return sysTenantDatasourceMapper.selectOne(paramToWrapper(param));
}
@Override
public int insert(SysTenantDatasource sysTenantDatasource) {
DynamicDataSource dynamicDataSource = transform(sysTenantDatasource);
boolean connect = JdbcUtil.checkConnect(dynamicDataSource.getDriver(), dynamicDataSource.getUrl(), dynamicDataSource.getUsername(), dynamicDataSource.getPassword());
if (!connect) {
// 连接不可用
throw new ServiceException(DatasourceErrorCode.CONNECT_ERROR.getCode(), DatasourceErrorCode.CONNECT_ERROR.getMsg());
}
int result = sysTenantDatasourceMapper.insert(sysTenantDatasource);
if (result > BaseConstant.HANDLE_ERROR) {
// 添加到备用数据源
BackupDatasourceContext.addBackupMap(sysTenantDatasource.getTenantId(), dynamicDataSource);
}
return result;
}
@Override
public int updateById(SysTenantDatasource sysTenantDatasource) {
DynamicDataSource dynamicDataSource = transform(sysTenantDatasource);
boolean connect = JdbcUtil.checkConnect(dynamicDataSource.getDriver(), dynamicDataSource.getUrl(), dynamicDataSource.getUsername(), dynamicDataSource.getPassword());
if (!connect) {
// 连接不可用
throw new ServiceException(DatasourceErrorCode.CONNECT_ERROR.getCode(), DatasourceErrorCode.CONNECT_ERROR.getMsg());
}
int result = sysTenantDatasourceMapper.updateById(sysTenantDatasource);
if (result > BaseConstant.HANDLE_ERROR) {
// 更新备用数据源
BackupDatasourceContext.updateBackupMap(sysTenantDatasource.getTenantId(), dynamicDataSource);
}
return result;
}
@Override
public int deleteByIds(List<String> ids) {
// 删除备用Map
return sysTenantDatasourceMapper.deleteBatchIds(ids);
}
@Override
public List<SysTenantDatasource> selectList(String tenantId) {
return sysTenantDatasourceMapper.selectList(paramToWrapper(new SysTenantDatasourceParam(tenantId)));
}
@Override
public List<SysTenantDatasource> selectList(SysTenantDatasourceParam param) {
return sysTenantDatasourceMapper.selectList(paramToWrapper(param));
}
@Override
public List<String> selectTenantIds() {
return sysTenantDatasourceMapper.selectTenantIds();
}
@Override
public void setBackupDatasourceExcludeId(String tenantId, String excludeId) {
sysTenantDatasourceMapper.setBackupDatasourceExcludeId(tenantId, excludeId, BaseEnum.NO.getCode());
}
@Override
@Transactional(rollbackFor = Exception.class)
public int switchPrimary(String tenantId, String datasourceId) {
SysTenantDatasource datasource = sysTenantDatasourceMapper.selectById(datasourceId);
DynamicDataSource dynamicDataSource = transform(datasource);
Object dataSource = DatasourceUtil.buildDataSource(tenantId, dynamicDataSource);
if (Objects.isNull(dataSource)) {
// 连接不可用
throw new ServiceException(DatasourceErrorCode.CONNECT_ERROR.getCode(), DatasourceErrorCode.CONNECT_ERROR.getMsg());
}
// 更新其他的为非主要
setBackupDatasourceExcludeId(tenantId, datasourceId);
// 更新他为主要
datasource.setIsPrimary(BaseEnum.YES.getCode());
int result = updateById(datasource);
// 刷新PrimaryDatasourceMap
if (result > BaseConstant.HANDLE_ERROR) {
// 更新新得数据源为租户主要数据源
DatasourceUtil.changePrimaryDatasource(tenantId, dataSource);
// 将老的租户数据源设置为备用
Object oldDataSource = PrimaryDatasourceContext.get(tenantId);
if (Objects.nonNull(oldDataSource)) {
DruidDataSource druidDataSource = ((DruidDataSource) oldDataSource);
String ip = DataBaseEnum.getIp(druidDataSource.getUrl(), druidDataSource.getDriverClassName());
SysTenantDatasource sysTenantDatasource = sysTenantDatasourceMapper.selectByIp(tenantId, ip);
BackupDatasourceContext.addBackupMap(tenantId, transform(sysTenantDatasource));
druidDataSource.close();
}
} else {
IoUtil.close((DruidDataSource) dataSource);
}
return result;
}
public int test(String tenantId, String datasourceId) {
List<DynamicDataSource> dataSources = BackupDatasourceContext.get(tenantId);
return 0;
}
@Override
public DynamicDataSource transform(SysTenantDatasource datasource) {
DynamicDataSource dynamicDataSource = BeanUtil.copyProperties(datasource, DynamicDataSource.class);
dynamicDataSource.setInitialSize(datasource.getInitCount());
dynamicDataSource.setMinIdle(datasource.getMinCount());
dynamicDataSource.setMaxActive(datasource.getMaxCount());
dynamicDataSource.setDriver(DataBaseEnum.getDriver(datasource.getType()));
dynamicDataSource.setUrl(DataBaseEnum.getUrl(datasource.getType(), datasource.getIp(), datasource.getPort(), datasource.getDbName(), datasource.getSchemaName()));
return dynamicDataSource;
}
private QueryWrapper<SysTenantDatasource> paramToWrapper(SysTenantDatasourceParam param) {
QueryWrapper<SysTenantDatasource> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(StrUtil.isNotBlank(param.getTenantId()), SysTenantDatasource::getTenantId, param.getTenantId())
.eq(StrUtil.isNotBlank(param.getIp()), SysTenantDatasource::getIp, param.getIp())
.eq(StrUtil.isNotBlank(param.getIsPrimary()), SysTenantDatasource::getIsPrimary, param.getIsPrimary());
return wrapper;
}
}

View File

@ -0,0 +1,209 @@
package com.qiaoba.module.tenant.service.impl;
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.BaseEnum;
import com.qiaoba.common.base.enums.DataBaseEnum;
import com.qiaoba.common.base.exception.ServiceException;
import com.qiaoba.common.database.context.PrimaryDatasourceContext;
import com.qiaoba.common.database.context.TenantDbTypeContext;
import com.qiaoba.common.database.properties.TenantSchema;
import com.qiaoba.common.database.util.DbUtil;
import com.qiaoba.common.database.util.JdbcUtil;
import com.qiaoba.module.tenant.entity.vo.TenantInitCheckVo;
import com.qiaoba.module.tenant.entity.vo.TenantInitVo;
import com.qiaoba.module.tenant.init.InitTablesStrategyFactory;
import com.qiaoba.module.tenant.service.SysTenantDatasourceService;
import com.qiaoba.module.tenant.service.SysTenantInitService;
import com.qiaoba.module.tenant.service.SysTenantService;
import com.qiaoba.module.tenant.util.InitDataUtil;
import com.qiaoba.module.tenant.util.MenuUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Objects;
/**
* 租户初始化 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/6/27 9:07
*/
@Service
@RequiredArgsConstructor
public class SysTenantInitServiceImpl implements SysTenantInitService {
private final SysTenantService sysTenantService;
private final SysTenantDatasourceService sysTenantDatasourceService;
@Override
public TenantInitCheckVo check(String tenantId) {
// 1. 查询租户信息, 获取租户名称|租户模式
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
checkInitialized(sysTenant);
// 2. 租户模式 = 3 数据源模式
if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
// 3. 根据租户ID查询主要数据源(1条)
SysTenantDatasource datasource = sysTenantDatasourceService.selectPrimary(tenantId);
// 4. 若没有主要数据源, 返回 未找到数据源信息
if (Objects.isNull(datasource)) {
return new TenantInitCheckVo(sysTenant.getCompanyName(), sysTenant.getMode(), DatasourceErrorCode.NOT_FIND.getCode(), DatasourceErrorCode.NOT_FIND.getMsg());
}
Connection connection = null;
try {
connection = JdbcUtil.connection(DataBaseEnum.getDriver(datasource.getType()),
DataBaseEnum.getUrl(datasource.getType(), datasource.getIp(), datasource.getPort(), datasource.getDbName(), datasource.getSchemaName()),
datasource.getUsername(), datasource.getPassword());
// 检查 SCHEMA 是否存在
if (StrUtil.isNotBlank(datasource.getSchemaName())) {
Boolean schemaExist = DbUtil.checkSchema(datasource.getType(), connection, datasource.getSchemaName());
if (!schemaExist) {
// 6. 数据源无法连接, 返回
return new TenantInitCheckVo(sysTenant.getCompanyName(), sysTenant.getMode(), datasource,
DatasourceErrorCode.SCHEMA_NOT_EXIST_ERROR.getCode(), StrUtil.format(DatasourceErrorCode.SCHEMA_NOT_EXIST_ERROR.getMsg(), datasource.getSchemaName()));
}
}
} catch (Exception e) {
// 6. 数据源无法连接, 返回
return new TenantInitCheckVo(sysTenant.getCompanyName(), sysTenant.getMode(), datasource, DatasourceErrorCode.CONNECT_ERROR.getCode(), e.getMessage());
} finally {
IoUtil.close(connection);
}
// 7. 全部正常
return new TenantInitCheckVo(sysTenant.getCompanyName(), sysTenant.getMode(), datasource, HttpStatus.HTTP_OK, null);
}
return new TenantInitCheckVo(sysTenant.getCompanyName(), sysTenant.getMode(), HttpStatus.HTTP_OK, null);
}
@Override
public TenantInitVo createTables(String tenantId) {
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
checkInitialized(sysTenant);
// 字段模式
if (TenantModeEnum.isColumn(sysTenant.getMode())) {
return new TenantInitVo(HttpStatus.HTTP_OK, "字段模式, 无需新建表");
}
// Schema模式
if (TenantModeEnum.isSchema(sysTenant.getMode())) {
Connection connection = null;
try {
// 获取主库Connection 和 Schema
DruidDataSource dataSource = (DruidDataSource) PrimaryDatasourceContext.getDefault();
// 创建新的连接
connection = JdbcUtil.getConnection(dataSource.getDriverClassName(), dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
return InitTablesStrategyFactory.getStrategy(TenantDbTypeContext.getDefault()).create(connection, TenantSchema.getSchema(tenantId));
} catch (Exception e) {
e.printStackTrace();
} finally {
IoUtil.close(connection);
}
}
// 数据源模式
if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
primary.getUsername(), primary.getPassword());
return InitTablesStrategyFactory.getStrategy(primary.getType()).create(connection);
}
return new TenantInitVo(TenantErrorCode.MODE_NOT_FIND.getCode(), TenantErrorCode.MODE_NOT_FIND.getMsg());
}
@Override
public TenantInitVo initData(String tenantId) throws SQLException {
SysTenant sysTenant = sysTenantService.selectById(tenantId, false);
checkInitialized(sysTenant);
// 字段模式
if (TenantModeEnum.isColumn(sysTenant.getMode())) {
// 获取默认租户的主数据源
DataSource dataSource = (DataSource) PrimaryDatasourceContext.getDefault();
// 初始化
return init(dataSource.getConnection(), tenantId);
}
// SCHEMA
else if (TenantModeEnum.isSchema(sysTenant.getMode())) {
// 获取主库Connection 和 Schema
DruidDataSource dataSource = (DruidDataSource) PrimaryDatasourceContext.getDefault();
// 创建新的连接
Connection connection = JdbcUtil.getConnection(dataSource.getDriverClassName(), dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
String dbType = TenantDbTypeContext.getDefault();
DbUtil.setSchema(dbType, connection, TenantSchema.getSchema(tenantId));
// 初始化
return init(connection, tenantId);
}
// Datasource
else if (TenantModeEnum.isDatasource(sysTenant.getMode())) {
SysTenantDatasource primary = sysTenantDatasourceService.selectPrimary(tenantId, false);
Connection connection = JdbcUtil.getConnection(DataBaseEnum.getDriver(primary.getType()),
DataBaseEnum.getUrl(primary.getType(), primary.getIp(), primary.getPort(), primary.getDbName(), primary.getSchemaName()),
primary.getUsername(), primary.getPassword());
// 初始化
return init(connection, tenantId);
}
return new TenantInitVo(TenantErrorCode.MODE_NOT_FIND.getCode(), TenantErrorCode.MODE_NOT_FIND.getMsg());
}
@Override
public void initCompleted(String tenantId) {
SysTenant sysTenant = new SysTenant();
sysTenant.setTenantId(tenantId);
sysTenant.setInitialized(BaseEnum.YES.getCode());
sysTenantService.update(sysTenant);
}
private void checkInitialized(SysTenant sysTenant) {
if (BaseEnum.YES.getCode().equals(sysTenant.getInitialized())) {
throw new ServiceException(TenantErrorCode.INITIALIZED.getCode(), TenantErrorCode.INITIALIZED.getMsg());
}
}
private TenantInitVo init(Connection conn, String tenantId) {
try {
// 手动提交
conn.setAutoCommit(false);
// 处理 sys_config
InitDataUtil.handleSysConfig(conn, tenantId, "init/data/sys_config_data");
// 处理 sys_post
InitDataUtil.handleSysPost(conn, tenantId, "init/data/sys_post_data");
// 处理 sys_role
InitDataUtil.handleSysRole(conn, tenantId, "init/data/sys_role_data");
// 处理 sys_user
InitDataUtil.handleSysUser(conn, tenantId, "init/data/sys_user_data");
// 处理 sys_user_role
InitDataUtil.bindUserAndRole(conn, tenantId);
// 处理 sys_menu
MenuUtil.handleMenu(conn, tenantId);
// 处理 sys_role_menu
InitDataUtil.bindRoleAndMenu(conn, tenantId);
conn.commit();
return new TenantInitVo(HttpStatus.HTTP_OK, null);
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
return new TenantInitVo(DatasourceErrorCode.INIT_DATA_ERROR.getCode(), e.getMessage());
} finally {
InitDataUtil.removeLocal();
cn.hutool.db.DbUtil.close(conn);
}
}
}

View File

@ -0,0 +1,154 @@
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.SysTenant;
import com.qiaoba.api.tenant.entity.param.SysTenantParam;
import com.qiaoba.api.tenant.service.SysTenantApiService;
import com.qiaoba.api.auth.utils.SecurityUtil;
import com.qiaoba.common.base.code.TenantErrorCode;
import com.qiaoba.common.base.constant.BaseConstant;
import com.qiaoba.common.base.constant.TenantConstant;
import com.qiaoba.common.base.context.BaseContext;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.exception.ServiceException;
import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.common.redis.service.RedisService;
import com.qiaoba.module.tenant.mapper.SysTenantMapper;
import com.qiaoba.module.tenant.service.SysTenantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 租户管理 服务层实现
*
* @author ailanyin
* @version 1.0
* @since 2023/5/30 10:55
*/
@Configuration
@RequiredArgsConstructor
@Slf4j
public class SysTenantServiceImpl implements SysTenantService, SysTenantApiService {
private final SysTenantMapper sysTenantMapper;
private final RedisService redisService;
@Override
public int insert(SysTenant sysTenant) {
checkCompanyNameIsExist(sysTenant);
sysTenant.setCreateTime(new Date());
sysTenant.setCreateUser(SecurityUtil.getLoginUsername());
sysTenant.setStatus(BaseEnum.NORMAL.getCode());
sysTenant.setInitialized(BaseEnum.NO.getCode());
int result = sysTenantMapper.insert(sysTenant);
if (result > BaseConstant.HANDLE_ERROR) {
toCache(sysTenant);
}
return result;
}
@Override
public int update(SysTenant sysTenant) {
checkCompanyNameIsExist(sysTenant);
sysTenant.setUpdateTime(new Date());
sysTenant.setUpdateUser(SecurityUtil.getLoginUsername());
int result = sysTenantMapper.updateById(sysTenant);
if (result > BaseConstant.HANDLE_ERROR) {
toCache(sysTenant);
}
return result;
}
@Override
public TableDataInfo<SysTenant> selectPageList(SysTenantParam param, PageQuery pageQuery) {
return TableDataInfo.build(sysTenantMapper.selectPage(pageQuery.build(), param2Wrapper(param)));
}
@Override
public SysTenant selectById(String tenantId) {
return sysTenantMapper.selectById(tenantId);
}
@Override
public SysTenant selectById(String tenantId, Boolean allowNull) {
SysTenant sysTenant = selectById(tenantId);
if (!allowNull) {
if (Objects.isNull(sysTenant)) {
throw new ServiceException(TenantErrorCode.NOT_FIND.getCode(), TenantErrorCode.NOT_FIND.getMsg());
}
}
return sysTenant;
}
@Override
public SysTenant selectFromCache(String tenantId) {
BaseContext.setTenantId(TenantConstant.DEFAULT_TENANT_ID);
SysTenant sysTenant = redisService.getObject(TenantConstant.TENANT_INFO_KEY_PREFIX + tenantId, SysTenant.class);
BaseContext.clearTenantId();
return sysTenant;
}
@Override
public void updateStatus(String tenantId, String status) {
sysTenantMapper.updateById(new SysTenant(tenantId, status));
toCache(selectById(tenantId));
}
@Override
public void resetCache() {
List<SysTenant> sysTenants = sysTenantMapper.selectList(param2Wrapper(new SysTenantParam()));
for (SysTenant sysTenant : sysTenants) {
toCache(sysTenant);
}
}
private QueryWrapper<SysTenant> param2Wrapper(SysTenantParam param) {
QueryWrapper<SysTenant> wrapper = new QueryWrapper<>();
wrapper.lambda()
.eq(StrUtil.isNotBlank(param.getStatus()), SysTenant::getStatus, param.getStatus())
.like(StrUtil.isNotBlank(param.getCompanyName()), SysTenant::getCompanyName, param.getCompanyName())
.like(StrUtil.isNotBlank(param.getContactName()), SysTenant::getContactName, param.getContactName());
// 查未过期
if (SysTenantParam.TYPE_NOT_EXPIRED.equals(param.getType())) {
wrapper.lambda().ge(Objects.nonNull(param.getTime()), SysTenant::getExpireTime, param.getTime());
}
// 查已过期
else {
wrapper.lambda().lt(Objects.nonNull(param.getTime()), SysTenant::getExpireTime, param.getTime());
}
// 登录接口, 只返回 ID/Name/Mode
if (param.getIsLogin()) {
wrapper.lambda()
.select(SysTenant::getCompanyName, SysTenant::getTenantId, SysTenant::getMode);
}
return wrapper;
}
private void toCache(SysTenant sysTenant) {
log.debug("加载租户信息进缓存, 租户ID: {}", sysTenant.getTenantId());
redisService.set(TenantConstant.TENANT_INFO_KEY_PREFIX + sysTenant.getTenantId(), sysTenant);
}
private void checkCompanyNameIsExist(SysTenant sysTenant) {
String companyName = sysTenantMapper.checkCompanyNameIsExist(sysTenant);
if (StrUtil.isNotBlank(companyName)) {
throw new ServiceException(TenantErrorCode.TENANT_NAME_EXIST.getCode(), TenantErrorCode.TENANT_NAME_EXIST.getMsg());
}
}
@Override
public List<SysTenant> selectList(SysTenantParam param) {
return sysTenantMapper.selectList(param2Wrapper(param));
}
}

View File

@ -0,0 +1,123 @@
package com.qiaoba.module.tenant.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.database.util.DbUtil;
import org.springframework.core.io.ClassPathResource;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.util.List;
/**
* 数据初始化工具类
*
* @author ailanyin
* @version 1.0
* @since 2023/6/5 16:28
*/
public class InitDataUtil {
private InitDataUtil() {
}
/**
* 角色-超管ID
*/
private static final ThreadLocal<Long> ROLE_SUPER_ADMIN_ID = new ThreadLocal<>();
/**
* 用户-超管ID
*/
private static final ThreadLocal<Long> USER_SUPER_ADMIN_ID = new ThreadLocal<>();
public static void removeLocal() {
ROLE_SUPER_ADMIN_ID.remove();
USER_SUPER_ADMIN_ID.remove();
}
public static void handleSysConfig(Connection conn, String tenantId, String filePath) throws Exception {
handleSql(conn, tenantId, filePath);
}
public static void handleSysPost(Connection conn, String tenantId, String filePath) throws Exception {
handleSql(conn, tenantId, filePath);
}
public static void handleSysRole(Connection conn, String tenantId, String filePath) throws Exception {
handleUserOrRole(conn, tenantId, filePath, true);
}
private static void handleUserOrRole(Connection conn, String tenantId, String filePath, Boolean isRole) throws Exception {
ClassPathResource resource = new ClassPathResource(filePath);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
long superAdminId = new Snowflake().nextId();
if (isRole) {
ROLE_SUPER_ADMIN_ID.set(superAdminId);
} else {
USER_SUPER_ADMIN_ID.set(superAdminId);
}
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);
if (StrUtil.isBlank(line)) {
continue;
}
if (i == 0) {
// 第1行是超管
line = StrUtil.format(line, superAdminId, tenantId);
} else {
Snowflake snowflake = new Snowflake();
line = StrUtil.format(line, snowflake.nextId(), tenantId);
}
sb.append(line);
}
String sql = sb.toString();
if (StrUtil.isNotBlank(sql)) {
DbUtil.runSql(conn, sql);
}
}
public static void handleSysUser(Connection conn, String tenantId, String filePath) throws Exception {
handleUserOrRole(conn, tenantId, filePath, false);
}
public static void bindUserAndRole(Connection conn, String tenantId) throws Exception {
// user_id role_id tenant_id
String sql = StrUtil.format("INSERT INTO sys_user_role VALUES ('{}', '{}', '{}');",
USER_SUPER_ADMIN_ID.get(),
ROLE_SUPER_ADMIN_ID.get(), tenantId);
DbUtil.runSql(conn, sql);
}
public static void bindRoleAndMenu(Connection conn, String tenantId) throws Exception {
String sql = "INSERT INTO sys_role_menu VALUES ('{}', '{}', '{}');";
StringBuilder sb = new StringBuilder();
List<String> menuIds = MenuUtil.getAllMenuIdsByTenantId(conn, tenantId);
for (String menuId : menuIds) {
sb.append(StrUtil.format(sql, ROLE_SUPER_ADMIN_ID.get(), menuId, tenantId));
}
String sbStr = sb.toString();
if (StrUtil.isNotBlank(sbStr)) {
DbUtil.runSql(conn, sbStr);
}
}
private static void handleSql(Connection conn, String tenantId, String filePath) throws Exception {
ClassPathResource resource = new ClassPathResource(filePath);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (StrUtil.isNotBlank(line)) {
Snowflake snowflake = new Snowflake();
line = StrUtil.format(line, snowflake.nextId(), tenantId);
sb.append(line);
}
}
String sql = sb.toString();
if (StrUtil.isNotBlank(sql)) {
DbUtil.runSql(conn, sql);
}
}
}

View File

@ -0,0 +1,126 @@
package com.qiaoba.module.tenant.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.StrUtil;
import com.qiaoba.common.database.util.DbUtil;
import org.springframework.core.io.ClassPathResource;
import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* 处理菜单工具类
*
* @author ailanyin
* @version 1.0
* @since 2023/6/7 11:01
*/
public class MenuUtil {
private MenuUtil() {
}
public static void handleMenu(Connection conn, String tenantId) throws Exception {
handleSystemMenu(conn, tenantId);
handleMonitorMenu(conn, tenantId);
}
private static void handleMonitorMenu(Connection conn, String tenantId) throws Exception {
long monitorId = new Snowflake().nextId();
String sql = "INSERT INTO sys_menu VALUES ('{}', '系统监控', 0, 2, 'monitor', NULL, '', 0, 0, 'M', '1', '', 'monitor', 'admin', '2023-05-27 22:25:03', '', NULL, '系统监控目录', '{}');";
sql = StrUtil.format(sql, monitorId, tenantId);
DbUtil.runSql(conn, sql);
// 登录用户
Long onlineUserId = handleMenu(conn, monitorId, tenantId, "init/data/sys_menu/monitor/online_user/menu");
handleButton(conn, tenantId, onlineUserId, "init/data/sys_menu/monitor/online_user/button");
}
private static void handleSystemMenu(Connection conn, String tenantId) throws Exception {
long systemId = new Snowflake().nextId();
String sql = "INSERT INTO sys_menu VALUES ('{}', '系统管理', 0, 1, 'system', NULL, '', 0, 0, 'M', '1', '', 'system', 'admin', '2023-04-23 14:35:29', '', NULL, '系统管理目录', '{}');";
sql = StrUtil.format(sql, systemId, tenantId);
DbUtil.runSql(conn, sql);
// 用户管理
Long userId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/user/menu");
handleButton(conn, tenantId, userId, "init/data/sys_menu/system/user/button");
// 角色管理
Long roleId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/role/menu");
handleButton(conn, tenantId, roleId, "init/data/sys_menu/system/role/button");
// 菜单管理
Long menuId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/menu/menu");
handleButton(conn, tenantId, menuId, "init/data/sys_menu/system/menu/button");
// 部门管理
Long deptId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/dept/menu");
handleButton(conn, tenantId, deptId, "init/data/sys_menu/system/dept/button");
// 岗位管理
Long postId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/post/menu");
handleButton(conn, tenantId, postId, "init/data/sys_menu/system/post/button");
// 字典管理
Long dictId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/dict/menu");
handleButton(conn, tenantId, dictId, "init/data/sys_menu/system/dict/button");
// 参数管理
Long configId = handleMenu(conn, systemId, tenantId, "init/data/sys_menu/system/config/menu");
handleButton(conn, tenantId, configId, "init/data/sys_menu/system/config/button");
}
private static Long handleMenu(Connection conn, Long systemId, String tenantId, String fileName) throws Exception {
long tempId = new Snowflake().nextId();
ClassPathResource resource = new ClassPathResource(fileName);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (StrUtil.isNotBlank(line)) {
line = StrUtil.format(line, tempId, systemId, tenantId);
sb.append(line);
}
}
if (StrUtil.isNotBlank(sb.toString())) {
DbUtil.runSql(conn, sb.toString());
}
return tempId;
}
private static void handleButton(Connection conn, String tenantId, Long parentId, String fileName) throws Exception {
ClassPathResource resource = new ClassPathResource(fileName);
List<String> lines = FileUtil.readLines(resource.getFile(), Charset.defaultCharset());
StringBuilder sb = new StringBuilder();
for (String line : lines) {
if (StrUtil.isNotBlank(line)) {
line = StrUtil.format(line, new Snowflake().nextId(), parentId, tenantId);
sb.append(line);
}
}
if (StrUtil.isNotBlank(sb.toString())) {
DbUtil.runSql(conn, sb.toString());
}
}
public static List<String> getAllMenuIdsByTenantId(Connection conn, String tenantId) throws SQLException {
List<String> menuIds = new ArrayList<>();
ResultSet resultSet = null;
Statement statement = null;
try {
statement = conn.createStatement();
resultSet = statement.executeQuery(StrUtil.format("SELECT menu_id FROM sys_menu where tenant_id = '{}'", tenantId));
while (resultSet.next()) {
String menuId = resultSet.getString("menu_id");
if (StrUtil.isNotBlank(menuId)) {
menuIds.add(menuId);
}
}
} finally {
IoUtil.close(resultSet);
IoUtil.close(statement);
}
return menuIds;
}
}

View File

@ -0,0 +1,7 @@
INSERT INTO sys_config VALUES ('{}', 'Token有效期', 'sys.token.expireTime', '96', 'Y', 'admin', '2023-05-25 13:22:50', 'admin', '2023-05-25 15:02:42', '单位:小时,仅支持正整数', '{}');
INSERT INTO sys_config VALUES ('{}', '账号黑名单开关', 'sys.account.blacklistOnOff', 'true', 'Y', 'admin', '2023-05-25 13:22:31', 'admin', '2023-05-25 13:57:14', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '账号注册开关', 'sys.account.registerUser', 'false', 'Y', 'admin', '2023-05-25 13:21:38', 'admin', '2023-05-25 15:07:00', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '登录验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', '2023-05-25 13:23:52', 'admin', '2023-06-05 13:43:00', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-light', 'Y', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-25 13:26:27', '深色主题theme-dark浅色主题theme-light', '{}');
INSERT INTO sys_config VALUES ('{}', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2022-08-15 18:01:28', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', '{}');
INSERT INTO sys_config VALUES ('{}', '账号允许同时在线', 'sys.account.allowBothOnline', 'true', 'Y', 'admin', '2023-05-28 14:28:05', 'admin', '2023-05-28 15:39:48', 'true允许false禁止', '{}');

View File

@ -0,0 +1,3 @@
INSERT INTO sys_menu VALUES ('{}', '在线查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'monitor:online:query', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '批量强退', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '单条强退', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '登录用户', '{}', 1, 'online', 'monitor/online/index', '', 0, 0, 'C', '1', 'monitor:online:list', 'online', 'admin', '2023-05-27 22:22:18', 'admin', '2023-05-30 09:49:35', '在线用户菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '参数查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'system:config:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数新增', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'system:config:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数修改', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'system:config:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数删除', '{}', 4, '#', '', '', 0, 0, 'F', '1', 'system:config:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '参数设置', '{}', 7, 'config', 'system/config/index', '', 0, 0, 'C', '1', 'system:config:list', 'edit', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-24 21:13:11', '参数设置菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '部门查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:dept:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:dept:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:dept:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:dept:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '部门管理', '{}', 4, 'dept', 'system/dept/index', '', 0, 0, 'C', '1', 'system:dept:list', 'tree', 'admin', '2023-04-23 14:35:29', '', NULL, '部门管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '字典查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'system:dict:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典新增', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'system:dict:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典修改', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'system:dict:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典删除', '{}', 4, '#', '', '', 0, 0, 'F', '1', 'system:dict:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典导出', '{}', 5, '#', '', '', 0, 0, 'F', '1', 'system:dict:export', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '字典管理', '{}', 6, 'dict', 'system/dict/index', '', 0, 0, 'C', '1', 'system:dict:list', 'documentation', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-31 11:15:14', '字典管理菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '菜单查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:menu:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:menu:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:menu:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:menu:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '菜单管理', '{}', 3, 'menu', 'system/menu/index', '', 0, 0, 'C', '1', 'system:menu:list', 'tree-table', 'admin', '2023-04-23 14:35:29', '', NULL, '菜单管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '岗位查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:post:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:post:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:post:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:post:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:post:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '岗位管理', '{}', 5, 'post', 'system/post/index', '', 0, 0, 'C', '1', 'system:post:list', 'post', 'admin', '2023-04-23 14:35:29', '', NULL, '岗位管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '角色查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:role:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:role:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:role:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:role:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:role:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '角色管理', '{}', 2, 'role', 'system/role/index', '', 0, 0, 'C', '1', 'system:role:list', 'peoples', 'admin', '2023-04-23 14:35:29', '', NULL, '角色管理菜单', '{}');

View File

@ -0,0 +1,7 @@
INSERT INTO sys_menu VALUES ('{}', '用户查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:user:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:user:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:user:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:user:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:user:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户导入', '{}', 6, '', '', '', 0, 0, 'F', '1', 'system:user:import', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '重置密码', '{}', 7, '', '', '', 0, 0, 'F', '1', 'system:user:resetPwd', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '用户管理', '{}', 1, 'user', 'system/user/index', '', 0, 0, 'C', '1', 'system:user:list', 'user', 'admin', '2023-04-23 14:35:29', '', NULL, '用户管理菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_post VALUES ('{}', 'ceo', '总经理', 1, '1', 'admin', '2023-05-19 14:06:53', 'admin', '2023-05-22 14:56:56', NULL, '{}');
INSERT INTO sys_post VALUES ('{}', 'cto', '技术总监', 2, '1', 'admin', '2023-05-19 14:07:06', 'admin', '2023-05-22 14:57:10', NULL,'{}');
INSERT INTO sys_post VALUES ('{}', 'hr', '人事', 3, '1', 'admin', '2023-05-19 14:07:16', '', NULL, NULL, '{}');
INSERT INTO sys_post VALUES ('{}', 'acct', '会计', 4, '1', 'admin', '2023-05-19 14:07:51', '', NULL, NULL, '{}');

View File

@ -0,0 +1,2 @@
INSERT INTO sys_role VALUES ('{}', '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', '{}');
INSERT INTO sys_role VALUES ('{}', '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_user VALUES ('{}', NULL, 'admin', '超级管理员', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', '', NULL, '', NULL, NULL, '{}');

View File

@ -0,0 +1,313 @@
/*
Navicat Premium Data Transfer
Source Server : 虚拟机-202
Source Server Type : MySQL
Source Server Version : 50742
Source Host : 192.168.0.202:3306
Source Schema : qiaoba-boot
Target Server Type : MySQL
Target Server Version : 50742
File Encoding : 65001
Date: 27/06/2023 13:18:39
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_config
-- ----------------------------
DROP TABLE IF EXISTS `sys_config`;
CREATE TABLE `sys_config` (
`config_id` bigint(20) NOT NULL COMMENT '参数主键',
`config_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '参数名称',
`config_key` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '参数键名',
`config_value` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '参数键值',
`config_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'N' COMMENT '系统内置Y是 N否',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`config_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_dept`;
CREATE TABLE `sys_dept` (
`dept_id` bigint(20) NOT NULL COMMENT '部门id',
`parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父部门id',
`ancestors` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '祖级列表',
`dept_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '部门名称',
`order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序',
`leader` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '负责人ID',
`phone` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
`email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '部门状态1正常 0停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_dict_data
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict_data`;
CREATE TABLE `sys_dict_data` (
`dict_code` bigint(20) NOT NULL COMMENT '字典编码',
`dict_sort` int(11) NULL DEFAULT 0 COMMENT '字典排序',
`dict_label` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典标签',
`dict_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典键值',
`dict_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典类型',
`css_class` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
`list_class` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表格回显样式',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0正常 1停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`dict_code`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典数据表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_dict_type
-- ----------------------------
DROP TABLE IF EXISTS `sys_dict_type`;
CREATE TABLE `sys_dict_type` (
`dict_id` bigint(20) NOT NULL COMMENT '字典主键',
`dict_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典名称',
`dict_type` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '字典类型',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '状态0正常 1停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`dict_id`) USING BTREE,
UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典类型表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_login_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_login_log`;
CREATE TABLE `sys_login_log` (
`login_id` bigint(20) NOT NULL,
`device_sn` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '设备编码',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录账号',
`nickname` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名称',
`ip` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '访问IP',
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录地点',
`browser` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '浏览器',
`os` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作系统',
`login_time` datetime NULL DEFAULT NULL COMMENT '登录时间',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`login_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '登录日志' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`menu_id` bigint(20) NOT NULL COMMENT '菜单ID',
`menu_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '菜单名称',
`parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父菜单ID',
`order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序',
`path` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '路由地址',
`component` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组件路径',
`query` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '路由参数',
`is_frame` int(11) NULL DEFAULT 1 COMMENT '是否为外链1是 0否',
`is_cache` int(11) NULL DEFAULT 0 COMMENT '是否缓存1缓存 0不缓存',
`menu_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '菜单类型M目录 C菜单 F按钮',
`is_visible` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '菜单状态1显示 0隐藏',
`perms` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '权限标识',
`icon` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '#' COMMENT '菜单图标',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL,
PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '菜单权限表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_post
-- ----------------------------
DROP TABLE IF EXISTS `sys_post`;
CREATE TABLE `sys_post` (
`post_id` bigint(20) NOT NULL COMMENT '岗位ID',
`post_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位编码',
`post_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位名称',
`post_sort` int(11) NOT NULL COMMENT '显示顺序',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '状态1正常 0停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`post_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '岗位信息表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_role`;
CREATE TABLE `sys_role` (
`role_id` bigint(20) NOT NULL COMMENT '角色ID',
`role_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色名称',
`role_key` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色权限字符串',
`role_sort` int(11) NOT NULL COMMENT '显示顺序',
`data_scope` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色状态1正常 0停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`role_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色信息表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_role_dept
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_dept`;
CREATE TABLE `sys_role_dept` (
`role_id` bigint(20) NOT NULL COMMENT '角色ID',
`dept_id` bigint(20) NOT NULL COMMENT '部门ID',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`role_id`, `dept_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_role_menu`;
CREATE TABLE `sys_role_menu` (
`role_id` bigint(20) NOT NULL COMMENT '角色ID',
`menu_id` bigint(20) NOT NULL COMMENT '菜单ID',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`role_id`, `menu_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_tenant
-- ----------------------------
DROP TABLE IF EXISTS `sys_tenant`;
CREATE TABLE `sys_tenant` (
`tenant_id` bigint(20) NOT NULL,
`company_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '公司名称',
`contact_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人名称',
`contact_phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系人电话',
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公司地址',
`profile` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公司简介',
`license_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码',
`domain` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '域名',
`expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
`account_count` bigint(20) NULL DEFAULT NULL COMMENT '用户数量',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态',
`mode` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模式',
`initialized` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '是否已初始化',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '租户表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_tenant_datasource
-- ----------------------------
DROP TABLE IF EXISTS `sys_tenant_datasource`;
CREATE TABLE `sys_tenant_datasource` (
`datasource_id` bigint(20) NOT NULL,
`type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '类型',
`ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'IP',
`port` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '端口',
`db_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '数据库名称',
`schema_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模式名称',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号',
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码',
`init_count` int(11) NULL DEFAULT NULL COMMENT '初始连接数',
`min_count` int(11) NULL DEFAULT NULL COMMENT '最小空闲数',
`max_count` int(11) NULL DEFAULT NULL COMMENT '最大连接数',
`is_primary` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主要数据源',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NOT NULL,
PRIMARY KEY (`datasource_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '租户数据源' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID',
`username` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户账号',
`nickname` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户昵称',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户邮箱',
`phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号码',
`gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '用户性别0男 1女 2未知',
`avatar` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '头像地址',
`password` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '密码',
`status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '帐号状态1正常 0停用',
`create_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_user` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`tenant_id` bigint(20) NULL DEFAULT NULL COMMENT '租户ID',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_user_post
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_post`;
CREATE TABLE `sys_user_post` (
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`post_id` bigint(20) NOT NULL COMMENT '岗位ID',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`user_id`, `post_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS `sys_user_role`;
CREATE TABLE `sys_user_role` (
`user_id` bigint(20) NOT NULL COMMENT '用户ID',
`role_id` bigint(20) NOT NULL COMMENT '角色ID',
`tenant_id` bigint(20) NOT NULL COMMENT '租户ID',
PRIMARY KEY (`user_id`, `role_id`, `tenant_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -0,0 +1,7 @@
INSERT INTO sys_config VALUES ('{}', 'Token有效期', 'sys.token.expireTime', '96', 'Y', 'admin', '2023-05-25 13:22:50', 'admin', '2023-05-25 15:02:42', '单位:小时,仅支持正整数', '{}');
INSERT INTO sys_config VALUES ('{}', '账号黑名单开关', 'sys.account.blacklistOnOff', 'true', 'Y', 'admin', '2023-05-25 13:22:31', 'admin', '2023-05-25 13:57:14', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '账号注册开关', 'sys.account.registerUser', 'false', 'Y', 'admin', '2023-05-25 13:21:38', 'admin', '2023-05-25 15:07:00', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '登录验证码开关', 'sys.account.captchaOnOff', 'true', 'Y', 'admin', '2023-05-25 13:23:52', 'admin', '2023-06-05 13:43:00', 'true开启false关闭', '{}');
INSERT INTO sys_config VALUES ('{}', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-light', 'Y', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-25 13:26:27', '深色主题theme-dark浅色主题theme-light', '{}');
INSERT INTO sys_config VALUES ('{}', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2022-08-15 18:01:28', '', NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', '{}');
INSERT INTO sys_config VALUES ('{}', '账号允许同时在线', 'sys.account.allowBothOnline', 'true', 'Y', 'admin', '2023-05-28 14:28:05', 'admin', '2023-05-28 15:39:48', 'true允许false禁止', '{}');

View File

@ -0,0 +1,3 @@
INSERT INTO sys_menu VALUES ('{}', '在线查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'monitor:online:query', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '批量强退', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'monitor:online:batchLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '单条强退', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'monitor:online:forceLogout', '#', 'admin', '2023-05-27 22:22:59', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '登录用户', '{}', 1, 'online', 'monitor/online/index', '', 0, 0, 'C', '1', 'monitor:online:list', 'online', 'admin', '2023-05-27 22:22:18', 'admin', '2023-05-30 09:49:35', '在线用户菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '参数查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'system:config:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数新增', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'system:config:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数修改', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'system:config:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '参数删除', '{}', 4, '#', '', '', 0, 0, 'F', '1', 'system:config:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '参数设置', '{}', 7, 'config', 'system/config/index', '', 0, 0, 'C', '1', 'system:config:list', 'edit', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-24 21:13:11', '参数设置菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '部门查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:dept:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:dept:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:dept:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '部门删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:dept:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '部门管理', '{}', 4, 'dept', 'system/dept/index', '', 0, 0, 'C', '1', 'system:dept:list', 'tree', 'admin', '2023-04-23 14:35:29', '', NULL, '部门管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '字典查询', '{}', 1, '#', '', '', 0, 0, 'F', '1', 'system:dict:query', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典新增', '{}', 2, '#', '', '', 0, 0, 'F', '1', 'system:dict:add', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典修改', '{}', 3, '#', '', '', 0, 0, 'F', '1', 'system:dict:edit', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典删除', '{}', 4, '#', '', '', 0, 0, 'F', '1', 'system:dict:remove', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '字典导出', '{}', 5, '#', '', '', 0, 0, 'F', '1', 'system:dict:export', '#', 'admin', '2022-08-15 18:01:28', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '字典管理', '{}', 6, 'dict', 'system/dict/index', '', 0, 0, 'C', '1', 'system:dict:list', 'documentation', 'admin', '2022-08-15 18:01:28', 'admin', '2023-05-31 11:15:14', '字典管理菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_menu VALUES ('{}', '菜单查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:menu:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:menu:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:menu:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '菜单删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:menu:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '菜单管理', '{}', 3, 'menu', 'system/menu/index', '', 0, 0, 'C', '1', 'system:menu:list', 'tree-table', 'admin', '2023-04-23 14:35:29', '', NULL, '菜单管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '岗位查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:post:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:post:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:post:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:post:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '岗位导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:post:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '岗位管理', '{}', 5, 'post', 'system/post/index', '', 0, 0, 'C', '1', 'system:post:list', 'post', 'admin', '2023-04-23 14:35:29', '', NULL, '岗位管理菜单', '{}');

View File

@ -0,0 +1,5 @@
INSERT INTO sys_menu VALUES ('{}', '角色查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:role:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:role:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:role:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:role:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '角色导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:role:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '角色管理', '{}', 2, 'role', 'system/role/index', '', 0, 0, 'C', '1', 'system:role:list', 'peoples', 'admin', '2023-04-23 14:35:29', '', NULL, '角色管理菜单', '{}');

View File

@ -0,0 +1,7 @@
INSERT INTO sys_menu VALUES ('{}', '用户查询', '{}', 1, '', '', '', 0, 0, 'F', '1', 'system:user:query', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户新增', '{}', 2, '', '', '', 0, 0, 'F', '1', 'system:user:add', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户修改', '{}', 3, '', '', '', 0, 0, 'F', '1', 'system:user:edit', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户删除', '{}', 4, '', '', '', 0, 0, 'F', '1', 'system:user:remove', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户导出', '{}', 5, '', '', '', 0, 0, 'F', '1', 'system:user:export', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '用户导入', '{}', 6, '', '', '', 0, 0, 'F', '1', 'system:user:import', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');
INSERT INTO sys_menu VALUES ('{}', '重置密码', '{}', 7, '', '', '', 0, 0, 'F', '1', 'system:user:resetPwd', '#', 'admin', '2023-04-23 14:35:29', '', NULL, '', '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_menu VALUES ('{}', '用户管理', '{}', 1, 'user', 'system/user/index', '', 0, 0, 'C', '1', 'system:user:list', 'user', 'admin', '2023-04-23 14:35:29', '', NULL, '用户管理菜单', '{}');

View File

@ -0,0 +1,4 @@
INSERT INTO sys_post VALUES ('{}', 'ceo', '总经理', 1, '1', 'admin', '2023-05-19 14:06:53', 'admin', '2023-05-22 14:56:56', NULL, '{}');
INSERT INTO sys_post VALUES ('{}', 'cto', '技术总监', 2, '1', 'admin', '2023-05-19 14:07:06', 'admin', '2023-05-22 14:57:10', NULL,'{}');
INSERT INTO sys_post VALUES ('{}', 'hr', '人事', 3, '1', 'admin', '2023-05-19 14:07:16', '', NULL, NULL, '{}');
INSERT INTO sys_post VALUES ('{}', 'acct', '会计', 4, '1', 'admin', '2023-05-19 14:07:51', '', NULL, NULL, '{}');

View File

@ -0,0 +1,2 @@
INSERT INTO sys_role VALUES ('{}', '超级管理员', 'admin', 1, '1', '1', 'admin', '2023-04-23 14:35:29', 'admin', '2023-05-31 11:05:52', '超级管理员', '{}');
INSERT INTO sys_role VALUES ('{}', '测试', 'test', 1, '1', '1', 'admin', '2023-05-22 14:38:31', '', NULL, NULL, '{}');

View File

@ -0,0 +1 @@
INSERT INTO sys_user VALUES ('{}', NULL, 'admin', '超级管理员', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', '', NULL, '', NULL, NULL, '{}');

View File

@ -0,0 +1,664 @@
-- ----------------------------
-- Table structure for gen_table
-- ----------------------------
DROP TABLE IF EXISTS "gen_table";
CREATE TABLE "gen_table" (
"table_id" varchar(20) NOT NULL,
"table_name" varchar(200) COLLATE "pg_catalog"."default",
"table_comment" varchar(500) COLLATE "pg_catalog"."default",
"sub_table_name" varchar(64) COLLATE "pg_catalog"."default",
"sub_table_fk_name" varchar(64) COLLATE "pg_catalog"."default",
"class_name" varchar(100) COLLATE "pg_catalog"."default",
"tpl_category" varchar(200) COLLATE "pg_catalog"."default",
"package_name" varchar(100) COLLATE "pg_catalog"."default",
"module_name" varchar(30) COLLATE "pg_catalog"."default",
"business_name" varchar(30) COLLATE "pg_catalog"."default",
"function_name" varchar(50) COLLATE "pg_catalog"."default",
"function_author" varchar(50) COLLATE "pg_catalog"."default",
"gen_type" char(1) COLLATE "pg_catalog"."default",
"gen_path" varchar(200) COLLATE "pg_catalog"."default",
"options" varchar(1000) COLLATE "pg_catalog"."default",
"create_by" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_by" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default"
)
;
COMMENT ON COLUMN "gen_table"."table_id" IS '编号';
COMMENT ON COLUMN "gen_table"."table_name" IS '表名称';
COMMENT ON COLUMN "gen_table"."table_comment" IS '表描述';
COMMENT ON COLUMN "gen_table"."sub_table_name" IS '关联子表的表名';
COMMENT ON COLUMN "gen_table"."sub_table_fk_name" IS '子表关联的外键名';
COMMENT ON COLUMN "gen_table"."class_name" IS '实体类名称';
COMMENT ON COLUMN "gen_table"."tpl_category" IS '使用的模板crud单表操作 tree树表操作';
COMMENT ON COLUMN "gen_table"."package_name" IS '生成包路径';
COMMENT ON COLUMN "gen_table"."module_name" IS '生成模块名';
COMMENT ON COLUMN "gen_table"."business_name" IS '生成业务名';
COMMENT ON COLUMN "gen_table"."function_name" IS '生成功能名';
COMMENT ON COLUMN "gen_table"."function_author" IS '生成功能作者';
COMMENT ON COLUMN "gen_table"."gen_type" IS '生成代码方式0zip压缩包 1自定义路径';
COMMENT ON COLUMN "gen_table"."gen_path" IS '生成路径(不填默认项目路径)';
COMMENT ON COLUMN "gen_table"."options" IS '其它生成选项';
COMMENT ON COLUMN "gen_table"."create_by" IS '创建者';
COMMENT ON COLUMN "gen_table"."create_time" IS '创建时间';
COMMENT ON COLUMN "gen_table"."update_by" IS '更新者';
COMMENT ON COLUMN "gen_table"."update_time" IS '更新时间';
COMMENT ON COLUMN "gen_table"."remark" IS '备注';
COMMENT ON TABLE "gen_table" IS '代码生成业务表';
-- ----------------------------
-- Table structure for gen_table_column
-- ----------------------------
DROP TABLE IF EXISTS "gen_table_column";
CREATE TABLE "gen_table_column" (
"column_id" varchar(20) NOT NULL,
"table_id" varchar(64) COLLATE "pg_catalog"."default",
"column_name" varchar(200) COLLATE "pg_catalog"."default",
"column_comment" varchar(500) COLLATE "pg_catalog"."default",
"column_type" varchar(100) COLLATE "pg_catalog"."default",
"java_type" varchar(500) COLLATE "pg_catalog"."default",
"java_field" varchar(200) COLLATE "pg_catalog"."default",
"is_pk" char(1) COLLATE "pg_catalog"."default",
"is_increment" char(1) COLLATE "pg_catalog"."default",
"is_required" char(1) COLLATE "pg_catalog"."default",
"is_insert" char(1) COLLATE "pg_catalog"."default",
"is_edit" char(1) COLLATE "pg_catalog"."default",
"is_list" char(1) COLLATE "pg_catalog"."default",
"is_query" char(1) COLLATE "pg_catalog"."default",
"query_type" varchar(200) COLLATE "pg_catalog"."default",
"html_type" varchar(200) COLLATE "pg_catalog"."default",
"dict_type" varchar(200) COLLATE "pg_catalog"."default",
"sort" int4,
"create_by" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_by" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6)
)
;
COMMENT ON COLUMN "gen_table_column"."column_id" IS '编号';
COMMENT ON COLUMN "gen_table_column"."table_id" IS '归属表编号';
COMMENT ON COLUMN "gen_table_column"."column_name" IS '列名称';
COMMENT ON COLUMN "gen_table_column"."column_comment" IS '列描述';
COMMENT ON COLUMN "gen_table_column"."column_type" IS '列类型';
COMMENT ON COLUMN "gen_table_column"."java_type" IS 'JAVA类型';
COMMENT ON COLUMN "gen_table_column"."java_field" IS 'JAVA字段名';
COMMENT ON COLUMN "gen_table_column"."is_pk" IS '是否主键1是';
COMMENT ON COLUMN "gen_table_column"."is_increment" IS '是否自增1是';
COMMENT ON COLUMN "gen_table_column"."is_required" IS '是否必填1是';
COMMENT ON COLUMN "gen_table_column"."is_insert" IS '是否为插入字段1是';
COMMENT ON COLUMN "gen_table_column"."is_edit" IS '是否编辑字段1是';
COMMENT ON COLUMN "gen_table_column"."is_list" IS '是否列表字段1是';
COMMENT ON COLUMN "gen_table_column"."is_query" IS '是否查询字段1是';
COMMENT ON COLUMN "gen_table_column"."query_type" IS '查询方式(等于、不等于、大于、小于、范围)';
COMMENT ON COLUMN "gen_table_column"."html_type" IS '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)';
COMMENT ON COLUMN "gen_table_column"."dict_type" IS '字典类型';
COMMENT ON COLUMN "gen_table_column"."sort" IS '排序';
COMMENT ON COLUMN "gen_table_column"."create_by" IS '创建者';
COMMENT ON COLUMN "gen_table_column"."create_time" IS '创建时间';
COMMENT ON COLUMN "gen_table_column"."update_by" IS '更新者';
COMMENT ON COLUMN "gen_table_column"."update_time" IS '更新时间';
COMMENT ON TABLE "gen_table_column" IS '代码生成业务表字段';
-- ----------------------------
-- Table structure for sys_config
-- ----------------------------
DROP TABLE IF EXISTS "sys_config";
CREATE TABLE "sys_config" (
"config_id" varchar(20) NOT NULL,
"config_name" varchar(100) COLLATE "pg_catalog"."default",
"config_key" varchar(100) COLLATE "pg_catalog"."default",
"config_value" varchar(500) COLLATE "pg_catalog"."default",
"config_type" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_config"."config_id" IS '参数主键';
COMMENT ON COLUMN "sys_config"."config_name" IS '参数名称';
COMMENT ON COLUMN "sys_config"."config_key" IS '参数键名';
COMMENT ON COLUMN "sys_config"."config_value" IS '参数键值';
COMMENT ON COLUMN "sys_config"."config_type" IS '系统内置Y是 N否';
COMMENT ON COLUMN "sys_config"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_config"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_config"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_config"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_config"."remark" IS '备注';
COMMENT ON TABLE "sys_config" IS '参数配置表';
-- ----------------------------
-- Table structure for sys_dept
-- ----------------------------
DROP TABLE IF EXISTS "sys_dept";
CREATE TABLE "sys_dept" (
"dept_id" varchar(20) NOT NULL,
"parent_id" varchar(20),
"ancestors" varchar(500) COLLATE "pg_catalog"."default",
"dept_name" varchar(30) COLLATE "pg_catalog"."default",
"order_num" int4,
"leader" varchar(20) COLLATE "pg_catalog"."default",
"phone" varchar(30) COLLATE "pg_catalog"."default",
"email" varchar(30) COLLATE "pg_catalog"."default",
"status" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(255) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_dept"."dept_id" IS '部门id';
COMMENT ON COLUMN "sys_dept"."parent_id" IS '父部门id';
COMMENT ON COLUMN "sys_dept"."ancestors" IS '祖级列表';
COMMENT ON COLUMN "sys_dept"."dept_name" IS '部门名称';
COMMENT ON COLUMN "sys_dept"."order_num" IS '显示顺序';
COMMENT ON COLUMN "sys_dept"."leader" IS '负责人ID';
COMMENT ON COLUMN "sys_dept"."phone" IS '手机号';
COMMENT ON COLUMN "sys_dept"."email" IS '邮箱';
COMMENT ON COLUMN "sys_dept"."status" IS '部门状态1正常 0停用';
COMMENT ON COLUMN "sys_dept"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_dept"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_dept"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_dept"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_dept"."remark" IS '备注';
COMMENT ON COLUMN "sys_dept"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_dept" IS '部门表';
-- ----------------------------
-- Table structure for sys_dict_data
-- ----------------------------
DROP TABLE IF EXISTS "sys_dict_data";
CREATE TABLE "sys_dict_data" (
"dict_code" varchar(20) NOT NULL,
"dict_sort" int4,
"dict_label" varchar(100) COLLATE "pg_catalog"."default",
"dict_value" varchar(100) COLLATE "pg_catalog"."default",
"dict_type" varchar(100) COLLATE "pg_catalog"."default",
"css_class" varchar(100) COLLATE "pg_catalog"."default",
"list_class" varchar(100) COLLATE "pg_catalog"."default",
"status" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_dict_data"."dict_code" IS '字典编码';
COMMENT ON COLUMN "sys_dict_data"."dict_sort" IS '字典排序';
COMMENT ON COLUMN "sys_dict_data"."dict_label" IS '字典标签';
COMMENT ON COLUMN "sys_dict_data"."dict_value" IS '字典键值';
COMMENT ON COLUMN "sys_dict_data"."dict_type" IS '字典类型';
COMMENT ON COLUMN "sys_dict_data"."css_class" IS '样式属性(其他样式扩展)';
COMMENT ON COLUMN "sys_dict_data"."list_class" IS '表格回显样式';
COMMENT ON COLUMN "sys_dict_data"."status" IS '状态0正常 1停用';
COMMENT ON COLUMN "sys_dict_data"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_dict_data"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_dict_data"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_dict_data"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_dict_data"."remark" IS '备注';
COMMENT ON COLUMN "sys_dict_data"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_dict_data" IS '字典数据表';
-- ----------------------------
-- Table structure for sys_dict_type
-- ----------------------------
DROP TABLE IF EXISTS "sys_dict_type";
CREATE TABLE "sys_dict_type" (
"dict_id" varchar(20) NOT NULL,
"dict_name" varchar(100) COLLATE "pg_catalog"."default",
"dict_type" varchar(100) COLLATE "pg_catalog"."default",
"status" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_dict_type"."dict_id" IS '字典主键';
COMMENT ON COLUMN "sys_dict_type"."dict_name" IS '字典名称';
COMMENT ON COLUMN "sys_dict_type"."dict_type" IS '字典类型';
COMMENT ON COLUMN "sys_dict_type"."status" IS '状态0正常 1停用';
COMMENT ON COLUMN "sys_dict_type"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_dict_type"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_dict_type"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_dict_type"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_dict_type"."remark" IS '备注';
COMMENT ON COLUMN "sys_dict_type"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_dict_type" IS '字典类型表';
-- ----------------------------
-- Table structure for sys_login_log
-- ----------------------------
DROP TABLE IF EXISTS "sys_login_log";
CREATE TABLE "sys_login_log" (
"login_id" varchar(20) NOT NULL,
"device_sn" varchar(50) COLLATE "pg_catalog"."default",
"username" varchar(50) COLLATE "pg_catalog"."default",
"nickname" varchar(30) COLLATE "pg_catalog"."default",
"ip" varchar(30) COLLATE "pg_catalog"."default",
"address" varchar(255) COLLATE "pg_catalog"."default",
"browser" varchar(50) COLLATE "pg_catalog"."default",
"os" varchar(50) COLLATE "pg_catalog"."default",
"login_time" timestamp(6),
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_login_log"."device_sn" IS '设备编码';
COMMENT ON COLUMN "sys_login_log"."username" IS '登录账号';
COMMENT ON COLUMN "sys_login_log"."nickname" IS '用户名称';
COMMENT ON COLUMN "sys_login_log"."ip" IS '访问IP';
COMMENT ON COLUMN "sys_login_log"."address" IS '登录地点';
COMMENT ON COLUMN "sys_login_log"."browser" IS '浏览器';
COMMENT ON COLUMN "sys_login_log"."os" IS '操作系统';
COMMENT ON COLUMN "sys_login_log"."login_time" IS '登录时间';
COMMENT ON COLUMN "sys_login_log"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_login_log"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_login_log"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_login_log"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_login_log"."remark" IS '备注';
COMMENT ON TABLE "sys_login_log" IS '登录日志';
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS "sys_menu";
CREATE TABLE "sys_menu" (
"menu_id" varchar(20) NOT NULL,
"menu_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"parent_id" varchar(20),
"order_num" int4,
"path" varchar(200) COLLATE "pg_catalog"."default",
"component" varchar(255) COLLATE "pg_catalog"."default",
"query" varchar(255) COLLATE "pg_catalog"."default",
"is_frame" int4,
"is_cache" int4,
"menu_type" char(1) COLLATE "pg_catalog"."default",
"is_visible" char(1) COLLATE "pg_catalog"."default",
"perms" varchar(100) COLLATE "pg_catalog"."default",
"icon" varchar(100) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_menu"."menu_id" IS '菜单ID';
COMMENT ON COLUMN "sys_menu"."menu_name" IS '菜单名称';
COMMENT ON COLUMN "sys_menu"."parent_id" IS '父菜单ID';
COMMENT ON COLUMN "sys_menu"."order_num" IS '显示顺序';
COMMENT ON COLUMN "sys_menu"."path" IS '路由地址';
COMMENT ON COLUMN "sys_menu"."component" IS '组件路径';
COMMENT ON COLUMN "sys_menu"."query" IS '路由参数';
COMMENT ON COLUMN "sys_menu"."is_frame" IS '是否为外链1是 0否';
COMMENT ON COLUMN "sys_menu"."is_cache" IS '是否缓存1缓存 0不缓存';
COMMENT ON COLUMN "sys_menu"."menu_type" IS '菜单类型M目录 C菜单 F按钮';
COMMENT ON COLUMN "sys_menu"."is_visible" IS '菜单状态1显示 0隐藏';
COMMENT ON COLUMN "sys_menu"."perms" IS '权限标识';
COMMENT ON COLUMN "sys_menu"."icon" IS '菜单图标';
COMMENT ON COLUMN "sys_menu"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_menu"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_menu"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_menu"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_menu"."remark" IS '备注';
COMMENT ON TABLE "sys_menu" IS '菜单权限表';
-- ----------------------------
-- Table structure for sys_post
-- ----------------------------
DROP TABLE IF EXISTS "sys_post";
CREATE TABLE "sys_post" (
"post_id" varchar(20) NOT NULL,
"post_code" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,
"post_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"post_sort" int4 NOT NULL,
"status" char(1) COLLATE "pg_catalog"."default" NOT NULL,
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_post"."post_id" IS '岗位ID';
COMMENT ON COLUMN "sys_post"."post_code" IS '岗位编码';
COMMENT ON COLUMN "sys_post"."post_name" IS '岗位名称';
COMMENT ON COLUMN "sys_post"."post_sort" IS '显示顺序';
COMMENT ON COLUMN "sys_post"."status" IS '状态1正常 0停用';
COMMENT ON COLUMN "sys_post"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_post"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_post"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_post"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_post"."remark" IS '备注';
COMMENT ON COLUMN "sys_post"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_post" IS '岗位信息表';
-- ----------------------------
-- Table structure for sys_role
-- ----------------------------
DROP TABLE IF EXISTS "sys_role";
CREATE TABLE "sys_role" (
"role_id" varchar(20) NOT NULL,
"role_name" varchar(30) COLLATE "pg_catalog"."default" NOT NULL,
"role_key" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,
"role_sort" int4 NOT NULL,
"data_scope" char(1) COLLATE "pg_catalog"."default",
"status" char(1) COLLATE "pg_catalog"."default" NOT NULL,
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_role"."role_id" IS '角色ID';
COMMENT ON COLUMN "sys_role"."role_name" IS '角色名称';
COMMENT ON COLUMN "sys_role"."role_key" IS '角色权限字符串';
COMMENT ON COLUMN "sys_role"."role_sort" IS '显示顺序';
COMMENT ON COLUMN "sys_role"."data_scope" IS '数据范围1全部数据权限 2自定数据权限 3本部门数据权限 4本部门及以下数据权限';
COMMENT ON COLUMN "sys_role"."status" IS '角色状态1正常 0停用';
COMMENT ON COLUMN "sys_role"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_role"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_role"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_role"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_role"."remark" IS '备注';
COMMENT ON COLUMN "sys_role"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_role" IS '角色信息表';
-- ----------------------------
-- Table structure for sys_role_dept
-- ----------------------------
DROP TABLE IF EXISTS "sys_role_dept";
CREATE TABLE "sys_role_dept" (
"role_id" varchar(20) NOT NULL,
"dept_id" varchar(20) NOT NULL,
"tenant_id" varchar(20) NOT NULL
)
;
COMMENT ON COLUMN "sys_role_dept"."role_id" IS '角色ID';
COMMENT ON COLUMN "sys_role_dept"."dept_id" IS '部门ID';
COMMENT ON COLUMN "sys_role_dept"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_role_dept" IS '角色和部门关联表';
-- ----------------------------
-- Table structure for sys_role_menu
-- ----------------------------
DROP TABLE IF EXISTS "sys_role_menu";
CREATE TABLE "sys_role_menu" (
"role_id" varchar(20) NOT NULL,
"menu_id" varchar(20) NOT NULL,
"tenant_id" varchar(20) NOT NULL
)
;
COMMENT ON COLUMN "sys_role_menu"."role_id" IS '角色ID';
COMMENT ON COLUMN "sys_role_menu"."menu_id" IS '菜单ID';
COMMENT ON COLUMN "sys_role_menu"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_role_menu" IS '角色和菜单关联表';
-- ----------------------------
-- Table structure for sys_tenant
-- ----------------------------
DROP TABLE IF EXISTS "sys_tenant";
CREATE TABLE "sys_tenant" (
"tenant_id" varchar(20) NOT NULL,
"company_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"contact_name" varchar(30) COLLATE "pg_catalog"."default",
"contact_phone" varchar(20) COLLATE "pg_catalog"."default",
"address" varchar(255) COLLATE "pg_catalog"."default",
"profile" varchar(500) COLLATE "pg_catalog"."default",
"license_number" varchar(30) COLLATE "pg_catalog"."default",
"domain" varchar(50) COLLATE "pg_catalog"."default",
"expire_time" timestamp(6),
"account_count" varchar(20),
"status" char(1) COLLATE "pg_catalog"."default",
"mode" char(1) COLLATE "pg_catalog"."default",
"initialized" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default"
)
;
COMMENT ON COLUMN "sys_tenant"."company_name" IS '公司名称';
COMMENT ON COLUMN "sys_tenant"."contact_name" IS '联系人名称';
COMMENT ON COLUMN "sys_tenant"."contact_phone" IS '联系人电话';
COMMENT ON COLUMN "sys_tenant"."address" IS '公司地址';
COMMENT ON COLUMN "sys_tenant"."profile" IS '公司简介';
COMMENT ON COLUMN "sys_tenant"."license_number" IS '统一社会信用代码';
COMMENT ON COLUMN "sys_tenant"."domain" IS '域名';
COMMENT ON COLUMN "sys_tenant"."expire_time" IS '过期时间';
COMMENT ON COLUMN "sys_tenant"."account_count" IS '用户数量';
COMMENT ON COLUMN "sys_tenant"."status" IS '状态';
COMMENT ON COLUMN "sys_tenant"."mode" IS '模式';
COMMENT ON COLUMN "sys_tenant"."initialized" IS '是否已初始化';
COMMENT ON COLUMN "sys_tenant"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_tenant"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_tenant"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_tenant"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_tenant"."remark" IS '备注';
COMMENT ON TABLE "sys_tenant" IS '租户表';
-- ----------------------------
-- Table structure for sys_tenant_datasource
-- ----------------------------
DROP TABLE IF EXISTS "sys_tenant_datasource";
CREATE TABLE "sys_tenant_datasource" (
"datasource_id" varchar(20) NOT NULL,
"type" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"ip" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"port" varchar(20) COLLATE "pg_catalog"."default" NOT NULL,
"db_name" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"schema_name" varchar(50) COLLATE "pg_catalog"."default",
"username" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"password" varchar(50) COLLATE "pg_catalog"."default" NOT NULL,
"init_count" int4,
"min_count" int4,
"max_count" int4,
"is_primary" char(1) COLLATE "pg_catalog"."default" NOT NULL,
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20) NOT NULL
)
;
COMMENT ON COLUMN "sys_tenant_datasource"."type" IS '类型';
COMMENT ON COLUMN "sys_tenant_datasource"."ip" IS 'IP';
COMMENT ON COLUMN "sys_tenant_datasource"."port" IS '端口';
COMMENT ON COLUMN "sys_tenant_datasource"."db_name" IS '数据库名称';
COMMENT ON COLUMN "sys_tenant_datasource"."schema_name" IS '模式名称';
COMMENT ON COLUMN "sys_tenant_datasource"."username" IS '账号';
COMMENT ON COLUMN "sys_tenant_datasource"."password" IS '密码';
COMMENT ON COLUMN "sys_tenant_datasource"."init_count" IS '初始连接数';
COMMENT ON COLUMN "sys_tenant_datasource"."min_count" IS '最小空闲数';
COMMENT ON COLUMN "sys_tenant_datasource"."max_count" IS '最大连接数';
COMMENT ON COLUMN "sys_tenant_datasource"."is_primary" IS '主要数据源';
COMMENT ON COLUMN "sys_tenant_datasource"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_tenant_datasource"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_tenant_datasource"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_tenant_datasource"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_tenant_datasource"."remark" IS '备注';
COMMENT ON TABLE "sys_tenant_datasource" IS '租户数据源';
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS "sys_user";
CREATE TABLE "sys_user" (
"user_id" varchar(20) NOT NULL,
"dept_id" varchar(20),
"username" varchar(30) COLLATE "pg_catalog"."default" NOT NULL,
"nickname" varchar(30) COLLATE "pg_catalog"."default" NOT NULL,
"email" varchar(50) COLLATE "pg_catalog"."default",
"phone" varchar(11) COLLATE "pg_catalog"."default",
"gender" char(1) COLLATE "pg_catalog"."default",
"avatar" varchar(100) COLLATE "pg_catalog"."default",
"password" varchar(100) COLLATE "pg_catalog"."default",
"status" char(1) COLLATE "pg_catalog"."default",
"create_user" varchar(64) COLLATE "pg_catalog"."default",
"create_time" timestamp(6),
"update_user" varchar(64) COLLATE "pg_catalog"."default",
"update_time" timestamp(6),
"remark" varchar(500) COLLATE "pg_catalog"."default",
"tenant_id" varchar(20)
)
;
COMMENT ON COLUMN "sys_user"."user_id" IS '用户ID';
COMMENT ON COLUMN "sys_user"."dept_id" IS '部门ID';
COMMENT ON COLUMN "sys_user"."username" IS '用户账号';
COMMENT ON COLUMN "sys_user"."nickname" IS '用户昵称';
COMMENT ON COLUMN "sys_user"."email" IS '用户邮箱';
COMMENT ON COLUMN "sys_user"."phone" IS '手机号码';
COMMENT ON COLUMN "sys_user"."gender" IS '用户性别0男 1女 2未知';
COMMENT ON COLUMN "sys_user"."avatar" IS '头像地址';
COMMENT ON COLUMN "sys_user"."password" IS '密码';
COMMENT ON COLUMN "sys_user"."status" IS '帐号状态1正常 0停用';
COMMENT ON COLUMN "sys_user"."create_user" IS '创建者';
COMMENT ON COLUMN "sys_user"."create_time" IS '创建时间';
COMMENT ON COLUMN "sys_user"."update_user" IS '更新者';
COMMENT ON COLUMN "sys_user"."update_time" IS '更新时间';
COMMENT ON COLUMN "sys_user"."remark" IS '备注';
COMMENT ON COLUMN "sys_user"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_user" IS '用户信息表';
-- ----------------------------
-- Table structure for sys_user_post
-- ----------------------------
DROP TABLE IF EXISTS "sys_user_post";
CREATE TABLE "sys_user_post" (
"user_id" varchar(20) NOT NULL,
"post_id" varchar(20) NOT NULL,
"tenant_id" varchar(20) NOT NULL
)
;
COMMENT ON COLUMN "sys_user_post"."user_id" IS '用户ID';
COMMENT ON COLUMN "sys_user_post"."post_id" IS '岗位ID';
COMMENT ON COLUMN "sys_user_post"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_user_post" IS '用户与岗位关联表';
-- ----------------------------
-- Table structure for sys_user_role
-- ----------------------------
DROP TABLE IF EXISTS "sys_user_role";
CREATE TABLE "sys_user_role" (
"user_id" varchar(20) NOT NULL,
"role_id" varchar(20) NOT NULL,
"tenant_id" varchar(20) NOT NULL
)
;
COMMENT ON COLUMN "sys_user_role"."user_id" IS '用户ID';
COMMENT ON COLUMN "sys_user_role"."role_id" IS '角色ID';
COMMENT ON COLUMN "sys_user_role"."tenant_id" IS '租户ID';
COMMENT ON TABLE "sys_user_role" IS '用户和角色关联表';
-- ----------------------------
-- Primary Key structure for table gen_table
-- ----------------------------
ALTER TABLE "gen_table" ADD CONSTRAINT "gen_table_pkey" PRIMARY KEY ("table_id");
-- ----------------------------
-- Primary Key structure for table gen_table_column
-- ----------------------------
ALTER TABLE "gen_table_column" ADD CONSTRAINT "gen_table_column_pkey" PRIMARY KEY ("column_id");
-- ----------------------------
-- Primary Key structure for table sys_config
-- ----------------------------
ALTER TABLE "sys_config" ADD CONSTRAINT "sys_config_pkey" PRIMARY KEY ("config_id");
-- ----------------------------
-- Primary Key structure for table sys_dept
-- ----------------------------
ALTER TABLE "sys_dept" ADD CONSTRAINT "sys_dept_pkey" PRIMARY KEY ("dept_id");
-- ----------------------------
-- Primary Key structure for table sys_dict_data
-- ----------------------------
ALTER TABLE "sys_dict_data" ADD CONSTRAINT "sys_dict_data_pkey" PRIMARY KEY ("dict_code");
-- ----------------------------
-- Indexes structure for table sys_dict_type
-- ----------------------------
CREATE INDEX "dict_type" ON "sys_dict_type" USING btree (
"dict_type" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
-- ----------------------------
-- Primary Key structure for table sys_dict_type
-- ----------------------------
ALTER TABLE "sys_dict_type" ADD CONSTRAINT "sys_dict_type_pkey" PRIMARY KEY ("dict_id");
-- ----------------------------
-- Primary Key structure for table sys_login_log
-- ----------------------------
ALTER TABLE "sys_login_log" ADD CONSTRAINT "sys_login_log_pkey" PRIMARY KEY ("login_id");
-- ----------------------------
-- Primary Key structure for table sys_menu
-- ----------------------------
ALTER TABLE "sys_menu" ADD CONSTRAINT "sys_menu_pkey" PRIMARY KEY ("menu_id");
-- ----------------------------
-- Primary Key structure for table sys_post
-- ----------------------------
ALTER TABLE "sys_post" ADD CONSTRAINT "sys_post_pkey" PRIMARY KEY ("post_id");
-- ----------------------------
-- Primary Key structure for table sys_role
-- ----------------------------
ALTER TABLE "sys_role" ADD CONSTRAINT "sys_role_pkey" PRIMARY KEY ("role_id");
-- ----------------------------
-- Primary Key structure for table sys_role_dept
-- ----------------------------
ALTER TABLE "sys_role_dept" ADD CONSTRAINT "sys_role_dept_pkey" PRIMARY KEY ("role_id", "dept_id", "tenant_id");
-- ----------------------------
-- Primary Key structure for table sys_role_menu
-- ----------------------------
ALTER TABLE "sys_role_menu" ADD CONSTRAINT "sys_role_menu_pkey" PRIMARY KEY ("role_id", "menu_id", "tenant_id");
-- ----------------------------
-- Primary Key structure for table sys_tenant
-- ----------------------------
ALTER TABLE "sys_tenant" ADD CONSTRAINT "sys_tenant_pkey" PRIMARY KEY ("tenant_id");
-- ----------------------------
-- Primary Key structure for table sys_tenant_datasource
-- ----------------------------
ALTER TABLE "sys_tenant_datasource" ADD CONSTRAINT "sys_tenant_datasource_pkey" PRIMARY KEY ("datasource_id");
-- ----------------------------
-- Primary Key structure for table sys_user
-- ----------------------------
ALTER TABLE "sys_user" ADD CONSTRAINT "sys_user_pkey" PRIMARY KEY ("user_id");
-- ----------------------------
-- Primary Key structure for table sys_user_post
-- ----------------------------
ALTER TABLE "sys_user_post" ADD CONSTRAINT "sys_user_post_pkey" PRIMARY KEY ("user_id", "post_id", "tenant_id");
-- ----------------------------
-- Primary Key structure for table sys_user_role
-- ----------------------------
ALTER TABLE "sys_user_role" ADD CONSTRAINT "sys_user_role_pkey" PRIMARY KEY ("user_id", "role_id", "tenant_id");

View File

@ -0,0 +1,17 @@
<?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.tenant.mapper.SysTenantDatasourceMapper">
<select id="selectTenantIds" resultType="string">
SELECT tenant_id FROM sys_tenant_datasource GROUP BY tenant_id
</select>
<update id="setBackupDatasourceExcludeId">
update sys_tenant_datasource set is_primary = #{code} where tenant_id = #{tenantId} and datasource_id != #{excludeId}
</update>
<select id="selectByIp" resultType="com.qiaoba.api.tenant.entity.SysTenantDatasource">
select * from sys_tenant_datasource where ip = #{ip} and tenant_id = #{tenantId}
</select>
</mapper>

View File

@ -0,0 +1,10 @@
<?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.tenant.mapper.SysTenantMapper">
<select id="checkCompanyNameIsExist" resultType="string">
SELECT company_name FROM sys_tenant where company_name = #{companyName}
<if test="tenantId != null and tenantId != ''">and tenant_id != #{tenantId}</if>
</select>
</mapper>