Jelajahi Sumber

feat(系统模块): 添加租户管理功能

shizhongming 2 tahun lalu
induk
melakukan
6897068407

+ 40 - 0
src/modules/system/views/tenant/lang/en_US.ts

@@ -0,0 +1,40 @@
+/**
+ * 租户表 国际化信息
+ */
+export default {
+  trans: true,
+  key: 'system.views.tenant',
+  data: {
+    title: {
+      id: 'id',
+      tenantCode: 'Tenant code',
+      tenantName: 'Tenant name',
+      contacts: 'Contacts',
+      contactPhone: 'Contact phone',
+      domain: 'domain',
+      availableUserNum: 'Available user num',
+      address: 'Address',
+      logoId: 'LOGO',
+      startTime: 'Start time',
+      endTime: 'End time',
+      validatedTime: 'Validated time',
+    },
+    validate: {
+      tenantCode: 'Please enter the tenant code',
+      tenantName: 'Please enter the tenant name',
+      contacts: 'Please enter the contacts',
+      contactPhone: 'Please enter the contact phone',
+      domain: 'Please enter the tenant domain',
+      availableUserNum: 'Please enter available user num',
+      address: 'Please enter the address',
+      logoId: 'Please enter the logo',
+      startTime: 'Please enter the start time',
+      endTime: 'Please enter the end time',
+    },
+    rules: {},
+    search: {
+      tenantCode: 'Please enter the tenant code',
+      tenantName: 'Please enter the tenant name',
+    },
+  },
+};

+ 41 - 0
src/modules/system/views/tenant/lang/zh_CN.ts

@@ -0,0 +1,41 @@
+/**
+ * 租户表 国际化信息
+ */
+export default {
+  trans: true,
+  key: 'system.views.tenant',
+  data: {
+    title: {
+      id: 'id',
+      tenantCode: '租户编号',
+      tenantName: '租户名字',
+      contacts: '联系人',
+      contactPhone: '联系人电话',
+      domain: '域名',
+      availableUserNum: '可用人数',
+      address: '地址',
+      logoId: 'LOGO',
+      startTime: '开始时间',
+      endTime: '过期时间',
+      validatedTime: '有效时间',
+    },
+    validate: {
+      id: '请输入',
+      tenantCode: '请输入租户编号',
+      tenantName: '请输入租户名字',
+      contacts: '请输入联系人',
+      contactPhone: '请输入联系人电话',
+      domain: '请输入域名',
+      availableUserNum: '请输入可用人数,-1不限制',
+      address: '请输入地址',
+      logoId: '请输入LOGO',
+      startTime: '请输入开始时间',
+      endTime: '请输入过期时间',
+    },
+    rules: {},
+    search: {
+      tenantCode: '请输入租户编号',
+      tenantName: '请输入租户名字',
+    },
+  },
+};

+ 56 - 0
src/modules/system/views/tenant/list/SysTenantListView.api.ts

@@ -0,0 +1,56 @@
+import { ApiServiceEnum, defHttp } from '@/utils/http/axios';
+
+enum Api {
+  list = '/sys/tenant/list',
+  getById = '/sys/tenant/getById',
+  batchSaveUpdate = '/sys/tenant/saveUpdateBatch',
+  delete = '/sys/tenant/batchDeleteById',
+}
+
+export const listApi = (params) => {
+  return defHttp.post({
+    service: ApiServiceEnum.SMART_SYSTEM,
+    url: Api.list,
+    data: {
+      sortName: 'seq',
+      ...params,
+    },
+  });
+};
+
+export const batchSaveUpdateApi = (modelList: any[]) => {
+  modelList.forEach((item) => {
+    const { validatedTime } = item;
+    if (validatedTime && validatedTime.length > 0) {
+      item.startTime = validatedTime[0];
+      item.endTime = validatedTime[1];
+    }
+  });
+  return defHttp.post({
+    service: ApiServiceEnum.SMART_SYSTEM,
+    url: Api.batchSaveUpdate,
+    data: modelList,
+  });
+};
+
+export const deleteApi = (removeRecords: Recordable[]) => {
+  return defHttp.post({
+    service: ApiServiceEnum.SMART_SYSTEM,
+    url: Api.delete,
+    data: removeRecords.map((item) => item.id),
+  });
+};
+
+export const getByIdApi = async (id: number) => {
+  const result = await defHttp.post({
+    service: ApiServiceEnum.SMART_SYSTEM,
+    url: Api.getById,
+    data: id,
+  });
+  if (!result) {
+    return result;
+  }
+  const { startTime, endTime } = result;
+  result.validatedTime = [startTime, endTime];
+  return result;
+};

+ 256 - 0
src/modules/system/views/tenant/list/SysTenantListView.config.ts

@@ -0,0 +1,256 @@
+import type { SmartColumn, SmartSearchFormSchema } from '@/components/SmartTable';
+import type { FormSchema } from '@/components/Form';
+
+export enum Permission {
+  query = 'sys:tenant:query',
+  save = 'sys:tenant:save',
+  update = 'sys:tenant:update',
+  delete = 'sys:tenant:delete',
+}
+
+/**
+ * 表格列表
+ */
+export const getTableColumns = (): SmartColumn[] => {
+  return [
+    {
+      type: 'checkbox',
+      width: 60,
+      align: 'center',
+      field: 'checkbox',
+      fixed: 'left',
+    },
+    {
+      field: 'tenantCode',
+      fixed: 'left',
+      title: '{system.views.tenant.title.tenantCode}',
+      width: 180,
+    },
+    {
+      field: 'tenantName',
+      fixed: 'left',
+      title: '{system.views.tenant.title.tenantName}',
+      width: 180,
+    },
+    {
+      field: 'contacts',
+      title: '{system.views.tenant.title.contacts}',
+      width: 120,
+    },
+    {
+      field: 'contactPhone',
+      title: '{system.views.tenant.title.contactPhone}',
+      width: 120,
+    },
+    {
+      field: 'domain',
+      title: '{system.views.tenant.title.domain}',
+      width: 160,
+    },
+    {
+      field: 'availableUserNum',
+      title: '{system.views.tenant.title.availableUserNum}',
+      width: 160,
+      sortable: true,
+    },
+    {
+      field: 'address',
+      title: '{system.views.tenant.title.address}',
+      width: 120,
+    },
+    {
+      field: 'logoId',
+      visible: false,
+      title: '{system.views.tenant.title.logoId}',
+      width: 120,
+    },
+    {
+      field: 'startTime',
+      title: '{system.views.tenant.title.startTime}',
+      width: 160,
+      sortable: true,
+    },
+    {
+      field: 'endTime',
+      title: '{system.views.tenant.title.endTime}',
+      width: 160,
+      sortable: true,
+    },
+    {
+      field: 'remark',
+      title: '{common.table.remark}',
+      width: 120,
+    },
+    {
+      field: 'seq',
+      title: '{common.table.seq}',
+      width: 120,
+      sortable: true,
+    },
+    {
+      field: 'createTime',
+      title: '{common.table.createTime}',
+      width: 160,
+      sortable: true,
+    },
+    {
+      field: 'createBy',
+      title: '{common.table.createUser}',
+      width: 120,
+    },
+    {
+      field: 'updateTime',
+      title: '{common.table.updateTime}',
+      width: 160,
+    },
+    {
+      field: 'updateBy',
+      title: '{common.table.updateUser}',
+      width: 120,
+    },
+    {
+      field: 'useYn',
+      title: '{common.table.useYn}',
+      component: 'booleanTag',
+      sortable: true,
+      width: 120,
+    },
+    {
+      title: '{common.table.operation}',
+      field: 'operation',
+      width: 120,
+      fixed: 'right',
+      slots: {
+        default: 'table-operation',
+      },
+    },
+  ];
+};
+
+/**
+ * 添加修改表单
+ */
+export const getFormSchemas = (t: Function): FormSchema[] => {
+  return [
+    {
+      field: 'id',
+      label: t('system.views.tenant.title.id'),
+      component: 'Input',
+      show: false,
+      componentProps: {},
+    },
+    {
+      field: 'tenantCode',
+      label: t('system.views.tenant.title.tenantCode'),
+      component: 'Input',
+      componentProps: {},
+      required: true,
+    },
+    {
+      field: 'tenantName',
+      label: t('system.views.tenant.title.tenantName'),
+      component: 'Input',
+      componentProps: {},
+      required: true,
+    },
+    {
+      field: 'contacts',
+      label: t('system.views.tenant.title.contacts'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'contactPhone',
+      label: t('system.views.tenant.title.contactPhone'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'domain',
+      label: t('system.views.tenant.title.domain'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'availableUserNum',
+      label: t('system.views.tenant.title.availableUserNum'),
+      component: 'InputNumber',
+      componentProps: {},
+    },
+    {
+      field: 'address',
+      label: t('system.views.tenant.title.address'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'logoId',
+      label: t('system.views.tenant.title.logoId'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'validatedTime',
+      component: 'RangePicker',
+      label: t('system.views.tenant.title.validatedTime'),
+    },
+    {
+      field: 'remark',
+      label: t('common.table.remark'),
+      component: 'Input',
+      componentProps: {},
+    },
+    {
+      field: 'seq',
+      label: t('common.table.seq'),
+      component: 'InputNumber',
+      componentProps: {},
+      defaultValue: 1,
+      required: true,
+    },
+    {
+      field: 'useYn',
+      label: t('common.table.useYn'),
+      component: 'Switch',
+      componentProps: {},
+      defaultValue: true,
+    },
+  ];
+};
+
+export const getSearchFormSchemas = (t: Function): SmartSearchFormSchema[] => {
+  return [
+    {
+      field: 'tenantCode',
+      label: t('system.views.tenant.title.tenantCode'),
+      component: 'Input',
+      searchSymbol: '=',
+    },
+    {
+      field: 'tenantName',
+      label: t('system.views.tenant.title.tenantName'),
+      component: 'Input',
+      searchSymbol: 'like',
+    },
+    {
+      field: 'useYn',
+      label: t('common.table.useYn'),
+      component: 'Select',
+      defaultValue: 1,
+      componentProps: {
+        style: { width: '120px' },
+        options: [
+          {
+            label: 'Y',
+            value: 1,
+          },
+          {
+            label: 'N',
+            value: 0,
+          },
+        ],
+      },
+      searchSymbol: '=',
+    },
+  ];
+};

+ 113 - 0
src/modules/system/views/tenant/list/SysTenantListView.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="full-height page-container">
+    <SmartTable @register="registerTable" :size="getTableSize">
+      <template #table-operation="{ row }">
+        <SmartVxeTableAction :actions="getActions(row)" />
+      </template>
+    </SmartTable>
+  </div>
+</template>
+
+<script lang="ts" setup>
+  import { useI18n } from '@/hooks/web/useI18n';
+  import { useSizeSetting } from '@/hooks/setting/UseSizeSetting';
+
+  import {
+    ActionItem,
+    SmartTable,
+    SmartVxeTableAction,
+    useSmartTable,
+  } from '@/components/SmartTable';
+
+  import {
+    getFormSchemas,
+    getSearchFormSchemas,
+    getTableColumns,
+    Permission,
+  } from './SysTenantListView.config';
+  import { batchSaveUpdateApi, deleteApi, getByIdApi, listApi } from './SysTenantListView.api';
+
+  const { t } = useI18n();
+  const { getTableSize } = useSizeSetting();
+
+  const getActions = (row: Recordable): ActionItem[] => {
+    return [
+      {
+        label: t('common.button.edit'),
+        auth: Permission.update,
+        onClick: () => editByRowModal(row),
+      },
+      {
+        label: t('common.button.delete'),
+        auth: Permission.delete,
+        danger: true,
+        onClick: () => deleteByRow(row),
+      },
+    ];
+  };
+
+  const [registerTable, { editByRowModal, deleteByRow }] = useSmartTable({
+    id: 'system-tenant-list',
+    customConfig: { storage: true },
+    columns: getTableColumns(),
+    height: 'auto',
+    pagerConfig: true,
+    useSearchForm: true,
+    border: true,
+    stripe: true,
+    rowConfig: {
+      keyField: 'id',
+      isHover: true,
+    },
+    columnConfig: {
+      resizable: true,
+    },
+    searchFormConfig: {
+      schemas: getSearchFormSchemas(t),
+      searchWithSymbol: true,
+      colon: true,
+      layout: 'inline',
+      actionColOptions: {
+        span: undefined,
+      },
+      compact: true,
+    },
+    addEditConfig: {
+      modalConfig: {
+        width: 800,
+      },
+      formConfig: {
+        colon: true,
+        schemas: getFormSchemas(t),
+        baseColProps: { span: 12 },
+        labelCol: { span: 6 },
+        wrapperCol: { span: 17 },
+      },
+    },
+    sortConfig: {
+      remote: true,
+    },
+    proxyConfig: {
+      ajax: {
+        query: (params) => listApi(params.ajaxParameter),
+        save: ({ body: { insertRecords, updateRecords } }) =>
+          batchSaveUpdateApi([...insertRecords, ...updateRecords]),
+        delete: ({ body: { removeRecords } }) => deleteApi(removeRecords),
+        getById: (params) => getByIdApi(params.id),
+      },
+    },
+    toolbarConfig: {
+      zoom: true,
+      refresh: true,
+      column: { columnOrder: true },
+      buttons: [
+        {
+          code: 'ModalAdd',
+        },
+        {
+          code: 'delete',
+        },
+      ],
+    },
+  });
+</script>