lty/qy-lty-admin/README.md
pmc 3b7c5c85f5
All checks were successful
Build and Deploy LTY / build-and-deploy (push) Successful in 9m14s
feat: update device interaction views, docs, and CLAUDE.md
- Update device_interaction views
- Update admin README and CLAUDE.md
- Add affinity system design doc
- Add device chat record subtitle storage scheme doc

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 17:06:21 +08:00

267 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 洛天依应用管理后台 (qy-lty-admin)
洛天依 APP 配套的 Web 管理后台,基于 **Next.js 15 (App Router) + React 19 + TypeScript** 构建,搭配 Tailwind CSS 与 Radix UI/shadcn 风格组件库为运营与研发团队提供用户、AI 模型、卡牌、内容、权限等一体化的管理能力。后端 API 由 [qy_lty](../qy_lty/) 服务器项目统一提供(位于 `C:\Users\admin\Desktop\Lila-Server\qy_lty`)。
---
## 目录
- [功能概览](#功能概览)
- [技术栈](#技术栈)
- [权限矩阵](#权限矩阵)
- [快速开始](#快速开始)
- [环境变量](#环境变量)
- [项目结构](#项目结构)
- [鉴权与路由保护](#鉴权与路由保护)
- [API 集成](#api-集成)
- [构建与部署](#构建与部署)
- [浏览器支持](#浏览器支持)
- [许可证](#许可证)
---
## 功能概览
根据左侧导航及 [lib/permissions.ts](lib/permissions.ts) 中声明的权限模块,后台分为三大功能分组:
### AI 管理
- **大模型管理** `/ai-model` — 大模型框架接入、微调、语音克隆与合成、知识库管理入口
### 内容管理
- **服装管理** `/outfits`
- **道具管理** `/props`
- **家居装饰管理** `/home-decor`
- **食物管理** `/food`
- **歌曲管理** `/songs`
- **舞蹈管理** `/dances`
- **成就管理** `/achievements`
- **好感度系统** `/affinity`
### 系统管理
- **用户管理** `/users` — 用户列表、检索、创建/编辑/删除、登录历史
- **权限管理** `/permissions` — 角色与模块访问控制
- **系统设置** `/settings`
### 仪表盘
首页 [app/page.tsx](app/page.tsx) 汇总关键指标(总用户、活跃用户、卡牌激活、对话次数)、系统概览图表与最近活动,并提供主要业务模块的快捷入口。
### 账户
- 登录 `/login`、注册 `/register`、忘记密码 `/forgot-password`
---
## 技术栈
| 类别 | 选型 |
|------|------|
| 框架 | [Next.js 15.2.4](https://nextjs.org/)App Router、standalone 输出)|
| 语言 | TypeScript 5 |
| UI 库 | [React 19](https://react.dev/) |
| 样式 | [Tailwind CSS 3.4](https://tailwindcss.com/) + `tailwindcss-animate` |
| 组件 | [Radix UI](https://www.radix-ui.com/) + shadcn 风格封装(见 [components/ui/](components/ui/)|
| 图标 | [Lucide React](https://lucide.dev/) |
| 图表 | [Recharts](https://recharts.org/) |
| 表单 | [React Hook Form](https://react-hook-form.com/) + [Zod](https://zod.dev/) + `@hookform/resolvers` |
| HTTP 客户端 | [Axios](https://axios-http.com/)(含请求/响应拦截器)|
| 通知 | [Sonner](https://sonner.emilkowal.ski/) + Radix Toast |
| 主题 | [next-themes](https://github.com/pacocoursey/next-themes) |
| 其他 | `js-cookie``date-fns``react-day-picker``embla-carousel-react``cmdk``vaul` 等 |
| 包管理 | 兼容 npm / yarn / pnpmDockerfile 使用 yarn + 淘宝镜像源)|
---
## 权限矩阵
基于角色 (RBAC) 控制模块访问,定义位于 [lib/permissions.ts](lib/permissions.ts)。角色信息存储在 `localStorage.user_role`,由侧边栏 [components/sidebar.tsx](components/sidebar.tsx) 在客户端根据角色过滤可见菜单。
| 模块 / 角色 | 超级管理员 | 内容管理员 | AI模型管理员 | 卡牌管理员 | 查看者 |
|------------|:----------:|:----------:|:------------:|:----------:|:------:|
| 仪表盘 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 用户管理 | ✓ | | | | |
| 权限管理 | ✓ | | | | |
| AI 模型管理 | ✓ | | ✓ | | |
| 服装 / 道具 / 家居 / 食物 | ✓ | ✓ | | ✓ | |
| 歌曲 / 舞蹈 / 成就 / 好感度 | ✓ | ✓ | | | |
| 系统设置 | ✓ | | | | |
辅助 API`getUserRole()``getAllowedModules()``hasPermission(module)``hasPathPermission(pathname)`
---
## 快速开始
### 环境要求
- Node.js **22.x** 及以上(与 Dockerfile 中的 `node:22.10.0-alpine` 对齐)
- 包管理器npm / yarn / pnpm 任意其一
- 可访问的 Lila-Server API 服务
### 本地开发
```bash
# 1. 安装依赖
pnpm install # 或 yarn / npm install
# 2. 配置环境变量
cp .env.example .env.local
# 编辑 .env.local填入 NEXT_PUBLIC_API_BASE_URL
# 3. 启动开发服务器(默认 http://localhost:3000
pnpm dev # 或 yarn dev / npm run dev
```
### 可用脚本
| 命令 | 说明 |
|------|------|
| `next dev` | 启动开发服务器HMR|
| `next build` | 生产构建(启用 `webpackBuildWorker` 与并行编译)|
| `next start` | 启动生产服务器 |
| `next lint` | ESLint 检查(构建时已通过 `ignoreDuringBuilds` 忽略)|
> 注意:[next.config.mjs](next.config.mjs) 中 `eslint.ignoreDuringBuilds` 与 `typescript.ignoreBuildErrors` 均为 `true`,构建不会因 lint / 类型错误而失败,务必在本地执行 `next lint` 与 `tsc --noEmit` 保证质量。
---
## 环境变量
采用 Next.js 标准的环境变量机制,加载优先级(从低到高):
```
.env → .env.development / .env.production → .env.local
```
暴露给浏览器的变量必须以 `NEXT_PUBLIC_` 前缀声明。
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `NEXT_PUBLIC_API_BASE_URL` | 后端 API 基础地址,被 [lib/api/client.ts](lib/api/client.ts) 的 axios 实例使用 | `http://localhost:8000/api` |
初始化示例(存在 `.env.example` / `.env.local.example` 时):
```bash
cp .env.example .env
cp .env.local.example .env.local
```
---
## 项目结构
```
qy-lty-admin/
├── app/ # Next.js App Router 页面
│ ├── page.tsx # 仪表盘首页
│ ├── layout.tsx # 根布局
│ ├── globals.css # 全局样式
│ ├── login/ register/ forgot-password/
│ ├── ai-model/ # AI 模型管理
│ ├── outfits/ props/ home-decor/ food/ # 卡牌管理
│ ├── songs/ dances/ achievements/ affinity/ # 内容管理
│ ├── users/ permissions/ settings/ # 系统管理
├── components/
│ ├── ui/ # shadcn 风格的 Radix UI 封装
│ ├── sidebar.tsx # 带权限过滤的侧边栏
│ ├── dashboard-shell.tsx # 后台外壳布局
│ ├── dashboard-header.tsx # 页头
│ ├── overview.tsx # 仪表盘图表
│ ├── recent-activity.tsx # 最近活动列表
│ ├── stat-card.tsx # 指标卡片
│ ├── *-dialog.tsx # 新增 / 删除 / 发布等对话框
│ └── <module>/ # 按业务模块拆分的业务组件
├── hooks/
│ ├── use-mobile.tsx # 响应式断点 hook
│ └── use-toast.ts # Toast hook
├── lib/
│ ├── api/ # 业务 API 模块(见下节)
│ ├── permissions.ts # 角色 / 权限矩阵
│ └── utils.ts # cn 等通用工具
├── middleware.ts # 基于 cookie 的路由保护
├── public/ # 静态资源
├── styles/ # 附加样式
├── Dockerfile # 多阶段构建builder + runner
├── docker-compose.yml # 容器编排(端口 3030→3000
├── next.config.mjs # standalone 输出、实验项
├── tailwind.config.ts
└── tsconfig.json
```
---
## 鉴权与路由保护
项目采用"Cookie + localStorage + 前端权限矩阵"的三层方案:
1. **Cookie (`auth_token`)** — 由 [middleware.ts](middleware.ts) 读取。受保护路径列表见 `protectedPaths`,未携带 token 时重定向至 `/login?callbackUrl=<original>`
2. **localStorage (`auth_token`)** — 由 [lib/api/client.ts](lib/api/client.ts) 的 axios 请求拦截器在每个请求上自动附加 `Authorization: Bearer <token>`;响应拦截器捕获 `401` 时清除 token 并跳转至 `/login`
3. **前端权限矩阵** — [lib/permissions.ts](lib/permissions.ts) + [components/sidebar.tsx](components/sidebar.tsx),根据 `localStorage.user_role` 过滤菜单与页面入口。
> 服务端Next.js Middleware仅校验 token 是否存在;真正的权限校验由后端 API 在业务接口中执行,前端权限矩阵用于提升 UX 而非安全边界。
---
## API 集成
所有业务 API 模块集中在 [lib/api/](lib/api/)
| 文件 | 职责 |
|------|------|
| `client.ts` | axios 实例、拦截器、基础 URL、Mock 辅助工具 |
| `auth.ts` | 登录 / 注册 / 登出 / Token 管理 |
| `users.ts` / `roles.ts` | 用户与角色 |
| `ai-models.ts` | AI 模型相关接口 |
| `outfits.ts` / `props.ts` / `home-decor.ts` / `food.ts` / `card.ts` | 卡牌体系 |
| `songs.ts` / `dances.ts` / `achievements.ts` / `affinity.ts` | 内容与互动 |
| `upload.ts` | 文件上传 |
| `adapters.ts` | 后端 DTO → 前端 ViewModel 转换 |
| `error-handler.ts` | 统一错误处理 |
| `token-debug.ts` | Token 调试工具 |
| `types.ts` / `song.type.ts` | 共享类型定义 |
| `index.ts` | 聚合导出与 Mock 用户 / 角色 API |
> `index.ts` 中包含 Mock 数据与 `simulateDelay`,供联调或离线开发使用;生产环境应确保实际请求打向 `NEXT_PUBLIC_API_BASE_URL`。
---
## 构建与部署
### 本地构建
```bash
pnpm build
pnpm start # 启动生产服务器
```
`next.config.mjs` 配置了 `output: 'standalone'`,构建产物位于 `.next/standalone`,适合作为独立部署单元。
### Docker
项目提供多阶段 [Dockerfile](Dockerfile)builder + runner基于 `node:22.10.0-alpine`,使用淘宝 npm 镜像)与 [docker-compose.yml](docker-compose.yml)
```bash
# 构建镜像并启动
docker-compose up -d --build
# 访问 http://<host>:3030
```
Compose 关键配置:
- 容器名:`lty-admin`
- 端口映射:宿主机 `3030` → 容器 `3000`
- 环境文件:`.env.production`
- 挂载 `./public` 以便热更新静态资源
- `restart: always` 故障自动恢复
部署前确认 `.env.production` 已正确配置 `NEXT_PUBLIC_API_BASE_URL`
---
## 浏览器支持
最新稳定版本的 Chrome / Firefox / Safari / Edge。项目使用 React 19 与现代 CSS 特性,不再适配 IE。
---
## 许可证
[MIT](LICENSE)