flnxi-Wu/README.md
WuYongJie f646b71813
Some checks failed
CI Check / check (push) Has been cancelled
chore: 初始化本地仓库并同步最近改动
2025-11-18 17:50:16 +08:00

218 lines
6.3 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.

# 由壹点3D素材
一个现代化的3D素材分享平台,采用苹果官方UI设计规范。
> ⚠️ 强烈建议:可迁移化部署时只需编辑根目录的 `config-bianliang.env`
>
> - 将你的域名、内网地址、图片域名白名单、CORS 白名单、钉钉回调、对象存储等统一填在该文件中
> - 系统启动会自动读取该文件:仅在变量“未设置”时注入,不会覆盖系统环境或 `.env/.env.local`
> - 修改后重启服务生效(重启 Node 或对应容器)
> - 前端可读变量以 `NEXT_PUBLIC_` 开头,服务端变量无需此前缀
## 🎯 项目目标
**让其他公司能够一键部署或一条命令从Docker部署到自己的NAS或服务器上**
### 核心设计原则
- **性能开销优先** - 最小化资源消耗,确保在低配置设备上也能稳定运行
- **稳定性优先** - 确保长期稳定运行,减少崩溃和错误
- **易于部署** - 零配置或最小配置即可运行
详细规范请参考:[架构设计与编码规范](./架构设计与编码规范.md)
## 一键式可迁移配置(推荐)
不想到处找变量?只需编辑根目录的 `config-bianliang.env`,填好注释中的值并重启服务即可。
系统在启动时会自动读取该文件,只有当某个变量"未设置"时才会注入,绝不会覆盖你在系统环境或 `.env/.env.local` 中已设置的值。
适合场景:不同公司、不同域名、NAS/内外网混合环境的快速切换与迁移。
**快速部署指南**:[一键部署快速指南](./一键部署快速指南.md)
包含的关键项(全部已带中文注释):
- 站点/域名:`APP_PUBLIC_URL`, `NEXTAUTH_URL`, `PUBLIC_DOMAINS`, `NEXT_PUBLIC_PUBLIC_DOMAINS`, `NEXT_PUBLIC_PORTAL_BASE_URL`, `NEXT_PUBLIC_INTRANET_URL`
- 默认 LOGO:`NEXT_PUBLIC_DEFAULT_HEADER_LOGO_URL`, `NEXT_PUBLIC_DEFAULT_LOGIN_LOGO_URL`
- 钉钉回调:`NEXT_PUBLIC_DINGTALK_CALLBACK_URL`
- 图片域名白名单(Next/Image):`IMAGE_REMOTE_HOSTS`
- CORS 白名单:`ALLOWED_ORIGINS`
- 数据恢复/对象存储:`RESTORE_S3_BUCKET_URL`, `RESTORE_S3_PUBLIC_URL`
提示:前端需要读取的变量以 `NEXT_PUBLIC_` 开头;服务端专用变量不需要此前缀。
## 技术栈
- **前端**: Next.js 14 + React 18 + TypeScript + TailwindCSS
- **认证**: NextAuth.js
- **数据库**: PostgreSQL + Prisma ORM
- **存储**: MinIO S3 (预览图) + 本地存储 (压缩包)
## 功能特性
- ✅ 用户注册/登录系统
- ✅ 素材上传(预览图 + 压缩包)
- ✅ 素材浏览与下载
- ✅ 管理员后台管理
- ✅ 用户管理
- ✅ 苹果风格UI设计
## 快速开始
### 1. 安装依赖
```bash
npm install
```
### 2. 配置环境变量
复制 `.env.example` 为 `.env` 并按需填写;部署时可结合 `config-bianliang.env` 管理差异化配置。
```bash
cp .env.example .env
```
- 如需在同一存储桶隔离测试与生产数据,可以设置 `S3_ENV_PREFIX`(例如 `testing/`),系统会自动在上传路径前添加该命名空间。
### 3. 初始化数据库
```bash
# 生成 Prisma Client
npm run prisma:generate
# 推送数据库模式
npm run prisma:push
```
### 4. 创建管理员账号
首次运行后,注册一个账号,然后在数据库中手动将该用户的 `role` 字段设置为 `ADMIN`。
```sql
UPDATE users SET role = 'ADMIN' WHERE email = 'your@email.com';
```
### 4. 快速自检(可选)
```bash
npm run check
```
### 5. 启动开发服务器(Node 环境)
```bash
npm run dev
```
访问 http://localhost:3000
## 🚀 部署到服务器
### 安全部署流程
**重要:** 使用安全部署工具,确保不影响正式服务器的正常使用。
> 可移植生产部署请优先参考:
> - [可移植部署与生产规范(权威版)](./docs/PORTABLE_DEPLOYMENT_GUIDE.md)
**快速部署:**
1. **本地测试**
```bash
npm run dev
# 测试所有功能正常
```
2. **部署前检查**
```bash
# Windows
.\部署前检查清单.bat
```
3. **执行部署**
```bash
# Windows PowerShell
.\scripts\deploy\安全部署.ps1
# Linux/Mac
bash scripts/deploy/安全部署.sh
```
**详细部署指南:**
- [安全部署流程](./docs/guides/安全部署流程.md)
- [安全部署说明](./docs/guides/安全部署说明.md)
- [安全部署指南](./docs/guides/安全部署指南.md)
**部署检查清单:**
- [部署前检查清单](./部署前检查清单.bat)
## 项目结构
```
gongxiangp2/
├── app/ # Next.js App Router
│ ├── api/ # API 路由
│ │ ├── auth/ # 认证相关
│ │ ├── materials/ # 素材相关
│ │ └── admin/ # 管理员相关
│ ├── login/ # 登录页面
│ ├── register/ # 注册页面
│ ├── admin/ # 管理员页面
│ └── page.tsx # 首页
├── components/ # React 组件
│ ├── Header.tsx
│ └── UploadModal.tsx
├── lib/ # 工具库
│ ├── prisma.ts # Prisma 客户端
│ ├── auth.ts # NextAuth 配置
│ └── s3.ts # S3 存储服务
├── prisma/ # Prisma 配置
│ └── schema.prisma # 数据库模式
└── uploads/ # 本地上传文件存储
```
## 数据库模型
### User (用户)
- id: UUID
- email: 邮箱
- username: 用户名
- password: 密码 (加密)
- role: 角色 (USER/ADMIN)
### Material (素材)
- id: UUID
- previewUrl: 预览图URL (S3)
- productModel: 商品型号
- sceneName: 场景名称
- authorName: 作者花名
- zipFileName: 压缩包文件名
- zipFilePath: 压缩包本地路径
- userId: 用户ID (外键)
## 部署
### 开发环境(Docker)
```bash
docker compose -f docker-compose.dev.yml up --build
```
### 生产环境构建
```bash
docker compose build
docker compose up -d
```
### 环境变量
确保在生产环境中设置所有必要的环境变量,特别是:
- `NEXTAUTH_SECRET`: 使用强随机字符串
- `NEXTAUTH_URL`: 设置为生产域名
- `APP_PUBLIC_URL`:可选,按公司部署时的对外访问地址(如 `https://corp.example.com`)。若不设置,系统会自动从请求头推断;该变量优先用于生成邀请链接等需要完整站点URL的功能。
## License
MIT