From e66256581e5826e03aaad5170cb7de10f5ceabf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=86=8A?= <50282105+xtanyu@users.noreply.github.com> Date: Thu, 10 Jul 2025 20:39:02 +0800 Subject: [PATCH 01/11] =?UTF-8?q?feat(tenant):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=A4=9A=E7=A7=9F=E6=88=B7=E6=A8=A1=E5=9D=97=20(#75)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/common/captcha.ts | 5 + src/apis/tenant/tenant.ts | 94 ++++++ src/apis/tenant/tenantDbConnect.ts | 65 ++++ src/apis/tenant/tenantPackage.ts | 73 +++++ src/components/GiLeftRightPane/index.vue | 60 ++++ src/components/SelectTenant/index.vue | 168 ++++++++++ src/hooks/app/useMenu.ts | 16 +- src/types/components.d.ts | 2 + src/utils/http.ts | 8 + src/utils/tenant.ts | 14 + src/views/login/index.vue | 1 + src/views/setting/message/index.vue | 146 +++++++++ .../config/components/CaptchaSetting.vue | 151 +++++++++ src/views/system/role/RoleAddModal.vue | 299 ++++++++++++++++++ .../tenant/package/TenantPackageAddModal.vue | 155 +++++++++ .../package/TenantPackageDetailDrawer.vue | 67 ++++ src/views/tenant/package/index.vue | 133 ++++++++ .../TenantDbConnectAddModal.vue | 142 +++++++++ .../TenantDbConnectDetailDrawer.vue | 44 +++ src/views/tenant/tenantDbConnect/index.vue | 142 +++++++++ src/views/tenant/user/TenantAddModal.vue | 230 ++++++++++++++ src/views/tenant/user/TenantDetailDrawer.vue | 87 +++++ src/views/tenant/user/TenantUserEditModal.vue | 104 ++++++ src/views/tenant/user/index.vue | 200 ++++++++++++ 24 files changed, 2405 insertions(+), 1 deletion(-) create mode 100644 src/apis/tenant/tenant.ts create mode 100644 src/apis/tenant/tenantDbConnect.ts create mode 100644 src/apis/tenant/tenantPackage.ts create mode 100644 src/components/GiLeftRightPane/index.vue create mode 100644 src/components/SelectTenant/index.vue create mode 100644 src/utils/tenant.ts create mode 100644 src/views/setting/message/index.vue create mode 100644 src/views/system/config/components/CaptchaSetting.vue create mode 100644 src/views/system/role/RoleAddModal.vue create mode 100644 src/views/tenant/package/TenantPackageAddModal.vue create mode 100644 src/views/tenant/package/TenantPackageDetailDrawer.vue create mode 100644 src/views/tenant/package/index.vue create mode 100644 src/views/tenant/tenantDbConnect/TenantDbConnectAddModal.vue create mode 100644 src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue create mode 100644 src/views/tenant/tenantDbConnect/index.vue create mode 100644 src/views/tenant/user/TenantAddModal.vue create mode 100644 src/views/tenant/user/TenantDetailDrawer.vue create mode 100644 src/views/tenant/user/TenantUserEditModal.vue create mode 100644 src/views/tenant/user/index.vue diff --git a/src/apis/common/captcha.ts b/src/apis/common/captcha.ts index 29ac1cb..5887f01 100644 --- a/src/apis/common/captcha.ts +++ b/src/apis/common/captcha.ts @@ -5,6 +5,11 @@ export type * from './type' const BASE_URL = '/captcha' +/** @desc 获取图片验证码 */ +export function getCaptchaConfig() { + return http.get(`${BASE_URL}/config`) +} + /** @desc 获取图片验证码 */ export function getImageCaptcha() { return http.get(`${BASE_URL}/image`) diff --git a/src/apis/tenant/tenant.ts b/src/apis/tenant/tenant.ts new file mode 100644 index 0000000..e02e45c --- /dev/null +++ b/src/apis/tenant/tenant.ts @@ -0,0 +1,94 @@ +import http from '@/utils/http' +import type { TenantCommon } from '@/utils/tenant' + +const BASE_URL = '/tenant/user' + +export interface TenantResp { + id: string + name: string + domain: string + packageId: string + status: string + expireTime: string + createTime: string + createUserString: string + updateUserString: string +} +export interface TenantDetailResp { + id: string + name: string + domain: string + packageId: string + status: string + expireTime: string + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string + packageName: string + menuIds: [] +} +export interface TenantQuery { + name: string + packageId: string + status: string + sort: Array +} +export interface TenantPageQuery extends TenantQuery, PageQuery {} + +/** @desc 查询租户列表 */ +export function listTenant(query: TenantPageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户详情 */ +export function getTenant(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户 */ +export function addTenant(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户 */ +export function updateTenant(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户 */ +export function deleteTenant(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 导出租户 */ +export function exportTenant(query: TenantQuery) { + return http.download(`${BASE_URL}/export`, query) +} + +/** @desc 多租户通用信息查询 */ +export const getTenantCommon = () => { + return http.get(`${BASE_URL}/common`) +} + +/** @desc 获取租户管理账号用户名 */ +export const getTenantLoginUser = (tenantId: string) => { + return http.get(`${BASE_URL}/loginUser/${tenantId}`) +} + +/** @desc 租户管理账号信息更新 */ +export const updateTenantLoginUser = (data: any) => { + return http.put(`${BASE_URL}/loginUser`, data) +} + +/** @desc 获取套餐列表 */ +export const listAllPackage = () => { + return http.get(`${BASE_URL}/all/package`) +} + +/** @desc 获取数据连接列表 */ +export const listAllDbConnect = () => { + return http.get(`${BASE_URL}/all/dbConnect`) +} diff --git a/src/apis/tenant/tenantDbConnect.ts b/src/apis/tenant/tenantDbConnect.ts new file mode 100644 index 0000000..8f10983 --- /dev/null +++ b/src/apis/tenant/tenantDbConnect.ts @@ -0,0 +1,65 @@ +import http from '@/utils/http' + +const BASE_URL = '/tenant/dbConnect' + +export interface TenantDbConnectResp { + id: string + connectName: string + type: string + host: string + port: string + username: string + password: string + createUserString: string + updateUserString: string +} +export interface TenantDbConnectDetailResp { + id: string + connectName: string + type: string + host: string + port: string + username: string + password: string + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string +} +export interface TenantDbConnectQuery { + connectName: string + sort: Array +} +export interface TenantDbConnectPageQuery extends TenantDbConnectQuery, PageQuery {} + +/** @desc 查询租户数据连接列表 */ +export function listTenantDbConnect(query: TenantDbConnectPageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户数据连接详情 */ +export function getTenantDbConnect(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户数据连接 */ +export function addTenantDbConnect(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户数据连接 */ +export function updateTenantDbConnect(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户数据连接 */ +export function deleteTenantDbConnect(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 导出租户数据连接 */ +export function exportTenantDbConnect(query: TenantDbConnectQuery) { + return http.download(`${BASE_URL}/export`, query) +} diff --git a/src/apis/tenant/tenantPackage.ts b/src/apis/tenant/tenantPackage.ts new file mode 100644 index 0000000..1ccd1c8 --- /dev/null +++ b/src/apis/tenant/tenantPackage.ts @@ -0,0 +1,73 @@ +import http from '@/utils/http' + +const BASE_URL = '/tenant/package' + +export interface TenantPackageResp { + id: string + name: string + menuIds: string + menuCheckStrictly: string + status: string + createTime: string + createUserString: string + updateUserString: string +} +export interface TenantPackageDetailResp { + id: string + name: string + menuIds: [] + menuCheckStrictly: string + status: string + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string +} +export interface TenantPackageQuery { + name: string + status: string + sort: Array +} +export interface TenantPackagePageQuery extends TenantPackageQuery, PageQuery {} + +/** @desc 查询租户套餐列表 */ +export function listTenantPackage(query: TenantPackagePageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户套餐详情 */ +export function getTenantPackage(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户套餐 */ +export function addTenantPackage(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户套餐 */ +export function updateTenantPackage(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户套餐 */ +export function deleteTenantPackage(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 导出租户套餐 */ +export function exportTenantPackage(query: TenantPackageQuery) { + return http.download(`${BASE_URL}/export`, query) +} + +/** @desc 查询所有套餐 */ +export function listAllTenantPackage() { + return http.get(`${BASE_URL}/list`) +} + +/** @desc 查询套餐菜单 */ +export function listTenantPackageMenu() { + return http.get(`${BASE_URL}/menuTree`) +} diff --git a/src/components/GiLeftRightPane/index.vue b/src/components/GiLeftRightPane/index.vue new file mode 100644 index 0000000..20ae6cd --- /dev/null +++ b/src/components/GiLeftRightPane/index.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/SelectTenant/index.vue b/src/components/SelectTenant/index.vue new file mode 100644 index 0000000..4588eb4 --- /dev/null +++ b/src/components/SelectTenant/index.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/hooks/app/useMenu.ts b/src/hooks/app/useMenu.ts index d3e0309..6d5a639 100644 --- a/src/hooks/app/useMenu.ts +++ b/src/hooks/app/useMenu.ts @@ -1,6 +1,7 @@ import { ref } from 'vue' import type { TreeNodeData } from '@arco-design/web-vue' import { listMenuTree } from '@/apis' +import { listTenantPackageMenu } from '@/apis/tenant/tenantPackage' /** 菜单模块 */ export function useMenu(options?: { onSuccess?: () => void }) { @@ -17,5 +18,18 @@ export function useMenu(options?: { onSuccess?: () => void }) { loading.value = false } } - return { menuList, getMenuList, loading } + + // 获取租户套餐菜单 + const getTenantPackageMenuList = async () => { + try { + loading.value = true + const res = await listTenantPackageMenu() + menuList.value = res.data + options?.onSuccess && options.onSuccess() + } finally { + loading.value = false + } + } + + return { menuList, getMenuList, loading, getTenantPackageMenuList } } diff --git a/src/types/components.d.ts b/src/types/components.d.ts index 7ea3f11..9a6149c 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -30,6 +30,7 @@ declare module 'vue' { GiIconBox: typeof import('./../components/GiIconBox/index.vue')['default'] GiIconSelector: typeof import('./../components/GiIconSelector/index.vue')['default'] GiIframe: typeof import('./../components/GiIframe/index.vue')['default'] + GiLeftRightPane: typeof import('./../components/GiLeftRightPane/index.vue')['default'] GiOption: typeof import('./../components/GiOption/index.vue')['default'] GiOptionItem: typeof import('./../components/GiOptionItem/index.vue')['default'] GiPageLayout: typeof import('./../components/GiPageLayout/index.vue')['default'] @@ -56,6 +57,7 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] SecondForm: typeof import('./../components/GenCron/CronForm/component/second-form.vue')['default'] + SelectTenant: typeof import('./../components/SelectTenant/index.vue')['default'] SplitPanel: typeof import('./../components/SplitPanel/index.vue')['default'] TextCopy: typeof import('./../components/TextCopy/index.vue')['default'] UserSelect: typeof import('./../components/UserSelect/index.vue')['default'] diff --git a/src/utils/http.ts b/src/utils/http.ts index 5868f50..536e9e8 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -7,6 +7,7 @@ import modalErrorWrapper from '@/utils/modal-error-wrapper' import messageErrorWrapper from '@/utils/message-error-wrapper' import notificationErrorWrapper from '@/utils/notification-error-wrapper' import router from '@/router' +import { getTenantId } from '@/utils/tenant' interface ICodeMessage { [propName: number]: string @@ -57,6 +58,13 @@ http.interceptors.request.use( } config.headers.Authorization = `Bearer ${token}` } + const tenantId = getTenantId() + if (tenantId) { + if (!config.headers) { + config.headers = {} + } + config.headers['X-Tenant-Id'] = tenantId + } return config }, (error) => Promise.reject(error), diff --git a/src/utils/tenant.ts b/src/utils/tenant.ts new file mode 100644 index 0000000..7deeb18 --- /dev/null +++ b/src/utils/tenant.ts @@ -0,0 +1,14 @@ +const CURRENT_TENANT = 'current_tenant' + +export interface TenantCommon { + isEnabled: boolean + availableList: any[] +} + +export const getTenantId = () => { + return localStorage.getItem(CURRENT_TENANT) +} + +export const setTenantId = (tenantId: string) => { + localStorage.setItem(CURRENT_TENANT, tenantId) +} diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 636d078..5f4a8e3 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -87,6 +87,7 @@ + + + diff --git a/src/views/system/config/components/CaptchaSetting.vue b/src/views/system/config/components/CaptchaSetting.vue new file mode 100644 index 0000000..5c04e79 --- /dev/null +++ b/src/views/system/config/components/CaptchaSetting.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/views/system/role/RoleAddModal.vue b/src/views/system/role/RoleAddModal.vue new file mode 100644 index 0000000..8e107b3 --- /dev/null +++ b/src/views/system/role/RoleAddModal.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/src/views/tenant/package/TenantPackageAddModal.vue b/src/views/tenant/package/TenantPackageAddModal.vue new file mode 100644 index 0000000..3624e94 --- /dev/null +++ b/src/views/tenant/package/TenantPackageAddModal.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/tenant/package/TenantPackageDetailDrawer.vue b/src/views/tenant/package/TenantPackageDetailDrawer.vue new file mode 100644 index 0000000..e7df2ab --- /dev/null +++ b/src/views/tenant/package/TenantPackageDetailDrawer.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/views/tenant/package/index.vue b/src/views/tenant/package/index.vue new file mode 100644 index 0000000..c93c2bf --- /dev/null +++ b/src/views/tenant/package/index.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/tenant/tenantDbConnect/TenantDbConnectAddModal.vue b/src/views/tenant/tenantDbConnect/TenantDbConnectAddModal.vue new file mode 100644 index 0000000..d3408fe --- /dev/null +++ b/src/views/tenant/tenantDbConnect/TenantDbConnectAddModal.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue b/src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue new file mode 100644 index 0000000..bbfade4 --- /dev/null +++ b/src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/views/tenant/tenantDbConnect/index.vue b/src/views/tenant/tenantDbConnect/index.vue new file mode 100644 index 0000000..2b15be4 --- /dev/null +++ b/src/views/tenant/tenantDbConnect/index.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/src/views/tenant/user/TenantAddModal.vue b/src/views/tenant/user/TenantAddModal.vue new file mode 100644 index 0000000..854a9dd --- /dev/null +++ b/src/views/tenant/user/TenantAddModal.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/src/views/tenant/user/TenantDetailDrawer.vue b/src/views/tenant/user/TenantDetailDrawer.vue new file mode 100644 index 0000000..2f8b6a0 --- /dev/null +++ b/src/views/tenant/user/TenantDetailDrawer.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/views/tenant/user/TenantUserEditModal.vue b/src/views/tenant/user/TenantUserEditModal.vue new file mode 100644 index 0000000..40debb0 --- /dev/null +++ b/src/views/tenant/user/TenantUserEditModal.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/tenant/user/index.vue b/src/views/tenant/user/index.vue new file mode 100644 index 0000000..58d890a --- /dev/null +++ b/src/views/tenant/user/index.vue @@ -0,0 +1,200 @@ + + + + + From 6a96eee9e965871ded7063fab60d52921865a4b4 Mon Sep 17 00:00:00 2001 From: Charles7c Date: Mon, 14 Jul 2025 22:43:51 +0800 Subject: [PATCH 02/11] =?UTF-8?q?refactor(tenant):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/common/captcha.ts | 5 - src/apis/common/common.ts | 12 +- src/apis/index.ts | 8 +- src/apis/open/index.ts | 1 + src/apis/tenant/datasource.ts | 36 +++ src/apis/tenant/index.ts | 2 + src/apis/tenant/management.ts | 42 +++ src/apis/tenant/package.ts | 41 +++ src/apis/tenant/tenant.ts | 94 ------ src/apis/tenant/tenantDbConnect.ts | 65 ---- src/apis/tenant/tenantPackage.ts | 73 ----- src/apis/tenant/type.ts | 73 +++++ src/assets/icons/block-storage.svg | 1 + src/assets/icons/project.svg | 1 + src/assets/icons/user-management.svg | 1 + src/components/GiLeftRightPane/index.vue | 60 ---- src/components/SelectTenant/index.vue | 2 +- src/hooks/app/useMenu.ts | 2 +- src/types/components.d.ts | 1 - src/views/open/app/index.vue | 2 +- src/views/setting/message/index.vue | 146 --------- .../config/components/CaptchaSetting.vue | 151 --------- src/views/system/config/index.vue | 2 +- src/views/system/role/RoleAddModal.vue | 299 ------------------ src/views/tenant/datasource/AddModal.vue | 187 +++++++++++ .../DetailDrawer.vue} | 19 +- src/views/tenant/datasource/index.vue | 161 ++++++++++ .../AddModal.vue} | 234 +++++++------- .../AdminUserPwdUpdateModal.vue} | 48 +-- .../DetailDrawer.vue} | 55 ++-- src/views/tenant/management/index.vue | 202 ++++++++++++ ...TenantPackageAddModal.vue => AddModal.vue} | 43 ++- ...ckageDetailDrawer.vue => DetailDrawer.vue} | 17 +- src/views/tenant/package/index.vue | 66 ++-- .../TenantDbConnectAddModal.vue | 142 --------- src/views/tenant/tenantDbConnect/index.vue | 142 --------- src/views/tenant/user/index.vue | 200 ------------ 37 files changed, 1001 insertions(+), 1635 deletions(-) create mode 100644 src/apis/open/index.ts create mode 100644 src/apis/tenant/datasource.ts create mode 100644 src/apis/tenant/index.ts create mode 100644 src/apis/tenant/management.ts create mode 100644 src/apis/tenant/package.ts delete mode 100644 src/apis/tenant/tenant.ts delete mode 100644 src/apis/tenant/tenantDbConnect.ts delete mode 100644 src/apis/tenant/tenantPackage.ts create mode 100644 src/apis/tenant/type.ts create mode 100644 src/assets/icons/block-storage.svg create mode 100644 src/assets/icons/project.svg create mode 100644 src/assets/icons/user-management.svg delete mode 100644 src/components/GiLeftRightPane/index.vue delete mode 100644 src/views/setting/message/index.vue delete mode 100644 src/views/system/config/components/CaptchaSetting.vue delete mode 100644 src/views/system/role/RoleAddModal.vue create mode 100644 src/views/tenant/datasource/AddModal.vue rename src/views/tenant/{tenantDbConnect/TenantDbConnectDetailDrawer.vue => datasource/DetailDrawer.vue} (52%) create mode 100644 src/views/tenant/datasource/index.vue rename src/views/tenant/{user/TenantAddModal.vue => management/AddModal.vue} (56%) rename src/views/tenant/{user/TenantUserEditModal.vue => management/AdminUserPwdUpdateModal.vue} (55%) rename src/views/tenant/{user/TenantDetailDrawer.vue => management/DetailDrawer.vue} (60%) create mode 100644 src/views/tenant/management/index.vue rename src/views/tenant/package/{TenantPackageAddModal.vue => AddModal.vue} (79%) rename src/views/tenant/package/{TenantPackageDetailDrawer.vue => DetailDrawer.vue} (71%) delete mode 100644 src/views/tenant/tenantDbConnect/TenantDbConnectAddModal.vue delete mode 100644 src/views/tenant/tenantDbConnect/index.vue delete mode 100644 src/views/tenant/user/index.vue diff --git a/src/apis/common/captcha.ts b/src/apis/common/captcha.ts index 5887f01..29ac1cb 100644 --- a/src/apis/common/captcha.ts +++ b/src/apis/common/captcha.ts @@ -5,11 +5,6 @@ export type * from './type' const BASE_URL = '/captcha' -/** @desc 获取图片验证码 */ -export function getCaptchaConfig() { - return http.get(`${BASE_URL}/config`) -} - /** @desc 获取图片验证码 */ export function getImageCaptcha() { return http.get(`${BASE_URL}/image`) diff --git a/src/apis/common/common.ts b/src/apis/common/common.ts index 004abbc..ab51437 100644 --- a/src/apis/common/common.ts +++ b/src/apis/common/common.ts @@ -24,6 +24,16 @@ export function listRoleDict(query?: { name: string, status: number }) { return http.get(`${BASE_URL}/dict/role`, query) } +/** @desc 查询租户套餐列表 */ +export function listTenantPackageDict(query?: { description: string, status: number }) { + return http.get(`${BASE_URL}/dict/package`, query) +} + +/** @desc 查询租户数据源列表 */ +export function listTenantDatasourceDict(query?: { description: string }) { + return http.get(`${BASE_URL}/dict/datasource`, query) +} + /** @desc 查询字典列表 */ export function listCommonDict(code: string) { return http.get(`${BASE_URL}/dict/${code}`) @@ -35,6 +45,6 @@ export function listSiteOptionDict() { } /** @desc 上传文件 */ -export function uploadFile(data: FormData) { +export function upload(data: FormData) { return http.post(`${BASE_URL}/file`, data) } diff --git a/src/apis/index.ts b/src/apis/index.ts index 453901a..90be2e0 100644 --- a/src/apis/index.ts +++ b/src/apis/index.ts @@ -3,13 +3,17 @@ export * from './auth' export * from './common' export * from './monitor' export * from './system' -export * from './code' +export * from './open' +export * from './tenant' export * from './schedule' +export * from './code' export * from './area/type' export * from './auth/type' export * from './common/type' export * from './monitor/type' export * from './system/type' -export * from './code/type' +export * from './open/type' +export * from './tenant/type' export * from './schedule/type' +export * from './code/type' diff --git a/src/apis/open/index.ts b/src/apis/open/index.ts new file mode 100644 index 0000000..57a8338 --- /dev/null +++ b/src/apis/open/index.ts @@ -0,0 +1 @@ +export * from './app' diff --git a/src/apis/tenant/datasource.ts b/src/apis/tenant/datasource.ts new file mode 100644 index 0000000..71439e4 --- /dev/null +++ b/src/apis/tenant/datasource.ts @@ -0,0 +1,36 @@ +import type * as T from './type' +import http from '@/utils/http' + +export type * from './type' + +const BASE_URL = '/tenant/datasource' + +/** @desc 查询租户数据源列表 */ +export function listTenantDatasource(query: T.TenantDatasourcePageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户数据源详情 */ +export function getTenantDatasource(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户数据源 */ +export function addTenantDatasource(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户数据源 */ +export function updateTenantDatasource(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户数据源 */ +export function deleteTenantDatasource(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 测试租户数据源连接 */ +export function testTenantDatasourceConnection(id: string) { + return http.post(`${BASE_URL}/${id}/test/connection`) +} diff --git a/src/apis/tenant/index.ts b/src/apis/tenant/index.ts new file mode 100644 index 0000000..81a557b --- /dev/null +++ b/src/apis/tenant/index.ts @@ -0,0 +1,2 @@ +export * from './package' +export * from './datasource' diff --git a/src/apis/tenant/management.ts b/src/apis/tenant/management.ts new file mode 100644 index 0000000..abd3e70 --- /dev/null +++ b/src/apis/tenant/management.ts @@ -0,0 +1,42 @@ +import type * as T from './type' +import http from '@/utils/http' +import type { TenantCommon } from '@/utils/tenant' + +export type * from './type' + +const BASE_URL = '/tenant/management' + +/** @desc 查询租户列表 */ +export function listTenant(query: T.TenantPageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户详情 */ +export function getTenant(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户 */ +export function addTenant(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户 */ +export function updateTenant(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户 */ +export function deleteTenant(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 多租户通用信息查询 */ +export const getTenantCommon = () => { + return http.get(`${BASE_URL}/common`) +} + +/** @desc 修改租户管理员密码 */ +export const updateTenantAdminUserPwd = (data: any, id: string) => { + return http.put(`${BASE_URL}/${id}/admin/pwd`, data) +} diff --git a/src/apis/tenant/package.ts b/src/apis/tenant/package.ts new file mode 100644 index 0000000..97ba1a8 --- /dev/null +++ b/src/apis/tenant/package.ts @@ -0,0 +1,41 @@ +import type * as T from './type' +import http from '@/utils/http' + +export type * from './type' + +const BASE_URL = '/tenant/package' + +/** @desc 查询租户套餐列表 */ +export function listTenantPackage(query: T.TenantPackagePageQuery) { + return http.get>(`${BASE_URL}`, query) +} + +/** @desc 查询租户套餐详情 */ +export function getTenantPackage(id: string) { + return http.get(`${BASE_URL}/${id}`) +} + +/** @desc 新增租户套餐 */ +export function addTenantPackage(data: any) { + return http.post(`${BASE_URL}`, data) +} + +/** @desc 修改租户套餐 */ +export function updateTenantPackage(data: any, id: string) { + return http.put(`${BASE_URL}/${id}`, data) +} + +/** @desc 删除租户套餐 */ +export function deleteTenantPackage(id: string) { + return http.del(`${BASE_URL}/${id}`) +} + +/** @desc 查询所有套餐 */ +export function listAllTenantPackage() { + return http.get(`${BASE_URL}/list`) +} + +/** @desc 查询套餐菜单 */ +export function listTenantPackageMenu() { + return http.get(`${BASE_URL}/menu/tree`) +} diff --git a/src/apis/tenant/tenant.ts b/src/apis/tenant/tenant.ts deleted file mode 100644 index e02e45c..0000000 --- a/src/apis/tenant/tenant.ts +++ /dev/null @@ -1,94 +0,0 @@ -import http from '@/utils/http' -import type { TenantCommon } from '@/utils/tenant' - -const BASE_URL = '/tenant/user' - -export interface TenantResp { - id: string - name: string - domain: string - packageId: string - status: string - expireTime: string - createTime: string - createUserString: string - updateUserString: string -} -export interface TenantDetailResp { - id: string - name: string - domain: string - packageId: string - status: string - expireTime: string - createUser: string - createTime: string - updateUser: string - updateTime: string - createUserString: string - updateUserString: string - packageName: string - menuIds: [] -} -export interface TenantQuery { - name: string - packageId: string - status: string - sort: Array -} -export interface TenantPageQuery extends TenantQuery, PageQuery {} - -/** @desc 查询租户列表 */ -export function listTenant(query: TenantPageQuery) { - return http.get>(`${BASE_URL}`, query) -} - -/** @desc 查询租户详情 */ -export function getTenant(id: string) { - return http.get(`${BASE_URL}/${id}`) -} - -/** @desc 新增租户 */ -export function addTenant(data: any) { - return http.post(`${BASE_URL}`, data) -} - -/** @desc 修改租户 */ -export function updateTenant(data: any, id: string) { - return http.put(`${BASE_URL}/${id}`, data) -} - -/** @desc 删除租户 */ -export function deleteTenant(id: string) { - return http.del(`${BASE_URL}/${id}`) -} - -/** @desc 导出租户 */ -export function exportTenant(query: TenantQuery) { - return http.download(`${BASE_URL}/export`, query) -} - -/** @desc 多租户通用信息查询 */ -export const getTenantCommon = () => { - return http.get(`${BASE_URL}/common`) -} - -/** @desc 获取租户管理账号用户名 */ -export const getTenantLoginUser = (tenantId: string) => { - return http.get(`${BASE_URL}/loginUser/${tenantId}`) -} - -/** @desc 租户管理账号信息更新 */ -export const updateTenantLoginUser = (data: any) => { - return http.put(`${BASE_URL}/loginUser`, data) -} - -/** @desc 获取套餐列表 */ -export const listAllPackage = () => { - return http.get(`${BASE_URL}/all/package`) -} - -/** @desc 获取数据连接列表 */ -export const listAllDbConnect = () => { - return http.get(`${BASE_URL}/all/dbConnect`) -} diff --git a/src/apis/tenant/tenantDbConnect.ts b/src/apis/tenant/tenantDbConnect.ts deleted file mode 100644 index 8f10983..0000000 --- a/src/apis/tenant/tenantDbConnect.ts +++ /dev/null @@ -1,65 +0,0 @@ -import http from '@/utils/http' - -const BASE_URL = '/tenant/dbConnect' - -export interface TenantDbConnectResp { - id: string - connectName: string - type: string - host: string - port: string - username: string - password: string - createUserString: string - updateUserString: string -} -export interface TenantDbConnectDetailResp { - id: string - connectName: string - type: string - host: string - port: string - username: string - password: string - createUser: string - createTime: string - updateUser: string - updateTime: string - createUserString: string - updateUserString: string -} -export interface TenantDbConnectQuery { - connectName: string - sort: Array -} -export interface TenantDbConnectPageQuery extends TenantDbConnectQuery, PageQuery {} - -/** @desc 查询租户数据连接列表 */ -export function listTenantDbConnect(query: TenantDbConnectPageQuery) { - return http.get>(`${BASE_URL}`, query) -} - -/** @desc 查询租户数据连接详情 */ -export function getTenantDbConnect(id: string) { - return http.get(`${BASE_URL}/${id}`) -} - -/** @desc 新增租户数据连接 */ -export function addTenantDbConnect(data: any) { - return http.post(`${BASE_URL}`, data) -} - -/** @desc 修改租户数据连接 */ -export function updateTenantDbConnect(data: any, id: string) { - return http.put(`${BASE_URL}/${id}`, data) -} - -/** @desc 删除租户数据连接 */ -export function deleteTenantDbConnect(id: string) { - return http.del(`${BASE_URL}/${id}`) -} - -/** @desc 导出租户数据连接 */ -export function exportTenantDbConnect(query: TenantDbConnectQuery) { - return http.download(`${BASE_URL}/export`, query) -} diff --git a/src/apis/tenant/tenantPackage.ts b/src/apis/tenant/tenantPackage.ts deleted file mode 100644 index 1ccd1c8..0000000 --- a/src/apis/tenant/tenantPackage.ts +++ /dev/null @@ -1,73 +0,0 @@ -import http from '@/utils/http' - -const BASE_URL = '/tenant/package' - -export interface TenantPackageResp { - id: string - name: string - menuIds: string - menuCheckStrictly: string - status: string - createTime: string - createUserString: string - updateUserString: string -} -export interface TenantPackageDetailResp { - id: string - name: string - menuIds: [] - menuCheckStrictly: string - status: string - createUser: string - createTime: string - updateUser: string - updateTime: string - createUserString: string - updateUserString: string -} -export interface TenantPackageQuery { - name: string - status: string - sort: Array -} -export interface TenantPackagePageQuery extends TenantPackageQuery, PageQuery {} - -/** @desc 查询租户套餐列表 */ -export function listTenantPackage(query: TenantPackagePageQuery) { - return http.get>(`${BASE_URL}`, query) -} - -/** @desc 查询租户套餐详情 */ -export function getTenantPackage(id: string) { - return http.get(`${BASE_URL}/${id}`) -} - -/** @desc 新增租户套餐 */ -export function addTenantPackage(data: any) { - return http.post(`${BASE_URL}`, data) -} - -/** @desc 修改租户套餐 */ -export function updateTenantPackage(data: any, id: string) { - return http.put(`${BASE_URL}/${id}`, data) -} - -/** @desc 删除租户套餐 */ -export function deleteTenantPackage(id: string) { - return http.del(`${BASE_URL}/${id}`) -} - -/** @desc 导出租户套餐 */ -export function exportTenantPackage(query: TenantPackageQuery) { - return http.download(`${BASE_URL}/export`, query) -} - -/** @desc 查询所有套餐 */ -export function listAllTenantPackage() { - return http.get(`${BASE_URL}/list`) -} - -/** @desc 查询套餐菜单 */ -export function listTenantPackageMenu() { - return http.get(`${BASE_URL}/menuTree`) -} diff --git a/src/apis/tenant/type.ts b/src/apis/tenant/type.ts new file mode 100644 index 0000000..00c574c --- /dev/null +++ b/src/apis/tenant/type.ts @@ -0,0 +1,73 @@ +/** 租户 */ +export interface TenantResp { + id: string + name: string + code: string + domain: string + expireTime: string + isolationLevel: number + description: number + status: string + packageId: string + datasourceId: string + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string + packageName: string + datasourceName: string +} +export interface TenantQuery { + description?: string + packageId?: string + status?: string + sort: Array +} +export interface TenantPageQuery extends TenantQuery, PageQuery {} + +/** 租户套餐 */ +export interface TenantPackageResp { + id: string + name: string + sort: number + menuCheckStrictly: string + description: string + status: string + menuIds: [] + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string +} +export interface TenantPackageQuery { + description?: string + status?: string + sort: Array +} +export interface TenantPackagePageQuery extends TenantPackageQuery, PageQuery {} + +/** 租户数据源 */ +export interface TenantDatasourceResp { + id: string + name: string + databaseType: string + host: string + port: string + username: string + description: string + createUser: string + createTime: string + updateUser: string + updateTime: string + createUserString: string + updateUserString: string +} +export interface TenantDatasourceQuery { + description?: string + sort: Array +} +export interface TenantDatasourcePageQuery extends TenantDatasourceQuery, PageQuery {} diff --git a/src/assets/icons/block-storage.svg b/src/assets/icons/block-storage.svg new file mode 100644 index 0000000..a12ac8a --- /dev/null +++ b/src/assets/icons/block-storage.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/project.svg b/src/assets/icons/project.svg new file mode 100644 index 0000000..4c6b90a --- /dev/null +++ b/src/assets/icons/project.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user-management.svg b/src/assets/icons/user-management.svg new file mode 100644 index 0000000..cede964 --- /dev/null +++ b/src/assets/icons/user-management.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/GiLeftRightPane/index.vue b/src/components/GiLeftRightPane/index.vue deleted file mode 100644 index 20ae6cd..0000000 --- a/src/components/GiLeftRightPane/index.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/src/components/SelectTenant/index.vue b/src/components/SelectTenant/index.vue index 4588eb4..4783928 100644 --- a/src/components/SelectTenant/index.vue +++ b/src/components/SelectTenant/index.vue @@ -51,7 +51,7 @@ import { useWindowSize } from '@vueuse/core' import { Message } from '@arco-design/web-vue' import { getTenantId, setTenantId } from '@/utils/tenant' -import { getTenantCommon } from '@/apis/tenant/tenant' +import { getTenantCommon } from '@/apis/tenant/management' const { width } = useWindowSize() const visible = ref(false) diff --git a/src/hooks/app/useMenu.ts b/src/hooks/app/useMenu.ts index 6d5a639..4c60201 100644 --- a/src/hooks/app/useMenu.ts +++ b/src/hooks/app/useMenu.ts @@ -1,7 +1,7 @@ import { ref } from 'vue' import type { TreeNodeData } from '@arco-design/web-vue' import { listMenuTree } from '@/apis' -import { listTenantPackageMenu } from '@/apis/tenant/tenantPackage' +import { listTenantPackageMenu } from '@/apis/tenant/package' /** 菜单模块 */ export function useMenu(options?: { onSuccess?: () => void }) { diff --git a/src/types/components.d.ts b/src/types/components.d.ts index 9a6149c..89686ef 100644 --- a/src/types/components.d.ts +++ b/src/types/components.d.ts @@ -30,7 +30,6 @@ declare module 'vue' { GiIconBox: typeof import('./../components/GiIconBox/index.vue')['default'] GiIconSelector: typeof import('./../components/GiIconSelector/index.vue')['default'] GiIframe: typeof import('./../components/GiIframe/index.vue')['default'] - GiLeftRightPane: typeof import('./../components/GiLeftRightPane/index.vue')['default'] GiOption: typeof import('./../components/GiOption/index.vue')['default'] GiOptionItem: typeof import('./../components/GiOptionItem/index.vue')['default'] GiPageLayout: typeof import('./../components/GiPageLayout/index.vue')['default'] diff --git a/src/views/open/app/index.vue b/src/views/open/app/index.vue index ea9985d..2da9606 100644 --- a/src/views/open/app/index.vue +++ b/src/views/open/app/index.vue @@ -105,7 +105,7 @@ import has from '@/utils/has' defineOptions({ name: 'OpenApp' }) const queryForm = reactive({ - sort: ['id,desc'], + sort: ['createTime,desc'], }) const { diff --git a/src/views/setting/message/index.vue b/src/views/setting/message/index.vue deleted file mode 100644 index 7b199ff..0000000 --- a/src/views/setting/message/index.vue +++ /dev/null @@ -1,146 +0,0 @@ - - - - - diff --git a/src/views/system/config/components/CaptchaSetting.vue b/src/views/system/config/components/CaptchaSetting.vue deleted file mode 100644 index 5c04e79..0000000 --- a/src/views/system/config/components/CaptchaSetting.vue +++ /dev/null @@ -1,151 +0,0 @@ - - - - - diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue index 06ef5ba..4df30d7 100644 --- a/src/views/system/config/index.vue +++ b/src/views/system/config/index.vue @@ -56,7 +56,7 @@ const data = [ { name: '登录配置', key: 'login', icon: 'lock', permissions: ['system:loginConfig:get'], value: LoginConfig }, { name: '邮件配置', key: 'mail', icon: 'email', permissions: ['system:mailConfig:get'], value: MailConfig }, { name: '短信配置', key: 'sms', icon: 'message', permissions: ['system:smsConfig:list'], value: SmsConfig }, - { name: '存储配置', key: 'storage', icon: 'storage', permissions: ['system:storage:list'], value: StorageConfig }, + { name: '存储配置', key: 'storage', icon: 'block-storage', permissions: ['system:storage:list'], value: StorageConfig }, { name: '客户端配置', key: 'client', icon: 'mobile', permissions: ['system:client:list'], value: ClientConfig }, ] diff --git a/src/views/system/role/RoleAddModal.vue b/src/views/system/role/RoleAddModal.vue deleted file mode 100644 index 8e107b3..0000000 --- a/src/views/system/role/RoleAddModal.vue +++ /dev/null @@ -1,299 +0,0 @@ - - - - - diff --git a/src/views/tenant/datasource/AddModal.vue b/src/views/tenant/datasource/AddModal.vue new file mode 100644 index 0000000..591f69e --- /dev/null +++ b/src/views/tenant/datasource/AddModal.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue b/src/views/tenant/datasource/DetailDrawer.vue similarity index 52% rename from src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue rename to src/views/tenant/datasource/DetailDrawer.vue index bbfade4..532c2ec 100644 --- a/src/views/tenant/tenantDbConnect/TenantDbConnectDetailDrawer.vue +++ b/src/views/tenant/datasource/DetailDrawer.vue @@ -1,29 +1,32 @@ + + diff --git a/src/views/tenant/user/TenantAddModal.vue b/src/views/tenant/management/AddModal.vue similarity index 56% rename from src/views/tenant/user/TenantAddModal.vue rename to src/views/tenant/management/AddModal.vue index 854a9dd..5e2d1f1 100644 --- a/src/views/tenant/user/TenantAddModal.vue +++ b/src/views/tenant/management/AddModal.vue @@ -4,23 +4,25 @@ :title="title" :mask-closable="false" :esc-to-close="false" - draggable :width="width >= 500 ? 500 : '100%'" + draggable @before-ok="save" @close="reset" > - + diff --git a/src/views/tenant/management/index.vue b/src/views/tenant/management/index.vue new file mode 100644 index 0000000..12a45c3 --- /dev/null +++ b/src/views/tenant/management/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/views/tenant/package/TenantPackageAddModal.vue b/src/views/tenant/package/AddModal.vue similarity index 79% rename from src/views/tenant/package/TenantPackageAddModal.vue rename to src/views/tenant/package/AddModal.vue index 3624e94..ec223e8 100644 --- a/src/views/tenant/package/TenantPackageAddModal.vue +++ b/src/views/tenant/package/AddModal.vue @@ -1,20 +1,31 @@