Refactor UUID generation, remove unused logger and encryption utilities, and clean up request handling

- Updated `generateUUID` function for improved readability and performance.
- Deleted `logger.ts`, `other.ts`, `request.ts`, `storage.ts`, `tansParams.ts`, and `validate.ts` as they were no longer needed.
- Simplified TypeScript configuration by removing unnecessary paths and aliases.
- Enhanced Vite configuration for better project structure and maintainability.
This commit is contained in:
DEV_DSW
2026-04-17 15:38:08 +08:00
parent b1dea9a5c2
commit 79bea4f107
360 changed files with 14495 additions and 30856 deletions

224
src/pages/Knowledge/copy.ts Normal file
View File

@@ -0,0 +1,224 @@
import { useEffect, useState } from 'react';
import { getLocale, i18n } from '../../i18n';
import type { LanguageCode } from '../../types/runtime';
type Primitive = string | number;
type MessageTree = {
[key: string]: Primitive | MessageTree;
};
type InterpolationParams = Record<string, Primitive>;
export type KnowledgeTranslate = (path: string, params?: InterpolationParams, fallback?: string) => string;
function normalizeKnowledgePath(path: string): string {
return path.startsWith('knowledge.') ? path.slice('knowledge.'.length) : path;
}
const EN_KNOWLEDGE_MESSAGES: MessageTree = {
title: 'Knowledge Management',
desc: 'Content Management',
roomTypeManager: 'Room Type Management',
eventManager: 'Event Management',
event: {
addEvent: 'Add Event',
eventName: 'Event Name',
eventDesc: 'Event Description',
effectiveTime: 'Effective Time',
endTime: 'End Time',
relatedImage: 'Related Image',
enableDisable: 'Enable/Disable',
operation: 'Operation',
viewImage: 'View Image',
uploadImage: 'Upload Image',
pleaseEnter: 'Please enter',
effectiveTimeRange: 'Effective Time Range',
to: 'to',
startDate: 'Start Date',
endDate: 'End Date',
pleaseEnterEventName: 'Please enter the event name',
lengthValidation: 'Length between 3 and 50 characters',
pleaseEnterEventDesc: 'Please enter the event description',
pleaseSelectTimeRange: 'Please select the effective time range',
},
upload: {
title: 'Upload Image',
step1: 'Upload Image 1',
step2: 'Image Description 2',
dragText: 'Choose a file or drag and drop it here',
formatDesc: 'JPEG, PNG, PDF, and MP4 formats up to 50MB.',
tipText: "If you don't want to enter prompt words for now, click confirm and operate in the list",
pleaseUploadFirst: 'Please upload an image first',
uploadSuccess: 'Image uploaded successfully',
pleaseEnter: 'Please enter',
},
eventPic: {
copySuccess: 'Copied successfully',
copyFail: 'Copy failed',
backToEvent: 'Back to Event Management',
},
roomType: {
ctrip: 'Ctrip',
fliggy: 'Fliggy',
douyinHotel: 'Douyin (Xifeng Nanshan Tianmu Hot Spring Hotel)',
douyinHotSpring: 'Douyin (Xifeng Nanshan Tianmu Hot Spring)',
meituan: 'Meituan',
},
common: {
cancel: 'Cancel',
confirm: 'Confirm',
},
};
const ZH_KNOWLEDGE_MESSAGES: MessageTree = {
title: '知识库管理',
desc: '内容管理',
roomTypeManager: '房型管理',
eventManager: '事件管理',
event: {
addEvent: '添加事件',
eventName: '事件名称',
eventDesc: '事件描述',
effectiveTime: '生效时间',
endTime: '结束时间',
relatedImage: '关联图片',
enableDisable: '启用/停用',
operation: '操作',
viewImage: '查看图片',
uploadImage: '上传图片',
pleaseEnter: '请输入',
effectiveTimeRange: '生效时间段',
to: '至',
startDate: '开始日期',
endDate: '结束日期',
pleaseEnterEventName: '请输入活动名称',
lengthValidation: '长度在 3 到 50 个字符之间',
pleaseEnterEventDesc: '请输入活动描述',
pleaseSelectTimeRange: '请选择生效时间段',
},
upload: {
title: '上传图片',
step1: '上传图片 1',
step2: '图片描述 2',
dragText: '选择一个文件或将其拖放到此处',
formatDesc: '支持 JPEG、PNG、PDF 和 MP4大小不超过 50MB。',
tipText: '如果暂时不想输入提示词,可点击确认后到列表操作。',
pleaseUploadFirst: '请先上传图片',
uploadSuccess: '图片上传成功',
pleaseEnter: '请输入',
},
eventPic: {
copySuccess: '复制成功',
copyFail: '复制失败',
backToEvent: '返回事件管理',
},
roomType: {
ctrip: '携程',
fliggy: '飞猪',
douyinHotel: '抖音(息烽南山天沐温泉酒店)',
douyinHotSpring: '抖音(息烽南山天沐温泉)',
meituan: '美团',
},
common: {
cancel: '取消',
confirm: '确认',
},
};
const JA_KNOWLEDGE_MESSAGES: MessageTree = {
title: 'ナレッジ管理',
desc: 'コンテンツ管理',
roomTypeManager: '部屋タイプ管理',
eventManager: 'イベント管理',
event: {
addEvent: 'イベントを追加',
eventName: 'イベント名',
eventDesc: 'イベントの説明',
effectiveTime: '有効時間',
endTime: '終了時間',
relatedImage: '関連画像',
enableDisable: '有効/無効',
operation: '操作',
viewImage: '画像を表示',
uploadImage: '画像をアップロード',
pleaseEnter: '入力してください',
effectiveTimeRange: '有効期間',
to: 'から',
startDate: '開始日',
endDate: '終了日',
pleaseEnterEventName: 'イベント名を入力してください',
lengthValidation: '3〜50文字で入力してください',
pleaseEnterEventDesc: 'イベントの説明を入力してください',
pleaseSelectTimeRange: '有効期間を選択してください',
},
upload: {
title: '画像をアップロード',
step1: '画像のアップロード 1',
step2: '画像の説明 2',
dragText: 'ファイルを選択するか、ここにドラッグ&ドロップしてください',
formatDesc: 'JPEG、PNG、PDF、MP4 形式に対応し、最大 50MB です。',
tipText: '今はプロンプトを入力しない場合でも、確認後に一覧で操作できます。',
pleaseUploadFirst: '先に画像をアップロードしてください',
uploadSuccess: '画像のアップロードに成功しました',
pleaseEnter: '入力してください',
},
eventPic: {
copySuccess: 'コピーに成功しました',
copyFail: 'コピーに失敗しました',
backToEvent: 'イベント管理に戻る',
},
roomType: {
ctrip: 'Ctrip',
fliggy: 'Fliggy',
douyinHotel: 'Douyin (Xifeng Nanshan Tianmu Hot Spring Hotel)',
douyinHotSpring: 'Douyin (Xifeng Nanshan Tianmu Hot Spring)',
meituan: 'Meituan',
},
common: {
cancel: 'キャンセル',
confirm: '確認',
},
};
const KNOWLEDGE_MESSAGES: Record<LanguageCode, MessageTree> = {
en: EN_KNOWLEDGE_MESSAGES,
zh: ZH_KNOWLEDGE_MESSAGES,
ja: JA_KNOWLEDGE_MESSAGES,
};
function lookupMessage(source: MessageTree, path: string): unknown {
return path.split('.').reduce<unknown>((current, segment) => {
if (!current || typeof current !== 'object') return undefined;
return (current as Record<string, unknown>)[segment];
}, source);
}
function interpolate(template: string, params?: InterpolationParams): string {
if (!params) return template;
return template.replace(/\{(\w+)\}/g, (_match, token) => {
const value = params[token];
return typeof value === 'undefined' ? `{${token}}` : String(value);
});
}
function createKnowledgeTranslate(locale: LanguageCode): KnowledgeTranslate {
return (path, params, fallback) => {
const normalizedPath = normalizeKnowledgePath(path);
const translated = lookupMessage(KNOWLEDGE_MESSAGES[locale] ?? KNOWLEDGE_MESSAGES.en, normalizedPath)
?? lookupMessage(KNOWLEDGE_MESSAGES.en, normalizedPath);
if (typeof translated === 'string' || typeof translated === 'number') {
return interpolate(String(translated), params);
}
return fallback ?? path;
};
}
export function useKnowledgeCopy(): KnowledgeTranslate {
const [locale, setLocale] = useState<LanguageCode>(getLocale());
useEffect(() => i18n.subscribe(setLocale), []);
return createKnowledgeTranslate(locale);
}