diff --git a/.github/workflows/deploy_backend.yml b/.github/workflows/deploy_backend.yml deleted file mode 100644 index 56c3f7d..0000000 --- a/.github/workflows/deploy_backend.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Deploy Backend - -on: - # push: - # branches: [ main ] - # paths: - # - 'backend/**' - # - 'Dockerfile' - # - '.github/workflows/deploy_backend.yml' - workflow_dispatch: - -env: - IMAGE_NAME: license-manager-backend - CONTAINER_NAME: license-manager - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: '1.23' - - - name: Build and test backend - run: | - cd backend - go mod tidy - go mod verify - go test ./... - go build -ldflags="-s -w" -o license-manager cmd/main.go - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build Docker image - run: | - docker build -f Dockerfile.backend -t ${{ env.IMAGE_NAME }}:latest . - docker save ${{ env.IMAGE_NAME }}:latest > backend-image.tar - - - name: Copy files to server - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.HOST_PI }} - username: pi - password: ${{ secrets.PASS_PI }} - port: 22 - source: "backend-image.tar" - target: "/home/pi/license-manager/" - - - name: Deploy to server - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.HOST_PI }} - username: pi - password: ${{ secrets.PASS_PI }} - port: 22 - script: | - cd /home/pi/license-manager - - # Stop and remove existing container - docker stop ${{ env.CONTAINER_NAME }} || true - docker rm ${{ env.CONTAINER_NAME }} || true - - # Load new image - docker load < backend-image.tar - - # Remove old image - docker rmi ${{ env.IMAGE_NAME }}:old || true - docker tag ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:old || true - - # Run new container with host network - docker run -d \ - --name ${{ env.CONTAINER_NAME }} \ - --restart unless-stopped \ - --network host \ - -v /home/pi/license-manager/logs:/app/logs \ - ${{ env.IMAGE_NAME }}:latest - - # Clean up - rm -f backend-image.tar - docker image prune -f - - # Check deployment status - sleep 5 - if docker ps | grep -q ${{ env.CONTAINER_NAME }}; then - echo "✅ Deployment successful! Container is running." - docker logs --tail 10 ${{ env.CONTAINER_NAME }} - else - echo "❌ Deployment failed! Container is not running." - docker logs ${{ env.CONTAINER_NAME }} - exit 1 - fi - - - name: Health check - run: | - sleep 10 - response=$(curl -s -o /dev/null -w "%{http_code}" http://${{ secrets.HOST_PI }}:18888/health || echo "000") - if [ "$response" = "200" ]; then - echo "✅ Health check passed! Service is responding." - else - echo "⚠️ Health check returned status: $response" - echo "Service may still be starting up..." - fi \ No newline at end of file diff --git a/.github/workflows/deploy_frontend.yml b/.github/workflows/deploy_frontend.yml deleted file mode 100644 index 7319411..0000000 --- a/.github/workflows/deploy_frontend.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: Deploy Frontend - -on: - # push: - # branches: [ main ] - # paths: - # - 'frontend/**' - # - 'Dockerfile.frontend' - # - 'nginx.conf' - # - '.github/workflows/deploy_frontend.yml' - workflow_dispatch: - -env: - IMAGE_NAME: license-manager-frontend - CONTAINER_NAME: license-manager-frontend - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build Docker image - run: | - docker build -f Dockerfile.frontend --build-arg NGINX_CONF=nginx-ci.conf -t ${{ env.IMAGE_NAME }}:latest . - docker save ${{ env.IMAGE_NAME }}:latest > frontend-image.tar - - - name: Copy files to server - uses: appleboy/scp-action@v0.1.7 - with: - host: ${{ secrets.HOST_PI }} - username: pi - password: ${{ secrets.PASS_PI }} - port: 22 - source: "frontend-image.tar" - target: "/home/pi/license-manager/" - - - name: Deploy to server - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.HOST_PI }} - username: pi - password: ${{ secrets.PASS_PI }} - port: 22 - script: | - cd /home/pi/license-manager - - # Stop and remove existing container - docker stop ${{ env.CONTAINER_NAME }} || true - docker rm ${{ env.CONTAINER_NAME }} || true - - # Load new image - docker load < frontend-image.tar - - # Remove old image - docker rmi ${{ env.IMAGE_NAME }}:old || true - docker tag ${{ env.IMAGE_NAME }}:latest ${{ env.IMAGE_NAME }}:old || true - - # Run new container - docker run -d \ - --name ${{ env.CONTAINER_NAME }} \ - --restart unless-stopped \ - -p 18080:80 \ - --add-host host.docker.internal:host-gateway \ - ${{ env.IMAGE_NAME }}:latest - - # Clean up - rm -f frontend-image.tar - docker image prune -f - - # Check deployment status - sleep 5 - if docker ps | grep -q ${{ env.CONTAINER_NAME }}; then - echo "✅ Frontend deployment successful! Container is running." - docker logs --tail 10 ${{ env.CONTAINER_NAME }} - else - echo "❌ Frontend deployment failed! Container is not running." - docker logs ${{ env.CONTAINER_NAME }} - exit 1 - fi - - - name: Health check - run: | - sleep 10 - response=$(curl -s -o /dev/null -w "%{http_code}" http://${{ secrets.HOST_PI }}:18080/ || echo "000") - if [ "$response" = "200" ]; then - echo "✅ Frontend health check passed! Service is responding." - else - echo "⚠️ Frontend health check returned status: $response" - echo "Service may still be starting up..." - fi \ No newline at end of file diff --git a/docs/architecture/客户属性设计与web显示方案.md b/docs/architecture/客户属性设计与web显示方案.md deleted file mode 100644 index a7b406c..0000000 --- a/docs/architecture/客户属性设计与web显示方案.md +++ /dev/null @@ -1,345 +0,0 @@ -# 客户属性设计与Web显示方案 - -## 1. 核心客户属性 - -### 基础标识 -- `id` - 唯一标识符 - - **作用**: 数据库主键,系统内部引用 - - **生成**: UUID自动生成 - - **必填**: 是 - -- `customer_code` - 客户编码 (如: CUS-2025-001) - - **作用**: 业务识别码,便于客服沟通和查找 - - **生成**: CUS-YYYY-NNNN格式,系统自动递增 - - **必填**: 是 - - **唯一**: 是 - - **意义**: 比数据库ID更有业务意义,支持按年度统计 - -- `customer_name` - 客户名称/公司名 - - **作用**: 主要识别信息,合同签署主体 - - **示例**: "北京科技有限公司"、"张三" - - **必填**: 是 - - **搜索**: 支持模糊搜索 - -- `customer_type` - 客户类型 (个人/企业/政府/教育) - - **作用**: 区分客户类别,影响服务策略和定价 - - **枚举**: individual(个人) | enterprise(企业) | government(政府) | education(教育) - - **必填**: 是 - - **默认**: enterprise - -### 联系信息 -- `contact_person` - 联系人姓名 - - **作用**: 授权通知和技术支持的对接人 - - **必填**: 是 - - **示例**: "张三" - -- `contact_title` - 联系人职务 - - **作用**: 了解联系人在组织中的角色,便于沟通 - - **必填**: 否 - - **示例**: "技术总监"、"IT经理" - -- `email` - 主邮箱 - - **作用**: 授权激活通知、过期提醒、技术支持的主要渠道 - - **必填**: 是 - - **唯一**: 建议唯一 - - **验证**: 邮箱格式验证 - -- `phone` - 电话号码 - - **作用**: 紧急联系、电话技术支持 - - **必填**: 否 - - **格式**: 支持手机和固话 - -### 地址信息 -- `address` - 地址 - - **作用**: 联系地址,邮寄材料或现场服务时使用 - - **必填**: 否 - - **示例**: "北京市朝阳区科技园区100号" - - **格式**: 自由文本,用户可详细可简略 - -### 商业属性 -- `company_size` - 企业规模 (小型/中型/大型/集团) - - **作用**: 影响定价策略和服务等级 - - **枚举**: small(小型) | medium(中型) | large(大型) | enterprise(集团) - - **必填**: 否 - - **用途**: 制定差异化授权策略 - -### 授权配置 -- `preferred_license_type` - 首选授权类型 (在线/离线/混合) - - **作用**: 影响授权码生成策略和验证方式 - - **枚举**: online(在线) | offline(离线) | hybrid(混合) - - **必填**: 否 - - **默认**: online - - **意义**: 在线需要联网验证,离线可本地验证 - -### 客户分级 -- `customer_level` - 客户等级 (普通/VIP/企业/战略) - - **作用**: 影响服务优先级、授权数量限制、技术支持等级 - - **枚举**: normal(普通) | vip(VIP) | enterprise(企业) | strategic(战略) - - **必填**: 否 - - **默认**: normal - - **影响**: 高等级客户可获得更多授权、更快响应 - -### 状态管理 -- `status` - 客户状态 (正常/禁用) - - **作用**: 控制是否允许为该客户生成新授权 - - **枚举**: active(正常) | disabled(禁用) - - **必填**: 是 - - **默认**: active - - **影响**: 禁用状态下不能生成新授权,但现有授权仍可使用 - -- `description` - 客户描述/备注 - - **作用**: 记录客户特殊情况、业务背景、注意事项 - - **必填**: 否 - - **示例**: "重要客户,IoT平台采购方,需要优先技术支持" - -### 时间字段 -- `created_at` - 创建时间 - - **作用**: 记录客户注册时间,用于统计分析 - - **自动**: 系统自动记录 - - **不可修改**: 是 - -- `updated_at` - 更新时间 - - **作用**: 记录最后修改时间,追踪数据变更 - - **自动**: 系统自动更新 - - **触发**: 任何字段修改都会更新 - -- `created_by` - 创建人 - - **作用**: 记录是哪个管理员创建的客户 - - **必填**: 是 - - **关联**: 管理员用户ID - -- `updated_by` - 更新人 - - **作用**: 记录最后修改人,便于问题追溯 - - **自动**: 系统自动记录当前操作员 - ---- - -## 2. Web列表页显示信息 - -### 主要显示列 -``` -| 客户编码 | 客户名称 | 客户类型 | 联系人 | 邮箱 | 客户等级 | 状态 | 创建时间 | 操作 | -``` - -### 具体显示内容与作用 - -**客户编码** (`customer_code`) -- 显示: CUS-2025-001 -- 作用: 快速识别客户,支持精确搜索,客服沟通时的标准引用 -- 交互: 点击可复制到剪贴板 - -**客户名称** (`customer_name`) -- 显示: 北京科技有限公司 -- 作用: 主要识别信息,最重要的显示内容 -- 交互: 点击进入客户详情页 -- 样式: 可截断显示,悬停显示完整名称 - -**客户类型** (`customer_type`) -- 显示: 🏢企业 | 👤个人 | 🏛️政府 | 🎓教育 -- 作用: 快速区分客户类别,影响服务策略 -- 样式: 用图标+文字+颜色区分 -- 筛选: 支持按类型筛选 - -**联系人** (`contact_person`) -- 显示: 张三 -- 作用: 知道具体联系谁,便于沟通对接 -- 交互: 悬停显示联系人职务信息 - -**邮箱** (`email`) -- 显示: zhangsan@example.com -- 作用: 重要联系方式,授权通知的主要渠道 -- 交互: 点击可发送邮件 -- 验证: 显示邮箱验证状态(已验证/未验证) - -**客户等级** (`customer_level`) -- 显示: 🏢企业 | 👤普通 | ⭐VIP | 💼战略 -- 作用: 显示客户重要程度,影响服务优先级 -- 样式: 不同等级用不同颜色和图标 -- 排序: 支持按等级排序 - -**状态** (`status`) -- 显示: ✅正常 | ❌禁用 -- 作用: 显示客户是否可以生成新授权 -- 交互: 可直接点击切换状态(需要确认) -- 样式: 正常为绿色,禁用为红色 - -**创建时间** (`created_at`) -- 显示: 2025-01-15 -- 作用: 了解客户注册时间,便于分析客户生命周期 -- 格式: YYYY-MM-DD -- 排序: 默认按创建时间倒序 - -**操作** -- 查看详情: 进入客户详情页 -- 编辑: 修改客户信息 -- 授权管理: 查看该客户的所有授权 -- 生成授权: 快速为该客户生成新授权 -- 更多操作: 禁用/启用、删除等 - ---- - -## 3. Web详情页显示信息 - -### 基本信息卡片 -``` -客户编码: CUS-2025-001 客户类型: 🏢企业 -客户名称: 北京科技有限公司 客户等级: ⭐VIP客户 -联系人: 张三 (技术总监) 当前状态: ✅正常 -邮箱: zhangsan@example.com 电话: 13800138000 -``` -**用途**: 核心信息一览,便于快速了解客户基本情况 - -### 地址信息卡片 -``` -地址: 北京市朝阳区科技园区100号 -``` -**用途**: 联系地址,邮寄材料或现场服务参考 - -### 商业信息卡片 -``` -企业规模: 中型企业 首选授权: 在线授权 -备注描述: 重要客户,IoT平台采购方,需要优先技术支持 -``` -**用途**: 业务背景了解,制定针对性服务策略 - -### 状态信息卡片 -``` -当前状态: ✅正常 创建时间: 2025-01-15 10:30:00 -创建人: 李四(管理员) 更新时间: 2025-01-20 15:45:00 -更新人: 王五(客服) -``` -**用途**: 跟踪客户生命周期,了解操作历史 - -### 授权统计卡片 -``` -总授权数: 3个 活跃授权: 2个 -过期授权: 1个 最近授权: 2025-01-18 -即将过期: 1个(7天内) 授权设备总数: 85台 -``` -**用途**: 快速了解客户授权使用情况,识别续费机会 - ---- - -## 4. 列表页功能特性 - -### 搜索筛选 -- **全文搜索框**: 支持客户编码、名称、联系人、邮箱的模糊搜索 - - **作用**: 快速定位目标客户 - - **实现**: 实时搜索,输入即显示结果 - -- **客户类型筛选**: 全部 | 企业 | 个人 | 政府 | 教育 - - **作用**: 按业务类型分类查看 - - **场景**: 针对不同类型客户制定营销策略 - -- **客户等级筛选**: 全部 | 普通 | VIP | 企业 | 战略 - - **作用**: 重点关注高价值客户 - - **场景**: 优先处理VIP和战略客户的需求 - -- **状态筛选**: 全部 | 正常 | 禁用 - - **作用**: 识别问题客户,及时处理 - - **场景**: 定期清理禁用客户,分析禁用原因 - -### 排序功能 -- **按创建时间排序** (默认) - - **作用**: 了解客户注册趋势,关注新客户 - -- **按客户名称排序** - - **作用**: 字母序查找,便于浏览 - -- **按客户等级排序** - - **作用**: 优先显示重要客户 - -- **按更新时间排序** - - **作用**: 查看最近活跃的客户 - -### 批量操作 -- **批量启用/禁用** - - **作用**: 批量处理客户状态变更 - - **场景**: 批量处理欠费客户、恢复客户服务 - -- **批量导出** - - **作用**: 导出客户数据进行分析 - - **格式**: Excel、CSV格式 - -- **批量删除** - - **作用**: 清理无效客户数据 - - **安全**: 需要二次确认,软删除机制 - -### 分页显示 -- **每页条数**: 10/20/50/100条可选 - - **默认**: 20条 - - **作用**: 平衡加载速度和浏览效率 - -- **总数统计**: 显示"共1,234个客户" - - **作用**: 了解客户总体规模 - -- **页码导航**: 支持跳转到指定页 - - **作用**: 快速浏览大量数据 - ---- - -## 5. 显示优化建议 - -### 响应式设计 -- **桌面端(>1200px)**: 显示所有列 - - **作用**: 完整信息展示,提高工作效率 - -- **平板端(768-1200px)**: 隐藏地址、电话等次要信息 - - **作用**: 保持核心信息,适应中等屏幕 - -- **手机端(<768px)**: 卡片式布局,只显示客户名称、等级、状态 - - **作用**: 移动端快速浏览,支持现场客户查询 - -### 数据可视化(仪表盘) -- **客户等级分布饼图** - - **作用**: 了解客户结构,制定等级提升策略 - -- **客户类型统计柱图** - - **作用**: 分析目标市场,调整营销重点 - -- **月度新增客户趋势图** - - **作用**: 监控业务增长,评估营销效果 - -### 交互优化 -- **悬停显示完整信息** - - **场景**: 客户名称过长时显示完整名称 - - **内容**: 联系人悬停显示职务和电话 - -- **点击客户名称进入详情页** - - **作用**: 快速访问详细信息 - -- **状态切换快捷操作** - - **实现**: 点击状态图标直接切换,需要确认 - - **作用**: 快速处理客户状态变更 - -- **右键菜单快速操作** - - **功能**: 编辑、查看授权、生成授权、禁用等 - - **作用**: 提高操作效率,减少页面跳转 - -### 性能优化 -- **虚拟滚动**: 大数据量时采用虚拟滚动 - - **触发**: 客户数>1000时 - - **作用**: 保证页面流畅性 - -- **延迟加载**: 图片和非关键信息延迟加载 - - **作用**: 提高首屏加载速度 - -- **缓存策略**: 客户列表数据缓存5分钟 - - **作用**: 减少不必要的服务器请求 - -## 6. 业务价值总结 - -### 提高工作效率 -- **快速识别**: 通过客户编码和等级快速识别重要客户 -- **精准搜索**: 多维度搜索快速定位目标客户 -- **批量操作**: 减少重复性操作,提高处理效率 - -### 优化客户服务 -- **服务分级**: 根据客户等级提供差异化服务 -- **及时响应**: 通过状态管理及时识别问题客户 -- **个性化**: 根据客户偏好(授权类型)提供合适的解决方案 - -### 支撑业务决策 -- **客户分析**: 通过等级、类型分布了解客户结构 -- **趋势监控**: 通过创建时间分析客户增长趋势 -- **风险控制**: 通过状态管理防范业务风险 \ No newline at end of file diff --git a/docs/architecture/目录结构说明.md b/docs/architecture/目录结构说明.md deleted file mode 100644 index 3969656..0000000 --- a/docs/architecture/目录结构说明.md +++ /dev/null @@ -1,127 +0,0 @@ -# 软件授权管理平台 - 目录结构说明 - -## 项目整体结构 - -``` -license-manager/ -├── README.md # 项目说明文档 -├── LICENSE # 开源许可证 -├── .gitignore # Git忽略文件配置 -├── Dockerfile # Docker构建配置 -├── docker-compose.yml # Docker编排配置 -├── Makefile # 构建自动化脚本 -│ -├── backend/ # 后端服务目录 -├── frontend/ # 前端应用目录 -├── docs/ # 项目文档目录 -├── scripts/ # 项目级脚本目录 -├── tests/ # 端到端测试目录 -└── bin/ # 编译产物目录 -``` - -## 前端目录 (frontend/) - -``` -frontend/ -├── public/ # 静态资源目录 -│ ├── index.html # HTML模板 -│ └── favicon.ico # 网站图标 -├── src/ # 前端源代码 -│ ├── components/ # Vue组件 -│ ├── views/ # 页面视图 -│ ├── router/ # 路由配置 -│ ├── store/ # 状态管理(Pinia) -│ ├── api/ # API请求封装 -│ ├── utils/ # 工具函数 -│ ├── assets/ # 资源文件 -│ └── main.js # 应用入口 -├── package.json # NPM依赖配置 -├── vite.config.js # Vite构建配置 -└── .env.example # 环境变量模板 -``` - -## 文档目录 (docs/) - -``` -docs/ -├── api/ # API接口文档 -├── architecture/ # 架构设计文档 -│ ├── 需求说明书.md # 项目需求规格 -│ └── 目录结构说明.md # 本文档 -└── deployment/ # 部署相关文档 -``` - -## 脚本目录 (scripts/) - -``` -scripts/ -├── build.sh # 项目构建脚本 -├── deploy.sh # 部署脚本 -└── dev.sh # 开发环境启动脚本 -``` - -## 测试目录 (tests/) - -``` -tests/ -├── integration/ # 集成测试 -└── e2e/ # 端到端测试 -``` - -## 编译产物目录 (bin/) - -``` -bin/ -└── license-manager # 编译后的可执行文件 -``` - -## 目录设计原则 - -### 1. 前后端分离 -- backend/ 和 frontend/ 完全独立,可以分别开发和部署 -- 各自拥有独立的依赖管理和构建配置 - -### 2. 职责清晰 -- internal/ 存放内部业务逻辑,不对外暴露 -- pkg/ 存放可重用的公共代码 -- cmd/ 只包含应用启动代码 - -### 3. 标准化 -- 遵循Go项目标准布局 -- 遵循Vue.js项目最佳实践 -- 符合开源项目规范 - -### 4. 易于维护 -- 配置文件集中管理 -- 脚本统一放置 -- 文档结构清晰 - -## 开发流程 - -### 开发环境启动 -```bash -# 启动开发环境(前后端同时启动) -./scripts/dev.sh -``` - -### 项目构建 -```bash -# 构建整个项目 -./scripts/build.sh -``` - -### Docker部署 -```bash -# 构建Docker镜像 -docker build -t license-manager . - -# 运行容器 -docker run -p 8080:8080 license-manager -``` - -## 注意事项 - -1. 权限管理:确保脚本文件具有执行权限 -2. 配置文件:不要提交包含敏感信息的配置文件 -3. 依赖管理:定期更新依赖版本,注意安全漏洞 -4. 代码规范:前后端代码都要遵循各自的编码规范 \ No newline at end of file diff --git a/docs/architecture/需求说明书.md b/docs/architecture/需求说明书.md deleted file mode 100644 index 94f3dbc..0000000 --- a/docs/architecture/需求说明书.md +++ /dev/null @@ -1,126 +0,0 @@ -# 软件授权管理平台需求规格说明书 - -## 1. 项目概述 - -### 1.1 项目背景 -为了保护软件知识产权,规范软件使用权限,需要开发一个独立的软件授权管理平台,为IoT平台等软件系统提供授权码生成、分发、验证和管理服务。 - -### 1.2 项目目标 -- 建立统一的软件授权管理系统 -- 实现基于硬件绑定的授权机制 -- 提供在线和离线两种授权模式 -- 支持授权状态实时监控和管理 -- 提供完整的客户管理功能 - -### 1.3 系统定位 -本系统作为独立的授权管理平台,通过Web管理界面和RESTful API为其他软件系统提供授权服务。 - -## 2. 系统功能需求 - -### 2.1 客户管理模块 -- 支持客户基本信息的增删改查(姓名、公司、联系人、邮箱、电话、地址、状态、描述) -- 支持客户状态管理(激活/停用) -- 提供客户列表查看、详情查看和JSON API接口 - -### 2.2 授权生成模块 - -#### 2.2.1 授权类型支持 -- **在线授权码模式**:生成授权码,客户端激活时绑定硬件信息 -- **离线许可证模式**:直接生成绑定硬件信息的软件许可证 - -#### 2.2.2 授权生成功能 -- 支持为指定客户生成授权码或软件许可证 -- 硬件指纹基于机器序列号、MAC地址、CPU ID生成 -- 支持自定义有效期(1-36500天,预设选项:30天、90天、365天、永久) -- 支持功能列表配置和部署模式选择(在线/离线) -- 使用HMAC-SHA256签名和Base64编码保证安全性 -- 可扩展额外功能,软件系统可以从生成的license里解析出来,比如{"device_number":20} - -### 2.3 授权管理模块 -- 显示所有授权记录列表,支持按客户筛选 -- 授权状态监控(激活、过期、吊销),支持手动吊销和删除 -- 提供授权详细信息查看(客户信息、硬件信息、过期时间、最后心跳时间) -- 实时显示授权过期和激活状态 - -### 2.4 部署包生成模块 -- 为每个授权自动生成ZIP格式部署包 -- 包含配置文件(config.yaml)、安装脚本(install.sh)、部署文档等 -- 根据客户和授权信息自动命名 - -### 2.5 在线验证模块 -- **授权验证API**:验证授权码和软件许可证,支持硬件指纹验证 -- **授权激活API**:支持授权码激活为软件许可证,防止重复激活 -- **心跳监控API**:记录客户端活跃时间,提供在线状态统计 -- **授权信息查询API**:返回脱敏的授权信息,支持状态和过期检查 - -### 2.6 系统管理模块 -- **用户认证**:管理员登录、状态保持、安全退出 -- **权限控制**:Web界面需要认证,API接口独立于管理界面 -- **系统监控**:运行状态仪表盘、授权统计信息、资源监控 - -### 2.7 工具支持模块 -- 提供Windows和Linux平台的硬件信息获取工具 -- 支持获取机器序列号、MAC地址、CPU ID -- 提供工具下载接口 - -## 3. 系统非功能性需求 - -### 3.1 性能需求 -- 支持并发用户数不少于100个 -- API响应时间不超过2秒 -- 数据库连接池管理和查询性能优化 - -### 3.2 安全需求 -- 授权码和软件许可证使用HMAC-SHA256签名 -- 硬件指纹绑定防止盗用 -- 敏感信息保护和HTTPS传输加密 - -### 3.3 可靠性需求 -- 系统可用性达到99.9% -- 数据备份恢复、异常优雅降级 -- 完善的错误处理和日志记录 - -### 3.4 可扩展性需求 -- 支持水平扩展和模块化设计 -- 支持多种数据库(当前使用PostgreSQL) -- RESTful API设计便于集成 - -### 3.5 兼容性需求 -- 支持Windows、Linux、macOS操作系统 -- 支持主流浏览器和跨平台客户端工具 - -## 4. 系统架构需求 - -### 4.1 技术架构 -- **架构模式**:B/S架构 -- **后端技术**:Go 1.23+,Gorilla Mux路由,Logrus日志 -- **数据库**:PostgreSQL 12+,mysql12+ -- **前端**:Vue.js 3+ 配合Vite,响应式UI组件 -- **配置**:YAML格式配置文件 - -### 4.2 部署要求 -- 支持单机部署、Docker容器化部署 -- 支持系统服务形式运行 -- 提供启动脚本和配置模板 - -## 5. 数据需求 - -### 5.1 数据模型 -- **客户数据表**:基本信息、状态、创建时间,支持软删除和审计 -- **授权数据表**:授权码/许可证信息、客户关联、硬件信息、状态时间、功能列表 - -### 5.2 数据管理 -- 支持定期数据备份和导入导出功能 -- 提供数据迁移工具 - -## 6. 接口需求 - -### 6.1 Web管理界面 -- 客户管理、授权生成、授权列表和详情页面 -- 系统仪表盘、用户登录页面 - - - - - -