220 lines
7.1 KiB
Markdown
220 lines
7.1 KiB
Markdown
# 服务器售卖功能实现说明
|
||
|
||
## 功能概述
|
||
|
||
本次更新为项目添加了完整的服务器售卖功能,包括管理员端和用户端的所有必要功能。
|
||
|
||
## 实现的功能
|
||
|
||
### 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 秒
|