From 4950e3a0af6e6960f33c62929b94ffd6777b904f Mon Sep 17 00:00:00 2001 From: jokerxue <2509699647@qq.com> Date: Mon, 13 Jul 2026 15:18:09 +0800 Subject: [PATCH] 前端最新修改 --- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development | 2 +- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-tenant-provisioning.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-web-auth.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts | 30 +++++++++++++++--------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue | 20 +++++++++++--------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/api.ts | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/data.ts | 47 +++++++++++++++-------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/index.vue | 136 +++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/tenant-admin-modal.vue | 22 ++++------------------ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/tenant-menu-drawer.vue | 9 ++------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/tenant-modal.vue | 171 ++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------- 美国版/Food Labeling Management App UniApp/.env.development | 2 +- 美国版/Food Labeling Management Platform/.env.local | 4 ++-- 美国版/Food Labeling Management Platform/src/components/shared/category-scope-fields.tsx | 14 +++++++++++--- 15 files changed, 365 insertions(+), 330 deletions(-) create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-tenant-provisioning.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-web-auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/platform/tenants/api.ts diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development index 42479eb..35f86ef 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development @@ -13,7 +13,7 @@ VITE_INJECT_APP_LOADING=true # 本地开发:直连线上 API(不走 Vite 代理;VITE_GLOB_API_URL 为绝对地址时 proxy 不启用) # 线上:http://saas-test.3ffoodsafety.com/api/app -VITE_GLOB_API_URL=http://saas-test.3ffoodsafety.com/api/app +VITE_GLOB_API_URL=http://192.168.31.87:19002/api/app # 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应) VITE_GLOB_ENABLE_ENCRYPT=false diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/index.ts index 0afe409..8b939a8 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/index.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/index.ts @@ -1,2 +1,4 @@ export * from './th-app-auth'; export * from './th-multi-tenancy'; +export * from './th-tenant-provisioning'; +export * from './th-web-auth'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-tenant-provisioning.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-tenant-provisioning.ts new file mode 100644 index 0000000..5bf5df0 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-tenant-provisioning.ts @@ -0,0 +1,52 @@ +import { requestClient } from '#/api/request'; + +export interface ThProvisionTenantInput { + name: string; + tenantConnectionString?: string; + dbType?: number; + initializeDatabase?: boolean; +} + +export interface ThProvisionTenantOutputDto { + tenantId: string; + name: string; + databaseName: string; + tenantConnectionString: string; + databaseInitialized: boolean; +} + +function normalizeProvisionTenantOutput( + raw: unknown, +): ThProvisionTenantOutputDto { + const o = + raw && typeof raw === 'object' ? (raw as Record) : {}; + return { + tenantId: String(o.tenantId ?? o.TenantId ?? ''), + name: String(o.name ?? o.Name ?? ''), + databaseName: String(o.databaseName ?? o.DatabaseName ?? ''), + tenantConnectionString: String( + o.tenantConnectionString ?? o.TenantConnectionString ?? '', + ), + databaseInitialized: + o.databaseInitialized === true || o.DatabaseInitialized === true, + }; +} + +export async function thProvisionTenant( + input: ThProvisionTenantInput, +): Promise { + const raw = await requestClient.post( + 'th-tenant-provisioning/provision', + { + dbType: input.dbType ?? 0, + initializeDatabase: input.initializeDatabase ?? true, + name: input.name.trim(), + tenantConnectionString: + input.tenantConnectionString?.trim() || undefined, + }, + { + successMessageMode: 'message', + }, + ); + return normalizeProvisionTenantOutput(raw); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-web-auth.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-web-auth.ts new file mode 100644 index 0000000..49169f8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/th/th-web-auth.ts @@ -0,0 +1,63 @@ +export interface ThWebLoginInput { + tenantId: string; + userName: string; + password: string; + uuid?: string; + code?: string; +} + +export interface ThWebLoginOutputDto { + token: string; + refreshToken: string; + tenantId: string; + tenantName: string; +} + +let loginInFlight: Promise | null = null; + +function normalizeWebLoginOutput(raw: unknown): ThWebLoginOutputDto { + const o = + raw && typeof raw === 'object' ? (raw as Record) : {}; + return { + token: String(o.token ?? o.Token ?? ''), + refreshToken: String(o.refreshToken ?? o.RefreshToken ?? ''), + tenantId: String(o.tenantId ?? o.TenantId ?? ''), + tenantName: String(o.tenantName ?? o.TenantName ?? ''), + }; +} + +export async function thWebLogin( + input: ThWebLoginInput, +): Promise { + if (loginInFlight) { + return loginInFlight; + } + + loginInFlight = (async () => { + const { requestClient } = await import('#/api/request'); + const raw = await requestClient.post( + 'th-web-auth/login', + { + tenantId: input.tenantId, + userName: input.userName.trim(), + password: input.password, + ...(input.uuid ? { uuid: input.uuid } : {}), + ...(input.code != null && input.code !== '' + ? { code: input.code } + : {}), + }, + { + errorMessageMode: 'none', + headers: { + __tenant: input.tenantId, + }, + successMessageMode: 'none', + }, + ); + return normalizeWebLoginOutput(raw); + })().finally(() => { + loginInFlight = null; + }); + + return loginInFlight; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts index 18b301b..6d14ed5 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts @@ -10,16 +10,16 @@ import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; import { notification } from 'ant-design-vue'; import { defineStore } from 'pinia'; -import { thAppLogin } from '#/api/th'; +import { thWebLogin } from '#/api/th'; import { $t } from '#/locales'; import { useDictStore } from './dict'; import { useThTenantStore } from './th-tenant'; -/** 泰额多租户登录入参(POST /api/app/th-app-auth/login) */ +/** 泰额 Web 多租户登录入参(POST /api/app/th-web-auth/login) */ export interface ThAuthLoginParams { tenantId: string; - email: string; + userName: string; password: string; uuid?: string; code?: string; @@ -33,16 +33,16 @@ export const useAuthStore = defineStore('auth', () => { const loginLoading = ref(false); - function buildUserInfoFromLogin(email: string, tenantName: string): UserInfo { - const normalizedEmail = email.trim(); + function buildUserInfoFromLogin(userName: string, tenantName: string): UserInfo { + const normalizedUserName = userName.trim(); return { avatar: '', - email: normalizedEmail, + email: normalizedUserName.includes('@') ? normalizedUserName : '', permissions: [], - realName: tenantName || normalizedEmail, + realName: tenantName || normalizedUserName, roles: [], - userId: normalizedEmail, - username: normalizedEmail, + userId: normalizedUserName, + username: normalizedUserName, homePath: preferences.app.defaultHomePath, }; } @@ -58,9 +58,9 @@ export const useAuthStore = defineStore('auth', () => { try { loginLoading.value = true; - const result = await thAppLogin({ + const result = await thWebLogin({ tenantId: params.tenantId, - email: params.email, + userName: params.userName, password: params.password, uuid: params.uuid, code: params.code, @@ -78,10 +78,10 @@ export const useAuthStore = defineStore('auth', () => { thTenantStore.setTenantContext({ tenantId: result.tenantId, tenantName: result.tenantName, - locations: result.locations, + locations: [], }); - userInfo = buildUserInfoFromLogin(params.email, result.tenantName); + userInfo = buildUserInfoFromLogin(params.userName, result.tenantName); userStore.setUserInfo(userInfo); if (accessStore.loginExpired) { @@ -138,10 +138,10 @@ export const useAuthStore = defineStore('auth', () => { return cached; } - // 泰额 SAAS:用户信息来自 th-app-auth/login,不走 Yi 框架 /account + // 泰额 SAAS:用户信息来自 th-web-auth/login,不走 Yi 框架 /account if (thTenantStore.tenantId && accessStore.accessToken) { const fallback = buildUserInfoFromLogin( - cached?.email || cached?.username || 'user', + cached?.username || cached?.email || 'user', thTenantStore.tenantName || '', ); userStore.setUserInfo(fallback); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue index 8e534ac..9d187b7 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue @@ -1,5 +1,8 @@ -