diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ab879c3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# Multi-stage build +FROM node:18-alpine AS frontend-builder +WORKDIR /app/frontend +COPY frontend/package*.json ./ +RUN npm install +COPY frontend/ ./ +RUN npm run build + +FROM golang:1.23-alpine AS backend-builder +WORKDIR /app/backend +COPY backend/go.mod backend/go.sum ./ +RUN go mod download +COPY backend/ ./ +RUN go build -o license-manager cmd/main.go + +FROM alpine:latest +RUN apk --no-cache add ca-certificates +WORKDIR /app +COPY --from=backend-builder /app/backend/license-manager . +COPY --from=frontend-builder /app/frontend/dist ./static +COPY backend/configs/config.example.yaml ./config.yaml +EXPOSE 8080 +CMD ["./license-manager"] \ No newline at end of file diff --git a/backend/cmd/main.go b/backend/cmd/main.go new file mode 100644 index 0000000..479e177 --- /dev/null +++ b/backend/cmd/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "log" + "net/http" + + "github.com/gorilla/mux" + "github.com/sirupsen/logrus" +) + +func main() { + logrus.Info("Starting License Manager Server...") + + r := mux.NewRouter() + + // API routes + api := r.PathPrefix("/api").Subrouter() + api.HandleFunc("/validate", validateHandler).Methods("POST") + api.HandleFunc("/activate", activateHandler).Methods("POST") + api.HandleFunc("/heartbeat", heartbeatHandler).Methods("POST") + api.HandleFunc("/license/{code}", getLicenseHandler).Methods("GET") + api.HandleFunc("/customers", getCustomersHandler).Methods("GET") + + // Tools route + r.HandleFunc("/tools/{tool}", getToolHandler).Methods("GET") + + logrus.Info("Server starting on :8080") + log.Fatal(http.ListenAndServe(":8080", r)) +} + +// Placeholder handlers +func validateHandler(w http.ResponseWriter, r *http.Request) {} +func activateHandler(w http.ResponseWriter, r *http.Request) {} +func heartbeatHandler(w http.ResponseWriter, r *http.Request) {} +func getLicenseHandler(w http.ResponseWriter, r *http.Request) {} +func getCustomersHandler(w http.ResponseWriter, r *http.Request) {} +func getToolHandler(w http.ResponseWriter, r *http.Request) {} \ No newline at end of file diff --git a/backend/configs/config.example.yaml b/backend/configs/config.example.yaml new file mode 100644 index 0000000..3450931 --- /dev/null +++ b/backend/configs/config.example.yaml @@ -0,0 +1,20 @@ +server: + port: 8080 + host: "0.0.0.0" + +database: + type: "postgres" # postgres or mysql + host: "localhost" + port: 5432 + name: "license_manager" + user: "postgres" + password: "password" + ssl_mode: "disable" + +security: + hmac_secret: "your-secret-key-here" + jwt_secret: "your-jwt-secret-here" + +logging: + level: "info" # debug, info, warn, error + format: "json" # json or text \ No newline at end of file diff --git a/backend/go.mod b/backend/go.mod new file mode 100644 index 0000000..3606970 --- /dev/null +++ b/backend/go.mod @@ -0,0 +1,9 @@ +module license-manager + +go 1.23 + +require ( + github.com/gorilla/mux v1.8.0 + github.com/sirupsen/logrus v1.9.0 + gopkg.in/yaml.v3 v3.0.1 +) \ No newline at end of file diff --git a/docs/architecture/目录结构说明.md b/docs/architecture/目录结构说明.md new file mode 100644 index 0000000..e247b30 --- /dev/null +++ b/docs/architecture/目录结构说明.md @@ -0,0 +1,151 @@ +# 软件授权管理平台 - 目录结构说明 + +## 项目整体结构 + +``` +license-manager/ +├── README.md # 项目说明文档 +├── LICENSE # 开源许可证 +├── .gitignore # Git忽略文件配置 +├── Dockerfile # Docker构建配置 +├── docker-compose.yml # Docker编排配置 +├── Makefile # 构建自动化脚本 +│ +├── backend/ # 后端服务目录 +├── frontend/ # 前端应用目录 +├── docs/ # 项目文档目录 +├── scripts/ # 项目级脚本目录 +├── tests/ # 端到端测试目录 +└── bin/ # 编译产物目录 +``` + +## 后端目录 (backend/) + +``` +backend/ +├── cmd/ # 应用程序入口 +│ └── main.go # 主程序入口文件 +├── internal/ # 内部包(不对外暴露) +│ ├── api/ # API路由和控制器 +│ ├── config/ # 配置管理 +│ ├── models/ # 数据模型定义 +│ ├── service/ # 业务逻辑层 +│ ├── repository/ # 数据访问层 +│ └── middleware/ # HTTP中间件 +├── pkg/ # 可重用的公共包 +├── configs/ # 配置文件目录 +│ ├── config.yaml # 生产环境配置 +│ └── config.example.yaml # 配置模板文件 +├── migrations/ # 数据库迁移脚本 +├── scripts/ # 后端专用脚本 +├── tools/ # 硬件信息获取工具 +├── go.mod # Go模块依赖 +└── go.sum # Go依赖校验 +``` + +## 前端目录 (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/需求说明书.md b/docs/architecture/需求说明书.md similarity index 84% rename from docs/需求说明书.md rename to docs/architecture/需求说明书.md index eb7f070..2a6ae6b 100644 --- a/docs/需求说明书.md +++ b/docs/architecture/需求说明书.md @@ -95,7 +95,7 @@ - **架构模式**:B/S架构 - **后端技术**:Go 1.23+,Gorilla Mux路由,Logrus日志 - **数据库**:PostgreSQL 12+,mysql12+ -- **前端**:x +- **前端**:Vue.js 3+ 配合Vite,响应式UI组件 - **配置**:YAML格式配置文件 ### 4.2 部署要求 @@ -132,5 +132,34 @@ - 统一错误响应格式 - 支持数据分页和筛选 +## 7. 项目交付物 +### 7.1 软件交付 +- 完整源代码(前后端) +- 编译后的可执行文件 +- Docker镜像文件 +- 数据库初始化脚本 +### 7.2 文档交付 +- 部署安装文档 +- API接口文档 +- 用户操作手册 +- 系统架构文档 + +### 7.3 工具交付 +- 硬件信息获取工具(Windows/Linux) +- 客户端SDK示例 +- 配置文件模板 + +## 8. 开发计划 + +### 8.1 开发阶段 +1. **架构设计**(1周):技术选型、数据库设计、API设计 +2. **核心功能**(3周):客户管理、授权生成、验证API +3. **Web界面**(2周):前端页面开发、交互逻辑 +4. **测试部署**(1周):功能测试、性能测试、部署验证 + +### 8.2 质量保证 +- 单元测试覆盖率 > 80% +- 接口测试和性能测试 +- 安全性测试和代码审查 \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..c4241d5 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,20 @@ +{ + "name": "license-manager-frontend", + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "vue": "^3.4.0", + "vue-router": "^4.2.0", + "pinia": "^2.1.0", + "axios": "^1.6.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.0.0", + "vite": "^5.0.0" + } +} \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..5addc77 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,9 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import router from './router' +import App from './App.vue' + +const app = createApp(App) +app.use(createPinia()) +app.use(router) +app.mount('#app') \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..7df6a93 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,15 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], + server: { + port: 3000, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true + } + } + } +}) \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 0000000..9f970dc --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +echo "Building License Manager..." + +# Build backend +echo "Building backend..." +cd backend +go mod tidy +go build -o ../bin/license-manager cmd/main.go +cd .. + +# Build frontend +echo "Building frontend..." +cd frontend +npm install +npm run build +cd .. + +echo "Build completed successfully!" +echo "Backend binary: ./bin/license-manager" +echo "Frontend dist: ./frontend/dist" \ No newline at end of file diff --git a/scripts/dev.sh b/scripts/dev.sh new file mode 100644 index 0000000..20d1c2f --- /dev/null +++ b/scripts/dev.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +echo "Starting development environment..." + +# Start backend in background +echo "Starting backend server..." +cd backend +go run cmd/main.go & +BACKEND_PID=$! +cd .. + +# Start frontend +echo "Starting frontend server..." +cd frontend +npm run dev & +FRONTEND_PID=$! +cd .. + +echo "Development servers started:" +echo "Backend: http://localhost:8080" +echo "Frontend: http://localhost:3000" +echo "" +echo "Press Ctrl+C to stop all servers" + +# Wait for interrupt +trap "kill $BACKEND_PID $FRONTEND_PID; exit" INT +wait \ No newline at end of file