add
This commit is contained in:
35
qiaoba-module/qiaoba-module-tenant/pom.xml
Normal file
35
qiaoba-module/qiaoba-module-tenant/pom.xml
Normal 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>
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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禁止)', '{}');
|
@ -0,0 +1 @@
|
||||
null not found
|
@ -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, '', '{}');
|
@ -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', '在线用户菜单', '{}');
|
@ -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, '', '{}');
|
@ -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', '参数设置菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '部门管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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', '字典管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '菜单管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '岗位管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '角色管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '用户管理菜单', '{}');
|
@ -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, '{}');
|
@ -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, '{}');
|
@ -0,0 +1 @@
|
||||
INSERT INTO sys_user VALUES ('{}', NULL, 'admin', '超级管理员', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', '', NULL, '', NULL, NULL, '{}');
|
@ -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;
|
@ -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禁止)', '{}');
|
@ -0,0 +1 @@
|
||||
null not found
|
@ -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, '', '{}');
|
@ -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', '在线用户菜单', '{}');
|
@ -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, '', '{}');
|
@ -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', '参数设置菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '部门管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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', '字典管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '菜单管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '岗位管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '角色管理菜单', '{}');
|
@ -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, '', '{}');
|
@ -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, '用户管理菜单', '{}');
|
@ -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, '{}');
|
@ -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, '{}');
|
@ -0,0 +1 @@
|
||||
INSERT INTO sys_user VALUES ('{}', NULL, 'admin', '超级管理员', '', '', '0', '', '$2a$10$mDfrzPMZuxvKeKmqUPA4hOgNC2Zdgb8vOgVL8hP8IIdT6fAWpe0Bm', '1', '', NULL, '', NULL, NULL, '{}');
|
@ -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");
|
@ -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>
|
@ -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>
|
Reference in New Issue
Block a user