Files
website/nodejs-project/naga/README.md
2026-01-18 20:39:34 +08:00

268 lines
5.4 KiB
Markdown
Raw Permalink 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.
# 数据收集与管理系统
一个基于 Node.js + Express 的前后端一体化 Web 应用,用于收集、管理并展示用户提交的数据,支持图片上传与展示。
## 功能特性
**用户提交功能**
- 填写人名、牌谱链接、备注说明
- 上传多张图片(最多 10 张,单个文件最大 5MB
- 自动记录提交时间
- 表单字段验证
**管理员功能**
- 简单密码认证默认admin123
- 为已有记录补充 Naga 链接和说明
- 自动判断"是否有 Naga 链接"状态
**数据展示**
- 类似 Excel 的表格样式
- 图片缩略图预览与模态框查看
- 无需刷新即可更新数据
## 技术栈
- **后端**: Node.js + Express
- **数据存储**: JSON 文件data/data.json
- **文件上传**: Multer
- **前端**: 原生 HTML/CSS/JavaScript
- **容器化**: Docker基于官方 node:18 镜像)
## 项目结构
```
project/
├── server.js # Express 服务器主文件
├── package.json # 项目依赖配置
├── data/
│ └── data.json # JSON 数据存储文件
├── uploads/ # 图片上传目录
└── public/ # 前端静态文件
├── index.html # 普通访客页面
├── admin.html # 管理员页面
├── style.css # 样式文件
├── main.js # 普通页面脚本
└── admin.js # 管理员页面脚本
```
## 快速开始
### 本地运行
1. 安装依赖:
```bash
npm install
```
2. 启动服务器:
```bash
npm start
```
3. 访问应用:
- 普通访客页面http://localhost:3000
- 管理员页面http://localhost:3000/admin.html
### Docker 运行(推荐)
#### 方法 1使用 docker run
```bash
# 运行容器并挂载源码目录
docker run -d \
--name data-collection-app \
-p 3000:3000 \
-v $(pwd):/app \
-w /app \
node:18 \
sh -c "npm install && npm start"
```
#### 方法 2使用 docker-compose
创建 `docker-compose.yml` 文件:
```yaml
version: '3.8'
services:
app:
image: node:18
container_name: data-collection-app
working_dir: /app
volumes:
- .:/app
ports:
- "3000:3000"
command: sh -c "npm install && npm start"
restart: unless-stopped
```
启动容器:
```bash
docker-compose up -d
```
查看日志:
```bash
docker-compose logs -f
```
停止容器:
```bash
docker-compose down
```
## API 接口说明
### 获取所有记录
```
GET /api/list
```
**响应示例**
```json
{
"success": true,
"records": [...]
}
```
### 提交新记录
```
POST /api/submit
Content-Type: multipart/form-data
```
**参数**
- `name`: 人名(必填)
- `link`: 牌谱链接必填URL 格式)
- `note`: 备注说明必填10-200 字)
- `images`: 图片文件(可选,最多 10 张)
**响应示例**
```json
{
"success": true,
"message": "提交成功",
"record": {...}
}
```
### 更新 Naga 信息(管理员)
```
POST /api/admin/update
Content-Type: application/json
```
**参数**
```json
{
"id": 1,
"nagaLink": "https://example.com/naga",
"nagaNote": "Naga 说明文字"
}
```
**响应示例**
```json
{
"success": true,
"message": "更新成功",
"record": {...}
}
```
## 数据字段说明
每条记录包含以下字段(按顺序):
| 字段 | 说明 | 填写方 | 类型 |
|------|------|--------|------|
| 序号 | 自动生成,从 1 开始递增 | 系统 | Number |
| 提交时间 | 精确到分钟 | 系统 | String |
| 人名 | 提交者姓名 | 用户 | String |
| 牌谱链接 | URL 地址 | 用户 | String (URL) |
| 备注说明 | 10-200 字 | 用户 | String |
| 是否有 Naga | 自动判断 | 系统 | Boolean |
| Naga 链接 | URL 地址 | 管理员 | String (URL) |
| Naga 说明 | 最多 200 字 | 管理员 | String |
| 图片 | 0-10 张图片 | 用户 | Array |
## 管理员认证
默认管理员密码:`admin123`
修改密码方法:
编辑 `public/admin.js` 文件第 2 行:
```javascript
const ADMIN_PASSWORD = 'your_new_password';
```
## 扩展建议
### 迁移到数据库
如需使用 SQLite 或其他数据库,可以:
1. 安装数据库驱动(如 `better-sqlite3`
```bash
npm install better-sqlite3
```
2. 修改 `server.js` 中的 `readData()``writeData()` 函数
3. 创建数据库表结构:
```sql
CREATE TABLE records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
submit_time TEXT NOT NULL,
name TEXT NOT NULL,
link TEXT NOT NULL,
note TEXT NOT NULL,
naga_link TEXT,
naga_note TEXT,
images TEXT
);
```
### 增强安全性
- 使用环境变量存储密码
- 添加 JWT 或 Session 认证
- 实现 HTTPS
- 添加 CSRF 保护
- 实现文件上传的病毒扫描
### 性能优化
- 添加缓存机制
- 实现分页加载
- 图片压缩与 CDN 存储
- 使用数据库索引
## 常见问题
**Q: 如何重置所有数据?**
A: 删除 `data/data.json` 文件,重启服务器会自动创建新的空数据文件。
**Q: 图片存储在哪里?**
A: 图片存储在 `uploads/` 目录,通过 `/uploads/文件名` 访问。
**Q: 如何修改端口?**
A: 设置环境变量 `PORT=8080` 或修改 `server.js` 第 7 行。
**Q: 支持哪些图片格式?**
A: 支持 jpeg, jpg, png, gif, webp 格式。
## 许可证
MIT License
## 技术支持
如有问题,请检查:
1. Node.js 版本是否 >= 18
2. 端口 3000 是否被占用
3. `data/``uploads/` 目录是否有写入权限
4. 浏览器控制台是否有错误信息