# 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. **克隆项目** ```bash git clone cd license-admin ``` 2. **安装依赖** ```bash go mod download ``` 3. **配置数据库** ```bash # 设置 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(可选)** ```bash # 设置认证 Token(默认:admin-token-123456) export AUTH_TOKEN=your-secret-token ``` 5. **启动服务** ```bash 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 验证 ```http POST /api/verify Content-Type: application/json { "key": "VIP-123456", "device_id": "device-uuid-123" } ``` **响应:** **成功响应:** ```json { "code": 0, "msg": "success", "data": { "valid": true } } ``` **验证失败场景:** 1. **请求参数错误** (code: 400) - 缺少必填参数 `key` 或 `device_id` ```json { "code": 400, "msg": "请求参数错误: Key: 'VerifyRequest.Key' Error:Field validation for 'Key' failed on the 'required' tag", "data": { "valid": false } } ``` 2. **无效的激活码** (code: 400) - 激活码不存在于数据库中 ```json { "code": 400, "msg": "无效的激活码", "data": { "valid": false } } ``` 3. **设备数已满** (code: 400) - 激活码已绑定设备数达到最大设备数限制 ```json { "code": 400, "msg": "设备数已满", "data": { "valid": false } } ``` 4. **数据库查询错误** (code: 500) - 数据库连接或查询异常 ```json { "code": 500, "msg": "数据库查询错误: connection refused", "data": { "valid": false } } ``` 5. **解析绑定设备列表失败** (code: 500) - 绑定设备数据格式错误,JSON 解析失败 ```json { "code": 500, "msg": "解析绑定设备列表失败: invalid character", "data": { "valid": false } } ``` 6. **更新心跳时间失败** (code: 500) - 已绑定设备更新心跳时间时发生错误 ```json { "code": 500, "msg": "更新心跳时间失败: ...", "data": { "valid": false } } ``` 7. **保存心跳时间失败** (code: 500) - 保存心跳时间到数据库时发生错误 ```json { "code": 500, "msg": "保存心跳时间失败: ...", "data": { "valid": false } } ``` 8. **绑定设备失败** (code: 500) - 添加新设备到绑定列表时发生错误 ```json { "code": 500, "msg": "绑定设备失败: ...", "data": { "valid": false } } ``` 9. **保存绑定信息失败** (code: 500) - 保存设备绑定信息到数据库时发生错误 ```json { "code": 500, "msg": "保存绑定信息失败: ...", "data": { "valid": false } } ``` #### 2. 登录 ```http POST /api/login Content-Type: application/json { "token": "admin-token-123456" } ``` **响应:** ```json { "code": 0, "msg": "登录成功", "data": { "token": "admin-token-123456" } } ``` ### 管理接口(需要认证) 所有管理接口需要在请求头中添加 Token: ``` Authorization: Bearer your-token ``` #### 1. 获取 License 列表 ```http GET /api/licenses?page=1&page_size=10 Authorization: Bearer your-token ``` #### 2. 获取单个 License ```http GET /api/licenses/:id Authorization: Bearer your-token ``` #### 3. 创建 License ```http POST /api/licenses Authorization: Bearer your-token Content-Type: application/json { "key": "VIP-8888", "max_devices": 2, "bound_devices": "[]" } ``` #### 4. 更新 License ```http PUT /api/licenses/:id Authorization: Bearer your-token Content-Type: application/json { "max_devices": 5, "bound_devices": "[\"device-1\", \"device-2\"]" } ``` #### 5. 删除 License ```http DELETE /api/licenses/:id Authorization: Bearer your-token ``` #### 6. 批量创建 License ```http POST /api/licenses/batch Authorization: Bearer your-token Content-Type: application/json { "prefix": "VIP", "count": 10, "max_devices": 2 } ``` #### 7. 批量删除 License ```http 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 驱动底层实现 ### 开发模式 ```bash # 开发模式运行 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 ` ### 4. CORS 错误 已在代码中配置 CORS,如仍有问题,检查浏览器控制台错误信息。 ## 📄 许可证 本项目采用 MIT 许可证。 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📧 联系方式 如有问题或建议,请提交 Issue。 --- **注意:** 本项目为轻量级服务,适用于中小规模场景。生产环境使用请做好安全配置和性能优化。