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

7.1 KiB
Raw Blame History

服务器售卖功能实现说明

功能概述

本次更新为项目添加了完整的服务器售卖功能,包括管理员端和用户端的所有必要功能。

实现的功能

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 秒