From 4664f1c4873157d3354fc48b608199a0a156b9ca Mon Sep 17 00:00:00 2001 From: zyh Date: Sun, 24 Aug 2025 19:21:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Swagger/OpenAPI=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=94=A8=E6=88=B7=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E7=9A=84API?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=92=8C=E7=AE=A1=E7=90=86=E5=91=98=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E6=8E=A7=E5=88=B6=E5=99=A8=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=EF=BC=8C=E7=A7=BB=E9=99=A4=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E5=AD=97=E6=AE=B5=E5=92=8C=E5=8F=82=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E6=95=B0=E6=8D=AE=E5=BA=93=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E4=BB=A5=E7=AE=80=E5=8C=96=E7=94=A8=E6=88=B7=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 100 ++++++++++ docs/Swagger使用说明.md | 171 +++++++++++++++++ docs/game.sql | 176 +++++++++--------- pom.xml | 7 + .../server/config/SwaggerConfig.java | 39 ++++ .../server/controller/UserController.java | 31 +-- .../controller/admin/AccountController.java | 34 ++-- .../mapper/account/UserAccountMapper.java | 2 - .../mapper/admin/AnnouncementMapper.java | 29 +++ .../mapper/admin/OperationLogMapper.java | 35 ++++ .../mapper/agent/AgentPointsTxMapper.java | 26 +++ .../server/mapper/agent/LinkBatchMapper.java | 23 +++ .../server/mapper/agent/LinkTaskMapper.java | 50 +++++ .../dto/account/AccountCreateRequest.java | 26 ++- .../model/dto/account/AccountResponse.java | 15 ++ .../dto/account/AccountUpdateRequest.java | 9 +- .../dto/account/ResetPasswordRequest.java | 9 +- .../model/entity/account/UserAccount.java | 4 - .../model/entity/admin/Announcement.java | 34 ++++ .../model/entity/admin/OperationLog.java | 42 +++++ .../model/entity/agent/AgentPointsTx.java | 46 +++++ .../server/model/entity/agent/LinkBatch.java | 38 ++++ .../server/model/entity/agent/LinkTask.java | 62 ++++++ .../server/service/UserService.java | 8 +- .../service/account/AccountService.java | 4 +- .../server/service/auth/AuthService.java | 4 +- src/main/resources/application.yml | 13 ++ .../mapper/account/UserAccountMapper.xml | 23 +-- .../mapper/admin/AnnouncementMapper.xml | 67 +++++++ .../mapper/admin/OperationLogMapper.xml | 74 ++++++++ .../mapper/agent/AgentPointsTxMapper.xml | 52 ++++++ .../mapper/agent/LinkBatchMapper.xml | 49 +++++ .../resources/mapper/agent/LinkTaskMapper.xml | 113 +++++++++++ target/classes/application.yml | 13 ++ .../server/config/SwaggerConfig.class | Bin 0 -> 2207 bytes .../server/controller/UserController.class | Bin 4349 -> 5005 bytes .../controller/admin/AccountController.class | Bin 5248 -> 5978 bytes .../mapper/account/UserAccountMapper.class | Bin 1655 -> 1564 bytes .../mapper/admin/AnnouncementMapper.class | Bin 0 -> 1255 bytes .../mapper/admin/OperationLogMapper.class | Bin 0 -> 1515 bytes .../mapper/agent/AgentPointsTxMapper.class | Bin 0 -> 1263 bytes .../server/mapper/agent/LinkBatchMapper.class | Bin 0 -> 1016 bytes .../server/mapper/agent/LinkTaskMapper.class | Bin 0 -> 2213 bytes .../dto/account/AccountCreateRequest.class | Bin 2039 -> 2841 bytes .../model/dto/account/AccountResponse.class | Bin 1996 -> 2503 bytes .../dto/account/AccountUpdateRequest.class | Bin 651 -> 1070 bytes .../dto/account/ResetPasswordRequest.class | Bin 1220 -> 1583 bytes .../model/entity/account/UserAccount.class | Bin 2203 -> 2203 bytes .../model/entity/admin/Announcement.class | Bin 0 -> 2033 bytes .../model/entity/admin/OperationLog.class | Bin 0 -> 2352 bytes .../model/entity/agent/AgentPointsTx.class | Bin 0 -> 2595 bytes .../server/model/entity/agent/LinkBatch.class | Bin 0 -> 2181 bytes .../server/model/entity/agent/LinkTask.class | Bin 0 -> 3357 bytes .../server/service/UserService.class | Bin 6740 -> 7259 bytes .../service/account/AccountService.class | Bin 11001 -> 11126 bytes .../server/service/auth/AuthService.class | Bin 2193 -> 8906 bytes .../mapper/account/UserAccountMapper.xml | 23 +-- .../mapper/admin/AnnouncementMapper.xml | 67 +++++++ .../mapper/admin/OperationLogMapper.xml | 74 ++++++++ .../mapper/agent/AgentPointsTxMapper.xml | 52 ++++++ .../classes/mapper/agent/LinkBatchMapper.xml | 49 +++++ .../classes/mapper/agent/LinkTaskMapper.xml | 113 +++++++++++ .../compile/default-compile/createdFiles.lst | 34 ++++ .../compile/default-compile/inputFiles.lst | 19 +- 64 files changed, 1688 insertions(+), 171 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/Swagger使用说明.md create mode 100644 src/main/java/com/gameplatform/server/config/SwaggerConfig.java create mode 100644 src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java create mode 100644 src/main/java/com/gameplatform/server/mapper/admin/OperationLogMapper.java create mode 100644 src/main/java/com/gameplatform/server/mapper/agent/AgentPointsTxMapper.java create mode 100644 src/main/java/com/gameplatform/server/mapper/agent/LinkBatchMapper.java create mode 100644 src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java create mode 100644 src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java create mode 100644 src/main/java/com/gameplatform/server/model/entity/admin/OperationLog.java create mode 100644 src/main/java/com/gameplatform/server/model/entity/agent/AgentPointsTx.java create mode 100644 src/main/java/com/gameplatform/server/model/entity/agent/LinkBatch.java create mode 100644 src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java create mode 100644 src/main/resources/mapper/admin/AnnouncementMapper.xml create mode 100644 src/main/resources/mapper/admin/OperationLogMapper.xml create mode 100644 src/main/resources/mapper/agent/AgentPointsTxMapper.xml create mode 100644 src/main/resources/mapper/agent/LinkBatchMapper.xml create mode 100644 src/main/resources/mapper/agent/LinkTaskMapper.xml create mode 100644 target/classes/com/gameplatform/server/config/SwaggerConfig.class create mode 100644 target/classes/com/gameplatform/server/mapper/admin/AnnouncementMapper.class create mode 100644 target/classes/com/gameplatform/server/mapper/admin/OperationLogMapper.class create mode 100644 target/classes/com/gameplatform/server/mapper/agent/AgentPointsTxMapper.class create mode 100644 target/classes/com/gameplatform/server/mapper/agent/LinkBatchMapper.class create mode 100644 target/classes/com/gameplatform/server/mapper/agent/LinkTaskMapper.class create mode 100644 target/classes/com/gameplatform/server/model/entity/admin/Announcement.class create mode 100644 target/classes/com/gameplatform/server/model/entity/admin/OperationLog.class create mode 100644 target/classes/com/gameplatform/server/model/entity/agent/AgentPointsTx.class create mode 100644 target/classes/com/gameplatform/server/model/entity/agent/LinkBatch.class create mode 100644 target/classes/com/gameplatform/server/model/entity/agent/LinkTask.class create mode 100644 target/classes/mapper/admin/AnnouncementMapper.xml create mode 100644 target/classes/mapper/admin/OperationLogMapper.xml create mode 100644 target/classes/mapper/agent/AgentPointsTxMapper.xml create mode 100644 target/classes/mapper/agent/LinkBatchMapper.xml create mode 100644 target/classes/mapper/agent/LinkTaskMapper.xml diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..07e08fc --- /dev/null +++ b/docs/README.md @@ -0,0 +1,100 @@ +# 游戏平台后端服务 + +基于 Spring Boot WebFlux + MyBatis + MySQL 的游戏平台后端服务。 + +## 🚀 快速开始 + +### 环境要求 +- JDK 17+ +- Maven 3.6+ +- MySQL 8.0+ + +### 启动步骤 +1. 配置数据库连接(`application.yml`) +2. 运行 `mvn spring-boot:run` +3. 访问 http://localhost:8080 + +## 📚 API 文档 + +### Swagger UI +启动应用后,访问以下地址查看交互式 API 文档: +- **Swagger UI**: http://localhost:8080/swagger-ui.html +- **OpenAPI JSON**: http://localhost:8080/api-docs +- **OpenAPI YAML**: http://localhost:8080/api-docs.yaml + +### 接口分组 +- **管理员账户管理**: `/api/admin/accounts` 相关接口 +- **用户账户管理**: `/api/users` 相关接口 + +### 使用说明 +详细的使用说明请参考:[Swagger使用说明.md](docs/Swagger使用说明.md) + +## 🔧 主要功能 + +### 用户管理 +- 用户账户的增删改查 +- 支持管理员和代理两种用户类型 +- 账户状态管理(启用/禁用) +- 密码重置功能 + +### 认证授权 +- JWT Token 认证 +- 基于角色的权限控制 +- 安全的密码加密存储 + +## 📁 项目结构 + +``` +src/main/java/com/gameplatform/server/ +├── config/ # 配置类 +├── controller/ # 控制器 +│ ├── admin/ # 管理员接口 +│ └── ... # 其他接口 +├── service/ # 业务逻辑 +├── mapper/ # 数据访问层 +├── model/ # 数据模型 +│ ├── dto/ # 数据传输对象 +│ └── entity/ # 实体类 +└── security/ # 安全相关 +``` + +## 🔐 认证说明 + +### JWT Token +- 访问令牌有效期:30分钟 +- 刷新令牌有效期:7天 +- 支持强制登出功能 + +### 权限控制 +- 管理员接口需要管理员权限 +- 用户接口支持公开访问(仅限AGENT类型) + +## 📖 文档 + +- [API文档](docs/API文档.md) - 详细的API接口说明 +- [Swagger使用说明](docs/Swagger使用说明.md) - Swagger文档使用指南 + +## 🛠️ 开发 + +### 编译 +```bash +mvn compile +``` + +### 测试 +```bash +mvn test +``` + +### 打包 +```bash +mvn package +``` + +## 📝 更新日志 + +### v1.0.0 +- 初始版本发布 +- 基础的用户管理功能 +- JWT认证系统 +- Swagger API文档集成 diff --git a/docs/Swagger使用说明.md b/docs/Swagger使用说明.md new file mode 100644 index 0000000..035aa0a --- /dev/null +++ b/docs/Swagger使用说明.md @@ -0,0 +1,171 @@ +# Swagger API 文档使用说明 + +## 📖 概述 + +本项目已集成 Swagger/OpenAPI 3.0,提供交互式的 API 文档界面,方便开发者和测试人员查看和测试 API 接口。 + +## 🚀 访问地址 + +启动应用后,可以通过以下地址访问 Swagger 文档: + +- **Swagger UI 界面**: http://localhost:8080/swagger-ui.html +- **OpenAPI JSON**: http://localhost:8080/api-docs +- **OpenAPI YAML**: http://localhost:8080/api-docs.yaml + +## 📋 功能特性 + +### 1. 交互式文档 +- 在线查看所有 API 接口 +- 直接在浏览器中测试接口 +- 支持请求参数验证 +- 实时查看响应结果 + +### 2. 接口分组 +- **管理员账户管理**: `/api/admin/accounts` 相关接口 +- **用户账户管理**: `/api/users` 相关接口 + +### 3. 详细文档 +- 接口描述和用途说明 +- 请求参数详细说明 +- 响应数据结构 +- 错误码说明 + +## 🔧 配置说明 + +### 配置文件 +```yaml +# application.yml +springdoc: + api-docs: + path: /api-docs + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + doc-expansion: none + disable-swagger-default-url: true + display-request-duration: true + packages-to-scan: com.gameplatform.server.controller +``` + +### 配置参数说明 +- `tags-sorter: alpha`: 按字母顺序排序标签 +- `operations-sorter: alpha`: 按字母顺序排序操作 +- `doc-expansion: none`: 默认折叠所有接口 +- `display-request-duration: true`: 显示请求耗时 + +## 📝 使用示例 + +### 1. 查看接口列表 +1. 打开 http://localhost:8080/swagger-ui.html +2. 选择对应的接口分组(如"管理员账户管理") +3. 展开需要查看的接口 + +### 2. 测试接口 +1. 点击接口右侧的"Try it out"按钮 +2. 填写请求参数 +3. 点击"Execute"执行请求 +4. 查看响应结果 + +### 3. 复制接口信息 +每个接口都提供了以下信息: +- **cURL 命令**: 可直接复制到终端执行 +- **请求 URL**: 完整的请求地址 +- **请求头**: 包含认证信息等 +- **请求体**: JSON 格式的请求数据 +- **响应示例**: 成功和失败的响应示例 + +## 🔐 认证说明 + +### Bearer Token 认证 +对于需要认证的接口,在 Swagger UI 中: +1. 点击右上角的"Authorize"按钮 +2. 在 "Value" 字段中输入 JWT Token +3. 格式:`Bearer your-jwt-token` +4. 点击"Authorize"确认 + +### 获取 Token +1. 使用登录接口获取 JWT Token +2. 复制响应中的 `accessToken` 字段 +3. 在 Swagger UI 中配置认证 + +## 📊 接口文档结构 + +### 管理员账户管理接口 +``` +POST /api/admin/accounts # 创建账户 +GET /api/admin/accounts # 获取账户列表 +GET /api/admin/accounts/{id} # 获取账户详情 +PATCH /api/admin/accounts/{id} # 更新账户 +POST /api/admin/accounts/{id}/enable # 启用账户 +POST /api/admin/accounts/{id}/disable # 禁用账户 +POST /api/admin/accounts/{id}/reset-password # 重置密码 +``` + +### 用户账户管理接口 +``` +POST /api/users # 创建用户 +GET /api/users # 获取用户列表 +GET /api/users/{id} # 获取用户详情 +PUT /api/users/{id} # 更新用户 +POST /api/users/{id}/enable # 启用用户 +POST /api/users/{id}/disable # 禁用用户 +``` + +## 🎯 最佳实践 + +### 1. 开发阶段 +- 使用 Swagger UI 快速测试接口 +- 验证请求参数和响应格式 +- 调试认证和权限问题 + +### 2. 测试阶段 +- 导出 OpenAPI 规范文件 +- 使用 Postman 等工具导入接口 +- 编写自动化测试用例 + +### 3. 文档维护 +- 及时更新接口描述 +- 添加详细的参数说明 +- 提供完整的示例数据 + +## 🔧 自定义配置 + +### 添加新的接口分组 +```java +@Tag(name = "新功能模块", description = "新功能模块的接口说明") +@RestController +@RequestMapping("/api/new-feature") +public class NewFeatureController { + // 接口实现 +} +``` + +### 自定义接口描述 +```java +@Operation(summary = "接口标题", description = "详细的接口描述") +@Parameter(description = "参数说明") +public ResponseEntity methodName(@RequestParam String param) { + // 实现逻辑 +} +``` + +## 📚 相关资源 + +- [OpenAPI 3.0 规范](https://swagger.io/specification/) +- [SpringDoc 官方文档](https://springdoc.org/) +- [Swagger UI 配置选项](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) + +## 🆘 常见问题 + +### Q: 无法访问 Swagger UI +A: 检查应用是否正常启动,确认端口 8080 未被占用 + +### Q: 接口显示不完整 +A: 确认控制器类在 `com.gameplatform.server.controller` 包下 + +### Q: 认证失败 +A: 检查 JWT Token 是否有效,格式是否正确 + +### Q: 参数验证失败 +A: 查看接口文档中的参数要求,确保数据格式正确 diff --git a/docs/game.sql b/docs/game.sql index 44ace88..73ba2e1 100644 --- a/docs/game.sql +++ b/docs/game.sql @@ -11,7 +11,7 @@ Target Server Version : 80043 (8.0.43) File Encoding : 65001 - Date: 24/08/2025 17:24:44 + Date: 24/08/2025 19:08:50 */ SET NAMES utf8mb4; @@ -22,21 +22,21 @@ SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- DROP TABLE IF EXISTS `agent_points_tx`; CREATE TABLE `agent_points_tx` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `account_id` bigint UNSIGNED NOT NULL, - `type` enum('ADD','DEDUCT') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `before_points` bigint UNSIGNED NOT NULL, - `delta_points` bigint NOT NULL, - `after_points` bigint UNSIGNED NOT NULL, - `reason` enum('create_links','manual','refund_no_rollback','other') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'other', - `ref_id` bigint UNSIGNED NULL DEFAULT NULL, - `operator_id` bigint UNSIGNED NULL DEFAULT NULL, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_apx_account_time`(`account_id` ASC, `created_at` ASC) USING BTREE, - INDEX `fk_apx_operator`(`operator_id` ASC) USING BTREE, - CONSTRAINT `fk_apx_account` FOREIGN KEY (`account_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `fk_apx_operator` FOREIGN KEY (`operator_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `account_id` bigint UNSIGNED NOT NULL, + `type` enum('ADD','DEDUCT') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `before_points` bigint UNSIGNED NOT NULL, + `delta_points` bigint NOT NULL, + `after_points` bigint UNSIGNED NOT NULL, + `reason` enum('create_links','manual','refund_no_rollback','other') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'other', + `ref_id` bigint UNSIGNED NULL DEFAULT NULL, + `operator_id` bigint UNSIGNED NULL DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_apx_account_time`(`account_id` ASC, `created_at` ASC) USING BTREE, + INDEX `fk_apx_operator`(`operator_id` ASC) USING BTREE, + CONSTRAINT `fk_apx_account` FOREIGN KEY (`account_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_apx_operator` FOREIGN KEY (`operator_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- @@ -44,14 +44,14 @@ CREATE TABLE `agent_points_tx` ( -- ---------------------------- DROP TABLE IF EXISTS `announcement`; CREATE TABLE `announcement` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `enabled` tinyint(1) NOT NULL DEFAULT 1, - `jump_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT 1, + `jump_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- @@ -59,22 +59,22 @@ CREATE TABLE `announcement` ( -- ---------------------------- DROP TABLE IF EXISTS `link_batch`; CREATE TABLE `link_batch` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `agent_id` bigint UNSIGNED NOT NULL, - `quantity` int UNSIGNED NOT NULL, - `times` int UNSIGNED NOT NULL, - `batch_size` int UNSIGNED NOT NULL, - `deduct_points` bigint UNSIGNED NOT NULL, - `operator_id` bigint UNSIGNED NULL DEFAULT NULL, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_lb_agent_time`(`agent_id` ASC, `created_at` ASC) USING BTREE, - INDEX `fk_lb_operator`(`operator_id` ASC) USING BTREE, - CONSTRAINT `fk_lb_agent` FOREIGN KEY (`agent_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `fk_lb_operator` FOREIGN KEY (`operator_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `chk_lb_batch_pos` CHECK (`batch_size` > 0), - CONSTRAINT `chk_lb_quantity_pos` CHECK (`quantity` > 0), - CONSTRAINT `chk_lb_times_pos` CHECK (`times` > 0) + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `agent_id` bigint UNSIGNED NOT NULL, + `quantity` int UNSIGNED NOT NULL, + `times` int UNSIGNED NOT NULL, + `batch_size` int UNSIGNED NOT NULL, + `deduct_points` bigint UNSIGNED NOT NULL, + `operator_id` bigint UNSIGNED NULL DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_lb_agent_time`(`agent_id` ASC, `created_at` ASC) USING BTREE, + INDEX `fk_lb_operator`(`operator_id` ASC) USING BTREE, + CONSTRAINT `fk_lb_agent` FOREIGN KEY (`agent_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_lb_operator` FOREIGN KEY (`operator_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `chk_lb_batch_pos` CHECK (`batch_size` > 0), + CONSTRAINT `chk_lb_quantity_pos` CHECK (`quantity` > 0), + CONSTRAINT `chk_lb_times_pos` CHECK (`times` > 0) ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- @@ -82,29 +82,29 @@ CREATE TABLE `link_batch` ( -- ---------------------------- DROP TABLE IF EXISTS `link_task`; CREATE TABLE `link_task` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `batch_id` bigint UNSIGNED NOT NULL, - `agent_id` bigint UNSIGNED NOT NULL, - `code_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `token_hash` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `expire_at` datetime(3) NOT NULL, - `status` enum('NEW','USING','LOGGED_IN','REFUNDED','EXPIRED') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'NEW', - `region` enum('Q','V') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `machine_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `login_at` datetime(3) NULL DEFAULT NULL, - `refund_at` datetime(3) NULL DEFAULT NULL, - `revoked_at` datetime(3) NULL DEFAULT NULL, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `uk_code_no`(`code_no` ASC) USING BTREE, - UNIQUE INDEX `uk_token_hash`(`token_hash` ASC) USING BTREE, - INDEX `idx_agent_status`(`agent_id` ASC, `status` ASC) USING BTREE, - INDEX `idx_expire_at`(`expire_at` ASC) USING BTREE, - INDEX `idx_created_at`(`created_at` ASC) USING BTREE, - INDEX `fk_lt_batch`(`batch_id` ASC) USING BTREE, - CONSTRAINT `fk_lt_agent` FOREIGN KEY (`agent_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, - CONSTRAINT `fk_lt_batch` FOREIGN KEY (`batch_id`) REFERENCES `link_batch` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `batch_id` bigint UNSIGNED NOT NULL, + `agent_id` bigint UNSIGNED NOT NULL, + `code_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `token_hash` char(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expire_at` datetime(3) NOT NULL, + `status` enum('NEW','USING','LOGGED_IN','REFUNDED','EXPIRED') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'NEW', + `region` enum('Q','V') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `machine_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `login_at` datetime(3) NULL DEFAULT NULL, + `refund_at` datetime(3) NULL DEFAULT NULL, + `revoked_at` datetime(3) NULL DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_code_no`(`code_no` ASC) USING BTREE, + UNIQUE INDEX `uk_token_hash`(`token_hash` ASC) USING BTREE, + INDEX `idx_agent_status`(`agent_id` ASC, `status` ASC) USING BTREE, + INDEX `idx_expire_at`(`expire_at` ASC) USING BTREE, + INDEX `idx_created_at`(`created_at` ASC) USING BTREE, + INDEX `fk_lt_batch`(`batch_id` ASC) USING BTREE, + CONSTRAINT `fk_lt_agent` FOREIGN KEY (`agent_id`) REFERENCES `user_account` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `fk_lt_batch` FOREIGN KEY (`batch_id`) REFERENCES `link_batch` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- @@ -112,18 +112,18 @@ CREATE TABLE `link_task` ( -- ---------------------------- DROP TABLE IF EXISTS `operation_log`; CREATE TABLE `operation_log` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `actor_type` enum('admin','agent','system','user') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `actor_id` bigint UNSIGNED NULL DEFAULT NULL, - `code_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `op` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `detail` json NULL, - `client_ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_log_code_time`(`code_no` ASC, `created_at` ASC) USING BTREE, - INDEX `idx_log_time`(`created_at` ASC) USING BTREE + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `actor_type` enum('admin','agent','system','user') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `actor_id` bigint UNSIGNED NULL DEFAULT NULL, + `code_no` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `op` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `detail` json NULL, + `client_ip` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `user_agent` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE, + INDEX `idx_log_code_time`(`code_no` ASC, `created_at` ASC) USING BTREE, + INDEX `idx_log_time`(`created_at` ASC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; -- ---------------------------- @@ -131,19 +131,17 @@ CREATE TABLE `operation_log` ( -- ---------------------------- DROP TABLE IF EXISTS `user_account`; CREATE TABLE `user_account` ( - `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, - `user_type` enum('ADMIN','AGENT') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `display_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `password_hash` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, - `role` enum('SUPER','ADMIN') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `status` enum('ENABLED','DISABLED') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'ENABLED', - `points_balance` bigint UNSIGNED NOT NULL DEFAULT 0, - `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX `username`(`username` ASC) USING BTREE, - CONSTRAINT `chk_points_nonneg` CHECK (`points_balance` >= 0) -) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, + `user_type` enum('ADMIN','AGENT') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `password_hash` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `status` enum('ENABLED','DISABLED') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'ENABLED', + `points_balance` bigint UNSIGNED NOT NULL DEFAULT 0, + `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `username`(`username` ASC) USING BTREE, + CONSTRAINT `chk_points_nonneg` CHECK (`points_balance` >= 0) +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; diff --git a/pom.xml b/pom.xml index 6fb87e2..cd1de69 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,13 @@ true + + + org.springdoc + springdoc-openapi-starter-webflux-ui + 2.3.0 + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/gameplatform/server/config/SwaggerConfig.java b/src/main/java/com/gameplatform/server/config/SwaggerConfig.java new file mode 100644 index 0000000..1bd469a --- /dev/null +++ b/src/main/java/com/gameplatform/server/config/SwaggerConfig.java @@ -0,0 +1,39 @@ +package com.gameplatform.server.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.servers.Server; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Configuration +public class SwaggerConfig { + + @Bean + public OpenAPI customOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("游戏平台 API 文档") + .description("游戏平台后端服务 API 接口文档") + .version("1.0.0") + .contact(new Contact() + .name("游戏平台开发团队") + .email("dev@gameplatform.com") + .url("https://gameplatform.com")) + .license(new License() + .name("MIT License") + .url("https://opensource.org/licenses/MIT"))) + .servers(List.of( + new Server() + .url("http://localhost:8080") + .description("本地开发环境"), + new Server() + .url("https://api.gameplatform.com") + .description("生产环境") + )); + } +} diff --git a/src/main/java/com/gameplatform/server/controller/UserController.java b/src/main/java/com/gameplatform/server/controller/UserController.java index b34100f..d4f81de 100644 --- a/src/main/java/com/gameplatform/server/controller/UserController.java +++ b/src/main/java/com/gameplatform/server/controller/UserController.java @@ -5,6 +5,9 @@ import com.gameplatform.server.model.dto.account.AccountResponse; import com.gameplatform.server.model.dto.account.AccountUpdateRequest; import com.gameplatform.server.model.dto.common.PageResult; import com.gameplatform.server.service.account.AccountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @@ -16,6 +19,7 @@ import reactor.core.publisher.Mono; */ @RestController @RequestMapping("/api/users") +@Tag(name = "用户账户管理", description = "用户账户的增删改查操作") public class UserController { private final AccountService accountService; @@ -27,7 +31,8 @@ public class UserController { * 根据ID获取用户账户信息 */ @GetMapping("/{id}") - public Mono getById(@PathVariable Long id) { + @Operation(summary = "获取用户详情", description = "根据用户ID获取用户详细信息") + public Mono getById(@Parameter(description = "用户ID") @PathVariable Long id) { return accountService.get(id); } @@ -35,15 +40,15 @@ public class UserController { * 分页查询用户列表 */ @GetMapping + @Operation(summary = "获取用户列表", description = "分页获取用户列表,支持按用户类型、状态、关键词筛选") public Mono> list( - @RequestParam(value = "userType", required = false) String userType, - @RequestParam(value = "status", required = false) String status, - @RequestParam(value = "role", required = false) String role, - @RequestParam(value = "keyword", required = false) String keyword, - @RequestParam(value = "page", defaultValue = "1") Integer page, - @RequestParam(value = "size", defaultValue = "20") Integer size + @Parameter(description = "用户类型:ADMIN 或 AGENT") @RequestParam(value = "userType", required = false) String userType, + @Parameter(description = "账户状态:ENABLED 或 DISABLED") @RequestParam(value = "status", required = false) String status, + @Parameter(description = "搜索关键词") @RequestParam(value = "keyword", required = false) String keyword, + @Parameter(description = "页码,默认1") @RequestParam(value = "page", defaultValue = "1") Integer page, + @Parameter(description = "每页大小,默认20") @RequestParam(value = "size", defaultValue = "20") Integer size ) { - return accountService.list(userType, status, role, keyword, page, size); + return accountService.list(userType, status, keyword, page, size); } /** @@ -51,6 +56,7 @@ public class UserController { */ @PostMapping @ResponseStatus(HttpStatus.CREATED) + @Operation(summary = "创建用户", description = "创建新的代理用户账户") public Mono create(@Valid @RequestBody AccountCreateRequest request) { return accountService.create(request); } @@ -59,7 +65,8 @@ public class UserController { * 更新用户账户信息 */ @PutMapping("/{id}") - public Mono update(@PathVariable Long id, @Valid @RequestBody AccountUpdateRequest request) { + @Operation(summary = "更新用户", description = "更新用户账户信息") + public Mono update(@Parameter(description = "用户ID") @PathVariable Long id, @Valid @RequestBody AccountUpdateRequest request) { return accountService.update(id, request); } @@ -68,7 +75,8 @@ public class UserController { */ @PostMapping("/{id}/enable") @ResponseStatus(HttpStatus.NO_CONTENT) - public Mono enable(@PathVariable Long id) { + @Operation(summary = "启用用户", description = "启用指定用户账户") + public Mono enable(@Parameter(description = "用户ID") @PathVariable Long id) { return accountService.setStatus(id, "ENABLED").then(); } @@ -77,7 +85,8 @@ public class UserController { */ @PostMapping("/{id}/disable") @ResponseStatus(HttpStatus.NO_CONTENT) - public Mono disable(@PathVariable Long id) { + @Operation(summary = "禁用用户", description = "禁用指定用户账户") + public Mono disable(@Parameter(description = "用户ID") @PathVariable Long id) { return accountService.setStatus(id, "DISABLED").then(); } } \ No newline at end of file diff --git a/src/main/java/com/gameplatform/server/controller/admin/AccountController.java b/src/main/java/com/gameplatform/server/controller/admin/AccountController.java index 4ebbae9..ea9bcde 100644 --- a/src/main/java/com/gameplatform/server/controller/admin/AccountController.java +++ b/src/main/java/com/gameplatform/server/controller/admin/AccountController.java @@ -3,6 +3,9 @@ package com.gameplatform.server.controller.admin; import com.gameplatform.server.model.dto.account.*; import com.gameplatform.server.model.dto.common.PageResult; import com.gameplatform.server.service.account.AccountService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @@ -10,6 +13,7 @@ import reactor.core.publisher.Mono; @RestController @RequestMapping("/api/admin/accounts") +@Tag(name = "管理员账户管理", description = "管理员账户的增删改查操作") public class AccountController { private final AccountService accountService; @@ -18,48 +22,54 @@ public class AccountController { } @GetMapping + @Operation(summary = "获取账户列表", description = "分页获取账户列表,支持按用户类型、状态、关键词筛选") public Mono> list( - @RequestParam(value = "userType", required = false) String userType, - @RequestParam(value = "status", required = false) String status, - @RequestParam(value = "role", required = false) String role, - @RequestParam(value = "keyword", required = false) String keyword, - @RequestParam(value = "page", required = false) Integer page, - @RequestParam(value = "size", required = false) Integer size + @Parameter(description = "用户类型:ADMIN 或 AGENT") @RequestParam(value = "userType", required = false) String userType, + @Parameter(description = "账户状态:ENABLED 或 DISABLED") @RequestParam(value = "status", required = false) String status, + @Parameter(description = "搜索关键词") @RequestParam(value = "keyword", required = false) String keyword, + @Parameter(description = "页码,默认1") @RequestParam(value = "page", required = false) Integer page, + @Parameter(description = "每页大小,默认20,最大200") @RequestParam(value = "size", required = false) Integer size ) { - return accountService.list(userType, status, role, keyword, page, size); + return accountService.list(userType, status, keyword, page, size); } @PostMapping @ResponseStatus(HttpStatus.CREATED) + @Operation(summary = "创建账户", description = "创建新的管理员或代理账户") public Mono create(@Valid @RequestBody AccountCreateRequest req) { return accountService.create(req); } @GetMapping("/{id}") - public Mono detail(@PathVariable Long id) { + @Operation(summary = "获取账户详情", description = "根据账户ID获取账户详细信息") + public Mono detail(@Parameter(description = "账户ID") @PathVariable Long id) { return accountService.get(id); } @PatchMapping("/{id}") - public Mono update(@PathVariable Long id, @Valid @RequestBody AccountUpdateRequest req) { + @Operation(summary = "更新账户", description = "更新账户信息") + public Mono update(@Parameter(description = "账户ID") @PathVariable Long id, @Valid @RequestBody AccountUpdateRequest req) { return accountService.update(id, req); } @PostMapping("/{id}/enable") @ResponseStatus(HttpStatus.NO_CONTENT) - public Mono enable(@PathVariable Long id) { + @Operation(summary = "启用账户", description = "启用指定账户") + public Mono enable(@Parameter(description = "账户ID") @PathVariable Long id) { return accountService.setStatus(id, "ENABLED").then(); } @PostMapping("/{id}/disable") @ResponseStatus(HttpStatus.NO_CONTENT) - public Mono disable(@PathVariable Long id) { + @Operation(summary = "禁用账户", description = "禁用指定账户") + public Mono disable(@Parameter(description = "账户ID") @PathVariable Long id) { return accountService.setStatus(id, "DISABLED").then(); } @PostMapping("/{id}/reset-password") @ResponseStatus(HttpStatus.NO_CONTENT) - public Mono resetPassword(@PathVariable Long id, @Valid @RequestBody ResetPasswordRequest req) { + @Operation(summary = "重置密码", description = "重置指定账户的密码") + public Mono resetPassword(@Parameter(description = "账户ID") @PathVariable Long id, @Valid @RequestBody ResetPasswordRequest req) { return accountService.resetPassword(id, req.getNewPassword(), Boolean.TRUE.equals(req.getForceLogout())); } } diff --git a/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java b/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java index e8a4528..ca47788 100644 --- a/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java +++ b/src/main/java/com/gameplatform/server/mapper/account/UserAccountMapper.java @@ -15,12 +15,10 @@ public interface UserAccountMapper { long countByFilter(@Param("userType") String userType, @Param("status") String status, - @Param("role") String role, @Param("keyword") String keyword); java.util.List listByFilter(@Param("userType") String userType, @Param("status") String status, - @Param("role") String role, @Param("keyword") String keyword, @Param("size") int size, @Param("offset") int offset); diff --git a/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java b/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java new file mode 100644 index 0000000..fd4d781 --- /dev/null +++ b/src/main/java/com/gameplatform/server/mapper/admin/AnnouncementMapper.java @@ -0,0 +1,29 @@ +package com.gameplatform.server.mapper.admin; + +import com.gameplatform.server.model.entity.admin.Announcement; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface AnnouncementMapper { + Announcement findById(@Param("id") Long id); + + int insert(Announcement announcement); + + int update(Announcement announcement); + + int deleteById(@Param("id") Long id); + + List findAll(@Param("size") int size, + @Param("offset") int offset); + + long countAll(); + + List findByEnabled(@Param("enabled") Boolean enabled, + @Param("size") int size, + @Param("offset") int offset); + + long countByEnabled(@Param("enabled") Boolean enabled); + + int updateEnabled(@Param("id") Long id, @Param("enabled") Boolean enabled); +} diff --git a/src/main/java/com/gameplatform/server/mapper/admin/OperationLogMapper.java b/src/main/java/com/gameplatform/server/mapper/admin/OperationLogMapper.java new file mode 100644 index 0000000..bdf238d --- /dev/null +++ b/src/main/java/com/gameplatform/server/mapper/admin/OperationLogMapper.java @@ -0,0 +1,35 @@ +package com.gameplatform.server.mapper.admin; + +import com.gameplatform.server.model.entity.admin.OperationLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface OperationLogMapper { + OperationLog findById(@Param("id") Long id); + + int insert(OperationLog operationLog); + + List findByCodeNo(@Param("codeNo") String codeNo, + @Param("size") int size, + @Param("offset") int offset); + + long countByCodeNo(@Param("codeNo") String codeNo); + + List findByActorId(@Param("actorId") Long actorId, + @Param("size") int size, + @Param("offset") int offset); + + long countByActorId(@Param("actorId") Long actorId); + + List findByActorType(@Param("actorType") String actorType, + @Param("size") int size, + @Param("offset") int offset); + + long countByActorType(@Param("actorType") String actorType); + + List findAll(@Param("size") int size, + @Param("offset") int offset); + + long countAll(); +} diff --git a/src/main/java/com/gameplatform/server/mapper/agent/AgentPointsTxMapper.java b/src/main/java/com/gameplatform/server/mapper/agent/AgentPointsTxMapper.java new file mode 100644 index 0000000..3983587 --- /dev/null +++ b/src/main/java/com/gameplatform/server/mapper/agent/AgentPointsTxMapper.java @@ -0,0 +1,26 @@ +package com.gameplatform.server.mapper.agent; + +import com.gameplatform.server.model.entity.agent.AgentPointsTx; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface AgentPointsTxMapper { + AgentPointsTx findById(@Param("id") Long id); + + int insert(AgentPointsTx agentPointsTx); + + List findByAccountId(@Param("accountId") Long accountId, + @Param("size") int size, + @Param("offset") int offset); + + long countByAccountId(@Param("accountId") Long accountId); + + List findByAccountIdAndType(@Param("accountId") Long accountId, + @Param("type") String type, + @Param("size") int size, + @Param("offset") int offset); + + long countByAccountIdAndType(@Param("accountId") Long accountId, + @Param("type") String type); +} diff --git a/src/main/java/com/gameplatform/server/mapper/agent/LinkBatchMapper.java b/src/main/java/com/gameplatform/server/mapper/agent/LinkBatchMapper.java new file mode 100644 index 0000000..17e904e --- /dev/null +++ b/src/main/java/com/gameplatform/server/mapper/agent/LinkBatchMapper.java @@ -0,0 +1,23 @@ +package com.gameplatform.server.mapper.agent; + +import com.gameplatform.server.model.entity.agent.LinkBatch; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface LinkBatchMapper { + LinkBatch findById(@Param("id") Long id); + + int insert(LinkBatch linkBatch); + + List findByAgentId(@Param("agentId") Long agentId, + @Param("size") int size, + @Param("offset") int offset); + + long countByAgentId(@Param("agentId") Long agentId); + + List findAll(@Param("size") int size, + @Param("offset") int offset); + + long countAll(); +} diff --git a/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java b/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java new file mode 100644 index 0000000..3eb9e03 --- /dev/null +++ b/src/main/java/com/gameplatform/server/mapper/agent/LinkTaskMapper.java @@ -0,0 +1,50 @@ +package com.gameplatform.server.mapper.agent; + +import com.gameplatform.server.model.entity.agent.LinkTask; +import org.apache.ibatis.annotations.Param; + +import java.time.LocalDateTime; +import java.util.List; + +public interface LinkTaskMapper { + LinkTask findById(@Param("id") Long id); + + LinkTask findByCodeNo(@Param("codeNo") String codeNo); + + LinkTask findByTokenHash(@Param("tokenHash") String tokenHash); + + int insert(LinkTask linkTask); + + int update(LinkTask linkTask); + + int updateStatus(@Param("id") Long id, @Param("status") String status); + + int updateStatusAndMachine(@Param("id") Long id, + @Param("status") String status, + @Param("region") String region, + @Param("machineId") String machineId, + @Param("loginAt") LocalDateTime loginAt); + + List findByAgentId(@Param("agentId") Long agentId, + @Param("size") int size, + @Param("offset") int offset); + + long countByAgentId(@Param("agentId") Long agentId); + + List findByAgentIdAndStatus(@Param("agentId") Long agentId, + @Param("status") String status, + @Param("size") int size, + @Param("offset") int offset); + + long countByAgentIdAndStatus(@Param("agentId") Long agentId, + @Param("status") String status); + + List findByBatchId(@Param("batchId") Long batchId, + @Param("size") int size, + @Param("offset") int offset); + + long countByBatchId(@Param("batchId") Long batchId); + + List findExpiredTasks(@Param("expireTime") LocalDateTime expireTime, + @Param("size") int size); +} diff --git a/src/main/java/com/gameplatform/server/model/dto/account/AccountCreateRequest.java b/src/main/java/com/gameplatform/server/model/dto/account/AccountCreateRequest.java index f889b36..5072a2c 100644 --- a/src/main/java/com/gameplatform/server/model/dto/account/AccountCreateRequest.java +++ b/src/main/java/com/gameplatform/server/model/dto/account/AccountCreateRequest.java @@ -1,20 +1,32 @@ package com.gameplatform.server.model.dto.account; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.*; +@Schema(description = "账户创建请求") public class AccountCreateRequest { - @NotBlank + @Schema(description = "用户类型", example = "AGENT", allowableValues = {"ADMIN", "AGENT"}) + @NotBlank(message = "userType 不能为空") + @Pattern(regexp = "^(ADMIN|AGENT)$", message = "userType 只能是 ADMIN 或 AGENT") private String userType; // ADMIN | AGENT - @NotBlank - @Size(min = 3, max = 64) + + @Schema(description = "用户名", example = "newuser", minLength = 3, maxLength = 64) + @NotBlank(message = "username 不能为空") + @Size(min = 3, max = 64, message = "username 长度必须在 3-64 字符之间") + @Pattern(regexp = "^[a-zA-Z0-9_]+$", message = "username 只能包含字母、数字、下划线") private String username; - private String status = "ENABLED"; // ENABLED | DISABLED - @NotBlank - @Size(min = 6, max = 128) + @Schema(description = "密码", example = "123456", minLength = 6, maxLength = 128) + @NotBlank(message = "password 不能为空") + @Size(min = 6, max = 128, message = "password 长度必须在 6-128 字符之间") private String password; + + @Schema(description = "账户状态", example = "ENABLED", allowableValues = {"ENABLED", "DISABLED"}, defaultValue = "ENABLED") + private String status; + + @Schema(description = "积分余额", example = "1000", minimum = "0", defaultValue = "0") @Min(0) - private Long pointsBalance = 0L; // for AGENT + private Long pointsBalance; // for AGENT public String getUserType() { return userType; } public void setUserType(String userType) { this.userType = userType; } diff --git a/src/main/java/com/gameplatform/server/model/dto/account/AccountResponse.java b/src/main/java/com/gameplatform/server/model/dto/account/AccountResponse.java index 5969097..c32b879 100644 --- a/src/main/java/com/gameplatform/server/model/dto/account/AccountResponse.java +++ b/src/main/java/com/gameplatform/server/model/dto/account/AccountResponse.java @@ -1,15 +1,30 @@ package com.gameplatform.server.model.dto.account; +import io.swagger.v3.oas.annotations.media.Schema; + import java.time.LocalDateTime; +@Schema(description = "账户响应") public class AccountResponse { + @Schema(description = "账户ID", example = "1") private Long id; + + @Schema(description = "用户类型", example = "AGENT", allowableValues = {"ADMIN", "AGENT"}) private String userType; + + @Schema(description = "用户名", example = "newuser") private String username; + @Schema(description = "账户状态", example = "ENABLED", allowableValues = {"ENABLED", "DISABLED"}) private String status; + + @Schema(description = "积分余额", example = "1000") private Long pointsBalance; + + @Schema(description = "创建时间", example = "2025-08-24T18:30:00.000") private LocalDateTime createdAt; + + @Schema(description = "更新时间", example = "2025-08-24T18:30:00.000") private LocalDateTime updatedAt; public Long getId() { return id; } diff --git a/src/main/java/com/gameplatform/server/model/dto/account/AccountUpdateRequest.java b/src/main/java/com/gameplatform/server/model/dto/account/AccountUpdateRequest.java index f5defd6..001dbcc 100644 --- a/src/main/java/com/gameplatform/server/model/dto/account/AccountUpdateRequest.java +++ b/src/main/java/com/gameplatform/server/model/dto/account/AccountUpdateRequest.java @@ -1,10 +1,13 @@ package com.gameplatform.server.model.dto.account; -import jakarta.validation.constraints.Size; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Pattern; +@Schema(description = "账户更新请求") public class AccountUpdateRequest { - - private String status; // ENABLED | DISABLED + @Schema(description = "账户状态", example = "ENABLED", allowableValues = {"ENABLED", "DISABLED"}) + @Pattern(regexp = "^(ENABLED|DISABLED)$", message = "status 只能是 ENABLED 或 DISABLED") + private String status; public String getStatus() { return status; } diff --git a/src/main/java/com/gameplatform/server/model/dto/account/ResetPasswordRequest.java b/src/main/java/com/gameplatform/server/model/dto/account/ResetPasswordRequest.java index 85854c8..c7b383a 100644 --- a/src/main/java/com/gameplatform/server/model/dto/account/ResetPasswordRequest.java +++ b/src/main/java/com/gameplatform/server/model/dto/account/ResetPasswordRequest.java @@ -1,12 +1,17 @@ package com.gameplatform.server.model.dto.account; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; +@Schema(description = "重置密码请求") public class ResetPasswordRequest { - @NotBlank - @Size(min = 6, max = 128) + @Schema(description = "新密码", example = "NewPassword123!", minLength = 6, maxLength = 128) + @NotBlank(message = "newPassword 不能为空") + @Size(min = 6, max = 128, message = "newPassword 长度必须在 6-128 字符之间") private String newPassword; + + @Schema(description = "是否强制登出", example = "true", defaultValue = "true") private Boolean forceLogout = Boolean.TRUE; public String getNewPassword() { return newPassword; } diff --git a/src/main/java/com/gameplatform/server/model/entity/account/UserAccount.java b/src/main/java/com/gameplatform/server/model/entity/account/UserAccount.java index 2323624..ae39486 100644 --- a/src/main/java/com/gameplatform/server/model/entity/account/UserAccount.java +++ b/src/main/java/com/gameplatform/server/model/entity/account/UserAccount.java @@ -6,9 +6,7 @@ public class UserAccount { private Long id; private String userType; // ADMIN | AGENT private String username; // 登录名(admin/agent 共用) - private String passwordHash; // BCrypt 或 PLAIN:xxx(初始化用) - private String status; // ENABLED / DISABLED private Long pointsBalance; // 仅 AGENT 使用 private LocalDateTime createdAt; @@ -20,10 +18,8 @@ public class UserAccount { public void setUserType(String userType) { this.userType = userType; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } - public String getPasswordHash() { return passwordHash; } public void setPasswordHash(String passwordHash) { this.passwordHash = passwordHash; } - public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Long getPointsBalance() { return pointsBalance; } diff --git a/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java b/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java new file mode 100644 index 0000000..37f1b3b --- /dev/null +++ b/src/main/java/com/gameplatform/server/model/entity/admin/Announcement.java @@ -0,0 +1,34 @@ +package com.gameplatform.server.model.entity.admin; + +import java.time.LocalDateTime; + +public class Announcement { + private Long id; + private String title; + private String content; + private Boolean enabled; + private String jumpUrl; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + + public Boolean getEnabled() { return enabled; } + public void setEnabled(Boolean enabled) { this.enabled = enabled; } + + public String getJumpUrl() { return jumpUrl; } + public void setJumpUrl(String jumpUrl) { this.jumpUrl = jumpUrl; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } +} diff --git a/src/main/java/com/gameplatform/server/model/entity/admin/OperationLog.java b/src/main/java/com/gameplatform/server/model/entity/admin/OperationLog.java new file mode 100644 index 0000000..3416dbf --- /dev/null +++ b/src/main/java/com/gameplatform/server/model/entity/admin/OperationLog.java @@ -0,0 +1,42 @@ +package com.gameplatform.server.model.entity.admin; + +import java.time.LocalDateTime; + +public class OperationLog { + private Long id; + private String actorType; // admin | agent | system | user + private Long actorId; + private String codeNo; + private String op; + private String detail; // JSON字符串 + private String clientIp; + private String userAgent; + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public String getActorType() { return actorType; } + public void setActorType(String actorType) { this.actorType = actorType; } + + public Long getActorId() { return actorId; } + public void setActorId(Long actorId) { this.actorId = actorId; } + + public String getCodeNo() { return codeNo; } + public void setCodeNo(String codeNo) { this.codeNo = codeNo; } + + public String getOp() { return op; } + public void setOp(String op) { this.op = op; } + + public String getDetail() { return detail; } + public void setDetail(String detail) { this.detail = detail; } + + public String getClientIp() { return clientIp; } + public void setClientIp(String clientIp) { this.clientIp = clientIp; } + + public String getUserAgent() { return userAgent; } + public void setUserAgent(String userAgent) { this.userAgent = userAgent; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/gameplatform/server/model/entity/agent/AgentPointsTx.java b/src/main/java/com/gameplatform/server/model/entity/agent/AgentPointsTx.java new file mode 100644 index 0000000..d59d4ce --- /dev/null +++ b/src/main/java/com/gameplatform/server/model/entity/agent/AgentPointsTx.java @@ -0,0 +1,46 @@ +package com.gameplatform.server.model.entity.agent; + +import java.time.LocalDateTime; + +public class AgentPointsTx { + private Long id; + private Long accountId; + private String type; // ADD | DEDUCT + private Long beforePoints; + private Long deltaPoints; + private Long afterPoints; + private String reason; // create_links | manual | refund_no_rollback | other + private Long refId; + private Long operatorId; + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Long getAccountId() { return accountId; } + public void setAccountId(Long accountId) { this.accountId = accountId; } + + public String getType() { return type; } + public void setType(String type) { this.type = type; } + + public Long getBeforePoints() { return beforePoints; } + public void setBeforePoints(Long beforePoints) { this.beforePoints = beforePoints; } + + public Long getDeltaPoints() { return deltaPoints; } + public void setDeltaPoints(Long deltaPoints) { this.deltaPoints = deltaPoints; } + + public Long getAfterPoints() { return afterPoints; } + public void setAfterPoints(Long afterPoints) { this.afterPoints = afterPoints; } + + public String getReason() { return reason; } + public void setReason(String reason) { this.reason = reason; } + + public Long getRefId() { return refId; } + public void setRefId(Long refId) { this.refId = refId; } + + public Long getOperatorId() { return operatorId; } + public void setOperatorId(Long operatorId) { this.operatorId = operatorId; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/gameplatform/server/model/entity/agent/LinkBatch.java b/src/main/java/com/gameplatform/server/model/entity/agent/LinkBatch.java new file mode 100644 index 0000000..b82848e --- /dev/null +++ b/src/main/java/com/gameplatform/server/model/entity/agent/LinkBatch.java @@ -0,0 +1,38 @@ +package com.gameplatform.server.model.entity.agent; + +import java.time.LocalDateTime; + +public class LinkBatch { + private Long id; + private Long agentId; + private Integer quantity; + private Integer times; + private Integer batchSize; + private Long deductPoints; + private Long operatorId; + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Long getAgentId() { return agentId; } + public void setAgentId(Long agentId) { this.agentId = agentId; } + + public Integer getQuantity() { return quantity; } + public void setQuantity(Integer quantity) { this.quantity = quantity; } + + public Integer getTimes() { return times; } + public void setTimes(Integer times) { this.times = times; } + + public Integer getBatchSize() { return batchSize; } + public void setBatchSize(Integer batchSize) { this.batchSize = batchSize; } + + public Long getDeductPoints() { return deductPoints; } + public void setDeductPoints(Long deductPoints) { this.deductPoints = deductPoints; } + + public Long getOperatorId() { return operatorId; } + public void setOperatorId(Long operatorId) { this.operatorId = operatorId; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java b/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java new file mode 100644 index 0000000..70663f9 --- /dev/null +++ b/src/main/java/com/gameplatform/server/model/entity/agent/LinkTask.java @@ -0,0 +1,62 @@ +package com.gameplatform.server.model.entity.agent; + +import java.time.LocalDateTime; + +public class LinkTask { + private Long id; + private Long batchId; + private Long agentId; + private String codeNo; + private String tokenHash; + private LocalDateTime expireAt; + private String status; // NEW | USING | LOGGED_IN | REFUNDED | EXPIRED + private String region; // Q | V + private String machineId; + private LocalDateTime loginAt; + private LocalDateTime refundAt; + private LocalDateTime revokedAt; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + + public Long getBatchId() { return batchId; } + public void setBatchId(Long batchId) { this.batchId = batchId; } + + public Long getAgentId() { return agentId; } + public void setAgentId(Long agentId) { this.agentId = agentId; } + + public String getCodeNo() { return codeNo; } + public void setCodeNo(String codeNo) { this.codeNo = codeNo; } + + public String getTokenHash() { return tokenHash; } + public void setTokenHash(String tokenHash) { this.tokenHash = tokenHash; } + + public LocalDateTime getExpireAt() { return expireAt; } + public void setExpireAt(LocalDateTime expireAt) { this.expireAt = expireAt; } + + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + + public String getRegion() { return region; } + public void setRegion(String region) { this.region = region; } + + public String getMachineId() { return machineId; } + public void setMachineId(String machineId) { this.machineId = machineId; } + + public LocalDateTime getLoginAt() { return loginAt; } + public void setLoginAt(LocalDateTime loginAt) { this.loginAt = loginAt; } + + public LocalDateTime getRefundAt() { return refundAt; } + public void setRefundAt(LocalDateTime refundAt) { this.refundAt = refundAt; } + + public LocalDateTime getRevokedAt() { return revokedAt; } + public void setRevokedAt(LocalDateTime revokedAt) { this.revokedAt = revokedAt; } + + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + + public LocalDateTime getUpdatedAt() { return updatedAt; } + public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; } +} diff --git a/src/main/java/com/gameplatform/server/service/UserService.java b/src/main/java/com/gameplatform/server/service/UserService.java index 72e4177..fa0e841 100644 --- a/src/main/java/com/gameplatform/server/service/UserService.java +++ b/src/main/java/com/gameplatform/server/service/UserService.java @@ -46,15 +46,15 @@ public class UserService { /** * 分页查询用户列表 */ - public Mono> list(String userType, String status, String role, String keyword, + public Mono> list(String userType, String status, String keyword, Integer page, Integer size) { int p = (page == null || page < 1) ? 1 : page; int s = (size == null || size < 1 || size > 200) ? 20 : size; int offset = (p - 1) * s; return Mono.fromCallable(() -> { - long total = userAccountMapper.countByFilter(userType, status, role, keyword); - List list = userAccountMapper.listByFilter(userType, status, role, keyword, s, offset); + long total = userAccountMapper.countByFilter(userType, status, keyword); + List list = userAccountMapper.listByFilter(userType, status, keyword, s, offset); List items = list.stream() .map(this::toAccountResponse) .collect(Collectors.toList()); @@ -81,8 +81,6 @@ public class UserService { response.setId(account.getId()); response.setUserType(account.getUserType()); response.setUsername(account.getUsername()); - response.setDisplayName(account.getDisplayName()); - response.setRole(account.getRole()); response.setStatus(account.getStatus()); response.setPointsBalance(account.getPointsBalance()); response.setCreatedAt(account.getCreatedAt()); diff --git a/src/main/java/com/gameplatform/server/service/account/AccountService.java b/src/main/java/com/gameplatform/server/service/account/AccountService.java index bd9eb7d..4d23192 100644 --- a/src/main/java/com/gameplatform/server/service/account/AccountService.java +++ b/src/main/java/com/gameplatform/server/service/account/AccountService.java @@ -31,8 +31,8 @@ public class AccountService { int s = (size == null || size < 1 || size > 200) ? 20 : size; int offset = (p - 1) * s; return Mono.fromCallable(() -> { - long total = mapper.countByFilter(userType, status, null, keyword); - List list = mapper.listByFilter(userType, status, null, keyword, s, offset); + long total = mapper.countByFilter(userType, status, keyword); + List list = mapper.listByFilter(userType, status, keyword, s, offset); List items = list.stream().map(this::toResp).collect(Collectors.toList()); return new PageResult<>(items, total, p, s); }) diff --git a/src/main/java/com/gameplatform/server/service/auth/AuthService.java b/src/main/java/com/gameplatform/server/service/auth/AuthService.java index 4161414..69cfe36 100644 --- a/src/main/java/com/gameplatform/server/service/auth/AuthService.java +++ b/src/main/java/com/gameplatform/server/service/auth/AuthService.java @@ -38,7 +38,7 @@ public class AuthService { if (acc == null) { log.warn("login account not found username={}", req.getUsername()); } else { - log.debug("login account loaded id={}, status={}, role={} userType={}", acc.getId(), acc.getStatus(), acc.getRole(), acc.getUserType()); + log.debug("login account loaded id={}, status={}, userType={}", acc.getId(), acc.getStatus(), acc.getUserType()); } }) .flatMap(acc -> validatePasswordAndBuild(acc, req.getPassword())) @@ -73,7 +73,7 @@ public class AuthService { String token = jwtService.generateToken( userType + ":" + acc.getId(), userType, acc.getId(), acc.getUsername(), - "admin".equals(userType) ? Map.of("role", acc.getRole()) : Map.of("displayName", acc.getDisplayName()) + Map.of() ); LoginResponse resp = new LoginResponse(); resp.setAccessToken(token); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 594fce6..f46ffa2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -40,3 +40,16 @@ security: secret: "change-this-secret-to-a-long-random-string-please" access-token-minutes: 30 refresh-token-days: 7 + +# Swagger/OpenAPI 配置 +springdoc: + api-docs: + path: /api-docs + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + doc-expansion: none + disable-swagger-default-url: true + display-request-duration: true + packages-to-scan: com.gameplatform.server.controller diff --git a/src/main/resources/mapper/account/UserAccountMapper.xml b/src/main/resources/mapper/account/UserAccountMapper.xml index 578d906..c99ea1f 100644 --- a/src/main/resources/mapper/account/UserAccountMapper.xml +++ b/src/main/resources/mapper/account/UserAccountMapper.xml @@ -5,9 +5,7 @@ - - @@ -15,7 +13,7 @@ - INSERT INTO user_account (user_type, username, display_name, password_hash, role, status, points_balance) - VALUES (#{userType}, #{username}, #{displayName}, #{passwordHash}, #{role}, #{status}, #{pointsBalance}) + INSERT INTO user_account (user_type, username, password_hash, status, points_balance) + VALUES (#{userType}, #{username}, #{passwordHash}, #{status}, #{pointsBalance}) UPDATE user_account - display_name = #{displayName}, - role = #{role}, status = #{status}, + points_balance = #{pointsBalance}, WHERE id = #{id} @@ -64,22 +61,20 @@ AND user_type = #{userType} AND status = #{status} - AND role = #{role} - AND (username LIKE CONCAT('%', #{keyword}, '%') OR display_name LIKE CONCAT('%', #{keyword}, '%')) + AND username LIKE CONCAT('%', #{keyword}, '%') + SELECT id, title, content, enabled, jump_url, created_at, updated_at + FROM announcement + WHERE id = #{id} + LIMIT 1 + + + + INSERT INTO announcement (title, content, enabled, jump_url) + VALUES (#{title}, #{content}, #{enabled}, #{jumpUrl}) + + + + UPDATE announcement + + title = #{title}, + content = #{content}, + enabled = #{enabled}, + jump_url = #{jumpUrl}, + + WHERE id = #{id} + + + + DELETE FROM announcement WHERE id = #{id} + + + + + + + + + + + + UPDATE announcement SET enabled = #{enabled} WHERE id = #{id} + + diff --git a/src/main/resources/mapper/admin/OperationLogMapper.xml b/src/main/resources/mapper/admin/OperationLogMapper.xml new file mode 100644 index 0000000..4663ac7 --- /dev/null +++ b/src/main/resources/mapper/admin/OperationLogMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + INSERT INTO operation_log (actor_type, actor_id, code_no, op, detail, client_ip, user_agent) + VALUES (#{actorType}, #{actorId}, #{codeNo}, #{op}, #{detail}, #{clientIp}, #{userAgent}) + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/agent/AgentPointsTxMapper.xml b/src/main/resources/mapper/agent/AgentPointsTxMapper.xml new file mode 100644 index 0000000..488603b --- /dev/null +++ b/src/main/resources/mapper/agent/AgentPointsTxMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + INSERT INTO agent_points_tx (account_id, type, before_points, delta_points, after_points, reason, ref_id, operator_id) + VALUES (#{accountId}, #{type}, #{beforePoints}, #{deltaPoints}, #{afterPoints}, #{reason}, #{refId}, #{operatorId}) + + + + + + + + + + diff --git a/src/main/resources/mapper/agent/LinkBatchMapper.xml b/src/main/resources/mapper/agent/LinkBatchMapper.xml new file mode 100644 index 0000000..21cb034 --- /dev/null +++ b/src/main/resources/mapper/agent/LinkBatchMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + INSERT INTO link_batch (agent_id, quantity, times, batch_size, deduct_points, operator_id) + VALUES (#{agentId}, #{quantity}, #{times}, #{batchSize}, #{deductPoints}, #{operatorId}) + + + + + + + + + + diff --git a/src/main/resources/mapper/agent/LinkTaskMapper.xml b/src/main/resources/mapper/agent/LinkTaskMapper.xml new file mode 100644 index 0000000..a71bebe --- /dev/null +++ b/src/main/resources/mapper/agent/LinkTaskMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO link_task (batch_id, agent_id, code_no, token_hash, expire_at, status, region, machine_id, login_at, refund_at, revoked_at) + VALUES (#{batchId}, #{agentId}, #{codeNo}, #{tokenHash}, #{expireAt}, #{status}, #{region}, #{machineId}, #{loginAt}, #{refundAt}, #{revokedAt}) + + + + UPDATE link_task + + status = #{status}, + region = #{region}, + machine_id = #{machineId}, + login_at = #{loginAt}, + refund_at = #{refundAt}, + revoked_at = #{revokedAt}, + + WHERE id = #{id} + + + + UPDATE link_task SET status = #{status} WHERE id = #{id} + + + + UPDATE link_task + SET status = #{status}, region = #{region}, machine_id = #{machineId}, login_at = #{loginAt} + WHERE id = #{id} + + + + + + + + + + + + + + + + diff --git a/target/classes/application.yml b/target/classes/application.yml index 594fce6..f46ffa2 100644 --- a/target/classes/application.yml +++ b/target/classes/application.yml @@ -40,3 +40,16 @@ security: secret: "change-this-secret-to-a-long-random-string-please" access-token-minutes: 30 refresh-token-days: 7 + +# Swagger/OpenAPI 配置 +springdoc: + api-docs: + path: /api-docs + swagger-ui: + path: /swagger-ui.html + tags-sorter: alpha + operations-sorter: alpha + doc-expansion: none + disable-swagger-default-url: true + display-request-duration: true + packages-to-scan: com.gameplatform.server.controller diff --git a/target/classes/com/gameplatform/server/config/SwaggerConfig.class b/target/classes/com/gameplatform/server/config/SwaggerConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..651961f3b799c3f8fb95f872fe187b15c3f9efcb GIT binary patch literal 2207 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 U!g$Pc`)xV~={p9!E3CZtJ8;wbEdT%j literal 4349 zcmd5<>2e!I5bjZI$x;-@F*w8yA)AE5jva3f=OA(pA98Gvk65xG2@qD=u{4RayX?+7 zWhfqjH{cQY0af5sK^6Sx2aiPY&FYpdM|KJdSB-bh?ytMQ=^p+0_piSb(H#;I3NgBp zx669LD08P|$W7ZV>mGNvxU1)FOS*Qcgzg5W=IX-;^)MQEW^5UH$*>CgYVH}&OGf=h zK5zS$Oyj)Bb4IsPon$K&*rHcY=rb)R6O6*s!V>Z>qr~W8g^Xnx^~~8OkI@l28m9=w z866oN%SH)UxiYJvtY}> zGM7c$Tr*sFS#lSGA_XpIx0g&t`e>@*$&_ss5@RWs8+mD~2)JB#{9H+RMMPoQwrq%t zrbWRrr0)W3>0qa)JK`_HPbJ-yc6&(Hx#!rH#}jv^EX$UL6j*08 zm9pJ}?m4co3Y*H(7qVq3S4xlrNn|#v% z{A`8j>+%(N`ZCt(b zZ7mkf6uE|sg507h&W%<$HKDbCs}z~gs+}=SSenFP35&GW+^Y#s!>!hEK}#a9QlN&S z5bQSGf?wvA^t6teYMOUxjKye*K2%BgHlv|EsHn1aIFHOH;h3kLlYYlUH5Z(%#_g3! z^!tBT!|PF%(e>^Vob5Gb(_3AitKE!rz+O=Ny*-Z>rF8T~{HyPa%&jM9GRb*HBS>e@ z4ObdEa=0)9dg@@gFd?pc3#uWTwax7yLnq^uplMtrbze$SSh&Ljle`$kE`oH(rJ@ z-Ef4i3a>}!P-s=X#q(Uf+tG`lAE7=9Q52&Ed_(xgF1|z?|AmhIgi(l&<9~l}@+9@p zTiAPw1~7NBvYSpop8AUgQei*(y?Bh`!{|*KLhmH{Asju0Z$D;-(MFyS^XN3ajkyTJ z#2IuHjyu?@a6~WuOvlD|=$#)isK5wg8-YU&_0hWeC|#g;v0hbw0UME!>HWI;4+8Z{ z#4y&BT0;#+A$!E5F}nDe#v9{_w(+I5@nqXrr^_B)X`H{R#@7Oarr^8?)Wv?IsYio1 zUec{UFlx4FGO#F))5?t%hblXU!@xx}fp!UP5=}?DiiTfxG>s@$Tze<5?F5A0#o9fr zj&Qn9Gl7{$@k*ju%+I0i<>C2u58v$I;RSjC(Tjl?rZg+5RfjL2%T#u%gZj80@00@6 z6z>xuOsIIb;#!2G6hmV{1~D4KF2!;M zbFGP%4+EIPf$wTC*Bd@e?`G&M^oJm)KfpPd*`e$XJ#NRk*yP0iI@bQZX!_+V;1~yi cliM54!*1b($b@Yn;(=cV(c8qhP!D18A9zcr>Hq)$ diff --git a/target/classes/com/gameplatform/server/controller/admin/AccountController.class b/target/classes/com/gameplatform/server/controller/admin/AccountController.class index c14b1fe24909cdbc71bebfb73f29a29031bd96a1..db84bb300ee9d11bc9c3d72c26b8182bb83a3ebd 100644 GIT binary patch literal 5978 zcmcgw`&$&(8U79e%i;h8U|psivvT4=tG1tWQGH{@#D1?k@b~f6%AzncL3pvMz+DeR!5R*YCXF`@P>e zXXao3`T8G3bcC)}QVDJFP^pi~sGQN}GvcTygvDq`=ovaA1$0K`hvlfOH#6GM&^YL& z3i5iW(nlM~$LOVi5)ndTM2dw){j{P+1Wi&$B~=J0QC(HSVHCw+M2-qAfq)W^>TOOt zqbkvC>&Fy1ATc`RFJz8e#Sp=oVOz6iHdRs;ReNZ&j~=2LMlXIhGmJ{ZvIdXOHuy6% z^y{h|4K=N?r8BBaAxU*lvzr?Isw4(F z=Ib-`tcMzW)JVG+J^X-hLQ?v$6lJud;lVa5Xb+=`_Rf9_`#uspwBJY1(E&!yh4h>s z{5}b;_KKP|rl>)SHDnrM+AWRQ?Tl&xC(mmy9i$gL^rDZxPlp&ilo`;fC}By28>It% zCps8yaZR@RAl!ZQl8>6`u({q*MGZ)PC8We5r>$A*Wu_dYW*_~KUWRBOR56VBY<0)S z+=H4LPx5HC`lyZC8EsPCPBLnB&oH#=f@h`g$p_QVsHt#@71?|m2f<4l(vVTLUye%M z@yL**4v0fxwAA>OfEXSWRhieVMrcBYr-ut>L-F0S30rlSqz@~>UQxyVt4k^@R>XmI zU_53loC%-B0Z7)YB=C$#<6I#?9uq?t?vALvQK3_l-$19gUk*i)Ju1rg-DLlN_r}6} zW%2--5>cW;FPuUu#KZb(Cgq$em>5%{n$*;cKSta7aBj&FX;9W=#IPkARluT*5sVJ{ z6*VMiF@8jx=5YY2Bf^+8Bn-*XpddP9g=3Q5CB|a>C}Gs-mlZ)96GJ#6gwf{(Mbunl zHK8Xasm2l*>(Szoh^UT3OH1$HO#e9hS>R z#c&+*tWdF!$f^|Ffa?u0deUUe^bspshl8=Ez1t#hQA0rTFbQUPeS!7X^q; z##INYCk*l;K(3w_OTn#5a2)f>gOV=FVMZk~cIC~k6U;c#7=_&%Z}A)1dgEIroRx!b z=4?7k3%62lpJVh)>c&^8*?E(&&UW{9gCXg~seAvtnVMWcI@&|llG?qZK5UeoTYG+H+x(yA*6MdbP!$-?oGZT6wL4I^E#w+^)ecFy6g96V`4{0LPGv3> zg9^0H&qkl262UfE+1+!ht*3jy*voy%OAFZV9WZ7!HFG{Wf7NdE1ZB-cv&ppN)P3n& zlkVAOHGB5D-Y>AdTDgI?#F)wWE0Q{>oi} zJiHEPUJB7LJh0*sf(6re+3~9Us&%*Q>2lLw*4ZLG>e2&APD#-EqLMV5yjIwq8D5qCId4Z#Rw;;+kde2hA3Fwq7 zq25-)-oMfFdlK}61RY6GOD?IME?Lw&q}DsKsD}z>3dv%21&ZHa0sKV{{?b|%QbHfV dj}rQwu?ko2hp5jv!Tg9WqxWNtu5k0e|1X6hIi>&r literal 5248 zcmd5=*>W326uqt3mZiv!ZIT#gA(IX4#K{0zh@)&?uG5XMqlns_v=%wpq& zExhvwd;$+Zfl~!l@XiCDL~(j%v`e-W7Zl|hO?OZCz2~00bhrQf``6!z=q7y=rVyj+ zX^~g6TAmjS%~=yxUbVTk!7Vi{Ove(2fu@$p>!v!MP7Bv`CQIXC>R{COSliH4Lo>7L z-0EYVb{O?){>()P($k#LwPZ6TQWvJE!HS}eU}c<9*A3m&om-6J!!IjjWSLRNq{#3n z?W6rM3R8^HzTuJO2mx!1I;o4%fuwHoSvSARt(3NE0Q5joq%~t%vvk=H20NUbZZo>k z6wB_c!Kl6&?&L&fUbDcv!!1bcFmxN#eLI{i^SS6)x|xmddE~z7@GQ3~1r>)zk`~v} zj*#xQxLR;mfg=Z(&j?chX=G8)nwsNUoH6!)!q(gad3f4TGmd~s`MfaIc`eHqxa}HF zD~oC(5eo~#w0Zm%{um7{AOrL~U)F6MQ88|s!qFTZGZDf(Tt*e`S zRbAE1jH;F9s&~0FqZJC$xr|O#i!232mF%l6%U}Mx znBHM@_2u@q7>&{e>_bRKMt7R-CoM)1qvO?OM5cOG1?kFgN7D^PYGq6(1!~Z4A!xL> zVy_|9sXo&)Ux3(#er{Ax=QSr++^9XzOvGrCZi3w`$EF(6QOo)&wo%V&WU*U7EFgWRkoWqiMSPQXyVVDg4Dv|7bQ|$KH-1e51nk z%K}L+ck-AQWol7mbaw91PKwu_|=6`J%kD+ z!NF}uP>9nHX(db#7#-c=3>Kq@^bxjTY=S1E6T>^p1n!J(`y}=F1_u3Z`V>3=)cr-z zDn>onvN=u(w(W2AdrAS6=(4O6Wd6-_BA#Pf`dLs9v2r10U1$RqgjBYh6 z?e$f;5uh09^cYtR6rowZS?2m6yjVU+1;G*_gUm4H8TFUHO$eOGG&4qm3J8MK!cv0K zD;0}_2?(Y&vSMVDynaF7w6M}VDYC-Fz@aLALj@-qn2M?)QK@V=t!Qs!QlQ?S26E|*_^2&);H`-zRhA4vGG~OY+qvu}W zIsXgw{D@wN4&b-fTiHh))Q`CX)Q7Rd{%nj4poevyR47Ng69<317#*ZTXdOm7M1%Ay z-dz|S!utpwO?Hmr(=nTl(`zeqqTE+%`X_7pr)v7AYx-yWzO?Kz(1-Dk{zhjX47~Az zM*cw0w@e}+D3=z+ymmCONZK*fg-=8Zo|AY^;W>@x3?3%WPq4|BqKEH(K5PC@75x@;2}}`StVYg~@87 k2TOzvmYh2X=Y77bb3^n6REFqF5BLCDU!nhX$+ge_0V7SUiU0rr diff --git a/target/classes/com/gameplatform/server/mapper/account/UserAccountMapper.class b/target/classes/com/gameplatform/server/mapper/account/UserAccountMapper.class index f1dcec583ff3b6f3fe576ce24a0dd06be1d28cd9..27e4f343ab50c8b31477c1be4ae398f9cde6d7da 100644 GIT binary patch delta 574 zcmaKoKTE?<6vfX?THC}_8?`o8Yn%E9T^yw%T^vLTf*=l#fu=RI8b~5imuw1dC9B`U z&A|`gq_ZEyO}q)QuR1tfI2_LT-TU6B_Nb|^U(YW9TG$+^?|Sjr4ldlziRD?Bc3^vc zv_r<|)XQ{*Xt0pf#U}U!$W7lc|tqR9GUxsjPKmqgekY% z_3eP5oI1TLE4cR9yo*!!Q7_X96$yDhK;cn&$`T0EJetq`SSlGp0W*-0<4~58PMp_B zgz_AkMNx$G6gnBwIW&iPZY89UumG@E65fxsh;qu}BV(44@+Obe#eRb^OMg3+|2tuY zOUqbE7Zv2>C*nobwAhfv21Q6i$SNaNQG=X3sg(VNs58doY4Au`OFp@o9haLN9{=(r OQ@C{@O_u8kXyY5q`8!bn literal 1655 zcmcIk!EVz)5S=xNlQd~afVOF&1=<450rrYiiqs+@0xnbyaN@wm-XvQbujO3_g)iY- zIPd{{6k@zFb-<}WEgV)Jk7wR{Gqav=-@kkXfIYZZ0*k;ySB~g_jdX9DzDG#*JlX54&sjf+sj=l@9c==?K(j4}&Kd_sk` z?Duih1Qxn7j$Do-LGN;Idpt;XflYwGC0s@T6j=rT0s1T_sB1~pC46}XB3Y2G#CTFSeYVP%fSW=7rm zsS#13WnfnSl(ROQvu1Lx!;O^Zejx*|W@alh*E4g&AT1@dWkx3aWt!?$Yx&Ien_vyBJ;cEfo02WG{k8~^|S diff --git a/target/classes/com/gameplatform/server/mapper/admin/AnnouncementMapper.class b/target/classes/com/gameplatform/server/mapper/admin/AnnouncementMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..a4a44f536a8a67aa8366115a24f3b030a93d33cc GIT binary patch literal 1255 zcmbtTTW`}a6h2PZrY-H*ShsR1x5A)(!H+z2AgvNeg-kZ? z{3yh+dr4V~K;ywmVxRNfob%)7x9$Gp;XH@QI};R`WC?;0R>te$KHg=3hi6#t~ng8_Ak!p(Iuwdnyen zOPGJjsTkvSMp;onZ5NW1r!2}jfr^kA1KK(1-B@yeM4(|vmcb!xo&-!IejVMSiFr;3 zn>k^tYl1wDA_A@6Xw;uanQIYIPh=Xk?quStk*X$>jHA@rg$O0nd5W9oTUt(T?Bp%7 zRekiKt)5b^|A9bre$nqF!_@H}Uaq?sDiv`i2U~@^eAzSpx1Rq~zH5~aXDg*g+gPoo z`Sq*{U#u6}A9(GDURpHQT)$9x>ht#^!tC3d!}7|^L4^Q;5{@1~4QHne6>z}CuQH}< zHgPpfO&!;*460bvfF^z{igv-w-0jV+J=p&{)EziLb^}#&poNb^Tt~PZXj|^KQ*gJ6 z*F)sI3->JdeR#0IXqKRZy}#o;v^d>T(cCFsuR%V7$AxACb=`gkd7r@3MGDh8PCGe?dCg-N~?32E^ zl}%2$L%FAfT5jMxL9TPIF68tJ^HHqgen7ww$kP29VwKCki$F{qetkahJgFkhn0ahU z-==KNtP4)X1h)gqk^~x6AxVD0oRAYJ2oKwUc20Y@mfRl_sLE91a2Yq}J(~S23A{`< zXsmpJEgBB{ao0j69BPU{p{##Y$gT>0+@RoYR(4lbt~EB-D7BNll#_4E zIrh06iHzs^XK8;LD$CbFzUR|}k--9CY4;ou+d2yEZ_(+fj| zvaL-omTc`dYx15FKyQe3Yg%O`v>Nsz6FE_`(JCLrM;apsheu;>5+-I2#wQ9qoD}g`dWO zAHa`7ecqO?v@H@UhmqIgnfKnjonOCy{3N1d+HX?8=uKo39*aaSwQzHrCOnhrN~Sy! z%OwsGOXGN`%(t;{(c-koHmS~N=Ul7=*TTg7x5I*pz>8{ z)0m5;h!&EoDbg7iWdSd`K(etCI+u(Z%D@23@^)}Hy~7Ekw*KQ6qt2x#Bk!X(=H(4z zCX?Z%SGiLfR%Z@+nuYPcp`NMlUYMQFGYMhsGZh=*@)XIh{{VJ$w>eHAVmq?1c)Y$A z-@Cy#`~aYr8L?zoVISVHt$%>Z#r&U_qcn` zUA@gZ9Xy!HZC|en`|N~yXUD;2j?x+xPT4urEoPhg$NDKZe2vDN!fqU0R2mw+-Kwhd zs$-i6rRraioCddazzF|h0Pg@e$J}o@jZe%)kv?}ljZy*#>z})bX!9?^6LpLC&JS(d z@tH3i8=jk0$2E1LZb$0x>A@pv!Fk* zeqAy}s;n0UEX3mv?Zz=A6*dyruaGI3`)@n4qk7dbnDq)}pWy94GRnH#L`NZ2JH(YU zma`mF*oV++DwOn4&Z<1wNYqrRltRd^FD#6+=cDVnV7O&K+7sWwCF?Ys9!J7_O_(;6 zaw^f83~myLXya8F7*lze-nz|n~o`-#RV zTxk}eLDc0V<{Pb`|M;Fm>r%wtQ9;V}`ddf1ydm!`Onf=wJ7mI!&Bg=|qU8i?Wc)+y z=n75LoUUu|H^KtsT>q83BX85JMjDOb@+O*2rA7X9DY*N8@ms zq$%YzJ;X_7nu$9VhBy`AG)vc!HiDZY`46~}+?uC_2rr)siYi9wim6y($}A$yO}Z7u z%x8Kri-=poT8`rPGb(6YnMGwTDsxGh%K*4dcc7areQJzW@L0uK!&=8m(cM6~^)VH+ zqRdrgt|8S1Z7MxwszK3L;B=4fM|iX808fgrils2Og23&x${xdvks5$6(E}x~gdZkv zJQJ#U7-wHjRFY(0Rz(fKZ^zloRD{ literal 0 HcmV?d00001 diff --git a/target/classes/com/gameplatform/server/model/dto/account/AccountCreateRequest.class b/target/classes/com/gameplatform/server/model/dto/account/AccountCreateRequest.class index dbdd9134b050f7fe2fd225ea502da71730edea1e..a8f34538efe48280478607472e500fc61befd8b0 100644 GIT binary patch literal 2841 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 literal 1996 zcmbW1TTc@~6vxjL+S0PnQpz3FdcjhZRq?{r1TiKiRf$~Qm+e@Vw7boAO5(TD1Y_cZ zAHWY~{LgH=EtBbsFLQS0+$k*KZ=)r~Nb~7;U>j)2=&B-fB4FOAt2gHV?0O zXg7lzZ`d^v*pBN49bec7k^Ictt-x>dG>tOKUpiNg-EjQ6{ptLYyMj@|tKq!bS5yPP zzRPH=gUBaeTbxm0Kzl4gudnw(!YI`ij_9-*O|$~f7wtC=GPqD=+>kqh*A9?pAqpbA zCbz4B>ond%bAlamWjd`|&n~s+`JQ;qXr#P$#%S~qg=J}krY*`*o>8vq`TS$2c@8?~ zyrJ-9xHBj8^05ThlFl9Ym3J2IOt>sGRY z{0A;Bg4&T2qFI86pc+Tq)409G8_~NBmhtael%_G5BYxj}W-v?FTIT5mm3Jb&A6k?d z^p5T-gVe|Bx}?pzMOkT+L5AoQys$VLyhmwhTQn|9&BO49l92`b!~Q)l^{O%4w2buJ zB8w*AhDZZ$%iXFBUa~luHK3=!7nR=gGk+YENK84mp+JJ%T5N z_av_mUkTY}CDAY?(G(?7vyvcI5-A~bh=5tdI)$AL$sm)JpH%p+%!*i3(IL&?+v+s@JnKJ zAsF4JI|iPT&NF4?xkvX+JSCl{FoZ|;KITa)o(D#rRh?(r$Wu1+tm-_)Av|&hVxElR zSu^rfbe>rw&m%KWMdz6t!Xsxf=E*9a$Hw{D(0S&KJWtH?v!U}W4B?S)BIX%aJWuHv zj;8S4e+<{Osq-uvd0x;<)BJ4eJWE4(h+rj&&ccujs7d|$` zjXPrE-h~?=K}k&X2lzj{@+*wzwwEA;or`LM(gvKaNl6wwp5QqLJDJ4A`lBdXnlV+qlCwIWM=#ao^l93rm zV~k|B?SL~lOE-o*)pj^|8|h6l{u|tTWbk=hAg>7dI_apv)a2zaNFRpoYekQ=J!0sn dtcVJRaf<7t*U^HUXvvE$etO8*M<4NX=`T4Z3{wCA delta 333 zcmZ3-(ap+x>ff$?3=9mm43g{&OcUK4McElx7#Rez63Y_xa}x8?_5G8wQj;gPDax_g zWaed-*fBCNYiNcsGO#%3r=)T*Ff(xTFt9UlOn$^Tg^QDckwKV;ft7)6av4)XJ%b{U z&kQu3k%0*$2xKt>*+A7mk`u_&2hxl{npJB%1J_0%gNcC$NU}i$8F+zg9w?iSfgi{N zx{N^(NTO=q!XUH(O*0oza}K6%5e8A99U$FSK$;0ivuSB>We`HQn;UGm7(@jF#BPwg XK%QV^5CiICWdw3S4iX2FObikL%2^&S diff --git a/target/classes/com/gameplatform/server/model/dto/account/ResetPasswordRequest.class b/target/classes/com/gameplatform/server/model/dto/account/ResetPasswordRequest.class index 4572e92c0cee731d70a62626dbc9203fd9db516a..9d718cc4495faf8df68db0d30b59d9f46c71045b 100644 GIT binary patch delta 805 zcmZ`#O-~b16g_YHfwWc9QYb1&se z-7GlJl2$a0$H}2fZ94d?8_T;-wyGPI`o{`GzuwFI`hDgcW3Z45L-1d5O z8}B!bw;%k`(NK8YZ+u>x(Qf=&8Lf8!t-6&x-NvTm8+Zu|(F^TsBYP zu9$L<=To`cJe60zme?KE!Qg2uE!Vfc?Ema;`Fm~cvA!qyicwhLgB4vGPUDP*v*?~e z56(@Y7k)7GX$asvi7p7bU(iGi;3DlI0I3~^Dk_iBNpQnOKAoiRpwmZIlyymD4PvNG zppAGN?1aPmT}w}5gtQJwgePdSQy8U6cnAzarjy|^LPAfqOs9CW4XwkoN`(YrAnZWl z&1TzSa~Kg)4eNg_zG74BF}0m$u>C+Qe7xr1S40G(i%7qUDB;oclSk9rk4+!LxJW0X m2}pXu>Yi!N;Qh}G`%65S!A-3au9-MtZq`ZD_~@g}PW}ZR2c>fW delta 473 zcmZ`#Jx>Bb5Ph@ULAV^s;R$|w;wOhH#KgkN%HLyR zM|^Xupa~ZHW@cyRy|?=iz7>P_;ma$4BeeQKEYh%_k`zy_Z;mfISLcWJLt5n=`*}g` zvU96x&z_n3)4e$r8+o;E41*f4=NRYPSioW%OIUU{GteIKZ`U9~$O#|9lP9jQIv|5E zhUqgTeMDh^QlGWKDluTB4|vQHW}%xcV-0ndf^}>tksW%~t}ZC8jwKmt?vG|Su|>Kc z(Tq544p14(x$RQ6UHz7JO3EB#mh9WgDJ)ce2Mv{Hz7K2t=x*#`YNCe}%}E}9J=uAf S{>OuU;mAXjdDtZy?0o@^*(ezR diff --git a/target/classes/com/gameplatform/server/model/entity/account/UserAccount.class b/target/classes/com/gameplatform/server/model/entity/account/UserAccount.class index 3a5f26439a7794d69ce07d86ea9397474c53cc03..0670941cfa0b9315c21002d36f4819db383e8706 100644 GIT binary patch literal 2203 zcmbW2TTc@~6oAhZ+EQ5Tl|rF_h?f?W^)3Q}fH9g>CE@ZuY}c}+-EDTK82*(e8WSJ< z0sbiCIn#E#olIYRnKLuzGT)hVX7|tEU%vt16&y@L491c$Za^Fo3^JGeiknUDHq1}w zm$oGsBz7Fv5xWe=D%G~@oj&z|2h1KYo{eY54&?WSqF z!V%Xdw=A#Y3iA||``tN%m{Z5&YJ>A?p4-@__%{qlLx#ab2klR;+ctw-#O_%5PR}xD zKt8l|5rf=k3@Fm3(dI$$#q;a$cyK|AIRi?hNCbk5PC#1=29zm}>9*&%A~@ifxh114 z8L$jD8Kf-V=EAP;<4u&h6vAoQX3evB^9^cFa3!&C8L%onI_-MjWBd^BfkC?Fxc0|R z>m2jp=S`Uq`JZv$p>=O_TwFK-gRR>C-s(1kc*7R&@n&@O5-s{k!s*>4@HdM5G$HmLJq1)DI2FOf!kQ8zXI9JeLeDd+^309kp|=t8lqAolwx8!!o|2a5rM{o%Ri60~JoH9G zp0ecGf^FPV`*~62SU literal 2203 zcmbW1`%e==5XWZ=ZD~1dDG$MdJbX|pa z^(_WNZS+09Y6%9V#O{#{+}^&2APlS)55q5hP$!55!9ZpCl)>Nu9y1REFm6E+ zMi~^Ut|vaWn`a2i&l-xB!kzNKrSHz-pgebxXtVmi%P>%6?@`+@Y zj+*jxgHngcyJA5u=^b^hfT<4?%_HRl3-Y8aV4mb2_65~Ps<)(jWWg}$a;S?|@pKd~ z*>n;6M=__D#tq@R^AgVG`f1&ihT6!Y{l$a0{Q;oxel*tL8jv zbe@IVNKVe1Xj5o2E2}@Ctfww1@5x93QEI}Xvon}Ozcdaz8V2*KI6BXw&NF7@xeND9 zJc~Ndcpo0>LClj?Jok+}OFGYlk!RV=v!wG(_TiyfhP&}{knS#B4no2(= diff --git a/target/classes/com/gameplatform/server/model/entity/admin/Announcement.class b/target/classes/com/gameplatform/server/model/entity/admin/Announcement.class new file mode 100644 index 0000000000000000000000000000000000000000..cd8f5336ddcc6eab1b42fabf663b7445a6946242 GIT binary patch literal 2033 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 DRS#|r literal 0 HcmV?d00001 diff --git a/target/classes/com/gameplatform/server/model/entity/agent/LinkBatch.class b/target/classes/com/gameplatform/server/model/entity/agent/LinkBatch.class new file mode 100644 index 0000000000000000000000000000000000000000..792655d9095f5d61c434d24ed8a44f1926d04326 GIT binary patch literal 2181 zcmbW2>rWFw5Wr^(eNe8nv`{FNr=Tq;=L1mzQ64cNse*y<{d!%?VS9(yEs6eBnrKY? z;2+>0Wt`cT>#=UX@MY(A9y`CCnQj04{q-9FUcz1yA}|n#K?9-?W01M9t}L@*xpniX zdckeMAhzwej@V%^P%57dK>~*2kThTz3Bv@mkv!$DZQ~={{?~ z92t_{CHF1i`5lA>0~X;9o?`pl61=vHbt!ZhD3e+7Y^!mAmQ&nqF&Ny(`!h)6o%y?V zv&#KbtJ*+KR(hUUzC-)2a!{N*Ee0Ev+f);?MeAG~Vnws1a;Pq{rf6(+jJc9(E1zK# z-g0s7)s8J6n<%)C7)d;BmpVpACNVnL45Q_J(1YHMsUiom^YbVN_z{99o zm@$D7-A@Cxa!9CC*dMfnwrR8;ggS;5Mu(f46#5(m&0~;4kMN!{?Dx7jeSHgUA1Qyx zx!Apo#+R;?Jn`DT&EGiG>5*XG*J#dR0mm+aZ;n=cJNOl$QI`_OTS}Z=DRE+@#2J+m zM^Z|hL6oC_U4OW%UQd)zldoo$q)+CpBTw-5ET%&7m2zb(x=OH}O)F-3zjB9xw!xLS7GAd8L4-d^kz>}3c>sp>Mm1k1R^Hk3> zrt%c}@X$;KJbB5pq2-xSd8V~I&-6SKDo?Qw550|mryzNrYv*T5<(bv;ywK0jl*%*L zhlk#1z*Cewn_8Y3m1jZAv!&;mQF#{o@X&8Xz%wU#w(*bt|Mxzx@+@h2cHot6p66Ab T!HB^7P)j$tKRZ`=wuYcJ91AnYpv@@zX#50>CExG6*R+lZHM8{V-s`=m+Q2 zvFnakwO<{5(B;sAfeqJl!$%gJ$>k3-a27IY7*sF>%7T@$->|DrL!Z>0@Vy^2?4}M* zbznFAimuz*3*GQH+o|GVzcw3Tt4J>P zaRa@DKXNh}AG!@~7yYtRf9iy~gf(VeRd9`$YlcqPYSJ9n72M!ZpsTL$QRt?ETfA7q zDc4+2N7S5xJS~>4`&HN53aRIUg4+xT^!t`qiGoWCYzk%qeTv$4^p1kN94!YLN$u!8 z1*;rwom8Tz1%2DN7Z!}*KI^?!<46Z3=cta6EdQWGCvd6W4)%pLw`sv@@qe7)x&{4J z9q!;MW^?(To#%7J#%9zwmNVP(hj{S2I;{DX*G_Gpa;S6Y_z2b@e1Gk(YTK4(-E@4ORpx06;8v!_b?SB%mt+NHQcKVZL|WD&7j zqdE6GxfadYTgBGxPR>QGy;W>|)6G5Fww~(Xf!_+s`ngN#H{7}SOLXC37V|%a-=1^$ z#BT_`rRdIciT9jKyxUyj-Q^N*E0=f)xx|~tC0;i!@q%%Qmx@cgM_l5~;S%o(mRA5% z69({kA8R(27MA^mzrp&0yFI`sHDeIIz^7`zKZG@`S+EWp`22kEpOF3?8&l97JT4C2 zgh$wm2CrdBJ1|gK_zTkJ(i1#-BI*Ir(!`>@vfwd}>&Jt{!h$bF&#>vaBzm@F&#>v4 zOz_Z|#hwxNJP|#kre{j@Y|EZe(=(mmq1=f*S@t}IXBaZiYs~b_h@R*0m2_TXrsryc zhjKXfjI-y3=(%WmW<}4A?73)qt|xftF2$Zn_Pm6zh5fl~dgeq=5q72hxomoFCV1#h z$DV2S?1}p`V|wOA&ntO3NXgp}&E#$7atv(X(uN9*UmtWzVwd rSxfNH-{RPFmpwm-o)y!xA$oq4Ju9YXGr>du6U3fX_WXp;6#V=jpai@* literal 0 HcmV?d00001 diff --git a/target/classes/com/gameplatform/server/service/UserService.class b/target/classes/com/gameplatform/server/service/UserService.class index 13db20ae62868117768a2839d0dabda6236b95bd..395a01335344e97237124e93d464f9200e242ac0 100644 GIT binary patch delta 2241 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 r0r&2hJY?S;=V8r=`!4Ff8Vh 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 F_zpB|rOp5V diff --git a/target/classes/mapper/account/UserAccountMapper.xml b/target/classes/mapper/account/UserAccountMapper.xml index 578d906..c99ea1f 100644 --- a/target/classes/mapper/account/UserAccountMapper.xml +++ b/target/classes/mapper/account/UserAccountMapper.xml @@ -5,9 +5,7 @@ - - @@ -15,7 +13,7 @@ - INSERT INTO user_account (user_type, username, display_name, password_hash, role, status, points_balance) - VALUES (#{userType}, #{username}, #{displayName}, #{passwordHash}, #{role}, #{status}, #{pointsBalance}) + INSERT INTO user_account (user_type, username, password_hash, status, points_balance) + VALUES (#{userType}, #{username}, #{passwordHash}, #{status}, #{pointsBalance}) UPDATE user_account - display_name = #{displayName}, - role = #{role}, status = #{status}, + points_balance = #{pointsBalance}, WHERE id = #{id} @@ -64,22 +61,20 @@ AND user_type = #{userType} AND status = #{status} - AND role = #{role} - AND (username LIKE CONCAT('%', #{keyword}, '%') OR display_name LIKE CONCAT('%', #{keyword}, '%')) + AND username LIKE CONCAT('%', #{keyword}, '%') + SELECT id, title, content, enabled, jump_url, created_at, updated_at + FROM announcement + WHERE id = #{id} + LIMIT 1 + + + + INSERT INTO announcement (title, content, enabled, jump_url) + VALUES (#{title}, #{content}, #{enabled}, #{jumpUrl}) + + + + UPDATE announcement + + title = #{title}, + content = #{content}, + enabled = #{enabled}, + jump_url = #{jumpUrl}, + + WHERE id = #{id} + + + + DELETE FROM announcement WHERE id = #{id} + + + + + + + + + + + + UPDATE announcement SET enabled = #{enabled} WHERE id = #{id} + + diff --git a/target/classes/mapper/admin/OperationLogMapper.xml b/target/classes/mapper/admin/OperationLogMapper.xml new file mode 100644 index 0000000..4663ac7 --- /dev/null +++ b/target/classes/mapper/admin/OperationLogMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + INSERT INTO operation_log (actor_type, actor_id, code_no, op, detail, client_ip, user_agent) + VALUES (#{actorType}, #{actorId}, #{codeNo}, #{op}, #{detail}, #{clientIp}, #{userAgent}) + + + + + + + + + + + + + + + + + + diff --git a/target/classes/mapper/agent/AgentPointsTxMapper.xml b/target/classes/mapper/agent/AgentPointsTxMapper.xml new file mode 100644 index 0000000..488603b --- /dev/null +++ b/target/classes/mapper/agent/AgentPointsTxMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + INSERT INTO agent_points_tx (account_id, type, before_points, delta_points, after_points, reason, ref_id, operator_id) + VALUES (#{accountId}, #{type}, #{beforePoints}, #{deltaPoints}, #{afterPoints}, #{reason}, #{refId}, #{operatorId}) + + + + + + + + + + diff --git a/target/classes/mapper/agent/LinkBatchMapper.xml b/target/classes/mapper/agent/LinkBatchMapper.xml new file mode 100644 index 0000000..21cb034 --- /dev/null +++ b/target/classes/mapper/agent/LinkBatchMapper.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + INSERT INTO link_batch (agent_id, quantity, times, batch_size, deduct_points, operator_id) + VALUES (#{agentId}, #{quantity}, #{times}, #{batchSize}, #{deductPoints}, #{operatorId}) + + + + + + + + + + diff --git a/target/classes/mapper/agent/LinkTaskMapper.xml b/target/classes/mapper/agent/LinkTaskMapper.xml new file mode 100644 index 0000000..a71bebe --- /dev/null +++ b/target/classes/mapper/agent/LinkTaskMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO link_task (batch_id, agent_id, code_no, token_hash, expire_at, status, region, machine_id, login_at, refund_at, revoked_at) + VALUES (#{batchId}, #{agentId}, #{codeNo}, #{tokenHash}, #{expireAt}, #{status}, #{region}, #{machineId}, #{loginAt}, #{refundAt}, #{revokedAt}) + + + + UPDATE link_task + + status = #{status}, + region = #{region}, + machine_id = #{machineId}, + login_at = #{loginAt}, + refund_at = #{refundAt}, + revoked_at = #{revokedAt}, + + WHERE id = #{id} + + + + UPDATE link_task SET status = #{status} WHERE id = #{id} + + + + UPDATE link_task + SET status = #{status}, region = #{region}, machine_id = #{machineId}, login_at = #{loginAt} + WHERE id = #{id} + + + + + + + + + + + + + + + + diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index e69de29..ba69f71 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,34 @@ +com\gameplatform\server\mapper\agent\LinkTaskMapper.class +com\gameplatform\server\exception\GlobalExceptionHandler$2.class +com\gameplatform\server\model\entity\admin\Announcement.class +com\gameplatform\server\mapper\agent\AgentPointsTxMapper.class +com\gameplatform\server\config\CorsConfig.class +com\gameplatform\server\exception\GlobalExceptionHandler.class +com\gameplatform\server\model\dto\common\PageResult.class +com\gameplatform\server\service\UserService.class +com\gameplatform\server\controller\auth\AuthController.class +com\gameplatform\server\model\entity\agent\AgentPointsTx.class +com\gameplatform\server\controller\admin\AccountController.class +com\gameplatform\server\GamePlatformServerApplication.class +com\gameplatform\server\model\dto\auth\LoginRequest.class +com\gameplatform\server\model\entity\account\UserAccount.class +com\gameplatform\server\mapper\admin\AnnouncementMapper.class +com\gameplatform\server\model\dto\auth\LoginResponse.class +com\gameplatform\server\model\entity\agent\LinkTask.class +com\gameplatform\server\service\auth\AuthService.class +com\gameplatform\server\config\SwaggerConfig.class +com\gameplatform\server\exception\GlobalExceptionHandler$1.class +com\gameplatform\server\mapper\account\UserAccountMapper.class +com\gameplatform\server\mapper\agent\LinkBatchMapper.class +com\gameplatform\server\security\JwtService.class +com\gameplatform\server\mapper\admin\OperationLogMapper.class +com\gameplatform\server\model\entity\agent\LinkBatch.class +com\gameplatform\server\service\account\AccountService.class +com\gameplatform\server\controller\UserController.class +com\gameplatform\server\security\SecurityConfig.class +com\gameplatform\server\model\entity\admin\OperationLog.class +com\gameplatform\server\model\dto\account\AccountResponse.class +com\gameplatform\server\model\dto\account\AccountCreateRequest.class +com\gameplatform\server\model\dto\account\AccountUpdateRequest.class +com\gameplatform\server\controller\auth\AuthController$1.class +com\gameplatform\server\model\dto\account\ResetPasswordRequest.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 7916b02..7079876 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,20 +1,31 @@ -D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\GamePlatformServerApplication.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\agent\AgentPointsTxMapper.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\admin\AnnouncementMapper.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\security\SecurityConfig.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\account\ResetPasswordRequest.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\service\account\AccountService.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\service\auth\AuthService.java -D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\account\AccountUpdateRequest.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\auth\LoginRequest.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\controller\admin\AccountController.java -D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\auth\LoginResponse.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\controller\UserController.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\agent\LinkBatchMapper.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\agent\LinkTaskMapper.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\config\SwaggerConfig.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\account\AccountResponse.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\admin\OperationLog.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\service\UserService.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\controller\auth\AuthController.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\security\JwtService.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\config\CorsConfig.java -D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\exception\GlobalExceptionHandler.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\common\PageResult.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\GamePlatformServerApplication.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\agent\LinkTask.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\account\AccountUpdateRequest.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\admin\Announcement.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\agent\AgentPointsTx.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\auth\LoginResponse.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\admin\OperationLogMapper.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\exception\GlobalExceptionHandler.java +D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\agent\LinkBatch.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\mapper\account\UserAccountMapper.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\dto\account\AccountCreateRequest.java D:\project\gamePlatform\server\src\main\java\com\gameplatform\server\model\entity\account\UserAccount.java