sa2kit 1.6.2 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/{chunk-5XUE72Y3.mjs → chunk-6LEA37ZM.mjs} +2 -2
- package/dist/{chunk-5XUE72Y3.mjs.map → chunk-6LEA37ZM.mjs.map} +1 -1
- package/dist/chunk-EBP7AE6F.js +167 -0
- package/dist/chunk-EBP7AE6F.js.map +1 -0
- package/dist/chunk-MBG4DBGP.mjs +154 -0
- package/dist/chunk-MBG4DBGP.mjs.map +1 -0
- package/dist/{chunk-DQVPZTVC.js → chunk-QKXKXAAV.js} +2 -2
- package/dist/{chunk-DQVPZTVC.js.map → chunk-QKXKXAAV.js.map} +1 -1
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index-DtLpANUB.d.mts +70 -0
- package/dist/index-DtLpANUB.d.ts +70 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/index.d.mts +16 -2
- package/dist/mmd/index.d.ts +16 -2
- package/dist/mmd/index.js +280 -130
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +280 -130
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +1 -1
- package/dist/mmd/server/index.d.ts +1 -1
- package/dist/music/index.d.mts +30 -0
- package/dist/music/index.d.ts +30 -0
- package/dist/music/index.js +458 -0
- package/dist/music/index.js.map +1 -0
- package/dist/music/index.mjs +427 -0
- package/dist/music/index.mjs.map +1 -0
- package/dist/music/server/index.d.mts +1 -0
- package/dist/music/server/index.d.ts +1 -0
- package/dist/music/server/index.js +29 -0
- package/dist/music/server/index.js.map +1 -0
- package/dist/music/server/index.mjs +4 -0
- package/dist/music/server/index.mjs.map +1 -0
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +7 -7
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
- package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
- package/dist/universalFile/server/index.js +5 -5
- package/dist/universalFile/server/index.mjs +1 -1
- package/package.json +32 -19
- package/tailwind.animations.js +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/testYourself/data/defaultResults.ts","../src/testYourself/admin/ConfigManager.tsx","../src/testYourself/admin/ConfigList.tsx"],"names":["ImageIcon","UploadIcon","useState","useCallback","useEffect","React","Star","Edit","Copy","Download","Trash2"],"mappings":"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","file":"chunk-5XUE72Y3.mjs","sourcesContent":["/**\n * 默认测试结果数据\n * Default Test Results Data\n * \n * 包含45个预设结果\n */\n\nimport type { TestResult } from '../types';\n\nexport const DEFAULT_RESULTS: TestResult[] = [\n // 动物系列 (1-15)\n {\n id: 'animal-cat',\n title: '慵懒的猫咪 🐱',\n description: '你就像一只优雅的猫,独立自主,喜欢按照自己的节奏生活。有时高冷,有时粘人,充满神秘魅力。',\n image: '🐱',\n imageType: 'emoji',\n },\n {\n id: 'animal-dog',\n title: '忠诚的狗狗 🐕',\n description: '你像一只热情的狗狗,对朋友忠诚,充满活力。总是能给周围的人带来欢乐和温暖。',\n image: '🐕',\n imageType: 'emoji',\n },\n {\n id: 'animal-panda',\n title: '可爱的熊猫 🐼',\n description: '你就像国宝熊猫一样,呆萌可爱,人见人爱。慢节奏的生活方式让你充满治愈力。',\n image: '🐼',\n imageType: 'emoji',\n },\n {\n id: 'animal-fox',\n title: '机智的狐狸 🦊',\n description: '聪明伶俐,反应敏捷。你总能用智慧解决问题,是团队中的智囊担当。',\n image: '🦊',\n imageType: 'emoji',\n },\n {\n id: 'animal-owl',\n title: '睿智的猫头鹰 🦉',\n description: '你像猫头鹰一样充满智慧,喜欢在夜深人静时思考。理性、沉稳是你的标签。',\n image: '🦉',\n imageType: 'emoji',\n },\n {\n id: 'animal-dolphin',\n title: '快乐的海豚 🐬',\n description: '活泼开朗,社交达人。你的笑容能够感染身边的每一个人。',\n image: '🐬',\n imageType: 'emoji',\n },\n {\n id: 'animal-butterfly',\n title: '自由的蝴蝶 🦋',\n description: '追求自由,热爱美好事物。你的人生充满色彩,从不被束缚。',\n image: '🦋',\n imageType: 'emoji',\n },\n {\n id: 'animal-lion',\n title: '勇敢的狮子 🦁',\n description: '天生的领导者,勇敢果断。你的气场强大,总能激励他人。',\n image: '🦁',\n imageType: 'emoji',\n },\n {\n id: 'animal-rabbit',\n title: '温柔的兔子 🐰',\n description: '心地善良,温柔体贴。你的存在就像春天的微风,让人感到温暖。',\n image: '🐰',\n imageType: 'emoji',\n },\n {\n id: 'animal-penguin',\n title: '呆萌的企鹅 🐧',\n description: '憨态可掬,认真执着。虽然看起来笨拙,但做事一丝不苟。',\n image: '🐧',\n imageType: 'emoji',\n },\n {\n id: 'animal-eagle',\n title: '翱翔的雄鹰 🦅',\n description: '目光远大,志向高远。你总是能看到别人看不到的机会。',\n image: '🦅',\n imageType: 'emoji',\n },\n {\n id: 'animal-koala',\n title: '慵懒的考拉 🐨',\n description: '佛系生活,知足常乐。你懂得享受当下,活在自己的节奏里。',\n image: '🐨',\n imageType: 'emoji',\n },\n {\n id: 'animal-sloth',\n title: '悠闲的树懒 🦥',\n description: '慢慢来,比较快。你相信急不来的事就不要急,保持自己的pace。',\n image: '🦥',\n imageType: 'emoji',\n },\n {\n id: 'animal-unicorn',\n title: '梦幻的独角兽 🦄',\n description: '充满幻想,追求完美。你的世界五彩斑斓,总有独特的想法。',\n image: '🦄',\n imageType: 'emoji',\n },\n {\n id: 'animal-dragon',\n title: '神秘的龙 🐉',\n description: '强大而神秘,充满魅力。你是传说中的存在,令人向往。',\n image: '🐉',\n imageType: 'emoji',\n },\n\n // 星球系列 (16-25)\n {\n id: 'planet-sun',\n title: '温暖的太阳 ☀️',\n description: '你就像太阳一样,是团队的能量来源,温暖着周围的每个人。',\n image: '☀️',\n imageType: 'emoji',\n },\n {\n id: 'planet-moon',\n title: '温柔的月亮 🌙',\n description: '安静而温柔,在黑暗中给人光明。你是夜晚最美的陪伴。',\n image: '🌙',\n imageType: 'emoji',\n },\n {\n id: 'planet-star',\n title: '闪耀的星星 ⭐',\n description: '虽然渺小,但始终闪耀。你用自己的方式发光发热。',\n image: '⭐',\n imageType: 'emoji',\n },\n {\n id: 'planet-earth',\n title: '包容的地球 🌍',\n description: '包容万物,生机勃勃。你有着宽广的胸怀和无限的可能。',\n image: '🌍',\n imageType: 'emoji',\n },\n {\n id: 'planet-saturn',\n title: '独特的土星 🪐',\n description: '与众不同,自成一格。你的个性就像土星环一样令人着迷。',\n image: '🪐',\n imageType: 'emoji',\n },\n {\n id: 'weather-rainbow',\n title: '绚丽的彩虹 🌈',\n description: '风雨过后见彩虹,你总能在困难后看到希望和美好。',\n image: '🌈',\n imageType: 'emoji',\n },\n {\n id: 'weather-cloud',\n title: '飘逸的云朵 ☁️',\n description: '自由自在,随风飘荡。你不被定义,永远充满可能。',\n image: '☁️',\n imageType: 'emoji',\n },\n {\n id: 'weather-lightning',\n title: '闪电 ⚡',\n description: '爆发力强,行动迅速。你的能量就像闪电一样令人震撼。',\n image: '⚡',\n imageType: 'emoji',\n },\n {\n id: 'weather-snowflake',\n title: '独特的雪花 ❄️',\n description: '世界上没有两片相同的雪花,你也是独一无二的存在。',\n image: '❄️',\n imageType: 'emoji',\n },\n {\n id: 'weather-fire',\n title: '热情的火焰 🔥',\n description: '热情似火,充满激情。你的存在能点燃周围的气氛。',\n image: '🔥',\n imageType: 'emoji',\n },\n\n // 植物系列 (26-35)\n {\n id: 'plant-tree',\n title: '坚韧的大树 🌳',\n description: '稳重可靠,根基深厚。你是大家可以依靠的存在。',\n image: '🌳',\n imageType: 'emoji',\n },\n {\n id: 'plant-flower',\n title: '美丽的花朵 🌸',\n description: '绽放自我,美丽动人。你的存在就是一道靓丽的风景。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-sunflower',\n title: '向阳的向日葵 🌻',\n description: '永远向着阳光,积极向上。你的乐观感染着每个人。',\n image: '🌻',\n imageType: 'emoji',\n },\n {\n id: 'plant-rose',\n title: '优雅的玫瑰 🌹',\n description: '高贵优雅,充满魅力。虽有刺但更有美丽。',\n image: '🌹',\n imageType: 'emoji',\n },\n {\n id: 'plant-cactus',\n title: '坚强的仙人掌 🌵',\n description: '在艰难环境中依然坚强。你的韧性令人敬佩。',\n image: '🌵',\n imageType: 'emoji',\n },\n {\n id: 'plant-clover',\n title: '幸运的四叶草 🍀',\n description: '幸运的象征,总能给人带来好运和希望。',\n image: '🍀',\n imageType: 'emoji',\n },\n {\n id: 'plant-maple',\n title: '浪漫的枫叶 🍁',\n description: '浪漫而诗意,你的世界充满艺术气息。',\n image: '🍁',\n imageType: 'emoji',\n },\n {\n id: 'plant-mushroom',\n title: '神秘的蘑菇 🍄',\n description: '低调神秘,总有意想不到的惊喜。',\n image: '🍄',\n imageType: 'emoji',\n },\n {\n id: 'plant-cherry',\n title: '浪漫的樱花 🌸',\n description: '短暂而美好,你珍惜每一个瞬间的美丽。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-bamboo',\n title: '坚韧的竹子 🎋',\n description: '虚心有节,愈挫愈勇。你的精神值得学习。',\n image: '🎋',\n imageType: 'emoji',\n },\n\n // 食物系列 (36-45)\n {\n id: 'food-coffee',\n title: '提神的咖啡 ☕',\n description: '你就像咖啡,是大家的能量来源,帮助他人保持活力。',\n image: '☕',\n imageType: 'emoji',\n },\n {\n id: 'food-pizza',\n title: '快乐的披萨 🍕',\n description: '人见人爱,总能带来快乐。你是聚会的灵魂。',\n image: '🍕',\n imageType: 'emoji',\n },\n {\n id: 'food-cookie',\n title: '甜蜜的饼干 🍪',\n description: '温暖甜蜜,给人comfort。你是最好的治愈系存在。',\n image: '🍪',\n imageType: 'emoji',\n },\n {\n id: 'food-icecream',\n title: '清凉的冰淇淋 🍦',\n description: '甜美可爱,在炎热时给人清凉。你总能在关键时刻出现。',\n image: '🍦',\n imageType: 'emoji',\n },\n {\n id: 'food-honey',\n title: '甜蜜的蜂蜜 🍯',\n description: '天然甜美,纯粹可爱。你的存在就是幸福的味道。',\n image: '🍯',\n imageType: 'emoji',\n },\n {\n id: 'food-sushi',\n title: '精致的寿司 🍣',\n description: '精致优雅,注重细节。你对生活有着独特的品味。',\n image: '🍣',\n imageType: 'emoji',\n },\n {\n id: 'food-cake',\n title: '甜美的蛋糕 🎂',\n description: '甜蜜美好,是庆祝的象征。你总能给人带来惊喜。',\n image: '🎂',\n imageType: 'emoji',\n },\n {\n id: 'food-donut',\n title: '可爱的甜甜圈 🍩',\n description: '圆圆满满,甜蜜可爱。你的存在让生活更美好。',\n image: '🍩',\n imageType: 'emoji',\n },\n {\n id: 'food-lollipop',\n title: '童真的棒棒糖 🍭',\n description: '保持童心,永远年轻。你的纯真令人羡慕。',\n image: '🍭',\n imageType: 'emoji',\n },\n {\n id: 'food-watermelon',\n title: '清爽的西瓜 🍉',\n description: '清爽解渴,夏日必备。你总能带来清新的感觉。',\n image: '🍉',\n imageType: 'emoji',\n },\n];\n\n// 验证数据集长度\nif (DEFAULT_RESULTS.length !== 45) {\n console.warn(`结果数据集应包含45项,当前: ${DEFAULT_RESULTS.length}`);\n}\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 配置管理后台组件\n * Test Yourself - Configuration Manager Component\n * \n * 支持创建、编辑、管理多套测试配置\n */\n\n'use client';\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport {\n Plus,\n Trash2,\n Edit,\n Save,\n X,\n Upload as UploadIcon,\n Download,\n Copy,\n Star,\n Image as ImageIcon,\n AlertCircle,\n CheckCircle2,\n} from 'lucide-react';\n\nimport type { SavedConfig, TestConfig, TestResult } from '../types';\nimport { ConfigService } from '../server/ConfigService';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nexport interface ConfigManagerProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 配置变化回调 */\n onConfigChange?: (configs: SavedConfig[]) => void;\n /** 自定义样式 */\n className?: string;\n /** 图片上传处理函数 */\n onImageUpload?: (file: File) => Promise<string>;\n}\n\ninterface EditingResult extends TestResult {\n _tempId?: string;\n}\n\n/**\n * 配置管理器组件\n */\nexport const ConfigManager: React.FC<ConfigManagerProps> = ({\n configService,\n onConfigChange,\n className = '',\n onImageUpload,\n}) => {\n const [configs, setConfigs] = useState<SavedConfig[]>([]);\n const [selectedConfig, setSelectedConfig] = useState<SavedConfig | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // 编辑表单状态\n const [editForm, setEditForm] = useState({\n name: '',\n description: '',\n gameTitle: '',\n gameDescription: '',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [] as EditingResult[],\n });\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const allConfigs = await configService.getAllConfigs();\n setConfigs(allConfigs);\n onConfigChange?.(allConfigs);\n } catch (err: any) {\n setError(`加载配置失败: ${err.message}`);\n } finally {\n setLoading(false);\n }\n }, [configService, onConfigChange]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 开始创建新配置\n const handleStartCreate = () => {\n setEditForm({\n name: '新配置',\n description: '',\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [],\n });\n setIsCreating(true);\n setIsEditing(true);\n setSelectedConfig(null);\n };\n\n // 开始编辑配置\n const handleStartEdit = (config: SavedConfig) => {\n setEditForm({\n name: config.name,\n description: config.description || '',\n gameTitle: config.config.gameTitle,\n gameDescription: config.config.gameDescription || '',\n buttonText: config.config.buttonText || '长按开始测试',\n longPressDuration: config.config.longPressDuration || 2000,\n results: config.config.results,\n });\n setIsCreating(false);\n setIsEditing(true);\n setSelectedConfig(config);\n };\n\n // 取消编辑\n const handleCancelEdit = () => {\n setIsEditing(false);\n setIsCreating(false);\n setSelectedConfig(null);\n setError(null);\n };\n\n // 保存配置\n const handleSave = async () => {\n try {\n setError(null);\n\n // 验证\n if (!editForm.name.trim()) {\n setError('请输入配置名称');\n return;\n }\n if (!editForm.gameTitle.trim()) {\n setError('请输入游戏标题');\n return;\n }\n if (editForm.results.length === 0) {\n setError('请至少添加一个结果项');\n return;\n }\n\n const testConfig: TestConfig = {\n gameTitle: editForm.gameTitle,\n gameDescription: editForm.gameDescription,\n buttonText: editForm.buttonText,\n longPressDuration: editForm.longPressDuration,\n results: editForm.results,\n };\n\n if (isCreating) {\n await configService.createConfig(\n editForm.name,\n testConfig,\n editForm.description\n );\n setSuccess('创建配置成功!');\n } else if (selectedConfig) {\n await configService.updateConfig(selectedConfig.id, {\n name: editForm.name,\n description: editForm.description,\n config: testConfig,\n });\n setSuccess('更新配置成功!');\n }\n\n await loadConfigs();\n handleCancelEdit();\n\n // 3秒后清除成功提示\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`保存失败: ${err.message}`);\n }\n };\n\n // 删除配置\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n\n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n setSuccess('删除成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`删除失败: ${err.message}`);\n }\n };\n\n // 复制配置\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n setSuccess('复制成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`复制失败: ${err.message}`);\n }\n };\n\n // 设置默认配置\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n setSuccess('设置默认配置成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`设置失败: ${err.message}`);\n }\n };\n\n // 导出配置\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `config_${id}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setSuccess('导出成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`导出失败: ${err.message}`);\n }\n };\n\n // 导入配置\n const handleImport = async () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n await configService.importConfig(text);\n await loadConfigs();\n setSuccess('导入成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`导入失败: ${err.message}`);\n }\n };\n input.click();\n };\n\n // 添加结果项\n const handleAddResult = () => {\n const newResult: EditingResult = {\n id: `temp_${Date.now()}`,\n _tempId: `temp_${Date.now()}`,\n title: '新结果',\n description: '这是一个新的结果描述',\n image: '🎉',\n imageType: 'emoji',\n };\n setEditForm({\n ...editForm,\n results: [...editForm.results, newResult],\n });\n };\n\n // 删除结果项\n const handleDeleteResult = (index: number) => {\n const newResults = [...editForm.results];\n newResults.splice(index, 1);\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 更新结果项\n const handleUpdateResult = (index: number, updates: Partial<TestResult>) => {\n const newResults = [...editForm.results];\n newResults[index] = { ...newResults[index], ...updates } as EditingResult;\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 图片上传处理\n const handleResultImageUpload = async (index: number, file: File) => {\n try {\n if (!onImageUpload) {\n // 如果没有提供上传函数,使用 Base64\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n handleUpdateResult(index, {\n image: base64,\n imageType: 'url',\n });\n };\n reader.readAsDataURL(file);\n } else {\n // 使用提供的上传函数\n const url = await onImageUpload(file);\n handleUpdateResult(index, {\n image: url,\n imageType: 'url',\n });\n }\n } catch (err: any) {\n setError(`上传图片失败: ${err.message}`);\n }\n };\n\n // 使用默认结果\n const handleUseDefaultResults = () => {\n if (confirm('确定要使用默认的45个结果吗?这将替换当前的所有结果。')) {\n setEditForm({ ...editForm, results: DEFAULT_RESULTS });\n }\n };\n\n // 渲染配置列表\n const renderConfigList = () => (\n <div className=\"space-y-4\">\n {configs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.config.results.length}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleStartEdit(config)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n\n // 渲染结果编辑器\n const renderResultEditor = (result: EditingResult, index: number) => (\n <div\n key={result._tempId || result.id}\n className=\"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 space-y-3\"\n >\n <div className=\"flex items-start justify-between\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 结果 #{index + 1}\n </h4>\n <button\n onClick={() => handleDeleteResult(index)}\n className=\"text-red-600 hover:text-red-700\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {/* 标题 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 标题\n </label>\n <input\n type=\"text\"\n value={result.title}\n onChange={(e) => handleUpdateResult(index, { title: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: 可爱的猫咪\"\n />\n </div>\n\n {/* 图片/Emoji */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 图片/Emoji\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={result.image}\n onChange={(e) => handleUpdateResult(index, { image: e.target.value })}\n className=\"flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"🎉 或 URL\"\n />\n <label className=\"cursor-pointer inline-flex items-center justify-center px-3 py-2 bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\">\n <ImageIcon className=\"w-5 h-5\" />\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleResultImageUpload(index, file);\n }}\n />\n </label>\n </div>\n </div>\n </div>\n\n {/* 描述 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 描述\n </label>\n <textarea\n value={result.description}\n onChange={(e) => handleUpdateResult(index, { description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"这个结果的详细描述...\"\n />\n </div>\n\n {/* 预览 */}\n {result.image && (\n <div className=\"flex items-center gap-2 p-2 bg-white dark:bg-gray-600 rounded border border-gray-200 dark:border-gray-500\">\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">预览:</span>\n {result.imageType === 'emoji' ? (\n <span className=\"text-2xl\">{result.image}</span>\n ) : (\n <img src={result.image} alt={result.title} className=\"w-8 h-8 object-cover rounded\" />\n )}\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {result.title}\n </span>\n </div>\n )}\n </div>\n );\n\n // 渲染编辑表单\n const renderEditForm = () => (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {isCreating ? '创建新配置' : '编辑配置'}\n </h2>\n <button\n onClick={handleCancelEdit}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* 基本信息 */}\n <div className=\"space-y-4 bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n 基本信息\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置名称 *\n </label>\n <input\n type=\"text\"\n value={editForm.name}\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 动物主题测试\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏标题 *\n </label>\n <input\n type=\"text\"\n value={editForm.gameTitle}\n onChange={(e) => setEditForm({ ...editForm, gameTitle: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 测测你是什么动物\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置描述\n </label>\n <textarea\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"简要描述这个配置的用途...\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏描述\n </label>\n <input\n type=\"text\"\n value={editForm.gameDescription}\n onChange={(e) => setEditForm({ ...editForm, gameDescription: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 长按按钮,发现你的专属属性\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 按钮文本\n </label>\n <input\n type=\"text\"\n value={editForm.buttonText}\n onChange={(e) => setEditForm({ ...editForm, buttonText: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 长按时间 (毫秒)\n </label>\n <input\n type=\"number\"\n value={editForm.longPressDuration}\n onChange={(e) =>\n setEditForm({ ...editForm, longPressDuration: parseInt(e.target.value) || 2000 })\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n min=\"500\"\n step=\"100\"\n />\n </div>\n </div>\n </div>\n\n {/* 结果列表 */}\n <div className=\"bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n 结果列表 ({editForm.results.length})\n </h3>\n <div className=\"flex gap-2\">\n <button\n onClick={handleUseDefaultResults}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-purple-50 dark:bg-purple-900 text-purple-600 dark:text-purple-200 rounded-lg hover:bg-purple-100 dark:hover:bg-purple-800\"\n >\n 使用默认结果\n </button>\n <button\n onClick={handleAddResult}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\"\n >\n <Plus className=\"w-4 h-4\" />\n 添加结果\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3 max-h-[500px] overflow-y-auto\">\n {editForm.results.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500 dark:text-gray-400\">\n <p>还没有添加任何结果</p>\n <p className=\"text-sm mt-2\">点击\"添加结果\"或\"使用默认结果\"开始</p>\n </div>\n ) : (\n editForm.results.map((result, index) => renderResultEditor(result, index))\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center justify-end gap-3\">\n <button\n onClick={handleCancelEdit}\n className=\"px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 取消\n </button>\n <button\n onClick={handleSave}\n className=\"inline-flex items-center gap-2 px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Save className=\"w-5 h-5\" />\n 保存配置\n </button>\n </div>\n </div>\n );\n\n if (loading) {\n return (\n <div className={`p-8 ${className}`}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`p-6 ${className}`}>\n {/* 消息提示 */}\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg flex items-center gap-2 text-red-800 dark:text-red-200\">\n <AlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span>{error}</span>\n <button onClick={() => setError(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {success && (\n <div className=\"mb-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg flex items-center gap-2 text-green-800 dark:text-green-200\">\n <CheckCircle2 className=\"w-5 h-5 flex-shrink-0\" />\n <span>{success}</span>\n <button onClick={() => setSuccess(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {isEditing ? (\n renderEditForm()\n ) : (\n <>\n {/* 头部操作栏 */}\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-3xl font-bold text-gray-900 dark:text-white\">配置管理</h1>\n <div className=\"flex gap-2\">\n <button\n onClick={handleImport}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n <UploadIcon className=\"w-5 h-5\" />\n 导入\n </button>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建配置\n </button>\n </div>\n </div>\n\n {/* 配置列表 */}\n {configs.length === 0 ? (\n <div className=\"text-center py-12 bg-white dark:bg-gray-800 rounded-lg border-2 border-dashed border-gray-300 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400 mb-4\">还没有任何配置</p>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建第一个配置\n </button>\n </div>\n ) : (\n renderConfigList()\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default ConfigManager;\n\n\n","/**\n * 测测你是什么 - 配置列表组件\n * Test Yourself - Configuration List Component\n * \n * 用于展示和选择配置\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n Eye,\n Edit,\n Trash2,\n Copy,\n Star,\n Download,\n RefreshCw,\n ExternalLink,\n} from 'lucide-react';\n\nimport type { ConfigListItem } from '../types';\nimport { ConfigService } from '../server/ConfigService';\n\nexport interface ConfigListProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 选择配置回调 */\n onSelect?: (id: string) => void;\n /** 编辑配置回调 */\n onEdit?: (id: string) => void;\n /** 删除配置回调 */\n onDelete?: (id: string) => void;\n /** 是否显示操作按钮 */\n showActions?: boolean;\n /** 是否显示预览链接 */\n showPreviewLink?: boolean;\n /** 预览基础URL */\n previewBaseUrl?: string;\n /** 自定义样式 */\n className?: string;\n /** 每页显示数量 */\n pageSize?: number;\n}\n\n/**\n * 配置列表组件\n */\nexport const ConfigList: React.FC<ConfigListProps> = ({\n configService,\n onSelect,\n onEdit,\n onDelete,\n showActions = true,\n showPreviewLink = false,\n previewBaseUrl = '/test-yourself',\n className = '',\n pageSize = 10,\n}) => {\n const [configs, setConfigs] = useState<ConfigListItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState('');\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const list = await configService.getConfigList();\n setConfigs(list);\n } catch (error) {\n console.error('加载配置列表失败:', error);\n } finally {\n setLoading(false);\n }\n }, [configService]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 处理刷新\n const handleRefresh = () => {\n loadConfigs();\n };\n\n // 处理选择\n const handleSelect = (id: string) => {\n onSelect?.(id);\n };\n\n // 处理编辑\n const handleEdit = (id: string) => {\n onEdit?.(id);\n };\n\n // 处理删除\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n \n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n onDelete?.(id);\n } catch (error) {\n console.error('删除配置失败:', error);\n alert('删除失败,请重试');\n }\n };\n\n // 处理复制\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('复制配置失败:', error);\n alert('复制失败,请重试');\n }\n };\n\n // 处理设置默认\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('设置默认配置失败:', error);\n alert('设置失败,请重试');\n }\n };\n\n // 处理导出\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `config_${id}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('导出配置失败:', error);\n alert('导出失败,请重试');\n }\n };\n\n // 生成预览链接\n const getPreviewUrl = (id: string) => {\n return `${previewBaseUrl}?configId=${id}`;\n };\n\n // 过滤配置\n const filteredConfigs = configs.filter(config => {\n if (!searchTerm) return true;\n const term = searchTerm.toLowerCase();\n return (\n config.name.toLowerCase().includes(term) ||\n config.description?.toLowerCase().includes(term)\n );\n });\n\n // 分页\n const totalPages = Math.ceil(filteredConfigs.length / pageSize);\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const currentConfigs = filteredConfigs.slice(startIndex, endIndex);\n\n if (loading) {\n return (\n <div className={`p-8 ${className}`}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* 头部 */}\n <div className=\"mb-4 flex items-center justify-between gap-4\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n placeholder=\"搜索配置...\"\n value={searchTerm}\n onChange={(e) => {\n setSearchTerm(e.target.value);\n setCurrentPage(1);\n }}\n className=\"w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n />\n </div>\n <button\n onClick={handleRefresh}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n title=\"刷新\"\n >\n <RefreshCw className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* 配置列表 */}\n {currentConfigs.length === 0 ? (\n <div className=\"text-center py-12 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n {searchTerm ? '没有找到匹配的配置' : '还没有任何配置'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {currentConfigs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n {/* 配置信息 */}\n <div\n className=\"flex-1 cursor-pointer\"\n onClick={() => handleSelect(config.id)}\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.resultCount}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n {config.updatedAt !== config.createdAt && (\n <span>更新: {new Date(config.updatedAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n {showActions && (\n <div className=\"flex items-center gap-1\">\n {showPreviewLink && (\n <a\n href={getPreviewUrl(config.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 text-gray-600 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400\"\n title=\"预览\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleEdit(config.id)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 分页 */}\n {totalPages > 1 && (\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n 显示 {startIndex + 1} - {Math.min(endIndex, filteredConfigs.length)} 共{' '}\n {filteredConfigs.length} 个配置\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 上一页\n </button>\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">\n {currentPage} / {totalPages}\n </span>\n <button\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 下一页\n </button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConfigList;\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/testYourself/data/defaultResults.ts","../src/testYourself/admin/ConfigManager.tsx","../src/testYourself/admin/ConfigList.tsx"],"names":["ImageIcon","UploadIcon","useState","useCallback","useEffect","React","Star","Edit","Copy","Download","Trash2"],"mappings":"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","file":"chunk-6LEA37ZM.mjs","sourcesContent":["/**\n * 默认测试结果数据\n * Default Test Results Data\n * \n * 包含45个预设结果\n */\n\nimport type { TestResult } from '../types';\n\nexport const DEFAULT_RESULTS: TestResult[] = [\n // 动物系列 (1-15)\n {\n id: 'animal-cat',\n title: '慵懒的猫咪 🐱',\n description: '你就像一只优雅的猫,独立自主,喜欢按照自己的节奏生活。有时高冷,有时粘人,充满神秘魅力。',\n image: '🐱',\n imageType: 'emoji',\n },\n {\n id: 'animal-dog',\n title: '忠诚的狗狗 🐕',\n description: '你像一只热情的狗狗,对朋友忠诚,充满活力。总是能给周围的人带来欢乐和温暖。',\n image: '🐕',\n imageType: 'emoji',\n },\n {\n id: 'animal-panda',\n title: '可爱的熊猫 🐼',\n description: '你就像国宝熊猫一样,呆萌可爱,人见人爱。慢节奏的生活方式让你充满治愈力。',\n image: '🐼',\n imageType: 'emoji',\n },\n {\n id: 'animal-fox',\n title: '机智的狐狸 🦊',\n description: '聪明伶俐,反应敏捷。你总能用智慧解决问题,是团队中的智囊担当。',\n image: '🦊',\n imageType: 'emoji',\n },\n {\n id: 'animal-owl',\n title: '睿智的猫头鹰 🦉',\n description: '你像猫头鹰一样充满智慧,喜欢在夜深人静时思考。理性、沉稳是你的标签。',\n image: '🦉',\n imageType: 'emoji',\n },\n {\n id: 'animal-dolphin',\n title: '快乐的海豚 🐬',\n description: '活泼开朗,社交达人。你的笑容能够感染身边的每一个人。',\n image: '🐬',\n imageType: 'emoji',\n },\n {\n id: 'animal-butterfly',\n title: '自由的蝴蝶 🦋',\n description: '追求自由,热爱美好事物。你的人生充满色彩,从不被束缚。',\n image: '🦋',\n imageType: 'emoji',\n },\n {\n id: 'animal-lion',\n title: '勇敢的狮子 🦁',\n description: '天生的领导者,勇敢果断。你的气场强大,总能激励他人。',\n image: '🦁',\n imageType: 'emoji',\n },\n {\n id: 'animal-rabbit',\n title: '温柔的兔子 🐰',\n description: '心地善良,温柔体贴。你的存在就像春天的微风,让人感到温暖。',\n image: '🐰',\n imageType: 'emoji',\n },\n {\n id: 'animal-penguin',\n title: '呆萌的企鹅 🐧',\n description: '憨态可掬,认真执着。虽然看起来笨拙,但做事一丝不苟。',\n image: '🐧',\n imageType: 'emoji',\n },\n {\n id: 'animal-eagle',\n title: '翱翔的雄鹰 🦅',\n description: '目光远大,志向高远。你总是能看到别人看不到的机会。',\n image: '🦅',\n imageType: 'emoji',\n },\n {\n id: 'animal-koala',\n title: '慵懒的考拉 🐨',\n description: '佛系生活,知足常乐。你懂得享受当下,活在自己的节奏里。',\n image: '🐨',\n imageType: 'emoji',\n },\n {\n id: 'animal-sloth',\n title: '悠闲的树懒 🦥',\n description: '慢慢来,比较快。你相信急不来的事就不要急,保持自己的pace。',\n image: '🦥',\n imageType: 'emoji',\n },\n {\n id: 'animal-unicorn',\n title: '梦幻的独角兽 🦄',\n description: '充满幻想,追求完美。你的世界五彩斑斓,总有独特的想法。',\n image: '🦄',\n imageType: 'emoji',\n },\n {\n id: 'animal-dragon',\n title: '神秘的龙 🐉',\n description: '强大而神秘,充满魅力。你是传说中的存在,令人向往。',\n image: '🐉',\n imageType: 'emoji',\n },\n\n // 星球系列 (16-25)\n {\n id: 'planet-sun',\n title: '温暖的太阳 ☀️',\n description: '你就像太阳一样,是团队的能量来源,温暖着周围的每个人。',\n image: '☀️',\n imageType: 'emoji',\n },\n {\n id: 'planet-moon',\n title: '温柔的月亮 🌙',\n description: '安静而温柔,在黑暗中给人光明。你是夜晚最美的陪伴。',\n image: '🌙',\n imageType: 'emoji',\n },\n {\n id: 'planet-star',\n title: '闪耀的星星 ⭐',\n description: '虽然渺小,但始终闪耀。你用自己的方式发光发热。',\n image: '⭐',\n imageType: 'emoji',\n },\n {\n id: 'planet-earth',\n title: '包容的地球 🌍',\n description: '包容万物,生机勃勃。你有着宽广的胸怀和无限的可能。',\n image: '🌍',\n imageType: 'emoji',\n },\n {\n id: 'planet-saturn',\n title: '独特的土星 🪐',\n description: '与众不同,自成一格。你的个性就像土星环一样令人着迷。',\n image: '🪐',\n imageType: 'emoji',\n },\n {\n id: 'weather-rainbow',\n title: '绚丽的彩虹 🌈',\n description: '风雨过后见彩虹,你总能在困难后看到希望和美好。',\n image: '🌈',\n imageType: 'emoji',\n },\n {\n id: 'weather-cloud',\n title: '飘逸的云朵 ☁️',\n description: '自由自在,随风飘荡。你不被定义,永远充满可能。',\n image: '☁️',\n imageType: 'emoji',\n },\n {\n id: 'weather-lightning',\n title: '闪电 ⚡',\n description: '爆发力强,行动迅速。你的能量就像闪电一样令人震撼。',\n image: '⚡',\n imageType: 'emoji',\n },\n {\n id: 'weather-snowflake',\n title: '独特的雪花 ❄️',\n description: '世界上没有两片相同的雪花,你也是独一无二的存在。',\n image: '❄️',\n imageType: 'emoji',\n },\n {\n id: 'weather-fire',\n title: '热情的火焰 🔥',\n description: '热情似火,充满激情。你的存在能点燃周围的气氛。',\n image: '🔥',\n imageType: 'emoji',\n },\n\n // 植物系列 (26-35)\n {\n id: 'plant-tree',\n title: '坚韧的大树 🌳',\n description: '稳重可靠,根基深厚。你是大家可以依靠的存在。',\n image: '🌳',\n imageType: 'emoji',\n },\n {\n id: 'plant-flower',\n title: '美丽的花朵 🌸',\n description: '绽放自我,美丽动人。你的存在就是一道靓丽的风景。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-sunflower',\n title: '向阳的向日葵 🌻',\n description: '永远向着阳光,积极向上。你的乐观感染着每个人。',\n image: '🌻',\n imageType: 'emoji',\n },\n {\n id: 'plant-rose',\n title: '优雅的玫瑰 🌹',\n description: '高贵优雅,充满魅力。虽有刺但更有美丽。',\n image: '🌹',\n imageType: 'emoji',\n },\n {\n id: 'plant-cactus',\n title: '坚强的仙人掌 🌵',\n description: '在艰难环境中依然坚强。你的韧性令人敬佩。',\n image: '🌵',\n imageType: 'emoji',\n },\n {\n id: 'plant-clover',\n title: '幸运的四叶草 🍀',\n description: '幸运的象征,总能给人带来好运和希望。',\n image: '🍀',\n imageType: 'emoji',\n },\n {\n id: 'plant-maple',\n title: '浪漫的枫叶 🍁',\n description: '浪漫而诗意,你的世界充满艺术气息。',\n image: '🍁',\n imageType: 'emoji',\n },\n {\n id: 'plant-mushroom',\n title: '神秘的蘑菇 🍄',\n description: '低调神秘,总有意想不到的惊喜。',\n image: '🍄',\n imageType: 'emoji',\n },\n {\n id: 'plant-cherry',\n title: '浪漫的樱花 🌸',\n description: '短暂而美好,你珍惜每一个瞬间的美丽。',\n image: '🌸',\n imageType: 'emoji',\n },\n {\n id: 'plant-bamboo',\n title: '坚韧的竹子 🎋',\n description: '虚心有节,愈挫愈勇。你的精神值得学习。',\n image: '🎋',\n imageType: 'emoji',\n },\n\n // 食物系列 (36-45)\n {\n id: 'food-coffee',\n title: '提神的咖啡 ☕',\n description: '你就像咖啡,是大家的能量来源,帮助他人保持活力。',\n image: '☕',\n imageType: 'emoji',\n },\n {\n id: 'food-pizza',\n title: '快乐的披萨 🍕',\n description: '人见人爱,总能带来快乐。你是聚会的灵魂。',\n image: '🍕',\n imageType: 'emoji',\n },\n {\n id: 'food-cookie',\n title: '甜蜜的饼干 🍪',\n description: '温暖甜蜜,给人comfort。你是最好的治愈系存在。',\n image: '🍪',\n imageType: 'emoji',\n },\n {\n id: 'food-icecream',\n title: '清凉的冰淇淋 🍦',\n description: '甜美可爱,在炎热时给人清凉。你总能在关键时刻出现。',\n image: '🍦',\n imageType: 'emoji',\n },\n {\n id: 'food-honey',\n title: '甜蜜的蜂蜜 🍯',\n description: '天然甜美,纯粹可爱。你的存在就是幸福的味道。',\n image: '🍯',\n imageType: 'emoji',\n },\n {\n id: 'food-sushi',\n title: '精致的寿司 🍣',\n description: '精致优雅,注重细节。你对生活有着独特的品味。',\n image: '🍣',\n imageType: 'emoji',\n },\n {\n id: 'food-cake',\n title: '甜美的蛋糕 🎂',\n description: '甜蜜美好,是庆祝的象征。你总能给人带来惊喜。',\n image: '🎂',\n imageType: 'emoji',\n },\n {\n id: 'food-donut',\n title: '可爱的甜甜圈 🍩',\n description: '圆圆满满,甜蜜可爱。你的存在让生活更美好。',\n image: '🍩',\n imageType: 'emoji',\n },\n {\n id: 'food-lollipop',\n title: '童真的棒棒糖 🍭',\n description: '保持童心,永远年轻。你的纯真令人羡慕。',\n image: '🍭',\n imageType: 'emoji',\n },\n {\n id: 'food-watermelon',\n title: '清爽的西瓜 🍉',\n description: '清爽解渴,夏日必备。你总能带来清新的感觉。',\n image: '🍉',\n imageType: 'emoji',\n },\n];\n\n// 验证数据集长度\nif (DEFAULT_RESULTS.length !== 45) {\n console.warn(`结果数据集应包含45项,当前: ${DEFAULT_RESULTS.length}`);\n}\n\n\n\n\n\n\n\n\n","/**\n * 测测你是什么 - 配置管理后台组件\n * Test Yourself - Configuration Manager Component\n * \n * 支持创建、编辑、管理多套测试配置\n */\n\n'use client';\n\nimport React, { useState, useCallback, useEffect } from 'react';\nimport {\n Plus,\n Trash2,\n Edit,\n Save,\n X,\n Upload as UploadIcon,\n Download,\n Copy,\n Star,\n Image as ImageIcon,\n AlertCircle,\n CheckCircle2,\n} from 'lucide-react';\n\nimport type { SavedConfig, TestConfig, TestResult } from '../types';\nimport { ConfigService } from '../server/ConfigService';\nimport { DEFAULT_RESULTS } from '../data/defaultResults';\n\nexport interface ConfigManagerProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 配置变化回调 */\n onConfigChange?: (configs: SavedConfig[]) => void;\n /** 自定义样式 */\n className?: string;\n /** 图片上传处理函数 */\n onImageUpload?: (file: File) => Promise<string>;\n}\n\ninterface EditingResult extends TestResult {\n _tempId?: string;\n}\n\n/**\n * 配置管理器组件\n */\nexport const ConfigManager: React.FC<ConfigManagerProps> = ({\n configService,\n onConfigChange,\n className = '',\n onImageUpload,\n}) => {\n const [configs, setConfigs] = useState<SavedConfig[]>([]);\n const [selectedConfig, setSelectedConfig] = useState<SavedConfig | null>(null);\n const [isEditing, setIsEditing] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // 编辑表单状态\n const [editForm, setEditForm] = useState({\n name: '',\n description: '',\n gameTitle: '',\n gameDescription: '',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [] as EditingResult[],\n });\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const allConfigs = await configService.getAllConfigs();\n setConfigs(allConfigs);\n onConfigChange?.(allConfigs);\n } catch (err: any) {\n setError(`加载配置失败: ${err.message}`);\n } finally {\n setLoading(false);\n }\n }, [configService, onConfigChange]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 开始创建新配置\n const handleStartCreate = () => {\n setEditForm({\n name: '新配置',\n description: '',\n gameTitle: '测测你是什么',\n gameDescription: '长按按钮,发现你的专属属性',\n buttonText: '长按开始测试',\n longPressDuration: 2000,\n results: [],\n });\n setIsCreating(true);\n setIsEditing(true);\n setSelectedConfig(null);\n };\n\n // 开始编辑配置\n const handleStartEdit = (config: SavedConfig) => {\n setEditForm({\n name: config.name,\n description: config.description || '',\n gameTitle: config.config.gameTitle,\n gameDescription: config.config.gameDescription || '',\n buttonText: config.config.buttonText || '长按开始测试',\n longPressDuration: config.config.longPressDuration || 2000,\n results: config.config.results,\n });\n setIsCreating(false);\n setIsEditing(true);\n setSelectedConfig(config);\n };\n\n // 取消编辑\n const handleCancelEdit = () => {\n setIsEditing(false);\n setIsCreating(false);\n setSelectedConfig(null);\n setError(null);\n };\n\n // 保存配置\n const handleSave = async () => {\n try {\n setError(null);\n\n // 验证\n if (!editForm.name.trim()) {\n setError('请输入配置名称');\n return;\n }\n if (!editForm.gameTitle.trim()) {\n setError('请输入游戏标题');\n return;\n }\n if (editForm.results.length === 0) {\n setError('请至少添加一个结果项');\n return;\n }\n\n const testConfig: TestConfig = {\n gameTitle: editForm.gameTitle,\n gameDescription: editForm.gameDescription,\n buttonText: editForm.buttonText,\n longPressDuration: editForm.longPressDuration,\n results: editForm.results,\n };\n\n if (isCreating) {\n await configService.createConfig(\n editForm.name,\n testConfig,\n editForm.description\n );\n setSuccess('创建配置成功!');\n } else if (selectedConfig) {\n await configService.updateConfig(selectedConfig.id, {\n name: editForm.name,\n description: editForm.description,\n config: testConfig,\n });\n setSuccess('更新配置成功!');\n }\n\n await loadConfigs();\n handleCancelEdit();\n\n // 3秒后清除成功提示\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`保存失败: ${err.message}`);\n }\n };\n\n // 删除配置\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n\n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n setSuccess('删除成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`删除失败: ${err.message}`);\n }\n };\n\n // 复制配置\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n setSuccess('复制成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`复制失败: ${err.message}`);\n }\n };\n\n // 设置默认配置\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n setSuccess('设置默认配置成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`设置失败: ${err.message}`);\n }\n };\n\n // 导出配置\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `config_${id}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setSuccess('导出成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`导出失败: ${err.message}`);\n }\n };\n\n // 导入配置\n const handleImport = async () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json';\n input.onchange = async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (!file) return;\n\n try {\n const text = await file.text();\n await configService.importConfig(text);\n await loadConfigs();\n setSuccess('导入成功!');\n setTimeout(() => setSuccess(null), 3000);\n } catch (err: any) {\n setError(`导入失败: ${err.message}`);\n }\n };\n input.click();\n };\n\n // 添加结果项\n const handleAddResult = () => {\n const newResult: EditingResult = {\n id: `temp_${Date.now()}`,\n _tempId: `temp_${Date.now()}`,\n title: '新结果',\n description: '这是一个新的结果描述',\n image: '🎉',\n imageType: 'emoji',\n };\n setEditForm({\n ...editForm,\n results: [...editForm.results, newResult],\n });\n };\n\n // 删除结果项\n const handleDeleteResult = (index: number) => {\n const newResults = [...editForm.results];\n newResults.splice(index, 1);\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 更新结果项\n const handleUpdateResult = (index: number, updates: Partial<TestResult>) => {\n const newResults = [...editForm.results];\n newResults[index] = { ...newResults[index], ...updates } as EditingResult;\n setEditForm({ ...editForm, results: newResults });\n };\n\n // 图片上传处理\n const handleResultImageUpload = async (index: number, file: File) => {\n try {\n if (!onImageUpload) {\n // 如果没有提供上传函数,使用 Base64\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n handleUpdateResult(index, {\n image: base64,\n imageType: 'url',\n });\n };\n reader.readAsDataURL(file);\n } else {\n // 使用提供的上传函数\n const url = await onImageUpload(file);\n handleUpdateResult(index, {\n image: url,\n imageType: 'url',\n });\n }\n } catch (err: any) {\n setError(`上传图片失败: ${err.message}`);\n }\n };\n\n // 使用默认结果\n const handleUseDefaultResults = () => {\n if (confirm('确定要使用默认的45个结果吗?这将替换当前的所有结果。')) {\n setEditForm({ ...editForm, results: DEFAULT_RESULTS });\n }\n };\n\n // 渲染配置列表\n const renderConfigList = () => (\n <div className=\"space-y-4\">\n {configs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.config.results.length}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleStartEdit(config)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-5 h-5\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n\n // 渲染结果编辑器\n const renderResultEditor = (result: EditingResult, index: number) => (\n <div\n key={result._tempId || result.id}\n className=\"bg-gray-50 dark:bg-gray-700 rounded-lg p-4 space-y-3\"\n >\n <div className=\"flex items-start justify-between\">\n <h4 className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n 结果 #{index + 1}\n </h4>\n <button\n onClick={() => handleDeleteResult(index)}\n className=\"text-red-600 hover:text-red-700\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3\">\n {/* 标题 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 标题\n </label>\n <input\n type=\"text\"\n value={result.title}\n onChange={(e) => handleUpdateResult(index, { title: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"例如: 可爱的猫咪\"\n />\n </div>\n\n {/* 图片/Emoji */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 图片/Emoji\n </label>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={result.image}\n onChange={(e) => handleUpdateResult(index, { image: e.target.value })}\n className=\"flex-1 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"🎉 或 URL\"\n />\n <label className=\"cursor-pointer inline-flex items-center justify-center px-3 py-2 bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\">\n <ImageIcon className=\"w-5 h-5\" />\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleResultImageUpload(index, file);\n }}\n />\n </label>\n </div>\n </div>\n </div>\n\n {/* 描述 */}\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n 描述\n </label>\n <textarea\n value={result.description}\n onChange={(e) => handleUpdateResult(index, { description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n placeholder=\"这个结果的详细描述...\"\n />\n </div>\n\n {/* 预览 */}\n {result.image && (\n <div className=\"flex items-center gap-2 p-2 bg-white dark:bg-gray-600 rounded border border-gray-200 dark:border-gray-500\">\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">预览:</span>\n {result.imageType === 'emoji' ? (\n <span className=\"text-2xl\">{result.image}</span>\n ) : (\n <img src={result.image} alt={result.title} className=\"w-8 h-8 object-cover rounded\" />\n )}\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {result.title}\n </span>\n </div>\n )}\n </div>\n );\n\n // 渲染编辑表单\n const renderEditForm = () => (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white\">\n {isCreating ? '创建新配置' : '编辑配置'}\n </h2>\n <button\n onClick={handleCancelEdit}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n >\n <X className=\"w-6 h-6\" />\n </button>\n </div>\n\n {/* 基本信息 */}\n <div className=\"space-y-4 bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n 基本信息\n </h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置名称 *\n </label>\n <input\n type=\"text\"\n value={editForm.name}\n onChange={(e) => setEditForm({ ...editForm, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 动物主题测试\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏标题 *\n </label>\n <input\n type=\"text\"\n value={editForm.gameTitle}\n onChange={(e) => setEditForm({ ...editForm, gameTitle: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 测测你是什么动物\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 配置描述\n </label>\n <textarea\n value={editForm.description}\n onChange={(e) => setEditForm({ ...editForm, description: e.target.value })}\n rows={2}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"简要描述这个配置的用途...\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 游戏描述\n </label>\n <input\n type=\"text\"\n value={editForm.gameDescription}\n onChange={(e) => setEditForm({ ...editForm, gameDescription: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n placeholder=\"例如: 长按按钮,发现你的专属属性\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 按钮文本\n </label>\n <input\n type=\"text\"\n value={editForm.buttonText}\n onChange={(e) => setEditForm({ ...editForm, buttonText: e.target.value })}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2\">\n 长按时间 (毫秒)\n </label>\n <input\n type=\"number\"\n value={editForm.longPressDuration}\n onChange={(e) =>\n setEditForm({ ...editForm, longPressDuration: parseInt(e.target.value) || 2000 })\n }\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-700 dark:text-white\"\n min=\"500\"\n step=\"100\"\n />\n </div>\n </div>\n </div>\n\n {/* 结果列表 */}\n <div className=\"bg-white dark:bg-gray-800 rounded-lg p-6 shadow-sm border border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n 结果列表 ({editForm.results.length})\n </h3>\n <div className=\"flex gap-2\">\n <button\n onClick={handleUseDefaultResults}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-purple-50 dark:bg-purple-900 text-purple-600 dark:text-purple-200 rounded-lg hover:bg-purple-100 dark:hover:bg-purple-800\"\n >\n 使用默认结果\n </button>\n <button\n onClick={handleAddResult}\n className=\"inline-flex items-center gap-2 px-3 py-1.5 text-sm bg-blue-50 dark:bg-blue-900 text-blue-600 dark:text-blue-200 rounded-lg hover:bg-blue-100 dark:hover:bg-blue-800\"\n >\n <Plus className=\"w-4 h-4\" />\n 添加结果\n </button>\n </div>\n </div>\n\n <div className=\"space-y-3 max-h-[500px] overflow-y-auto\">\n {editForm.results.length === 0 ? (\n <div className=\"text-center py-8 text-gray-500 dark:text-gray-400\">\n <p>还没有添加任何结果</p>\n <p className=\"text-sm mt-2\">点击\"添加结果\"或\"使用默认结果\"开始</p>\n </div>\n ) : (\n editForm.results.map((result, index) => renderResultEditor(result, index))\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n <div className=\"flex items-center justify-end gap-3\">\n <button\n onClick={handleCancelEdit}\n className=\"px-6 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 取消\n </button>\n <button\n onClick={handleSave}\n className=\"inline-flex items-center gap-2 px-6 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Save className=\"w-5 h-5\" />\n 保存配置\n </button>\n </div>\n </div>\n );\n\n if (loading) {\n return (\n <div className={`p-8 ${className}`}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={`p-6 ${className}`}>\n {/* 消息提示 */}\n {error && (\n <div className=\"mb-4 p-4 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg flex items-center gap-2 text-red-800 dark:text-red-200\">\n <AlertCircle className=\"w-5 h-5 flex-shrink-0\" />\n <span>{error}</span>\n <button onClick={() => setError(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {success && (\n <div className=\"mb-4 p-4 bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg flex items-center gap-2 text-green-800 dark:text-green-200\">\n <CheckCircle2 className=\"w-5 h-5 flex-shrink-0\" />\n <span>{success}</span>\n <button onClick={() => setSuccess(null)} className=\"ml-auto\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n )}\n\n {isEditing ? (\n renderEditForm()\n ) : (\n <>\n {/* 头部操作栏 */}\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-3xl font-bold text-gray-900 dark:text-white\">配置管理</h1>\n <div className=\"flex gap-2\">\n <button\n onClick={handleImport}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n <UploadIcon className=\"w-5 h-5\" />\n 导入\n </button>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建配置\n </button>\n </div>\n </div>\n\n {/* 配置列表 */}\n {configs.length === 0 ? (\n <div className=\"text-center py-12 bg-white dark:bg-gray-800 rounded-lg border-2 border-dashed border-gray-300 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400 mb-4\">还没有任何配置</p>\n <button\n onClick={handleStartCreate}\n className=\"inline-flex items-center gap-2 px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\n >\n <Plus className=\"w-5 h-5\" />\n 创建第一个配置\n </button>\n </div>\n ) : (\n renderConfigList()\n )}\n </>\n )}\n </div>\n );\n};\n\nexport default ConfigManager;\n\n\n\n\n","/**\n * 测测你是什么 - 配置列表组件\n * Test Yourself - Configuration List Component\n * \n * 用于展示和选择配置\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport {\n Eye,\n Edit,\n Trash2,\n Copy,\n Star,\n Download,\n RefreshCw,\n ExternalLink,\n} from 'lucide-react';\n\nimport type { ConfigListItem } from '../types';\nimport { ConfigService } from '../server/ConfigService';\n\nexport interface ConfigListProps {\n /** 配置服务实例 */\n configService: ConfigService;\n /** 选择配置回调 */\n onSelect?: (id: string) => void;\n /** 编辑配置回调 */\n onEdit?: (id: string) => void;\n /** 删除配置回调 */\n onDelete?: (id: string) => void;\n /** 是否显示操作按钮 */\n showActions?: boolean;\n /** 是否显示预览链接 */\n showPreviewLink?: boolean;\n /** 预览基础URL */\n previewBaseUrl?: string;\n /** 自定义样式 */\n className?: string;\n /** 每页显示数量 */\n pageSize?: number;\n}\n\n/**\n * 配置列表组件\n */\nexport const ConfigList: React.FC<ConfigListProps> = ({\n configService,\n onSelect,\n onEdit,\n onDelete,\n showActions = true,\n showPreviewLink = false,\n previewBaseUrl = '/test-yourself',\n className = '',\n pageSize = 10,\n}) => {\n const [configs, setConfigs] = useState<ConfigListItem[]>([]);\n const [loading, setLoading] = useState(true);\n const [currentPage, setCurrentPage] = useState(1);\n const [searchTerm, setSearchTerm] = useState('');\n\n // 加载配置列表\n const loadConfigs = useCallback(async () => {\n try {\n setLoading(true);\n const list = await configService.getConfigList();\n setConfigs(list);\n } catch (error) {\n console.error('加载配置列表失败:', error);\n } finally {\n setLoading(false);\n }\n }, [configService]);\n\n useEffect(() => {\n loadConfigs();\n }, [loadConfigs]);\n\n // 处理刷新\n const handleRefresh = () => {\n loadConfigs();\n };\n\n // 处理选择\n const handleSelect = (id: string) => {\n onSelect?.(id);\n };\n\n // 处理编辑\n const handleEdit = (id: string) => {\n onEdit?.(id);\n };\n\n // 处理删除\n const handleDelete = async (id: string) => {\n if (!confirm('确定要删除这个配置吗?')) return;\n \n try {\n await configService.deleteConfig(id);\n await loadConfigs();\n onDelete?.(id);\n } catch (error) {\n console.error('删除配置失败:', error);\n alert('删除失败,请重试');\n }\n };\n\n // 处理复制\n const handleDuplicate = async (id: string) => {\n try {\n await configService.duplicateConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('复制配置失败:', error);\n alert('复制失败,请重试');\n }\n };\n\n // 处理设置默认\n const handleSetDefault = async (id: string) => {\n try {\n await configService.setDefaultConfig(id);\n await loadConfigs();\n } catch (error) {\n console.error('设置默认配置失败:', error);\n alert('设置失败,请重试');\n }\n };\n\n // 处理导出\n const handleExport = async (id: string) => {\n try {\n const jsonString = await configService.exportConfig(id);\n const blob = new Blob([jsonString], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `config_${id}.json`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n } catch (error) {\n console.error('导出配置失败:', error);\n alert('导出失败,请重试');\n }\n };\n\n // 生成预览链接\n const getPreviewUrl = (id: string) => {\n return `${previewBaseUrl}?configId=${id}`;\n };\n\n // 过滤配置\n const filteredConfigs = configs.filter(config => {\n if (!searchTerm) return true;\n const term = searchTerm.toLowerCase();\n return (\n config.name.toLowerCase().includes(term) ||\n config.description?.toLowerCase().includes(term)\n );\n });\n\n // 分页\n const totalPages = Math.ceil(filteredConfigs.length / pageSize);\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const currentConfigs = filteredConfigs.slice(startIndex, endIndex);\n\n if (loading) {\n return (\n <div className={`p-8 ${className}`}>\n <div className=\"text-center\">\n <div className=\"inline-block w-8 h-8 border-4 border-blue-600 border-t-transparent rounded-full animate-spin\"></div>\n <p className=\"mt-2 text-gray-600 dark:text-gray-400\">加载中...</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* 头部 */}\n <div className=\"mb-4 flex items-center justify-between gap-4\">\n <div className=\"flex-1\">\n <input\n type=\"text\"\n placeholder=\"搜索配置...\"\n value={searchTerm}\n onChange={(e) => {\n setSearchTerm(e.target.value);\n setCurrentPage(1);\n }}\n className=\"w-full px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:bg-gray-800 dark:text-white\"\n />\n </div>\n <button\n onClick={handleRefresh}\n className=\"p-2 text-gray-600 hover:text-gray-800 dark:text-gray-400 dark:hover:text-gray-200\"\n title=\"刷新\"\n >\n <RefreshCw className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* 配置列表 */}\n {currentConfigs.length === 0 ? (\n <div className=\"text-center py-12 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700\">\n <p className=\"text-gray-600 dark:text-gray-400\">\n {searchTerm ? '没有找到匹配的配置' : '还没有任何配置'}\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {currentConfigs.map((config) => (\n <div\n key={config.id}\n className=\"bg-white dark:bg-gray-800 rounded-lg shadow-sm p-4 border border-gray-200 dark:border-gray-700 hover:shadow-md transition-shadow\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n {/* 配置信息 */}\n <div\n className=\"flex-1 cursor-pointer\"\n onClick={() => handleSelect(config.id)}\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 dark:text-white\">\n {config.name}\n </h3>\n {config.isDefault && (\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200\">\n <Star className=\"w-3 h-3\" />\n 默认\n </span>\n )}\n </div>\n {config.description && (\n <p className=\"text-sm text-gray-600 dark:text-gray-400 mb-2\">\n {config.description}\n </p>\n )}\n <div className=\"flex items-center gap-4 text-xs text-gray-500 dark:text-gray-400\">\n <span>结果数: {config.resultCount}</span>\n <span>创建: {new Date(config.createdAt).toLocaleDateString()}</span>\n {config.updatedAt !== config.createdAt && (\n <span>更新: {new Date(config.updatedAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n\n {/* 操作按钮 */}\n {showActions && (\n <div className=\"flex items-center gap-1\">\n {showPreviewLink && (\n <a\n href={getPreviewUrl(config.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 text-gray-600 hover:text-blue-600 dark:text-gray-400 dark:hover:text-blue-400\"\n title=\"预览\"\n >\n <ExternalLink className=\"w-4 h-4\" />\n </a>\n )}\n <button\n onClick={() => handleSetDefault(config.id)}\n disabled={config.isDefault}\n className=\"p-2 text-gray-600 hover:text-yellow-600 disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"设为默认\"\n >\n <Star className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleEdit(config.id)}\n className=\"p-2 text-gray-600 hover:text-blue-600\"\n title=\"编辑\"\n >\n <Edit className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDuplicate(config.id)}\n className=\"p-2 text-gray-600 hover:text-green-600\"\n title=\"复制\"\n >\n <Copy className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleExport(config.id)}\n className=\"p-2 text-gray-600 hover:text-purple-600\"\n title=\"导出\"\n >\n <Download className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDelete(config.id)}\n className=\"p-2 text-gray-600 hover:text-red-600\"\n title=\"删除\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 分页 */}\n {totalPages > 1 && (\n <div className=\"mt-4 flex items-center justify-between\">\n <p className=\"text-sm text-gray-600 dark:text-gray-400\">\n 显示 {startIndex + 1} - {Math.min(endIndex, filteredConfigs.length)} 共{' '}\n {filteredConfigs.length} 个配置\n </p>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 上一页\n </button>\n <span className=\"text-sm text-gray-600 dark:text-gray-400\">\n {currentPage} / {totalPages}\n </span>\n <button\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n className=\"px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n 下一页\n </button>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default ConfigList;\n\n\n\n"]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Meting = require('@meting/core');
|
|
4
|
+
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var Meting__default = /*#__PURE__*/_interopDefault(Meting);
|
|
8
|
+
|
|
9
|
+
// src/music/server/meting.ts
|
|
10
|
+
|
|
11
|
+
// src/music/constants.ts
|
|
12
|
+
var DEFAULT_MUSIC_SOURCE = "kugou";
|
|
13
|
+
var MUSIC_SOURCES = [
|
|
14
|
+
// 'netease',
|
|
15
|
+
// 'tencent',
|
|
16
|
+
"kugou"
|
|
17
|
+
// 'xiami',
|
|
18
|
+
];
|
|
19
|
+
var MUSIC_SOURCE_NAMES = {
|
|
20
|
+
// netease: '网易云',
|
|
21
|
+
// tencent: '腾讯音乐',
|
|
22
|
+
kugou: "\u9177\u72D7\u97F3\u4E50"
|
|
23
|
+
// xiami: '虾米音乐',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// src/music/server/meting.ts
|
|
27
|
+
var MetingService = class {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.instances = /* @__PURE__ */ new Map();
|
|
30
|
+
}
|
|
31
|
+
getInstance(source) {
|
|
32
|
+
if (!this.instances.has(source)) {
|
|
33
|
+
this.instances.set(source, new Meting__default.default(source));
|
|
34
|
+
}
|
|
35
|
+
return this.instances.get(source);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 搜索歌曲
|
|
39
|
+
*/
|
|
40
|
+
async search(options) {
|
|
41
|
+
const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;
|
|
42
|
+
const meting = this.getInstance(source);
|
|
43
|
+
const response = await meting.search(keyword, {
|
|
44
|
+
limit,
|
|
45
|
+
page: offset + 1
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
return typeof response === "string" ? JSON.parse(response) : response;
|
|
49
|
+
} catch (e) {
|
|
50
|
+
return response;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 获取歌曲详情(包含播放链接)
|
|
55
|
+
*/
|
|
56
|
+
async getSongUrl(id, source = DEFAULT_MUSIC_SOURCE) {
|
|
57
|
+
const meting = this.getInstance(source);
|
|
58
|
+
const response = await meting.song(id);
|
|
59
|
+
try {
|
|
60
|
+
return typeof response === "string" ? JSON.parse(response) : response;
|
|
61
|
+
} catch (e) {
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 获取歌词
|
|
67
|
+
*/
|
|
68
|
+
async getLyric(id, source = DEFAULT_MUSIC_SOURCE) {
|
|
69
|
+
const meting = this.getInstance(source);
|
|
70
|
+
const response = await meting.lyric(id);
|
|
71
|
+
try {
|
|
72
|
+
return typeof response === "string" ? JSON.parse(response) : response;
|
|
73
|
+
} catch (e) {
|
|
74
|
+
return response;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var musicService = new MetingService();
|
|
79
|
+
|
|
80
|
+
// src/music/server/handlers.ts
|
|
81
|
+
var createSearchHandler = () => {
|
|
82
|
+
return async (req) => {
|
|
83
|
+
try {
|
|
84
|
+
const { searchParams } = new URL(req.url);
|
|
85
|
+
const keyword = searchParams.get("keyword");
|
|
86
|
+
const source = searchParams.get("source") || DEFAULT_MUSIC_SOURCE;
|
|
87
|
+
const limit = parseInt(searchParams.get("limit") || "20");
|
|
88
|
+
const offset = parseInt(searchParams.get("offset") || "0");
|
|
89
|
+
if (!keyword) {
|
|
90
|
+
return Response.json({ code: 400, message: "Keyword is required" }, { status: 400 });
|
|
91
|
+
}
|
|
92
|
+
const result = await musicService.search({
|
|
93
|
+
keyword,
|
|
94
|
+
source,
|
|
95
|
+
limit,
|
|
96
|
+
offset
|
|
97
|
+
});
|
|
98
|
+
return Response.json({
|
|
99
|
+
code: 200,
|
|
100
|
+
data: result
|
|
101
|
+
});
|
|
102
|
+
} catch (error) {
|
|
103
|
+
console.error("[Music] Search error:", error);
|
|
104
|
+
return Response.json({
|
|
105
|
+
code: 500,
|
|
106
|
+
message: error.message || "Internal Server Error"
|
|
107
|
+
}, { status: 500 });
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
var createSongUrlHandler = () => {
|
|
112
|
+
return async (req) => {
|
|
113
|
+
try {
|
|
114
|
+
const { searchParams } = new URL(req.url);
|
|
115
|
+
const id = searchParams.get("id");
|
|
116
|
+
const source = searchParams.get("source") || DEFAULT_MUSIC_SOURCE;
|
|
117
|
+
if (!id) {
|
|
118
|
+
return Response.json({ code: 400, message: "ID is required" }, { status: 400 });
|
|
119
|
+
}
|
|
120
|
+
const url = await musicService.getSongUrl(id, source);
|
|
121
|
+
return Response.json({
|
|
122
|
+
code: 200,
|
|
123
|
+
data: { url }
|
|
124
|
+
});
|
|
125
|
+
} catch (error) {
|
|
126
|
+
console.error("[Music] Get URL error:", error);
|
|
127
|
+
return Response.json({
|
|
128
|
+
code: 500,
|
|
129
|
+
message: error.message || "Internal Server Error"
|
|
130
|
+
}, { status: 500 });
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
var createLyricHandler = () => {
|
|
135
|
+
return async (req) => {
|
|
136
|
+
try {
|
|
137
|
+
const { searchParams } = new URL(req.url);
|
|
138
|
+
const id = searchParams.get("id");
|
|
139
|
+
const source = searchParams.get("source") || DEFAULT_MUSIC_SOURCE;
|
|
140
|
+
if (!id) {
|
|
141
|
+
return Response.json({ code: 400, message: "ID is required" }, { status: 400 });
|
|
142
|
+
}
|
|
143
|
+
const lyric = await musicService.getLyric(id, source);
|
|
144
|
+
return Response.json({
|
|
145
|
+
code: 200,
|
|
146
|
+
data: { lyric }
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
console.error("[Music] Get lyric error:", error);
|
|
150
|
+
return Response.json({
|
|
151
|
+
code: 500,
|
|
152
|
+
message: error.message || "Internal Server Error"
|
|
153
|
+
}, { status: 500 });
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
exports.DEFAULT_MUSIC_SOURCE = DEFAULT_MUSIC_SOURCE;
|
|
159
|
+
exports.MUSIC_SOURCES = MUSIC_SOURCES;
|
|
160
|
+
exports.MUSIC_SOURCE_NAMES = MUSIC_SOURCE_NAMES;
|
|
161
|
+
exports.MetingService = MetingService;
|
|
162
|
+
exports.createLyricHandler = createLyricHandler;
|
|
163
|
+
exports.createSearchHandler = createSearchHandler;
|
|
164
|
+
exports.createSongUrlHandler = createSongUrlHandler;
|
|
165
|
+
exports.musicService = musicService;
|
|
166
|
+
//# sourceMappingURL=chunk-EBP7AE6F.js.map
|
|
167
|
+
//# sourceMappingURL=chunk-EBP7AE6F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/music/constants.ts","../src/music/server/meting.ts","../src/music/server/handlers.ts"],"names":["Meting"],"mappings":"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","file":"chunk-EBP7AE6F.js","sourcesContent":["/**\n * 音乐模块常量定义\n */\n\nexport const DEFAULT_MUSIC_SOURCE = 'kugou';\n\nexport const MUSIC_SOURCES = [\n // 'netease', \n // 'tencent',\n 'kugou',\n // 'xiami',\n] as const;\n\nexport type MusicSource = (typeof MUSIC_SOURCES)[number];\n\nexport const MUSIC_SOURCE_NAMES: Record<MusicSource, string> = {\n // netease: '网易云',\n // tencent: '腾讯音乐',\n kugou: '酷狗音乐',\n // xiami: '虾米音乐',\n};\n\n","import Meting from '@meting/core';\nimport { SearchOptions } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * Meting 服务集成\n */\nexport class MetingService {\n private instances: Map<string, any> = new Map();\n\n private getInstance(source: string) {\n if (!this.instances.has(source)) {\n this.instances.set(source, new Meting(source));\n }\n return this.instances.get(source);\n }\n\n /**\n * 搜索歌曲\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n const meting = this.getInstance(source);\n \n // Meting 通常使用 page (1-based) 和 limit 参数\n // 如果 offset 是前端传来的 0-based 页码\n const response = await meting.search(keyword, {\n limit,\n page: offset + 1,\n });\n\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌曲详情(包含播放链接)\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.song(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌词\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.lyric(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n}\n\nexport const musicService = new MetingService();\n","import { musicService } from './meting';\nimport { MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 创建搜索接口处理器\n */\nexport const createSearchHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const keyword = searchParams.get('keyword');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n const limit = parseInt(searchParams.get('limit') || '20');\n const offset = parseInt(searchParams.get('offset') || '0');\n\n if (!keyword) {\n return Response.json({ code: 400, message: 'Keyword is required' }, { status: 400 });\n }\n\n const result = await musicService.search({\n keyword,\n source: source as any,\n limit,\n offset,\n });\n\n return Response.json({\n code: 200,\n data: result,\n });\n } catch (error: any) {\n console.error('[Music] Search error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌曲链接接口处理器\n */\nexport const createSongUrlHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const url = await musicService.getSongUrl(id, source);\n\n return Response.json({\n code: 200,\n data: { url },\n });\n } catch (error: any) {\n console.error('[Music] Get URL error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌词接口处理器\n */\nexport const createLyricHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const lyric = await musicService.getLyric(id, source);\n\n return Response.json({\n code: 200,\n data: { lyric },\n });\n } catch (error: any) {\n console.error('[Music] Get lyric error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n"]}
|