No Description

Carl 255229712e Feature #TASK_QT-34190 init 1 day ago
database 255229712e Feature #TASK_QT-34190 init 1 day ago
handlers 8ed771f24b Feature #TASK_QT-34190 init 1 day ago
middleware 4e6532c09a Feature init license admin 2 weeks ago
models 8ed771f24b Feature #TASK_QT-34190 init 1 day ago
web 255229712e Feature #TASK_QT-34190 init 1 day ago
.dockerignore 4e6532c09a Feature init license admin 2 weeks ago
.gitignore 4e6532c09a Feature init license admin 2 weeks ago
BUILD.md 4e6532c09a Feature init license admin 2 weeks ago
DOCKER.md 4e6532c09a Feature init license admin 2 weeks ago
Dockerfile 4e6532c09a Feature init license admin 2 weeks ago
README.md 255229712e Feature #TASK_QT-34190 init 1 day ago
build.sh 4e6532c09a Feature init license admin 2 weeks ago
docker-compose.yml 4e6532c09a Feature init license admin 2 weeks ago
go.mod 4e6532c09a Feature init license admin 2 weeks ago
go.sum 4e6532c09a Feature init license admin 2 weeks ago
main.go 8ed771f24b Feature #TASK_QT-34190 init 1 day ago

README.md

License 管理平台

一个轻量级的 License 验证和管理服务,用于 Chrome 浏览器插件后端。支持激活码管理、设备绑定、批量操作等功能。

✨ 功能特性

核心功能

  • 🔑 License 验证 - 支持设备绑定验证,自动记录激活时间
  • 📦 批量生成 - 一键批量生成激活码(支持最多 1000 个)
  • 📋 CRUD 操作 - 完整的激活码增删改查功能
  • 🔐 Token 认证 - 基于 Token 的安全认证机制
  • 📊 设备管理 - 查看已绑定设备和激活时间
  • 🎨 现代化 UI - 美观易用的 Web 管理界面

技术特性

  • 使用 MySQL 数据库,支持高并发
  • RESTful API 设计
  • 响应式前端界面
  • 支持 CORS(Chrome 插件调用)

🚀 快速开始

环境要求

  • Go 1.21 或更高版本
  • MySQL 5.7+ 或 MySQL 8.0+
  • 现代浏览器(Chrome、Firefox、Safari、Edge)

安装步骤

  1. 克隆项目

    git clone <repository-url>
    cd license-admin
    
  2. 安装依赖

    go mod download
    
  3. 配置数据库

    # 设置 MySQL 连接信息
    export DB_HOST=localhost
    export DB_PORT=3306
    export DB_USER=root
    export DB_PASSWORD=your-password
    export DB_NAME=license_admin
    
    # 初始化数据库(可选,应用会自动创建表)
    mysql -u root -p < database/init.sql
    
  4. 配置 Token(可选)

    # 设置认证 Token(默认:admin-token-123456)
    export AUTH_TOKEN=your-secret-token
    
  5. 启动服务

    go run main.go
    # 或编译后运行
    go build -o license-admin
    ./license-admin
    
  6. 访问管理平台

    浏览器打开:http://localhost:8080
    

📖 使用指南

登录系统

  1. 访问 http://localhost:8080,自动跳转到登录页
  2. 输入 Token(默认:admin-token-123456
  3. 登录成功后进入管理界面

创建激活码

单个创建:

  1. 点击"创建 License"按钮
  2. 填写激活码、最大设备数等信息
  3. 点击保存

批量生成:

  1. 点击"批量生成"按钮
  2. 设置前缀(如:VIP)
  3. 设置生成数量(1-1000)
  4. 设置最大设备数
  5. 点击生成

生成的激活码格式:前缀-32位随机字符串(如:VIP-A3B9C2D4E5F6G7H8I9J0K1L2M3N4O5P6

管理激活码

  • 查看列表 - 分页显示所有激活码
  • 编辑 - 修改最大设备数、绑定设备列表
  • 删除 - 单个删除或批量删除
  • 复制 - 一键复制激活码到剪贴板

设备绑定

激活码支持设备绑定功能:

  • 每个激活码可设置最大设备数(默认 2 个)
  • 设备首次验证时自动绑定
  • 自动记录设备激活时间
  • 超过最大设备数时验证失败

🔌 API 文档

公开接口(无需认证)

1. License 验证

POST /api/verify
Content-Type: application/json

{
  "key": "VIP-123456",
  "device_id": "device-uuid-123"
}

响应:

成功响应:

{
  "code": 0,
  "msg": "success",
  "data": {
    "valid": true
  }
}

验证失败场景:

  1. 请求参数错误 (code: 400)

    • 缺少必填参数 keydevice_id

      {
      "code": 400,
      "msg": "请求参数错误: Key: 'VerifyRequest.Key' Error:Field validation for 'Key' failed on the 'required' tag",
      "data": {
      "valid": false
      }
      }
      
  2. 无效的激活码 (code: 400)

    • 激活码不存在于数据库中

      {
      "code": 400,
      "msg": "无效的激活码",
      "data": {
      "valid": false
      }
      }
      
  3. 设备数已满 (code: 400)

    • 激活码已绑定设备数达到最大设备数限制

      {
      "code": 400,
      "msg": "设备数已满",
      "data": {
      "valid": false
      }
      }
      
  4. 数据库查询错误 (code: 500)

    • 数据库连接或查询异常

      {
      "code": 500,
      "msg": "数据库查询错误: connection refused",
      "data": {
      "valid": false
      }
      }
      
  5. 解析绑定设备列表失败 (code: 500)

    • 绑定设备数据格式错误,JSON 解析失败

      {
      "code": 500,
      "msg": "解析绑定设备列表失败: invalid character",
      "data": {
      "valid": false
      }
      }
      
  6. 更新心跳时间失败 (code: 500)

    • 已绑定设备更新心跳时间时发生错误

      {
      "code": 500,
      "msg": "更新心跳时间失败: ...",
      "data": {
      "valid": false
      }
      }
      
  7. 保存心跳时间失败 (code: 500)

    • 保存心跳时间到数据库时发生错误

      {
      "code": 500,
      "msg": "保存心跳时间失败: ...",
      "data": {
      "valid": false
      }
      }
      
  8. 绑定设备失败 (code: 500)

    • 添加新设备到绑定列表时发生错误

      {
      "code": 500,
      "msg": "绑定设备失败: ...",
      "data": {
      "valid": false
      }
      }
      
  9. 保存绑定信息失败 (code: 500)

    • 保存设备绑定信息到数据库时发生错误

      {
      "code": 500,
      "msg": "保存绑定信息失败: ...",
      "data": {
      "valid": false
      }
      }
      

2. 登录

POST /api/login
Content-Type: application/json

{
  "token": "admin-token-123456"
}

响应:

{
  "code": 0,
  "msg": "登录成功",
  "data": {
    "token": "admin-token-123456"
  }
}

管理接口(需要认证)

所有管理接口需要在请求头中添加 Token:

Authorization: Bearer your-token

1. 获取 License 列表

GET /api/licenses?page=1&page_size=10
Authorization: Bearer your-token

2. 获取单个 License

GET /api/licenses/:id
Authorization: Bearer your-token

3. 创建 License

POST /api/licenses
Authorization: Bearer your-token
Content-Type: application/json

{
  "key": "VIP-8888",
  "max_devices": 2,
  "bound_devices": "[]"
}

4. 更新 License

PUT /api/licenses/:id
Authorization: Bearer your-token
Content-Type: application/json

{
  "max_devices": 5,
  "bound_devices": "[\"device-1\", \"device-2\"]"
}

5. 删除 License

DELETE /api/licenses/:id
Authorization: Bearer your-token

6. 批量创建 License

POST /api/licenses/batch
Authorization: Bearer your-token
Content-Type: application/json

{
  "prefix": "VIP",
  "count": 10,
  "max_devices": 2
}

7. 批量删除 License

DELETE /api/licenses/batch
Authorization: Bearer your-token
Content-Type: application/json

{
  "ids": [1, 2, 3]
}

🗂️ 项目结构

license-admin/
├── main.go                 # 主程序入口
├── go.mod                  # Go 模块依赖
├── go.sum                  # 依赖校验
├── database/
│   └── database.go        # 数据库初始化
├── models/
│   └── license.go         # License 数据模型
├── handlers/
│   ├── auth.go            # 认证处理器
│   ├── license.go         # License CRUD 处理器
│   └── verify.go          # License 验证处理器
├── middleware/
│   └── auth.go            # Token 认证中间件
├── web/
│   ├── index.html         # 管理平台前端
│   └── login.html         # 登录页面
├── license.db             # SQLite 数据库文件(自动生成)
└── README.md              # 项目文档

⚙️ 配置说明

环境变量

变量名 说明 默认值
AUTH_TOKEN 认证 Token admin-token-123456
DB_HOST MySQL 主机地址 localhost
DB_PORT MySQL 端口 3306
DB_USER MySQL 用户名 root
DB_PASSWORD MySQL 密码 password
DB_NAME 数据库名称 license_admin

数据库

  • 使用 MySQL 数据库(5.7+ 或 8.0+)
  • 需要手动创建表结构(使用 database/init.sql 或 database/schema.sql)
  • 数据库初始化脚本:database/init.sql
  • 表结构脚本:database/schema.sql

端口配置

默认端口:8080

修改端口:编辑 main.go 中的 r.Run(":8080")

🔒 安全建议

  1. 生产环境配置

    • 修改默认 Token,使用强密码
    • 通过环境变量设置 AUTH_TOKEN
    • 使用 HTTPS 部署
  2. Token 管理

    • 定期更换 Token
    • 不要在代码中硬编码 Token
    • 使用环境变量或密钥管理服务
  3. 数据库安全

    • 使用强密码保护 MySQL root 账户
    • 创建专用数据库用户,仅授予必要权限
    • 定期备份数据库:mysqldump -u root -p license_admin > backup.sql
    • 启用 MySQL SSL 连接(生产环境)

📝 开发说明

技术栈

  • 后端: Go 1.21+、Gin、GORM、SQLite
  • 前端: HTML5、CSS3、JavaScript (ES6+)

依赖包

  • github.com/gin-gonic/gin - Web 框架
  • gorm.io/gorm - ORM 框架
  • gorm.io/driver/mysql - MySQL 驱动
  • github.com/go-sql-driver/mysql - MySQL 驱动底层实现

开发模式

# 开发模式运行
go run main.go

# 编译二进制
go build -o license-admin

# 运行测试
go test ./...

🐛 常见问题

1. 数据库连接失败

检查:

  • MySQL 服务是否运行
  • 数据库连接信息是否正确(DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME)
  • 数据库用户是否有创建数据库的权限(首次运行需要)
  • 查看应用日志:docker logs license-admin 或应用运行日志

2. 端口被占用

修改 main.go 中的端口号,或停止占用 8080 端口的程序。

3. Token 验证失败

检查:

  • Token 是否正确
  • 环境变量 AUTH_TOKEN 是否设置
  • 请求头中是否包含 Authorization: Bearer <token>

4. CORS 错误

已在代码中配置 CORS,如仍有问题,检查浏览器控制台错误信息。

📄 许可证

本项目采用 MIT 许可证。

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📧 联系方式

如有问题或建议,请提交 Issue。


注意: 本项目为轻量级服务,适用于中小规模场景。生产环境使用请做好安全配置和性能优化。