diff --git a/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/Tenant.java b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/Tenant.java
new file mode 100644
index 00000000..bfa92fc5
--- /dev/null
+++ b/kicc-platform/kicc-platform-api/kicc-system-api/src/main/java/com/cloud/kicc/system/api/entity/Tenant.java
@@ -0,0 +1,58 @@
+package com.cloud.kicc.system.api.entity;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cloud.kicc.common.data.entity.CommonEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.time.LocalDateTime;
+
+/**
+ *
+ * 多租户实体类
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/9
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("sys_tenant")
+public class Tenant extends CommonEntity {
+
+ /**
+ * 租户ID
+ */
+ @TableId
+ private String id;
+
+ /**
+ * 租户名称
+ */
+ private String name;
+
+ /**
+ * 租户编码
+ */
+ private String code;
+
+ /**
+ * 租户开始时间
+ */
+ private LocalDateTime startTime;
+
+ /**
+ * 租户结束时间
+ */
+ private LocalDateTime endTime;
+
+ /**
+ * 租户状态
+ */
+ private String status;
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/TenantController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/TenantController.java
new file mode 100644
index 00000000..95e2747f
--- /dev/null
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/TenantController.java
@@ -0,0 +1,86 @@
+package com.cloud.kicc.system.controller;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cloud.kicc.common.core.api.R;
+import com.cloud.kicc.common.core.constant.AppConstants;
+import com.cloud.kicc.common.core.constant.CacheConstants;
+import com.cloud.kicc.common.core.constant.SecurityConstants;
+import com.cloud.kicc.common.log.annotation.SysLog;
+import com.cloud.kicc.common.security.annotation.Inner;
+import com.cloud.kicc.system.api.entity.DictData;
+import com.cloud.kicc.system.api.entity.Tenant;
+import com.cloud.kicc.system.api.feign.RemoteDictService;
+import com.cloud.kicc.system.service.DictDataService;
+import com.cloud.kicc.system.service.TenantService;
+import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ *
+ * 多租户控制类
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/9
+ */
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(AppConstants.APP_SYSTEM + "/tenant")
+public class TenantController {
+
+ private final TenantService tenantService;
+
+ private LambdaQueryWrapper getQueryWrapper(Tenant tenant) {
+ return new LambdaQueryWrapper()
+ .like(StrUtil.isNotBlank(tenant.getName()), Tenant::getName, tenant.getName())
+ .eq(StrUtil.isNotBlank(tenant.getCode()), Tenant::getCode, tenant.getCode())
+ .eq(StrUtil.isNotBlank(tenant.getStatus()), Tenant::getStatus, tenant.getStatus());
+ }
+
+ @GetMapping("/list")
+ @PreAuthorize("@pms.hasPermission('tenant_view')")
+ public R list(Page page, Tenant tenant) {
+ IPage tenantPage = tenantService.page(page, getQueryWrapper(tenant));
+ return R.ok(tenantPage.getRecords(), tenantPage.getTotal());
+ }
+
+ @GetMapping("/{id:\\w+}")
+ public R getById(@PathVariable("id") String id) {
+ return R.ok(tenantService.getById(id));
+ }
+
+
+ @SysLog("多租户新增")
+ @PostMapping("/save")
+ @PreAuthorize("@pms.hasPermission('tenant_add')")
+ public R save(@RequestBody Tenant tenant) {
+ tenantService.save(tenant);
+ return R.ok();
+ }
+
+ @SysLog("多租户修改")
+ @PutMapping("/update")
+ @PreAuthorize("@pms.hasPermission('tenant_edit')")
+ public R update(@RequestBody Tenant tenant) {
+ tenantService.updateById(tenant);
+ return R.ok();
+ }
+
+ @SysLog("多租户删除")
+ @DeleteMapping("/remove/{ids:[\\w,]+}")
+ @PreAuthorize("@pms.hasPermission('tenant_del')")
+ public R remove(@PathVariable String[] ids) {
+ tenantService.removeByIds(Arrays.asList(ids));
+ return R.ok();
+ }
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/TenantMapper.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/TenantMapper.java
new file mode 100644
index 00000000..978212b5
--- /dev/null
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/mapper/TenantMapper.java
@@ -0,0 +1,16 @@
+package com.cloud.kicc.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cloud.kicc.system.api.entity.Tenant;
+
+/**
+ *
+ * 多租户 Mapper 接口
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/9
+ */
+public interface TenantMapper extends BaseMapper {
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/TenantService.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/TenantService.java
new file mode 100644
index 00000000..a630675b
--- /dev/null
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/TenantService.java
@@ -0,0 +1,16 @@
+package com.cloud.kicc.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cloud.kicc.system.api.entity.Tenant;
+
+/**
+ *
+ * 多租户服务类
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/9
+ */
+public interface TenantService extends IService {
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/TenantServiceImpl.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/TenantServiceImpl.java
new file mode 100644
index 00000000..e3a135b1
--- /dev/null
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/service/impl/TenantServiceImpl.java
@@ -0,0 +1,20 @@
+package com.cloud.kicc.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cloud.kicc.system.api.entity.Tenant;
+import com.cloud.kicc.system.mapper.TenantMapper;
+import com.cloud.kicc.system.service.TenantService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 多租户服务实现类
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/9
+ */
+@Service
+public class TenantServiceImpl extends ServiceImpl implements TenantService {
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/TenantMapper.xml b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/TenantMapper.xml
new file mode 100644
index 00000000..acf40009
--- /dev/null
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/resources/mapper/TenantMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/kicc-ui/src/api/platform/system/controller/tenant.ts b/kicc-ui/src/api/platform/system/controller/tenant.ts
new file mode 100644
index 00000000..37fe1850
--- /dev/null
+++ b/kicc-ui/src/api/platform/system/controller/tenant.ts
@@ -0,0 +1,30 @@
+/**
+ * 提供api模板规范代码参考,请尽量保证编写代码风格跟模板规范代码一致
+ * Copyright © 2020-2022 entfrm All rights reserved.
+ * author entfrm开发团队-王翔
+ */
+import type { Tenant, TenantParams, TenantResult } from '/@/api/platform/system/entity/tenant';
+import { defHttp } from '/@/utils/http/axios';
+
+enum Api {
+ list = '/system_proxy/system/tenant/list',
+ add = '/system_proxy/system/tenant/save',
+ get = '/system_proxy/system/tenant',
+ edit = '/system_proxy/system/tenant/update',
+ del = '/system_proxy/system/tenant/remove'
+}
+
+/** 查询多租户列表 */
+export const listTenant = (params?: Partial) => defHttp.get({ url: Api.list, params }, { isReturnResultResponse: true });
+
+/** 新增多租户 */
+export const addTenant = (params: Partial) => defHttp.post({ url: Api.add, data: params });
+
+/** 修改多租户 */
+export const editTenant = (params: Partial) => defHttp.put({ url: Api.edit, data: params });
+
+/** 查询多租户详细 */
+export const getTenant = (id: string) => defHttp.get({ url: `${Api.get}/${id}` });
+
+/** 删除多租户 */
+export const delTenant = (ids: string) => defHttp.delete({ url: `${Api.del}/${ids}` });
diff --git a/kicc-ui/src/api/platform/system/entity/tenant.ts b/kicc-ui/src/api/platform/system/entity/tenant.ts
new file mode 100644
index 00000000..af608dd8
--- /dev/null
+++ b/kicc-ui/src/api/platform/system/entity/tenant.ts
@@ -0,0 +1,26 @@
+/**
+ * @program: kicc-ui
+ * @description: 多租户实体类
+ * 类型定义
+ * @author: entfrm开发团队-王翔
+ * @create: 2022/4/8
+ */
+import type { R } from '/#/axios';
+import type { CommonEntity, Page } from '/@/api/common/data/entity';
+
+/** 多租户查询参数 */
+export type TenantParams = Page & Tenant;
+
+/** 多租户对象 */
+export interface Tenant extends CommonEntity {
+ id: string;
+ name: string;
+ code: string;
+ startTime: string;
+ endTime: string;
+ status: string;
+ [key: string]: any;
+}
+
+/** 多租户响应对象 */
+export type TenantResult = R;
diff --git a/kicc-ui/src/views/system/dict/DictModal.vue b/kicc-ui/src/views/system/dict/DictModal.vue
index 18f69849..1a8aaea8 100644
--- a/kicc-ui/src/views/system/dict/DictModal.vue
+++ b/kicc-ui/src/views/system/dict/DictModal.vue
@@ -14,7 +14,7 @@
* Copyright © 2020-2022 entfrm All rights reserved.
* author entfrm开发团队-王翔
*/
- import {ref, toRaw, unref} from 'vue';
+ import { ref, unref } from 'vue';
import { BasicForm, useForm } from '/@/components/Form/index';
import { formSchema } from './dict.data';
import { addDict, editDict, getDict } from '/@/api/platform/system/controller/dict';
diff --git a/kicc-ui/src/views/system/tenant/TenantModal.vue b/kicc-ui/src/views/system/tenant/TenantModal.vue
new file mode 100644
index 00000000..85ac519a
--- /dev/null
+++ b/kicc-ui/src/views/system/tenant/TenantModal.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
diff --git a/kicc-ui/src/views/system/tenant/index.vue b/kicc-ui/src/views/system/tenant/index.vue
new file mode 100644
index 00000000..542b44cb
--- /dev/null
+++ b/kicc-ui/src/views/system/tenant/index.vue
@@ -0,0 +1,140 @@
+
+
+
+
+ 新增多租户
+ 修改多租户
+ 删除多租户
+
+
+
+
+
+
+
+
+
+
+
diff --git a/kicc-ui/src/views/system/tenant/tenant.data.ts b/kicc-ui/src/views/system/tenant/tenant.data.ts
new file mode 100644
index 00000000..7c75ea72
--- /dev/null
+++ b/kicc-ui/src/views/system/tenant/tenant.data.ts
@@ -0,0 +1,164 @@
+/**
+ * @program: kicc-ui
+ * @description: 多租户模块动态渲染配置
+ * @author: entfrm开发团队-王翔
+ * @create: 2022/4/21
+ */
+
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Table';
+import { h } from 'vue';
+import { Tag } from 'ant-design-vue';
+
+/** 表格列配置 */
+export const columns: BasicColumn[] = [
+ {
+ title: '多租户名称',
+ dataIndex: 'name'
+ },
+ {
+ title: '多租户编码',
+ dataIndex: 'code',
+ },
+ {
+ title: '开始时间',
+ dataIndex: 'startTime',
+ width: 200
+ },
+ {
+ title: '结束时间',
+ dataIndex: 'endTime',
+ width: 200
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ width: 120,
+ customRender: ({record}) => {
+ const status = record.status;
+ const enable = ~~status === 0;
+ const color = enable ? 'green' : 'red';
+ const text = enable ? '启动' : '冻结';
+ return h(Tag, { color: color }, () => text);
+ }
+ },
+ {
+ title: '备注',
+ dataIndex: 'remarks',
+ customRender: ({record}) => {
+ return record.remarks || h(Tag, { color: 'red' }, () => '暂无数据');
+ }
+ }
+];
+
+/** 搜索表单配置 */
+export const searchFormSchema: FormSchema[] = [
+ {
+ field: 'name',
+ label: '多租户名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入多租户名称',
+ },
+ colProps: { span: 8 }
+ },
+ {
+ field: 'code',
+ label: '多租户编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入多租户编码',
+ },
+ colProps: { span: 7 }
+ },
+ {
+ field: 'status',
+ label: '状态',
+ component: 'Select',
+ componentProps: {
+ options: [
+ { label: '启动', value: '0' },
+ { label: '冻结', value: '1' }
+ ]
+ },
+ colProps: { span: 8 }
+ }
+];
+
+/** 用户表单配置 */
+export const formSchema: FormSchema[] = [
+ {
+ field: 'id',
+ label: 'ID',
+ component: 'Input',
+ show: false
+ },
+ {
+ field: 'name',
+ label: '多租户名称',
+ component: 'Input',
+ required: true,
+ colProps: {
+ span: 12
+ }
+ },
+ {
+ field: 'code',
+ label: '多租户编码',
+ component: 'Input',
+ required: true,
+ colProps: {
+ span: 12
+ }
+ },
+ {
+ field: 'startTime',
+ label: '开始时间',
+ component: 'DatePicker',
+ required: true,
+ componentProps: {
+ style: { width:'100%' },
+ valueFormat: 'YYYY-MM-DD',
+ placeholder: '请选择开始日期'
+ },
+ colProps: { span: 12 }
+ },
+ {
+ field: 'endTime',
+ label: '结束时间',
+ component: 'DatePicker',
+ required: true,
+ componentProps: {
+ style: { width:'100%' },
+ valueFormat: 'YYYY-MM-DD',
+ placeholder: '请选择开始日期'
+ },
+ colProps: { span: 12 }
+ },
+ {
+ field: 'status',
+ label: '状态',
+ component: 'RadioGroup',
+ defaultValue: '0',
+ componentProps: {
+ options: [
+ { label: '启动', value: '0' },
+ { label: '冻结', value: '1' }
+ ]
+ },
+ colProps: {
+ span: 12
+ }
+ },
+ {
+ label: '备注',
+ field: 'remarks',
+ component: 'InputTextArea',
+ componentProps: {
+ rows: 6
+ },
+ colProps: {
+ span: 24
+ }
+ }
+];