# PolyHermes 开发文档 本文档介绍 PolyHermes 项目的开发指南,包括项目结构、开发环境配置、代码规范、API 接口等。 ## 📋 目录 - [项目结构](#项目结构) - [开发环境配置](#开发环境配置) - [代码规范](#代码规范) - [API 接口文档](#api-接口文档) - [数据库设计](#数据库设计) - [前端开发指南](#前端开发指南) - [后端开发指南](#后端开发指南) - [常见问题](#常见问题) ## 📦 项目结构 ``` polyhermes/ ├── backend/ # 后端服务 │ ├── src/main/kotlin/ │ │ └── com/wrbug/polymarketbot/ │ │ ├── api/ # API 接口定义(Retrofit) │ │ ├── config/ # 配置类 │ │ ├── controller/ # REST 控制器 │ │ ├── dto/ # 数据传输对象 │ │ ├── entity/ # 数据库实体 │ │ ├── repository/ # 数据访问层 │ │ ├── service/ # 业务逻辑服务 │ │ ├── util/ # 工具类 │ │ └── websocket/ # WebSocket 处理 │ └── src/main/resources/ │ ├── application.properties │ └── db/migration/ # Flyway 数据库迁移脚本 ├── frontend/ # 前端应用 │ ├── src/ │ │ ├── components/ # 公共组件 │ │ ├── pages/ # 页面组件 │ │ ├── services/ # API 服务 │ │ ├── store/ # 状态管理(Zustand) │ │ ├── types/ # TypeScript 类型定义 │ │ ├── utils/ # 工具函数 │ │ ├── hooks/ # React Hooks │ │ ├── locales/ # 多语言资源 │ │ └── styles/ # 样式文件 │ └── public/ # 静态资源 ├── docs/ # 文档 │ ├── DEPLOYMENT.md # 部署文档 │ ├── VERSION_MANAGEMENT.md # 版本号管理文档 │ ├── copy-trading-requirements.md # 跟单系统需求文档 │ └── ... # 其他文档 ├── .github/workflows/ # GitHub Actions 工作流 └── README.md # 项目说明 ``` ## 🛠️ 开发环境配置 ### 前置要求 - **JDK**: 17+ - **Node.js**: 18+ - **MySQL**: 8.0+ - **Gradle**: 7.5+(或使用 Gradle Wrapper) - **Docker**: 20.10+(可选,用于容器化部署) ### 后端开发环境 1. **克隆仓库** ```bash git clone https://github.com/WrBug/PolyHermes.git cd PolyHermes ``` 2. **配置数据库** 创建 MySQL 数据库: ```sql CREATE DATABASE polyhermes CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 3. **配置环境变量** 编辑 `backend/src/main/resources/application.properties` 或使用环境变量: ```properties # 数据库配置 spring.datasource.url=jdbc:mysql://localhost:3306/polyhermes?useSSL=false&serverTimezone=UTC&characterEncoding=utf8mb4 spring.datasource.username=${DB_USERNAME:root} spring.datasource.password=${DB_PASSWORD:password} # 服务器端口 server.port=${SERVER_PORT:8000} # JWT 密钥 jwt.secret=${JWT_SECRET:change-me-in-production} # 加密密钥(用于加密存储私钥和 API Key) crypto.secret.key=${CRYPTO_SECRET_KEY:change-me-in-production} ``` 4. **启动后端服务** ```bash cd backend ./gradlew bootRun ``` 后端服务将在 `http://localhost:8000` 启动。 ### 前端开发环境 1. **安装依赖** ```bash cd frontend npm install ``` 2. **配置环境变量(可选)** 创建 `.env` 文件: ```env VITE_API_URL=http://localhost:8000 VITE_WS_URL=ws://localhost:8000 ``` 3. **启动开发服务器** ```bash npm run dev ``` 前端应用将在 `http://localhost:3000` 启动。 ## 📝 代码规范 ### 后端开发规范 详细规范请参考:[后端开发规范](.cursor/rules/backend.mdc) **核心规范**: - 使用 Kotlin 编码规范 - Controller 方法**禁止**使用 `suspend` - 实体类 ID 字段使用 `Long? = null` - 所有时间字段使用 `Long` 时间戳(毫秒) - 数值计算使用 `BigDecimal` - 使用 `ErrorCode` 枚举定义错误码和消息 - **禁止**在代码中添加 TODO 注释 - **禁止**直接返回 mock 数据 ### 前端开发规范 详细规范请参考:[前端开发规范](.cursor/rules/frontend.mdc) **核心规范**: - 使用 TypeScript 类型定义 - 使用函数式组件和 Hooks - **禁止**使用 `any` 类型 - **必须**使用多语言(i18n)进行所有文本显示 - **必须**使用 `formatUSDC` 函数格式化 USDC 金额 - **必须**支持移动端和桌面端 - **禁止**在代码中添加 TODO 注释 ### 提交规范 遵循 [Conventional Commits](https://www.conventionalcommits.org/) 规范: - `feat`: 新功能 - `fix`: 修复 bug - `docs`: 文档更新 - `style`: 代码格式调整 - `refactor`: 代码重构 - `test`: 测试相关 - `chore`: 构建/工具相关 示例: ```bash git commit -m "feat: 添加版本号显示功能" git commit -m "fix: 修复订单状态更新问题" ``` ## 📡 API 接口文档 ### 统一响应格式 所有 API 接口统一使用 POST 方法,响应格式如下: ```json { "code": 0, "data": {}, "msg": "" } ``` - `code`: 响应码,0 表示成功,非 0 表示失败 - `data`: 响应数据,可以是任意类型 - `msg`: 响应消息,成功时通常为空,失败时包含错误提示 ### 错误码规范 - `0`: 成功 - `1001-1999`: 参数错误 - `2001-2999`: 认证/权限错误 - `3001-3999`: 资源不存在 - `4001-4999`: 业务逻辑错误 - `5001-5999`: 服务器内部错误 ### 主要 API 接口 #### 账户管理 - `POST /api/accounts/list` - 获取账户列表 - `POST /api/accounts/import` - 导入账户(通过私钥) - `POST /api/accounts/detail` - 获取账户详情 - `POST /api/accounts/edit` - 编辑账户 - `POST /api/accounts/delete` - 删除账户 - `POST /api/accounts/balance` - 获取账户余额 #### Leader 管理 - `POST /api/leaders/list` - 获取 Leader 列表 - `POST /api/leaders/add` - 添加 Leader - `POST /api/leaders/edit` - 编辑 Leader - `POST /api/leaders/delete` - 删除 Leader #### 跟单模板 - `POST /api/templates/list` - 获取模板列表 - `POST /api/templates/add` - 添加模板 - `POST /api/templates/edit` - 编辑模板 - `POST /api/templates/delete` - 删除模板 #### 跟单配置 - `POST /api/copy-trading/list` - 获取跟单配置列表 - `POST /api/copy-trading/add` - 添加跟单配置 - `POST /api/copy-trading/edit` - 编辑跟单配置 - `POST /api/copy-trading/delete` - 删除跟单配置 - `POST /api/copy-trading/enable` - 启用跟单 - `POST /api/copy-trading/disable` - 禁用跟单 #### 订单管理 - `POST /api/copy-trading/orders/buy` - 获取买入订单列表 - `POST /api/copy-trading/orders/sell` - 获取卖出订单列表 - `POST /api/copy-trading/orders/matched` - 获取匹配订单列表 #### 统计分析 - `POST /api/statistics/global` - 获取全局统计 - `POST /api/statistics/leader` - 获取 Leader 统计 - `POST /api/statistics/category` - 获取分类统计 - `POST /api/copy-trading/statistics` - 获取跟单关系统计 #### 仓位管理 - `POST /api/positions/list` - 获取仓位列表 - `POST /api/positions/sell` - 卖出仓位 - `POST /api/positions/redeem` - 赎回仓位 #### 系统管理 - `POST /api/system-settings/proxy` - 配置代理 - `POST /api/system-settings/api-health` - 获取 API 健康状态 - `POST /api/users/list` - 获取用户列表 - `POST /api/users/add` - 添加用户 - `POST /api/users/edit` - 编辑用户 - `POST /api/users/delete` - 删除用户 详细 API 接口文档请参考:[跟单系统需求文档](copy-trading-requirements.md) ## 🗄️ 数据库设计 ### 主要数据表 - `accounts` - 账户表 - `leaders` - Leader 表 - `templates` - 跟单模板表 - `copy_trading` - 跟单配置表 - `copy_orders` - 跟单订单表 - `positions` - 仓位表 - `users` - 用户表 - `system_settings` - 系统设置表 数据库迁移脚本位于 `backend/src/main/resources/db/migration/`,使用 Flyway 管理。 ## 🎨 前端开发指南 ### 项目结构 ``` frontend/src/ ├── components/ # 公共组件 │ ├── Layout.tsx # 布局组件(支持移动端) │ └── Logo.tsx # Logo 组件 ├── pages/ # 页面组件 │ ├── AccountList.tsx │ ├── LeaderList.tsx │ ├── CopyTradingList.tsx │ └── ... ├── services/ # API 服务 │ ├── api.ts # API 服务定义 │ └── websocket.ts # WebSocket 服务 ├── store/ # 状态管理(Zustand) ├── types/ # TypeScript 类型定义 ├── utils/ # 工具函数 │ ├── index.ts # 统一导出 │ ├── ethers.ts # 以太坊相关工具 │ ├── auth.ts # 认证相关工具 │ └── version.ts # 版本号工具 ├── hooks/ # React Hooks ├── locales/ # 多语言资源 │ ├── zh-CN/ │ ├── zh-TW/ │ └── en/ └── styles/ # 样式文件 ``` ### 多语言支持 项目支持多语言(中文简体、中文繁体、英文),使用 `react-i18next`。 **添加新翻译**: 1. 在 `src/locales/{locale}/common.json` 中添加翻译 2. 在组件中使用 `useTranslation` Hook: ```typescript import { useTranslation } from 'react-i18next' const MyComponent: React.FC = () => { const { t } = useTranslation() return
{t('key')}
} ``` ### 移动端适配 - 使用 `react-responsive` 检测设备类型 - 断点设置:移动端 < 768px,桌面端 >= 768px - 使用响应式布局和组件 ### 工具函数 **USDC 金额格式化**: ```typescript import { formatUSDC } from '../utils' const balance = formatUSDC('1.23456') // "1.2345" ``` **以太坊地址验证**: ```typescript import { isValidWalletAddress } from '../utils' if (isValidWalletAddress(address)) { // 地址有效 } ``` ## ⚙️ 后端开发指南 ### 项目结构 ``` backend/src/main/kotlin/com/wrbug/polymarketbot/ ├── api/ # API 接口定义(Retrofit) │ ├── PolymarketClobApi.kt │ ├── PolymarketGammaApi.kt │ └── GitHubApi.kt ├── controller/ # REST 控制器 ├── service/ # 业务逻辑服务 ├── entity/ # 数据库实体 ├── repository/ # 数据访问层 ├── dto/ # 数据传输对象 ├── util/ # 工具类 │ ├── CryptoUtils.kt # 加密工具 │ ├── RetrofitFactory.kt # Retrofit 工厂 │ └── ... └── websocket/ # WebSocket 处理 ``` ### 创建新 API 接口 1. **定义 Retrofit 接口**(在 `api/` 目录): ```kotlin interface MyApi { @POST("/endpoint") suspend fun myMethod(@Body request: MyRequest): Response } ``` 2. **创建 Service**(在 `service/` 目录): ```kotlin @Service class MyService( private val myApi: MyApi ) { suspend fun doSomething(): Result { // 业务逻辑 } } ``` 3. **创建 Controller**(在 `controller/` 目录): ```kotlin @RestController @RequestMapping("/api/my") class MyController( private val myService: MyService, private val messageSource: MessageSource ) { @PostMapping("/list") fun list(@RequestBody request: MyListRequest): ResponseEntity> { return try { val data = runBlocking { myService.getList(request) } ResponseEntity.ok(ApiResponse.success(data)) } catch (e: Exception) { logger.error("获取列表失败", e) ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ERROR, messageSource = messageSource)) } } } ``` ### 数据库操作 使用 Spring Data JPA: ```kotlin @Repository interface MyRepository : JpaRepository { fun findByCode(code: String): MyEntity? fun findByCategory(category: String): List } ``` ### 加密存储 使用 `CryptoUtils` 加密敏感数据: ```kotlin @Autowired private lateinit var cryptoUtils: CryptoUtils // 加密 val encrypted = cryptoUtils.encrypt("sensitive-data") // 解密 val decrypted = cryptoUtils.decrypt(encrypted) ``` ## 🔧 常见问题 ### Q1: 如何添加新的页面? 1. 在 `frontend/src/pages/` 创建页面组件 2. 在 `frontend/src/App.tsx` 添加路由 3. 在 `frontend/src/components/Layout.tsx` 添加菜单项(如需要) ### Q2: 如何添加新的 API 接口? 1. 在 `backend/src/main/kotlin/.../controller/` 创建 Controller 2. 在 `backend/src/main/kotlin/.../service/` 创建 Service 3. 在 `frontend/src/services/api.ts` 添加 API 调用方法 ### Q3: 如何添加数据库表? 1. 创建 Entity 类(在 `entity/` 目录) 2. 创建 Repository 接口(在 `repository/` 目录) 3. 创建 Flyway 迁移脚本(在 `resources/db/migration/`) ### Q4: 如何测试 WebSocket? 使用浏览器控制台或 WebSocket 客户端工具连接到 `ws://localhost:8000/ws` ### Q5: 如何调试后端代码? 1. 使用 IDE 的调试功能(IntelliJ IDEA、VS Code 等) 2. 在代码中添加日志:`logger.debug("调试信息")` 3. 查看日志输出:`./gradlew bootRun` 或查看日志文件 ## 📚 相关文档 - [部署文档](DEPLOYMENT.md) / [English](../en/DEPLOYMENT.md) - 详细的部署指南 - [版本号管理文档](VERSION_MANAGEMENT.md) / [English](../en/VERSION_MANAGEMENT.md) - 版本号管理和自动构建 - [开发文档](DEVELOPMENT.md) / [English](../en/DEVELOPMENT.md) - 开发指南 - [跟单系统需求文档](copy-trading-requirements.md) - 后端 API 接口文档 - [前端需求文档](copy-trading-frontend-requirements.md) - 前端功能文档 ## 🤝 贡献指南 欢迎贡献代码!请遵循以下步骤: 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 遵循代码规范 4. 提交更改 (`git commit -m 'feat: Add some AmazingFeature'`) 5. 推送到分支 (`git push origin feature/AmazingFeature`) 6. 开启 Pull Request --- **Happy Coding! 🚀**