From 8705b9846abb4ea95f67ccfa6ca5e7346f7cf646 Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Tue, 25 Nov 2025 09:37:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E7=B3=BB=E7=BB=9F=E4=B8=8E=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建统一的Modal组件,采用Apple风格设计 - 实现毛玻璃效果、圆角、动画和细边框描边 - 修复弹窗打开时背景滚动问题 - 修复分类管理中重复卡片和数组字符串显示问题 - 优化选项解析逻辑,添加去重和过滤机制 --- .gitignore | 5 + Dockerfile | 2 + .../_components/AppearanceSettingsPanel.tsx | 72 +- app/admin/_components/CategoriesTab.tsx | 1398 +++++++---------- app/admin/_components/DepartmentsTab.tsx | 50 +- app/admin/_components/InvitationsTab.tsx | 6 +- app/admin/_components/MonitorTab.tsx | 62 +- app/admin/_components/TemplateManager.tsx | 547 +++++-- app/admin/_components/UsersTab.tsx | 21 +- .../template-manager/BuiltInTemplateGrid.tsx | 82 +- .../CustomTemplateSection.tsx | 40 +- .../TemplateManagerHeader.tsx | 40 +- .../editor/TemplateBasicsForm.tsx | 20 + .../editor/TemplateEditorFooter.tsx | 27 +- .../editor/TemplateFieldsEditor.tsx | 104 +- .../_components/template-manager/types.ts | 5 + app/admin/_components/users/UserEditModal.tsx | 67 +- app/admin/page.tsx | 7 + app/api/admin/upload-templates/[id]/route.ts | 9 + app/api/admin/upload-templates/route.ts | 30 +- app/api/category-fields/route.ts | 88 ++ app/api/material-types/route.ts | 74 + app/api/materials/route.ts | 80 +- app/api/system-settings/route.ts | 82 +- .../template-categories/[fieldKey]/route.ts | 346 ++++ app/api/template-categories/route.ts | 255 ++- app/api/templates/route.ts | 91 ++ app/api/upload-templates/route.ts | 52 +- app/globals.css | 66 + app/page.tsx | 279 +++- app/ui-preview/page.tsx | 323 ++++ components/Header.tsx | 30 +- components/MaterialPreviewModal.tsx | 1 - components/UploadModal.tsx | 1276 ++++++--------- components/ui/AlertDialog.tsx | 22 +- components/ui/ConfirmDialog.tsx | 24 +- components/ui/Modal.tsx | 63 +- components/ui/PromptDialog.tsx | 24 +- components/ui/Tag.tsx | 65 +- deploy-new-fixed.ps1 | 411 +++-- docker-images/.gitkeep | 3 + docker-images/README.md | 67 + docker-images/minio-mc/VERSION.txt | 5 + docs/FIELD_CATEGORY_UPDATES.md | 140 ++ docs/MINIO_INIT_VERSION.md | 91 ++ docs/TEMPLATE_IMPROVEMENTS.md | 142 ++ docs/TEST_CHECKLIST.md | 223 +++ docs/scripts/DEPLOY_SCRIPT_OPTIMIZATION.md | 110 ++ docs/素材类型模板配置记录.md | 160 ++ lib/category-fields.ts | 127 ++ lib/system-settings-columns.ts | 20 + lib/ui-animations.ts | 202 +++ lib/ui-styles-base.ts | 77 +- lib/ui-styles-composer.ts | 29 +- lib/ui-styles-dark.ts | 1 + lib/ui-styles-light.ts | 1 + lib/ui-styles.ts | 64 +- lib/ui-theme-colors-dark.ts | 28 +- lib/ui-theme-colors-light.ts | 34 +- lib/upload-template-presets.ts | 220 +++ minio-mc-latest.tar | Bin 0 -> 29849088 bytes prisma/schema.prisma | 100 +- scripts/apply-migration.sh | 19 + scripts/download-minio-mc.ps1 | 98 ++ scripts/load-base-images.ps1 | 57 + scripts/manage-docker-images.ps1 | 270 ++++ scripts/run-migration-on-server.sh | 46 + 优化计划与优先级.md | 46 +- 优化记录.md | 24 +- 后续修改.txt | 10 +- 更新日志.md | 79 +- 素材模板迁移指南.md | 82 + 72 files changed, 6438 insertions(+), 2383 deletions(-) create mode 100644 app/api/category-fields/route.ts create mode 100644 app/api/material-types/route.ts create mode 100644 app/api/template-categories/[fieldKey]/route.ts create mode 100644 app/api/templates/route.ts create mode 100644 app/ui-preview/page.tsx create mode 100644 docker-images/.gitkeep create mode 100644 docker-images/README.md create mode 100644 docker-images/minio-mc/VERSION.txt create mode 100644 docs/FIELD_CATEGORY_UPDATES.md create mode 100644 docs/MINIO_INIT_VERSION.md create mode 100644 docs/TEMPLATE_IMPROVEMENTS.md create mode 100644 docs/TEST_CHECKLIST.md create mode 100644 docs/scripts/DEPLOY_SCRIPT_OPTIMIZATION.md create mode 100644 docs/素材类型模板配置记录.md create mode 100644 lib/category-fields.ts create mode 100644 lib/system-settings-columns.ts create mode 100644 lib/upload-template-presets.ts create mode 100644 minio-mc-latest.tar create mode 100644 scripts/apply-migration.sh create mode 100644 scripts/download-minio-mc.ps1 create mode 100644 scripts/load-base-images.ps1 create mode 100644 scripts/manage-docker-images.ps1 create mode 100644 scripts/run-migration-on-server.sh create mode 100644 素材模板迁移指南.md diff --git a/.gitignore b/.gitignore index 2e615ab..ae2b90c 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,11 @@ next-env.d.ts *.zip *.rpm +# Docker images (large files, use Git LFS if needed) +/docker-images/**/*.tar +/docker-images/**/*.tar.gz +!docker-images/.gitkeep + # Temporary files deploy-commands.txt 构建速查表.txt diff --git a/Dockerfile b/Dockerfile index 644c882..c563afc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -243,6 +243,8 @@ COPY --from=builder --chown=nextjs:nodejs /app/lib ./lib COPY --from=builder --chown=nextjs:nodejs /app/node_modules/.prisma ./node_modules/.prisma # 复制 Prisma 包,确保运行时存在 @prisma/client 及其生成器 COPY --from=builder --chown=nextjs:nodejs /app/node_modules/@prisma ./node_modules/@prisma +# 复制 Prisma CLI(用于运行时执行 migrate deploy) +COPY --from=builder --chown=nextjs:nodejs /app/node_modules/prisma ./node_modules/prisma # 复制 Canvas 模块(可选依赖) # 如果 canvas 未安装,builder 阶段已创建占位符,所以这个 COPY 不会失败 diff --git a/app/admin/_components/AppearanceSettingsPanel.tsx b/app/admin/_components/AppearanceSettingsPanel.tsx index 4caaa69..d8009bc 100644 --- a/app/admin/_components/AppearanceSettingsPanel.tsx +++ b/app/admin/_components/AppearanceSettingsPanel.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useMemo, useRef, useState, type RefObject } from 'react' import Image from 'next/image' import { useThemeStyles, useTheme, cn } from '@/lib/ui-styles' -import { animations, gradientBackgrounds, glowEffects, textAnimations } from '@/lib/ui-animations' +import { animations, gradientBackgrounds, glowEffects, textAnimations, scrollToElementWithSpring } from '@/lib/ui-animations' import type { SessionUser } from './types' type AppearanceSettingsPanelProps = { @@ -67,6 +67,8 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd const logoRef = useRef(null) const toggleRef = useRef(null) const storageRef = useRef(null) + const navCardRef = useRef(null) + const [navCardHeight, setNavCardHeight] = useState(0) const sectionRefs: Record<(typeof sectionConfig)[number]['key'], RefObject> = useMemo( () => ({ @@ -114,6 +116,33 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd return () => observer.disconnect() }, []) + // 动态计算导航卡片高度,用于设置状态卡片位置 + useEffect(() => { + const updateNavCardHeight = () => { + if (navCardRef.current) { + // 使用 getBoundingClientRect 获取更准确的高度 + const rect = navCardRef.current.getBoundingClientRect() + const height = rect.height + setNavCardHeight(height) + document.documentElement.style.setProperty('--nav-card-height', `${height}px`) + } + } + // 初始计算 + updateNavCardHeight() + // 延迟再次计算,确保 DOM 完全渲染 + const timeoutId = setTimeout(updateNavCardHeight, 100) + const resizeObserver = new ResizeObserver(updateNavCardHeight) + if (navCardRef.current) { + resizeObserver.observe(navCardRef.current) + } + window.addEventListener('resize', updateNavCardHeight) + return () => { + clearTimeout(timeoutId) + resizeObserver.disconnect() + window.removeEventListener('resize', updateNavCardHeight) + } + }, []) + const fetchSettings = useCallback(async () => { setLoading(true) try { @@ -247,7 +276,14 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd const scrollToSection = (key: SectionKey) => { const ref = sectionRefs[key] - ref?.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }) + if (!ref?.current) return + + // 使用苹果风格的缓入缓出滚动(页面级滚动,和分类管理保持一致) + scrollToElementWithSpring(ref.current, null, { + offset: 96, // 考虑 sticky top-24 (6rem) 的高度,和左侧小卡片上面对齐 + duration: 600, + easing: 'ease-in-out', + }) setActiveNav(key) } @@ -365,10 +401,10 @@ export default function AppearanceSettingsPanel({ sessionUser, variant = 'embedd