Răsfoiți Sursa

feat:新增多级租户、使用端工具段登录地址逻辑

韩帛霖 1 an în urmă
părinte
comite
1740576beb

+ 36 - 21
zkqy-admin/src/main/java/com/zkqy/web/controller/system/SysTenantController.java

@@ -25,14 +25,13 @@ import com.zkqy.common.core.page.TableDataInfo;
 
 /**
  * 租户信息Controller
- * 
+ *
  * @author zkqy
  * @date 2023-06-03
  */
 @RestController
 @RequestMapping("/system/tenant")
-public class SysTenantController extends BaseController
-{
+public class SysTenantController extends BaseController {
     @Autowired
     private ISysTenantService sysTenantService;
 
@@ -41,21 +40,29 @@ public class SysTenantController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:tenant:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysTenant sysTenant)
-    {
+    public TableDataInfo list(SysTenant sysTenant) {
         startPage();
         List<SysTenant> list = sysTenantService.selectSysTenantList(sysTenant);
         return getDataTable(list);
     }
 
+    /**
+     * 查询所有租户信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:list')")
+    @GetMapping("/getTenantAllList")
+    public TableDataInfo getTenantAllList(SysTenant sysTenant) {
+        List<SysTenant> list = sysTenantService.selectSysTenantAllList(sysTenant);
+        return getDataTable(list);
+    }
+
     /**
      * 导出租户信息列表
      */
     @PreAuthorize("@ss.hasPermi('system:tenant:export')")
     @Log(title = "租户信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysTenant sysTenant)
-    {
+    public void export(HttpServletResponse response, SysTenant sysTenant) {
         List<SysTenant> list = sysTenantService.selectSysTenantList(sysTenant);
         ExcelUtil<SysTenant> util = new ExcelUtil<SysTenant>(SysTenant.class);
         util.exportExcel(response, list, "租户信息数据");
@@ -66,19 +73,29 @@ public class SysTenantController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:tenant:query')")
     @GetMapping(value = "/{tenantId}")
-    public AjaxResult getInfo(@PathVariable("tenantId") Long tenantId)
-    {
+    public AjaxResult getInfo(@PathVariable("tenantId") Long tenantId) {
         return success(sysTenantService.selectSysTenantByTenantId(tenantId));
     }
 
+    /**
+     * 获取当前租户下的子租户
+     *
+     * @param tenantId
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('system:tenant:query')")
+    @GetMapping(value = "/getTenantChildrenInfo/{tenantId}")
+    public AjaxResult getTenantChildrenInfo(@PathVariable("tenantId") Long tenantId) {
+        return success(sysTenantService.selectSysTenantChildrenInfoByTenantId(tenantId));
+    }
+
     /**
      * 新增租户信息
      */
     @PreAuthorize("@ss.hasPermi('system:tenant:add')")
     @Log(title = "租户信息", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody SysTenant sysTenant)
-    {
+    public AjaxResult add(@RequestBody SysTenant sysTenant) {
         return toAjax(sysTenantService.insertSysTenant(sysTenant));
     }
 
@@ -88,8 +105,7 @@ public class SysTenantController extends BaseController
     @PreAuthorize("@ss.hasPermi('system:tenant:edit')")
     @Log(title = "租户信息", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody SysTenant sysTenant)
-    {
+    public AjaxResult edit(@RequestBody SysTenant sysTenant) {
         return toAjax(sysTenantService.updateSysTenant(sysTenant));
     }
 
@@ -98,9 +114,8 @@ public class SysTenantController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('system:tenant:remove')")
     @Log(title = "租户信息", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{tenantIds}")
-    public AjaxResult remove(@PathVariable Long[] tenantIds)
-    {
+    @DeleteMapping("/{tenantIds}")
+    public AjaxResult remove(@PathVariable Long[] tenantIds) {
         return toAjax(sysTenantService.deleteSysTenantByTenantIds(tenantIds));
     }
 
@@ -109,7 +124,7 @@ public class SysTenantController extends BaseController
      */
     @Anonymous
     @GetMapping("/initTenantMenuData/{tenantId}")
-    public AjaxResult initTenantMenuData(@PathVariable Long tenantId){
+    public AjaxResult initTenantMenuData(@PathVariable Long tenantId) {
         return sysTenantService.initTenantMenuData(tenantId);
     }
 
@@ -117,16 +132,16 @@ public class SysTenantController extends BaseController
      * 生成激活码方法
      */
     @GetMapping("/crateTenantCode/{tenantId}/{tenantExpirationTime}")
-    public AjaxResult crateTenantCode(@PathVariable String tenantId,@PathVariable String tenantExpirationTime) throws Exception {
-        return sysTenantService.crateTenantCode(tenantId,tenantExpirationTime);
+    public AjaxResult crateTenantCode(@PathVariable String tenantId, @PathVariable String tenantExpirationTime) throws Exception {
+        return sysTenantService.crateTenantCode(tenantId, tenantExpirationTime);
     }
 
     /**
      * 激活租户
      */
     @GetMapping("/activationOperation/{tenantId}/{activationCode}")
-    public AjaxResult activationOperation(@PathVariable String tenantId,@PathVariable String activationCode) throws Exception {
-        return sysTenantService.activationOperation(tenantId,activationCode);
+    public AjaxResult activationOperation(@PathVariable String tenantId, @PathVariable String activationCode) throws Exception {
+        return sysTenantService.activationOperation(tenantId, activationCode);
     }
 
 }

+ 116 - 0
zkqy-admin/src/main/java/com/zkqy/web/daochu.java

@@ -0,0 +1,116 @@
+package com.zkqy.web;
+
+import com.zkqy.system.service.ISysMenuService;
+
+import javax.annotation.Resource;
+
+/**
+ * @author hanzihang
+ * @date 2024/3/4 7:59 PM
+ */
+public class daochu {
+
+    @Resource
+    private ISysMenuService iSysMenuService;
+
+    public static void main(String[] args) {
+
+    }
+
+    public void test() {
+
+    }
+}
+
+/*
+ INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115623);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115624);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115625);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115626);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115627);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115628);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115629);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115630);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115631);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115632);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115633);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115634);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115635);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115636);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115637);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115638);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115639);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115640);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115641);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115642);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115643);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115644);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115645);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115646);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115647);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115648);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115649);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115650);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115651);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115652);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115653);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115654);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115655);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115656);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115657);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115658);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115659);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115660);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115661);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115662);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115663);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115664);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115665);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115666);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115667);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115668);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115669);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115670);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115671);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115672);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115673);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115674);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115675);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115676);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115677);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115678);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115679);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115680);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115681);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115682);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115683);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115684);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115685);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115686);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115687);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115746);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115747);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 115756);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116176);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116177);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116178);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116179);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116180);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116181);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116182);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116183);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116184);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116185);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116186);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116187);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116188);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116189);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116190);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116191);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116192);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116193);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116198);
+INSERT INTO `sys_tenant_menu` (`tenant_id`, `menu_id`) VALUES (166, 116199);
+
+
+ */

+ 80 - 14
zkqy-common/src/main/java/com/zkqy/common/core/domain/entity/SysTenant.java

@@ -8,48 +8,115 @@ import javax.validation.constraints.Size;
 
 /**
  * 部门表 sys_tenant
- * 
+ *
  * @author zkqy
  */
-public class SysTenant extends BaseEntity
-{
+public class SysTenant extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 租户ID */
+    /**
+     * 租户ID
+     */
     private Long tenantId;
 
-    /** 租户名称 */
+    /**
+     * 租户名称
+     */
     @Excel(name = "租户名称")
     private String tenantName;
 
-    /** 租户编号(公司统一信用代码) */
+    /**
+     * 租户编号(公司统一信用代码)
+     */
     @Excel(name = "租户编号", readConverterExp = "公司统一信用代码")
     private String tenantCode;
 
-    /** 负责人 */
+    /**
+     * 负责人
+     */
     @Excel(name = "负责人")
     private String owner;
 
-    /** 联系方式 */
+    /**
+     * 联系方式
+     */
     @Excel(name = "联系方式")
     private String contactInfo;
 
-    /** 地址 */
+    /**
+     * 地址
+     */
     @Excel(name = "地址")
     private String address;
 
-    /** 删除标志(0代表存在 1代表删除) */
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
     @Excel(name = "是否删除(0:未删除,1已删除)")
     private String isDel;
 
-    /** 数据源id */
+    /**
+     * 数据源id
+     */
     private Long datasourceId;
 
     private DataSource dataSource;
 
-    /** 租户的到期时间 */
+    /**
+     * 租户的到期时间
+     */
     private String tenantExpirationTime;
 
+    /**
+     * 租户父级id
+     */
+    private String tenantParentId;
+    /**
+     * 租户客户端访问地址
+     */
+
+    private String tenantClientLoginUrl;
+    /**
+     * 租户工具端访问地址
+     */
+    private String tenantToolLoginUrl;
+    /**
+     * 租户等级
+     */
+    private String tenantGrade;
+
+    public String getTenantParentId() {
+        return tenantParentId;
+    }
+
+    public void setTenantParentId(String tenantParentId) {
+        this.tenantParentId = tenantParentId;
+    }
+
+    public String getTenantClientLoginUrl() {
+        return tenantClientLoginUrl;
+    }
+
+    public void setTenantClientLoginUrl(String tenantClientLoginUrl) {
+        this.tenantClientLoginUrl = tenantClientLoginUrl;
+    }
+
+    public String getTenantToolLoginUrl() {
+        return tenantToolLoginUrl;
+    }
+
+    public void setTenantToolLoginUrl(String tenantToolLoginUrl) {
+        this.tenantToolLoginUrl = tenantToolLoginUrl;
+    }
+
+    public String getTenantGrade() {
+        return tenantGrade;
+    }
+
+    public void setTenantGrade(String tenantGrade) {
+        this.tenantGrade = tenantGrade;
+    }
+
     public String getTenantExpirationTime() {
         return tenantExpirationTime;
     }
@@ -71,6 +138,7 @@ public class SysTenant extends BaseEntity
     public String getTenantName() {
         return tenantName;
     }
+
     public void setTenantName(String tenantName) {
         this.tenantName = tenantName;
     }
@@ -153,6 +221,4 @@ public class SysTenant extends BaseEntity
 //    }
 
 
-
-
 }

+ 25 - 9
zkqy-system/src/main/java/com/zkqy/system/mapper/SysTenantMapper.java

@@ -1,27 +1,43 @@
 package com.zkqy.system.mapper;
 
 import java.util.List;
+
 import com.zkqy.common.core.domain.entity.SysTenant;
 
 /**
  * 租户信息Mapper接口
- * 
+ *
  * @author zkqy
  * @date 2023-06-03
  */
-public interface SysTenantMapper 
-{
+public interface SysTenantMapper {
     /**
      * 查询租户信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 租户信息
      */
     public SysTenant selectSysTenantByTenantId(Long tenantId);
 
+    /**
+     * 查询租户信息
+     *
+     * @param tenantId 租户信息主键
+     * @return 租户信息
+     */
+    public List<SysTenant> selectSysTenantChildrenInfoByTenantId(Long tenantId);
+
+    /**
+     * 查询所有租户信息
+     *
+     * @param sysTenant 租户信息
+     * @return 租户信息集合
+     */
+    public List<SysTenant> selectSysTenantAllList(SysTenant sysTenant);
+
     /**
      * 查询租户信息列表
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 租户信息集合
      */
@@ -29,7 +45,7 @@ public interface SysTenantMapper
 
     /**
      * 新增租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
@@ -37,7 +53,7 @@ public interface SysTenantMapper
 
     /**
      * 修改租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
@@ -45,7 +61,7 @@ public interface SysTenantMapper
 
     /**
      * 删除租户信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 结果
      */
@@ -53,7 +69,7 @@ public interface SysTenantMapper
 
     /**
      * 批量删除租户信息
-     * 
+     *
      * @param tenantIds 需要删除的数据主键集合
      * @return 结果
      */

+ 26 - 11
zkqy-system/src/main/java/com/zkqy/system/service/ISysTenantService.java

@@ -7,31 +7,46 @@ import com.zkqy.common.core.domain.entity.SysTenant;
 
 /**
  * 租户信息Service接口
- * 
+ *
  * @author zkqy
  * @date 2023-06-03
  */
-public interface ISysTenantService 
-{
+public interface ISysTenantService {
     /**
      * 查询租户信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 租户信息
      */
     public SysTenant selectSysTenantByTenantId(Long tenantId);
 
+    /**
+     * 查询租户信息
+     *
+     * @param tenantId 租户信息主键
+     * @return 租户信息
+     */
+    public List<SysTenant> selectSysTenantChildrenInfoByTenantId(Long tenantId);
+
     /**
      * 查询租户信息列表
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 租户信息集合
      */
     public List<SysTenant> selectSysTenantList(SysTenant sysTenant);
 
+    /**
+     * 查询所有租户信息
+     *
+     * @param sysTenant 租户信息
+     * @return 租户信息集合
+     */
+    public List<SysTenant> selectSysTenantAllList(SysTenant sysTenant);
+
     /**
      * 新增租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
@@ -39,7 +54,7 @@ public interface ISysTenantService
 
     /**
      * 修改租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
@@ -47,7 +62,7 @@ public interface ISysTenantService
 
     /**
      * 批量删除租户信息
-     * 
+     *
      * @param tenantIds 需要删除的租户信息主键集合
      * @return 结果
      */
@@ -55,7 +70,7 @@ public interface ISysTenantService
 
     /**
      * 删除租户信息信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 结果
      */
@@ -70,10 +85,10 @@ public interface ISysTenantService
     /**
      * 创建租户激活码
      */
-    AjaxResult crateTenantCode( String tenantId,String tenantExpirationTime) throws Exception;
+    AjaxResult crateTenantCode(String tenantId, String tenantExpirationTime) throws Exception;
 
     /**
      * 激活租户
      */
-    AjaxResult activationOperation( String tenantId,String activationCode) throws Exception;
+    AjaxResult activationOperation(String tenantId, String activationCode) throws Exception;
 }

+ 71 - 61
zkqy-system/src/main/java/com/zkqy/system/service/impl/SysTenantServiceImpl.java

@@ -37,13 +37,12 @@ import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 租户信息Service业务层处理
- * 
+ *
  * @author zkqy
  * @date 2023-06-03
  */
 @Service
-public class SysTenantServiceImpl implements ISysTenantService 
-{
+public class SysTenantServiceImpl implements ISysTenantService {
     @Autowired
     private SysTenantMapper sysTenantMapper;
 
@@ -67,51 +66,54 @@ public class SysTenantServiceImpl implements ISysTenantService
 
     /**
      * 查询租户信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 租户信息
      */
     @Override
-    public SysTenant selectSysTenantByTenantId(Long tenantId)
-    {
+    public SysTenant selectSysTenantByTenantId(Long tenantId) {
         return sysTenantMapper.selectSysTenantByTenantId(tenantId);
     }
 
+    @Override
+    public List<SysTenant> selectSysTenantChildrenInfoByTenantId(Long tenantId) {
+        return sysTenantMapper.selectSysTenantChildrenInfoByTenantId(tenantId);
+    }
+
     /**
      * 查询租户信息列表
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 租户信息
      */
     @Override
-    public List<SysTenant> selectSysTenantList(SysTenant sysTenant)
-    {
+    public List<SysTenant> selectSysTenantList(SysTenant sysTenant) {
         SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.DES, "sgEsnN6QWq8W7j5H01020304".getBytes());
         List<SysTenant> sysTenants = sysTenantMapper.selectSysTenantList(sysTenant);
-        sysTenants.stream().forEach(item->{
-            if(item.getTenantExpirationTime()!= null){
+        sysTenants.stream().forEach(item -> {
+            if (item.getTenantExpirationTime() != null) {
                 String decryptStr = symmetricCrypto.decryptStr(item.getTenantExpirationTime(), CharsetUtil.CHARSET_UTF_8);
                 LocalDateTime localDateTime = DateUtils.toLocalDateTime(decryptStr.toString(), "yyyy-MM-dd HH:mm:ss");
                 LocalDateTime start = LocalDateTimeUtil.parse(LocalDateTime.now().toString());
                 LocalDateTime end = LocalDateTimeUtil.parse(localDateTime.toString());
                 Duration between = LocalDateTimeUtil.between(start, end);
                 Long l = between.toDays();
-                if(l<0){
+                if (l < 0) {
                     //String endDay = l.toString().replace("-", "").toString();
                     //item.setTenantExpirationTime("已到期"+endDay+"天");
                     item.setTenantExpirationTime("已到期");
-                }else if(l==0){
+                } else if (l == 0) {
                     //计算两个日期相差的小时数
                     Long totalMinutes = LocalDateTimeUtil.between(start, end, ChronoUnit.MINUTES);
                     //分钟转时间
                     int totalMinutesInt = Integer.parseInt(totalMinutes.toString());
-                    int hours=  (totalMinutesInt/60);
-                    int  remainingMinutes =totalMinutesInt%60;
-                    item.setTenantExpirationTime(0+"天"+hours+"小时"+remainingMinutes+"分钟");
-                }else{
+                    int hours = (totalMinutesInt / 60);
+                    int remainingMinutes = totalMinutesInt % 60;
+                    item.setTenantExpirationTime(0 + "天" + hours + "小时" + remainingMinutes + "分钟");
+                } else {
                     item.setTenantExpirationTime(l.toString());
                 }
-            }else {
+            } else {
                 item.setTenantExpirationTime("未激活");
             }
         });
@@ -119,44 +121,46 @@ public class SysTenantServiceImpl implements ISysTenantService
         return sysTenants;
     }
 
+    @Override
+    public List<SysTenant> selectSysTenantAllList(SysTenant sysTenant) {
+        return sysTenantMapper.selectSysTenantAllList(sysTenant);
+    }
+
     /**
      * 新增租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
     @Override
-    public int insertSysTenant(SysTenant sysTenant)
-    {
+    public int insertSysTenant(SysTenant sysTenant) {
         sysTenant.setCreateTime(DateUtils.getNowDate());
         return sysTenantMapper.insertSysTenant(sysTenant);
     }
 
     /**
      * 修改租户信息
-     * 
+     *
      * @param sysTenant 租户信息
      * @return 结果
      */
     @Override
-    public int updateSysTenant(SysTenant sysTenant)
-    {
+    public int updateSysTenant(SysTenant sysTenant) {
         return sysTenantMapper.updateSysTenant(sysTenant);
     }
 
     /**
      * 批量删除租户信息
-     * 
+     *
      * @param tenantIds 需要删除的租户信息主键
      * @return 结果
      */
     @Override
     @Transactional
-    public int deleteSysTenantByTenantIds(Long[] tenantIds)
-    {
+    public int deleteSysTenantByTenantIds(Long[] tenantIds) {
         //查询删除用户信息编号
         Long[] userIds = sysUserMapper.selectUserIdByTenantIds(tenantIds);
-        if(userIds.length > 0) {
+        if (userIds.length > 0) {
             //删除用户
             userService.deleteUserByIds(userIds);
         }
@@ -166,13 +170,12 @@ public class SysTenantServiceImpl implements ISysTenantService
 
     /**
      * 删除租户信息信息
-     * 
+     *
      * @param tenantId 租户信息主键
      * @return 结果
      */
     @Override
-    public int deleteSysTenantByTenantId(Long tenantId)
-    {
+    public int deleteSysTenantByTenantId(Long tenantId) {
         return sysTenantMapper.deleteSysTenantByTenantId(tenantId);
     }
 
@@ -1662,7 +1665,8 @@ public class SysTenantServiceImpl implements ISysTenantService
 
             //获取租户默认菜单信息
 //            List<SysMenu> menus = objectMapper.readValue(new File("sql/initialize_sys_tenant_menu.json"), objectMapper.getTypeFactory().constructCollectionType(List.class, SysMenu.class));
-            List<SysMenu> menus = JSON.parseObject(ass, new TypeReference<List<SysMenu>>() {});
+            List<SysMenu> menus = JSON.parseObject(ass, new TypeReference<List<SysMenu>>() {
+            });
             //筛选出根节点
             list = menus.stream().filter(menu -> 0L == menu.getParentId()).peek(
                     //设置子节点信息
@@ -1670,8 +1674,8 @@ public class SysTenantServiceImpl implements ISysTenantService
             ).collect(Collectors.toList());
 
             //循环遍历数据新增
-            for (int i = 0; i < list.size(); i++){
-                printTree(list.get(i),0L,tenantId);
+            for (int i = 0; i < list.size(); i++) {
+                printTree(list.get(i), 0L, tenantId);
             }
 
         } catch (Exception e) {
@@ -1679,6 +1683,7 @@ public class SysTenantServiceImpl implements ISysTenantService
         }
         return AjaxResult.success(list);
     }
+
     //获取子节点信息
     private List<SysMenu> getChildrenList(SysMenu root, List<SysMenu> menus) {
         List<SysMenu> list = menus.stream().filter(menu ->
@@ -1690,8 +1695,9 @@ public class SysTenantServiceImpl implements ISysTenantService
         }).collect(Collectors.toList());
         return list;
     }
+
     //新增菜单
-    public void printTree(SysMenu root,Long parentId,Long tenantId) {
+    public void printTree(SysMenu root, Long parentId, Long tenantId) {
         if (root == null) {
             return;
         }
@@ -1705,18 +1711,19 @@ public class SysTenantServiceImpl implements ISysTenantService
         sysTenantMenu.setMenuId(root.getMenuId());
         sysTenantMenuMapper.insertSysTenantMenu(sysTenantMenu);
         for (SysMenu child : root.getChildren()) {  // 遍历子节点
-            printTree(child,root.getMenuId(),tenantId);  // 递归调用
+            printTree(child, root.getMenuId(), tenantId);  // 递归调用
         }
     }
 
     /**
      * 生成激活码
+     *
      * @param tenantId
      * @param tenantExpirationTime
      * @return
      */
     @Override
-    public AjaxResult crateTenantCode(String tenantId,String tenantExpirationTime) throws Exception {
+    public AjaxResult crateTenantCode(String tenantId, String tenantExpirationTime) throws Exception {
         //加密器
         SymmetricCrypto des = new SymmetricCrypto(SymmetricAlgorithm.DES, "sgEsnN6QWq8W7j5H01020304".getBytes());
         //激活码生成时间
@@ -1726,18 +1733,19 @@ public class SysTenantServiceImpl implements ISysTenantService
         LocalDateTime offset = LocalDateTimeUtil.offset(now, 1, ChronoUnit.DAYS);
         String offsetStr = DateUtils.toLocalDateTimeStr(offset);
         //激活码生成时间+租户id+激活码有效期+激活多长时间
-        String dataStr=nowStr+"_"+tenantId+"_"+offsetStr+"_"+tenantExpirationTime;
+        String dataStr = nowStr + "_" + tenantId + "_" + offsetStr + "_" + tenantExpirationTime;
         //加密信息
         String encryptHex = des.encryptHex(dataStr);
         //生成激活码操作
         activationCodeLog("生成激活码");
         //生成了就往
-        stringRedisTemplate.opsForSet().add( "activeCode", encryptHex);
+        stringRedisTemplate.opsForSet().add("activeCode", encryptHex);
         return AjaxResult.success(encryptHex);
     }
 
     /**
      * 激活码激活操作
+     *
      * @param tenantId
      * @param activationCode
      * @return
@@ -1747,13 +1755,13 @@ public class SysTenantServiceImpl implements ISysTenantService
     public AjaxResult activationOperation(String tenantId, String activationCode) throws Exception {
         //是否是一个假的
         Boolean activeCode1 = stringRedisTemplate.opsForSet().isMember("activeCode", activationCode);
-        if(activeCode1==false){
+        if (activeCode1 == false) {
             return AjaxResult.error("请输入系统生成的激活码!!!");
         }
         //是否使用过
-        String activeCode="active:code:"+activationCode;//魔法值后期抽出来
+        String activeCode = "active:code:" + activationCode;//魔法值后期抽出来
         String strCode = stringRedisTemplate.opsForValue().get(activeCode);
-        if(StringUtils.isNotEmpty(strCode)){
+        if (StringUtils.isNotEmpty(strCode)) {
             return AjaxResult.error("当前激活码已经被使用过了不能重复使用");
         }
         //激活码生成时间+租户id+激活码有效期+激活多长时间
@@ -1761,42 +1769,42 @@ public class SysTenantServiceImpl implements ISysTenantService
         String decryptStr = symmetricCrypto.decryptStr(activationCode, CharsetUtil.CHARSET_UTF_8);
         String[] contentString = decryptStr.split("_");
         //判断激活码是否失效
-        String expirationDateStr=contentString[2];
-        LocalDateTime expirationDate = DateUtils.toLocalDateTime(expirationDateStr,"yyyy-MM-dd HH:mm:ss");
+        String expirationDateStr = contentString[2];
+        LocalDateTime expirationDate = DateUtils.toLocalDateTime(expirationDateStr, "yyyy-MM-dd HH:mm:ss");
         long expirationDateSecond = expirationDate.toEpochSecond(ZoneOffset.ofHours(8));
         long nowSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
-        if(expirationDateSecond-nowSecond<0){
+        if (expirationDateSecond - nowSecond < 0) {
             return AjaxResult.error("此激活码已经过期,不能在继续使用");
         }
-        if(!tenantId.equals(contentString[1])){
+        if (!tenantId.equals(contentString[1])) {
             return AjaxResult.error("当前激活码不能在当前租户使用");
         }
         //先查询、这个用户有没有被激活过
         SysTenant sysTenant = sysTenantMapper.selectSysTenantByTenantId(Long.valueOf(tenantId));
-        SysTenant sysTenantOne=new SysTenant();
+        SysTenant sysTenantOne = new SysTenant();
         sysTenantOne.setTenantId(Long.valueOf(tenantId));
         //判断有没有有被激活过、有时间代表激活过
-        if(StringUtils.isNotEmpty(sysTenant.getTenantExpirationTime())){
+        if (StringUtils.isNotEmpty(sysTenant.getTenantExpirationTime())) {
             //解密
             String LastActiveTime = symmetricCrypto.decryptStr(sysTenant.getTenantExpirationTime(), CharsetUtil.CHARSET_UTF_8);
             LocalDateTime localDateTime = DateUtils.toLocalDateTime(LastActiveTime, "yyyy-MM-dd HH:mm:ss");
             //当前日期时间戳
-            long  nowTimeSecond =LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
+            long nowTimeSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8));
             //原来的过期时间
-            long  oldTimeSecond = localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
+            long oldTimeSecond = localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
             //老的过期时间跟当前时间比较 如果小于0证明已经过期好久了
-            if(oldTimeSecond-nowTimeSecond<0){
+            if (oldTimeSecond - nowTimeSecond < 0) {
                 //新续期的时间从当前时间进行续期操作
                 renewalTime(symmetricCrypto, contentString, sysTenantOne);
-            }else {
+            } else {
                 //老的时间快过期了还没过期(旧到期时间+新到期时间(续期操作))
                 LocalDateTime newActiveDateTime = LocalDateTimeUtil.offset(localDateTime, Long.parseLong(contentString[3]), ChronoUnit.DAYS);
                 //加密
-                String newActiveDateTimeStr= symmetricCrypto.encryptHex(DateUtils.toLocalDateTimeStr(newActiveDateTime));
+                String newActiveDateTimeStr = symmetricCrypto.encryptHex(DateUtils.toLocalDateTimeStr(newActiveDateTime));
                 //更新到期时间
                 sysTenantOne.setTenantExpirationTime(newActiveDateTimeStr);
             }
-        }else {
+        } else {
             //新续期的时间从当前时间进行续期操作
             renewalTime(symmetricCrypto, contentString, sysTenantOne);
         }
@@ -1805,12 +1813,13 @@ public class SysTenantServiceImpl implements ISysTenantService
         //保存验证码操作日志
         activationCodeLog("使用激活码");
         //24小时之后就删除了我们保存的验证码信息
-        stringRedisTemplate.opsForValue().set(activeCode,activationCode,24, TimeUnit.HOURS);
+        stringRedisTemplate.opsForValue().set(activeCode, activationCode, 24, TimeUnit.HOURS);
         return AjaxResult.success();
     }
 
     /**
      * 从当前时间往后续期租户时间
+     *
      * @param symmetricCrypto
      * @param contentString
      * @param sysTenantOne
@@ -1821,18 +1830,19 @@ public class SysTenantServiceImpl implements ISysTenantService
         //设置到期时间
         LocalDateTime activeDateTime = LocalDateTimeUtil.offset(localDateTime, Long.parseLong(contentString[3]), ChronoUnit.DAYS);
         //加密到期时间
-        String newActiveDateTimeStr= symmetricCrypto.encryptHex(DateUtils.toLocalDateTimeStr(activeDateTime));
+        String newActiveDateTimeStr = symmetricCrypto.encryptHex(DateUtils.toLocalDateTimeStr(activeDateTime));
         sysTenantOne.setTenantExpirationTime(newActiveDateTimeStr);
     }
 
     /**
      * 保存激活码操作日志
+     *
      * @param msg
      */
     private void activationCodeLog(String msg) {
         //保存生成激活码日志
         SysUser user = SecurityUtils.getLoginUser().getUser();
-        SysActivationCodeLog activationCodeLog=new SysActivationCodeLog();
+        SysActivationCodeLog activationCodeLog = new SysActivationCodeLog();
         //生成时间
         activationCodeLog.setGenerationTime(new Date());
         //ip
@@ -1853,14 +1863,14 @@ public class SysTenantServiceImpl implements ISysTenantService
         System.out.println(a);
         long between = LocalDateTimeUtil.between(LocalDateTime.now(), DateUtils.toLocalDateTime(a, "yyyy-MM-dd HH:mm:ss"), ChronoUnit.DAYS);
         System.out.println(between);
-        if(between==0){
+        if (between == 0) {
             //计算两个日期相差的小时数
             Long totalMinutes = LocalDateTimeUtil.between(LocalDateTime.now(), DateUtils.toLocalDateTime(a, "yyyy-MM-dd HH:mm:ss"), ChronoUnit.MINUTES);
             //分钟转时间
             int totalMinutesInt = Integer.parseInt(totalMinutes.toString());
-            int hours=  (totalMinutesInt/60);
-            int  remainingMinutes =totalMinutesInt%60;
-            System.out.println(hours+"小时"+remainingMinutes+"分钟后就过期了");
+            int hours = (totalMinutesInt / 60);
+            int remainingMinutes = totalMinutesInt % 60;
+            System.out.println(hours + "小时" + remainingMinutes + "分钟后就过期了");
         }
 
         //判断如果用户过期了

+ 76 - 25
zkqy-system/src/main/resources/mapper/system/SysTenantMapper.xml

@@ -1,43 +1,80 @@
 <?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">
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.zkqy.system.mapper.SysTenantMapper">
-    
+
     <resultMap type="SysTenant" id="SysTenantResult">
-        <result property="tenantId"    column="tenant_id"    />
-        <result property="tenantName"    column="tenant_name"    />
-        <result property="tenantCode"    column="tenant_code"    />
-        <result property="owner"    column="owner"    />
-        <result property="contactInfo"    column="contact_info"    />
-        <result property="address"    column="address"    />
-        <result property="createBy"    column="create_by"    />
-        <result property="createTime"    column="create_time"    />
-        <result property="isDel"    column="is_del"    />
+        <result property="tenantId" column="tenant_id"/>
+        <result property="tenantName" column="tenant_name"/>
+        <result property="tenantCode" column="tenant_code"/>
+        <result property="owner" column="owner"/>
+        <result property="contactInfo" column="contact_info"/>
+        <result property="address" column="address"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="isDel" column="is_del"/>
         <result property="datasourceId" column="datasource_id"/>
         <result property="tenantExpirationTime" column="tenant_expiration_time"/>
+        <result property="tenantParentId" column="tenant_parent_id"/>
+        <result property="tenantToolLoginUrl" column="tenant_tool_login_url"/>
+        <result property="tenantClientLoginUrl" column="tenant_client_login_url"/>
+        <result property="tenantGrade" column="tenant_grade"/>
+
     </resultMap>
 
     <sql id="selectSysTenantVo">
-        select tenant_id, tenant_name, tenant_code, owner, contact_info, address, create_by, create_time, is_del,datasource_id,tenant_expiration_time from sys_tenant where is_del = '0'
+        select tenant_id,
+               tenant_name,
+               tenant_code,
+               owner,
+               contact_info,
+               address,
+               create_by,
+               create_time,
+               is_del,
+               datasource_id,
+               tenant_expiration_time,
+               tenant_parent_id,
+               tenant_tool_login_url,
+               tenant_client_login_url,
+               tenant_grade
+        from sys_tenant
+        where is_del = '0'
     </sql>
 
     <select id="selectSysTenantList" parameterType="SysTenant" resultMap="SysTenantResult">
         <include refid="selectSysTenantVo"/>
-            <if test="tenantName != null  and tenantName != ''"> and tenant_name like concat('%', #{tenantName}, '%')</if>
-            <if test="tenantCode != null  and tenantCode != ''"> and tenant_code = #{tenantCode}</if>
-            <if test="owner != null  and owner != ''"> and owner = #{owner}</if>
-            <if test="contactInfo != null  and contactInfo != ''"> and contact_info = #{contactInfo}</if>
-            <if test="address != null  and address != ''"> and address = #{address}</if>
-            <if test="isDel != null  and isDel != ''"> and is_del = #{isDel}</if>
-             order by tenant_id desc
+        and tenant_parent_id = 0
+        <if test="tenantName != null  and tenantName != ''">and tenant_name like concat('%', #{tenantName}, '%')</if>
+        <if test="tenantCode != null  and tenantCode != ''">and tenant_code = #{tenantCode}</if>
+        <if test="owner != null  and owner != ''">and owner = #{owner}</if>
+        <if test="contactInfo != null  and contactInfo != ''">and contact_info = #{contactInfo}</if>
+        <if test="address != null  and address != ''">and address = #{address}</if>
+        <if test="isDel != null  and isDel != ''">and is_del = #{isDel}</if>
+        order by tenant_id desc
+    </select>
+    <select id="selectSysTenantAllList" parameterType="SysTenant" resultMap="SysTenantResult">
+        <include refid="selectSysTenantVo"/>
+        <if test="tenantName != null  and tenantName != ''">and tenant_name like concat('%', #{tenantName}, '%')</if>
+        <if test="tenantCode != null  and tenantCode != ''">and tenant_code = #{tenantCode}</if>
+        <if test="owner != null  and owner != ''">and owner = #{owner}</if>
+        <if test="contactInfo != null  and contactInfo != ''">and contact_info = #{contactInfo}</if>
+        <if test="address != null  and address != ''">and address = #{address}</if>
+        <if test="isDel != null  and isDel != ''">and is_del = #{isDel}</if>
+        order by tenant_id desc
     </select>
-    
+
     <select id="selectSysTenantByTenantId" parameterType="Long" resultMap="SysTenantResult">
         <include refid="selectSysTenantVo"/>
         and tenant_id = #{tenantId}
     </select>
-        
+
+    <select id="selectSysTenantChildrenInfoByTenantId" parameterType="Long" resultMap="SysTenantResult">
+        <include refid="selectSysTenantVo"/>
+        and tenant_parent_id = #{tenantId}
+    </select>
+
     <insert id="insertSysTenant" parameterType="SysTenant" useGeneratedKeys="true" keyProperty="tenantId">
         insert into sys_tenant
         <trim prefix="(" suffix=")" suffixOverrides=",">
@@ -49,8 +86,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="datasourceId != null">datasource_id,</if>
+            <if test="tenantParentId != null">tenant_parent_id,</if>
+            <if test="tenantClientLoginUrl !=null">tenant_client_login_url,</if>
+            <if test="tenantToolLoginUrl !=null">tenant_tool_login_url,</if>
+            <if test="tenantGrade != null">tenant_grade,</if>
             is_del
-         </trim>
+        </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="tenantName != null and tenantName != ''">#{tenantName},</if>
             <if test="tenantCode != null and tenantCode != ''">#{tenantCode},</if>
@@ -60,8 +101,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="datasourceId != null">#{datasourceId},</if>
+            <if test="tenantParentId != null">#{tenantParentId},</if>
+            <if test="tenantClientLoginUrl !=null">#{tenantClientLoginUrl},</if>
+            <if test="tenantToolLoginUrl !=null">#{tenantToolLoginUrl},</if>
+            <if test="tenantGrade != null"> #{tenantGrade},</if>
             '0'
-         </trim>
+        </trim>
     </insert>
 
     <update id="updateSysTenant" parameterType="SysTenant">
@@ -76,12 +121,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="datasourceId != null">datasource_id = #{datasourceId},</if>
             <if test="tenantExpirationTime != null">tenant_expiration_time = #{tenantExpirationTime},</if>
+            <if test="tenantParentId != null">tenant_parent_id = #{tenantParentId},</if>
+            <if test="tenantToolLoginUrl !=null">tenant_tool_login_url = #{tenantToolLoginUrl},</if>
+            <if test="tenantClientLoginUrl !=null">tenant_client_login_url = #{tenantClientLoginUrl},</if>
+            <if test="tenantGrade != null">tenant_grade = #{tenantGrade},</if>
         </trim>
         where tenant_id = #{tenantId}
     </update>
 
     <update id="deleteSysTenantByTenantId" parameterType="Long">
-        update sys_tenant set is_del = '2' where tenant_id = #{tenantId}
+        update sys_tenant
+        set is_del = '2'
+        where tenant_id = #{tenantId}
     </update>
 
     <update id="deleteSysTenantByTenantIds" parameterType="String">

+ 17 - 0
zkqy-ui/src/api/system/tenant.js

@@ -8,6 +8,14 @@ export function listTenant(query) {
     params: query
   })
 }
+// 查询所有租户信息列表
+export function getTenantAllList(query) {
+  return request({
+    url: '/system/tenant/getTenantAllList',
+    method: 'get',
+    params: query
+  })
+}
 
 // 查询租户信息详细
 export function getTenant(tenantId) {
@@ -17,6 +25,14 @@ export function getTenant(tenantId) {
   })
 }
 
+// 查询当前租户下所有子租户信息
+export function getTenantChildrenInfo(tenantId) {
+  return request({
+    url: '/system/tenant/getTenantChildrenInfo/' + tenantId,
+    method: 'get'
+  })
+}
+
 // 新增租户信息
 export function addTenant(data) {
   return request({
@@ -84,6 +100,7 @@ export function createTenantCode(data) {
     method: 'get',
   })
 }
+
 // 激活码激活租户
 export function activationOperation(data) {
   return request({

Fișier diff suprimat deoarece este prea mare
+ 415 - 286
zkqy-ui/src/views/system/tenant/index.vue


+ 1284 - 0
zkqy-ui/src/views/system/tenant/tenantIndex.vue

@@ -0,0 +1,1284 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      size="small"
+      :inline="true"
+      v-show="showSearch"
+      label-width="68px"
+    >
+      <el-form-item label="租户名称" prop="tenantName">
+        <el-input
+          v-model="queryParams.tenantName"
+          placeholder="请输入租户名称"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="租户编号" prop="tenantCode">
+        <el-input
+          v-model="queryParams.tenantCode"
+          placeholder="请输入租户编号"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="负责人" prop="owner">
+        <el-input
+          v-model="queryParams.owner"
+          placeholder="请输入负责人"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="联系方式" prop="contactInfo">
+        <el-input
+          v-model="queryParams.contactInfo"
+          placeholder="请输入联系方式"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="地址" prop="address">
+        <el-input
+          v-model="queryParams.address"
+          placeholder="请输入地址"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+        >搜索
+        </el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置
+        </el-button
+        >
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:tenant:add']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          v-if="selection.length == 0"
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:tenant:export']"
+        >导出
+        </el-button>
+        <ExcelDownLoad
+          v-else
+          :headerList="headerList"
+          :fieldList="selection"
+          :excelTitle="excelTitle"
+        ></ExcelDownLoad>
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <el-table
+      :data="tenantList"
+      style="width: 100%"
+      row-key="tenantId"
+      border
+      lazy
+      :load="load"
+      :tree-props="{children: 'children', hasChildren:'hasChildren' }"
+    >
+      <el-table-column label="租户ID" align="center" prop="tenantId"/>
+      <el-table-column label="租户名称" align="center" prop="tenantName"/>
+      <el-table-column label="租户编号" align="center" prop="tenantCode"/>
+      <el-table-column label="负责人" align="center" prop="owner"/>
+      <el-table-column label="联系方式" align="center" prop="contactInfo"/>
+      <el-table-column label="地址" align="center" prop="address"/>
+      <el-table-column label="租户父级ID" align="center" prop="tenantParentId"/>
+      <el-table-column label="客户端访问地址" align="center" prop="tenantClientLoginUrl"/>
+      <el-table-column label="工具端访问地址" align="center" prop="tenantToolLoginUrl"/>
+      <el-table-column label="租户等级" align="center" prop="tenantGrade"/>
+      <el-table-column label="到期天数" align="center" prop="tenantExpirationTime"/>
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:tenant:edit']"
+                >修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >删除
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-position"
+                  @click="bindDatasource(scope.row)"
+                  v-show="scope.row.datasourceId == null"
+                >绑定数据源
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-s-custom"
+                  @click="openTenantExpirationTime(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >激活租户
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-s-open"
+                  @click="openLoginConfig(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >配置登录页
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-table
+      v-loading="loading"
+      :data="tenantList"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="租户ID" align="center" prop="tenantId"/>
+      <el-table-column label="租户名称" align="center" prop="tenantName"/>
+      <el-table-column label="租户编号" align="center" prop="tenantCode"/>
+      <el-table-column label="负责人" align="center" prop="owner"/>
+      <el-table-column label="联系方式" align="center" prop="contactInfo"/>
+      <el-table-column label="地址" align="center" prop="address"/>
+      <el-table-column label="租户父级ID" align="center" prop="tenantParentId"/>
+      <el-table-column label="客户端访问地址" align="center" prop="tenantClientLoginUrl"/>
+      <el-table-column label="工具端访问地址" align="center" prop="tenantToolLoginUrl"/>
+      <el-table-column label="租户等级" align="center" prop="tenantGrade"/>
+      <el-table-column
+        label="到期天数"
+        align="center"
+        prop="tenantExpirationTime"
+      />
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+      >
+        <template slot-scope="scope">
+          <el-dropdown>
+            <el-button type="warning" plain size="small">
+              处理<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:tenant:edit']"
+                >修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >删除
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-position"
+                  @click="bindDatasource(scope.row)"
+                  v-show="scope.row.datasourceId == null"
+                >绑定数据源
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-s-custom"
+                  @click="openTenantExpirationTime(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >激活租户
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-s-open"
+                  @click="openLoginConfig(scope.row)"
+                  v-hasPermi="['system:tenant:remove']"
+                >配置登录页
+                </el-button>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改租户信息对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="选择上级租户" prop="tenantParentId">
+          <el-cascader v-model="form.tenantParentId"
+                       :options="tenantAllList"
+                       :props="{ checkStrictly: true ,label:'tenantName',value:'tenantId' }" clearable
+          ></el-cascader>
+        </el-form-item>
+        <el-form-item label="租户名称" prop="tenantName">
+          <el-input v-model="form.tenantName" placeholder="请输入租户名称"/>
+        </el-form-item>
+        <el-form-item label="租户编号" prop="tenantCode">
+          <el-input v-model="form.tenantCode" placeholder="请输入租户编号"/>
+        </el-form-item>
+        <el-form-item label="负责人" prop="owner">
+          <el-input v-model="form.owner" placeholder="请输入负责人"/>
+        </el-form-item>
+        <el-form-item label="联系方式" prop="contactInfo">
+          <el-input v-model="form.contactInfo" placeholder="请输入联系方式"/>
+        </el-form-item>
+        <el-form-item label="地址" prop="address">
+          <el-input v-model="form.address" placeholder="请输入地址"/>
+        </el-form-item>
+
+        <el-form-item label="客户端访问地址" prop="tenantClientLoginUrl">
+          <el-input v-model="form.tenantClientLoginUrl" placeholder="请输入地址"/>
+        </el-form-item>
+        <el-form-item label="工具端访问地址" prop="tenantToolLoginUrl">
+          <el-input v-model="form.tenantToolLoginUrl" placeholder="请输入地址"/>
+        </el-form-item>
+        <el-form-item label="租户等级" prop="tenantGrade">
+          <el-input v-model="form.tenantGrade" placeholder="请输入地址"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 添加或修改数据源信息对话框 -->
+    <el-dialog
+      :title="dataSourceTitle"
+      :visible.sync="dataSourceOpen"
+      width="500px"
+      append-to-body
+      class="loadingClass"
+    >
+      <el-radio-group
+        v-model="dataSourceType"
+        class="mb5"
+        @input="dataSourceTypeChange"
+      >
+        <el-radio-button :label="true">公网</el-radio-button>
+        <el-radio-button :label="false">内网</el-radio-button>
+      </el-radio-group>
+      <el-form
+        ref="dataSourceForm"
+        :model="dataSourceForm"
+        :rules="dataSourceFormRules"
+        label-width="120px"
+      >
+        <el-form-item label="数据源类型" prop="databaseType">
+          <el-select
+            v-model="dataSourceForm.databaseType"
+            :placeholder="palcemsg"
+            @change="selecthandle"
+            :disabled="dataSourceType"
+          >
+            <el-option
+              v-for="item in dict.type.datasource_type"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据库名称" prop="databaseName">
+          <el-input
+            v-model="dataSourceForm.databaseName"
+            placeholder="请输入数据库名称"
+          />
+        </el-form-item>
+        <el-form-item label="租户管理员账号" prop="tenantAccount">
+          <el-input
+            v-model="dataSourceForm.tenantAccount"
+            placeholder="请输入租户管理员账号"
+          />
+        </el-form-item>
+
+        <!-- !dataSourceType -->
+        <el-form-item
+          label="数据库IP"
+          v-show="!dataSourceType"
+          prop="databaseIp"
+        >
+          <el-input
+            v-model="dataSourceForm.databaseIp"
+            placeholder="请输数据库IP"
+          />
+        </el-form-item>
+        <el-form-item label="用户名" v-show="!dataSourceType" prop="username">
+          <el-input
+            v-model="dataSourceForm.username"
+            placeholder="请输入用户名"
+          />
+        </el-form-item>
+        <el-form-item label="密码" v-show="!dataSourceType" prop="password">
+          <el-input
+            v-model="dataSourceForm.password"
+            placeholder="请输入密码"
+          />
+        </el-form-item>
+
+        <el-form-item label="端口号" v-show="!dataSourceType" prop="portNumber">
+          <el-input
+            v-model="dataSourceForm.portNumber"
+            placeholder="请输入端口号"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button
+          type="primary"
+          @click="submitForm1"
+          :disabled="dialogLoading"
+          :loading="dialogLoading"
+        >{{ dialogLoading ? '绑定中' : '确 定' }}
+        </el-button
+        >
+        <el-button @click="cancel1">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 激活租户弹出层-->
+    <el-dialog
+      title="激活租户"
+      :visible.sync="tenantExpirationTimeOpen"
+      width="500px"
+      append-to-body
+    >
+      <el-form
+        ref="tenantExpirationTimeFrom"
+        :model="tenantExpirationTimeFrom"
+        :rules="rulesTenantExpirationTime"
+        label-width="80px"
+      >
+        <el-form-item
+          label="激活租户"
+          prop="tenantExpirationTime"
+          label-width="110px"
+        >
+          <el-input
+            v-model="tenantExpirationTimeFrom.tenantExpirationTime"
+            placeholder="请输入激活码"
+          />
+        </el-form-item>
+        <el-form-item class="btn">
+          <el-button
+            type="primary"
+            @click="activationOperationMethod('tenantExpirationTimeFrom')"
+          >确 定
+          </el-button
+          >
+          <el-button @click="tanentCancel">取 消</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+    <!-- 登录页面配置信息列表 -->
+    <el-dialog
+      title="配置登录页"
+      width="800px"
+      :visible.sync="loginOpen"
+      append-to-body
+    >
+      <el-form
+        ref="loginFormRef"
+        :model="loginForm"
+        :inline="true"
+        :rules="rules"
+        label-width="80px"
+      >
+        <el-form-item prop="loginPageNumber">
+          <span slot="label">
+            <el-tooltip
+              content="请在登录时的url后拼接参数:tenantId={编号}"
+              placement="top"
+            >
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            编号:
+          </span>
+          <el-input
+            v-model="loginForm.loginPageNumber"
+            placeholder="请输入登录页面编号"
+            disabled
+          />
+        </el-form-item>
+        <!-- <el-col :span="8"> -->
+        <el-form-item label="标题:" prop="loginPageTitle">
+          <el-input
+            v-model="loginForm.loginPageTitle"
+            placeholder="请输入登录页面标题"
+          />
+        </el-form-item>
+        <!-- </el-col> -->
+        <!-- <el-col :span="8"> -->
+        <el-form-item label="描述:" prop="loginPageDescription">
+          <span slot="label">
+            <el-tooltip
+              content="推荐长度为8个汉字,可使用<br/>换行"
+              placement="top"
+            >
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            描述:
+          </span>
+          <el-input
+            v-model="loginForm.loginPageDescription"
+            type="textarea"
+            placeholder="请输入内容"
+          />
+        </el-form-item>
+        <!-- </el-col>
+        <el-col :span="8"> -->
+        <el-form-item label="窗口标题:" prop="windowTitle">
+          <el-input
+            v-model="loginForm.windowTitle"
+            placeholder="请输入窗口标题"
+          />
+        </el-form-item>
+        <!-- </el-col> -->
+        <!-- <el-col :span="8"> -->
+        <el-form-item prop="loginPageLogo">
+          <span slot="label">
+            <el-tooltip content="推荐图片大小为194*64px" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            logo:
+          </span>
+          <image-upload :limit="1" v-model="loginForm.loginPageLogo"/>
+        </el-form-item>
+        <!-- </el-col> -->
+        <!-- <el-col :span="8"> -->
+        <el-form-item prop="loginPageBackgroundImage">
+          <span slot="label">
+            <el-tooltip content="推荐图片大小为1400*900px" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            背景图:
+          </span>
+          <image-upload
+            :limit="1"
+            v-model="loginForm.loginPageBackgroundImage"
+          />
+        </el-form-item>
+        <!-- </el-col> -->
+        <!-- <el-col :span="8"> -->
+        <!-- <el-form-item label="窗口logo:" prop="windowLogo">
+          <image-upload
+            :fileType="['png']"
+            :limit="1"
+            :uploadUrl="'/common/uploadAndConvert'"
+            v-model="loginForm.windowLogo"
+          />
+        </el-form-item> -->
+        <!-- </el-col> -->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitLoginForm">确 定</el-button>
+        <el-button @click="cancelLoginForm">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listTenant,
+  getTenant,
+  delTenant,
+  addTenant,
+  updateTenant,
+  bindDatasource,
+  selectAllUser,
+  createTenant,
+  initTenantMenuData,
+  activationOperation,
+  getTenantChildrenInfo, getTenantAllList
+} from '@/api/system/tenant'
+import {getDataSourceInfo, insertDataSource} from '@/api/system/data'
+import {
+  listConfiguration,
+  getConfiguration,
+  delConfiguration,
+  addConfiguration,
+  updateConfiguration
+} from '@/api/system/configuration'
+import {servicesLoading} from '@/utils/zkqy'
+import {getIsExistUser} from '@/api/system/user'
+import ExcelDownLoad from '@/components/ExcelDownLoad/index.vue'
+
+export default {
+  name: 'Tenant',
+  dicts: [
+    'datasource_type',
+    'sqlserver_connection_information',
+    'mysql_connection_information',
+    'dm_connection_information',
+    'orcale_connection_information',
+    'system_login_url'
+  ],
+  components: {
+    ExcelDownLoad
+  },
+  data() {
+    return {
+      tenantAllList: [],
+      // 登录页面数据
+      isEdit: false,
+      loginOpen: false,
+      loginForm: {
+        loginPageNumber: '',
+        loginPageTitle: '',
+        loginPageDescription: '',
+        loginPageLogo: '',
+        loginPageBackgroundImage: '',
+        windowTitle: '',
+        windowLogo: '',
+        tenantId: ''
+      },
+      // 前端导出数据
+      selection: [],
+      headerList: {
+        租户名称: 'tenantName',
+        租户编号: 'tenantCode',
+        负责人: 'owner',
+        联系方式: 'contactInfo',
+        地址: 'address',
+        是否删除: 'isDel'
+      },
+      excelTitle: 'tenant',
+      // 弹窗的加载提示
+      dialogLoading: false,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 租户信息表格数据
+      tenantList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 所有用户信息
+      allUser: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tenantName: null,
+        tenantCode: null,
+        owner: null,
+        contactInfo: null,
+        address: null
+      },
+      // 当前编辑租户的信息
+      currentTenantInfo: {},
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        tenantName: [
+          {required: true, message: '租户名称不能为空', trigger: 'blur'}
+        ],
+        tenantCode: [
+          {required: true, message: '租户编号不能为空', trigger: 'blur'}
+        ],
+        tenantParentId: [
+          {required: true, message: '请选择上级租户', trigger: 'blur'}
+        ]
+      },
+      //数据源表单参数
+      dataSourceType: true, //true:公网  false:内网
+      dataSourceForm: {
+        databaseType: '',
+        databaseName: '',
+        tenantAccount: '',
+        databaseIp: '',
+        username: '',
+        password: '',
+        portNumber: ''
+      },
+      dataSourceTitle: '',
+      dataSourceOpen: false,
+      fromTenantId: null,
+      dataSourceFormRules: {
+        databaseType: [
+          {required: true, message: '数据源类型不能为空', trigger: 'change'}
+        ],
+        databaseName: [
+          {required: true, message: '数据库名不能为空', trigger: 'blur'},
+          {validator: this.databaseNameValidator, trigger: 'blur'}
+        ],
+        tenantAccount: [
+          {
+            required: true,
+            message: '租户管理员账号不能为空',
+            trigger: 'change'
+          },
+          {validator: this.tenantAccountValidator, trigger: 'blur'}
+        ],
+        databaseIp: [
+          {required: true, message: '数据库IP不能为空', trigger: 'blur'}
+        ],
+        username: [
+          {required: true, message: '用户名不能为空', trigger: 'blur'}
+        ],
+        password: [
+          {required: true, message: '密码不能为空', trigger: 'blur'}
+        ],
+        portNumber: [
+          {required: true, message: '端口号不能为空', trigger: 'blur'}
+        ]
+      },
+      //租户激活码弹窗表单
+      tenantExpirationTimeFrom: {
+        tenantId: null,
+        tenantExpirationTime: ''
+      },
+      //租户激活码弹窗标题
+      tenantExpirationTimeOpen: false,
+      //租户激活码规则验证
+      rulesTenantExpirationTime: {
+        tenantExpirationTime: [
+          {required: true, message: '请输入租户激活码', trigger: 'blur'}
+        ]
+      },
+      currentPage: '',
+      // 已存在的数据库名称
+      databaseNameList: [],
+      tableData1: [{
+        id: 1,
+        date: '2016-05-02',
+        name: '王小虎',
+        address: '上海市普陀区金沙江路 1518 弄'
+      }, {
+        id: 2,
+        date: '2016-05-04',
+        name: '王小虎',
+        address: '上海市普陀区金沙江路 1517 弄'
+      }, {
+        id: 3,
+        date: '2016-05-01',
+        name: '王小虎',
+        address: '上海市普陀区金沙江路 1519 弄',
+        hasChildren: true
+      }, {
+        id: 4,
+        date: '2016-05-03',
+        name: '王小虎',
+        address: '上海市普陀区金沙江路 1516 弄'
+      }]
+    }
+  },
+  computed: {
+    palcemsg() {
+      return this.dataSourceType ? 'mysql' : '请选择数据源类型'
+    }
+  },
+  created() {
+    this.getList()
+    this.selectAllUser()
+  },
+  methods: {
+    load(tree, treeNode, resolve) {
+      console.log(tree, treeNode, resolve)
+      // 根据当前租户id查询子租户
+      getTenantChildrenInfo(tree.tenantId).then(res => {
+        if (res.data != null) {
+          resolve(res.data)
+        } else {
+          resolve({})
+        }
+      })
+    },
+
+    // 查询所有平台所有租户
+    getTenantAllList() {
+      getTenantAllList().then((response) => {
+        let tenantAllListOne = this.handleTree(response.rows, 'tenantId', 'tenantParentId')
+        this.tenantAllList = [
+          {"tenantId": 0, "tenantName": "顶级租户"},
+          ...tenantAllListOne
+        ]
+      })
+    },
+    buildTree(data, parentId = null) {
+      const children = data.filter(item => item.tenantParentId === parentId)
+      return children.map(child => ({
+        value: child.tenantId,
+        label: child.tenantName,
+        children: this.buildTree(data, child.tenantId) // 将 child.tenant_id 作为下一层的 parentId
+      }))
+    },
+    transformTenantsToCascaderOptions(tenants) {
+      console.log(tenants)
+      const options = []
+      const map = {} // 用于存储每个tenant的引用,以便后续添加children
+
+      tenants.forEach(tenant => {
+        const {tenantId, tenantName, tenantParentId} = tenant
+        const option = {
+          value: tenantId,
+          label: tenantName,
+          children: [] // 初始化children数组
+        }
+
+        if (tenantParentId === null) {
+          // 如果没有父级,说明是顶级租户,直接添加到options中
+          options.push(option)
+        } else {
+          // 如果有父级,则先查找父级租户在map中的引用,并添加到其children数组中
+          if (!map[tenantParentId]) {
+            // 如果父级租户还没被处理过,先创建一个空的引用
+            map[tenantParentId] = {children: []}
+          }
+          map[tenantParentId].children.push(option)
+        }
+        // 将当前租户添加到map中,方便后续查找
+        map[tenantId] = option
+      })
+
+      // 遍历map,将顶级租户的children填充完整
+      Object.values(map).forEach(option => {
+        if (!options.includes(option)) {
+          // 如果这个选项不是顶级租户,则将其添加到某个顶级租户的children中
+          const parentOption = options.find(o => o.children.includes(option))
+          if (parentOption) {
+            parentOption.children.push(option)
+          }
+        }
+      })
+      console.log(options)
+      return options
+    },
+    // 提交登录页配置数据
+    submitLoginForm() {
+      this.$refs.loginFormRef?.validate(async (valid) => {
+        if (valid) {
+          console.log(this.loginForm)
+          let res = {},
+            msg = ''
+          if (this.isEdit) {
+            res = await updateConfiguration(this.loginForm)
+            msg = '修改'
+          } else {
+            res = await addConfiguration(this.loginForm)
+            msg = '保存'
+          }
+          if (res.code == 200) {
+            this.$message.success(`${msg}成功`)
+            this.loginOpen = false
+          } else {
+            this.$message.error(`${msg}失败,请检查网络`)
+          }
+        } else {
+          console.log(`${msg}失败,请检查网络`)
+          return false
+        }
+      })
+    },
+    // 取消登录页配置
+    cancelLoginForm() {
+      this.loginOpen = false
+    },
+    // 编辑租户登录页配置
+    async openLoginConfig(row) {
+      try {
+        let res = await getConfiguration(row.tenantId)
+        if (res.code == 200) {
+          if (res.data) {
+            this.loginForm = res.data
+            this.isEdit = true
+          } else {
+            this.resetloginForm()
+            this.isEdit = false
+          }
+          // 目前一个租户只能有一个配置项故使用租户唯一编码
+          this.loginForm.loginPageNumber = row.tenantCode
+          this.loginForm.tenantId = row.tenantId
+          this.loginOpen = true
+        } else {
+          this.$message.error('网络异常,请稍后再试')
+        }
+      } catch (error) {
+      }
+    },
+    // 获取所用用户名,作校验用
+    async selectAllUser() {
+      let res = await selectAllUser()
+      if (res.code == 200) {
+        this.allUser = res.data
+      } else {
+        console.log(res.msg)
+      }
+    },
+    // 重置login配置表单数据
+    resetloginForm() {
+      this.loginForm = {
+        loginPageNumber: '',
+        loginPageTitle: '',
+        loginPageDescription: '',
+        loginPageLogo: '',
+        loginPageBackgroundImage: '',
+        windowTitle: '',
+        windowLogo: '',
+        tenantId: ''
+      }
+    },
+    // 租户名自定义校验规则
+    async tenantAccountValidator(rule, value, callback) {
+      // let isRepeat = this.allUser.filter((item) => item.userName == value);
+      // if (isRepeat.length !== 0) {
+      //   callback(new Error("租户账号重复"));
+      // } else {
+      //   callback();
+      // }
+      if (value) {
+        await getIsExistUser({userName: value}).then((res) => {
+          if (res.code == 200) {
+            if (res.data) {
+              callback()
+            } else {
+              callback(new Error('租户管理员账号已存在'))
+            }
+          } else {
+            callback(new Error('租户管理员账号校验失败,请重新输入'))
+          }
+        })
+      }
+      callback()
+    },
+    // 数据库名自定义校验规则--请求后端校验
+    // async databaseNameValidator(rule, value, callback) {
+    //   if (value) {
+    //     await getDataSourceInfo({ databaseName: value }).then((res) => {
+    //       if (res.code == 200) {
+    //         if (res.data) {
+    //           callback();
+    //         } else {
+    //           callback(new Error("数据库名已存在"));
+    //         }
+    //       } else {
+    //         callback(new Error("数据库名校验失败,请重新输入"));
+    //       }
+    //     });
+    //   }
+    // },
+    // 数据库名称校验规则
+    databaseNameValidator(rule, value, callback) {
+      // 正则校验
+      let regex = /^[a-z][a-z0-9]*$/
+      if (regex.test(value)) {
+        // callback(); // 输入内容符合规则
+      } else {
+        callback(new Error('只能包含小写字母和数字,且以小写字母开头'))
+      }
+      // 重名校验
+      let isRepeat = this.databaseNameList.filter((item) => item == value)
+      if (isRepeat.length !== 0) {
+        callback(new Error('数据库名重复'))
+      } else {
+        callback()
+      }
+    },
+    // 数据源类型改变回调
+    dataSourceTypeChange(type) {
+      this.$nextTick(() => {
+        this.$refs.dataSourceForm.resetFields()
+        this.dataSourceForm.databaseType = 'mysql'
+        this.selecthandle('mysql')
+      })
+    },
+    handleOpe() {
+    },
+    /** 查询租户信息列表 */
+    getList() {
+      this.loading = true
+      this.currentPage = this.queryParams.pageNum
+      listTenant(this.queryParams).then((response) => {
+        this.tenantList = response.rows
+        this.tenantList.forEach(item => {
+          item['hasChildren'] = true
+        })
+        this.total = response.total
+        this.loading = false
+      })
+    },
+// 取消按钮
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 绑定数据源取消按钮
+    cancel1() {
+      this.dataSourceOpen = false
+      this.reset1()
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        tenantParentId: null,
+        tenantId: null,
+        tenantName: null,
+        tenantCode: null,
+        owner: null,
+        contactInfo: null,
+        address: null,
+        createBy: null,
+        createTime: null
+      }
+      this.resetForm('form')
+    },
+    // 表单重置
+    reset1() {
+      this.dataSourceType = true
+      this.dataSourceForm = {
+        id: null,
+        databaseName: null,
+        databaseIp: null,
+        tenantAccount: '',
+        username: null,
+        password: null,
+        portNumber: null,
+        databaseType: 'mysql'
+      }
+      // this.resetForm("dataSourceForm");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.selection = selection
+      this.ids = selection.map((item) => item.tenantId)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.getTenantAllList()
+      // this.reset();
+      this.open = true
+      this.title = '添加租户信息'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const tenantId = row.tenantId || this.ids
+      getTenant(tenantId).then((response) => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改租户信息'
+      })
+    },
+    /** 绑定数据源按钮操作 */
+    bindDatasource(row) {
+      this.currentTenantInfo = row
+      this.reset1()
+      this.dialogLoading = false
+      this.dataSourceOpen = true
+      this.dataSourceTitle = row.tenantName + '配置数据库'
+      this.fromTenantId = row.tenantId
+      this.dataSourceTypeChange()
+
+      // const tenantId = row.tenantId || this.ids;
+      // getTenant(tenantId).then((response) => {
+      //   this.form = response.data;
+      //   this.open = true;
+      //   this.title = "修改租户信息";
+      // });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      if (this.form.tenantParentId.length >= 0) {
+        // 处理当前租户的上级租户id
+        this.form.tenantParentId = this.form.tenantParentId[this.form.tenantParentId.length - 1] != undefined ? this.form.tenantParentId[this.form.tenantParentId.length - 1] : ''
+      }
+      this.form.tenantClientLoginUrl = this.dict.type.system_login_url.find(item => item.label == 'client_login_url')?.value.replace("#{val}", this.form.tenantCode)
+      this.form.tenantToolLoginUrl = this.dict.type.system_login_url.find(item => item.label == 'crm_login_url')?.value.replace("#{val}", this.form.tenantCode)
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.form.tenantId != null) {
+            updateTenant(this.form).then((response) => {
+              this.$modal.msgSuccess('修改成功')
+              this.open = false
+              this.getList()
+            })
+          } else {
+            addTenant(this.form).then((response) => {
+              this.$modal.msgSuccess('新增成功')
+              this.open = false
+              this.getList()
+            })
+          }
+        }
+        this.reset()
+      })
+    },
+    /** 提交按钮 */
+    submitForm1() {
+      if (this.dialogLoading) return
+      this.dialogLoading = true
+      this.$refs['dataSourceForm'].validate((valid) => {
+        if (valid) {
+          // const loading = servicesLoading(
+          //   ".loadingClass",
+          //   "正在绑定数据源",
+          //   true
+          // );
+          if (this.dataSourceForm.id != null) {
+            // bindDatasource(this.dataSourceForm).then((response) => {
+            //   this.$modal.msgSuccess("修改成功");
+            //   this.dataSourceOpen = false;
+            //   this.getList();
+            // });
+            this.dialogLoading = false
+          } else {
+            let query = {
+              tenantId: this.fromTenantId,
+              dataSource: this.dataSourceForm
+            }
+            bindDatasource(query)
+              .then((response) => {
+                if (response.code == 200) {
+                  let data = {
+                    userName: this.dataSourceForm.tenantAccount,
+                    nickName: this.currentTenantInfo.tenantName,
+                    userType: '01',
+                    tenantId: this.currentTenantInfo.tenantId,
+                    password: '123456'
+                  }
+                  createTenant(data)
+                    .then(async (res) => {
+                      if (res.code == 200) {
+                        let resp = await initTenantMenuData(
+                          this.currentTenantInfo.tenantId
+                        )
+                        if ((resp.code = 200)) {
+                          this.$modal.msgSuccess('新增成功')
+                          this.dataSourceOpen = false
+                          this.getList()
+                        }
+                      }
+                    })
+                    .finally(() => {
+                      this.dialogLoading = false
+                    })
+                }
+              })
+              .finally(() => {
+                this.dialogLoading = false
+              })
+          }
+        }
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const tenantIds = row.tenantId || this.ids
+      this.$modal
+        .confirm('是否确认删除租户信息编号为"' + tenantIds + '"的数据项?')
+        .then(function () {
+          return delTenant(tenantIds)
+        })
+        .then(() => {
+          this.getList()
+          this.$modal.msgSuccess('删除成功')
+        })
+        .catch(() => {
+        })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download(
+        'system/tenant/export',
+        {
+          ...this.queryParams
+        },
+        `tenant_${new Date().getTime()}.xlsx`
+      )
+    },
+    /**
+     * 选择数据源校验名称
+     */
+    selecthandle(row) {
+      let sql = {
+        sqlserver: 'sqlserver_connection_information',
+        mysql: 'mysql_connection_information',
+        dm: 'dm_connection_information',
+        oracle: 'oracle_connection_information'
+      }
+      let qar = {}
+      this.dict.type[sql[row]].forEach((item) => {
+        qar[item.label] = item.value
+      })
+      if (this.dataSourceType) {
+        let {databaseIp, password, portNumber, username} = qar
+        Object.assign(this.dataSourceForm, {
+          databaseIp,
+          password,
+          portNumber,
+          username
+        })
+      }
+      getDataSourceInfo(qar).then((res) => {
+        // console.log(res);
+        this.databaseNameList = res.data
+      })
+    },
+    handleTest() {
+      let formdata = {
+        databaseType: 'mysql',
+        databaseName: 'test1111',
+        databaseIp: '127.0.0.1',
+        username: 'testname',
+        password: '123123',
+        portNumber: '3306'
+      }
+      insertDataSource(formdata).then((res) => {
+        console.log(res)
+      })
+    },
+    //重置租户激活码表单
+    restTenantExpirationTime() {
+      this.tenantExpirationTimeFrom = {
+        tenantId: null,
+        tenantExpirationTime: ''
+      }
+      this.resetForm('tenantExpirationTimeFrom')
+    },
+    /**打开激活码弹窗*/
+    openTenantExpirationTime(row) {
+      // this.reset();
+      const tenantId = row.tenantId || this.ids
+      this.tenantExpirationTimeFrom.tenantId = row.tenantId
+      this.tenantExpirationTimeOpen = true
+      // this.title="激活租户";
+    },
+    /**激活租户操作*/
+    activationOperationMethod(form) {
+      this.$refs[form].validate(async (valid) => {
+        if (valid) {
+          let response = await activationOperation(
+            this.tenantExpirationTimeFrom
+          )
+          if (response.code == 200) {
+            this.$message.success('激活成功')
+            //重新刷新列表
+            this.getList()
+          } else {
+            this.$message.error('激活失败')
+          }
+          this.tenantExpirationTimeOpen = false
+          this.tenantExpirationTimeFrom = {
+            tenantId: null,
+            tenantExpirationTime: null
+          }
+        }
+      })
+    },
+    // 激活租户对话框取消按钮
+    tanentCancel() {
+      this.tenantExpirationTimeOpen = false
+      this.tenantExpirationTimeFrom = {
+        tenantId: null,
+        tenantExpirationTime: null
+      }
+    }
+  }
+}
+</script>

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff