API/SERVER_FEATURE_IMPLEMENTATION.md
2025-10-09 10:44:22 +08:00

220 lines
7.1 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.

# 服务器售卖功能实现说明
## 功能概述
本次更新为项目添加了完整的服务器售卖功能,包括管理员端和用户端的所有必要功能。
## 实现的功能
### 1. 后端实现
#### 1.1 数据库模型
**Server 模型** (`model/server.go`)
- 服务器配置表,用于管理可售卖的服务器
- 字段:
- `id`: 主键
- `title`: 服务器标题
- `config`: 配置信息(文本)
- `price`: 价格(元)
- `duration`: 有效时长(天)
- `status`: 状态(1-启用,2-禁用)
- `description`: 服务器描述
- `stock`: 库存数量(-1表示无限)
- `created_time`: 创建时间
- `updated_time`: 更新时间
**PurchasedServer 模型** (`model/purchased_server.go`)
- 已购服务器表,记录用户购买的服务器
- 字段:
- `id`: 主键
- `user_id`: 用户ID
- `server_id`: 服务器配置ID
- `server_title`: 服务器标题(冗余字段)
- `server_config`: 服务器配置(冗余字段)
- `price`: 购买价格
- `duration`: 购买时长(天)
- `purchase_time`: 购买时间
- `expire_time`: 到期时间
- `status`: 状态(1-正常,2-已过期)
- `trade_no`: 交易单号
#### 1.2 控制器 (`controller/server.go`)
**管理员功能:**
- `GetAllServers`: 获取所有服务器配置(分页)
- `SearchServers`: 搜索服务器配置
- `GetServer`: 获取单个服务器配置
- `AddServer`: 添加服务器配置
- `UpdateServer`: 更新服务器配置
- `DeleteServer`: 删除服务器配置
- `GetAllPurchasedServers`: 获取所有已购服务器(分页,含用户名)
- `SearchPurchasedServers`: 搜索已购服务器
- `DeletePurchasedServer`: 删除已购服务器记录
**用户功能:**
- `GetEnabledServers`: 获取启用的服务器列表
- `PurchaseServer`: 购买服务器(扣除用户额度)
- `GetUserPurchasedServers`: 获取用户已购服务器列表
#### 1.3 API 路由 (`router/api-router.go`)
```
/api/server/
- GET / # 获取所有服务器(管理员)
- GET /search # 搜索服务器(管理员)
- GET /:id # 获取单个服务器(管理员)
- POST / # 添加服务器(管理员)
- PUT / # 更新服务器(管理员)
- DELETE /:id # 删除服务器(管理员)
- GET /enabled # 获取启用的服务器(用户)
- POST /purchase # 购买服务器(用户)
- GET /purchased/self # 获取用户已购服务器(用户)
- GET /purchased # 获取所有已购服务器(管理员)
- GET /purchased/search # 搜索已购服务器(管理员)
- DELETE /purchased/:id # 删除已购服务器(管理员)
```
### 2. 前端实现
#### 2.1 管理员页面
**服务器管理页面** (`web/src/pages/Server/index.js`)
- 组件:`ServersTable` (`web/src/components/table/ServersTable.js`)
- 功能:
- 查看所有服务器配置
- 搜索服务器
- 添加新服务器
- 编辑服务器配置
- 删除服务器
- 显示服务器状态、价格、库存等信息
**已售服务器列表** (`web/src/pages/PurchasedServer/index.js`)
- 组件:`PurchasedServersTable` (`web/src/components/table/PurchasedServersTable.js`)
- 功能:
- 查看所有已售服务器
- 搜索已购服务器(按用户ID或服务器标题)
- 查看服务器配置
- 显示用户名、购买时间、到期时间等
- 删除已购服务器记录
#### 2.2 用户页面
**服务器购买页面** (`web/src/pages/ServerShop/index.js`)
- 功能:
- 展示所有可购买的服务器(卡片式布局)
- 显示服务器标题、价格、有效期、库存
- 显示服务器配置预览
- 购买确认对话框
- 购买成功后显示完整配置信息
- 自动扣除用户额度
**我的服务器页面** (`web/src/pages/MyServers/index.js`)
- 功能:
- 查看用户已购买的所有服务器
- 显示购买时间、到期时间、剩余天数
- 状态标识(正常/已过期)
- 点击查看完整服务器配置
- 到期提醒(7天内显示橙色标签)
#### 2.3 路由和导航
**路由配置** (`web/src/App.js`)
- `/console/server`: 服务器管理(管理员)
- `/console/purchased-server`: 已售服务器列表(管理员)
- `/console/server-shop`: 服务器购买(用户)
- `/console/my-servers`: 我的服务器(用户)
**侧边栏导航** (`web/src/components/layout/SiderBar.js`)
- 管理员菜单:
- 服务器管理
- 已售服务器
- 个人中心菜单:
- 服务器购买
- 我的服务器
**图标配置** (`web/src/helpers/render.js`)
- 使用 Lucide React 的 Server 图标
- 紫色主题色 (#8B5CF6)
## 业务逻辑
### 购买流程
1. 用户在"服务器购买"页面浏览可用服务器
2. 点击"立即购买"按钮
3. 系统显示确认对话框,包含价格和有效期信息
4. 用户确认后:
- 检查服务器状态和库存
- 计算需要扣除的额度(价格 × QuotaPerUnit)
- 检查用户额度是否足够
- 扣除用户额度
- 创建已购服务器记录
- 更新库存(如果不是无限库存)
- 记录操作日志
5. 购买成功后显示服务器配置信息
### 额度计算
- 服务器价格以人民币(元)为单位
- 购买时将价格转换为系统额度:`额度 = 价格 × QuotaPerUnit`
- 使用 `decimal` 包进行精确的浮点数计算
### 数据冗余
- 已购服务器表中保存了服务器标题和配置的副本
- 即使原服务器配置被删除或修改,用户已购买的服务器信息仍然保留
## 数据库迁移
已在 `model/main.go` 中添加了自动迁移:
- `Server` 表
- `PurchasedServer` 表
系统启动时会自动创建这两张表。
## 安全性
- 所有管理员接口都使用 `middleware.AdminAuth()` 保护
- 所有用户接口都使用 `middleware.UserAuth()` 保护
- 购买时进行额度检查和库存检查
- 使用事务保证数据一致性(在额度扣除失败时回滚)
## UI/UX 特性
- 响应式设计,支持不同屏幕尺寸
- 使用 Semi Design 组件库,保持与项目整体风格一致
- 卡片式布局展示服务器,直观美观
- 实时显示剩余天数和过期状态
- 搜索和分页功能,方便管理大量数据
- 友好的确认对话框和成功提示
## 扩展性
该实现具有良好的扩展性,可以轻松添加:
- 服务器分类
- 优惠券/折扣功能
- 自动续费
- 服务器到期提醒(邮件/站内信)
- 更多的服务器配置字段
- 批量操作功能
## 测试建议
1. 测试管理员创建、编辑、删除服务器配置
2. 测试用户购买服务器(正常流程)
3. 测试额度不足时的购买失败
4. 测试库存为0时无法购买
5. 测试已禁用服务器无法购买
6. 测试服务器配置的查看功能
7. 测试搜索和分页功能
8. 测试过期服务器的状态显示
## 注意事项
1. 确保 `common.QuotaPerUnit` 配置正确
2. 购买时会记录操作日志,可在日志页面查看
3. 服务器配置可以包含任意文本,建议使用 JSON 或 YAML 格式
4. 库存设置为 -1 表示无限库存
5. 到期时间自动计算:购买时间 + 时长(天)× 86400 秒