From 69a6d7a3584e2281e0b591d24ce123ded607dd00 Mon Sep 17 00:00:00 2001 From: ANHE <1983933789@qq.com> Date: Wed, 12 Mar 2025 00:03:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=95=B4=E5=90=88=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=20commit!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/common/form.ts | 9 +- src/router/elegant/imports.ts | 1 + src/router/elegant/routes.ts | 9 + src/router/elegant/transform.ts | 1 + src/service/api/system/tenant.ts | 40 +++ src/service/api/system/tenantPackage.ts | 43 +++ src/typings/api/system.api.d.ts | 139 ++++++-- src/typings/components.d.ts | 4 + src/typings/elegant-router.d.ts | 2 + src/views/system/tenant/index.vue | 186 ++++++++++ .../tenant/modules/tenant-operate-drawer.vue | 321 ++++++++++++++++++ .../system/tenant/modules/tenant-search.vue | 72 ++++ .../gen/modules/gen-table-operate-drawer.vue | 4 +- 13 files changed, 792 insertions(+), 39 deletions(-) create mode 100644 src/service/api/system/tenant.ts create mode 100644 src/service/api/system/tenantPackage.ts create mode 100644 src/views/system/tenant/index.vue create mode 100644 src/views/system/tenant/modules/tenant-operate-drawer.vue create mode 100644 src/views/system/tenant/modules/tenant-search.vue diff --git a/src/hooks/common/form.ts b/src/hooks/common/form.ts index ce48a716..54ee5e63 100644 --- a/src/hooks/common/form.ts +++ b/src/hooks/common/form.ts @@ -46,13 +46,17 @@ export function useFormRules() { const defaultRequiredRule = createRequiredRule($t('form.required')); /** the default number required rule */ - const defaultNumberRequiredRule = createNumberRequiredRule($t('form.required')); function createRequiredRule(message: string): App.Global.FormRule { return { required: true, trigger: ['change', 'blur'], - message + validator: (_rule: any, value: any) => { + if (value === null || value === undefined || value === '') { + return new Error(message); + } + return true; + } }; } @@ -82,7 +86,6 @@ export function useFormRules() { patternRules, formRules, defaultRequiredRule, - defaultNumberRequiredRule, createRequiredRule, createConfirmPwdRule, createNumberRequiredRule diff --git a/src/router/elegant/imports.ts b/src/router/elegant/imports.ts index 54168649..7bfec1ad 100644 --- a/src/router/elegant/imports.ts +++ b/src/router/elegant/imports.ts @@ -22,6 +22,7 @@ export const views: Record Promise import("@/views/_builtin/login/index.vue"), home: () => import("@/views/home/index.vue"), system_menu: () => import("@/views/system/menu/index.vue"), + system_tenant: () => import("@/views/system/tenant/index.vue"), system_user: () => import("@/views/system/user/index.vue"), tool_gen: () => import("@/views/tool/gen/index.vue"), }; diff --git a/src/router/elegant/routes.ts b/src/router/elegant/routes.ts index 06c4ddcf..287b761c 100644 --- a/src/router/elegant/routes.ts +++ b/src/router/elegant/routes.ts @@ -97,6 +97,15 @@ export const generatedRoutes: GeneratedRoute[] = [ order: 3 } }, + { + name: 'system_tenant', + path: '/system/tenant', + component: 'view.system_tenant', + meta: { + title: 'system_tenant', + i18nKey: 'route.system_tenant' + } + }, { name: 'system_user', path: '/system/user', diff --git a/src/router/elegant/transform.ts b/src/router/elegant/transform.ts index 4a393f31..317ab22f 100644 --- a/src/router/elegant/transform.ts +++ b/src/router/elegant/transform.ts @@ -171,6 +171,7 @@ const routeMap: RouteMap = { "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?", "system": "/system", "system_menu": "/system/menu", + "system_tenant": "/system/tenant", "system_user": "/system/user", "tool": "/tool", "tool_gen": "/tool/gen" diff --git a/src/service/api/system/tenant.ts b/src/service/api/system/tenant.ts new file mode 100644 index 00000000..5b0423fc --- /dev/null +++ b/src/service/api/system/tenant.ts @@ -0,0 +1,40 @@ +import { request } from '@/service/request'; + +/** 获取租户列表 */ +export function fetchGetTenantList(params?: Api.System.TenantSearchParams) { + return request({ + url: '/system/tenant/list', + method: 'get', + params + }); +} + +/** 新增租户 */ +export function fetchCreateTenant(data: Api.System.TenantOperateParams) { + return request({ + url: '/system/tenant', + method: 'post', + headers: { + isEncrypt: true, + repeatSubmit: true + }, + data + }); +} + +/** 修改租户 */ +export function fetchUpdateTenant(data: Api.System.TenantOperateParams) { + return request({ + url: '/system/tenant', + method: 'put', + data + }); +} + +/** 批量删除租户 */ +export function fetchBatchDeleteTenant(ids: CommonType.IdType[]) { + return request({ + url: `/system/tenant/${ids.join(',')}`, + method: 'delete' + }); +} diff --git a/src/service/api/system/tenantPackage.ts b/src/service/api/system/tenantPackage.ts new file mode 100644 index 00000000..88bb0f27 --- /dev/null +++ b/src/service/api/system/tenantPackage.ts @@ -0,0 +1,43 @@ +import { request } from '@/service/request'; + +/** 获取租户套餐列表 */ +export function fetchGetTenantPackageList(params?: Api.System.TenantPackageSearchParams) { + return request({ + url: '/system/tenant/package/list', + method: 'get', + params + }); +} +/** 获取租户下拉列表 */ +export function fetchGetTenantPackageSelectList() { + return request({ + url: '/system/tenant/package/selectList', + method: 'get' + }); +} + +/** 新增租户套餐 */ +export function fetchCreateTenantPackage(data: Api.System.TenantPackageOperateParams) { + return request({ + url: '/system/tenant/package', + method: 'post', + data + }); +} + +/** 修改租户套餐 */ +export function fetchUpdateTenantPackage(data: Api.System.TenantPackageOperateParams) { + return request({ + url: '/system/tenant/package', + method: 'put', + data + }); +} + +/** 批量删除租户套餐 */ +export function fetchBatchDeleteTenantPackage(packageIds: CommonType.IdType[]) { + return request({ + url: `/system/tenant/package/${packageIds.join(',')}`, + method: 'delete' + }); +} diff --git a/src/typings/api/system.api.d.ts b/src/typings/api/system.api.d.ts index c175c064..f538c0b7 100644 --- a/src/typings/api/system.api.d.ts +++ b/src/typings/api/system.api.d.ts @@ -138,40 +138,6 @@ declare namespace Api { /** user list */ type UserList = Common.PaginatingQueryRecord; - /** tenant */ - interface Tenant { - /** id */ - id: CommonType.IdType; - /** 租户编号 */ - tenantId: string; - /** 联系人 */ - contactUserName: string; - /** 联系电话 */ - contactPhone: string; - /** 企业名称 */ - companyName: string; - /** 统一社会信用代码 */ - licenseNumber: string; - /** 地址 */ - address: string; - /** 域名 */ - domain: string; - /** 企业简介 */ - intro: string; - /** 备注 */ - remark?: string; - /** 租户套餐编号 */ - packageId: number; - /** 过期时间 */ - expireTime: Date; - /** 用户数量(-1不限制) */ - accountCount: number; - /** 租户状态(0正常 1停用) */ - status: string; - /** 删除标志(0代表存在 2代表删除) */ - delFlag: string; - } - /** * icon type * @@ -377,5 +343,110 @@ declare namespace Api { /** post list */ type PostList = Api.Common.PaginatingQueryRecord; + + /** tenant */ + type Tenant = Common.CommonRecord<{ + /** id */ + id: CommonType.IdType; + /** 租户编号 */ + tenantId: CommonType.IdType; + /** 联系人 */ + contactUserName: string; + /** 联系电话 */ + contactPhone: string; + /** 企业名称 */ + companyName: string; + /** 统一社会信用代码 */ + licenseNumber: string; + /** 地址 */ + address: string; + /** 企业简介 */ + intro: string; + /** 域名 */ + domain: string; + /** 备注 */ + remark: string; + /** 租户套餐编号 */ + packageId: CommonType.IdType; + /** 过期时间 */ + expireTime: string; + /** 用户数量(-1不限制) */ + accountCount: number; + /** 租户状态(0正常 1停用) */ + status: string; + /** 删除标志(0代表存在 1代表删除) */ + delFlag: string; + }>; + + /** tenant search params */ + type TenantSearchParams = CommonType.RecordNullable< + Pick & + Api.Common.CommonSearchParams + >; + + /** tenant operate params */ + type TenantOperateParams = CommonType.RecordNullable< + Pick< + Api.System.Tenant, + | 'id' + | 'tenantId' + | 'contactUserName' + | 'contactPhone' + | 'companyName' + | 'licenseNumber' + | 'address' + | 'intro' + | 'domain' + | 'remark' + | 'packageId' + | 'expireTime' + | 'accountCount' + | 'status' + > & { + username: string; + password: string; + } + >; + + /** tenant list */ + type TenantList = Api.Common.PaginatingQueryRecord; + + /** tenant package */ + type TenantPackage = Common.CommonRecord<{ + /** 租户套餐id */ + packageId: CommonType.IdType; + /** 套餐名称 */ + packageName: string; + /** 关联菜单id */ + menuIds: CommonType.IdType; + /** 备注 */ + remark: string; + /** 菜单树选择项是否关联显示 */ + menuCheckStrictly: number; + /** 状态(0正常 1停用) */ + status: string; + /** 删除标志(0代表存在 1代表删除) */ + delFlag: string; + }>; + + /** tenant package search params */ + type TenantPackageSearchParams = CommonType.RecordNullable< + Pick & + Api.Common.CommonSearchParams + >; + + /** tenant package operate params */ + type TenantPackageOperateParams = CommonType.RecordNullable< + Pick< + Api.System.TenantPackage, + 'packageId' | 'packageName' | 'menuIds' | 'remark' | 'menuCheckStrictly' | 'status' + > + >; + + /** tenant package list */ + type TenantPackageList = Api.Common.PaginatingQueryRecord; + + /** tenant package select list */ + type TenantPackageSelectList = Common.CommonRecord>; } } diff --git a/src/typings/components.d.ts b/src/typings/components.d.ts index d24a8f79..9efc2f03 100644 --- a/src/typings/components.d.ts +++ b/src/typings/components.d.ts @@ -39,12 +39,16 @@ declare module 'vue' { IconIcRoundUpload: typeof import('~icons/ic/round-upload')['default'] IconLocalBanner: typeof import('~icons/local/banner')['default'] IconLocalLogo: typeof import('~icons/local/logo')['default'] + IconMaterialSymbolsHelpOutline: typeof import('~icons/material-symbols/help-outline')['default'] IconMdiArrowDownThin: typeof import('~icons/mdi/arrow-down-thin')['default'] IconMdiArrowUpThin: typeof import('~icons/mdi/arrow-up-thin')['default'] IconMdiDrag: typeof import('~icons/mdi/drag')['default'] IconMdiKeyboardEsc: typeof import('~icons/mdi/keyboard-esc')['default'] IconMdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default'] IconMdiRefresh: typeof import('~icons/mdi/refresh')['default'] + 'IconMingcute:questionLine': typeof import('~icons/mingcute/question-line')['default'] + 'IconPh:questionLight': typeof import('~icons/ph/question-light')['default'] + 'IconStash:questionLight': typeof import('~icons/stash/question-light')['default'] IconUilSearch: typeof import('~icons/uil/search')['default'] LangSwitch: typeof import('./../components/common/lang-switch.vue')['default'] LookForward: typeof import('./../components/custom/look-forward.vue')['default'] diff --git a/src/typings/elegant-router.d.ts b/src/typings/elegant-router.d.ts index 75c08a12..7e6cbcc3 100644 --- a/src/typings/elegant-router.d.ts +++ b/src/typings/elegant-router.d.ts @@ -25,6 +25,7 @@ declare module "@elegant-router/types" { "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?"; "system": "/system"; "system_menu": "/system/menu"; + "system_tenant": "/system/tenant"; "system_user": "/system/user"; "tool": "/tool"; "tool_gen": "/tool/gen"; @@ -90,6 +91,7 @@ declare module "@elegant-router/types" { | "login" | "home" | "system_menu" + | "system_tenant" | "system_user" | "tool_gen" >; diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue new file mode 100644 index 00000000..66e7a5a5 --- /dev/null +++ b/src/views/system/tenant/index.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/system/tenant/modules/tenant-operate-drawer.vue b/src/views/system/tenant/modules/tenant-operate-drawer.vue new file mode 100644 index 00000000..ad57c644 --- /dev/null +++ b/src/views/system/tenant/modules/tenant-operate-drawer.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/views/system/tenant/modules/tenant-search.vue b/src/views/system/tenant/modules/tenant-search.vue new file mode 100644 index 00000000..718c0cc2 --- /dev/null +++ b/src/views/system/tenant/modules/tenant-search.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/views/tool/gen/modules/gen-table-operate-drawer.vue b/src/views/tool/gen/modules/gen-table-operate-drawer.vue index a8550eeb..28ed735b 100644 --- a/src/views/tool/gen/modules/gen-table-operate-drawer.vue +++ b/src/views/tool/gen/modules/gen-table-operate-drawer.vue @@ -39,7 +39,7 @@ interface Emits { const emit = defineEmits(); const appStore = useAppStore(); -const { defaultRequiredRule, defaultNumberRequiredRule } = useFormRules(); +const { defaultRequiredRule } = useFormRules(); const { loading, startLoading, endLoading } = useLoading(); const genTableInfo = ref(); @@ -73,7 +73,7 @@ const infoRules: Record = { moduleName: defaultRequiredRule, businessName: defaultRequiredRule, functionName: defaultRequiredRule, - parentMenuId: defaultNumberRequiredRule, + parentMenuId: defaultRequiredRule, genType: defaultRequiredRule, genPath: defaultRequiredRule };