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