1. 排行榜悬浮窗关闭后小按钮消失问题 - 修复面板居中模式关闭时按钮位置错误 - 保存并恢复按钮的居中状态 2. 首页tag按钮按素材数量排序 - 添加按素材数量降序排序逻辑 3. 上传弹窗输入框浅色模式文字不可见 - 添加 text-slate-900 确保浅色模式下文字可见 - 添加 placeholder 样式确保占位符正确显示
7.1 KiB
7.1 KiB
FLNXI素材库项目说明
本说明整理了当前项目的关键架构、模块划分、术语约定及日常操作规范,便于在需求沟通或交接时快速对齐背景。可直接复制内容给其他 AI 翻译或润色。
一、整体概览
- 框架:Next.js 14(App Router)+ Prisma + PostgreSQL + S3/MinIO 对象存储
- 核心能力:素材上传、模板管理、分类管理、筛选、权限控制、下载/流媒体播放
- 部署:推荐脚本
scripts/deploy/deploy-new-fixed.ps1(本地构建 → 镜像推送 Registry → 远程 docker compose 滚动更新) - 存储策略:所有素材文件只走 S3/MinIO(
lib/s3.ts),本地磁盘仅保留兼容读取
二、架构拆解
- 前端层(Next.js App Router)
- UI 组件集中在
app/admin/_components、components目录,采用 Client + Server 组件混合模式 - 状态管理以 React hooks 为主,配合
useThemeStyles、DialogProvider等自定义 hooks
- UI 组件集中在
- 服务层(API Routes)
- 位于
app/api/*,每个目录一个 Route Handler,依赖@/lib/prisma、@/lib/s3、@/lib/field-pool - 所有需要权限的接口都通过
getServerSession(authOptions)校验
- 位于
- 数据层(Prisma + PostgreSQL)
- Prisma schema 管理所有表结构;通过
prisma/migrations/*记录历史 - 字段池相关表:
FieldDefinition、FieldOption
- Prisma schema 管理所有表结构;通过
- 存储层(S3/MinIO)
lib/s3.ts封装上传、删除、预签名下载- Docker Compose 中默认启动 MinIO + 初始化服务,确保环境一致
- 部署 & 运维
- PowerShell 脚本封装构建、推送、远程部署、健康检查
- Registry + 服务器 Compose 目录
/root/deploy统一管理容器
二、角色与权限
- 用户划分为普通用户、管理员、超级管理员
- 管理端入口
/admin,包含:仪表盘、素材库、模板管理、分类管理、系统设置等模块 - 所有管理 API 通过
next-authsession 鉴权,管理员及以上才可操作分类管理
三、字段池与分类管理
核心概念
- 字段池:
FieldDefinition与FieldOption两张表,集中维护各模板字段及其选项 - 字段同步:模板字段勾选“添加到分类”后写入字段池;字段定义保持不删,只清理字段对应的数据记录
- 启用/禁用:
isFilterEnabled控制字段是否出现在分类列表及首页筛选
关键逻辑
syncFieldPoolFromTemplates()(lib/field-pool.ts)在GET /api/template-categories前执行,确保字段池与模板同步- 选项清洗:
stripRedundantBrackets、normalizeFieldOptionValue、expandOptionValue消除[[[xxx]]]、[a,b]类脏数据;formatFieldOptionValues去重 - 前端
CategoriesTab.tsx用sanitizeOptionLabel再次兜底,保证展示干净
四、分类管理前端交互(app/admin/_components/CategoriesTab.tsx)
左侧“分类列表”卡片
- 编辑模式启用
@dnd-kit/core+SortableContext,允许拖拽调整顺序;顺序写入filterOrder,同步首页筛选 - 卡片包含:拖拽手柄(方形 8x8)、标题、字段信息、重命名按钮(方形图标按钮,调用全局 Prompt)、禁用按钮
- 重命名只修改显示名(
filterDisplayName),字段key不变
右侧“选项卡片”区域
- 展示字段选项,并支持新增/重命名/删除
- 选项重命名同样使用全局 Prompt 弹窗
- “添加新选项”卡片输入后写回字段池数据
顶部操作
- “编辑/保存/取消/刷新”按钮:
- 保存 →
PUT /api/category-fields批量写入filterOrder、filterDisplayName - 取消 → 退出编辑并重新拉取数据
- 刷新 → 在非编辑状态下重新获取分类与字段
- 保存 →
五、API 速览
| 路径 | 方法 | 说明 |
|---|---|---|
/api/template-categories |
GET | 拉取已启用分类字段,返回 fieldKey / 显示名 / 默认名 / 顺序 / 选项 |
/api/category-fields |
PUT | 批量更新分类字段顺序与显示名(管理员权限) |
/api/materials/upload |
POST | 上传素材;文件直接写入 S3,记录 URL |
/api/materials/download |
GET | 下载素材;S3 文件走 createPresignedDownloadUrl 302 跳转 |
/api/materials/stream |
GET | 视频流式播放,同样用预签名 URL |
/api/admin/cleanup-database |
POST | 清理数据库记录(不再删除本地文件) |
六、上传/下载链路要点
- 上传接口接收表单(素材文件/缩略图/字段 JSON),生成唯一文件名后上传 S3
- 下载与流媒体接口检测
zipFilePath是否为 S3 URL:- 是 → 创建预签名链接并 302
- 否 → 走兼容逻辑读取本地旧文件
cleanup-database操作只处理数据库,已移除本地文件删除代码
七、部署与运维
- 首选脚本:
deploy-new-fixed.ps1(Windows PowerShell),使用私有 Registry - Compose:
docker-compose.standard.yml包含postgres、minio、minio-init、app;MinIO 初始化自动建桶并开放下载 - 健康检查:部署脚本最终轮询
/api/health,确保上线成功 - 辅助脚本:
scripts/deploy目录下check-*、fix-*、setup-*、manual-import-image.ps1等,用于诊断、离线包、镜像导入
八、统一术语
- “分类列表”:左侧字段列表(可排序、重命名、禁用/启用)
- “小卡片”:右侧具体选项卡片
- “字段池”:
FieldDefinition/FieldOption数据体系 - “模板”:上传模板(定义字段的来源)
- “启用/禁用”:是否参与分类列表与首页筛选
- “Prompt 弹窗”:
DialogProvider提供的统一输入弹窗
九、统一 UI 与风格规范
- 主题系统:依赖
useThemeStyles、useTheme输出styles对象,集中管理按钮、输入框、卡片、文本颜色等 - 布局
- 管理端页面通用:左侧固定 Sidebar(240px+),右侧内容区滚动
- 分类管理左侧列表为滚动容器,右侧内容随页面滚动
- 按钮 & 动画
- 使用
cardAnimations、buttonAnimations定义 hover/active/入场效果 - 可交互部件默认有最小点击区域(>=32px),方形图标按钮保持 8x8(tailwind 单位)
- 使用
- 弹窗
- 全部走
DialogProvider(confirm/alert/prompt),禁止单独实现模态框 - 提示文案统一使用简体中文,按钮文案保持“确定/取消/保存/禁用”等常用词
- 全部走
- 拖拽
- 基于
@dnd-kit,拖动元素配“九宫格”图标作为手柄,拖拽过程加ring-indigo高亮
- 基于
- 表单输入
- 优先使用
styles.inputStyles.base,禁用手动 inline 样式,保持焦点态一致 - Placeholder 以描述性文案为主,例如“请输入显示名称”
- 优先使用
- 空状态
- 使用
text-xs text-slate-500描述,无数据时文案统一采用“暂无 XXX”格式
- 使用
- 命名
- 组件/变量遵循英文语义命名;对用户展示的字段使用中文
如需追加更细的 API 参数、数据库字段说明或交互流程,请在此文档基础上补充。***