From e0cf6092a9d127a6ff34da04f43dddca9aaed531 Mon Sep 17 00:00:00 2001 From: sion123 <450702724@qq.com> Date: Sun, 18 Jan 2026 00:34:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/commands/code-simplifier.md | 52 + .claude/settings.local.json | 6 +- .gitignore | 1 + .../app/web-gold/FRONTEND_LOGIC_REVIEW.md | 105 -- frontend/app/web-gold/src/api/material.js | 16 +- .../app/web-gold/src/layouts/MainLayout.vue | 2 +- frontend/app/web-gold/src/style.less | 140 -- .../components/BenchmarkForm.vue | 1 - .../web-gold/src/views/kling/IdentifyFace.vue | 397 +++-- .../src/views/material/MaterialListNew.vue | 563 ++++-- .../app/web-gold/src/views/material/Mix.vue | 1574 ++++++++++------- ...20241228_refactor_material_list_layout.sql | 74 - .../controller/AppTikUserFileController.java | 8 + .../file/dal/dataobject/TikUserFileDO.java | 4 + .../tik/file/service/TikUserFileService.java | 8 + .../file/service/TikUserFileServiceImpl.java | 33 +- .../tik/file/vo/app/AppTikUserFileRespVO.java | 3 + .../file/vo/app/UpdateDisplayNameReqVO.java | 26 + 18 files changed, 1826 insertions(+), 1187 deletions(-) create mode 100644 .claude/commands/code-simplifier.md delete mode 100644 frontend/app/web-gold/FRONTEND_LOGIC_REVIEW.md delete mode 100644 sql/mysql/20241228_refactor_material_list_layout.sql create mode 100644 yudao-module-tik/src/main/java/cn/iocoder/yudao/module/tik/file/vo/app/UpdateDisplayNameReqVO.java diff --git a/.claude/commands/code-simplifier.md b/.claude/commands/code-simplifier.md new file mode 100644 index 0000000000..05e361b4ef --- /dev/null +++ b/.claude/commands/code-simplifier.md @@ -0,0 +1,52 @@ +--- +name: code-simplifier +description: Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Focuses on recently modified code unless instructed otherwise. +model: opus +--- + +You are an expert code simplification specialist focused on enhancing code clarity, consistency, and maintainability while preserving exact functionality. Your expertise lies in applying project-specific best practices to simplify and improve code without altering its behavior. You prioritize readable, explicit code over overly compact solutions. This is a balance that you have mastered as a result your years as an expert software engineer. + +You will analyze recently modified code and apply refinements that: + +1. **Preserve Functionality**: Never change what the code does - only how it does it. All original features, outputs, and behaviors must remain intact. + +2. **Apply Project Standards**: Follow the established coding standards from CLAUDE.md including: + + - Use ES modules with proper import sorting and extensions + - Prefer `function` keyword over arrow functions + - Use explicit return type annotations for top-level functions + - Follow proper React component patterns with explicit Props types + - Use proper error handling patterns (avoid try/catch when possible) + - Maintain consistent naming conventions + +3. **Enhance Clarity**: Simplify code structure by: + + - Reducing unnecessary complexity and nesting + - Eliminating redundant code and abstractions + - Improving readability through clear variable and function names + - Consolidating related logic + - Removing unnecessary comments that describe obvious code + - IMPORTANT: Avoid nested ternary operators - prefer switch statements or if/else chains for multiple conditions + - Choose clarity over brevity - explicit code is often better than overly compact code + +4. **Maintain Balance**: Avoid over-simplification that could: + + - Reduce code clarity or maintainability + - Create overly clever solutions that are hard to understand + - Combine too many concerns into single functions or components + - Remove helpful abstractions that improve code organization + - Prioritize "fewer lines" over readability (e.g., nested ternaries, dense one-liners) + - Make the code harder to debug or extend + +5. **Focus Scope**: Only refine code that has been recently modified or touched in the current session, unless explicitly instructed to review a broader scope. + +Your refinement process: + +1. Identify the recently modified code sections +2. Analyze for opportunities to improve elegance and consistency +3. Apply project-specific best practices and coding standards +4. Ensure all functionality remains unchanged +5. Verify the refined code is simpler and more maintainable +6. Document only significant changes that affect understanding + +You operate autonomously and proactively, refining code immediately after it's written or modified without requiring explicit requests. Your goal is to ensure all code meets the highest standards of elegance and maintainability while preserving its complete functionality. diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 71975880b0..2f700919ad 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -58,7 +58,11 @@ "mcp__server-mysql__connect_db", "Skill(ui-ux-pro-max)", "Skill(ui-ux-pro-max:*)", - "Bash(python:*)" + "Bash(python:*)", + "mcp__server-mysql__describe_table", + "mcp__server-mysql__execute", + "mcp__server-mysql__query", + "Bash(/d/projects/sionrui/.claude/skills/ui-ux-pro-max/python scripts/search.py:*)" ], "deny": [], "ask": [] diff --git a/.gitignore b/.gitignore index 1e148d3087..8ba8494283 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ target/ !.mvn/wrapper/maven-wrapper.jar +settings.local.json .flattened-pom.xml diff --git a/frontend/app/web-gold/FRONTEND_LOGIC_REVIEW.md b/frontend/app/web-gold/FRONTEND_LOGIC_REVIEW.md deleted file mode 100644 index b02549fa59..0000000000 --- a/frontend/app/web-gold/FRONTEND_LOGIC_REVIEW.md +++ /dev/null @@ -1,105 +0,0 @@ -# 前端上传逻辑检查报告 - -## 📋 代码检查结果 - -### ✅ 正常逻辑 - -1. **MaterialUploadModal.vue** - - 文件上传组件逻辑清晰 - - 文件列表管理合理 - - 文件大小和类型校验完善 - -2. **MaterialList.vue** - - 上传流程完整 - - 错误处理合理 - - 批量上传逻辑正确 - -### ⚠️ 发现的问题 - -#### 1. 冗余代码 - -**MaterialUploadModal.vue**: -- `handleDrop` 方法(第188-191行)只是打印日志,没有实际作用 - ```javascript - const handleDrop = (e) => { - // a-upload-dragger 会自动处理拖拽的文件,通过 change 事件触发 - console.log('Drop event:', e) - } - ``` - **建议**:删除此方法,因为 `a-upload-dragger` 会自动处理拖拽 - -#### 2. 逻辑问题 - -**MaterialList.vue**: -- `uploadFileCategory` 固定为 'video'(第147行) - ```javascript - const uploadFileCategory = ref('video') // 固定为 video,不需要用户选择 - ``` - **问题**:用户无法选择文件分类,所有文件都上传到 video 分类 - **建议**:添加文件分类选择功能,或者根据文件类型自动判断分类 - -#### 3. 代码优化建议 - -**MaterialUploadModal.vue**: -- `handleFileChange` 方法(第160-174行)逻辑可以简化 -- 文件对象提取逻辑(第201-217行)虽然复杂,但是必要的(因为 Ant Design Vue 的文件对象结构复杂) - -## 🎯 优化建议 - -### 1. 删除冗余的 handleDrop 方法 - -```javascript -// 删除这个方法,因为 a-upload-dragger 会自动处理拖拽 -// const handleDrop = (e) => { -// console.log('Drop event:', e) -// } -``` - -### 2. 添加文件分类选择功能 - -在 `MaterialUploadModal.vue` 中添加分类选择: - -```vue - -
-
文件分类:
- - 视频集 - 生成集 - 配音集 - 混剪集 - 声音集 - -
-``` - -然后在 `MaterialList.vue` 中接收分类参数: - -```javascript -const handleConfirmUpload = async (files, fileCategory) => { - // 使用传入的分类,而不是固定的 'video' - await MaterialService.uploadFile(file, fileCategory) -} -``` - -## 📊 总结 - -| 项目 | 状态 | 说明 | -|------|------|------| -| 上传逻辑 | ✅ 正常 | 文件上传流程完整 | -| 错误处理 | ✅ 正常 | 错误提示和异常处理完善 | -| 文件校验 | ✅ 正常 | 文件大小和类型校验合理 | -| 冗余代码 | ⚠️ 1处 | `handleDrop` 方法无实际作用 | -| 功能缺失 | ⚠️ 1处 | 缺少文件分类选择功能 | - -## 🔧 建议修复 - -1. **删除冗余代码**:移除 `handleDrop` 方法 -2. **添加分类选择**:在 `MaterialUploadModal` 中添加文件分类选择功能 -3. **优化用户体验**:根据文件类型自动推荐分类(可选) - diff --git a/frontend/app/web-gold/src/api/material.js b/frontend/app/web-gold/src/api/material.js index 87fdf9b306..05fde88824 100644 --- a/frontend/app/web-gold/src/api/material.js +++ b/frontend/app/web-gold/src/api/material.js @@ -162,7 +162,21 @@ export const MaterialService = { return http.get(`${BASE_URL}/preview-url`, { params: { id: fileId, type } }) - } + }, + + /** + * 更新文件显示名称 + * @param {number} fileId - 文件编号 + * @param {string} displayName - 新的显示名称 + * @returns {Promise} + */ + updateDisplayName(fileId, displayName) { + return http.post(`${BASE_URL}/update-display-name`, { + fileId, + displayName + }) + }, + } /** diff --git a/frontend/app/web-gold/src/layouts/MainLayout.vue b/frontend/app/web-gold/src/layouts/MainLayout.vue index 660dbd4587..a959ee6a40 100644 --- a/frontend/app/web-gold/src/layouts/MainLayout.vue +++ b/frontend/app/web-gold/src/layouts/MainLayout.vue @@ -42,6 +42,6 @@ import SidebarNav from '@/components/SidebarNav.vue' .content-scroll { flex: 1 1 auto; overflow: auto; /* 右侧内容区域滚动 */ - padding: 16px 0px 16px 16px; + padding: 16px; } diff --git a/frontend/app/web-gold/src/style.less b/frontend/app/web-gold/src/style.less index 679d5a60af..7c8828713d 100644 --- a/frontend/app/web-gold/src/style.less +++ b/frontend/app/web-gold/src/style.less @@ -150,146 +150,6 @@ body { scrollbar-gutter: stable both-edges; } -/* ================================ - 3. 组件样式 (Component Styles) - ================================ */ -/* Button 组件 */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: var(--radius-button); - font-weight: 500; - transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1); - cursor: pointer; - border: none; - outline: none; - padding: var(--space-2) var(--space-6); - &:disabled { - opacity: 0.5; - cursor: not-allowed; - } - &--primary { - background: var(--color-slate-900); - color: white; - box-shadow: var(--shadow-lg); - - &:hover:not(:disabled) { - background: var(--color-slate-800); - } - } - - &--secondary { - background: white; - color: var(--color-slate-700); - border: 1px solid var(--color-border); - padding: var(--space-1) var(--space-4); - - &:hover:not(:disabled) { - background: var(--color-slate-50); - } - } - - &--gradient { - background: linear-gradient(to right, var(--color-indigo-600), var(--color-indigo-800)); - color: white; - box-shadow: var(--shadow-blue); - - &:hover:not(:disabled) { - background: linear-gradient(to right, var(--color-indigo-700), var(--color-indigo-900)); - } - } -} - -/* Input 组件 */ -.input { - width: 100%; - padding: var(--space-2) var(--space-4); - border: 1px solid var(--color-border); - border-radius: var(--radius-button); - font-size: 14px; - transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1); - background: white; - color: var(--color-text); - - &:focus { - outline: none; - border-color: var(--color-border-focus); - box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); - } - - &::placeholder { - color: var(--color-slate-400); - } -} - -/* Card 组件 */ -.card { - background: white; - border: 1px solid var(--color-slate-200); - border-radius: var(--radius-card); - padding: var(--space-6); - box-shadow: var(--shadow-sm); - transition: all 150ms cubic-bezier(0.4, 0, 0.2, 1); - - &:hover { - box-shadow: var(--shadow-md); - } -} - -/* Table 组件 */ -.table { - width: 100%; - border-collapse: collapse; - - th { - background: var(--color-slate-50); - padding: var(--space-3) var(--space-4); - text-align: left; - font-size: 12px; - font-weight: 600; - color: var(--color-slate-500); - text-transform: uppercase; - letter-spacing: 0.05em; - border-bottom: 1px solid var(--color-slate-200); - } - - td { - padding: var(--space-4); - border-bottom: 1px solid var(--color-slate-100); - } - - tr:hover { - background: var(--color-slate-50); - } -} - -/* Tag 组件 */ -.tag { - display: inline-block; - padding: var(--space-0-5) var(--space-2); - font-size: 12px; - font-weight: 500; - border-radius: var(--radius-tag); - background: var(--color-gray-100); - color: var(--color-slate-700); - - &--red { - background: #fee2e2; - color: var(--color-red-800); - } - - &--yellow { - background: #fef3c7; - color: var(--color-yellow-600); - } - - &--vip { - color: var(--color-yellow-500); - border: 1px solid var(--color-yellow-500); - background: transparent; - } -} diff --git a/frontend/app/web-gold/src/views/content-style/components/BenchmarkForm.vue b/frontend/app/web-gold/src/views/content-style/components/BenchmarkForm.vue index d8a4aa82ff..796f26f77d 100644 --- a/frontend/app/web-gold/src/views/content-style/components/BenchmarkForm.vue +++ b/frontend/app/web-gold/src/views/content-style/components/BenchmarkForm.vue @@ -120,7 +120,6 @@ function handleReset() { padding: 8px 12px; font-size: 14px; color: var(--color-text); - background: var(--color-bg); border: 1px solid var(--color-border); border-radius: 6px; transition: all 0.2s; diff --git a/frontend/app/web-gold/src/views/kling/IdentifyFace.vue b/frontend/app/web-gold/src/views/kling/IdentifyFace.vue index 7708e00885..840d8807b2 100644 --- a/frontend/app/web-gold/src/views/kling/IdentifyFace.vue +++ b/frontend/app/web-gold/src/views/kling/IdentifyFace.vue @@ -365,106 +365,151 @@ onMounted(async () => { diff --git a/frontend/app/web-gold/src/views/material/MaterialListNew.vue b/frontend/app/web-gold/src/views/material/MaterialListNew.vue index 984adfc6c6..00ced26338 100644 --- a/frontend/app/web-gold/src/views/material/MaterialListNew.vue +++ b/frontend/app/web-gold/src/views/material/MaterialListNew.vue @@ -59,12 +59,33 @@
- -
-

- {{ getContentTitle() }} -

+ +