diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..057b86be --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +.claude +.idea +.lingma +./qoder/ \ No newline at end of file diff --git a/.drone.yml.bak b/.drone.yml.bak deleted file mode 100644 index 32504b63..00000000 --- a/.drone.yml.bak +++ /dev/null @@ -1,220 +0,0 @@ ---- -kind: pipeline -type: ssh -name: master-machine - -server: - host: 121.37.253.228 - user: www - password: - from_secret: www_password - -clone: - depth: 1 - -steps: - - name: build new image - commands: - - docker build --no-cache -t kami_backend:${DRONE_BRANCH}${DRONE_BUILD_NUMBER} -f ./manifest/docker/Dockerfile --build-arg USE_PROXY=1 . - - name: deploy to docker compose - commands: - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml down - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml up -d - - name: push to docker registry - commands: - - docker save -o /tmp/kami_backend.tar kami_backend:${DRONE_BRANCH}${DRONE_BUILD_NUMBER} - - mv ./manifest/docker/docker-compose.yml /tmp/ - -trigger: - branch: - - develop - - production - when: - event: - - push - ---- -kind: pipeline -type: ssh -name: 绝技服务器 - -server: - host: 43.133.200.219 - user: ubuntu - password: - from_secret: flower - -clone: - disable: true - -steps: - - name: copy file - commands: - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com www@121.37.253.228:/tmp/kami_backend.tar ./ - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com www@121.37.253.228:/tmp/docker-compose.yml ./ - environment: - PASSWORD: - from_secret: www_password - - name: pull image - commands: - - docker load -i kami_backend.tar - - name: copy tar to tmp dictionary - commands: - - sudo mv kami_backend.tar /tmp/ - - sudo mv docker-compose.yml /tmp/ - # - name: clean old container - # commands: - # - docker container inspect kami_backend &> /dev/null && docker container rm -f kami_backend - # - name: run docker compose - # commands: - # - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml down - # - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml up -d - - name: clean unused image - commands: - - docker image prune -af - -depends_on: - - master-machine - -trigger: - status: - - success - - failure - branch: - - production - when: - event: - - push - ---- -kind: pipeline -type: ssh -name: 小L的服务器 - -server: - host: 43.130.238.110 - user: ubuntu - password: - from_secret: ubuntu_L - -clone: - disable: true - -steps: - - name: copy file - commands: - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com ubuntu@43.133.200.219:/tmp/kami_backend.tar ./ - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com ubuntu@43.133.200.219:/tmp/docker-compose.yml ./ - environment: - PASSWORD: - from_secret: flower - - name: pull image - commands: - - docker load -i kami_backend.tar - - name: clean old container - commands: - - docker container inspect kami_backend &> /dev/null && docker container rm -f kami_backend - - name: run docker compose - commands: - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml down - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml up -d - - name: clean unused image - commands: - - docker image prune -af - -depends_on: - - 绝技服务器 - -trigger: - branch: - - production - status: - - success - - failure - when: - event: - - push - ---- -kind: pipeline -type: ssh -name: 泼兔的服务器 - -server: - host: 43.163.223.93 - user: ubuntu - password: - from_secret: ubuntu-crazy_rabbit - -clone: - disable: true - -steps: - - name: copy file - commands: - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com ubuntu@43.133.200.219:/tmp/kami_backend.tar ./ - - sshpass -p $PASSWORD scp -C -c chacha20-poly1305@openssh.com ubuntu@43.133.200.219:/tmp/docker-compose.yml ./ - environment: - PASSWORD: - from_secret: flower - - name: pull image - commands: - - docker load -i kami_backend.tar - - name: clean old container - commands: - - docker container inspect kami_backend &> /dev/null && docker container rm -f kami_backend - - name: run docker compose - commands: - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml down - - VERSION=${DRONE_BRANCH}${DRONE_BUILD_NUMBER} USE_PROXY=1 docker compose -f ./manifest/docker/docker-compose.yml up -d - - name: clean unused image - commands: - - docker image prune -af - -depends_on: - - 绝技服务器 - -trigger: - status: - - success - - failure - branch: - - production - when: - event: - - push - ---- -kind: pipeline -type: docker -name: server酱微信通知 - -depends_on: - - 泼兔的服务器 - - 小L的服务器 -steps: - - name: send-wechat - image: plugins/webhook - pull: if-not-exists - settings: - urls: https://open.feishu.cn/open-apis/bot/v2/hook/1f4a9795-84a9-4cc5-b2c5-0bf05686336b - content_type: application/json - template: | - { - "msg_type":"text", - "content": - { - "text": "项目名称: ${DRONE_REPO_NAME}\n分支:${DRONE_BRANCH}\n构建编号:${DRONE_BUILD_NUMBER}\n项目构建状态:{{ build.status }}" - } - } - -trigger: - branch: - - develop - - production - status: - - success - - failure - when: - event: - - push diff --git a/.qoder/repowiki/zh/content/API端点参考/API端点参考.md b/.qoder/repowiki/zh/content/API端点参考/API端点参考.md new file mode 100644 index 00000000..92edd9c8 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/API端点参考.md @@ -0,0 +1,557 @@ +# API端点参考 + + +**本文档中引用的文件** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_c_trip.go](file://api/card_info_c_trip/card_info_c_trip.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [order.go](file://api/order/order.go) +- [merchant.go](file://api/merchant/merchant.go) +- [sysUser.go](file://api/sysUser/sysUser.go) +- [monitor.go](file://api/monitor/monitor.go) +- [restriction.go](file://api/restriction/restriction.go) +- [common.go](file://api/commonApi/common.go) +- [config.go](file://internal/consts/sys_config_dict.go) + + +## 目录 +1. [简介](#简介) +2. [API架构概述](#api架构概述) +3. [权限管理模块](#权限管理模块) +4. [卡密信息管理模块](#卡密信息管理模块) +5. [订单处理模块](#订单处理模块) +6. [商户管理模块](#商户管理模块) +7. [系统监控模块](#系统监控模块) +8. [限制管理模块](#限制管理模块) +9. [认证与安全](#认证与安全) +10. [错误处理策略](#错误处理策略) +11. [速率限制](#速率限制) +12. [客户端实现指南](#客户端实现指南) +13. [性能优化建议](#性能优化建议) + +## 简介 +本文档提供了kami_backend系统所有公共API端点的完整参考。文档覆盖了权限管理、卡密信息管理、订单处理、商户管理、系统监控和限制管理等核心模块。每个API端点都详细记录了HTTP方法、URL模式、请求/响应模式、认证方法和参数说明。文档基于代码库中的实际实现,确保与系统真实数据结构和接口定义完全一致。 + +## API架构概述 +系统采用基于GoFrame框架的RESTful API架构,所有API端点遵循统一的版本控制和响应格式。API基础路径为`/api/v1`,支持JSON格式的数据交换。系统实现了统一的错误处理机制和认证授权体系。 + +```mermaid +graph TB +Client[客户端] --> |HTTP请求| APIGateway[API网关] +APIGateway --> Auth[认证中间件] +Auth --> RateLimit[速率限制] +RateLimit --> Controller[控制器层] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> Database[(数据库)] +subgraph "核心模块" +Controller --> CardInfo[卡密信息管理] +Controller --> Order[订单处理] +Controller --> Merchant[商户管理] +Controller --> Monitor[系统监控] +Controller --> Restriction[限制管理] +end +``` + +**图源** +- [main.go](file://main.go) +- [middleware/auth.go](file://internal/middleware/auth.go) +- [controller目录](file://internal/controller/) + +## 权限管理模块 +权限管理模块提供用户、角色和菜单的完整管理功能,支持基于RBAC(基于角色的访问控制)的权限体系。 + +### 用户管理 +提供用户创建、删除、更新和查询功能,支持用户状态管理和权限分配。 + +**端点列表** +- `POST /api/v1/sysUser/user/add` - 创建用户 +- `DELETE /api/v1/sysUser/user/delete` - 删除用户 +- `PUT /api/v1/sysUser/user/edit` - 编辑用户 +- `GET /api/v1/sysUser/user/get/all` - 获取所有用户 +- `PUT /api/v1/sysUser/user/forbidden/by/id` - 禁用/启用用户 + +**请求参数示例** +```json +{ + "username": "example_user", + "password": "encrypted_password", + "roleId": 1, + "status": 1 +} +``` + +**响应格式** +```json +{ + "code": 0, + "message": "操作成功", + "data": { + "userId": "123456" + } +} +``` + +**节源** +- [sysUser.go](file://api/sysUser/v1/sysUser.go) +- [sysUser_controller.go](file://internal/controller/sysUser/sysUser_v1_user_add.go) + +### 角色管理 +管理角色定义和权限分配,支持角色的增删改查操作。 + +**端点列表** +- `POST /api/v1/sysRole/role/add` - 添加角色 +- `DELETE /api/v1/sysRole/role/delete` - 删除角色 +- `PUT /api/v1/sysRole/role/edit` - 编辑角色 +- `GET /api/v1/sysRole/role/list` - 获取角色列表 + +**节源** +- [sys_role.go](file://api/sys_role/v1/sys_role.go) +- [sys_role_controller.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) + +### 菜单管理 +管理系统菜单结构和权限规则,支持菜单的层级管理和动态配置。 + +**端点列表** +- `POST /api/v1/authority/menu/create` - 创建菜单 +- `DELETE /api/v1/authority/menu/delete` - 删除菜单 +- `PUT /api/v1/authority/menu/update` - 更新菜单 +- `GET /api/v1/authority/menu/list` - 获取菜单列表 + +**节源** +- [menu.go](file://api/authority/v1/menu.go) +- [authority_controller.go](file://internal/controller/authority/authority_v1_menu_create.go) + +## 卡密信息管理模块 +卡密信息管理模块支持多种平台的卡密信息管理,包括Apple、京东、沃尔玛、C-Trip和天猫游戏等。 + +### Apple卡密管理 +提供Apple卡密的全生命周期管理,包括卡密的创建、查询、更新和删除。 + +**端点列表** +- `POST /api/v1/card_info_apple/card/info/create` - 创建Apple卡密 +- `GET /api/v1/card_info_apple/card/info/list` - 获取卡密列表 +- `PUT /api/v1/card_info_apple/card/info/update` - 更新卡密信息 +- `DELETE /api/v1/card_info_apple/card/info/delete` - 删除卡密 +- `PUT /api/v1/card_info_apple/card/info/suspend_or_continue` - 暂停/继续卡密 + +**请求参数说明** +- `cardNumber`: 卡密号码 +- `password`: 卡密密码 +- `status`: 卡密状态(1:启用, 0:禁用) +- `batchId`: 批次ID + +**节源** +- [card_info_apple.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_controller.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) + +### 京东卡密管理 +管理京东平台的卡密信息,支持批量操作和历史记录查询。 + +**端点列表** +- `POST /api/v1/card_info_jd/jd/account/create` - 创建京东账号 +- `GET /api/v1/card_info_jd/jd/account/list` - 获取账号列表 +- `PUT /api/v1/card_info_jd/jd/account/update` - 更新账号信息 +- `POST /api/v1/card_info_jd/jd/account/cookie/batch/add` - 批量添加Cookie +- `GET /api/v1/card_info_jd/jd/account/wallet/list` - 获取钱包列表 + +**节源** +- [card_info_jd.go](file://api/card_info_jd/v1/account.go) +- [card_info_jd_controller.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) + +### 沃尔玛卡密管理 +提供沃尔玛平台卡密的全面管理功能。 + +**端点列表** +- `POST /api/v1/card_info_walmart/account/create` - 创建沃尔玛账号 +- `GET /api/v1/card_info_walmart/account/list` - 获取账号列表 +- `PUT /api/v1/card_info_walmart/account/update` - 更新账号信息 +- `GET /api/v1/card_info_walmart/account/wallet/list` - 获取钱包列表 +- `GET /api/v1/card_info_walmart/order/summary/list` - 订单汇总列表 + +**节源** +- [card_info_walmart.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_controller.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) + +### C-Trip卡密管理 +管理C-Trip平台的卡密信息。 + +**端点列表** +- `POST /api/v1/card_info_c_trip/account/create` - 创建C-Trip账号 +- `GET /api/v1/card_info_c_trip/account/list` - 获取账号列表 +- `PUT /api/v1/card_info_c_trip/account/update` - 更新账号信息 +- `POST /api/v1/card_info_c_trip/account/cookie/batch/add` - 批量添加Cookie + +**节源** +- [card_info_c_trip.go](file://api/card_info_c_trip/v1/account.go) +- [card_info_c_trip_controller.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) + +### 天猫游戏卡密管理 +提供天猫游戏平台卡密的管理功能。 + +**端点列表** +- `POST /api/v1/card_info_t_mall_game/t_mall_game/account/create` - 创建天猫游戏账号 +- `GET /api/v1/card_info_t_mall_game/t_mall_game/account/list` - 获取账号列表 +- `PUT /api/v1/card_info_t_mall_game/t_mall_game/account/toggle` - 切换账号状态 +- `GET /api/v1/card_info_t_mall_game/t_mall_game/order/list` - 获取订单列表 +- `POST /api/v1/card_info_t_mall_game/t_mall_game/order/submit` - 提交订单 + +**节源** +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/v1/account.go) +- [card_info_t_mall_game_controller.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go) + +## 订单处理模块 +订单处理模块负责所有平台的订单生命周期管理,包括订单创建、查询、更新和回调处理。 + +### 订单管理 +提供统一的订单管理接口,支持多平台订单的集中处理。 + +**端点列表** +- `POST /api/v1/order/form/create` - 创建订单 +- `GET /api/v1/order/form/list` - 获取订单列表 +- `PUT /api/v1/order/form/update` - 更新订单 +- `DELETE /api/v1/order/form/delete` - 删除订单 +- `GET /api/v1/order/summary/get/list` - 获取订单汇总 + +**请求参数说明** +- `orderId`: 订单ID +- `platform`: 平台类型(apple, jd, walmart等) +- `amount`: 订单金额 +- `status`: 订单状态 +- `userId`: 用户ID + +**响应格式** +```json +{ + "code": 0, + "message": "success", + "data": { + "list": [ + { + "orderId": "ORD123456", + "platform": "apple", + "amount": 100.00, + "status": "completed", + "createdAt": "2023-01-01T00:00:00Z" + } + ], + "total": 1 + } +} +``` + +**节源** +- [order.go](file://api/order/v1/form.go) +- [order_controller.go](file://internal/controller/order/order_v1_order_form_create.go) + +### 订单历史 +管理订单的历史记录和日志。 + +**端点列表** +- `GET /api/v1/order/log/list` - 获取订单日志列表 +- `DELETE /api/v1/order/log/delete` - 删除订单日志 +- `GET /api/v1/order/summary/daily/get/list` - 获取每日订单汇总 + +**节源** +- [log.go](file://api/order/v1/log.go) +- [order_controller.go](file://internal/controller/order/order_v1_order_log_list.go) + +## 商户管理模块 +商户管理模块提供商户配置、部署和订单处理功能。 + +### 商户配置 +管理商户的基本信息和配置参数。 + +**端点列表** +- `POST /api/v1/merchant/config/add` - 添加商户配置 +- `GET /api/v1/merchant/config/list` - 获取商户配置列表 +- `PUT /api/v1/merchant/config/update` - 更新商户配置 +- `PUT /api/v1/merchant/config/status` - 更新商户配置状态 + +**节源** +- [config.go](file://api/merchant/v1/config.go) +- [merchant_controller.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) + +### 商户部署 +管理商户的部署信息和状态。 + +**端点列表** +- `POST /api/v1/merchant/deploy/add` - 添加商户部署 +- `GET /api/v1/merchant/deploy/list` - 获取部署列表 +- `PUT /api/v1/merchant/deploy/update` - 更新部署信息 +- `DELETE /api/v1/merchant/deploy/delete` - 删除部署 + +**节源** +- [deploy.go](file://api/merchant/v1/deploy.go) +- [merchant_controller.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go) + +### 商户订单 +处理商户相关的订单查询和统计。 + +**端点列表** +- `GET /api/v1/merchant/order/query` - 查询商户订单 +- `GET /api/v1/merchant/steal/stats` - 获取商户抢单统计 +- `GET /api/v1/merchant/steal/record/list` - 获取抢单记录列表 + +**节源** +- [order.go](file://api/merchant/v1/order.go) +- [merchant_controller.go](file://internal/controller/merchant/merchant_v1_order_query.go) + +## 系统监控模块 +系统监控模块提供健康检查和系统状态监控功能。 + +### 健康检查 +提供系统健康状态的检查接口。 + +**端点列表** +- `GET /api/v1/monitor/health/check` - 健康检查 + +**响应示例** +```json +{ + "code": 0, + "message": "OK", + "data": { + "status": "healthy", + "timestamp": "2023-01-01T00:00:00Z", + "services": { + "database": "connected", + "cache": "connected", + "message_queue": "connected" + } + } +} +``` + +**节源** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor_controller.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +## 限制管理模块 +限制管理模块提供IP限制、区域限制和用户信息收集功能。 + +### IP限制管理 +管理IP访问限制规则。 + +**端点列表** +- `GET /api/v1/restriction/check/ip/allowed` - 检查IP是否允许访问 +- `POST /api/v1/restriction/block/order` - 阻止订单 +- `GET /api/v1/restriction/query/all/province` - 查询所有省份 + +**节源** +- [restriction.go](file://api/restriction/v1/province.go) +- [restriction_controller.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) + +### 用户信息收集 +管理用户信息收集规则。 + +**端点列表** +- `POST /api/v1/restriction/user/info/collection` - 用户信息收集 + +**节源** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_controller.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) + +## 认证与安全 +系统采用基于JWT的认证机制,所有API端点都需要有效的认证令牌。 + +### 认证机制 +- **认证方式**: Bearer Token +- **令牌类型**: JWT +- **有效期**: 24小时 +- **刷新机制**: 支持令牌刷新 + +### 认证头 +所有请求需要在HTTP头中包含认证信息: +``` +Authorization: Bearer +``` + +### 安全考虑 +- 所有API通信必须通过HTTPS +- 敏感数据在传输过程中必须加密 +- 密码等敏感信息在存储时必须哈希处理 +- 实施CSRF防护机制 +- 定期进行安全审计和漏洞扫描 + +**节源** +- [auth.go](file://internal/middleware/auth.go) +- [token.go](file://utility/token/user_token.go) + +## 错误处理策略 +系统采用统一的错误处理机制,所有错误响应遵循标准格式。 + +### 错误响应格式 +```json +{ + "code": 1001, + "message": "订单不存在", + "data": null +} +``` + +### 常见错误码 +| 错误码 | 错误信息 | 说明 | +|--------|---------|------| +| 1001 | 订单不存在 | 请求的订单ID不存在 | +| 1002 | 账号不存在 | 请求的账号ID不存在 | +| 1003 | 账号已存在 | 尝试创建已存在的账号 | +| 1004 | 订单已支付 | 订单状态已经是支付完成 | +| 1005 | 卡密错误 | 卡密号码或密码错误 | +| 1006 | 上传账号失败,当日已上传过 | 当天已经上传过账号 | +| 2006 | 文件损坏 | 上传的文件格式不正确或损坏 | +| 3001 | 用户名或密码错误 | 登录凭据不正确 | +| 3002 | 用户不存在 | 请求的用户ID不存在 | +| 3003 | 用户被禁用 | 用户账户已被禁用 | +| 3004 | 用户未激活 | 用户账户尚未激活 | +| 3005 | 用户不存在或已被禁用 | 用户不存在或已被禁用 | +| 3006 | 密码错误 | 密码不正确 | +| 3007 | 二步验证错误 | 两步验证代码不正确 | +| 4001 | 操作被禁止 | 当前用户没有权限执行此操作 | +| 5001 | token错误 | 认证令牌不正确 | +| 5002 | token过期 | 认证令牌已过期 | +| 5003 | token不存在 | 请求中缺少认证令牌 | +| 6001 | ck失效 | Cookie已失效 | + +**节源** +- [handler.go](file://internal/errHandler/handler.go) +- [code.go](file://internal/errHandler/code.go) + +## 速率限制 +系统实施基于Redis的速率限制机制,防止API滥用和DDoS攻击。 + +### 速率限制策略 +- **全局限制**: 每分钟最多1000次请求 +- **用户限制**: 每个用户每分钟最多100次请求 +- **IP限制**: 每个IP地址每分钟最多500次请求 + +### 限流类型 +| 限流类型 | 说明 | 限制值 | +|---------|------|-------| +| cardInfo:jd:account:cookie | 京东账号Cookie检查 | 10次/分钟 | +| cardInfo:jd:account:cookie:set | 京东账号Cookie设置 | 5次/分钟 | +| cardInfo:account:cookie:checker | 通用账号Cookie检查 | 15次/分钟 | +| cardInfo:account:cookie:set | 通用账号Cookie设置 | 8次/分钟 | + +### 限流响应头 +当接近限流阈值时,响应头中会包含以下信息: +``` +X-RateLimit-Limit: 100 +X-RateLimit-Remaining: 10 +X-RateLimit-Reset: 60 +``` + +**节源** +- [limiter.go](file://internal/service/limiter.go) +- [rate.go](file://utility/limiter/rate.go) +- [redis.go](file://utility/limiter/redis.go) + +## 客户端实现指南 +本节提供客户端实现的最佳实践和示例代码。 + +### 请求示例 (Python) +```python +import requests +import json + +url = "https://api.example.com/api/v1/card_info_apple/card/info/create" +headers = { + "Authorization": "Bearer your_token_here", + "Content-Type": "application/json" +} +data = { + "cardNumber": "1234567890", + "password": "your_password", + "status": 1 +} + +response = requests.post(url, headers=headers, json=data) +print(response.json()) +``` + +### 请求示例 (JavaScript) +```javascript +const url = 'https://api.example.com/api/v1/card_info_apple/card/info/create'; +const options = { + method: 'POST', + headers: { + 'Authorization': 'Bearer your_token_here', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + cardNumber: '1234567890', + password: 'your_password', + status: 1 + }) +}; + +fetch(url, options) + .then(response => response.json()) + .then(data => console.log(data)) + .catch(error => console.error('Error:', error)); +``` + +### 错误处理示例 +```python +def handle_api_response(response): + if response.status_code == 200: + data = response.json() + if data['code'] == 0: + return data['data'] + else: + error_code = data['code'] + error_message = data['message'] + # 根据错误码进行相应处理 + if error_code == 5002: # token过期 + refresh_token() + retry_request() + elif error_code == 4001: # 操作被禁止 + show_permission_error() + else: + show_error(error_message) + else: + handle_network_error() +``` + +## 性能优化建议 +为确保API的高性能和可扩展性,建议遵循以下最佳实践。 + +### 批量操作 +对于大量数据的操作,建议使用批量接口而不是单个请求: +- 使用`/batch/add`接口批量添加卡密 +- 使用`/batch/update`接口批量更新状态 +- 避免在循环中调用单个创建接口 + +### 分页查询 +对于列表查询,务必使用分页参数: +```json +{ + "current": 1, + "pageSize": 50 +} +``` +建议`pageSize`不超过100,避免单次请求返回过多数据。 + +### 缓存策略 +- 对于不经常变化的数据,客户端应实施本地缓存 +- 使用ETag或Last-Modified头进行条件请求 +- 设置合理的缓存过期时间 + +### 连接复用 +- 使用HTTP Keep-Alive保持连接 +- 实施连接池管理 +- 避免频繁创建和销毁连接 + +### 异步处理 +对于耗时较长的操作,建议使用异步模式: +1. 提交请求并获取任务ID +2. 通过轮询或WebSocket获取处理状态 +3. 处理完成后获取结果 + +### 监控与日志 +- 记录关键操作的执行时间 +- 监控API的响应时间和错误率 +- 设置告警阈值,及时发现性能问题 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密充值处理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密充值处理.md new file mode 100644 index 00000000..4627c51d --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密充值处理.md @@ -0,0 +1,252 @@ +# Apple卡密充值处理 + + +**本文档引用文件** +- [order.go](file://api/card_info_apple/v1/order.go) +- [order_history.go](file://api/card_info_apple/v1/order_history.go) +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [account_history.go](file://api/card_info_apple/v1/account_history.go) +- [config.go](file://api/card_info_apple/v1/config.go) +- [model.go](file://api/card_info_apple/v1/model.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + + +## 目录 +1. [简介](#简介) +2. [核心API端点](#核心api端点) +3. [充值订单状态机与生命周期](#充值订单状态机与生命周期) +4. [iTunes回调机制](#itunes回调机制) +5. [数据验证与安全机制](#数据验证与安全机制) +6. [重复卡密与防刷单策略](#重复卡密与防刷单策略) +7. [配置管理](#配置管理) +8. [历史记录查询](#历史记录查询) +9. [错误处理与性能优化](#错误处理与性能优化) + +## 简介 + +本文档详细说明Apple卡密充值处理系统的API设计、工作流程、状态管理及安全机制。系统支持商户提交Apple礼品卡充值请求,通过后台任务轮询分配至合适的iTunes账户进行处理,并提供完整的回调机制、历史查询和防刷单策略。重点描述了高并发场景下的稳定性保障措施。 + +## 核心API端点 + +### 充值提交接口 + +- **HTTP方法**: `POST` +- **URL模式**: `/cardInfo/appleCard/submit` +- **认证机制**: 请求签名验证(基于`merchantId`、`attach`、`cardPass`和`timeStamp`生成) +- **请求参数**: + - `cardNo`: 卡号 + - `cardPass`: 卡密 + - `faceValue`: 面值(单位:分) + - `callbackUrl`: 回调地址 + - `attach`: 附加信息(上游订单号) + - `timeStamp`: 时间戳 + - `sign`: 签名 + - `merchantId`: 商户ID +- **响应结构**: + - `orderNo`: 系统生成的订单号 + - `status`: 充值状态码 + - `message`: 详细描述信息 + +**Section sources** +- [order.go](file://api/card_info_apple/v1/order.go#L10-L45) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L15-L70) + +### 充值订单查询接口 + +- **HTTP方法**: `GET` +- **URL模式**: `/cardInfo/appleCard/query` +- **请求参数**: + - `orderNo`: 订单ID(必填) +- **响应结构**: + - `status`: 当前订单状态 + - `message`: 状态描述 + +**Section sources** +- [order.go](file://api/card_info_apple/v1/order.go#L47-L57) +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) + +### 回调处理接口 + +- **HTTP方法**: `POST` +- **URL模式**: `/cardInfo/appleCard/rechargeOrder/callback` +- **请求参数**: + - `amount`: 实际充值金额 + - `accountAmount`: 充值后账户余额 + - `accountId`: 账户ID + - `machineId`: 机器ID + - `orderNo`: 订单ID + - `status`: 充值状态(枚举值) + - `remark`: 备注信息 +- **响应结构**: 空对象 + +**Section sources** +- [order.go](file://api/card_info_apple/v1/order.go#L77-L97) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) + +### 轮询处理接口 + +- **HTTP方法**: `POST` +- **URL模式**: `/cardInfo/appleCard/rechargeOrder/handler` +- **用途**: 供后台处理机轮询获取待处理的充值订单 +- **请求参数**: + - `machineId`: 机器ID(必填) +- **响应结构**: + - `orderNo`: 订单ID + - `cardNo`: 卡号 + - `cardPass`: 卡密 + - `account`: iTunes账户 + - `password`: 账户密码 + - `accountId`: 账户ID + +**Section sources** +- [order.go](file://api/card_info_apple/v1/order.go#L59-L75) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L15-L188) + +## 充值订单状态机与生命周期 + +```mermaid +stateDiagram-v2 +[*] --> 待处理 +待处理 --> 处理中 : 分配账户 +处理中 --> 充值成功 : 回调成功 +处理中 --> 充值失败 : 回调失败 +处理中 --> 超时等待 : 1分钟未完成 +超时等待 --> 处理中 : 重新分配 +充值成功 --> [*] +充值失败 --> [*] +``` + +**Diagram sources** +- [order.go](file://api/card_info_apple/v1/order.go#L77-L97) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L100-L150) + +## iTunes回调机制 + +系统通过以下流程处理iTunes充值回调: + +1. 后台处理机执行充值操作 +2. 成功后调用 `/cardInfo/appleCard/rechargeOrder/callback` 接口 +3. 系统验证回调数据并更新订单状态 +4. 根据配置决定是否向商户`callbackUrl`发起二次回调 +5. 记录充值历史和账户余额变化 + +**Section sources** +- [order.go](file://api/card_info_apple/v1/order.go#L77-L97) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) + +## 数据验证与安全机制 + +### 签名验证 +请求必须包含签名,使用以下参数生成: +``` +sign = MD5(attach + cardPass + timeStamp) +``` + +### 卡密格式验证 +系统对卡密进行格式校验,确保符合Apple卡密规范。 + +### 幂等性控制 +使用Redis缓存防止同一商户ID在短时间内重复提交相同订单。 + +```mermaid +flowchart TD +A[接收充值请求] --> B{验证签名} +B --> |失败| C[返回验证错误] +B --> |成功| D{卡密格式校验} +D --> |失败| E[返回卡密错误] +D --> |成功| F{检查重复订单} +F --> |存在| G[返回处理中] +F --> |不存在| H[创建订单并返回成功] +``` + +**Diagram sources** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L20-L50) + +## 重复卡密与防刷单策略 + +### 重复订单检测 +- 基于`merchantId`在10秒内设置Redis锁,防止重复提交 +- 系统级卡密去重(可配置) + +### 偷单机制 +当系统配置启用偷单功能时: +1. 检查当前订单是否符合偷单规则 +2. 若符合,将订单分配给指定存储账户 +3. 为原订单创建替代订单,实现订单转移 + +**Section sources** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L20-L35) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L80-L120) + +## 配置管理 + +### 获取配置 +- **HTTP方法**: `GET` +- **URL模式**: `/cardInfo/AppleCard/config/get` +- **响应参数**: + - `isAllowDifferentAmount`: 是否允许金额异议充值 + - `isAllowDifferentSucceedCallback`: 是否允许成功时金额异议回调 + - `isAllowDifferentFailCallback`: 是否允许失败时金额异议回调 + - `redeemCardMinAmount`: 最小充值金额 + - `isAllowCompensatedCallback`: 是否允许补卡自动回调 + - `redeemCardRate`: 充值速率限制 + +### 设置配置 +- **HTTP方法**: `POST` +- **URL模式**: `/cardInfo/AppleCard/config/set` +- 所有参数均为必填 + +**Section sources** +- [config.go](file://api/card_info_apple/v1/config.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + +## 历史记录查询 + +### 充值历史查询 +- **HTTP方法**: `GET` +- **URL模式**: `/cardInfo/AppleCard/rechargeOrder/getHistoryList` +- **请求参数**: `orderNo`(必填) +- **响应结构**: 包含每次充值的详细记录 + +### 账户余额历史 +- **HTTP方法**: `GET` +- **URL模式**: `/cardInfo/AppleCard/account/getWalletList` +- **响应结构**: 包含余额变化记录,包括: + - 充值前余额 + - 充值后余额 + - 充值金额 + - 操作时间 + +**Section sources** +- [order_history.go](file://api/card_info_apple/v1/order_history.go) +- [account_history.go](file://api/card_info_apple/v1/account_history.go) + +## 错误处理与性能优化 + +### 错误处理策略 +- 统一错误码体系(基于gcode) +- 详细的错误包装和日志记录 +- 客户端友好的错误消息 + +### 高并发优化 +- Redis缓存实现请求幂等性 +- 数据库事务保证状态一致性 +- 定时任务避免长时间阻塞 +- 读写锁控制并发访问 + +### 系统稳定性 +- 订单处理超时自动恢复机制 +- 数据库连接池优化 +- 关键操作日志追踪(OpenTelemetry) + +**Section sources** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [utility/otel](file://utility/otel) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密管理API.md new file mode 100644 index 00000000..749c511e --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密管理API.md @@ -0,0 +1,876 @@ +# Apple卡密管理API + + +**本文档引用的文件** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) +- [model.go](file://api/card_info_apple/v1/model.go) +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [card_info_apple_v1_recharge_steal_rule_add.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_add.go) +- [card_info_apple_v1_recharge_steal_rule_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_list.go) +- [card_info_apple_v1_recharge_steal_setting.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) +- [card_info_apple_v1_call_back_order_manual.go](file://internal/controller/card_info_apple/card_info_apple_v1_call_back_order_manual.go) +- [card_info_apple_v1_recharge_order_modify_actual_amount.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_modify_actual_amount.go) +- [card_info_apple_v1_recharge_order_reset_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_recharge_list_download.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) +- [card_info_apple_v1_recharge_steal_rule_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_update.go) +- [card_info_apple_v1_recharge_steal_rule_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_delete.go) +- [card_info_apple_v1_recharge_steal_rule_status_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_status_update.go) +- [card_info_apple_v1_recharge_steal_setting_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting_get.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [card_info_apple_v1_recharge_steal_rule_add.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_add.go) +- [card_info_apple_v1_recharge_steal_rule_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_list.go) +- [card_info_apple_v1_recharge_steal_setting.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) +- [card_info_apple_v1_call_back_order_manual.go](file://internal/controller/card_info_apple/card_info_apple_v1_call_back_order_manual.go) +- [card_info_apple_v1_recharge_order_modify_actual_amount.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_modify_actual_amount.go) +- [card_info_apple_v1_recharge_order_reset_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_recharge_list_download.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) +- [card_info_apple_v1_recharge_steal_rule_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_update.go) +- [card_info_apple_v1_recharge_steal_rule_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_delete.go) +- [card_info_apple_v1_recharge_steal_rule_status_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_status_update.go) +- [card_info_apple_v1_recharge_steal_setting_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting_get.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [card_info_apple_v1_recharge_steal_rule_add.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_add.go) +- [card_info_apple_v1_recharge_steal_rule_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_list.go) +- [card_info_apple_v1_recharge_steal_setting.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) +- [card_info_apple_v1_call_back_order_manual.go](file://internal/controller/card_info_apple/card_info_apple_v1_call_back_order_manual.go) +- [card_info_apple_v1_recharge_order_modify_actual_amount.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_modify_actual_amount.go) +- [card_info_apple_v1_recharge_order_reset_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_recharge_list_download.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) +- [card_info_apple_v1_recharge_steal_rule_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_update.go) +- [card_info_apple_v1_recharge_steal_rule_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_delete.go) +- [card_info_apple_v1_recharge_steal_rule_status_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_status_update.go) +- [card_info_apple_v1_recharge_steal_setting_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting_get.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +Apple卡密管理API是一个全面的系统,用于管理Apple卡密的账户、充值处理和订单回调。该API提供了账户创建、状态管理、充值提交和历史查询等端点。它还支持批量导入卡密、充值状态查询和重复卡密处理等场景。文档详细解释了Apple卡密特有的iTunes回调机制和防刷单规则,并提供了错误处理策略和安全考虑。此外,还包括客户端实现指南和性能优化建议,特别关注Apple平台的特殊要求和限制。 + +## 项目结构 +项目结构遵循模块化设计,将不同功能分离到不同的目录中。主要目录包括`api`、`internal`、`manifest`、`resource`和`utility`。`api`目录包含所有API端点的定义,`internal`目录包含核心业务逻辑、数据访问对象(DAO)和服务。`manifest`目录包含配置文件,`resource`目录包含Casbin权限模型,`utility`目录包含各种实用工具和集成。 + +```mermaid +graph TD +subgraph "API" +A[card_info_apple] +B[card_info_c_trip] +C[card_info_jd] +D[card_info_original_jd] +E[card_info_t_mall_game] +F[card_info_walmart] +G[card_redeem_jd] +H[channel] +I[commonApi] +J[fund] +K[merchant] +L[monitor] +M[order] +N[restriction] +O[road] +P[road_pool] +Q[sysUser] +R[sys_auth_rule] +S[sys_payment] +T[sys_role] +U[sys_user_login] +V[user_center] +W[validation] +end +subgraph "Internal" +X[boot] +Y[cmd] +Z[consts] +AA[controller] +AB[dao] +AC[errHandler] +AD[logic] +AE[middleware] +AF[model] +AG[packed] +AH[service] +AI[systemV2] +end +subgraph "Manifest" +AJ[config] +AK[deploy] +AL[docker] +end +subgraph "Resource" +AM[casbin] +end +subgraph "Utility" +AN[cache] +AO[config] +AP[cron] +AQ[integration] +AR[lib] +AS[limiter] +AT[mfa] +AU[monitor] +AV[notify] +AW[otel] +AX[pool] +AY[token] +AZ[utils] +BA[verify] +end +A --> AA +B --> AA +C --> AA +D --> AA +E --> AA +F --> AA +G --> AA +H --> AA +I --> AA +J --> AA +K --> AA +L --> AA +M --> AA +N --> AA +O --> AA +P --> AA +Q --> AA +R --> AA +S --> AA +T --> AA +U --> AA +V --> AA +W --> AA +``` + +**图示来源** +- [api](file://api) +- [internal](file://internal) +- [manifest](file://manifest) +- [resource](file://resource) +- [utility](file://utility) + +**章节来源** +- [api](file://api) +- [internal](file://internal) +- [manifest](file://manifest) +- [resource](file://resource) +- [utility](file://utility) + +## 核心组件 +核心组件包括账户管理、充值处理、订单回调和配置管理。账户管理负责创建、更新和删除Apple账户。充值处理负责提交和查询充值订单。订单回调处理来自iTunes的回调请求。配置管理允许用户获取和设置系统配置。 + +**章节来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) + +## 架构概述 +系统架构采用分层设计,包括API层、控制器层、服务层、逻辑层和数据访问层。API层定义了所有端点,控制器层处理HTTP请求并调用服务层,服务层协调业务逻辑,逻辑层包含具体的业务规则,数据访问层负责与数据库交互。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[逻辑层] +D --> E[数据访问层] +E --> F[数据库] +``` + +**图示来源** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) + +## 详细组件分析 +### 账户管理分析 +账户管理组件负责处理Apple账户的创建、更新、删除和查询。它还支持批量导入和导出账户信息。 + +#### 账户创建 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/account/create +Controller->>Service : 调用Add方法 +Service->>Logic : 调用Add方法 +Logic->>DAO : 插入新账户 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) + +#### 账户更新 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : PUT /api/apple/account/update +Controller->>Service : 调用Update方法 +Service->>Logic : 调用Update方法 +Logic->>DAO : 更新账户信息 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) + +#### 账户删除 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : DELETE /api/apple/account/delete +Controller->>Service : 调用Delete方法 +Service->>Logic : 调用Delete方法 +Logic->>DAO : 删除账户 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) + +#### 批量导入账户 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/account/batch-add +Controller->>Service : 调用Add方法 +Service->>Logic : 调用Add方法 +loop 每个账户 +Logic->>DAO : 插入账户 +DAO-->>Logic : 返回结果 +end +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) + +**章节来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) + +### 充值处理分析 +充值处理组件负责提交和查询充值订单。它还处理来自iTunes的回调请求。 + +#### 充值提交 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/submit +Controller->>Service : 调用AddRechargeOrder方法 +Service->>Logic : 调用AddRechargeOrder方法 +Logic->>DAO : 插入充值订单 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) + +#### 充值查询 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/recharge/list +Controller->>Service : 调用List方法 +Service->>Logic : 调用List方法 +Logic->>DAO : 查询充值订单 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list.go) + +#### iTunes回调处理 +```mermaid +sequenceDiagram +participant iTunes as "iTunes" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +iTunes->>Controller : POST /api/apple/recharge/itunes-callback +Controller->>Service : 调用UpdateActualAmountAndHistoryAndWallet方法 +Service->>Logic : 调用UpdateActualAmountAndHistoryAndWallet方法 +Logic->>DAO : 更新充值订单和账户余额 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>iTunes : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) + +**章节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) + +### 配置管理分析 +配置管理组件允许用户获取和设置系统配置。 + +#### 获取配置 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/config/get +Controller->>Service : 调用GetConfig方法 +Service->>Logic : 调用GetConfig方法 +Logic->>DAO : 查询配置 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) + +#### 设置配置 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/config/set +Controller->>Service : 调用SetConfig方法 +Service->>Logic : 调用SetConfig方法 +Logic->>DAO : 更新配置 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + +**章节来源** +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + +### 偷卡规则分析 +偷卡规则组件允许用户管理偷卡规则,包括添加、更新、删除和查询规则。 + +#### 添加偷卡规则 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/steal-rule/add +Controller->>Service : 调用AddStealRule方法 +Service->>Logic : 调用AddStealRule方法 +Logic->>DAO : 插入偷卡规则 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_steal_rule_add.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_add.go) + +#### 查询偷卡规则 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/recharge/steal-rule/list +Controller->>Service : 调用GetStealRuleList方法 +Service->>Logic : 调用GetStealRuleList方法 +Logic->>DAO : 查询偷卡规则 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_steal_rule_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_list.go) + +#### 更新偷卡规则 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : PUT /api/apple/recharge/steal-rule/update +Controller->>Service : 调用UpdateStealRule方法 +Service->>Logic : 调用UpdateStealRule方法 +Logic->>DAO : 更新偷卡规则 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_steal_rule_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_update.go) + +#### 删除偷卡规则 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : DELETE /api/apple/recharge/steal-rule/delete +Controller->>Service : 调用DeleteStealRule方法 +Service->>Logic : 调用DeleteStealRule方法 +Logic->>DAO : 删除偷卡规则 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_steal_rule_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_delete.go) + +**章节来源** +- [card_info_apple_v1_recharge_steal_rule_add.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_add.go) +- [card_info_apple_v1_recharge_steal_rule_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_list.go) +- [card_info_apple_v1_recharge_steal_rule_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_update.go) +- [card_info_apple_v1_recharge_steal_rule_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_delete.go) +- [card_info_apple_v1_recharge_steal_rule_status_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_rule_status_update.go) +- [card_info_apple_v1_recharge_steal_setting.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting.go) +- [card_info_apple_v1_recharge_steal_setting_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_steal_setting_get.go) + +### 重复卡密处理分析 +重复卡密处理组件负责处理重复提交的卡密。 + +#### 检查重复卡密 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/duplicated-card-pass +Controller->>Service : 调用QueryDuplicatedCardPassV2方法 +Service->>Logic : 调用QueryDuplicatedCardPassV2方法 +Logic->>DAO : 查询重复卡密 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) + +**章节来源** +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) + +### 手动回调订单分析 +手动回调订单组件允许用户手动回调订单。 + +#### 手动回调订单 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/call-back-order-manual +Controller->>Service : 调用CallBackOrderToUpstream方法 +Service->>Logic : 调用CallBackOrderToUpstream方法 +Logic->>DAO : 查询订单并回调 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_call_back_order_manual.go](file://internal/controller/card_info_apple/card_info_apple_v1_call_back_order_manual.go) + +**章节来源** +- [card_info_apple_v1_call_back_order_manual.go](file://internal/controller/card_info_apple/card_info_apple_v1_call_back_order_manual.go) + +### 充值订单状态修改分析 +充值订单状态修改组件允许用户修改充值订单的状态。 + +#### 修改充值订单状态 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/order-modify-actual-amount +Controller->>Service : 调用UpdateActualAmount方法 +Service->>Logic : 调用UpdateActualAmount方法 +Logic->>DAO : 更新订单状态 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_order_modify_actual_amount.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_modify_actual_amount.go) + +**章节来源** +- [card_info_apple_v1_recharge_order_modify_actual_amount.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_modify_actual_amount.go) + +### 充值订单状态重置分析 +充值订单状态重置组件允许用户重置充值订单的状态。 + +#### 重置充值订单状态 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/order-reset-status +Controller->>Service : 调用ResetDistributionCount方法 +Service->>Logic : 调用ResetDistributionCount方法 +Logic->>DAO : 重置订单状态 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_order_reset_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go) + +**章节来源** +- [card_info_apple_v1_recharge_order_reset_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go) + +### 账户状态暂停或继续分析 +账户状态暂停或继续组件允许用户暂停或继续账户的状态。 + +#### 暂停或继续账户状态 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/account/suspend-or-continue +Controller->>Service : 调用ModifyStatus方法 +Service->>Logic : 调用ModifyStatus方法 +Logic->>DAO : 更新账户状态 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) + +**章节来源** +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) + +### 充值历史查询分析 +充值历史查询组件允许用户查询充值历史。 + +#### 查询充值历史 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/recharge/history-list +Controller->>Service : 调用GetRechargeDetails方法 +Service->>Logic : 调用GetRechargeDetails方法 +Logic->>DAO : 查询充值历史 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) + +**章节来源** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) + +### 充值列表下载分析 +充值列表下载组件允许用户下载充值列表。 + +#### 下载充值列表 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/recharge/list-download +Controller->>Service : 调用ListWithAccount方法 +Service->>Logic : 调用ListWithAccount方法 +Logic->>DAO : 查询充值列表 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_list_download.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go) + +**章节来源** +- [card_info_apple_v1_recharge_list_download.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go) + +### 账户历史信息查询分析 +账户历史信息查询组件允许用户查询账户历史信息。 + +#### 查询账户历史信息 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/account/history-info-list +Controller->>Service : 调用GetWalletHistory方法 +Service->>Logic : 调用GetWalletHistory方法 +Logic->>DAO : 查询账户历史信息 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) + +**章节来源** +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) + +### 充值处理分析 +充值处理组件负责处理充值请求。 + +#### 处理充值请求 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : POST /api/apple/recharge/handler +Controller->>Service : 调用HandleWaitingList方法 +Service->>Logic : 调用HandleWaitingList方法 +Logic->>DAO : 处理等待中的充值订单 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) + +**章节来源** +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) + +### 充值提交查询分析 +充值提交查询组件允许用户查询充值提交的状态。 + +#### 查询充值提交状态 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务" +participant Logic as "逻辑" +participant DAO as "数据访问对象" +Client->>Controller : GET /api/apple/recharge/submit-query +Controller->>Service : 调用GetRechargeStatusByOrderNo方法 +Service->>Logic : 调用GetRechargeStatusByOrderNo方法 +Logic->>DAO : 查询充值提交状态 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功或错误 +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) + +**章节来源** +- [card_info_apple_v1_recharge_submit_query.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit_query.go) + +## 依赖分析 +系统依赖于多个外部组件和库,包括GoFrame框架、GDB数据库驱动、ShopSpring Decimal库等。这些依赖项在`go.mod`文件中定义,并通过Go模块系统进行管理。 + +```mermaid +graph TD +A[Apple卡密管理API] --> B[GoFrame框架] +A --> C[GDB数据库驱动] +A --> D[ShopSpring Decimal库] +A --> E[Casbin权限库] +A --> F[Redis缓存] +A --> G[MySQL数据库] +``` + +**图示来源** +- [go.mod](file://go.mod) +- [go.sum](file://go.sum) + +**章节来源** +- [go.mod](file://go.mod) +- [go.sum](file://go.sum) + +## 性能考虑 +为了确保系统的高性能,采用了多种优化策略。包括使用Redis缓存频繁访问的数据,使用数据库索引优化查询性能,使用并发处理提高处理速度,以及使用连接池管理数据库连接。 + +**章节来源** +- [utility/cache](file://utility/cache) +- [utility/limiter](file://utility/limiter) +- [utility/pool](file://utility/pool) + +## 故障排除指南 +### 常见问题 +1. **账户创建失败**:检查请求参数是否正确,特别是账户名和密码。 +2. **充值提交失败**:检查卡密是否正确,以及账户是否有足够的余额。 +3. **回调失败**:检查回调URL是否正确,以及服务器是否能够接收POST请求。 +4. **配置更新失败**:检查配置参数是否在允许范围内。 + +### 错误处理 +系统使用统一的错误处理机制,所有错误都通过`errHandler`包进行处理。错误码和错误信息在`errHandler/code.go`文件中定义。 + +**章节来源** +- [internal/errHandler/code.go](file://internal/errHandler/code.go) +- [internal/errHandler/handler.go](file://internal/errHandler/handler.go) + +## 结论 +Apple卡密管理API提供了一套完整的解决方案,用于管理Apple卡密的账户、充值和订单回调。通过详细的文档和示例,用户可以轻松地集成和使用该API。系统设计考虑了性能、安全性和可扩展性,确保在高负载下仍能稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密账户管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密账户管理.md new file mode 100644 index 00000000..86d62b70 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密账户管理.md @@ -0,0 +1,412 @@ +# Apple卡密账户管理 + + +**本文档引用的文件** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_apple_account.go](file://internal/model/card_apple_account.go) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [account.go](file://internal/logic/card_apple_account/account.go) +- [card_apple.go](file://internal/consts/card_apple.go) + + +## 目录 +1. [简介](#简介) +2. [核心功能](#核心功能) +3. [数据模型](#数据模型) +4. [API端点](#api端点) +5. [账户状态管理](#账户状态管理) +6. [批量操作](#批量操作) +7. [错误处理](#错误处理) +8. [安全考虑](#安全考虑) +9. [客户端实现指南](#客户端实现指南) +10. [性能优化建议](#性能优化建议) + +## 简介 +本文档详细介绍了Apple卡密账户管理API的功能和使用方法。该API提供了一套完整的账户管理解决方案,支持账户的创建、查询、更新、删除等基本操作,以及账户状态管理、批量导入等高级功能。系统设计考虑了大规模账户管理的性能需求,提供了相应的优化建议。 + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +## 核心功能 +Apple卡密账户管理API提供以下核心功能: +- 账户的增删改查操作 +- 账户状态的启用/暂停管理 +- 批量导入账户信息 +- 账户信息的分页查询 +- 账户模板下载 + +这些功能通过RESTful API接口提供,支持标准的HTTP方法和JSON数据格式。 + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +## 数据模型 +### 账户信息数据模型 +Apple卡密账户的核心数据模型包含以下字段: + +| 字段名 | 类型 | 必填 | 描述 | 验证规则 | +|-------|------|------|------|---------| +| account | string | 是 | 账户名 | 必须提供 | +| password | string | 是 | 密码 | 必须提供 | +| maxAmountLimit | int | 是 | 最大充值金额 | 必须提供 | +| maxCountLimit | int | 是 | 最大充值次数 | 必须提供 | +| remark | string | 否 | 备注 | 无 | +| balance | float64 | 否 | 余额 | 只读 | +| status | int32 | 否 | 状态 | 0:停用, 1:正常使用, 2:正在充值, 3:已达到单日充值限制 | + +**Section sources** +- [card_apple_account.go](file://internal/model/card_apple_account.go) +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +## API端点 +### 账户创建 +创建新的Apple卡密账户。 + +**请求信息** +- **HTTP方法**: POST +- **URL模式**: `/cardInfo/AppleCard/account/create` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "account": "string", + "password": "string", + "maxAmountLimit": 0, + "maxCountLimit": 0, + "remark": "string" +} +``` + +**响应** +- **成功**: 200 OK +- **失败**: 400 Bad Request (参数错误), 401 Unauthorized (权限不足), 409 Conflict (账号已存在) + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) + +### 账户查询 +查询Apple卡密账户列表。 + +**请求信息** +- **HTTP方法**: GET +- **URL模式**: `/cardInfo/AppleCard/account/getList` +- **认证机制**: 需要有效的用户会话 + +**查询参数** +| 参数名 | 类型 | 必填 | 描述 | +|-------|------|------|------| +| account | string | 否 | 账户名,支持模糊查询 | +| current | int | 否 | 当前页码,默认1 | +| pageSize | int | 否 | 每页数量,默认10 | + +**响应** +```json +{ + "total": 0, + "list": [ + { + "id": "string", + "account": "string", + "password": "string", + "maxAmountLimit": 0, + "maxCountLimit": 0, + "remark": "string", + "balance": 0, + "status": 0 + } + ] +} +``` + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_v1_card_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go) + +### 账户更新 +更新现有Apple卡密账户信息。 + +**请求信息** +- **HTTP方法**: PUT +- **URL模式**: `/cardInfo/AppleCard/account/update` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "id": "string", + "account": "string", + "password": "string", + "maxAmountLimit": 0, + "maxCountLimit": 0, + "remark": "string" +} +``` + +**响应** +- **成功**: 200 OK +- **失败**: 400 Bad Request, 401 Unauthorized, 404 Not Found + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) + +### 账户删除 +删除指定的Apple卡密账户。 + +**请求信息** +- **HTTP方法**: DELETE +- **URL模式**: `/cardInfo/AppleCard/account/delete` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "id": "string" +} +``` + +**响应** +- **成功**: 200 OK +- **失败**: 400 Bad Request, 401 Unauthorized, 500 Internal Server Error + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) + +## 账户状态管理 +### 修改账户状态 +直接修改账户状态。 + +**请求信息** +- **HTTP方法**: PUT +- **URL模式**: `/cardInfo/AppleCard/account/updateStatus` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "id": "string", + "status": 10 +} +``` + +**状态值** +- 10: 正常 +- 20: 停用 + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +### 暂停/恢复账户充值 +切换账户的暂停/恢复状态。 + +**请求信息** +- **HTTP方法**: PUT +- **URL模式**: `/cardInfo/AppleCard/account/status/continueOrRestart` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "id": "string" +} +``` + +**逻辑说明** +- 如果账户当前状态为"正常",则将其暂停 +- 如果账户当前状态为"停用",则将其恢复为正常状态 +- 其他状态返回错误 + +```mermaid +flowchart TD +Start([开始]) --> CheckStatus["检查账户状态"] +CheckStatus --> StatusDecision{"状态是正常吗?"} +StatusDecision --> |是| SetForbidden["设置为停用状态"] +StatusDecision --> |否| StatusIsForbidden{"状态是停用吗?"} +StatusIsForbidden --> |是| SetNormal["设置为正常状态"] +StatusIsForbidden --> |否| ReturnError["返回错误:状态不正确"] +SetForbidden --> End([结束]) +SetNormal --> End +ReturnError --> End +``` + +**Diagram sources** +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) + +## 批量操作 +### 下载导入模板 +下载批量导入账户信息的Excel模板。 + +**请求信息** +- **HTTP方法**: GET +- **URL模式**: `/cardInfo/AppleCard/account/downloadTemplate` +- **认证机制**: 需要有效的用户会话 + +**响应** +- 返回Excel文件,MIME类型为`application/vnd.ms-excel` + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_info_apple_v1_card_info_download_template.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_download_template.go) + +### 批量导入账户 +从Excel文件批量导入Apple卡密账户。 + +**请求信息** +- **HTTP方法**: POST +- **URL模式**: `/cardInfo/AppleCard/account/batchAdd` +- **认证机制**: 需要有效的用户会话 + +**请求体** +```json +{ + "file": "文件对象" +} +``` + +**文件格式要求** +- Excel文件格式 +- 第一行为标题行:账号、密码、最大充值金额、最大充值次数、备注 +- 支持.csv格式 + +**处理逻辑** +1. 验证文件格式和内容 +2. 检查账户是否已存在 +3. 批量创建账户 +4. 返回导入结果统计 + +```mermaid +flowchart TD +Start([开始]) --> ValidateFile["验证文件"] +ValidateFile --> ReadFile["读取Excel数据"] +ReadFile --> CheckData["检查数据有效性"] +CheckData --> ProcessRows["逐行处理"] +ProcessRows --> CheckDuplicate["检查重复"] +CheckDuplicate --> |已存在| SkipRow["跳过该行"] +CheckDuplicate --> |不存在| CreateAccount["创建账户"] +CreateAccount --> UpdateCounters["更新计数器"] +UpdateCounters --> NextRow["处理下一行"] +NextRow --> MoreRows{"还有更多行吗?"} +MoreRows --> |是| ProcessRows +MoreRows --> |否| GenerateResult["生成结果"] +GenerateResult --> ReturnResult["返回结果"] +SkipRow --> NextRow +ReturnResult --> End([结束]) +``` + +**Diagram sources** +- [card_info_apple_v1_card_info_batch_add_from_xlsx.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_batch_add_from_xlsx.go) + +## 错误处理 +### 常见错误码 +| 错误码 | 描述 | 解决方案 | +|-------|------|---------| +| 400 | 参数错误 | 检查请求参数是否符合要求 | +| 401 | 权限不足 | 确保已正确登录并具有相应权限 | +| 404 | 资源未找到 | 检查ID是否正确 | +| 409 | 账号已存在 | 使用不同的账户名 | +| 500 | 服务器内部错误 | 联系管理员 | + +### 验证规则 +- 账户名和密码为必填项 +- 账户名不能重复 +- 最大充值金额和次数不能为空 +- 状态值必须在允许范围内 + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [card_apple.go](file://internal/consts/card_apple.go) + +## 安全考虑 +### 认证机制 +所有API端点都需要用户认证,通过会话令牌验证用户身份。 + +### 数据验证 +- 输入参数严格验证 +- 防止SQL注入 +- 限制文件上传类型和大小 + +### 敏感信息保护 +- 密码在传输过程中加密 +- 敏感操作需要二次确认 +- 操作日志记录 + +**Section sources** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) + +## 客户端实现指南 +### 基本使用示例 +```javascript +// 创建账户 +fetch('/cardInfo/AppleCard/account/create', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer your-token' + }, + body: JSON.stringify({ + account: 'apple_user', + password: 'secure_password', + maxAmountLimit: 1000, + maxCountLimit: 10 + }) +}); + +// 查询账户列表 +fetch('/cardInfo/AppleCard/account/getList?account=apple', { + method: 'GET', + headers: { + 'Authorization': 'Bearer your-token' + } +}); +``` + +### 批量导入示例 +```javascript +const formData = new FormData(); +formData.append('file', fileInput.files[0]); + +fetch('/cardInfo/AppleCard/account/batchAdd', { + method: 'POST', + headers: { + 'Authorization': 'Bearer your-token' + }, + body: formData +}); +``` + +**Section sources** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +## 性能优化建议 +### 大规模账户管理 +当管理大量账户时,建议采取以下优化措施: + +1. **批量操作**: 尽可能使用批量导入功能,减少API调用次数 +2. **分页查询**: 使用分页参数避免一次性获取过多数据 +3. **缓存策略**: 对频繁查询的数据进行缓存 +4. **异步处理**: 对耗时操作采用异步处理模式 + +### 数据库优化 +- 确保账户名字段有索引 +- 定期清理历史数据 +- 监控查询性能 + +### 系统监控 +- 监控API响应时间 +- 跟踪错误率 +- 设置适当的超时机制 + +**Section sources** +- [account.go](file://internal/logic/card_apple_account/account.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密配置管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密配置管理.md new file mode 100644 index 00000000..c331247d --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Apple卡密管理API/Apple卡密配置管理.md @@ -0,0 +1,204 @@ +# Apple卡密配置管理 + + +**本文档引用的文件** +- [config.go](file://api/card_info_apple/v1/config.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [card_apple.go](file://internal/consts/card_apple.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 简介 +本文档详细说明了Apple卡密配置管理API的设计与实现,涵盖配置获取、设置等端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档详细解释了Apple卡密服务的各项可配置参数,包括充值超时时间、回调重试策略、防刷单规则阈值等,并提供实际使用示例。同时,文档还包含最佳实践建议、安全考虑和故障排查指南,特别关注配置变更对现有服务的影响评估。 + +## 项目结构 +Apple卡密配置管理功能主要分布在`api/card_info_apple/v1`和`internal/controller/card_info_apple`目录下。核心配置接口定义在`api/card_info_apple/v1/config.go`中,控制器实现位于`internal/controller/card_info_apple`目录下,配置数据的持久化和业务逻辑处理通过`internal/service/sys_config_dict.go`中的服务接口完成。 + +```mermaid +graph TB +subgraph "API接口层" +config_go[config.go] +end +subgraph "控制器层" +config_get[card_info_apple_v1_config_get.go] +config_set[card_info_apple_v1_config_set.go] +end +subgraph "服务层" +sys_config_dict[sys_config_dict.go] +end +subgraph "常量定义" +card_apple[card_apple.go] +end +config_go --> config_get +config_go --> config_set +config_get --> sys_config_dict +config_set --> sys_config_dict +card_apple -.-> config_go +card_apple -.-> sys_config_dict +``` + +**图示来源** +- [config.go](file://api/card_info_apple/v1/config.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [card_apple.go](file://internal/consts/card_apple.go) + +**本节来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + +## 核心组件 +Apple卡密配置管理的核心组件包括配置获取和设置两个主要端点。`ConfigGetReq`和`ConfigSetReq`结构体定义了请求参数,`ConfigGetRes`定义了响应数据结构。这些组件通过`sys_config_dict`服务与底层数据存储进行交互,实现了配置的读取和写入功能。配置项涵盖了是否允许金额异议充值、最小充值金额、充值速率等关键业务参数。 + +**本节来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [internal/service/sys_config_dict.go](file://internal/service/sys_config_dict.go) + +## 架构概述 +Apple卡密配置管理采用典型的分层架构,从API接口层到控制器层,再到服务层,实现了关注点分离。API接口层负责定义HTTP端点和数据传输对象(DTO),控制器层负责处理HTTP请求和响应,服务层负责核心业务逻辑和数据持久化。这种架构设计使得系统具有良好的可维护性和可扩展性。 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Database[(数据库)] +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style Database fill:#999,stroke:#333 +``` + +**图示来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [internal/service/sys_config_dict.go](file://internal/service/sys_config_dict.go) + +## 详细组件分析 +### 配置获取与设置分析 +Apple卡密配置管理提供了两个核心API端点:获取配置和设置配置。获取配置端点使用GET方法,URL模式为`/cardInfo/AppleCard/config/get`,返回当前的配置状态。设置配置端点使用POST方法,URL模式为`/cardInfo/AppleCard/config/set`,接收新的配置参数并进行更新。 + +#### 配置数据结构 +```mermaid +classDiagram +class ConfigGetRes { ++bool isAllowDifferentAmount ++bool isAllowDifferentSucceedCallback ++bool isAllowDifferentFailCallback ++int64 redeemCardMinAmount ++bool isAllowCompensatedCallback ++int redeemCardRate +} +class ConfigSetReq { ++bool isAllowDifferentAmount ++bool isAllowDifferentSucceedCallback ++bool isAllowDifferentFailCallback ++int64 redeemCardMinAmount ++bool isAllowCompensatedCallback ++int redeemCardRate +} +ConfigGetRes <|-- ConfigSetReq : "继承" +``` + +**图示来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) + +#### 配置操作流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +Client->>API : GET /cardInfo/AppleCard/config/get +API->>Controller : 调用ConfigGet方法 +Controller->>Service : 调用Get配置方法 +Service-->>Controller : 返回配置数据 +Controller-->>API : 返回配置数据 +API-->>Client : 返回JSON响应 +Client->>API : POST /cardInfo/AppleCard/config/set +API->>Controller : 调用ConfigSet方法 +Controller->>Service : 调用Set配置方法 +Service-->>Controller : 返回操作结果 +Controller-->>API : 返回操作结果 +API-->>Client : 返回JSON响应 +``` + +**图示来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + +**本节来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) +- [internal/service/sys_config_dict.go](file://internal/service/sys_config_dict.go) + +### 概念概述 +Apple卡密配置管理是整个卡密系统的核心功能之一,它允许管理员动态调整系统的行为和策略。通过这个管理接口,可以控制是否允许金额异议充值、设置最小充值金额、调整充值速率等关键参数。这些配置直接影响到系统的安全性和用户体验,因此需要谨慎设置和管理。 + +## 依赖分析 +Apple卡密配置管理功能依赖于多个核心组件。`sys_config_dict`服务是配置数据的持久化层,提供了配置的读写接口。`card_apple`常量文件定义了与Apple卡密相关的常量和枚举值,如最小充值金额、最大充值金额等。这些依赖关系确保了配置管理功能的完整性和一致性。 + +```mermaid +graph TD +ConfigAPI[配置API] --> SysConfigDict[sys_config_dict服务] +ConfigAPI --> CardApple[card_apple常量] +SysConfigDict --> Database[(数据库)] +CardApple -.-> ConfigAPI +``` + +**图示来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [card_apple.go](file://internal/consts/card_apple.go) + +**本节来源** +- [internal/service/sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [internal/consts/card_apple.go](file://internal/consts/card_apple.go) + +## 性能考虑 +在设计Apple卡密配置管理API时,需要考虑性能和可扩展性。由于配置数据通常不会频繁变更,可以考虑在客户端或中间层进行缓存,以减少对后端服务的请求压力。同时,配置更新操作应该具有原子性,确保在并发环境下数据的一致性。对于大规模部署,可以考虑使用分布式配置中心来管理配置,提高系统的可用性和响应速度。 + +## 故障排查指南 +在使用Apple卡密配置管理API时,可能会遇到各种问题。常见的问题包括配置更新不生效、获取配置返回错误等。对于配置更新不生效的问题,首先检查请求参数是否正确,然后确认服务层是否成功写入数据库。对于获取配置返回错误的问题,检查网络连接和API端点是否正确。此外,还应该查看系统日志,寻找可能的错误信息。 + +**本节来源** +- [internal/controller/card_info_apple/card_info_apple_v1_config_get.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_get.go) +- [internal/controller/card_info_apple/card_info_apple_v1_config_set.go](file://internal/controller/card_info_apple/card_info_apple_v1_config_set.go) + +## 结论 +Apple卡密配置管理API为系统管理员提供了灵活的配置管理能力,通过标准化的RESTful接口实现了配置的读取和写入。该功能的设计遵循了分层架构原则,具有良好的可维护性和可扩展性。通过合理设置各项配置参数,可以有效控制系统的安全性和性能,满足不同业务场景的需求。未来可以考虑增加配置版本管理和审计日志功能,进一步提升系统的可管理性和安全性。 + +## 附录 +### 配置参数说明表 +| 参数名称 | 类型 | 描述 | 有效值范围 | +| --- | --- | --- | --- | +| isAllowDifferentAmount | bool | 是否允许金额异议充值 | true/false | +| isAllowDifferentSucceedCallback | bool | 是否允许金额异议回调(充值成功) | true/false | +| isAllowDifferentFailCallback | bool | 是否允许金额异议回调(充值失败) | true/false | +| redeemCardMinAmount | int64 | 充值卡最小充值金额 | ≥50 | +| isAllowCompensatedCallback | bool | 是否允许补卡自动回调 | true/false | +| redeemCardRate | int | 充值卡充值速率 | ≥0 | + +**本节来源** +- [api/card_info_apple/v1/config.go](file://api/card_info_apple/v1/config.go) +- [internal/consts/card_apple.go](file://internal/consts/card_apple.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Ctrip卡密管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Ctrip卡密管理API.md new file mode 100644 index 00000000..d2672d5c --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/Ctrip卡密管理API.md @@ -0,0 +1,312 @@ +# Ctrip卡密管理API + + +**本文档引用的文件** +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [config.go](file://api/card_info_c_trip/v1/config.go) +- [order.go](file://api/card_info_c_trip/v1/order.go) +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go) +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go) +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [sys_auth.go](file://internal/service/sys_auth.go) +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了Ctrip卡密管理API,涵盖账户管理、订单处理等核心接口。文档详细说明了账户创建、充值配置、订单提交等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供了实际使用示例,包括Ctrip账户Cookie管理、充值订单提交、订单历史查询等场景。解释了Ctrip卡密特有的兑换配置机制和回调处理,提供了错误处理策略和安全考虑。文档还包含客户端实现指南和性能优化建议,特别关注Ctrip平台的API调用频率限制和数据加密要求。 + +## 项目结构 +Ctrip卡密管理API的项目结构遵循模块化设计原则,将不同功能分离到独立的目录中。核心API接口位于`api/card_info_c_trip/v1`目录下,控制器实现位于`internal/controller/card_info_c_trip`目录中。数据模型定义在`internal/model/entity`目录,服务接口在`internal/service`目录中声明。 + +```mermaid +graph TD +subgraph "API接口层" +A[account.go] +B[config.go] +C[order.go] +end +subgraph "控制器层" +D[card_info_c_trip_v1_account_create.go] +E[card_info_c_trip_v1_submit.go] +F[card_info_c_trip_v1_order_callback.go] +G[card_info_c_trip_v1_redeem_config_get.go] +H[card_info_c_trip_v1_account_cookie_check.go] +end +subgraph "服务层" +I[card_redeem_order.go] +J[sys_config_dict.go] +K[sys_auth.go] +end +subgraph "模型层" +L[v_1_card_redeem_account_info.go] +M[v_1_card_redeem_order_info.go] +end +A --> D +B --> G +C --> E +C --> F +D --> I +E --> I +F --> I +G --> J +H --> K +L --> D +M --> E +M --> F +``` + +**图示来源** +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [config.go](file://api/card_info_c_trip/v1/config.go) +- [order.go](file://api/card_info_c_trip/v1/order.go) +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go) +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go) +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [sys_auth.go](file://internal/service/sys_auth.go) + +**本节来源** +- [api/card_info_c_trip](file://api/card_info_c_trip) +- [internal/controller/card_info_c_trip](file://internal/controller/card_info_c_trip) + +## 核心组件 +Ctrip卡密管理API的核心组件包括账户管理、配置管理、订单处理三大模块。账户管理模块负责Ctrip账户的创建、更新、删除和状态管理。配置管理模块处理Ctrip卡密的兑换配置,包括金额异议设置、最小充值金额等。订单处理模块负责充值订单的提交、查询和回调处理。 + +**本节来源** +- [account.go](file://api/card_info_c_trip/v1/account.go#L1-L149) +- [config.go](file://api/card_info_c_trip/v1/config.go#L1-L29) +- [order.go](file://api/card_info_c_trip/v1/order.go#L1-L56) + +## 架构概述 +Ctrip卡密管理API采用分层架构设计,包含API接口层、控制器层、服务层和数据模型层。API接口层定义了HTTP端点和请求/响应结构。控制器层处理具体的业务逻辑,调用服务层接口。服务层封装了核心业务逻辑,提供可重用的服务接口。数据模型层定义了数据库表结构和实体关系。 + +```mermaid +graph TB +subgraph "客户端" +Client[客户端应用] +end +subgraph "API网关" +API[API接口] +end +subgraph "业务逻辑层" +Controller[控制器] +Service[服务] +end +subgraph "数据访问层" +DAO[数据访问对象] +DB[(数据库)] +end +Client --> API +API --> Controller +Controller --> Service +Service --> DAO +DAO --> DB +``` + +**图示来源** +- [card_info_c_trip.go](file://internal/controller/card_info_c_trip/card_info_c_trip.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + +## 详细组件分析 +### 账户管理分析 +Ctrip账户管理功能提供了完整的账户生命周期管理,包括创建、更新、删除、状态管理和Cookie验证。 + +#### 账户创建流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant ClientInt as "第三方客户端" +Client->>Controller : POST /cardInfo/cTrip/account/create +Controller->>Service : 验证用户登录状态 +Service-->>Controller : 返回用户信息 +Controller->>ClientInt : 获取Ctrip客户端实例 +ClientInt-->>Controller : 返回客户端 +Controller->>ClientInt : 查询用户信息(Cookie) +ClientInt-->>Controller : 返回用户信息 +Controller->>Service : 检查账户是否已存在 +Service-->>Controller : 返回存在状态 +Controller->>ClientInt : 查询账户余额 +ClientInt-->>Controller : 返回余额信息 +Controller->>Service : 添加新账户 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回响应 +``` + +**图示来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go#L22-L65) +- [account.go](file://api/card_info_c_trip/v1/account.go#L45-L60) + +**本节来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go#L1-L66) +- [account.go](file://api/card_info_c_trip/v1/account.go#L1-L149) + +### 订单处理分析 +Ctrip订单处理模块负责充值订单的提交、状态管理和回调处理。 + +#### 订单提交流程 +```mermaid +flowchart TD +Start([接收订单请求]) --> ValidateInput["验证输入参数"] +ValidateInput --> InputValid{"参数有效?"} +InputValid --> |否| ReturnError["返回错误响应"] +InputValid --> |是| LogRequest["记录请求日志"] +LogRequest --> AddOrder["添加订单到数据库"] +AddOrder --> TriggerProcess["触发订单处理"] +TriggerProcess --> End([返回响应]) +ReturnError --> End +``` + +**图示来源** +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go#L14-L30) +- [order.go](file://api/card_info_c_trip/v1/order.go#L10-L25) + +**本节来源** +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go#L1-L31) +- [order.go](file://api/card_info_c_trip/v1/order.go#L1-L56) + +### 配置管理分析 +Ctrip兑换配置管理提供了灵活的配置选项,允许管理员调整系统行为。 + +#### 配置获取流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "配置服务" +Client->>Controller : GET /cardInfo/cTrip/config/get +Controller->>Service : 获取金额异议设置 +Service-->>Controller : 返回设置 +Controller->>Service : 获取最小充值金额 +Service-->>Controller : 返回金额 +Controller->>Service : 获取成功回调设置 +Service-->>Controller : 返回设置 +Controller->>Service : 获取失败回调设置 +Service-->>Controller : 返回设置 +Controller->>Service : 获取补卡回调设置 +Service-->>Controller : 返回设置 +Controller->>Service : 获取充值速率 +Service-->>Controller : 返回速率 +Controller-->>Client : 返回完整配置 +``` + +**图示来源** +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go#L10-L24) +- [config.go](file://api/card_info_c_trip/v1/config.go#L10-L20) + +**本节来源** +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go#L1-L25) +- [config.go](file://api/card_info_c_trip/v1/config.go#L1-L29) + +### Cookie验证分析 +Ctrip账户Cookie验证功能确保账户的有效性和可用性。 + +#### Cookie验证流程 +```mermaid +flowchart TD +Start([开始验证]) --> CheckAuth["验证用户权限"] +CheckAuth --> AuthValid{"权限有效?"} +AuthValid --> |否| ReturnAuthError["返回权限错误"] +AuthValid --> |是| CheckRateLimit["检查速率限制"] +CheckRateLimit --> RateValid{"未超限?"} +RateValid --> |否| ReturnRateError["返回频率错误"] +RateValid --> |是| GetClient["获取Ctrip客户端"] +GetClient --> QueryUserInfo["查询用户信息"] +QueryUserInfo --> UserInfoValid{"信息有效?"} +UserInfoValid --> |否| ReturnInvalid["返回无效"] +UserInfoValid --> |是| QueryBalance["查询账户余额"] +QueryBalance --> BalanceValid{"余额有效?"} +BalanceValid --> |否| ReturnBalanceError["返回余额错误"] +BalanceValid --> |是| CheckExist["检查账户是否存在"] +CheckExist --> SetExistFlag["设置存在标志"] +SetExistFlag --> ReturnSuccess["返回成功结果"] +ReturnAuthError --> End([结束]) +ReturnRateError --> End +ReturnInvalid --> End +ReturnBalanceError --> End +ReturnSuccess --> End +``` + +**图示来源** +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go#L21-L71) +- [account.go](file://api/card_info_c_trip/v1/account.go#L62-L80) + +**本节来源** +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go#L1-L72) +- [account.go](file://api/card_info_c_trip/v1/account.go#L1-L149) + +## 依赖分析 +Ctrip卡密管理API依赖多个内部服务和外部组件,形成了复杂的依赖关系网络。 + +```mermaid +graph TD +AccountAPI[账户API] --> AccountController[账户控制器] +ConfigAPI[配置API] --> ConfigController[配置控制器] +OrderAPI[订单API] --> OrderController[订单控制器] +AccountController --> SysAuth[认证服务] +AccountController --> CardRedeemOrder[订单服务] +AccountController --> RedeemClient[Ctrip客户端] +ConfigController --> SysConfigDict[配置字典服务] +OrderController --> SysAuth +OrderController --> CardRedeemOrder +CardRedeemOrder --> Database[(数据库)] +SysConfigDict --> Database +SysAuth --> Database +RedeemClient --> CtripAPI[Ctrip外部API] +``` + +**图示来源** +- [sys_auth.go](file://internal/service/sys_auth.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) + +**本节来源** +- [sys_auth.go](file://internal/service/sys_auth.go#L1-L39) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go#L1-L79) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go#L1-L81) + +## 性能考虑 +Ctrip卡密管理API在设计时考虑了多种性能优化策略。系统实现了接口速率限制,防止恶意用户频繁调用接口。通过缓存机制减少对第三方API的调用频率,提高响应速度。异步处理订单提交,避免阻塞主线程。数据库查询优化,使用索引提高查询效率。批量操作支持,减少网络往返次数。 + +## 故障排除指南 +### 常见错误及解决方案 +- **权限不足错误**: 确保用户已登录且具有相应权限 +- **Cookie失效错误**: 检查提供的Cookie是否有效,重新获取最新Cookie +- **操作过于频繁错误**: 遵守API调用频率限制,等待一段时间后重试 +- **订单已回调错误**: 不要重复调用回调接口,每个订单只能回调一次 +- **金额异议不回调错误**: 检查订单状态,金额异议订单不允许回调 + +**本节来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go#L22-L65) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go#L14-L30) +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go#L16-L53) +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go#L21-L71) + +## 结论 +Ctrip卡密管理API提供了一套完整的解决方案,用于管理Ctrip账户和处理充值订单。系统设计合理,分层清晰,易于维护和扩展。通过详细的文档和示例,开发者可以快速理解和使用API。建议在实际使用中注意API调用频率限制,合理使用缓存机制,确保系统的稳定性和性能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密数据汇总.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密数据汇总.md new file mode 100644 index 00000000..8221d15c --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密数据汇总.md @@ -0,0 +1,240 @@ +# 京东卡密数据汇总 + + +**本文档引用文件** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) +- [cache.go](file://utility/cache/cache.go) +- [consts.go](file://utility/cache/consts.go) +- [card_info_jd.go](file://api/card_info_jd/v1/order_summary.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了京东卡密数据汇总API的设计与实现,涵盖订单汇总、账户统计、交易分析等接口的HTTP方法、URL模式、请求/响应模式和认证机制。重点描述了数据汇总的计算逻辑、时间范围选择和数据精度控制,并提供实际使用示例,如日/月交易量统计、账户余额汇总、充值成功率分析等场景。同时解释了数据缓存策略、查询性能优化和大数据量处理机制,确保在高并发查询场景下的响应时间优化。 + +## 项目结构 +本项目采用分层架构设计,主要分为API层、控制器层、服务层、逻辑层和数据访问层。京东卡密相关功能集中在`api/card_info_jd`和`internal/controller/card_info_jd`目录下,订单汇总功能则分布在`api/order`和`internal/controller/order`目录中。缓存机制由`utility/cache`模块统一管理,数据库操作通过`internal/dao`实现。 + +```mermaid +graph TB +subgraph "API层" +A[card_info_jd/v1/order_summary.go] +B[order/v1/order_summary.go] +end +subgraph "控制器层" +C[card_info_jd_v1_order_summary_list.go] +D[order_v1_order_summary_get_list.go] +end +subgraph "服务层" +E[merchant_order.go] +end +subgraph "逻辑层" +F[order-summary.go] +end +subgraph "数据访问层" +G[dao/V1OrderInfo.go] +end +subgraph "缓存层" +H[cache.go] +end +A --> C +B --> D +C --> E +D --> E +E --> F +F --> G +F --> H +``` + +**Diagram sources** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) + +## 核心组件 + +京东卡密数据汇总的核心组件包括订单汇总接口、数据计算逻辑和服务注册机制。订单汇总接口提供HTTP端点用于获取统计信息,数据计算逻辑负责从数据库中提取并聚合数据,服务注册机制确保订单汇总服务的正确初始化和调用。 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) +- [merchant_order.go](file://internal/service/merchant_order.go) + +## 架构概述 + +系统采用典型的分层架构,从前端API到后端数据存储形成清晰的数据流。用户请求首先到达API层,经过控制器层处理后,调用服务层提供的接口。服务层协调逻辑层完成具体的业务处理,包括数据查询、聚合计算等。逻辑层通过DAO层与数据库交互,并利用缓存层提高查询性能。 + +```mermaid +graph LR +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> Logic[逻辑层] +Logic --> Cache[缓存] +Logic --> Database[数据库] +Cache --> Logic +Database --> Logic +``` + +**Diagram sources** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) + +## 详细组件分析 + +### 订单汇总接口分析 + +#### 接口定义 +```mermaid +classDiagram +class OrderSummaryListReq { ++string RoadUid ++CommonPageReq +} +class OrderSummaryListRes { ++CommonPageRes[OrderSummaryRecord] +} +class OrderSummaryRecord { ++string MerchantUid ++string MerchantName ++int64 SucceedCount ++float64 SucceedShowAmount ++float64 SucceedFactAmount ++int64 TotalCount ++float64 TotalShowAmount ++float64 TotalFactAmount ++float64 Rate ++string Date ++int64 FailedCount ++int64 WaitedCount +} +OrderSummaryListRes --> OrderSummaryRecord : "包含" +``` + +**Diagram sources** +- [order_summary.go](file://api/order/v1/order_summary.go) + +#### 请求处理流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "逻辑层" +participant Database as "数据库" +participant Cache as "缓存" +Client->>API : GET /cardInfo/JDCard/order/summary +API->>Controller : 转发请求 +Controller->>Service : 调用OrderSummary() +Service->>Logic : 获取汇总数据 +Logic->>Cache : 检查缓存 +alt 缓存命中 +Cache-->>Logic : 返回缓存数据 +else 缓存未命中 +Logic->>Database : 查询数据库 +Database-->>Logic : 返回原始数据 +Logic->>Logic : 聚合计算 +Logic->>Cache : 存储计算结果 +end +Logic-->>Service : 返回汇总结果 +Service-->>Controller : 返回结果 +Controller-->>API : 返回响应 +API-->>Client : 返回JSON数据 +``` + +**Diagram sources** +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) + +#### 数据计算逻辑 +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> CheckCache["检查缓存是否存在"] +CheckCache --> CacheHit{"缓存命中?"} +CacheHit --> |是| ReturnCache["返回缓存数据"] +CacheHit --> |否| QueryDB["查询数据库"] +QueryDB --> ProcessData["处理原始数据"] +ProcessData --> Aggregate["执行聚合计算"] +Aggregate --> FormatResult["格式化结果"] +FormatResult --> UpdateCache["更新缓存"] +UpdateCache --> ReturnResult["返回结果"] +ReturnCache --> End([结束]) +ReturnResult --> End +``` + +**Diagram sources** +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +## 依赖分析 + +系统各组件之间存在明确的依赖关系,形成了稳定的服务调用链。API层依赖控制器层,控制器层依赖服务层,服务层依赖逻辑层,逻辑层依赖数据访问层和缓存层。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[逻辑层] +D --> E[DAO层] +D --> F[缓存层] +E --> G[数据库] +F --> G[数据库] +``` + +**Diagram sources** +- [merchant_order.go](file://internal/service/merchant_order.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +**Section sources** +- [merchant_order.go](file://internal/service/merchant_order.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +## 性能考虑 + +为确保系统在高并发场景下的性能表现,采用了多项优化措施。首先,通过Redis缓存频繁访问的数据,减少数据库压力。其次,使用分页查询避免一次性加载大量数据。最后,对关键路径进行性能监控,及时发现和解决瓶颈问题。 + +**Section sources** +- [cache.go](file://utility/cache/cache.go) +- [consts.go](file://utility/cache/consts.go) + +## 故障排除指南 + +当遇到数据汇总接口响应缓慢或返回错误时,可按照以下步骤进行排查: +1. 检查缓存服务是否正常运行 +2. 验证数据库连接是否稳定 +3. 查看日志中是否有SQL执行超时记录 +4. 确认请求参数是否符合规范 +5. 检查是否有大量并发请求导致资源竞争 + +**Section sources** +- [cache.go](file://utility/cache/cache.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +## 结论 + +京东卡密数据汇总API通过分层架构设计和缓存优化策略,实现了高效的数据统计功能。系统能够支持日/月交易量统计、账户余额汇总、充值成功率分析等多种业务场景,满足高并发查询的需求。未来可通过引入更精细的缓存策略和数据库索引优化进一步提升性能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密管理API.md new file mode 100644 index 00000000..4d8f860e --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密管理API.md @@ -0,0 +1,312 @@ +# 京东卡密管理API + + +**本文档引用文件** +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [account.go](file://api/card_info_jd/v1/account.go) +- [order.go](file://api/card_info_jd/v1/order.go) +- [config.go](file://api/card_info_jd/v1/config.go) +- [card_info_jd_v1_jd_account_cookie_batch_add.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_batch_add.go) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_jd.go](file://internal/consts/card_jd.go) +- [utility/redeem/jd.go](file://utility/integration/redeem/jd/jd.go) +- [utility/restriction/jd.go](file://utility/integration/restriction/jd.go) +- [middleware/auth.go](file://internal/middleware/auth.go) +- [model/card_redeem_cookie.go](file://internal/model/card_redeem_cookie.go) +- [dao/v_1_card_redeem_cookie_info.go](file://internal/dao/v_1_card_redeem_cookie_info.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了京东卡密管理API的设计与实现,涵盖账户管理、充值处理、订单回调等关键接口。系统支持京东平台的卡密兑换与账户管理,具备完整的Cookie验证机制、风控策略和反爬虫应对方案。文档重点说明了账户创建、批量Cookie导入、充值订单提交、状态同步等核心功能的实现方式,并提供客户端集成指南和性能优化建议。 + +## 项目结构 +京东卡密管理模块主要位于`api/card_info_jd`和`internal/controller/card_info_jd`目录下,采用分层架构设计,包含API接口层、控制器层、服务层和数据访问层。系统通过`v1`版本化接口提供RESTful服务,支持账户管理、订单处理和配置操作。 + +```mermaid +graph TB +subgraph "API接口层" +A[account.go] +B[order.go] +C[config.go] +end +subgraph "控制器层" +D[card_info_jd_v1_jd_account_*] +E[card_info_jd_v1_submit.go] +F[card_info_jd_v1_order_callback.go] +end +subgraph "服务层" +G[service/card_redeem_cookie.go] +H[logic/card_redeem_cookie.go] +end +subgraph "数据层" +I[dao/v_1_card_redeem_cookie_info.go] +J[model/card_redeem_cookie.go] +end +A --> D +B --> E +B --> F +D --> G +E --> G +F --> G +G --> H +H --> I +I --> J +``` + +**图示来源** +- [account.go](file://api/card_info_jd/v1/account.go) +- [order.go](file://api/card_info_jd/v1/order.go) +- [config.go](file://api/card_info_jd/v1/config.go) +- [card_info_jd_v1_jd_account_cookie_batch_add.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_batch_add.go) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) + +**本节来源** +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [api/card_info_jd/v1](file://api/card_info_jd/v1) + +## 核心组件 +京东卡密管理系统包含三大核心功能模块:账户管理、充值处理和订单回调。账户管理模块负责京东账户Cookie的批量导入、状态检测和有效性验证;充值处理模块实现卡密提交、订单创建和状态跟踪;订单回调模块提供外部系统状态同步接口。系统通过`card_redeem_jd`模块实现与京东平台的直接交互,包含专门的风控规避机制和请求频率控制。 + +**本节来源** +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_jd.go](file://internal/consts/card_jd.go) + +## 架构概览 +系统采用典型的分层架构,前端通过HTTP API与后端交互,后端各层职责分明。API层定义接口规范,控制器层处理业务逻辑,服务层封装核心功能,数据访问层负责持久化操作。整个流程通过中间件进行认证和错误处理,确保系统安全性和稳定性。 + +```mermaid +graph LR +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> DB[(数据库)] +subgraph "安全层" +Auth[认证中间件] +Limit[限流组件] +end +Controller --> Auth +Controller --> Limit +subgraph "外部集成" +JD[京东平台] +Restriction[风控系统] +end +Service --> JD +Service --> Restriction +``` + +**图示来源** +- [middleware/auth.go](file://internal/middleware/auth.go) +- [utility/limiter/rate.go](file://utility/limiter/rate.go) +- [utility/integration/redeem/jd/jd.go](file://utility/integration/redeem/jd/jd.go) +- [utility/integration/restriction/jd.go](file://utility/integration/restriction/jd.go) + +## 详细组件分析 + +### 账户管理分析 +账户管理模块提供完整的京东账户生命周期管理功能,包括创建、更新、删除和状态刷新。系统支持通过批量文件导入Cookie,自动进行有效性验证和分类存储。 + +#### 账户管理类图 +```mermaid +classDiagram +class JDAccountController { ++createAccount(req) Response ++updateAccount(id, req) Response ++deleteAccount(id) Response ++refreshStatus(id) Response ++batchAddCookie(file) Response ++batchCheckCookie() Response +} +class JDAccountService { +-cookieValidator : CookieValidator +-accountRepository : AccountRepository ++addAccount(account) error ++updateAccount(id, account) error ++removeAccount(id) error ++validateCookie(cookie) ValidationResult ++syncAccountStatus(id) StatusResult +} +class CookieValidator { ++validateFormat(cookie) bool ++testConnectivity(cookie) bool ++checkRestriction(cookie) RestrictionResult +-simulateLogin(cookie) LoginResult +} +class AccountRepository { ++save(account) error ++findById(id) Account ++findAll() []Account ++updateStatus(id, status) error +} +class Account { ++string accountId ++string cookie ++string nickname ++float balance ++string status ++datetime createdAt ++datetime updatedAt ++getStatus() string ++getBalance() float +} +JDAccountController --> JDAccountService : "调用" +JDAccountService --> CookieValidator : "使用" +JDAccountService --> AccountRepository : "依赖" +JDAccountService --> Account : "操作" +``` + +**图示来源** +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_info_jd_v1_jd_account_update.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go) +- [card_info_jd_v1_jd_account_delete.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_delete.go) +- [card_info_jd_v1_jd_account_refresh_status.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_refresh_status.go) +- [model/card_redeem_cookie.go](file://internal/model/card_redeem_cookie.go) + +**本节来源** +- [account.go](file://api/card_info_jd/v1/account.go) +- [internal/controller/card_info_jd/card_info_jd_v1_jd_account_*.go](file://internal/controller/card_info_jd/) + +### 充值处理分析 +充值处理模块负责卡密兑换的核心业务流程,从订单提交到结果回调的完整生命周期管理。系统实现智能路由选择、失败重试机制和状态同步功能。 + +#### 充值处理序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API网关" +participant Controller as "充值控制器" +participant Service as "充值服务" +participant JD as "京东平台" +participant DB as "数据库" +Client->>API : POST /api/jd/submit +API->>Controller : 转发请求 +Controller->>Service : submitOrder(order) +Service->>Service : validateOrder(order) +Service->>Service : selectRoad(order) +Service->>JD : redeemCard(cookie, cardNo) +alt 兑换成功 +JD-->>Service : 返回成功结果 +Service->>DB : 更新订单状态 +Service-->>Controller : 返回成功响应 +Controller-->>API : 返回结果 +API-->>Client : {status : "success", orderId} +else 兑换失败 +JD-->>Service : 返回错误信息 +Service->>Service : scheduleRetry(order) +Service-->>Controller : 返回失败响应 +Controller-->>API : 返回结果 +API-->>Client : {status : "failed", orderId, retryAfter} +end +Note over Client,DB : 订单状态最终一致性保障 +``` + +**图示来源** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [utility/integration/redeem/jd/jd.go](file://utility/integration/redeem/jd/jd.go) +- [internal/model/card_redeem_cookie_order_jd.go](file://internal/model/card_redeem_cookie_order_jd.go) + +**本节来源** +- [order.go](file://api/card_info_jd/v1/order.go) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) + +### 订单回调分析 +订单回调模块提供标准化接口,用于接收外部系统(如京东平台)的订单状态更新通知,实现双向状态同步。 + +#### 订单回调流程图 +```mermaid +flowchart TD +Start([收到回调请求]) --> Validate["验证请求签名"] +Validate --> SignatureValid{"签名有效?"} +SignatureValid --> |否| ReturnError["返回401错误"] +SignatureValid --> |是| Parse["解析回调数据"] +Parse --> Extract["提取订单信息"] +Extract --> FindOrder["查询本地订单"] +FindOrder --> OrderExists{"订单存在?"} +OrderExists --> |否| CreateOrder["创建新订单"] +OrderExists --> |是| UpdateStatus["更新订单状态"] +UpdateStatus --> CheckChange["状态有变化?"] +CheckChange --> |是| Notify["触发通知机制"] +CheckChange --> |否| SkipNotify["跳过通知"] +Notify --> Log["记录操作日志"] +SkipNotify --> Log +Log --> ReturnSuccess["返回200成功"] +ReturnError --> End([响应完成]) +ReturnSuccess --> End +``` + +**图示来源** +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [utility/verify/utils.go](file://utility/verify/utils.go) +- [internal/dao/v_1_card_redeem_cookie_order_jd.go](file://internal/dao/v_1_card_redeem_cookie_order_jd.go) + +**本节来源** +- [order.go](file://api/card_info_jd/v1/order.go) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) + +## 依赖分析 +系统依赖多个内部和外部组件,形成复杂的依赖网络。核心依赖包括认证中间件、限流组件、京东平台集成和数据库持久化层。 + +```mermaid +graph TD +A[京东卡密API] --> B[认证中间件] +A --> C[限流组件] +A --> D[京东平台集成] +A --> E[数据库访问] +A --> F[风控系统] +B --> G[用户令牌系统] +C --> H[Redis限流] +D --> I[HTTP客户端] +D --> J[Cookie管理] +E --> K[ORM框架] +F --> L[IP限制检查] +F --> M[请求频率监控] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#bbf,stroke:#333 +style D fill:#bbf,stroke:#333 +style E fill:#bbf,stroke:#333 +style F fill:#bbf,stroke:#333 +``` + +**图示来源** +- [middleware/auth.go](file://internal/middleware/auth.go) +- [utility/limiter/redis.go](file://utility/limiter/redis.go) +- [utility/integration/redeem/jd/jd.go](file://utility/integration/redeem/jd/jd.go) +- [internal/dao/internal/v_1_card_redeem_cookie_info.go](file://internal/dao/internal/v_1_card_redeem_cookie_info.go) +- [utility/integration/restriction/jd.go](file://utility/integration/restriction/jd.go) + +**本节来源** +- [go.mod](file://go.mod) +- [internal/middleware](file://internal/middleware) +- [utility/integration](file://utility/integration) + +## 性能考虑 +系统在设计时充分考虑了京东平台的反爬虫机制和请求频率限制。通过分布式限流、智能重试、请求合并等策略,确保在高并发场景下的稳定性和效率。建议客户端实现指数退避重试机制,避免因频繁请求导致IP被封禁。系统内部采用连接池和缓存机制,减少数据库访问压力,提高响应速度。 + +## 故障排除指南 +常见问题包括Cookie失效、订单状态不同步、请求被限流等。对于Cookie失效问题,应检查京东账户登录状态和安全验证;对于状态不同步,可手动触发状态刷新或检查回调配置;对于限流问题,应降低请求频率或联系管理员调整配额。系统提供详细的日志记录和监控指标,便于问题定位和分析。 + +**本节来源** +- [internal/errHandler/handler.go](file://internal/errHandler/handler.go) +- [utility/monitor/monitor.go](file://utility/monitor/monitor.go) +- [internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_check.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_check.go) + +## 结论 +京东卡密管理API提供了一套完整的解决方案,涵盖账户管理、充值处理和状态同步等核心功能。系统设计充分考虑了京东平台的特殊要求和限制,通过合理的架构设计和优化策略,确保了系统的稳定性、安全性和可扩展性。建议用户遵循最佳实践,合理使用API,避免触发平台的反爬虫机制。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密订单处理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密订单处理.md new file mode 100644 index 00000000..b41b9025 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密订单处理.md @@ -0,0 +1,244 @@ +# 京东卡密订单处理 + + +**本文档引用文件** +- [order.go](file://api/card_info_jd/v1/order.go) +- [account.go](file://api/card_info_jd/v1/account.go) +- [config.go](file://api/card_info_jd/v1/config.go) +- [order_summary.go](file://api/card_info_jd/v1/order_summary.go) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [v_1_card_redeem_order_info.go](file://internal/dao/v_1_card_redeem_order_info.go) +- [v_1_card_redeem_account_info.go](file://internal/dao/v_1_card_redeem_account_info.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了京东卡密订单处理API的设计与实现,涵盖订单提交、状态回调、历史查询等核心功能。重点描述了订单创建、支付处理、状态同步等流程,并提供客户端实现指南、错误处理策略和性能优化建议,特别关注订单状态一致性保障机制。 + +## 项目结构 +京东卡密订单处理系统采用模块化设计,主要分为API接口层、控制器层、服务层和数据访问层。系统通过清晰的分层架构实现了高内聚低耦合的设计原则。 + +```mermaid +graph TB +subgraph "API层" +OrderAPI["/cardInfo/JDCard/order/submit"] +AccountAPI["/cardInfo/JDCard/account/*"] +ConfigAPI["/cardInfo/JDCard/config/*"] +end +subgraph "控制器层" +OrderController["card_info_jd_v1_submit.go"] +CallbackController["card_info_jd_v1_order_callback.go"] +end +subgraph "服务层" +OrderService["CardRedeemOrder服务"] +AuthService["SysAuth服务"] +end +subgraph "数据层" +OrderDAO["v_1_card_redeem_order_info.go"] +AccountDAO["v_1_card_redeem_account_info.go"] +end +OrderAPI --> OrderController +AccountAPI --> OrderController +ConfigAPI --> OrderController +OrderController --> OrderService +OrderController --> AuthService +OrderService --> OrderDAO +OrderService --> AccountDAO +``` + +**Diagram sources** +- [order.go](file://api/card_info_jd/v1/order.go#L1-L56) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L30) + +**Section sources** +- [order.go](file://api/card_info_jd/v1/order.go#L1-L56) +- [account.go](file://api/card_info_jd/v1/account.go#L1-L145) + +## 核心组件 + +京东卡密订单处理系统的核心组件包括订单提交、状态回调、账户管理和配置管理四大模块。订单提交模块负责接收商户充值请求并创建订单;状态回调模块实现订单状态通知功能;账户管理模块维护京东账户信息;配置管理模块提供系统参数设置。 + +**Section sources** +- [order.go](file://api/card_info_jd/v1/order.go#L1-L56) +- [config.go](file://api/card_info_jd/v1/config.go#L1-L33) + +## 架构概述 + +系统采用典型的分层架构设计,从前端API到后端数据存储形成完整的处理链条。各层之间通过明确定义的接口进行通信,确保系统的可维护性和可扩展性。 + +```mermaid +graph TD +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> DB[(数据库)] +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style DAO fill:#69f,stroke:#333 +style DB fill:#9f9,stroke:#333 +``` + +**Diagram sources** +- [order.go](file://api/card_info_jd/v1/order.go#L1-L56) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L30) + +## 详细组件分析 + +### 订单提交分析 +订单提交功能是系统的核心业务流程,负责接收商户的充值请求并创建相应的订单记录。 + +#### 订单提交请求模型 +```mermaid +classDiagram +class SubmitReq { ++string CardNo ++string GiftCardPwd ++string NotifyUrl ++float64 Amount ++string MerchantId ++string Attach ++g.Meta path : "/cardInfo/JDCard/order/submit" tags : "京东充值卡订单" method : "post" summary : "充值" +} +SubmitReq : +CardNo : 卡号 +SubmitReq : +GiftCardPwd : 礼品卡密码 +SubmitReq : +NotifyUrl : 回调地址 +SubmitReq : +Amount : 充值金额 +SubmitReq : +MerchantId : 商户ID +SubmitReq : +Attach : 附加信息 +``` + +**Diagram sources** +- [order.go](file://api/card_info_jd/v1/order.go#L10-L20) + +#### 订单提交处理流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "订单服务" +participant DAO as "数据访问层" +Client->>API : POST /cardInfo/JDCard/order/submit +API->>Controller : 转发请求 +Controller->>Service : 调用AddOne方法 +Service->>DAO : 创建订单记录 +DAO-->>Service : 返回订单信息 +Service->>Service : 触发验证和消费 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回响应 +``` + +**Diagram sources** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L30) + +### 订单回调分析 +订单回调功能用于处理订单状态变更通知,确保商户能够及时获取订单处理结果。 + +#### 订单回调处理流程 +```mermaid +flowchart TD +Start([开始]) --> AuthCheck["验证用户权限"] +AuthCheck --> OrderQuery["查询订单信息"] +OrderQuery --> StatusCheck["检查订单状态"] +StatusCheck --> |订单不存在| ReturnError["返回错误"] +StatusCheck --> |权限不足| ReturnError +StatusCheck --> |已回调| ReturnError +StatusCheck --> |未结束状态| ReturnError +StatusCheck --> |金额异议| ReturnError +StatusCheck --> |可回调| CallBack["执行回调"] +CallBack --> UpdateStatus["更新通知状态"] +UpdateStatus --> ReturnSuccess["返回成功"] +ReturnError --> End([结束]) +ReturnSuccess --> End +``` + +**Diagram sources** +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go#L1-L54) + +### 账户管理分析 +账户管理模块负责京东账户的全生命周期管理,包括创建、查询、更新和状态维护。 + +```mermaid +classDiagram +class JDAccountListRecord { ++V1CardRedeemAccountInfo ++UploadUser +} +class UploadUser { ++string Id ++string Username ++string Nickname +} +class JDAccountRecord { ++string Cookie ++string Name ++int MaxAmountLimit ++int MaxCountLimit ++string Remark ++int Status +} +JDAccountListRecord --> UploadUser : "包含" +JDAccountListRecord --> JDAccountRecord : "继承" +``` + +**Diagram sources** +- [account.go](file://api/card_info_jd/v1/account.go#L50-L100) + +## 依赖分析 + +系统各组件之间的依赖关系清晰明确,遵循单向依赖原则,避免循环依赖问题。 + +```mermaid +graph LR +API --> Controller +Controller --> Service +Service --> DAO +Service --> Consts[consts常量] +Service --> ErrHandler[errHandler] +Controller --> Context[context] +style API fill:#f96,stroke:#333 +style Controller fill:#69f,stroke:#333 +style Service fill:#6f9,stroke:#333 +style DAO fill:#9f9,stroke:#333 +style Consts fill:#ff9,stroke:#333 +style ErrHandler fill:#ff9,stroke:#333 +style Context fill:#ff9,stroke:#333 +``` + +**Diagram sources** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L30) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go#L1-L54) + +**Section sources** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L30) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go#L1-L54) + +## 性能考虑 + +系统在设计时充分考虑了性能因素,通过异步处理、批量操作和缓存机制来提升整体性能。订单提交后立即触发验证和消费流程,确保快速响应。批量账户检查功能支持高效处理大量账户数据。 + +## 故障排除指南 + +常见问题包括订单提交失败、回调权限不足、账户状态异常等。建议检查请求参数完整性、用户权限配置、账户可用性等。对于回调失败的情况,需确认订单是否已处理完毕且未重复回调。 + +**Section sources** +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go#L20-L40) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L15-L25) + +## 结论 + +京东卡密订单处理系统提供了完整的订单生命周期管理功能,通过清晰的API设计和稳健的错误处理机制,确保了系统的可靠性和易用性。系统架构合理,组件职责明确,为后续功能扩展奠定了良好基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密账户管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密账户管理.md new file mode 100644 index 00000000..aae14423 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/京东卡密管理API/京东卡密账户管理.md @@ -0,0 +1,242 @@ +# 京东卡密账户管理 + + +**本文档引用文件** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_info_jd_v1_jd_account_update.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go) +- [card_info_jd_v1_jd_account_delete.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_delete.go) +- [card_info_jd_v1_jd_account_cookie_batch_add.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_batch_add.go) +- [card_info_jd_v1_jd_account_cookie_check.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_check.go) +- [card_info_original_jd_v1_original_jd_account_cookie_batch_add.go](file://internal/controller/card_info_original_jd/card_info_original_jd_v1_original_jd_account_cookie_batch_add.go) +- [card_redeem_jd_v1_account_add.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_add.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [originalJd/index.go](file://utility/integration/originalJd/index.go) +- [originalJd/model.go](file://utility/integration/originalJd/model.go) +- [card_redeem_account/schdule.go](file://internal/logic/card_redeem_account/schdule.go) +- [card_apple_account/status.go](file://internal/logic/card_apple_account/status.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了京东卡密账户管理API的设计与实现,涵盖账户的创建、更新、删除和查询接口。重点描述了批量添加京东账户Cookie的实现机制,包括Cookie验证、状态检测和刷新策略。文档还提供了实际使用示例,如批量导入账户、账户状态监控和Cookie有效性验证等场景。同时解释了账户与京东平台的交互机制,包括登录状态管理、反爬虫策略应对和请求频率控制,并包含错误处理策略、安全考虑和性能优化建议。 + +## 项目结构 +京东卡密账户管理功能主要分布在`api/card_redeem_jd`和`internal/controller/card_info_jd`目录下。核心API定义在`api/card_redeem_jd/v1/account.go`中,控制器实现位于`internal/controller/card_info_jd/`目录下。账户相关的业务逻辑由`internal/service/card_redeem_account.go`和`internal/service/card_redeem_cookie.go`提供服务接口。京东平台交互通过`utility/integration/originalJd/`中的客户端实现。 + +```mermaid +graph TB +subgraph "API层" +A[account.go] +end +subgraph "控制器层" +B[card_info_jd_v1_jd_account_create.go] +C[card_info_jd_v1_jd_account_update.go] +D[card_info_jd_v1_jd_account_delete.go] +E[card_info_jd_v1_jd_account_cookie_batch_add.go] +end +subgraph "服务层" +F[card_redeem_account.go] +G[card_redeem_cookie.go] +end +subgraph "集成层" +H[originalJd/index.go] +I[originalJd/model.go] +end +A --> B +B --> F +F --> H +H --> I +``` + +**Diagram sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [originalJd/index.go](file://utility/integration/originalJd/index.go) + +**Section sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) + +## 核心组件 +京东卡密账户管理的核心组件包括账户管理API、批量Cookie处理、状态验证机制和京东平台集成。账户管理API提供标准的CRUD操作,支持通过HTTP接口进行账户的创建、更新、删除和查询。批量Cookie处理功能允许用户一次性导入多个京东账户的Cookie信息。状态验证机制确保账户的可用性,并定期刷新账户状态。京东平台集成组件负责与京东API进行通信,执行登录验证、余额查询等操作。 + +**Section sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 架构概述 +系统采用分层架构设计,从上到下分为API层、控制器层、服务层和集成层。API层定义了所有对外暴露的HTTP接口,使用GoFrame框架的元数据注解来配置路由、方法和参数。控制器层负责处理HTTP请求,进行权限验证和参数校验,然后调用相应的服务层方法。服务层封装了业务逻辑,提供统一的接口供控制器调用。集成层包含与京东平台交互的具体实现,通过HTTP客户端调用京东API。 + +```mermaid +graph TD +Client[客户端] --> API[API层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Integration[集成层] +Integration --> JD[京东平台] +style Client fill:#f9f,stroke:#333 +style JD fill:#bbf,stroke:#333 +``` + +**Diagram sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [originalJd/index.go](file://utility/integration/originalJd/index.go) + +## 详细组件分析 + +### 账户管理API分析 +账户管理API提供了完整的CRUD操作接口,使用RESTful风格设计。所有接口都通过JWT进行认证,确保只有授权用户才能访问。接口设计遵循统一的响应格式,包含状态码、消息和数据体。 + +#### 账户创建接口 +```mermaid +classDiagram +class AccountAddReq { ++string name ++string cookie ++int status ++string notes +} +class AccountAddRes { ++string message +} +AccountAddReq --> AccountAddRes : "POST /cookieInfo/jd/account/add" +``` + +**Diagram sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) + +#### 账户操作序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API网关" +participant Controller as "控制器" +participant Service as "服务层" +participant Database as "数据库" +Client->>API : POST /cookieInfo/jd/account/add +API->>Controller : 转发请求 +Controller->>Controller : 权限验证 +Controller->>Service : 调用Add方法 +Service->>Database : 插入账户记录 +Database-->>Service : 返回结果 +Service-->>Controller : 返回成功 +Controller-->>API : 返回响应 +API-->>Client : 200 OK +``` + +**Diagram sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +**Section sources** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) + +### 批量Cookie处理分析 +批量Cookie处理功能允许用户一次性导入多个京东账户的Cookie信息。系统会对每个Cookie进行验证,查询用户信息和余额,并将有效账户保存到数据库中。 + +#### 批量添加流程图 +```mermaid +flowchart TD +Start([开始]) --> ValidateAuth["验证用户权限"] +ValidateAuth --> LoopStart{遍历Cookie列表} +LoopStart --> TrimCookie["清理Cookie空白字符"] +TrimCookie --> GetClient["获取京东客户端"] +GetClient --> QueryUserInfo["查询用户信息"] +QueryUserInfo --> CheckUserValid{"用户信息有效?"} +CheckUserValid --> |否| NextCookie +CheckUserValid --> |是| QueryBalance["查询账户余额"] +QueryBalance --> SaveAccount["保存账户信息"] +SaveAccount --> NextCookie["处理下一个Cookie"] +NextCookie --> LoopEnd{是否还有Cookie?} +LoopEnd --> |是| LoopStart +LoopEnd --> |否| TriggerValidation["触发验证和消费"] +TriggerValidation --> End([结束]) +``` + +**Diagram sources** +- [card_info_jd_v1_jd_account_cookie_batch_add.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_batch_add.go) +- [card_info_original_jd_v1_original_jd_account_cookie_batch_add.go](file://internal/controller/card_info_original_jd/card_info_original_jd_v1_original_jd_account_cookie_batch_add.go) + +**Section sources** +- [card_info_jd_v1_jd_account_cookie_batch_add.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_batch_add.go) +- [card_info_original_jd_v1_original_jd_account_cookie_batch_add.go](file://internal/controller/card_info_original_jd/card_info_original_jd_v1_original_jd_account_cookie_batch_add.go) + +### 状态检测与刷新分析 +系统实现了定期的状态检测机制,确保京东账户的可用性。通过定时任务扫描所有正常状态的账户,调用京东API验证其有效性。 + +#### 状态检测流程 +```mermaid +flowchart TD +Start([定时任务启动]) --> GetTotal["获取账户总数"] +GetTotal --> LoopPages{分页处理} +LoopPages --> CreateSpan["创建追踪Span"] +CreateSpan --> QueryPage["查询一页账户"] +QueryPage --> LoopAccounts{遍历账户} +LoopAccounts --> ValidateCookie["验证Cookie有效性"] +ValidateCookie --> UpdateStatus["更新账户状态"] +UpdateStatus --> NextAccount["下一个账户"] +NextAccount --> LoopAccountsEnd{是否还有账户?} +LoopAccountsEnd --> |是| LoopAccounts +LoopAccountsEnd --> |否| NextPage["下一页"] +NextPage --> LoopPagesEnd{是否还有页?} +LoopPagesEnd --> |是| LoopPages +LoopPagesEnd --> |否| End([任务完成]) +``` + +**Diagram sources** +- [card_redeem_account/schdule.go](file://internal/logic/card_redeem_account/schdule.go) + +**Section sources** +- [card_redeem_account/schdule.go](file://internal/logic/card_redeem_account/schdule.go) + +## 依赖分析 +系统依赖于多个内部和外部组件。内部依赖包括GoFrame框架、数据库访问层和缓存系统。外部依赖主要是京东API,通过HTTP客户端进行通信。系统还依赖于配置管理、日志记录和分布式追踪等基础设施。 + +```mermaid +graph LR +A[京东卡密账户管理] --> B[GoFrame框架] +A --> C[MySQL数据库] +A --> D[Redis缓存] +A --> E[京东API] +A --> F[OpenTelemetry] +A --> G[JWT认证] +style A fill:#f96,stroke:#333 +``` + +**Diagram sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [originalJd/index.go](file://utility/integration/originalJd/index.go) + +**Section sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [originalJd/index.go](file://utility/integration/originalJd/index.go) + +## 性能考虑 +系统在设计时考虑了多个性能优化点。首先,使用了缓存机制来减少对京东API的频繁调用,特别是在用户信息和余额查询方面。其次,批量操作采用分页处理,避免一次性加载过多数据导致内存溢出。此外,系统实现了接口限流,防止恶意用户过度请求。数据库查询也进行了优化,使用了适当的索引和查询条件。 + +## 故障排除指南 +常见问题包括Cookie验证失败、账户状态异常和接口调用频繁。对于Cookie验证失败,应检查Cookie格式是否正确,是否包含必要的登录信息。账户状态异常可能是由于京东安全策略导致,建议重新获取Cookie。接口调用频繁会触发限流机制,用户需要等待一段时间后再试。系统日志记录了详细的错误信息,可通过日志追踪问题根源。 + +**Section sources** +- [card_info_jd_v1_jd_account_cookie_check.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_cookie_check.go) +- [card_redeem_account/schdule.go](file://internal/logic/card_redeem_account/schdule.go) + +## 结论 +京东卡密账户管理系统提供了一套完整的解决方案,用于管理京东账户的Cookie信息。系统设计合理,层次分明,具有良好的可维护性和扩展性。通过批量处理、状态检测和性能优化,系统能够高效地管理大量京东账户。未来可以考虑增加更多的京东API集成,如订单查询、优惠券管理等功能,进一步提升系统的实用价值。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/卡密信息管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/卡密信息管理API.md new file mode 100644 index 00000000..da176def --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/卡密信息管理API.md @@ -0,0 +1,636 @@ +# 卡密信息管理API + + +**本文档引用文件** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [order.go](file://api/card_info_c_trip/v1/order.go) +- [config.go](file://api/card_info_c_trip/v1/config.go) +- [account.go](file://api/card_info_jd/v1/account.go) +- [order.go](file://api/card_info_jd/v1/order.go) +- [config.go](file://api/card_info_jd/v1/config.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [account.go](file://api/card_info_walmart/v1/account.go) +- [order.go](file://api/card_info_walmart/v1/order.go) +- [config.go](file://api/card_info_walmart/v1/config.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了卡密信息管理API,涵盖Apple、京东、天猫、沃尔玛和Ctrip等平台的卡密管理功能。文档详细说明了每个平台的账户管理、充值处理、订单回调等接口的HTTP方法、URL模式、请求/响应模式和认证机制。包括账户创建、状态管理、充值提交、历史查询等端点,提供实际使用示例、错误处理策略和安全考虑。解释了不同平台卡密管理的共性和差异,提供客户端实现指南和性能优化建议。 + +## 项目结构 +项目结构按平台划分,每个平台有独立的API模块,包含账户管理和订单处理功能。核心功能分布在`api`目录下的各个子模块中,如`card_info_apple`、`card_info_c_trip`、`card_info_jd`、`card_info_t_mall_game`和`card_info_walmart`。每个模块包含`v1`版本的API定义,包括账户、订单和配置相关的接口。 + +```mermaid +graph TB +subgraph "API模块" +Apple[card_info_apple] +Ctrip[card_info_c_trip] +JD[card_info_jd] +Tmall[card_info_t_mall_game] +Walmart[card_info_walmart] +end +Apple --> Account["账户管理"] +Apple --> Order["订单管理"] +Apple --> Config["配置管理"] +Ctrip --> Account +Ctrip --> Order +Ctrip --> Config +JD --> Account +JD --> Order +JD --> Config +Tmall --> Account +Tmall --> Order +Tmall --> Callback["回调管理"] +Walmart --> Account +Walmart --> Order +Walmart --> Config +Walmart --> Group["分组管理"] +style Apple fill:#f9f,stroke:#333 +style Ctrip fill:#f9f,stroke:#333 +style JD fill:#f9f,stroke:#333 +style Tmall fill:#f9f,stroke:#333 +style Walmart fill:#f9f,stroke:#333 +``` + +**图示来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [account.go](file://api/card_info_jd/v1/account.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [account.go](file://api/card_info_walmart/v1/account.go) + +**章节来源** +- [api/card_info_apple](file://api/card_info_apple) +- [api/card_info_c_trip](file://api/card_info_c_trip) +- [api/card_info_jd](file://api/card_info_jd) +- [api/card_info_t_mall_game](file://api/card_info_t_mall_game) +- [api/card_info_walmart](file://api/card_info_walmart) + +## 核心组件 +核心组件包括各平台的账户管理、订单处理和配置管理功能。每个平台都有独立的API端点用于账户创建、更新、删除和状态管理,以及订单提交、查询和回调处理。配置管理功能允许设置各平台的充值规则和限制。 + +**章节来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [account.go](file://api/card_info_jd/v1/account.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [account.go](file://api/card_info_walmart/v1/account.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [order.go](file://api/card_info_c_trip/v1/order.go) +- [order.go](file://api/card_info_jd/v1/order.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [order.go](file://api/card_info_walmart/v1/order.go) + +## 架构概述 +系统采用模块化架构,每个电商平台有独立的API模块,共享通用的认证、错误处理和数据访问层。API层通过HTTP提供RESTful接口,业务逻辑层处理具体业务规则,数据访问层与数据库交互。 + +```mermaid +graph TD +Client[客户端] --> API[API层] +API --> Business[业务逻辑层] +Business --> Data[数据访问层] +Data --> DB[(数据库)] +subgraph API层 +AppleAPI[Apple API] +CtripAPI[Ctrip API] +JDAPI[JD API] +TmallAPI[Tmall API] +WalmartAPI[Walmart API] +end +subgraph 业务逻辑层 +AccountLogic[账户逻辑] +OrderLogic[订单逻辑] +ConfigLogic[配置逻辑] +end +subgraph 数据访问层 +AccountDAO[账户DAO] +OrderDAO[订单DAO] +ConfigDAO[配置DAO] +end +API --> AccountLogic +API --> OrderLogic +API --> ConfigLogic +AccountLogic --> AccountDAO +OrderLogic --> OrderDAO +ConfigLogic --> ConfigDAO +AccountDAO --> DB +OrderDAO --> DB +ConfigDAO --> DB +``` + +**图示来源** +- [controller/card_info_apple](file://internal/controller/card_info_apple) +- [controller/card_info_c_trip](file://internal/controller/card_info_c_trip) +- [controller/card_info_jd](file://internal/controller/card_info_jd) +- [controller/card_info_t_mall_game](file://internal/controller/card_info_t_mall_game) +- [controller/card_info_walmart](file://internal/controller/card_info_walmart) + +## 详细组件分析 + +### Apple平台卡密管理 + +#### 账户管理 +Apple平台提供完整的账户生命周期管理功能,包括账户创建、更新、删除、状态修改和批量导入。 + +```mermaid +classDiagram +class AppleAccountRecord { ++string Account ++string Password ++int MaxAmountLimit ++int MaxCountLimit ++string Remark +} +class CardInfoListReq { ++string Account ++CommonPageReq +} +class CardInfoCreateReq { ++AppleAccountRecord +} +class CardInfoUpdateReq { ++CommonStrId ++AppleAccountRecord +} +class CardInfoDeleteReq { ++CommonStrId +} +class CardInfoUpdateStatusReq { ++CommonStrId ++AppleAccountStatus Status +} +CardInfoListReq --> AppleAccountRecord : "返回" +CardInfoCreateReq --> AppleAccountRecord : "包含" +CardInfoUpdateReq --> AppleAccountRecord : "包含" +CardInfoUpdateStatusReq --> AppleAccountRecord : "修改状态" +``` + +**图示来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go#L10-L86) + +**章节来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) + +#### 订单管理 +Apple平台提供礼品卡充值、订单查询、订单处理和回调功能。 + +```mermaid +sequenceDiagram +participant Client +participant API +participant Business +participant DB +Client->>API : POST /cardInfo/appleCard/submit +API->>Business : 处理充值请求 +Business->>DB : 保存订单信息 +Business-->>API : 返回订单号 +API-->>Client : 返回订单状态 +Client->>API : GET /cardInfo/appleCard/query +API->>DB : 查询订单状态 +DB-->>API : 返回订单信息 +API-->>Client : 返回查询结果 +``` + +**图示来源** +- [order.go](file://api/card_info_apple/v1/order.go#L10-L145) + +**章节来源** +- [order.go](file://api/card_info_apple/v1/order.go) + +#### 配置管理 +Apple平台提供充值规则和限制的配置管理功能。 + +```mermaid +classDiagram +class ConfigGetRes { ++bool IsAllowDifferentAmount ++bool IsAllowDifferentSucceedCallback ++bool IsAllowDifferentFailCallback ++int64 RedeemCardMinAmount ++bool IsAllowCompensatedCallback ++int RedeemCardRate +} +class ConfigSetReq { ++bool IsAllowDifferentAmount ++bool IsAllowDifferentSucceedCallback ++bool IsAllowDifferentFailCallback ++int64 RedeemCardMinAmount ++bool IsAllowCompensatedCallback ++int RedeemCardRate +} +ConfigSetReq --> ConfigGetRes : "设置" +``` + +**图示来源** +- [config.go](file://api/card_info_apple/v1/config.go#L10-L30) + +**章节来源** +- [config.go](file://api/card_info_apple/v1/config.go) + +### Ctrip平台卡密管理 + +#### 账户管理 +Ctrip平台提供账户管理功能,包括账户创建、更新、删除和状态管理。 + +```mermaid +classDiagram +class AccountRecord { ++string Cookie ++string Name ++int MaxAmountLimit ++int MaxCountLimit ++int Status ++string Remark +} +class AccountCreateReq { ++AccountRecord +} +class AccountUpdateReq { ++CommonStrId ++AccountRecord +} +class AccountDeleteReq { ++CommonStrId +} +AccountCreateReq --> AccountRecord : "包含" +AccountUpdateReq --> AccountRecord : "包含" +``` + +**图示来源** +- [account.go](file://api/card_info_c_trip/v1/account.go#L10-L149) + +**章节来源** +- [account.go](file://api/card_info_c_trip/v1/account.go) + +#### 订单管理 +Ctrip平台提供订单提交、查询和回调功能。 + +```mermaid +flowchart TD +Start([提交订单]) --> Validate["验证请求参数"] +Validate --> CheckCookie["检查账户Cookie"] +CheckCookie --> CreateOrder["创建订单记录"] +CreateOrder --> ReturnResult["返回订单信息"] +ReturnResult --> End([结束]) +``` + +**图示来源** +- [order.go](file://api/card_info_c_trip/v1/order.go#L10-L56) + +**章节来源** +- [order.go](file://api/card_info_c_trip/v1/order.go) + +### 京东平台卡密管理 + +#### 账户管理 +京东平台提供账户管理功能,包括账户创建、更新、删除和状态管理。 + +```mermaid +classDiagram +class JDAccountRecord { ++string Cookie ++string Name ++int MaxAmountLimit ++int MaxCountLimit ++string Remark ++int Status +} +class JDAccountCreateReq { ++JDAccountRecord +} +class JDAccountUpdateReq { ++CommonStrId ++JDAccountRecord +} +class JDAccountDeleteReq { ++CommonStrId +} +JDAccountCreateReq --> JDAccountRecord : "包含" +JDAccountUpdateReq --> JDAccountRecord : "包含" +``` + +**图示来源** +- [account.go](file://api/card_info_jd/v1/account.go#L10-L144) + +**章节来源** +- [account.go](file://api/card_info_jd/v1/account.go) + +#### 订单管理 +京东平台提供订单提交、查询和回调功能。 + +```mermaid +sequenceDiagram +participant Client +participant API +participant Business +Client->>API : POST /cardInfo/JDCard/order/submit +API->>Business : 处理订单 +Business-->>API : 返回处理结果 +API-->>Client : 返回响应 +``` + +**图示来源** +- [order.go](file://api/card_info_jd/v1/order.go#L10-L56) + +**章节来源** +- [order.go](file://api/card_info_jd/v1/order.go) + +### 天猫游戏平台卡密管理 + +#### 账户管理 +天猫游戏平台提供账户创建、查询、状态切换和删除功能。 + +```mermaid +classDiagram +class TMallGameAccountRecord { ++int Count +} +class TMallGameAccountCreateReq { ++TMallGameAccountRecord +} +class TMallGameAccountListReq { ++string AccountNumber ++CommonPageReq +} +class TMallGameAccountToggleReq { ++CommonStrId +} +class TMallGameAccountDeleteReq { ++CommonStrId +} +TMallGameAccountCreateReq --> TMallGameAccountRecord : "包含" +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L10-L71) + +**章节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) + +#### 订单管理 +天猫游戏平台提供订单提交、查询和手动回调功能。 + +```mermaid +classDiagram +class TMallGameOrderRecord { ++string Status ++string AccountNumber ++string OrderNo ++string MerchantOrder ++string ThirdMerchantOrder ++string TMallShopOrder ++*gtime.Time DateRange ++RechargeTMallGameCallBackType CallBackType +} +class TMallGameOrderSubmitReq { ++string AccountNumber ++float64 Amount ++string MerchantOrder ++string ThirdMerchantOrder ++string CallbackUrl ++RechargeTMallGameCallBackType CallbackType ++string Attach ++int TimeStamp ++string Sign ++string ChannelName +} +class TMallGameOrderModifyStatusSucceedReq { ++string TotpCode ++string OrderNo +} +TMallGameOrderSubmitReq --> TMallGameOrderRecord : "提交" +TMallGameOrderModifyStatusSucceedReq --> TMallGameOrderRecord : "修改状态" +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go#L10-L76) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) + +#### 回调管理 +天猫游戏平台提供阿奇索回调和天猫授权回调功能。 + +```mermaid +classDiagram +class TMallGameAgisoCallbackReq { ++string FromPlatform ++int TimeStamp ++AgisoCallbackStatus Aopic ++string Json ++string Sign +} +class TMallGameAccountAuthorizeCallbackReq { ++string Code ++TMallGameThirdPartyChannel Channel +} +class CallBackOrderManualReq { ++string OrderNo ++int64 ID +} +TMallGameAgisoCallbackReq --> TMallGameAgisoCallbackRes : "回调" +TMallGameAccountAuthorizeCallbackReq --> TMallGameAccountAuthorizeCallbackRes : "授权回调" +CallBackOrderManualReq --> CallBackOrderManualRes : "手动回调" +``` + +**图示来源** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go#L10-L36) + +**章节来源** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) + +### 沃尔玛平台卡密管理 + +#### 账户管理 +沃尔玛平台提供完整的账户管理功能,包括账户创建、更新、删除、状态管理、分组管理和批量操作。 + +```mermaid +classDiagram +class AccountRecord { ++string Cookie ++string Name ++int GroupId ++int MaxAmountLimit ++int MaxCountLimit ++int Status ++string Remark +} +class AccountCreateReq { ++AccountRecord +} +class AccountUpdateReq { ++CommonStrId ++AccountRecord +} +class AccountDeleteReq { ++CommonStrId +} +class AccountCookieBatchCheckReq { ++*ghttp.UploadFile File +} +AccountCreateReq --> AccountRecord : "包含" +AccountUpdateReq --> AccountRecord : "包含" +AccountCookieBatchCheckReq --> AccountRecord : "批量检查" +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go#L10-L242) + +**章节来源** +- [account.go](file://api/card_info_walmart/v1/account.go) + +#### 订单管理 +沃尔玛平台提供订单提交、查询、回调和导出功能。 + +```mermaid +sequenceDiagram +participant Client +participant API +participant Business +Client->>API : POST /cardInfo/walmart/order/submit +API->>Business : 处理订单 +Business-->>API : 返回处理结果 +API-->>Client : 返回响应 +Client->>API : GET /cardInfo/walmart/order/export +API->>Business : 生成导出文件 +Business-->>API : 返回文件 +API-->>Client : 下载文件 +``` + +**图示来源** +- [order.go](file://api/card_info_walmart/v1/order.go#L10-L92) + +**章节来源** +- [order.go](file://api/card_info_walmart/v1/order.go) + +#### 配置管理 +沃尔玛平台提供详细的配置管理功能,包括充值规则、重复充值设置和调度策略。 + +```mermaid +classDiagram +class RedeemConfigGetRes { ++bool IsAllowDifferentAmount ++bool IsAllowDifferentSucceedCallback ++bool IsAllowDifferentFailCallback ++int64 RedeemCardMinAmount ++bool IsAllowCompensatedCallback ++int RedeemCardRate ++bool IsCardAllowRepeated ++int MaxAccountRedeemCount ++RedeemCardScheduleStrategyType RedeemOrderScheduleStrategy +} +class RedeemConfigSetReq { ++bool IsAllowDifferentAmount ++bool IsAllowDifferentSucceedCallback ++bool IsAllowDifferentFailCallback ++int64 RedeemCardMinAmount ++bool IsAllowCompensatedCallback ++int RedeemCardRate ++bool IsCardAllowRepeated ++int MaxAccountRedeemCount ++RedeemCardScheduleStrategyType RedeemOrderScheduleStrategy +} +RedeemConfigSetReq --> RedeemConfigGetRes : "设置" +``` + +**图示来源** +- [config.go](file://api/card_info_walmart/v1/config.go#L10-L40) + +**章节来源** +- [config.go](file://api/card_info_walmart/v1/config.go) + +## 依赖分析 +系统各模块之间依赖关系清晰,每个平台的API模块独立,共享通用的认证、错误处理和数据访问组件。通过接口隔离不同平台的实现细节,确保系统的可扩展性和维护性。 + +```mermaid +graph TD +AppleAPI --> CommonAPI +CtripAPI --> CommonAPI +JDAPI --> CommonAPI +TmallAPI --> CommonAPI +WalmartAPI --> CommonAPI +CommonAPI --> Auth[认证模块] +CommonAPI --> ErrorHandler[错误处理模块] +CommonAPI --> Response[响应处理模块] +AppleAPI --> AppleDAO[Apple数据访问] +CtripAPI --> CtripDAO[Ctrip数据访问] +JDAPI --> JDDAO[JD数据访问] +TmallAPI --> TmallDAO[Tmall数据访问] +WalmartAPI --> WalmartDAO[Walmart数据访问] +AppleDAO --> DB[(数据库)] +CtripDAO --> DB +JDDAO --> DB +TmallDAO --> DB +WalmartDAO --> DB +``` + +**图示来源** +- [commonApi/common.go](file://api/commonApi/common.go) +- [internal/controller](file://internal/controller) +- [internal/dao](file://internal/dao) + +**章节来源** +- [commonApi/common.go](file://api/commonApi/common.go) +- [internal/controller](file://internal/controller) +- [internal/dao](file://internal/dao) + +## 性能考虑 +系统在设计时考虑了性能优化,包括: +- 使用分页查询避免大数据量加载 +- 提供批量操作接口减少网络往返 +- 支持异步处理和回调机制 +- 实现缓存机制提高访问速度 +- 优化数据库查询和索引 + +对于高并发场景,建议: +- 使用连接池管理数据库连接 +- 实现请求限流和熔断机制 +- 采用消息队列解耦处理流程 +- 对热点数据进行缓存 +- 监控系统性能指标并及时优化 + +## 故障排除指南 +常见问题及解决方案: + +1. **账户创建失败** + - 检查Cookie有效性 + - 验证必填字段是否完整 + - 确认账户数量限制 + +2. **订单提交失败** + - 检查卡密格式和有效性 + - 验证回调地址可访问性 + - 确认商户ID正确性 + +3. **回调不成功** + - 检查网络连接 + - 验证签名正确性 + - 确认时间戳有效性 + +4. **性能问题** + - 检查数据库连接池配置 + - 监控系统资源使用情况 + - 优化慢查询 + +**章节来源** +- [errHandler/handler.go](file://internal/errHandler/handler.go) +- [middleware/error_handler.go](file://internal/middleware/error_handler.go) + +## 结论 +卡密信息管理API为多个电商平台提供了统一的卡密管理接口,具有良好的扩展性和维护性。通过模块化设计,各平台功能独立又共享通用组件,确保了系统的稳定性和可扩展性。API设计遵循RESTful规范,提供了完整的账户管理、订单处理和配置管理功能,满足了卡密管理的各种需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密回调机制.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密回调机制.md new file mode 100644 index 00000000..5d376918 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密回调机制.md @@ -0,0 +1,291 @@ +# 天猫卡密回调机制 + + +**本文档引用文件** +- [asigo.go](file://internal/consts/asigo.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [agiso.go](file://internal/model/agiso.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [utils.go](file://utility/integration/agiso/utils.go) +- [models.go](file://utility/integration/agiso/models.go) +- [api.go](file://utility/integration/tmall/api/api.go) +- [handler.go](file://internal/errHandler/handler.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了天猫卡密系统中的回调机制,重点涵盖阿奇索(Agiso)回调和订单状态回调接口的实现。文档全面说明了回调接收、验证、处理等端点的HTTP方法、URL模式、请求/响应模式和安全机制。通过实际使用示例,包括Agiso回调处理、订单状态更新、错误重试等场景,深入解释了天猫平台特有的Agiso回调协议和安全验证机制。同时,文档提供了错误处理策略、安全考虑、服务端实现指南和性能优化建议,特别关注回调的幂等性处理和安全性验证。 + +## 项目结构 +天猫卡密系统的项目结构清晰地划分了API接口、内部逻辑、数据访问和工具集成等模块。核心的天猫游戏卡密功能位于`api/card_info_t_mall_game`和`internal/controller/card_info_t_mall_game`目录下。`v1/callback.go`文件定义了回调接口的请求和响应模型,而`internal/controller/card_info_t_mall_game`目录下的控制器实现了具体的业务逻辑。`internal/service`和`internal/model`包负责服务层和数据模型的定义,`utility/integration`包则封装了与Agiso和天猫平台的第三方集成。 + +```mermaid +graph TD +subgraph "API 接口层" +A[api/card_info_t_mall_game/v1/callback.go] +B[api/card_info_t_mall_game/v1/order.go] +end +subgraph "控制器层" +C[internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go] +end +subgraph "服务与模型层" +D[internal/service/card_t_mall_order.go] +E[internal/model/agiso.go] +F[internal/model/card_t_mall_game_order.go] +end +subgraph "工具与集成层" +G[utility/integration/agiso/utils.go] +H[utility/integration/agiso/models.go] +I[utility/integration/tmall/api/api.go] +end +A --> C +B --> C +C --> D +D --> E +D --> F +C --> G +G --> H +C --> I +``` + +**Diagram sources** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [agiso.go](file://internal/model/agiso.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [utils.go](file://utility/integration/agiso/utils.go) +- [models.go](file://utility/integration/agiso/models.go) +- [api.go](file://utility/integration/tmall/api/api.go) + +**Section sources** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +## 核心组件 +天猫卡密回调机制的核心组件包括Agiso回调处理器、订单状态服务和安全验证模块。`TMallGameAgisoCallback`控制器是整个回调流程的入口,负责接收来自Agiso平台的HTTP POST请求。`RechargeTMallGameOrder`服务提供了处理订单状态更新、关联订单、发货和回调第三方等核心业务逻辑。`agiso.GenerateCallbackSign`函数实现了关键的安全验证,确保回调请求的来源可信。这些组件协同工作,确保了从买家付款到最终订单完成的自动化流程。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [utils.go](file://utility/integration/agiso/utils.go) + +## 架构概述 +天猫卡密系统的回调架构是一个典型的事件驱动架构。当买家在天猫平台完成支付后,Agiso平台会向本系统发起一个HTTP POST回调请求。该请求首先由`TMallGameAgisoCallback`端点接收,经过签名验证后,根据回调类型(如买家付款、交易成功)分发到不同的处理函数。处理函数会调用`RechargeTMallGameOrder`服务,与天猫API交互获取订单详情,并更新本地数据库中的订单状态。整个流程通过异步任务池(pool)进行优化,确保高并发下的性能和稳定性。 + +```mermaid +sequenceDiagram +participant Agiso as Agiso平台 +participant Gateway as 回调网关 +participant Controller as TMallGameAgisoCallback +participant Service as RechargeTMallGameOrder +participant TMallAPI as 天猫API +participant DB as 数据库 +Agiso->>Gateway : POST /recharge/tMallGame/agiso/callback +Gateway->>Controller : 转发请求 +Controller->>Controller : 验证签名(GenerateCallbackSign) +alt 签名验证失败 +Controller-->>Agiso : 返回错误 +else 签名验证成功 +Controller->>Controller : 根据aopic分发 +opt 买家付款(CALLBACK_PAYMENT_SUCCESS) +Controller->>Service : handleCallBackPaymentWithoutJudgementSuccess +Service->>TMallAPI : TBMallTradeGet(获取订单详情) +TMallAPI-->>Service : 订单数据 +Service->>DB : 更新订单状态(UpdateOrderStatusByTBOrderNo) +Service->>TMallAPI : VirtualDelivery(虚拟发货) +TMallAPI-->>Service : 发货结果 +Service->>DB : 记录发货历史 +end +opt 交易成功(CALLBACK_PAYMENT_TRADE_SUCCESS) +Controller->>Service : handleBuyerConfirmWithoutJudgementMessage +Service->>DB : 获取淘宝订单(GetShopOneByTid) +Service->>DB : 关联主订单(AssociateCreatedOrderAndStatus) +Service->>DB : 更新订单状态为待评价或完成 +opt 需要回调第三方 +Service->>Service : CallBackOrderToUpstream +end +end +Controller-->>Agiso : 返回成功 +end +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [api.go](file://utility/integration/tmall/api/api.go) + +## 详细组件分析 + +### Agiso回调处理分析 +Agiso回调处理是整个系统的核心,它确保了外部平台事件能够被正确接收和处理。 + +#### 回调接口定义 +```mermaid +classDiagram +class TMallGameAgisoCallbackReq { ++FromPlatform string ++TimeStamp int ++Aopic AgisoCallbackStatus ++Json string ++Sign string +} +class TMallGameAgisoCallbackRes { +} +class AgisoCallbackStatus { ++CALLBACK_PAYMENT_SUCCESS ++CALLBACK_PAYMENT_TRADE_SUCCESS ++Callback_AUTO_SHIPPING_SUCCESS ++Callback_PAYMENT_REFUND_APPLY ++Callback_REVOKE_REFUND ++Callback_MODIFY_ORDER_REMARK ++Callback_SELLER_SHIPPING ++CALLBACK_EVALUATION_SUCCESS +} +TMallGameAgisoCallbackReq --> AgisoCallbackStatus : "包含" +``` + +**Diagram sources** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [asigo.go](file://internal/consts/asigo.go) + +#### 回调处理流程 +```mermaid +flowchart TD +Start([接收回调请求]) --> ValidateSign["验证签名(GenerateCallbackSign)"] +ValidateSign --> SignValid{"签名有效?"} +SignValid --> |否| ReturnError["返回验证失败"] +SignValid --> |是| LockOrder["获取订单锁(防止重复处理)"] +LockOrder --> CheckAopic{"检查Aopic类型"} +CheckAopic --> |CALLBACK_PAYMENT_SUCCESS| HandlePayment["处理买家付款"] +CheckAopic --> |CALLBACK_PAYMENT_TRADE_SUCCESS| HandleTradeSuccess["处理交易成功"] +CheckAopic --> |CALLBACK_EVALUATION_SUCCESS| HandleEvaluation["处理评价成功"] +CheckAopic --> |其他| LogError["记录未知类型错误"] +HandlePayment --> GetOrderDetail["调用TBMallTradeGet获取订单详情"] +GetOrderDetail --> UpdateLocalDB["更新本地订单状态为已支付"] +UpdateLocalDB --> VirtualDelivery["调用VirtualDelivery进行虚拟发货"] +VirtualDelivery --> DeliverySuccess{"发货成功?"} +DeliverySuccess --> |是| UpdateStatus["更新状态为发货成功"] +DeliverySuccess --> |否| Retry["重试(最多3次)"] +Retry --> UpdateStatus +HandleTradeSuccess --> GetShopOrder["根据Tid获取淘宝订单"] +GetShopOrder --> AssociateOrder["关联主订单(AssociateCreatedOrderAndStatus)"] +AssociateOrder --> CheckAmount["检查金额是否匹配"] +CheckAmount --> |不匹配| UpdateStatusWrongAmount["更新为金额不符状态"] +CheckAmount --> |匹配| CheckCallbackType["检查回调类型"] +CheckCallbackType --> |Confirm| UpdateStatusFinished["更新为完成状态并回调第三方"] +CheckAmount --> |Evaluation| UpdateStatusWaitEval["更新为待评价状态"] +ReturnError --> End([结束]) +UpdateStatus --> End +UpdateStatusWrongAmount --> End +UpdateStatusFinished --> End +UpdateStatusWaitEval --> End +LogError --> End +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [utils.go](file://utility/integration/agiso/utils.go) + +### 订单状态更新分析 +订单状态更新是确保系统内部状态与外部平台同步的关键。 + +#### 订单状态模型 +```mermaid +erDiagram +V1_RECHARGE_TMALL_ORDER { +string order_no PK +float amount +string status +string callback_url +string callback_type +string attach +string merchant_order +string third_merchant_order +datetime created_at +datetime updated_at +} +V1_RECHARGE_TMALL_SHOP { +int id PK +string order_no FK +string t_mall_order_no +string buyer_nick +string payment +string status +datetime created +datetime pay_time +datetime end_time +string original_data +} +V1_RECHARGE_TMALL_ORDER ||--o{ V1_RECHARGE_TMALL_SHOP : "1:N" +``` + +**Diagram sources** +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [agiso.go](file://internal/model/agiso.go) + +#### 状态转换逻辑 +订单状态遵循严格的转换流程,从创建、支付、发货、评价到最终完成。任何状态的更新都通过`UpdateOrderStatusByTBOrderNo`等服务方法进行,确保了数据的一致性和可追溯性。 + +**Section sources** +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) + +## 依赖分析 +系统依赖于多个内部和外部组件。内部依赖包括`gogf`框架、`lancet`工具库和`sonic`高性能JSON解析器。外部依赖主要是Agiso平台和天猫开放API。`utility/integration`包封装了这些外部依赖,为上层业务逻辑提供了统一的接口,降低了耦合度。 + +```mermaid +graph LR +A[TMallGameAgisoCallback] --> B[RechargeTMallGameOrder] +B --> C[TMallAPI] +B --> D[数据库] +A --> E[GenerateCallbackSign] +E --> F[config.GetAgiso] +F --> G[配置文件] +C --> H[InnerClient] +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [api.go](file://utility/integration/tmall/api/api.go) +- [utils.go](file://utility/integration/agiso/utils.go) + +**Section sources** +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [api.go](file://utility/integration/tmall/api/api.go) +- [utils.go](file://utility/integration/agiso/utils.go) + +## 性能考虑 +为了应对高并发的回调请求,系统采用了多种性能优化策略。首先,使用`gmutex`和Redis缓存(`cache.TMallGameOrderSign`)来实现订单级别的锁,防止同一订单被重复处理。其次,通过`pool.New`创建异步任务池,将耗时的网络请求(如调用天猫API)放入后台执行,避免阻塞主线程。最后,代码中使用了`retry.Retry`机制,对关键操作(如虚拟发货)进行重试,提高了系统的容错能力。 + +## 故障排除指南 +在处理回调时,常见的问题包括签名验证失败、订单重复推送、金额不匹配和发货失败。 + +- **签名验证失败**:检查`config.yaml`中的`AppSecret`是否与Agiso平台配置一致。 +- **订单重复推送**:系统通过缓存锁机制防止重复处理,若出现此问题,检查Redis连接是否正常。 +- **金额不匹配**:买家支付的金额与系统订单金额不一致,系统会自动将订单状态更新为`RechargeTMallGameOrderStatusFinishedWithWrongAmount`。 +- **发货失败**:系统会尝试最多3次发货,若均失败,则更新状态为`RechargeTMallGameOrderStatusDeliveryFailed`,并记录错误日志。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [handler.go](file://internal/errHandler/handler.go) + +## 结论 +本文档详细阐述了天猫卡密系统的回调机制,涵盖了从接口定义、安全验证到业务处理的完整流程。该系统设计合理,通过幂等性处理和异步任务池等机制,确保了在高并发场景下的稳定性和可靠性。开发者在实现类似功能时,应重点关注安全性(签名验证)、幂等性(防止重复处理)和错误处理(重试机制)这三个方面,以构建健壮的回调系统。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密工作区管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密工作区管理.md new file mode 100644 index 00000000..8823f82f --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密工作区管理.md @@ -0,0 +1,383 @@ +# 天猫卡密工作区管理 + + +**本文档引用文件** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) + + +## 目录 +1. [简介](#简介) +2. [工作区管理API概览](#工作区管理api概览) +3. [数据同步接口](#数据同步接口) +4. [状态监控接口](#状态监控接口) +5. [配置管理接口](#配置管理接口) +6. [架构设计与数据隔离](#架构设计与数据隔离) +7. [错误处理与安全考虑](#错误处理与安全考虑) +8. [管理端实现指南](#管理端实现指南) +9. [性能优化建议](#性能优化建议) +10. [实际使用示例](#实际使用示例) + +## 简介 +本文档详细介绍了天猫卡密工作区管理系统的API接口,涵盖数据同步、配置管理、状态监控等核心功能。系统通过RESTful API提供工作区创建、数据同步、状态查询等端点,支持大规模卡密订单的高效处理与监控。文档详细说明了各接口的HTTP方法、URL模式、请求/响应模式和认证机制,并提供实际使用场景示例。 + +## 工作区管理API概览 +天猫卡密工作区管理API提供了一套完整的接口,用于管理工作区的生命周期、数据同步和状态监控。API基于GoFrame框架构建,采用模块化设计,主要功能包括工作区数据同步、订单统计、状态查询等。 + +```mermaid +graph TB +subgraph "API接口层" +A[数据同步接口] +B[状态监控接口] +C[配置管理接口] +end +subgraph "服务层" +D[订单服务] +E[账户服务] +F[店铺服务] +end +subgraph "数据层" +G[订单数据] +H[账户数据] +I[店铺数据] +J[历史数据] +end +A --> D +B --> D +C --> D +D --> G +D --> H +D --> I +D --> J +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) + +## 数据同步接口 +数据同步接口用于实时同步天猫卡密工作区的订单、账户、店铺等数据,确保系统数据的及时性和一致性。 + +### 数据同步端点 +- **URL**: `/recharge/tMallGame/data/sync` +- **HTTP方法**: POST +- **功能**: 同步指定渠道在指定时间范围内的所有相关数据 + +#### 请求参数 +| 参数名 | 类型 | 必填 | 描述 | +|--------|------|------|------| +| channelName | string | 是 | 渠道名称 | +| duration | int | 是 | 同步时长(秒) | + +#### 响应数据结构 +同步接口返回包含以下数据集合的响应: +- 订单数据(OrderData) +- 账户数据(AccountData) +- 店铺数据(ShopData) +- 订单历史数据(OrderHistory) +- 店铺历史数据(ShopHistory) + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API网关" +participant Controller as "控制器" +participant DAO as "数据访问层" +Client->>API : POST /recharge/tMallGame/data/sync +API->>Controller : 转发请求 +Controller->>DAO : 查询订单数据 +DAO-->>Controller : 返回订单数据 +Controller->>DAO : 查询关联账户数据 +DAO-->>Controller : 返回账户数据 +Controller->>DAO : 查询关联店铺数据 +DAO-->>Controller : 返回店铺数据 +Controller->>DAO : 查询订单历史数据 +DAO-->>Controller : 返回订单历史数据 +Controller->>DAO : 查询店铺历史数据 +DAO-->>Controller : 返回店铺历史数据 +Controller-->>API : 组装完整响应 +API-->>Client : 返回同步数据 +``` + +**图示来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +**本节来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +## 状态监控接口 +状态监控接口提供工作区的实时状态和统计信息,支持运营监控和数据分析。 + +### 每日订单统计接口 +- **URL**: `/recharge/tMallGame/workspace/orderSummary` +- **HTTP方法**: GET +- **功能**: 获取每日订单统计信息 + +#### 请求参数 +| 参数名 | 类型 | 必填 | 描述 | +|--------|------|------|------| +| channelName | string | 否 | 渠道名称 | +| callbackType | RechargeTMallGameCallBackType | 否 | 回调类型 | + +#### 响应数据结构 +```json +{ + "total": 100, + "list": [ + { + "count": 20, + "succeedCount": 18, + "succeedAmount": 1800.00, + "amount": 2000.00, + "rate": 0.9, + "date": "2024-01-01" + } + ] +} +``` + +### 基本统计信息接口 +- **URL**: `/recharge/tMallGame/workspace/stats` +- **HTTP方法**: GET +- **功能**: 获取工作区基本统计信息 + +#### 请求参数 +| 参数名 | 类型 | 必填 | 描述 | +|--------|------|------|------| +| channelName | string | 是 | 渠道名称 | + +#### 响应数据结构 +```json +{ + "totalCount": 1000, + "totalSucceedCount": 950, + "totalAmount": 95000.00, + "totalSucceedAmount": 90250.00, + "todayCount": 50, + "todaySucceedCount": 48, + "todayAmount": 4800.00, + "todaySucceedAmount": 4560.00, + "totalRate": 0.95, + "todayRate": 0.96 +} +``` + +```mermaid +flowchart TD +Start([获取状态监控数据]) --> ValidateInput["验证输入参数"] +ValidateInput --> InputValid{"参数有效?"} +InputValid --> |否| ReturnError["返回参数错误"] +InputValid --> |是| QueryStats["查询统计信息"] +QueryStats --> StatsResult{"查询成功?"} +StatsResult --> |否| HandleError["处理查询错误"] +StatsResult --> |是| FormatResponse["格式化响应数据"] +FormatResponse --> ReturnResult["返回统计结果"] +HandleError --> ReturnError +ReturnError --> End([结束]) +ReturnResult --> End +``` + +**图示来源** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) + +**本节来源** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) + +## 配置管理接口 +配置管理接口用于管理工作区的运行参数和业务配置,确保系统能够适应不同的业务需求。 + +### 配置获取接口 +- **URL**: `/recharge/tMallGame/account/authorize/getKey` +- **HTTP方法**: GET +- **功能**: 获取天猫游戏配置信息 + +#### 响应数据结构 +```json +{ + "code": "appKey", + "redirectUri": "https://callback.example.com" +} +``` + +### 账户状态切换接口 +- **URL**: `/recharge/tMallGame/account/toggle` +- **HTTP方法**: POST +- **功能**: 切换账户状态(启用/禁用) + +#### 请求参数 +| 参数名 | 类型 | 必填 | 描述 | +|--------|------|------|------| +| id | string | 是 | 账户ID | +| status | int | 是 | 状态(1:启用, 0:禁用) | + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_get_key.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_get_key.go) +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go) + +## 架构设计与数据隔离 +天猫卡密工作区管理系统采用分层架构设计,确保系统的可维护性和可扩展性。 + +### 分层架构 +系统采用典型的三层架构: +1. **API接口层**: 提供RESTful API接口 +2. **服务层**: 实现业务逻辑处理 +3. **数据层**: 负责数据持久化和访问 + +### 数据隔离机制 +系统通过以下机制实现数据隔离: +- **渠道隔离**: 不同渠道的数据通过channelName字段进行隔离 +- **时间范围隔离**: 数据同步通过时间戳范围进行隔离 +- **关联查询隔离**: 通过外键关联确保数据一致性 + +```mermaid +erDiagram +ORDER { +string order_no PK +string account_id FK +string channel_name +float amount +int status +datetime created_at +datetime updated_at +} +ACCOUNT { +string id PK +string account_number UK +string channel_name +int status +datetime created_at +datetime updated_at +} +SHOP { +string order_no PK, FK +string t_mall_order_no +datetime end_time +datetime created_at +datetime updated_at +} +ORDER_HISTORY { +int id PK +string order_no FK +int status +datetime created_at +datetime updated_at +} +SHOP_HISTORY { +int id PK +int shop_id FK +string status +datetime created_at +datetime updated_at +} +ORDER ||--o{ ACCOUNT : "belongs to" +ORDER ||--o{ SHOP : "has" +ORDER ||--o{ ORDER_HISTORY : "has" +ORDER_HISTORY ||--o{ SHOP_HISTORY : "has" +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) + +## 错误处理与安全考虑 +系统实现了完善的错误处理和安全机制,确保系统的稳定性和安全性。 + +### 错误处理策略 +- **统一错误包装**: 使用errHandler.WrapError统一包装错误 +- **错误码体系**: 基于gcode.Code体系定义错误码 +- **日志记录**: 关键操作和错误信息记录到日志 + +### 安全考虑 +- **参数验证**: 所有输入参数进行严格验证 +- **缓存保护**: 使用gmlock确保缓存操作的线程安全 +- **敏感信息保护**: 关键配置信息从配置中心获取 + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go) + +## 管理端实现指南 +管理端实现应遵循以下指南,确保系统的稳定性和性能。 + +### 实现要点 +1. **异步处理**: 大规模数据同步采用异步处理模式 +2. **批量操作**: 尽量使用批量查询和更新操作 +3. **缓存策略**: 合理使用缓存减少数据库压力 +4. **锁机制**: 使用gmlock确保关键操作的线程安全 + +### 最佳实践 +- **分页查询**: 大数据量查询使用分页 +- **连接池**: 使用数据库连接池提高性能 +- **监控告警**: 关键接口添加监控和告警 + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go) + +## 性能优化建议 +针对大规模数据同步场景,提出以下性能优化建议。 + +### 查询优化 +- **索引优化**: 在channelName、updatedAt等常用查询字段上建立索引 +- **批量查询**: 使用WhereIn一次性查询关联数据 +- **时间范围查询**: 使用时间戳范围限制查询数据量 + +### 缓存优化 +- **热点数据缓存**: 将频繁访问的数据缓存到Redis +- **缓存预热**: 在高峰期前预热常用数据 +- **缓存失效策略**: 设置合理的缓存失效时间 + +### 并发优化 +- **并发控制**: 根据系统负载调整并发度 +- **连接池配置**: 优化数据库连接池大小 +- **资源监控**: 实时监控系统资源使用情况 + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +## 实际使用示例 +以下是天猫卡密工作区管理API的实际使用示例。 + +### 工作区数据同步示例 +```bash +curl -X POST \ + http://api.example.com/recharge/tMallGame/data/sync \ + -H 'Content-Type: application/json' \ + -d '{ + "channelName": "channel_001", + "duration": 300 + }' +``` + +### 状态监控查询示例 +```bash +curl -X GET \ + "http://api.example.com/recharge/tMallGame/workspace/stats?channelName=channel_001" \ + -H 'Content-Type: application/json' +``` + +### 配置更新示例 +```bash +curl -X POST \ + http://api.example.com/recharge/tMallGame/account/toggle \ + -H 'Content-Type: application/json' \ + -d '{ + "id": "account_001", + "status": 1 + }' +``` + +**本节来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密店铺管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密店铺管理.md new file mode 100644 index 00000000..22901382 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密店铺管理.md @@ -0,0 +1,273 @@ +# 天猫卡密店铺管理 + + +**本文档引用的文件** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_shop_order_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了天猫卡密店铺管理API,涵盖商品查询、订单同步、库存管理等核心功能。系统通过天猫平台与卡密系统的数据同步机制,实现店铺商品信息、订单状态和库存的实时管理。文档详细说明了各接口的HTTP方法、URL模式、请求/响应模式和认证机制,并提供实际使用示例,包括店铺商品同步、订单获取和库存状态更新等场景。 + +## 项目结构 +天猫卡密店铺管理系统的代码结构遵循模块化设计原则,主要分为API接口层、业务逻辑层、数据访问层和模型层。系统通过分层架构实现了关注点分离,提高了代码的可维护性和可扩展性。 + +```mermaid +graph TB +subgraph "API接口层" +A[account.go] +B[order.go] +C[shop.go] +D[sync.go] +end +subgraph "控制器层" +E[card_info_t_mall_game_v1_t_mall_game_account_list.go] +F[card_info_t_mall_game_v1_t_mall_game_order_query_order.go] +G[card_info_t_mall_game_v1_t_mall_game_shop_order_list.go] +H[card_info_t_mall_game_v1_t_mall_game_data_sync.go] +end +subgraph "服务层" +I[card_t_mall_order.go] +end +subgraph "模型层" +J[card_t_mall_game_account.go] +K[card_t_mall_game_order.go] +end +subgraph "数据访问层" +L[v_1_recharge_t_mall_account.go] +M[v_1_recharge_t_mall_order.go] +end +A --> E +B --> F +C --> G +D --> H +E --> I +F --> I +G --> I +H --> I +I --> J +I --> K +J --> L +K --> M +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_shop_order_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) + +**本节来源** +- [api/card_info_t_mall_game/v1](file://api/card_info_t_mall_game/v1) +- [internal/controller/card_info_t_mall_game](file://internal/controller/card_info_t_mall_game) + +## 核心组件 +天猫卡密店铺管理系统的核心组件包括账户管理、订单管理、店铺管理和数据同步模块。这些组件共同协作,实现天猫店铺与卡密系统的无缝集成。系统通过标准化的API接口提供商品列表获取、订单详情查询和库存同步等功能,确保数据的一致性和实时性。 + +**本节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) + +## 架构概述 +天猫卡密店铺管理系统采用分层架构设计,包括API接口层、控制器层、服务层、模型层和数据访问层。这种架构设计实现了业务逻辑与数据访问的分离,提高了系统的可维护性和可扩展性。系统通过RESTful API提供服务,支持商品查询、订单同步和库存管理等核心功能。 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Model[模型层] +Service --> DAO[数据访问层] +DAO --> Database[(数据库)] +API -.->|HTTP请求| Controller +Controller -.->|业务逻辑处理| Service +Service -.->|数据操作| DAO +DAO -.->|数据库操作| Database +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_shop_order_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +## 详细组件分析 +### 账户管理分析 +账户管理模块负责天猫卡密店铺的账户信息维护和管理。系统提供账户创建、删除、状态切换和授权等功能,确保店铺账户的安全性和可用性。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DAO as "数据访问层" +Client->>API : GET /api/v1/tmall/account/list +API->>Controller : 调用账户列表查询 +Controller->>Service : 获取账户列表 +Service->>DAO : 查询数据库 +DAO-->>Service : 返回账户数据 +Service-->>Controller : 处理数据 +Controller-->>API : 返回结果 +API-->>Client : 返回账户列表 +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) + +**本节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) + +### 订单管理分析 +订单管理模块负责天猫卡密店铺的订单查询和状态管理。系统提供订单查询、状态修改和订单统计等功能,确保订单数据的准确性和实时性。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DAO as "数据访问层" +Client->>API : POST /api/v1/tmall/order/query +API->>Controller : 调用订单查询 +Controller->>Service : 查询订单信息 +Service->>DAO : 查询订单数据 +DAO-->>Service : 返回订单数据 +Service-->>Controller : 处理订单数据 +Controller-->>API : 返回结果 +API-->>Client : 返回订单信息 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) + +**本节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) + +### 店铺管理分析 +店铺管理模块负责天猫卡密店铺的商品信息和订单历史管理。系统提供店铺订单查询、订单历史获取和天猫订单历史同步等功能,确保店铺数据的完整性和一致性。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DAO as "数据访问层" +Client->>API : GET /api/v1/tmall/shop/order/list +API->>Controller : 调用店铺订单列表 +Controller->>Service : 获取店铺订单 +Service->>DAO : 查询店铺订单数据 +DAO-->>Service : 返回店铺订单数据 +Service-->>Controller : 处理数据 +Controller-->>API : 返回结果 +API-->>Client : 返回店铺订单列表 +``` + +**图示来源** +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [card_info_t_mall_game_v1_t_mall_game_shop_order_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go) + +**本节来源** +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [card_info_t_mall_game_v1_t_mall_game_shop_order_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go) + +### 数据同步分析 +数据同步模块负责天猫卡密店铺的数据同步任务。系统提供定时数据同步功能,确保天猫平台与卡密系统之间的数据一致性。 + +```mermaid +flowchart TD +Start([开始]) --> CheckSyncTime["检查同步时间"] +CheckSyncTime --> NeedSync{"需要同步?"} +NeedSync --> |是| ExecuteSync["执行数据同步"] +NeedSync --> |否| End([结束]) +ExecuteSync --> SyncAccount["同步账户数据"] +SyncAccount --> SyncOrder["同步订单数据"] +SyncOrder --> UpdateStatus["更新同步状态"] +UpdateStatus --> End +``` + +**图示来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +**本节来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +## 依赖分析 +天猫卡密店铺管理系统各组件之间存在明确的依赖关系。API接口层依赖于控制器层,控制器层依赖于服务层,服务层依赖于模型层和数据访问层。这种依赖关系确保了系统的模块化和可维护性。 + +```mermaid +graph LR +API[API接口层] --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Model[模型层] +Service --> DAO[数据访问层] +Model --> Database[(数据库)] +DAO --> Database +classDef default fill:#f9f,stroke:#333,stroke-width:1px; +``` + +**图示来源** +- [card_info_t_mall_game.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go) + +**本节来源** +- [internal/controller/card_info_t_mall_game](file://internal/controller/card_info_t_mall_game) +- [internal/service](file://internal/service) +- [internal/model](file://internal/model) +- [internal/dao](file://internal/dao) + +## 性能考虑 +天猫卡密店铺管理系统在设计时充分考虑了性能因素。系统采用缓存机制减少数据库查询次数,使用异步处理提高响应速度,并通过分页查询优化大数据量处理。此外,系统还实现了请求限流和错误重试机制,确保在高并发场景下的稳定运行。 + +## 故障排除指南 +当遇到天猫卡密店铺管理系统的使用问题时,建议按照以下步骤进行排查:首先检查API请求的认证信息是否正确,然后验证请求参数是否符合规范,接着查看系统日志获取详细的错误信息,最后根据错误代码参考文档中的错误处理策略进行解决。对于数据同步问题,需要检查同步任务的执行状态和网络连接情况。 + +**本节来源** +- [errHandler](file://internal/dao/errHandler) +- [middleware](file://internal/middleware) + +## 结论 +天猫卡密店铺管理系统通过完善的API接口和稳健的架构设计,实现了天猫店铺与卡密系统的高效集成。系统提供了商品查询、订单同步和库存管理等核心功能,确保了数据的实时性和一致性。通过合理的分层架构和依赖管理,系统具有良好的可维护性和可扩展性,能够满足不断变化的业务需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密管理API.md new file mode 100644 index 00000000..efdd628f --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密管理API.md @@ -0,0 +1,314 @@ +# 天猫卡密管理API + + +**本文档引用文件** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了天猫卡密管理API,涵盖账户授权、订单处理、店铺管理等核心接口。重点说明了账户创建、OAuth授权、订单提交、店铺信息同步等端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档还解释了天猫卡密特有的Agiso回调机制和workspace管理,提供错误处理策略和安全考虑,并包含客户端实现指南和性能优化建议。 + +## 项目结构 +天猫卡密管理API的代码结构清晰,主要分为API接口层、内部逻辑层和服务层。API接口定义位于`api/card_info_t_mall_game/v1/`目录下,包含账户、订单、店铺、回调和工作空间等模块。内部实现位于`internal/`目录,包括模型定义、常量、控制器、服务和工具类。 + +```mermaid +graph TD +subgraph "API接口层" +A[account.go] +B[order.go] +C[shop.go] +D[callback.go] +E[workspace.go] +end +subgraph "内部实现层" +F[card_t_mall_game_account.go] +G[card_t_mall_game_order.go] +H[card_t_mall_game_work_space.go] +I[card_recharge_t_mall.go] +end +subgraph "服务层" +J[card_t_mall_account.go] +K[card_t_mall_order.go] +end +subgraph "控制器层" +L[card_info_t_mall_game_v1_*.go] +end +A --> F +B --> G +C --> G +D --> L +E --> H +F --> J +G --> K +H --> K +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +**章节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +## 核心组件 +天猫卡密管理API的核心组件包括账户管理、订单处理、店铺同步、回调处理和统计分析。账户管理负责天猫游戏账户的创建、查询和状态管理。订单处理模块处理订单的提交、查询和状态更新。店铺同步功能实现与天猫店铺订单的关联和信息同步。回调处理模块接收来自Agiso和天猫的回调通知。统计分析组件提供订单和账户的统计信息。 + +**章节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +## 架构概述 +天猫卡密管理API采用分层架构设计,包括API接口层、业务逻辑层、服务层和数据访问层。API接口层定义了RESTful端点,业务逻辑层处理具体的业务规则,服务层提供可重用的服务接口,数据访问层负责与数据库交互。 + +```mermaid +graph TD +A[客户端] --> B[API接口层] +B --> C[业务逻辑层] +C --> D[服务层] +D --> E[数据访问层] +E --> F[数据库] +B --> G[认证中间件] +C --> H[错误处理] +D --> I[事务管理] +style A fill:#f9f,stroke:#333 +style F fill:#bbf,stroke:#333 +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +## 详细组件分析 +### 账户管理分析 +账户管理组件提供天猫游戏账户的全生命周期管理功能,包括创建、查询、状态切换和删除。 + +#### 账户创建 +```mermaid +flowchart TD +Start([创建账户请求]) --> Validate["验证请求参数"] +Validate --> Exists{"账户已存在?"} +Exists --> |是| ReturnError["返回错误"] +Exists --> |否| Create["创建账户记录"] +Create --> Enable["启用账户"] +Enable --> ReturnSuccess["返回成功"] +style Start fill:#4CAF50,stroke:#333 +style ReturnSuccess fill:#4CAF50,stroke:#333 +style ReturnError fill:#F44336,stroke:#333 +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L10-L20) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L15-L25) + +#### 账户授权 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API服务" +participant Tmall as "天猫平台" +Client->>API : GET /recharge/tMallGame/account/auth/getAuthorizeKey +API-->>Client : 返回授权码和回调地址 +Client->>Tmall : 使用授权码访问天猫 +Tmall-->>Client : 授权成功,重定向到回调地址 +Client->>API : POST /recharge/tMallGame/account/auth/callback +API->>API : 验证渠道和授权码 +API->>Tmall : 调用天猫OAuth2登录 +Tmall-->>API : 返回授权结果 +API-->>Client : 返回授权结果 +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L60-L70) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) + +**章节来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) + +### 订单处理分析 +订单处理组件管理天猫游戏订单的整个生命周期,从提交到完成。 + +#### 订单提交 +```mermaid +flowchart TD +Start([提交订单]) --> Validate["验证订单参数"] +Validate --> Account{"账户可用?"} +Account --> |否| ReturnError["返回错误"] +Account --> |是| Create["创建订单记录"] +Create --> SetStatus["设置订单状态为创建"] +SetStatus --> ReturnSuccess["返回订单号"] +style Start fill:#4CAF50,stroke:#333 +style ReturnSuccess fill:#4CAF50,stroke:#333 +style ReturnError fill:#F44336,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go#L40-L55) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L35-L45) + +#### 订单状态查询 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API服务" +participant DB as "数据库" +Client->>API : GET /recharge/tMallGame/order/list +API->>DB : 查询订单列表 +DB-->>API : 返回订单数据 +API->>API : 关联账户和店铺信息 +API-->>Client : 返回订单列表 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go#L20-L35) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L50-L60) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +### 店铺管理分析 +店铺管理组件处理天猫店铺订单的同步和查询。 + +#### 店铺订单同步 +```mermaid +flowchart TD +Start([获取店铺订单]) --> Query["查询店铺订单"] +Query --> Exists{"订单存在?"} +Exists --> |否| Create["创建店铺订单记录"] +Exists --> |是| Update["更新订单状态"] +Update --> Sync["同步到本地订单"] +Sync --> Return["返回订单信息"] +style Start fill:#4CAF50,stroke:#333 +style Return fill:#4CAF50,stroke:#333 +``` + +**图示来源** +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go#L10-L25) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L70-L80) + +**章节来源** +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +## 依赖分析 +天猫卡密管理API的组件间存在清晰的依赖关系。API接口层依赖于服务层提供的接口,服务层依赖于数据访问层。各组件通过定义良好的接口进行交互,降低了耦合度。 + +```mermaid +classDiagram +class AccountAPI { ++createAccount() ++listAccounts() ++toggleAccount() ++deleteAccount() +} +class OrderAPI { ++submitOrder() ++listOrders() ++modifyOrderStatus() +} +class ShopAPI { ++getShopOrderList() ++getShopOrder() ++getShopHistory() +} +class CallbackAPI { ++agisoCallback() ++authorizeCallback() ++manualCallback() +} +class WorkspaceAPI { ++getOrderSummary() ++getStats() +} +class AccountService { ++Add() ++List() ++Toggle() ++Delete() +} +class OrderService { ++Create() ++List() ++ShopList() ++GetOrderStats() +} +AccountAPI --> AccountService : "使用" +OrderAPI --> OrderService : "使用" +ShopAPI --> OrderService : "使用" +CallbackAPI --> OrderService : "使用" +WorkspaceAPI --> OrderService : "使用" +``` + +**图示来源** +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +**章节来源** +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +## 性能考虑 +天猫卡密管理API在设计时考虑了性能优化。通过使用缓存减少数据库查询,采用批量操作提高效率,实施限流防止系统过载。对于高频访问的统计接口,建议使用缓存策略。订单提交和状态更新操作应使用数据库事务确保数据一致性。 + +## 故障排除指南 +### 常见问题 +1. **授权失败**:检查授权码是否正确,回调地址是否匹配,网络连接是否正常。 +2. **订单提交失败**:验证账户状态是否正常,订单金额是否符合要求,签名是否正确。 +3. **回调接收失败**:确认回调URL是否可访问,防火墙设置是否允许外部请求。 + +### 错误处理 +系统使用统一的错误处理机制,所有错误都通过`errHandler`包进行包装和处理。错误码遵循标准规范,便于客户端识别和处理。 + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) + +## 结论 +天猫卡密管理API提供了一套完整的解决方案,用于管理天猫游戏账户和订单。通过清晰的接口设计和分层架构,系统实现了高可用性和可维护性。文档详细介绍了各个组件的功能和使用方法,为开发者提供了全面的参考。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密订单处理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密订单处理.md new file mode 100644 index 00000000..597fa96b --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密订单处理.md @@ -0,0 +1,326 @@ +# 天猫卡密订单处理 + + +**本文档引用的文件** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) +- [v_1_recharge_t_mall_order.go](file://internal/model/entity/v_1_recharge_t_mall_order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) +- [v_1_recharge_t_mall_shop.go](file://internal/model/entity/v_1_recharge_t_mall_shop.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_info_t_mall_game_v1_call_back_order_manual.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_call_back_order_manual.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 简介 +本文档详细介绍了天猫卡密订单处理API的设计与实现,涵盖订单提交、状态查询、历史记录等核心功能。系统通过与天猫平台的深度集成,实现了卡密订单的自动化处理流程,包括订单创建、状态同步、回调处理等关键环节。文档重点阐述了订单状态机、幂等性处理、安全认证等核心机制,为开发者提供了完整的实现指南和最佳实践。 + +## 项目结构 +天猫卡密订单处理系统采用分层架构设计,主要包含API接口层、业务逻辑层、数据访问层和常量定义层。系统通过模块化设计将不同功能分离,确保代码的可维护性和扩展性。 + +```mermaid +graph TD +subgraph "API层" +A[order.go] +B[shop.go] +end +subgraph "控制器层" +C[card_info_t_mall_game_v1_t_mall_game_order_submit.go] +D[card_info_t_mall_game_v1_t_mall_game_agiso_callback.go] +E[card_info_t_mall_game_v1_call_back_order_manual.go] +end +subgraph "服务层" +F[card_t_mall_order.go] +end +subgraph "逻辑层" +G[order.go] +end +subgraph "数据访问层" +H[v_1_recharge_t_mall_order.go] +I[v_1_recharge_t_mall_shop.go] +end +subgraph "常量层" +J[card_recharge_t_mall.go] +end +A --> C +B --> C +C --> F +D --> F +E --> F +F --> G +G --> H +G --> I +J --> F +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) +- [v_1_recharge_t_mall_shop.go](file://internal/model/entity/v_1_recharge_t_mall_shop.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [shop.go](file://api/card_info_t_mall_game/v1/shop.go) + +## 核心组件 +天猫卡密订单处理系统的核心组件包括订单管理、状态机处理、回调机制和数据同步四大模块。订单管理模块负责订单的创建、查询和更新;状态机处理模块维护订单的生命周期状态;回调机制实现与第三方系统的通信;数据同步模块确保本地数据与天猫平台数据的一致性。 + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +## 架构概述 +系统采用典型的分层架构,从上至下分为API接口层、控制器层、服务层、逻辑层和数据访问层。API接口层定义了外部可访问的RESTful端点;控制器层处理HTTP请求并调用相应的服务;服务层提供业务逻辑的抽象接口;逻辑层实现具体的业务规则;数据访问层负责与数据库交互。 + +```mermaid +graph TB +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> Logic[逻辑层] +Logic --> DAO[数据访问层] +DAO --> DB[(数据库)] +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style Logic fill:#96f,stroke:#333 +style DAO fill:#69f,stroke:#333 +style DB fill:#9f6,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) + +## 详细组件分析 +### 订单提交组件分析 +订单提交组件负责处理客户端的订单创建请求,验证输入参数,创建订单记录,并返回订单号。该组件实现了幂等性处理,确保重复提交不会创建多个订单。 + +#### 订单提交序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "逻辑层" +participant DAO as "数据访问层" +participant DB as "数据库" +Client->>API : POST /recharge/tMallGame/order/submit +API->>Controller : 转发请求 +Controller->>Controller : 验证账号可用性 +Controller->>Service : 调用Create方法 +Service->>Logic : 创建订单 +Logic->>DAO : 生成订单号 +DAO->>DB : 插入订单记录 +DB-->>DAO : 返回结果 +DAO-->>Logic : 确认创建 +Logic-->>Service : 返回订单号 +Service-->>Controller : 返回结果 +Controller-->>API : 构造响应 +API-->>Client : 返回订单号和状态 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +### 订单状态机分析 +订单状态机组件管理订单的整个生命周期,从创建到完成的各种状态转换。系统定义了丰富的状态类型,确保订单处理过程的可追踪性和可靠性。 + +#### 订单状态机图 +```mermaid +stateDiagram-v2 +[*] --> created +created --> callback : 收到回调 +callback --> delivery_failed : 虚拟发货失败 +callback --> delivery_succeed : 虚拟发货成功 +delivery_succeed --> paid : 已付款 +paid --> bind_shop_succeed : 关联淘宝订单成功 +bind_shop_succeed --> wait_for_evaluation : 等待用户评价 +wait_for_evaluation --> evaluation : 买家评价 +evaluation --> callback_succeed : 回调成功 +evaluation --> callback_failed : 回调失败 +callback_succeed --> finished : 订单结束 +callback_succeed --> finished_with_wrong_amount : 金额错误 +callback_succeed --> finished_with_wrong_status : 状态错误 +callback_succeed --> finished_with_refund_succeed : 退款成功 +callback_failed --> refund_failed : 退款失败 +delivery_failed --> without_fill_account : 未填写账号 +note right of created +订单创建状态 +等待处理 +end note +note right of delivery_succeed +虚拟商品已发货 +等待买家确认 +end note +note right of wait_for_evaluation +买家已确认收货 +等待评价 +end note +note right of finished +订单正常完成 +所有流程结束 +end note +``` + +**图示来源** +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +**章节来源** +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) + +### 回调处理组件分析 +回调处理组件负责接收来自天猫平台的异步通知,解析回调数据,更新订单状态,并触发后续业务流程。该组件实现了多种回调类型的处理,包括支付成功、确认收货和用户评价。 + +#### 回调处理流程图 +```mermaid +flowchart TD +Start([收到回调请求]) --> ParseData["解析回调数据"] +ParseData --> CheckExist["检查订单是否存在"] +CheckExist --> OrderExists{"订单存在?"} +OrderExists --> |否| CreateOrder["创建新订单"] +OrderExists --> |是| UpdateStatus["更新订单状态"] +CreateOrder --> ProcessPayment["处理支付逻辑"] +UpdateStatus --> ProcessPayment +ProcessPayment --> VirtualDelivery["尝试虚拟发货"] +VirtualDelivery --> DeliverySuccess{"发货成功?"} +DeliverySuccess --> |否| RecordFailure["记录失败状态"] +DeliverySuccess --> |是| RecordSuccess["记录成功状态"] +RecordFailure --> End([结束]) +RecordSuccess --> BindOrder["关联淘宝订单"] +BindOrder --> WaitForEvaluation["等待用户评价"] +WaitForEvaluation --> ReceiveEvaluation["收到评价回调"] +ReceiveEvaluation --> CheckEvaluation{"好评?"} +CheckEvaluation --> |是| GiveGoodReview["给予买家好评"] +CheckEvaluation --> |否| RecordBadReview["记录差评"] +GiveGoodReview --> CallbackUpstream["回调上游系统"] +RecordBadReview --> CallbackUpstream +CallbackUpstream --> End +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +## 依赖分析 +系统各组件之间的依赖关系清晰明确,遵循依赖倒置原则。高层模块依赖于抽象接口,而非具体实现,提高了系统的可测试性和可维护性。 + +```mermaid +classDiagram +class OrderAPI { ++POST /submit ++GET /list ++GET /query +} +class OrderController { ++TMallGameOrderSubmit() ++TMallGameOrderList() ++TMallGameOrderQueryOrder() +} +class OrderService { ++Create() ++List() ++GetById() ++UpdateStatus() +} +class OrderLogic { ++Create() ++List() ++GetById() ++UpdateStatus() +} +class OrderDAO { ++Insert() ++Select() ++Update() ++Delete() +} +class OrderEntity { ++OrderNo ++AccountNumber ++Amount ++Status ++CreatedAt +} +OrderAPI --> OrderController : "调用" +OrderController --> OrderService : "依赖" +OrderService --> OrderLogic : "实现" +OrderLogic --> OrderDAO : "调用" +OrderDAO --> OrderEntity : "映射" +OrderEntity --> DB : "持久化" +class Consts { ++OrderStatusCreated ++OrderStatusCallback ++OrderStatusDeliverySucceed ++OrderStatusFinished +} +OrderService --> Consts : "引用" +OrderLogic --> Consts : "引用" +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) +- [v_1_recharge_t_mall_order.go](file://internal/model/entity/v_1_recharge_t_mall_order.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) + +**章节来源** +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +## 性能考虑 +系统在设计时充分考虑了性能优化,采用了多种技术手段确保高并发场景下的稳定运行。包括数据库连接池、缓存机制、异步处理等。订单查询接口支持分页和条件过滤,避免全表扫描。订单创建过程采用事务处理,确保数据一致性。 + +## 故障排除指南 +### 常见问题及解决方案 +1. **订单创建失败**:检查账号状态是否启用,确保账号信息正确无误。 +2. **回调处理超时**:检查网络连接,确保回调地址可访问,适当增加超时时间。 +3. **状态同步延迟**:检查定时任务是否正常运行,确认数据同步频率设置合理。 +4. **虚拟发货失败**:检查天猫API密钥有效性,确认商品配置正确。 + +**章节来源** +- [card_info_t_mall_game_v1_call_back_order_manual.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_call_back_order_manual.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +## 结论 +天猫卡密订单处理系统通过清晰的架构设计和严谨的状态管理,实现了高效可靠的订单处理能力。系统具备良好的扩展性和可维护性,能够满足不断变化的业务需求。通过本文档的指导,开发者可以快速理解系统架构,进行二次开发和问题排查。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密账户管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密账户管理.md new file mode 100644 index 00000000..fbb4ae43 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/天猫卡密管理API/天猫卡密账户管理.md @@ -0,0 +1,226 @@ +# 天猫卡密账户管理 + + +**本文档引用文件** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [account.go](file://internal/logic/card_t_mall_account/account.go) +- [oauth.go](file://utility/integration/tmall/api/oauth.go) +- [tmall.go](file://utility/integration/tmall/utils.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) +- [v_1_recharge_t_mall_account.go](file://internal/model/entity/v_1_recharge_t_mall_account.go) + + +## 目录 +1. [简介](#简介) +2. [核心接口说明](#核心接口说明) +3. [OAuth授权流程](#oauth授权流程) +4. [账户状态管理](#账户状态管理) +5. [实际使用示例](#实际使用示例) +6. [错误处理与安全考虑](#错误处理与安全考虑) +7. [客户端实现指南](#客户端实现指南) +8. [性能优化建议](#性能优化建议) + +## 简介 +本文档详细说明天猫卡密账户管理API的使用方法,涵盖账户创建、OAuth授权、状态查询等核心功能。系统通过天猫游戏平台对接,实现卡密账户的自动化管理,支持多渠道授权与订单回调机制。 + +## 核心接口说明 + +### 账户创建接口 +- **HTTP方法**: POST +- **URL模式**: `/recharge/tMallGame/account/create` +- **认证机制**: JWT Token +- **请求体**: + - `count`: 创建账户数量(1-100) +- **响应**: + - 成功返回空对象,批量创建指定数量的随机邮箱账户 + +### 账户列表查询接口 +- **HTTP方法**: GET +- **URL模式**: `/recharge/tMallGame/account/list` +- **参数**: + - `accountNumber`: 账户账号(模糊匹配) + - `current`: 当前页码 + - `pageSize`: 每页数量 +- **响应结构**: + - 分页数据,包含账户ID、账号、余额、状态、创建时间等信息 + +### 授权回调接口 +- **HTTP方法**: POST +- **URL模式**: `/recharge/tMallGame/account/auth/callback` +- **请求体**: + - `code`: 天猫回调授权码 + - `channel`: 渠道标识(12351:天猫,12352:阿奇索) + +**Section sources** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L10-L71) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go#L18-L36) + +## OAuth授权流程 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +participant 天猫平台 +用户->>前端 : 发起授权请求 +前端->>后端 : GET /recharge/tMallGame/account/auth/getAuthorizeKey +后端-->>前端 : 返回授权码和回调地址 +前端->>天猫平台 : 重定向到天猫授权页面 +天猫平台->>用户 : 用户登录并授权 +天猫平台->>后端 : POST 回调接口携带授权码 +后端->>后端 : 调用淘宝API换取access token +后端->>后端 : 缓存OAuth响应信息 +后端-->>前端 : 授权完成通知 +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go#L1-L30) +- [oauth.go](file://utility/integration/tmall/api/oauth.go#L13-L73) + +### 授权状态检查 +- **HTTP方法**: GET +- **URL模式**: `/recharge/tMallGame/account/auth/getTMallAuthStatus` +- **响应**: + - `status`: 授权状态(true/false) + - `expiredAt`: 过期时间 + +**Section sources** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L60-L71) +- [card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go#L1-L32) + +## 账户状态管理 + +### 状态切换接口 +- **HTTP方法**: POST +- **URL模式**: `/recharge/tMallGame/account/toggle` +- **请求体**: + - `id`: 账户ID +- **功能**: 在启用和禁用状态间切换 + +### 随机获取账户 +- **HTTP方法**: GET +- **URL模式**: `/recharge/tMallGame/account/getOneByRandom` +- **参数**: + - `timeStamp`: 时间戳 + - `orderNo`: 订单号 +- **行为**: 若可用账户不足,自动创建新账户 + +```mermaid +flowchart TD +Start([开始]) --> CheckCount["检查可用账户数量"] +CheckCount --> LowCount{"数量<10?"} +LowCount --> |是| CreateBatch["异步创建100个新账户"] +LowCount --> |否| GetRandom["随机获取一个启用状态账户"] +GetRandom --> HasAccount{"获取到账户?"} +HasAccount --> |是| ReturnAccount["返回账户信息"] +HasAccount --> |否| CreateOne["创建单个新账户"] +CreateOne --> ReturnNew["返回新账户"] +ReturnAccount --> End([结束]) +ReturnNew --> End +``` + +**Diagram sources** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L45-L59) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L130-L180) + +**Section sources** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L30-L44) +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L21) + +## 实际使用示例 + +### 天猫游戏账户创建 +1. 调用 `/recharge/tMallGame/account/create` 接口 +2. 传入 `count=10` 创建10个新账户 +3. 系统自动生成随机邮箱格式的账户名 + +### OAuth2.0授权流程 +1. 前端获取授权key和回调地址 +2. 重定向用户到天猫授权页面 +3. 用户授权后,天猫回调后端指定接口 +4. 后端使用code换取access token并缓存 + +### 账户状态检测 +定期调用 `/recharge/tMallGame/account/auth/getTMallAuthStatus` 接口检查授权有效性,确保API调用的连续性。 + +## 错误处理与安全考虑 + +### 常见错误码 +- `CodeNotAuthorized (401)`: 授权失败,access token无效 +- `CodeInternalError (500)`: 服务器内部错误 +- `CodeNotSupported (400)`: 不支持的渠道类型 + +### 安全措施 +1. 所有敏感接口需JWT认证 +2. OAuth回调需验证签名 +3. access token缓存设置合理过期时间 +4. 数据库操作使用事务保证一致性 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go#L1-L30) +- [errHandler](file://internal/errHandler/handler.go) + +## 客户端实现指南 + +### 授权流程实现 +1. 先调用获取授权key接口 +2. 构造天猫授权URL +3. 处理回调,发送code到后端 +4. 定期检查授权状态 + +### API调用最佳实践 +- 使用连接池管理HTTP客户端 +- 实现重试机制(最多5次) +- 缓存access token状态 +- 处理速率限制 + +## 性能优化建议 + +### 批量操作 +- 账户创建建议批量进行,减少数据库事务开销 +- 查询接口合理使用分页,避免大数据量加载 + +### 缓存策略 +- OAuth token信息缓存有效期与token一致 +- 频繁查询的账户状态可做短期缓存 + +### 异步处理 +- 账户不足时的自动创建使用异步处理 +- 避免阻塞主请求流程 + +```mermaid +graph TB +subgraph "API层" +A[账户创建] +B[状态查询] +C[授权回调] +end +subgraph "服务层" +D[账户服务] +E[授权服务] +end +subgraph "数据层" +F[MySQL数据库] +G[Redis缓存] +end +A --> D +B --> D +C --> E +D --> F +E --> G +E --> F +``` + +**Diagram sources** +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L50) +- [account.go](file://internal/logic/card_t_mall_account/account.go) + +**Section sources** +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go#L1-L90) +- [v_1_recharge_t_mall_account.go](file://internal/model/entity/v_1_recharge_t_mall_account.go#L1-L21) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密分组管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密分组管理.md new file mode 100644 index 00000000..1119e4d3 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密分组管理.md @@ -0,0 +1,481 @@ +# 沃尔玛卡密分组管理 + + +**本文档引用文件** +- [group.go](file://api/card_info_walmart/v1/group.go) +- [stats.go](file://api/card_info_walmart/v1/stats.go) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go) +- [card_info_walmart_v1_group_stat.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_stat.go) +- [card_info_walmart_v1_group_all_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_all_list.go) +- [card_info_walmart_v1_group_delete.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_delete.go) +- [card_info_walmart_v1_group_update.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_update.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + + +## 目录 +1. [简介](#简介) +2. [核心功能概述](#核心功能概述) +3. [分组管理API接口](#分组管理api接口) +4. [统计分析功能](#统计分析功能) +5. [客户端实现指南](#客户端实现指南) +6. [性能优化建议](#性能优化建议) +7. [错误处理与安全](#错误处理与安全) +8. [附录](#附录) + +## 简介 +本文档详细介绍了沃尔玛卡密分组管理系统的API接口,涵盖分组创建、列表查询、统计分析等核心功能。系统为沃尔玛卡密账户提供高效的分组管理能力,支持大规模账户的组织、查询和性能监控。通过本系统,用户可以对沃尔玛卡密账户进行分类管理,实现精细化运营和数据分析。 + +## 核心功能概述 +沃尔玛卡密分组管理系统提供了一套完整的分组管理解决方案,主要包括以下核心功能: +- **分组创建与管理**:支持创建、更新、删除账户分组,实现账户的分类组织 +- **分组列表查询**:提供分页查询功能,支持按用户ID、分组名称等条件筛选 +- **统计分析**:提供分组级别的统计功能,包括账户状态分布、订单成功率等关键指标 +- **数据导出**:支持将分组数据导出为Excel格式,便于离线分析 + +系统通过RESTful API提供服务,采用标准的HTTP方法和状态码,确保接口的易用性和一致性。 + +## 分组管理API接口 + +### 分组创建接口 +**HTTP方法**: POST +**URL模式**: `/cardInfo/walmart/group/add` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginOnlyLogin`验证 + +创建新的沃尔玛账户分组,每个分组必须有唯一的名称。系统会检查分组名称是否已存在,避免重复创建。 + +**请求参数**: +- `name` (string, 必填): 分组名称 +- `notes` (string): 备注信息 + +**响应**: +- 成功: 返回空对象,HTTP状态码200 +- 失败: 返回错误信息,HTTP状态码400(参数错误)或500(内部错误) + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : POST /cardInfo/walmart/group/add +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupAdd方法 +服务层->>服务层 : 检查分组名称是否已存在 +服务层->>数据库 : 插入新分组记录 +数据库-->>服务层 : 返回插入结果 +服务层-->>控制器 : 返回操作结果 +控制器-->>客户端 : 返回响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L12-L20) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) + +### 分组更新接口 +**HTTP方法**: PUT +**URL模式**: `/cardInfo/walmart/group/update` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginOnlyLogin`验证 + +更新现有分组的信息,包括名称和备注。系统会检查新名称是否与其他分组冲突。 + +**请求参数**: +- `id` (int, 必填): 分组ID +- `name` (string, 必填): 新的分组名称 +- `notes` (string): 新的备注信息 + +**响应**: +- 成功: 返回空对象,HTTP状态码200 +- 失败: 返回错误信息,HTTP状态码400(参数错误)或500(内部错误) + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : PUT /cardInfo/walmart/group/update +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupUpdate方法 +服务层->>服务层 : 检查新名称是否已存在 +服务层->>数据库 : 更新分组记录 +数据库-->>服务层 : 返回更新结果 +服务层-->>控制器 : 返回操作结果 +控制器-->>客户端 : 返回响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L22-L29) +- [card_info_walmart_v1_group_update.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_update.go) + +### 分组列表查询接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/group/list` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginWithIFrameAndLogin`验证 + +查询分组列表,支持分页、按用户ID和分组名称筛选。 + +**请求参数**: +- `page` (int): 页码,从1开始 +- `limit` (int): 每页数量 +- `userId` (string): 用户ID +- `name` (string): 分组名称(模糊匹配) + +**响应**: +- `total` (int): 总记录数 +- `list` (array): 分组列表,包含分组ID、名称、备注、创建时间等信息 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : GET /cardInfo/walmart/group/list +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupList方法 +服务层->>数据库 : 查询分组列表 +数据库-->>服务层 : 返回查询结果 +服务层-->>控制器 : 返回分组列表和总数 +控制器-->>客户端 : 返回分页响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L31-L38) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go) + +### 分组删除接口 +**HTTP方法**: DELETE +**URL模式**: `/cardInfo/walmart/group/delete` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginOnlyLogin`验证 + +删除指定的分组。删除操作会检查分组是否存在以及用户是否有权限删除。 + +**请求参数**: +- `id` (int, 必填): 分组ID + +**响应**: +- 成功: 返回空对象,HTTP状态码200 +- 失败: 返回错误信息,HTTP状态码400(参数错误)或500(内部错误) + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : DELETE /cardInfo/walmart/group/delete +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupDelete方法 +服务层->>数据库 : 删除分组记录 +数据库-->>服务层 : 返回删除结果 +服务层-->>控制器 : 返回操作结果 +控制器-->>客户端 : 返回响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L40-L46) +- [card_info_walmart_v1_group_delete.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_delete.go) + +### 所有分组查询接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/group/allList` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginWithIFrameAndLogin`验证 + +查询所有分组,不进行分页,返回完整的分组列表。 + +**请求参数**: +- `userId` (string): 用户ID + +**响应**: +- `total` (int): 总记录数 +- `list` (array): 所有分组列表 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : GET /cardInfo/walmart/group/allList +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupAllList方法 +服务层->>数据库 : 查询所有分组 +数据库-->>服务层 : 返回查询结果 +服务层-->>控制器 : 返回分组列表和总数 +控制器-->>客户端 : 返回响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L48-L54) +- [card_info_walmart_v1_group_all_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_all_list.go) + +## 统计分析功能 + +### 分组统计接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/group/stat` +**认证机制**: 需要有效的用户登录凭证,通过中间件`LoginWithIFrameAndLogin`验证 + +获取分组的统计信息,包括订单日期、分组ID、分组名称、订单数量、订单金额等。 + +**请求参数**: +- `page` (int): 页码 +- `limit` (int): 每页数量 +- `name` (string): 分组名称 +- `username` (string): 用户名 +- `date` (datetime): 日期 +- `userId` (string): 用户ID + +**响应**: +- `total` (int): 总记录数 +- `list` (array): 统计列表,包含订单日期、分组信息、账户状态统计等 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : GET /cardInfo/walmart/group/stat +控制器->>控制器 : 验证用户登录状态 +控制器->>服务层 : 调用GroupStat方法 +服务层->>数据库 : 查询分组统计信息 +数据库-->>服务层 : 返回统计结果 +服务层-->>控制器 : 返回统计列表和总数 +控制器-->>客户端 : 返回分页响应 +``` + +**接口来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L56-L78) +- [card_info_walmart_v1_group_stat.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_stat.go) + +### 统计概览接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/stats/overview` +**认证机制**: 无特殊认证要求 + +获取沃尔玛卡密的统计概览信息,包括账户数量、订单金额和订单数量等关键指标。 + +**请求参数**: +- `groupId` (int64): 分组ID +- `dateRange` (array): 日期范围 +- `accountId` (string): 账户ID + +**响应**: +- `totalActiveAccountCount` (int): 活跃账户总数 +- `totalAccountCount` (int): 账户总数 +- `totalOrderAmount` (float): 订单总金额 +- `totalOrderAmountSuccess` (float): 成功订单金额 +- `totalOrderCount` (int): 订单总数 +- `totalOrderCountSuccess` (int): 成功订单数 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : GET /cardInfo/walmart/stats/overview +控制器->>服务层 : 调用StatsOverview方法 +服务层->>数据库 : 查询统计概览 +数据库-->>服务层 : 返回概览数据 +服务层-->>控制器 : 返回统计结果 +控制器-->>客户端 : 返回响应 +``` + +**接口来源** +- [stats.go](file://api/card_info_walmart/v1/stats.go#L6-L20) +- [card_info_walmart_v1_stats_overview.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_stats_overview.go) + +### 统计数据导出接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/stats/overview/download` +**认证机制**: 无特殊认证要求 +**响应类型**: application/xlsx + +将统计概览数据导出为Excel文件。 + +**请求参数**: +- `groupId` (int64): 分组ID +- `accountId` (string): 账户ID + +**响应**: +- Excel文件流 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : GET /cardInfo/walmart/stats/overview/download +控制器->>服务层 : 调用StatsOverviewDownload方法 +服务层->>数据库 : 查询统计数据 +数据库-->>服务层 : 返回数据 +服务层->>服务层 : 生成Excel文件 +服务层-->>控制器 : 返回文件流 +控制器-->>客户端 : 返回Excel文件 +``` + +**接口来源** +- [stats.go](file://api/card_info_walmart/v1/stats.go#L22-L32) +- [card_info_walmart_v1_stats_overview_download.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_stats_overview_download.go) + +## 客户端实现指南 + +### 认证流程 +客户端在调用任何需要认证的API接口前,必须先完成用户登录。系统通过`LoginOnlyLogin`和`LoginWithIFrameAndLogin`中间件验证用户身份。 + +**推荐实现**: +1. 用户登录获取会话凭证 +2. 在后续请求的Header中携带认证信息 +3. 处理401未授权响应,引导用户重新登录 + +### 错误处理 +系统使用标准的HTTP状态码和自定义错误码来表示不同的错误情况。 + +**常见错误码**: +- `400`: 参数错误,请求参数不符合验证规则 +- `401`: 未授权,用户未登录或会话过期 +- `404`: 资源不存在 +- `500`: 服务器内部错误 + +**建议的错误处理策略**: +- 捕获并解析错误响应 +- 根据错误类型提供用户友好的提示 +- 对于可恢复的错误(如网络超时),实现重试机制 + +### 分页策略 +对于列表查询接口,系统采用标准的分页模式: + +```json +{ + "total": 100, + "list": [...], + "page": 1, + "limit": 20 +} +``` + +**客户端实现建议**: +- 记录当前页码和每页数量 +- 在用户翻页时更新请求参数 +- 处理总记录数变化的情况 + +## 性能优化建议 + +### 大规模分组查询优化 +当处理大量分组数据时,建议采用以下优化策略: + +**分页查询**: +- 使用合理的分页大小(建议20-50条/页) +- 避免一次性查询所有数据 +- 实现懒加载,只在需要时加载数据 + +**查询条件优化**: +- 尽可能使用精确的查询条件缩小结果集 +- 利用索引字段(如用户ID、分组名称)进行筛选 +- 避免在大数据集上进行模糊查询 + +### 统计计算性能优化 +统计功能涉及大量数据聚合计算,建议采取以下措施: + +**缓存策略**: +- 对频繁访问的统计结果进行缓存 +- 设置合理的缓存过期时间 +- 在数据更新时及时清除相关缓存 + +**异步计算**: +- 对于复杂的统计计算,考虑使用异步任务 +- 提供计算进度查询接口 +- 计算完成后通过回调或消息通知客户端 + +**数据预聚合**: +- 定期预计算常用的统计指标 +- 存储预聚合结果供快速查询 +- 平衡实时性和性能需求 + +## 错误处理与安全 + +### 常见错误场景 +**分组名称重复**: +- 错误码: 400 +- 原因: 创建或更新分组时名称已存在 +- 解决方案: 使用唯一的分组名称 + +**权限不足**: +- 错误码: 401 +- 原因: 用户未登录或会话过期 +- 解决方案: 重新登录获取有效凭证 + +**参数验证失败**: +- 错误码: 400 +- 原因: 请求参数不符合验证规则 +- 解决方案: 检查并修正请求参数 + +### 安全考虑 +**认证安全**: +- 所有敏感操作都需要用户认证 +- 会话凭证应安全存储和传输 +- 实现会话过期机制 + +**数据安全**: +- 敏感数据(如账户信息)应加密存储 +- API接口应进行输入验证,防止SQL注入等攻击 +- 限制单个用户的请求频率,防止滥用 + +## 附录 + +### 数据模型 +**分组实体 (V1CardRedeemAccountGroup)**: +- `id`: 分组ID +- `name`: 分组名称 +- `notes`: 备注 +- `category`: 分组类别 +- `createdUserId`: 创建用户ID +- `createdAt`: 创建时间 +- `updatedAt`: 更新时间 +- `deletedAt`: 删除时间 + +**账户实体 (V1CardRedeemAccountInfo)**: +- `id`: 账户ID +- `groupId`: 所属分组ID +- `name`: 账户名称 +- `username`: 用户名 +- `status`: 状态(1.正常 0.禁用) +- `balance`: 余额 +- `effectiveBalance`: 有效充值余额 + +**统计实体 (V1CardRedeemAccountGroupStatsEntity)**: +- `orderDate`: 订单日期 +- `groupId`: 分组ID +- `groupName`: 分组名称 +- `count`: 订单数量 +- `sum`: 订单金额 +- `createdUserId`: 创建用户ID +- `createdUserName`: 创建用户名 + +### 接口调用示例 +**创建分组**: +```http +POST /cardInfo/walmart/group/add +Content-Type: application/json + +{ + "name": "沃尔玛账户分组1", + "notes": "测试分组" +} +``` + +**查询分组列表**: +```http +GET /cardInfo/walmart/group/list?page=1&limit=20&name=沃尔玛 +``` + +**获取统计概览**: +```http +GET /cardInfo/walmart/stats/overview?groupId=1&dateRange[]=2024-01-01&dateRange[]=2024-01-31 +``` \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密管理API.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密管理API.md new file mode 100644 index 00000000..90913e7e --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密管理API.md @@ -0,0 +1,400 @@ +# 沃尔玛卡密管理API + + +**本文档引用文件** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [account.go](file://api/card_info_walmart/v1/account.go) +- [group.go](file://api/card_info_walmart/v1/group.go) +- [order.go](file://api/card_info_walmart/v1/order.go) +- [stats.go](file://api/card_info_walmart/v1/stats.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_account_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_list.go) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go) +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +沃尔玛卡密管理API提供了一套完整的接口,用于管理沃尔玛礼品卡账户、订单处理和分组管理。该系统支持账户创建、状态检测、订单提交、分组管理等功能,专为高效处理沃尔玛卡密兑换而设计。API具备批量验证、状态重置、分组统计等高级功能,确保账户状态与沃尔玛平台保持同步,并遵守平台的调用限制。 + +## 项目结构 +沃尔玛卡密管理模块位于`api/card_info_walmart`目录下,采用分层架构设计。该模块包含v1版本的API定义和对应的控制器实现,分别位于`v1`子目录和`internal/controller/card_info_walmart`目录中。数据模型定义在`internal/model/entity`目录下,常量定义在`internal/consts`目录中。 + +```mermaid +graph TD +subgraph "API接口层" +A[card_info_walmart.go] +B[account.go] +C[group.go] +D[order.go] +E[stats.go] +end +subgraph "控制器层" +F[card_info_walmart_v1_account_create.go] +G[card_info_walmart_v1_account_list.go] +H[card_info_walmart_v1_group_add.go] +I[card_info_walmart_v1_submit.go] +end +subgraph "模型层" +J[v_1_card_redeem_account_info.go] +K[v_1_card_redeem_order_info.go] +L[v_1_card_redeem_account_group.go] +end +subgraph "常量层" +M[card_redeem.go] +N[card_redeem_cookie.go] +end +A --> F +B --> G +C --> H +D --> I +J --> F +K --> I +M --> F +N --> F +``` + +**图示来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +**节来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [internal/controller/card_info_walmart](file://internal/controller/card_info_walmart) + +## 核心组件 +沃尔玛卡密管理API的核心组件包括账户管理、分组管理、订单处理和统计分析四大模块。账户管理模块负责沃尔玛账户的创建、更新、删除和状态检测;分组管理模块提供账户分组的增删改查和统计功能;订单处理模块处理卡密兑换请求和订单状态管理;统计分析模块提供账户和订单的汇总数据。 + +**节来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [account.go](file://api/card_info_walmart/v1/account.go) +- [group.go](file://api/card_info_walmart/v1/group.go) +- [order.go](file://api/card_info_walmart/v1/order.go) + +## 架构概览 +沃尔玛卡密管理API采用典型的三层架构:API接口层、业务逻辑层和数据访问层。API接口层定义了所有对外暴露的HTTP端点;业务逻辑层(控制器)处理具体的业务逻辑;数据访问层通过实体模型与数据库交互。系统通过常量文件定义了各种状态码和枚举值,确保代码的一致性和可维护性。 + +```mermaid +graph TB +subgraph "表现层" +API[API接口] +end +subgraph "业务逻辑层" +Controller[控制器] +end +subgraph "数据层" +Service[服务] +Model[数据模型] +Const[常量] +end +API --> Controller +Controller --> Service +Service --> Model +Service --> Const +``` + +**图示来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +## 详细组件分析 + +### 账户管理分析 +账户管理组件提供了完整的沃尔玛账户生命周期管理功能,包括创建、更新、删除、状态检测和批量操作。 + +#### 账户创建与更新 +```mermaid +classDiagram +class AccountRecord { ++string Cookie ++string Name ++int GroupId ++int MaxAmountLimit ++int MaxCountLimit ++int Status ++string Remark +} +class AccountCreateReq { ++AccountRecord +} +class AccountUpdateReq { ++string Id ++AccountRecord +} +class AccountListRecord { ++V1CardRedeemAccountInfo ++UploadUser +} +AccountCreateReq --> AccountRecord : "包含" +AccountUpdateReq --> AccountRecord : "包含" +AccountListRecord --> V1CardRedeemAccountInfo : "扩展" +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + +#### 账户状态检测流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Walmart as "沃尔玛平台" +Client->>API : GET /cardInfo/walmart/account/statusDetect?id=xxx +API->>Controller : 调用AccountStatusDetect +Controller->>Service : 查询账户信息 +Service->>Walmart : 验证Cookie有效性 +Walmart-->>Service : 返回账户状态 +Service-->>Controller : 返回检测结果 +Controller-->>API : 返回响应 +API-->>Client : {status : true/false} +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_status_detect.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_status_detect.go) + +#### 批量账户验证流程 +```mermaid +flowchart TD +Start([开始]) --> Upload["上传Excel文件"] +Upload --> Validate["验证文件格式"] +Validate --> Process["逐行处理账户"] +Process --> CheckCookie["调用沃尔玛API验证Cookie"] +CheckCookie --> IsValid{"Cookie有效?"} +IsValid --> |是| Success["标记为可用"] +IsValid --> |否| Fail["标记为不可用"] +Success --> Next +Fail --> Next +Next["处理下一个账户"] --> Process +Process --> EndLoop{"所有账户处理完毕?"} +EndLoop --> |否| Process +EndLoop --> |是| Generate["生成验证结果"] +Generate --> Return["返回验证结果列表"] +Return --> End([结束]) +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_cookie_batch_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go) + +**节来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_account_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_list.go) + +### 分组管理分析 +分组管理组件提供了对沃尔玛账户的分组管理功能,支持分组的创建、更新、删除和统计分析。 + +#### 分组管理类图 +```mermaid +classDiagram +class GroupRecord { ++string Name ++string Notes +} +class GroupAddReq { ++GroupRecord +} +class GroupUpdateReq { ++int Id ++GroupRecord +} +class V1CardRedeemAccountGroup { ++int Id ++string Name ++string Notes ++string Category ++string CreatedUserId ++datetime CreatedAt ++datetime UpdatedAt ++datetime DeletedAt +} +GroupAddReq --> GroupRecord : "包含" +GroupUpdateReq --> GroupRecord : "包含" +V1CardRedeemAccountGroup --> GroupRecord : "扩展" +``` + +**图示来源** +- [group.go](file://api/card_info_walmart/v1/group.go) +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go) + +#### 分组统计功能 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DB as "数据库" +Client->>API : GET /cardInfo/walmart/group/stat?date=2023-01-01 +API->>Controller : 调用GroupStat +Controller->>Service : 获取分组统计输入 +Service->>DB : 查询分组统计数据 +DB-->>Service : 返回统计结果 +Service-->>Controller : 处理账户状态统计 +Controller-->>API : 返回分组统计 +API-->>Client : 返回分组统计结果 +``` + +**图示来源** +- [group.go](file://api/card_info_walmart/v1/group.go) +- [card_info_walmart_v1_group_stat.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_stat.go) + +**节来源** +- [group.go](file://api/card_info_walmart/v1/group.go) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) +- [card_info_walmart_v1_group_stat.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_stat.go) + +### 订单处理分析 +订单处理组件负责沃尔玛卡密的兑换流程,包括订单提交、状态查询和回调处理。 + +#### 订单提交流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Walmart as "沃尔玛平台" +Client->>API : POST /cardInfo/walmart/order/submit +API->>Controller : 调用Submit +Controller->>Service : 验证订单参数 +Service->>Service : 分配可用账户 +Service->>Walmart : 提交卡密兑换 +Walmart-->>Service : 返回兑换结果 +Service-->>Controller : 处理订单状态 +Controller-->>API : 返回响应 +API-->>Client : 返回订单结果 +``` + +**图示来源** +- [order.go](file://api/card_info_walmart/v1/order.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) + +#### 订单状态重置 +```mermaid +flowchart TD +Start([开始]) --> GetOrder["获取订单信息"] +GetOrder --> CheckStatus{"订单状态?"} +CheckStatus --> |失败| Reset["重置订单状态"] +CheckStatus --> |成功| End1([结束]) +CheckStatus --> |处理中| CheckTimeout{"超时?"} +CheckTimeout --> |是| Reset +CheckTimeout --> |否| End2([结束]) +Reset --> UpdateDB["更新数据库状态"] +UpdateDB --> Notify["通知相关系统"] +Notify --> End([结束]) +``` + +**图示来源** +- [order.go](file://api/card_info_walmart/v1/order.go) +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go) + +**节来源** +- [order.go](file://api/card_info_walmart/v1/order.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go) + +### 统计分析组件 +统计分析组件提供沃尔玛卡密系统的整体运营数据,帮助管理员了解系统运行状况。 + +#### 统计概览接口 +```mermaid +classDiagram +class StatsOverviewReq { ++int64 GroupId ++datetime[] DateRange ++string AccountId +} +class StatsOverviewRes { ++int TotalActiveAccountCount ++int TotalAccountCount ++float TotalOrderAmount ++float TotalOrderAmountSuccess ++int TotalOrderCount ++int TotalOrderCountSuccess +} +class StatsOverviewDownloadReq { ++int64 GroupId ++string AccountId +} +StatsOverviewReq --> StatsOverviewDownloadReq : "继承" +``` + +**图示来源** +- [stats.go](file://api/card_info_walmart/v1/stats.go) + +**节来源** +- [stats.go](file://api/card_info_walmart/v1/stats.go) +- [card_info_walmart_v1_stats_overview.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_stats_overview.go) + +## 依赖分析 +沃尔玛卡密管理API的依赖关系清晰,各组件之间耦合度低,便于维护和扩展。 + +```mermaid +graph TD +API[API接口] --> Controller[控制器] +Controller --> Service[服务层] +Service --> Model[数据模型] +Service --> Const[常量] +Model --> DB[(数据库)] +Const --> Controller +Const --> Service +style API fill:#f9f,stroke:#333 +style Controller fill:#bbf,stroke:#333 +style Service fill:#f96,stroke:#333 +style Model fill:#6f9,stroke:#333 +style Const fill:#69f,stroke:#333 +style DB fill:#9f9,stroke:#333 +``` + +**图示来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [internal/controller/card_info_walmart](file://internal/controller/card_info_walmart) +- [internal/model/entity](file://internal/model/entity) +- [internal/consts](file://internal/consts) + +**节来源** +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [internal/consts/card_redeem.go](file://internal/consts/card_redeem.go) +- [internal/model/entity/v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + +## 性能考虑 +沃尔玛卡密管理API在设计时充分考虑了性能因素。批量操作采用流式处理,避免内存溢出;数据库查询使用索引优化,提高查询效率;状态检测采用缓存机制,减少对沃尔玛平台的频繁调用。系统还实现了限流机制,防止对沃尔玛API的过度调用。 + +## 故障排除指南 +当遇到问题时,可按照以下步骤进行排查: +1. 检查账户Cookie是否有效,可通过状态检测接口验证 +2. 确认账户状态是否正常,禁用的账户无法处理订单 +3. 检查分组配置是否正确,确保账户分配到正确的分组 +4. 查看订单历史,分析失败订单的具体原因 +5. 检查系统日志,获取详细的错误信息 + +**节来源** +- [card_info_walmart_v1_account_status_detect.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_status_detect.go) +- [card_info_walmart_v1_order_history.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_history.go) + +## 结论 +沃尔玛卡密管理API提供了一套完整、高效的解决方案,用于管理沃尔玛礼品卡的兑换流程。系统设计合理,功能完善,具备良好的可扩展性和可维护性。通过合理的账户管理、分组策略和状态同步机制,确保了系统的稳定运行和高效处理能力。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密订单处理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密订单处理.md new file mode 100644 index 00000000..b6531c2d --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密订单处理.md @@ -0,0 +1,249 @@ +# 沃尔玛卡密订单处理 + + +**本文档引用的文件** +- [order.go](file://api/card_info_walmart/v1/order.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) +- [card_info_walmart_v1_order_callback.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go) +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go) +- [order.go](file://internal/logic/card_redeem_order/order.go) +- [callback.go](file://internal/logic/card_redeem_order/callback.go) +- [status.go](file://internal/logic/card_redeem_order/status.go) +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + + +## 目录 +1. [简介](#简介) +2. [核心接口说明](#核心接口说明) +3. [订单状态机与处理流程](#订单状态机与处理流程) +4. [回调处理机制](#回调处理机制) +5. [状态重置安全限制](#状态重置安全限制) +6. [客户端实现指南](#客户端实现指南) +7. [性能优化与限流策略](#性能优化与限流策略) +8. [异常恢复场景](#异常恢复场景) +9. [安全验证机制](#安全验证机制) +10. [总结](#总结) + +## 简介 +本文档详细说明沃尔玛卡密订单处理系统的API接口,涵盖订单提交、第三方回调处理和订单状态重置等核心功能。系统采用微服务架构,通过RESTful API提供服务,支持高并发订单处理和安全回调验证。文档重点阐述沃尔玛卡密订单特有的处理流程,包括订单状态转换规则、回调验证机制和状态重置的安全限制,为开发者提供完整的集成指南。 + +## 核心接口说明 + +### 订单提交接口 +**HTTP方法**: POST +**URL模式**: `/cardInfo/walmart/order/submit` +**认证机制**: JWT令牌认证 + +**请求参数**: +- `cardNo`: 卡号 (字符串) +- `giftCardPwd`: 礼品卡密码 (字符串, 必填) +- `notifyUrl`: 回调地址 (字符串, 必填) +- `merchantId`: 商户ID (字符串, 必填) +- `attach`: 附加信息 (字符串) +- `amount`: 充值金额 (浮点数, 必填) + +**响应模式**: 空响应体,HTTP状态码表示操作结果 + +**功能说明**: 接收沃尔玛卡密充值请求,创建待处理订单并触发核销流程。订单创建后立即返回,实际处理在后台异步执行。 + +**Section sources** +- [order.go](file://api/card_info_walmart/v1/order.go#L6-L28) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L1-L32) + +### 订单回调接口 +**HTTP方法**: GET +**URL模式**: `/cardInfo/walmart/order/callback` +**认证机制**: JWT令牌认证 + +**请求参数**: +- `orderNo`: 订单ID (字符串, 必填) + +**响应模式**: 空响应体,HTTP状态码表示操作结果 + +**功能说明**: 手动触发对第三方商户的回调操作。仅当订单处于成功或失败状态且未回调时可执行。 + +**Section sources** +- [order.go](file://api/card_info_walmart/v1/order.go#L58-L67) +- [card_info_walmart_v1_order_callback.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go#L1-L52) + +### 订单状态重置接口 +**HTTP方法**: PUT +**URL模式**: `/cardInfo/walmart/order/statusReset` +**认证机制**: JWT令牌认证 + +**请求参数**: +- `id`: 订单ID (字符串, 必填) + +**响应模式**: 空响应体,HTTP状态码表示操作结果 + +**功能说明**: 重置订单状态,仅允许将状态为"最大限制"的订单重置为待处理状态,确保系统安全。 + +**Section sources** +- [order.go](file://api/card_info_walmart/v1/order.go#L69-L77) +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go#L1-L29) + +## 订单状态机与处理流程 + +```mermaid +stateDiagram-v2 +[*] --> 待处理 +待处理 --> 处理中 : 开始处理 +处理中 --> 充值成功 : 验证通过 +处理中 --> 充值失败 : 验证失败 +处理中 --> 账号失效 : 账号问题 +处理中 --> 卡密类型错误 : 类型不匹配 +处理中 --> 卡片过期 : 过期验证 +充值成功 --> 回调成功 : 成功回调 +充值失败 --> 回调失败 : 失败回调 +回调成功 --> [*] +回调失败 --> [*] +充值成功 --> 订单禁用 : 最大调用次数 +订单禁用 --> 待处理 : 手动重置 +``` + +**Diagram sources** +- [card_redeem.go](file://internal/consts/card_redeem.go#L100-L200) +- [status.go](file://internal/logic/card_redeem_order/status.go#L12-L49) + +**Section sources** +- [card_redeem.go](file://internal/consts/card_redeem.go#L100-L252) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go#L1-L34) + +## 回调处理机制 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 第三方商户 +客户端->>控制器 : GET /callback?orderNo=123 +控制器->>服务层 : 验证用户权限 +服务层-->>控制器 : 权限验证结果 +控制器->>服务层 : 查询订单状态 +服务层-->>控制器 : 订单信息 +控制器->>服务层 : 验证订单状态 +服务层-->>控制器 : 状态验证结果 +控制器->>服务层 : 触发回调流程 +服务层->>服务层 : 生成签名参数 +服务层->>第三方商户 : POST notifyUrl +第三方商户-->>服务层 : 响应结果 +服务层->>服务层 : 更新回调状态 +服务层-->>控制器 : 回调结果 +控制器-->>客户端 : HTTP响应 +``` + +**Diagram sources** +- [card_info_walmart_v1_order_callback.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go#L1-L52) +- [callback.go](file://internal/logic/card_redeem_order/callback.go#L27-L121) + +**Section sources** +- [card_info_walmart_v1_order_callback.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go#L1-L52) +- [callback.go](file://internal/logic/card_redeem_order/callback.go#L27-L150) + +## 状态重置安全限制 + +```mermaid +flowchart TD +开始[状态重置请求] --> 验证[验证订单存在] +验证 --> 查询[查询订单实体] +查询 --> 检查状态[检查当前状态] +检查状态 --> 是否为最大限制{状态是否为
最大限制?} +是否为最大限制 --> |是| 重置状态[重置为待处理] +是否为最大限制 --> |否| 返回错误[返回操作失败] +重置状态 --> 重置原始状态[重置订单原本状态] +重置原始状态 --> 重置回调次数[重置回调次数为0] +重置回调次数 --> 结束[操作成功] +返回错误 --> 结束 +``` + +**Diagram sources** +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go#L1-L29) +- [status.go](file://internal/logic/card_redeem_order/status.go#L12-L49) + +**Section sources** +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go#L1-L29) +- [status.go](file://internal/logic/card_redeem_order/status.go#L12-L73) + +## 客户端实现指南 + +### 订单提交流程 +1. 准备请求参数,确保包含必填字段 +2. 使用JWT令牌进行身份认证 +3. 发送POST请求到提交接口 +4. 处理响应,记录订单号用于后续查询 + +### 第三方回调处理 +1. 在商户系统中配置notifyUrl +2. 实现回调接收端点,验证签名 +3. 根据回调参数更新本地订单状态 +4. 返回"success"确认接收 + +### 错误处理建议 +- 对于重复订单错误,使用唯一订单号避免重复提交 +- 对于账号频繁错误,实现指数退避重试策略 +- 对于验证失败错误,检查卡密格式和有效性 + +**Section sources** +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L1-L32) +- [callback.go](file://internal/logic/card_redeem_order/callback.go#L122-L150) + +## 性能优化与限流策略 + +```mermaid +flowchart LR +客户端 --> |高并发请求| 限流器 +限流器 --> |令牌桶算法| 核销触发器 +核销触发器 --> |异步处理| 工作池 +工作池 --> |并发消费| 账号分配 +账号分配 --> |预扣款| 第三方接口 +第三方接口 --> |绑定卡密| 响应处理 +响应处理 --> |更新状态| 数据库 +数据库 --> |回调通知| 商户系统 +``` + +**Diagram sources** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L244-L357) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go#L1-L80) + +**Section sources** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L1-L357) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go#L1-L80) + +## 异常恢复场景 + +### 订单状态异常恢复 +当订单因系统故障处于异常状态时,可通过状态重置接口恢复处理。仅允许重置状态为"订单禁用,最大调用次数"的订单,确保不会影响正常处理流程。 + +### 回调失败恢复 +系统自动重试回调3次,每次间隔递增。若全部失败,可通过手动回调接口重新触发。商户应确保回调端点的高可用性,避免丢失通知。 + +### 数据一致性保障 +使用数据库事务确保状态变更的原子性。在账号分配和预扣款操作中使用事务锁,防止并发问题导致的数据不一致。 + +**Section sources** +- [card_info_walmart_v1_order_status_reset.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go#L1-L29) +- [callback.go](file://internal/logic/card_redeem_order/callback.go#L27-L121) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L1-L357) + +## 安全验证机制 + +### 回调签名验证 +回调请求包含时间戳和签名参数,商户需使用共享密钥验证签名有效性,防止伪造请求。 + +### 权限控制 +所有接口均需JWT令牌认证,确保只有授权用户可访问。回调接口额外验证订单归属,防止越权操作。 + +### 配置安全 +通过系统配置字典控制关键策略,如金额异议回调、补卡自动回调等,提供灵活的安全策略管理。 + +**Section sources** +- [callback.go](file://internal/logic/card_redeem_order/callback.go#L122-L150) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go#L1-L81) + +## 总结 +沃尔玛卡密订单处理系统提供了完整的订单生命周期管理功能,从提交、处理到回调和状态重置。系统设计注重安全性、可靠性和性能,通过状态机管理订单流转,使用异步处理提高吞吐量,并提供灵活的配置选项满足不同商户需求。开发者应遵循本文档的实现指南,确保正确集成和使用API接口。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密账户管理.md b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密账户管理.md new file mode 100644 index 00000000..c4b49a9d --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/卡密信息管理API/沃尔玛卡密管理API/沃尔玛卡密账户管理.md @@ -0,0 +1,238 @@ +# 沃尔玛卡密账户管理 + + +**本文档引用文件** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_account_cookie_batch_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_add.go) +- [card_info_walmart_v1_account_cookie_batch_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go) +- [card_info_walmart_v1_account_update.go](file://internal/controller/card_info_walmart/card_info_wallet_v1_account_update.go) +- [card_info_walmart_v1_account_update_status.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_update_status.go) +- [card_info_walmart_v1_account_cookie_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_check.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了沃尔玛卡密账户管理API的功能,涵盖账户创建、Cookie批量验证、状态检测、信息更新等关键接口。文档详细描述了各端点的HTTP方法、URL模式、请求/响应结构和认证机制,并提供实际使用示例。同时解释了沃尔玛卡密特有的账户状态检测机制、异常处理流程和负载均衡策略,为客户端实现和性能优化提供指导。 + +## 项目结构 +沃尔玛卡密账户管理功能主要分布在`api/card_info_walmart/v1/`和`internal/controller/card_info_walmart/`目录下,通过分层架构实现接口定义与业务逻辑分离。 + +```mermaid +graph TB +subgraph "API层" +A[account.go] +B[config.go] +C[group.go] +D[order.go] +end +subgraph "控制器层" +E[card_info_walmart_v1_account_create.go] +F[card_info_walmart_v1_account_cookie_batch_add.go] +G[card_info_walmart_v1_account_cookie_batch_check.go] +H[card_info_walmart_v1_account_update.go] +end +subgraph "服务层" +I[card_redeem_account.go] +end +subgraph "常量定义" +J[card_redeem.go] +end +subgraph "数据模型" +K[v_1_card_redeem_account_info.go] +end +A --> E +A --> F +A --> G +A --> H +E --> I +F --> I +G --> I +H --> I +I --> K +J --> I +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + +**本节来源** +- [api/card_info_walmart/v1/account.go](file://api/card_info_walmart/v1/account.go) +- [internal/controller/card_info_walmart/](file://internal/controller/card_info_walmart/) + +## 核心组件 +沃尔玛卡密账户管理的核心组件包括账户管理API、批量操作控制器、状态检测服务和账户实体模型。系统通过`CardRedeemAccount`服务统一管理账户的增删改查、状态更新和余额操作,确保数据一致性和业务逻辑的集中管理。 + +**本节来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 架构概览 +系统采用典型的分层架构,从API接口到服务层再到数据模型,各层职责分明。API层定义了所有外部可访问的端点,控制器层处理具体业务逻辑,服务层提供可复用的业务功能,数据模型层定义了持久化结构。 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Model[数据模型层] +Service --> Database[(数据库)] +API -.->|请求/响应| Controller +Controller -.->|业务逻辑调用| Service +Service -.->|数据操作| Model +Model -.->|CRUD操作| Database +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 详细组件分析 + +### 账户创建与更新分析 +账户创建和更新功能通过统一的流程处理,包括权限验证、Cookie有效性检查、余额查询和数据库持久化。创建时会验证管理员设置的最大充值次数限制,确保系统安全。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant ClientInt as "第三方客户端" +Client->>API : POST /cardInfo/walmart/account/create +API->>Controller : 转发请求 +Controller->>Service : LoginOnlyLogin() +Service-->>Controller : 用户信息 +Controller->>ClientInt : GetClient(walmart) +ClientInt-->>Controller : 客户端实例 +Controller->>ClientInt : QueryUserInfoWithCache() +ClientInt-->>Controller : 用户信息 +Controller->>Service : GetNormalOneByCk() +Service-->>Controller : 账户存在检查 +Controller->>ClientInt : QueryBalanceWithCache() +ClientInt-->>Controller : 余额信息 +Controller->>Service : Add() 创建账户 +Service-->>Controller : 成功 +Controller-->>Client : 返回结果 +``` + +**图示来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +**本节来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_account_update.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_update.go) + +### 批量操作分析 +批量操作支持Cookie的批量验证和添加,通过Excel文件上传实现高效的数据导入。系统采用并发处理机制,提高批量操作的执行效率。 + +```mermaid +flowchart TD +Start([开始]) --> Upload["上传Excel文件"] +Upload --> Validate["验证文件完整性"] +Validate --> Read["读取文件数据"] +Read --> Process["并发处理每行数据"] +Process --> CheckExist["检查账户是否已存在"] +CheckExist --> ValidateLimit["验证充值次数限制"] +ValidateLimit --> QueryInfo["查询用户信息和余额"] +QueryInfo --> Collect["收集验证结果"] +Collect --> End["返回批量验证结果"] +``` + +**图示来源** +- [card_info_walmart_v1_account_cookie_batch_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go) +- [card_info_walmart_v1_account_cookie_batch_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_add.go) + +**本节来源** +- [card_info_walmart_v1_account_cookie_batch_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go) +- [card_info_walmart_v1_account_cookie_batch_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_add.go) + +### 状态检测机制分析 +沃尔玛卡密账户的状态检测机制包括实时检测和定时检测两种模式。实时检测通过API接口触发,定时检测由系统后台任务定期执行,确保账户状态的及时更新。 + +```mermaid +stateDiagram-v2 +[*] --> Idle +Idle --> RealTimeCheck : "API调用" +Idle --> ScheduledCheck : "定时任务" +RealTimeCheck --> ValidateCookie : "验证Cookie有效性" +ScheduledCheck --> ValidateCookie : "验证所有账户Cookie" +ValidateCookie --> UpdateBalance : "更新账户余额" +UpdateBalance --> CheckLimits : "检查充值限制" +CheckLimits --> UpdateStatus : "更新账户状态" +UpdateStatus --> Idle : "完成" +``` + +**图示来源** +- [card_info_walmart_v1_account_cookie_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_check.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +**本节来源** +- [card_info_walmart_v1_account_cookie_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_check.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +## 依赖分析 +系统依赖关系清晰,API层依赖控制器层,控制器层依赖服务层和第三方客户端,服务层依赖数据模型和配置服务。这种分层依赖结构确保了系统的可维护性和可测试性。 + +```mermaid +graph TD +A[account.go] --> B[card_info_walmart_v1_account_create.go] +A --> C[card_info_walmart_v1_account_cookie_batch_add.go] +A --> D[card_info_walmart_v1_account_cookie_check.go] +B --> E[card_redeem_account.go] +C --> E +D --> E +E --> F[v_1_card_redeem_account_info.go] +E --> G[card_redeem.go] +E --> H[SysConfigDict] +B --> I[redeem client] +C --> I +D --> I +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +**本节来源** +- [api/card_info_walmart/v1/account.go](file://api/card_info_walmart/v1/account.go) +- [internal/controller/card_info_walmart/](file://internal/controller/card_info_walmart/) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 性能考虑 +在批量操作中,系统采用并发处理机制,通过`slice.ForEachConcurrent`方法提高处理效率。同时,接口设置了限流机制,防止恶意请求对系统造成压力。状态检测采用缓存策略,减少对第三方服务的频繁调用。 + +**本节来源** +- [card_info_walmart_v1_account_cookie_batch_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go) +- [card_info_walmart_v1_account_cookie_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_check.go) + +## 故障排除指南 +常见问题包括Cookie失效、账户已存在、充值次数超限等。系统通过详细的错误码和错误信息帮助定位问题。对于批量操作失败,建议检查Excel文件格式是否正确,Cookie是否有效,以及账户是否已存在于系统中。 + +**本节来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_account_cookie_check.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_check.go) + +## 结论 +沃尔玛卡密账户管理系统提供了完整的账户生命周期管理功能,包括创建、更新、批量操作和状态检测。系统架构清晰,依赖关系明确,性能优化到位,为卡密业务的稳定运行提供了可靠保障。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户管理API.md b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户管理API.md new file mode 100644 index 00000000..7ac47387 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户管理API.md @@ -0,0 +1,432 @@ +# 商户管理API + + +**本文档引用的文件** +- [config.go](file://api/merchant/v1/config.go) +- [deploy.go](file://api/merchant/v1/deploy.go) +- [steal.go](file://api/merchant/v1/steal.go) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go) +- [merchant.go](file://internal/service/merchant.go) +- [steal_rule.go](file://internal/service/steal_rule.go) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go) +- [v_1_merchant_info.go](file://internal/model/entity/v_1_merchant_info.go) +- [v_1_merchant_deploy_info.go](file://internal/model/entity/v_1_merchant_deploy_info.go) +- [v_1_merchant_hidden_config.go](file://internal/model/entity/v_1_merchant_hidden_config.go) +- [v_1_merchant_hidden_record.go](file://internal/model/entity/v_1_merchant_hidden_record.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +商户管理API提供了一套完整的商户生命周期管理功能,包括商户配置、部署管理和盗单处理等核心功能。该系统实现了多租户架构,支持商户隔离、配置继承和权限控制策略。API设计遵循RESTful原则,通过清晰的端点组织和标准化的请求/响应模式,为商户管理提供了高效、安全的接口。 + +## 项目结构 +商户管理功能主要分布在`api/merchant/v1`目录下,包含配置、部署和盗单处理三个核心模块。每个模块都有对应的请求/响应结构体定义。业务逻辑实现在`internal/controller/merchant`目录中,服务层位于`internal/service`,数据模型定义在`internal/model/entity`目录下。这种分层架构确保了代码的可维护性和扩展性。 + +```mermaid +graph TD +subgraph "API层" +A[config.go] +B[deploy.go] +C[steal.go] +end +subgraph "控制器层" +D[merchant_v1_merchant_config_*.go] +E[merchant_v1_merchant_deploy_*.go] +F[merchant_v1_steal_*.go] +end +subgraph "服务层" +G[merchant.go] +H[steal_rule.go] +I[merchant_deploy_info.go] +end +subgraph "数据模型层" +J[v_1_merchant_info.go] +K[v_1_merchant_deploy_info.go] +L[v_1_merchant_hidden_config.go] +M[v_1_merchant_hidden_record.go] +end +A --> D +B --> E +C --> F +D --> G +E --> I +F --> H +G --> J +I --> K +H --> L +H --> M +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go) +- [deploy.go](file://api/merchant/v1/deploy.go) +- [steal.go](file://api/merchant/v1/steal.go) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go) + +**章节来源** +- [config.go](file://api/merchant/v1/config.go#L1-L80) +- [deploy.go](file://api/merchant/v1/deploy.go#L1-L56) +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) + +## 核心组件 +商户管理API的核心组件包括商户配置管理、部署信息管理和盗单规则管理。商户配置管理负责商户的创建、更新、状态切换和查询;部署信息管理处理商户的通道部署配置;盗单规则管理实现盗单策略的配置、状态管理和记录查询。这些组件通过清晰的接口定义和分层架构,确保了系统的可维护性和扩展性。 + +**章节来源** +- [config.go](file://api/merchant/v1/config.go#L1-L80) +- [deploy.go](file://api/merchant/v1/deploy.go#L1-L56) +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) + +## 架构概述 +系统采用典型的分层架构,包括API层、控制器层、服务层和数据访问层。API层定义了所有外部接口的请求/响应结构;控制器层处理HTTP请求并调用相应的服务;服务层封装了业务逻辑;数据访问层负责与数据库交互。这种架构实现了关注点分离,提高了代码的可测试性和可维护性。 + +```mermaid +graph TD +A[客户端] --> B[API层] +B --> C[控制器层] +C --> D[服务层] +D --> E[数据访问层] +E --> F[数据库] +subgraph "API层" +B +end +subgraph "控制器层" +C +end +subgraph "服务层" +D +end +subgraph "数据访问层" +E +end +subgraph "数据存储" +F +end +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go) +- [deploy.go](file://api/merchant/v1/deploy.go) +- [steal.go](file://api/merchant/v1/steal.go) + +## 详细组件分析 + +### 商户配置管理分析 +商户配置管理组件提供了商户的全生命周期管理功能,包括创建、查询、更新和状态管理。系统通过多租户架构实现了商户隔离,每个商户都有唯一的商户UID和密钥对,确保了数据的安全性和隔离性。 + +#### 对象导向组件: +```mermaid +classDiagram +class MerchantConfigListReq { ++string path : /merchant/config/getList ++string tags : 商户信息 ++string method : get ++string summary : 获取商户列表信息 +} +class MerchantConfigDetailReq { ++string path : /merchant/config/getDetail ++string tags : 商户信息 ++string method : get ++string summary : 获取商户详细信息 ++string merchantUid : 商户uid +} +class MerchantConfigUpdateReq { ++string path : /merchant/config/updateDetail ++string tags : 商户信息 ++string method : post ++string summary : 修改商户信息 +} +class MerchantConfigAddReq { ++string path : /merchant/config/add ++string tags : 商户信息 ++string method : post ++string summary : 添加商户 +} +class MerchantConfigStatusReq { ++string path : /merchant/config/switchStatus ++string tags : 商户信息 ++string method : post ++string summary : 切换商户状态 ++string merchantUid : 商户uid ++string status : 状态ID +} +MerchantConfigListReq --> MerchantListParamsReq : 包含 +MerchantConfigDetailReq --> MerchantUid : 参数 +MerchantConfigUpdateReq --> MerchantSimpleInfoRecord : 包含 +MerchantConfigAddReq --> MerchantRecord : 包含 +MerchantConfigStatusReq --> MerchantUid : 参数 +MerchantConfigStatusReq --> Status : 参数 +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go#L15-L80) + +#### API/服务组件: +```mermaid +sequenceDiagram +participant 客户端 +participant Controller +participant Service +participant 数据库 +客户端->>Controller : POST /merchant/config/add +Controller->>Controller : 创建事务 +Controller->>Service : 调用Merchant().Add() +Service->>数据库 : 插入商户信息 +数据库-->>Service : 成功 +Service->>Service : 调用Account().Add() +Service->>数据库 : 插入账户信息 +数据库-->>Service : 成功 +Service-->>Controller : 成功 +Controller-->>客户端 : 200 OK +``` + +**图示来源** +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L1-L48) +- [merchant.go](file://internal/service/merchant.go#L17-L25) + +**章节来源** +- [config.go](file://api/merchant/v1/config.go#L1-L80) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L1-L48) +- [merchant.go](file://internal/service/merchant.go#L1-L37) + +### 部署信息管理分析 +部署信息管理组件负责商户的通道部署配置,包括单通道和轮询通道的配置管理。系统支持灵活的部署策略,允许商户根据业务需求配置不同的支付通道和限制策略。 + +#### 对象导向组件: +```mermaid +classDiagram +class MerchantDeployListReq { ++string path : /merchant/deploy/getList ++string tags : 商户部署信息 ++string method : get ++string summary : 获取商户部署通道信息 ++string merchantUid : 商户uid +} +class MerchantDeployDeleteReq { ++string path : /merchant/deploy/delete ++string tags : 商户部署信息 ++string method : delete ++string summary : 删除商户部署通道信息 ++string merchantUid : 商户uid ++string singleRoadUid : 单通道uid +} +class MerchantDeployAddReq { ++string path : /merchant/deploy/add ++string tags : 商户部署信息 ++string method : post ++string summary : 添加商户部署通道信息 +} +class MerchantDeployUpdateReq { ++string path : /merchant/deploy/update ++string tags : 商户部署信息 ++string method : post ++string summary : 更新商户部署通道信息 +} +class MerchantDeployGetDetailReq { ++string path : merchant/deploy/getDetail ++string tags : 商户部署信息 ++string method : get ++string summary : 获取商户部署通道详情 +} +MerchantDeployListReq --> MerchantUid : 参数 +MerchantDeployDeleteReq --> MerchantUid : 参数 +MerchantDeployDeleteReq --> SingleRoadUid : 参数 +MerchantDeployAddReq --> MerchantDeployRateAdd : 包含 +MerchantDeployUpdateReq --> MerchantDeployRateUpdate : 包含 +MerchantDeployGetDetailReq --> CommonIntId : 继承 +``` + +**图示来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L1-L56) + +#### API/服务组件: +```mermaid +sequenceDiagram +participant 客户端 +participant Controller +participant Service +participant 数据库 +客户端->>Controller : POST /merchant/deploy/add +Controller->>Service : RoadPool().GetDetailByCode() +Service-->>Controller : 通道池信息 +Controller->>Service : Road().GetDetailByUid() +Service-->>Controller : 通道信息 +Controller->>Service : MerchantDeployInfo().AddOrUpdate() +Service->>数据库 : 插入或更新部署信息 +数据库-->>Service : 成功 +Service-->>Controller : 成功 +Controller-->>客户端 : 200 OK +``` + +**图示来源** +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L1-L53) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go#L15-L28) + +**章节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L1-L56) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L1-L53) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go#L1-L40) + +### 盗单规则管理分析 +盗单规则管理组件实现了盗单策略的完整管理功能,包括规则的创建、更新、删除和状态管理。系统通过严格的验证机制确保规则的正确性,并提供详细的记录和统计功能。 + +#### 对象导向组件: +```mermaid +classDiagram +class StealStatusSetReq { ++string path : /merchant/config/stealRule/status ++string tags : 偷卡设置 ++string method : post ++string summary : 设置偷卡状态 ++bool status : 状态ID +} +class StealStatusGetReq { ++string path : /merchant/config/stealRule/status ++string tags : 偷卡设置 ++string method : get ++string summary : 获取偷卡状态 +} +class StealCreateReq { ++string path : /merchant/config/stealRule/create ++string tags : 偷卡设置 ++string method : post ++string summary : 添加一条规则 +} +class StealUpdateReq { ++string path : /merchant/config/stealRule/update ++string tags : 偷卡设置 ++string method : post ++string summary : 更新一条规则 +} +class StealUpdateStatusReq { ++string path : /merchant/config/stealRule/updateStatus ++string tags : 偷卡设置 ++string method : post ++string summary : 更新一条规则 ++int enable : 启用状态 +} +class StealDeleteReq { ++string path : /merchant/config/stealRule/update ++string tags : 偷卡设置 ++string method : delete ++string summary : 删除一条规则 +} +class StealListReq { ++string path : /merchant/config/stealRule/list ++string tags : 偷卡设置 ++string method : get ++string summary : 获取列表 +} +class StealRecordListReq { ++string path : /merchant/config/stealRule/record ++string tags : 偷卡设置 ++string method : get ++string summary : 获取偷卡记录 +} +class StealStatsReq { ++string path : /merchant/config/stealRule/stats ++string tags : 偷卡设置 ++string method : get ++string summary : 获取偷卡统计 +} +StealCreateReq --> MerchantHiddenConfig : 包含 +StealUpdateReq --> CommonIntId : 继承 +StealUpdateReq --> MerchantHiddenConfig : 包含 +StealUpdateStatusReq --> CommonIntId : 继承 +StealDeleteReq --> CommonIntId : 继承 +StealListReq --> CommonPageReq : 继承 +StealRecordListReq --> CommonPageReq : 继承 +StealStatsReq --> CommonPageReq : 继承 +``` + +**图示来源** +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) + +#### API/服务组件: +```mermaid +sequenceDiagram +participant 客户端 +participant Controller +participant Service +participant 数据库 +客户端->>Controller : POST /merchant/config/stealRule/create +Controller->>Controller : 验证金额规则 +alt 金额规则验证失败 +Controller-->>客户端 : 400 Bad Request +else 金额规则验证成功 +Controller->>Service : StealRule().Create() +Service->>数据库 : 插入盗单规则 +数据库-->>Service : 成功 +Service-->>Controller : 成功 +Controller-->>客户端 : 200 OK +end +``` + +**图示来源** +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L1-L25) +- [steal_rule.go](file://internal/service/steal_rule.go#L14-L24) + +**章节来源** +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L1-L25) +- [steal_rule.go](file://internal/service/steal_rule.go#L1-L36) + +## 依赖分析 +商户管理API的各个组件之间存在清晰的依赖关系。API层依赖于控制器层,控制器层依赖于服务层,服务层依赖于数据访问层。这种分层依赖确保了系统的可维护性和可测试性。服务层组件之间相对独立,通过接口进行通信,降低了耦合度。 + +```mermaid +graph TD +A[config.go] --> B[merchant_v1_merchant_config_*.go] +B --> C[merchant.go] +C --> D[v_1_merchant_info.go] +E[deploy.go] --> F[merchant_v1_merchant_deploy_*.go] +F --> G[merchant_deploy_info.go] +G --> H[v_1_merchant_deploy_info.go] +I[steal.go] --> J[merchant_v1_steal_*.go] +J --> K[steal_rule.go] +K --> L[v_1_merchant_hidden_config.go] +K --> M[v_1_merchant_hidden_record.go] +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go) +- [deploy.go](file://api/merchant/v1/deploy.go) +- [steal.go](file://api/merchant/v1/steal.go) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go) + +**章节来源** +- [config.go](file://api/merchant/v1/config.go#L1-L80) +- [deploy.go](file://api/merchant/v1/deploy.go#L1-L56) +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L1-L48) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L1-L53) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L1-L25) + +## 性能考虑 +商户管理API在设计时考虑了性能优化。通过数据库事务确保数据一致性,使用缓存减少数据库访问,采用分页查询避免大数据量传输。对于频繁访问的数据,建议客户端实现本地缓存。API响应时间应控制在200ms以内,对于复杂查询应提供异步处理选项。 + +## 故障排除指南 +常见问题包括商户创建失败、部署配置无效和盗单规则验证错误。对于商户创建失败,检查请求参数是否完整,特别是必填字段如商户名称和登录密码。对于部署配置无效,验证通道UID是否存在且状态正常。对于盗单规则验证错误,确保偷卡金额不大于偷卡面额。所有错误都会返回详细的错误信息,帮助快速定位问题。 + +**章节来源** +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L1-L48) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L1-L53) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L1-L25) + +## 结论 +商户管理API提供了一套完整的商户生命周期管理解决方案,通过清晰的分层架构和模块化设计,实现了商户配置、部署管理和盗单处理等核心功能。系统采用多租户架构,确保了商户数据的隔离性和安全性。API设计遵循RESTful原则,提供了标准化的接口,便于客户端集成和使用。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户部署管理.md b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户部署管理.md new file mode 100644 index 00000000..37509350 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户部署管理.md @@ -0,0 +1,226 @@ +# 商户部署管理 + + +**本文档中引用的文件** +- [deploy.go](file://api/merchant/v1/deploy.go) +- [model.go](file://api/merchant/v1/model.go) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go) +- [v_1_merchant_deploy_info.go](file://internal/dao/v_1_merchant_deploy_info.go) +- [v_1_road.go](file://internal/service/v_1_road.go) +- [v_1_road_pool.go](file://internal/service/v_1_road_pool.go) + + +## 目录 +1. [简介](#简介) +2. [核心数据结构](#核心数据结构) +3. [API端点说明](#api端点说明) +4. [部署创建接口](#部署创建接口) +5. [部署列表查询接口](#部署列表查询接口) +6. [部署更新接口](#部署更新接口) +7. [部署删除接口](#部署删除接口) +8. [部署详情获取接口](#部署详情获取接口) +9. [权限与安全](#权限与安全) +10. [错误处理策略](#错误处理策略) + +## 简介 +商户部署管理API用于配置和管理商户在不同支付通道上的部署信息。该系统支持商户在单通道和轮询通道上的灵活配置,包括费率设置、自动结算、自动代付、限制策略等关键功能。部署信息与商户配置紧密关联,确保支付流程的安全性和可控性。 + +**本文档中引用的文件** +- [deploy.go](file://api/merchant/v1/deploy.go) + +## 核心数据结构 + +### 商户部署记录结构 +商户部署记录包含商户在特定支付通道上的完整配置信息。 + +```mermaid +classDiagram +class MerchantDeployRecord { ++uint Id ++string Status ++string MerchantUid ++string PayType ++string PayTypeName ++string SingleRoadName ++string RollRoadName ++string RoadSetting +} +class MerchantDeployRateAdd { ++string SingleRoadUid ++[]PlatformRateRecord SingleRoadPlatformRate ++float64 SingleRoadAgentRate ++string RollRoadCode ++float64 RollRoadAgentRate ++float64 RollRoadPlatformRate ++string MerchantUid ++string AutoSettle ++string AutoPayfor ++[]string RestrictArea ++bool IsRestrictAgent ++bool IsRestrictCardPass ++bool IsRestrictDevice ++bool IsRestrictIp ++bool IsRestrictInternalIp ++string SubmitStrategy +} +class PlatformRateRecord { ++float64 FactLabel ++float64 ShowLabel ++string PlatformLabel ++bool IsLinkSingle ++float64 Value ++string LinkID ++int Sort +} +MerchantDeployRecord --> MerchantDeployRateAdd : "包含" +MerchantDeployRateAdd --> PlatformRateRecord : "包含" +``` + +**图示来源** +- [model.go](file://api/merchant/v1/model.go#L53-L97) + +**本节来源** +- [model.go](file://api/merchant/v1/model.go#L53-L97) + +## API端点说明 +商户部署管理API提供以下核心端点: + +| 端点 | HTTP方法 | 路径 | 功能 | +|------|--------|------|------| +| 创建部署 | POST | /merchant/deploy/add | 添加商户部署通道信息 | +| 查询部署列表 | GET | /merchant/deploy/getList | 获取商户部署通道信息 | +| 更新部署 | POST | /merchant/deploy/update | 更新商户部署通道信息 | +| 删除部署 | DELETE | /merchant/deploy/delete | 删除商户部署通道信息 | +| 获取部署详情 | GET | /merchant/deploy/getDetail | 获取商户部署通道详情 | + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L8-L50) + +## 部署创建接口 + +### 请求参数 +`merchant_v1_merchant_deploy_add` 接口用于创建新的商户部署配置。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "ControllerV1" +participant RoadPool as "RoadPool服务" +participant Road as "Road服务" +participant Service as "MerchantDeployInfo服务" +Client->>Controller : POST /merchant/deploy/add +Controller->>RoadPool : GetDetailByCode(rollRoadCode) +RoadPool-->>Controller : 返回轮询通道信息 +Controller->>Road : GetDetailByUid(singleRoadUid) +Road-->>Controller : 返回单通道信息 +Controller->>Service : AddOrUpdate(部署信息) +Service-->>Controller : 返回结果 +Controller-->>Client : 返回响应 +``` + +**图示来源** +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L15-L50) +- [v_1_road_pool.go](file://internal/service/v_1_road_pool.go#L16) +- [v_1_road.go](file://internal/service/v_1_road.go#L16) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go#L21) + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L29-L32) +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L15-L50) + +## 部署列表查询接口 +`merchant_v1_merchant_deploy_list` 接口用于查询商户的部署列表。 + +```go +type MerchantDeployListReq struct { + g.Meta `path:"/merchant/deploy/getList" tags:"商户部署信息" method:"get" summary:"获取商户部署通道信息"` + MerchantUid string `json:"merchantUid" description:"商户uid"` +} +``` + +该接口需要提供商户UID作为查询参数,返回该商户在所有支付通道上的部署配置列表。 + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L8-L11) + +## 部署更新接口 +`merchant_v1_merchant_deploy_update` 接口用于更新现有的商户部署配置。 + +```go +type MerchantDeployUpdateReq struct { + g.Meta `path:"/merchant/deploy/update" tags:"商户部署信息" method:"post" summary:"更新商户部署通道信息"` + MerchantDeployRateAdd +} +``` + +更新操作会验证通道信息的有效性,并更新数据库中的部署记录。系统会自动同步通道名称等关联信息。 + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L38-L41) + +## 部署删除接口 +`merchant_v1_merchant_deploy_delete` 接口用于删除指定的商户部署配置。 + +```go +type MerchantDeployDeleteReq struct { + g.Meta `path:"/merchant/deploy/delete" tags:"商户部署信息" method:"delete" summary:"删除商户部署通道信息"` + MerchantUid string `json:"merchantUid" v:"required#商户ID不能为空" description:"商户uid"` + SingleRoadUid string `json:"singleRoadUid" v:"required#单通道uid不能为空" description:"单通道uid"` +} +``` + +删除操作需要同时提供商户UID和单通道UID来唯一标识要删除的部署配置。 + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L18-L23) + +## 部署详情获取接口 +`merchant_v1_merchant_deploy_get_detail` 接口用于获取特定部署配置的详细信息。 + +```go +type MerchantDeployGetDetailReq struct { + g.Meta `path:"merchant/deploy/getDetail" tags:"商户部署信息" method:"get" summary:"获取商户部署通道详情"` + commonApi.CommonIntId +} +``` + +该接口通过部署记录的ID来查询详细信息,返回完整的部署配置数据。 + +**本节来源** +- [deploy.go](file://api/merchant/v1/deploy.go#L47-L50) + +## 权限与安全 +商户部署管理API实施严格的权限验证机制: + +1. **身份验证**:所有请求必须包含有效的身份令牌 +2. **权限检查**:操作者必须具有管理商户部署的权限 +3. **数据隔离**:商户只能访问和修改自己的部署配置 +4. **输入验证**:所有输入参数都经过严格的格式和业务规则验证 +5. **操作审计**:关键操作会被记录到审计日志中 + +系统通过服务间调用验证通道和轮询通道的有效性,确保配置的准确性。 + +**本节来源** +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L15-L50) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go#L21) + +## 错误处理策略 +API提供详细的错误响应,帮助客户端正确处理异常情况: + +| 错误类型 | HTTP状态码 | 响应码 | 错误信息 | +|---------|-----------|--------|---------| +| 参数验证失败 | 400 | 400 | 缺失必填字段或格式错误 | +| 通道信息无效 | 400 | 400 | 选取通道错误或轮询通道错误 | +| 资源不存在 | 404 | 404 | 指定的部署配置不存在 | +| 服务器内部错误 | 500 | 500 | 系统处理异常 | + +常见错误场景包括: +- 提供的单通道UID或轮询通道编码无效 +- 必填字段缺失或格式不正确 +- 商户UID不存在或已被禁用 +- 并发修改导致的数据冲突 + +**本节来源** +- [merchant_v1_merchant_deploy_add.go](file://internal/controller/merchant/merchant_v1_merchant_deploy_add.go#L15-L50) +- [deploy.go](file://api/merchant/v1/deploy.go#L8-L50) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户配置管理.md b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户配置管理.md new file mode 100644 index 00000000..80c06858 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/商户管理API/商户配置管理.md @@ -0,0 +1,415 @@ +# 商户配置管理 + + +**本文档引用文件** +- [config.go](file://api/merchant/v1/config.go) +- [model.go](file://api/merchant/v1/model.go) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go) +- [merchant_v1_merchant_config_detail.go](file://internal/controller/merchant/merchant_v1_merchant_config_detail.go) +- [merchant.go](file://internal/service/merchant.go) +- [v_1_merchant_info.go](file://internal/model/do/v_1_merchant_info.go) +- [common.go](file://api/commonApi/common.go) +- [auth.go](file://internal/middleware/auth.go) + + +## 目录 +1. [简介](#简介) +2. [API端点概览](#api端点概览) +3. [商户配置数据结构](#商户配置数据结构) +4. [权限控制机制](#权限控制机制) +5. [错误处理策略](#错误处理策略) +6. [使用示例](#使用示例) + +## 简介 +本文档详细说明了商户配置管理API的使用方法,涵盖商户配置的增删改查操作。系统提供了完整的商户配置生命周期管理功能,包括创建、查询、更新、状态管理和详情获取等核心接口。所有接口均遵循RESTful设计原则,通过HTTP方法和URL路径实现对商户配置资源的操作。 + +**商户配置管理功能** +商户配置管理是系统核心功能之一,支持对商户基本信息、支付方式、费率策略等关键业务参数的全面管理。系统通过结构化的API设计,确保商户配置操作的安全性、一致性和可追溯性。 + +## API端点概览 + +商户配置管理API提供以下核心端点: + +### 商户配置创建 +- **HTTP方法**: POST +- **URL路径**: `/api/merchant/config/add` +- **功能描述**: 创建新的商户配置 +- **请求参数**: `MerchantConfigAddReq` +- **响应格式**: `MerchantConfigAddRes` + +### 商户配置列表查询 +- **HTTP方法**: GET +- **URL路径**: `/api/merchant/config/getList` +- **功能描述**: 查询商户配置列表(支持分页) +- **请求参数**: `MerchantConfigListReq` +- **响应格式**: `MerchantConfigListRes` + +### 商户配置更新 +- **HTTP方法**: POST +- **URL路径**: `/api/merchant/config/updateDetail` +- **功能描述**: 更新商户配置信息 +- **请求参数**: `MerchantConfigUpdateReq` +- **响应格式**: `MerchantConfigUpdateRes` + +### 商户配置状态管理 +- **HTTP方法**: POST +- **URL路径**: `/api/merchant/config/switchStatus` +- **功能描述**: 切换商户状态(启用/禁用) +- **请求参数**: `MerchantConfigStatusReq` +- **响应格式**: `MerchantConfigStatusRes` + +### 商户配置详情获取 +- **HTTP方法**: GET +- **URL路径**: `/api/merchant/config/getDetail` +- **功能描述**: 获取指定商户的详细配置信息 +- **请求参数**: `MerchantConfigDetailReq` +- **响应格式**: `MerchantConfigDetailRes` + +**API端点关系图** +```mermaid +flowchart TD +A["客户端"] --> B["创建商户配置"] +A --> C["查询商户列表"] +A --> D["获取商户详情"] +A --> E["更新商户配置"] +A --> F["管理商户状态"] +B --> |POST /add| G[商户配置服务] +C --> |GET /getList| G +D --> |GET /getDetail| G +E --> |POST /updateDetail| G +F --> |POST /switchStatus| G +G --> H[数据库] +G --> I[权限验证] +G --> J[事务管理] +style G fill:#4CAF50,stroke:#388E3C,color:white +style H fill:#2196F3,stroke:#1976D2,color:white +style I fill:#FF9800,stroke:#F57C00,color:white +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go#L39-L52) +- [merchant.go](file://internal/service/merchant.go#L15-L25) + +## 商户配置数据结构 + +### 核心数据模型 + +#### 商户记录(MerchantRecord) +商户创建时所需的基本信息: + +| 字段名 | 类型 | 必填 | 描述 | 验证规则 | +|--------|------|------|------|----------| +| status | string | 是 | 商户状态 | 必须提供 | +| merchantName | string | 是 | 商户名称 | 必须提供 | +| loginAccount | string | 是 | 登录账号 | 必须提供 | +| remark | string | 否 | 备注信息 | - | +| loginPassword | string | 是 | 登录密码 | 必须提供 | + +**Section sources** +- [model.go](file://api/merchant/v1/model.go#L14-L20) + +#### 商户简单信息记录(MerchantSimpleInfoRecord) +商户基本信息,用于更新和详情展示: + +| 字段名 | 类型 | 必填 | 描述 | 验证规则 | +|--------|------|------|------|----------| +| merchantName | string | 是 | 商户名称 | 必须提供 | +| merchantUid | string | 是 | 商户唯一标识 | 必须提供 | +| loginAccount | string | 是 | 登录账号 | 必须提供 | +| whiteIps | string | 否 | IP白名单配置 | - | +| remark | string | 否 | 备注信息 | - | + +**Section sources** +- [model.go](file://api/merchant/v1/model.go#L45-L51) + +#### 商户信息记录(MerchantInfoRecord) +完整的商户配置信息,包含所有字段: + +| 字段名 | 类型 | 描述 | +|--------|------|------| +| status | string | 商户状态 | +| belongAgentUid | string | 所属代理UID | +| belongAgentName | string | 所属代理名称 | +| merchantName | string | 商户名称 | +| merchantUid | string | 商户唯一标识 | +| merchantKey | string | 商户密钥 | +| merchantSecret | string | 商户密钥 | +| loginAccount | string | 登录账号 | +| clearTextPassword | string | 明文密码 | +| autoSettle | string | 是否自动结算 | +| autoPayFor | string | 是否自动代付 | +| whiteIps | string | IP白名单配置 | +| remark | string | 备注信息 | +| singlePayForRoadUid | string | 单代付通道UID | +| singlePayForRoadName | string | 单代付通道名称 | +| rollPayForRoadCode | string | 轮询代付通道编码 | +| rollPayForRoadName | string | 轮询代付通道名称 | +| payforFee | float64 | 代付手续费 | +| updateTime | *gtime.Time | 更新时间 | +| createTime | *gtime.Time | 创建时间 | + +**Section sources** +- [model.go](file://api/merchant/v1/model.go#L22-L43) + +### 数据库实体映射 +商户配置信息在数据库中的存储结构: + +```mermaid +erDiagram +MERCHANT_INFO { +uint id PK +string status +string belong_agent_uid +string belong_agent_name +string merchant_name +string merchant_uid UK +string merchant_key +string merchant_secret +string login_account UK +string login_password +string auto_settle +string auto_pay_for +string white_ips +string remark +string single_pay_for_road_uid +string single_pay_for_road_name +string roll_pay_for_road_code +string roll_pay_for_road_name +float payfor_fee +timestamp update_time +timestamp create_time +string otp_secret +} +``` + +**图示来源** +- [v_1_merchant_info.go](file://internal/model/do/v_1_merchant_info.go#L10-L37) + +## 权限控制机制 + +### 认证流程 +系统采用多层认证机制确保商户配置操作的安全性: + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Auth as 认证中间件 +participant Service as 商户服务 +participant DB as 数据库 +Client->>Auth : 发送请求 (含Token) +Auth->>Auth : 检查白名单 +alt 在白名单中 +Auth-->>Client : 直接放行 +else 不在白名单 +Auth->>Auth : 验证Token有效性 +Auth->>Auth : 检查Redis中Token +Auth->>Auth : 续签Token +Auth-->>Service : 认证通过 +Service->>DB : 执行业务逻辑 +DB-->>Service : 返回结果 +Service-->>Client : 返回响应 +end +``` + +**图示来源** +- [auth.go](file://internal/middleware/auth.go#L50-L154) +- [config.go](file://api/merchant/v1/config.go#L10-L52) + +### 权限验证规则 +1. **Token验证**: 所有非白名单接口必须提供有效的JWT Token +2. **Token续签**: 每次请求成功后自动续签Token有效期 +3. **Redis同步**: Token状态与Redis保持同步,确保即时失效 +4. **双因素认证**: 敏感操作支持二次验证机制 + +### 授权策略 +- **创建权限**: 仅管理员角色可创建新商户 +- **更新权限**: 仅商户所属管理员可修改配置 +- **状态管理**: 需要高级管理员权限才能切换商户状态 +- **详情查看**: 具有查看权限的用户均可获取商户详情 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L50-L154) +- [merchant.go](file://internal/service/merchant.go#L15-L25) + +## 错误处理策略 + +### 常见错误码 +系统定义了统一的错误处理机制,返回标准化的错误响应: + +| 错误码 | HTTP状态码 | 错误信息 | 场景说明 | +|--------|------------|----------|----------| +| 400 | 400 | 参数验证失败 | 请求参数缺失或格式错误 | +| 401 | 401 | 认证失败 | Token无效或过期 | +| 403 | 403 | 权限不足 | 用户无权执行该操作 | +| 404 | 404 | 资源不存在 | 指定商户UID不存在 | +| 409 | 409 | 配置冲突 | 商户名称或账号已存在 | +| 500 | 500 | 服务器内部错误 | 系统异常或数据库错误 | + +### 异常处理流程 +```mermaid +flowchart TD +A[接收请求] --> B{参数验证} +B --> |失败| C[返回400错误] +B --> |通过| D{权限验证} +D --> |失败| E[返回401/403错误] +D --> |通过| F[执行业务逻辑] +F --> G{操作成功?} +G --> |是| H[返回成功响应] +G --> |否| I{错误类型} +I --> |商户不存在| J[返回404错误] +I --> |配置冲突| K[返回409错误] +I --> |其他错误| L[返回500错误] +style C fill:#F44336,stroke:#D32F2F,color:white +style E fill:#F44336,stroke:#D32F2F,color:white +style J fill:#F44336,stroke:#D32F2F,color:white +style K fill:#F44336,stroke:#D32F2F,color:white +style L fill:#F44336,stroke:#D32F2F,color:white +``` + +**图示来源** +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L10-L48) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go#L10-L53) + +### 具体错误场景 +#### 创建商户时的错误处理 +- **商户名称重复**: 返回409错误,提示"商户名称已存在" +- **登录账号重复**: 返回409错误,提示"登录账号已存在" +- **参数缺失**: 返回400错误,明确指出缺失的字段 +- **数据库异常**: 返回500错误,记录详细日志 + +#### 更新商户时的错误处理 +- **商户不存在**: 返回404错误,提示"指定商户不存在" +- **权限不足**: 返回403错误,提示"无权修改该商户配置" +- **状态冲突**: 返回409错误,当尝试对已删除商户进行更新 + +#### 状态管理时的错误处理 +- **状态切换失败**: 返回500错误,记录事务回滚原因 +- **关联账户异常**: 返回500错误,当商户钱包状态更新失败时 + +**Section sources** +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L10-L48) +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go#L10-L16) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go#L10-L53) + +## 使用示例 + +### 创建商户配置 +```json +POST /api/merchant/config/add +Content-Type: application/json + +{ + "status": "active", + "merchantName": "测试商户", + "loginAccount": "test_merchant", + "loginPassword": "password123", + "remark": "测试商户备注" +} +``` + +**成功响应**: +```json +{ + "code": 0, + "message": "OK", + "data": {} +} +``` + +### 查询商户配置列表 +```json +GET /api/merchant/config/getList?current=1&pageSize=10&merchantName=测试 +Authorization: Bearer {{token}} +``` + +**成功响应**: +```json +{ + "code": 0, + "message": "OK", + "data": { + "total": 1, + "list": [ + { + "status": "active", + "belongAgentUid": "", + "belongAgentName": "", + "merchantName": "测试商户", + "merchantUid": "8888a1b2c3d4e5f6", + "merchantKey": "kkkkx1y2z3w4v5u6", + "merchantSecret": "ssssm1n2o3p4q5r6", + "loginAccount": "test_merchant", + "autoSettle": "no", + "autoPayFor": "no", + "whiteIps": "", + "remark": "测试商户备注", + "singlePayForRoadUid": "", + "singlePayForRoadName": "", + "rollPayForRoadCode": "", + "rollPayForRoadName": "", + "payforFee": 0, + "updateTime": "2024-01-01T10:00:00+08:00", + "createTime": "2024-01-01T10:00:00+08:00" + } + ] + } +} +``` + +### 更新商户配置 +```json +POST /api/merchant/config/updateDetail +Content-Type: application/json +Authorization: Bearer {{token}} + +{ + "merchantName": "更新后的商户名称", + "merchantUid": "8888a1b2c3d4e5f6", + "loginAccount": "test_merchant", + "whiteIps": "192.168.1.1,192.168.1.2", + "remark": "更新后的备注信息" +} +``` + +### 获取商户详情 +```json +GET /api/merchant/config/getDetail?merchantUid=8888a1b2c3d4e5f6 +Authorization: Bearer {{token}} +``` + +**成功响应**: +```json +{ + "code": 0, + "message": "OK", + "data": { + "merchantName": "更新后的商户名称", + "merchantUid": "8888a1b2c3d4e5f6", + "loginAccount": "test_merchant", + "whiteIps": "192.168.1.1,192.168.1.2", + "remark": "更新后的备注信息" + } +} +``` + +### 切换商户状态 +```json +POST /api/merchant/config/switchStatus +Content-Type: application/json +Authorization: Bearer {{token}} + +{ + "merchantUid": "8888a1b2c3d4e5f6", + "status": "inactive" +} +``` + +**Section sources** +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L10-L48) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go#L10-L34) +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go#L10-L16) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go#L10-L53) +- [merchant_v1_merchant_config_detail.go](file://internal/controller/merchant/merchant_v1_merchant_config_detail.go#L10-L21) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/商户管理API/盗单处理管理.md b/.qoder/repowiki/zh/content/API端点参考/商户管理API/盗单处理管理.md new file mode 100644 index 00000000..6c678309 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/商户管理API/盗单处理管理.md @@ -0,0 +1,144 @@ +# 盗单处理管理 + + +**本文档中引用的文件** +- [steal.go](file://api/merchant/v1/steal.go) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go) +- [merchant_v1_steal_list.go](file://internal/controller/merchant/merchant_v1_steal_list.go) +- [merchant_v1_steal_update.go](file://internal/controller/merchant/merchant_v1_steal_update.go) +- [merchant_v1_steal_delete.go](file://internal/controller/merchant/merchant_v1_steal_delete.go) +- [merchant_v1_steal_status_get.go](file://internal/controller/merchant/merchant_v1_steal_status_get.go) +- [merchant_v1_steal_status_set.go](file://internal/controller/merchant/merchant_v1_steal_status_set.go) +- [merchant_v1_steal_stats.go](file://internal/controller/merchant/merchant_v1_steal_stats.go) +- [merchant_v1_steal_record_list.go](file://internal/controller/merchant/merchant_v1_steal_record_list.go) +- [steal_rule.go](file://internal/service/steal_rule.go) +- [steal_rule.go](file://internal/model/steal_rule.go) + + +## 目录 +1. [简介](#简介) +2. [核心组件](#核心组件) +3. [API端点说明](#api端点说明) +4. [数据结构与匹配逻辑](#数据结构与匹配逻辑) +5. [集成与执行时机](#集成与执行时机) +6. [权限控制机制](#权限控制机制) +7. [错误处理与监控建议](#错误处理与监控建议) +8. [使用示例](#使用示例) +9. [结论](#结论) + +## 简介 +本文档详细描述了盗单处理管理API的设计与实现,涵盖盗单规则的创建、查询、更新、删除、状态管理、统计和记录查询等核心功能。该系统旨在通过灵活的规则配置,自动识别并处理潜在的盗单行为,保障商户交易安全。API设计遵循RESTful规范,提供清晰的接口定义和统一的响应格式。 + +## 核心组件 + +本系统的核心组件包括API定义层、控制器层、服务层和数据模型层。API定义层(`steal.go`)负责声明所有端点的HTTP方法、路径和数据结构;控制器层(如`merchant_v1_steal_create.go`等)处理请求并调用服务层;服务层(`steal_rule.go`)封装业务逻辑;数据模型层(`steal_rule.go` in model)定义数据传输对象。 + +**核心组件来源** +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L1-L25) +- [steal_rule.go](file://internal/service/steal_rule.go#L1-L41) +- [steal_rule.go](file://internal/model/steal_rule.go#L1-L34) + +## API端点说明 + +以下表格详细列出了盗单处理管理的所有API端点。 + +| 端点名称 | HTTP方法 | URL路径 | 功能描述 | +| :--- | :--- | :--- | :--- | +| merchant_v1_steal_create | POST | /merchant/config/stealRule/create | 创建新的盗单规则 | +| merchant_v1_steal_list | GET | /merchant/config/stealRule/list | 查询盗单规则列表 | +| merchant_v1_steal_update | POST | /merchant/config/stealRule/update | 更新指定的盗单规则 | +| merchant_v1_steal_delete | DELETE | /merchant/config/stealRule/update | 删除指定的盗单规则 | +| merchant_v1_steal_status_get | GET | /merchant/config/stealRule/status | 获取全局盗单功能状态 | +| merchant_v1_steal_status_set | POST | /merchant/config/stealRule/status | 设置全局盗单功能状态 | +| merchant_v1_steal_stats | GET | /merchant/config/stealRule/stats | 获取盗单统计信息 | +| merchant_v1_steal_record_list | GET | /merchant/config/stealRule/record | 查询盗单处理记录 | + +**API端点来源** +- [steal.go](file://api/merchant/v1/steal.go#L1-L116) + +## 数据结构与匹配逻辑 + +### 盗单规则数据结构 +盗单规则的核心数据结构为`MerchantHiddenConfig`,包含以下关键字段: +- `name`: 规则名称 +- `merchantUid`: 关联的商户ID +- `roadUid`: 通道ID +- `amount`: 偷卡金额间隔 +- `faceAmount`: 偷卡面额 +- `delayDurationMin` / `delayDurationMax`: 处理延迟时间范围 +- `enable`: 启用状态 +- `strategy`: 处理策略 +- `amountRule`: 金额规则数组 + +### 匹配与处理逻辑 +系统通过比较订单金额与`amountRule`中的规则进行匹配。在`merchant_v1_steal_create.go`中,创建规则时会校验`amountRule`中的每个值是否不大于`faceAmount`,确保规则的合理性。匹配成功后,根据配置的策略和延迟时间执行相应的处理动作。 + +```mermaid +flowchart TD +Start([接收到订单]) --> CheckStatus["检查盗单功能全局状态"] +CheckStatus --> |关闭| End1([正常处理]) +CheckStatus --> |开启| MatchRule["匹配盗单规则"] +MatchRule --> RuleMatched{"规则匹配?"} +RuleMatched --> |否| End2([正常处理]) +RuleMatched --> |是| ApplyStrategy["应用处理策略"] +ApplyStrategy --> Delay["延迟 delayDurationMin-Max"] +Delay --> Execute["执行盗单处理"] +Execute --> Log["记录处理日志"] +Log --> End3([完成]) +``` + +**数据结构来源** +- [steal.go](file://api/merchant/v1/steal.go#L25-L45) +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L10-L15) + +## 集成与执行时机 + +盗单处理模块深度集成于订单处理流程中。当一个新订单进入系统后,订单处理服务会首先调用盗单规则服务进行匹配检查。此检查发生在订单验证和支付处理之前,作为风险控制的第一道防线。如果订单被识别为潜在盗单,则会根据配置的策略(如延迟处理、标记、拒绝等)进行相应操作,而不是立即执行正常的订单流程。 + +## 权限控制机制 + +系统通过基于角色的访问控制(RBAC)来确保只有授权用户可以修改盗单规则。所有对盗单规则的写操作(创建、更新、删除、状态设置)都需要经过身份验证和权限校验。控制器层通过中间件验证用户身份和权限,只有具备“盗单设置”标签(tags:"偷卡设置")权限的用户才能访问这些API端点。 + +## 错误处理与监控建议 + +### 错误处理 +系统在`merchant_v1_steal_create.go`中实现了基础的业务逻辑校验,例如检查偷卡金额是否超过面额。对于无效请求,服务会返回带有明确错误信息的响应。所有API调用都应进行异常捕获,确保不会因内部错误导致服务中断。 + +### 监控建议 +1. **日志监控**:记录所有盗单规则的变更和处理记录,便于审计和追溯。 +2. **统计分析**:定期使用`merchant_v1_steal_stats`端点分析盗单发生频率和金额,评估规则有效性。 +3. **告警机制**:当盗单处理量异常激增时,触发告警通知管理员。 +4. **性能监控**:监控盗单规则匹配的响应时间,避免影响正常订单处理速度。 + +**错误处理来源** +- [merchant_v1_steal_create.go](file://internal/controller/merchant/merchant_v1_steal_create.go#L10-L15) + +## 使用示例 + +### 创建盗单规则 +```http +POST /merchant/config/stealRule/create +Content-Type: application/json + +{ + "name": "高风险订单监控", + "merchantUid": "mch_123", + "roadUid": "road_456", + "amount": 100, + "faceAmount": 500, + "delayDurationMin": 300, + "delayDurationMax": 600, + "enable": 1, + "strategy": 1, + "amountRule": [101, 201, 301, 401] +} +``` + +### 查询盗单统计 +```http +GET /merchant/config/stealRule/stats?current=1&pageSize=10&dateRange[0]=2023-01-01&dateRange[1]=2023-12-31 +``` + +## 结论 +本文档全面介绍了盗单处理管理API的各个方面。该系统提供了一套完整的工具,使商户能够灵活地配置和管理盗单风险。通过精确的规则定义、严格的权限控制和详尽的监控能力,系统能够有效识别和处理潜在的盗单行为,保护商户利益。建议定期审查和更新盗单规则,以应对不断变化的风险模式。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/权限管理API/权限管理API.md b/.qoder/repowiki/zh/content/API端点参考/权限管理API/权限管理API.md new file mode 100644 index 00000000..14d0b06b --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/权限管理API/权限管理API.md @@ -0,0 +1,339 @@ +# 权限管理API + + +**本文档中引用的文件** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [tenant.go](file://api/authority/v1/tenant.go) +- [model.go](file://api/authority/v1/model.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_role.go](file://internal/model/sys_role.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) +- [sys_role_v1_role_list.go](file://internal/controller/sys_role/sys_role_v1_role_list.go) +- [sys_role_v1_role_delete.go](file://internal/controller/sys_role/sys_role_v1_role_delete.go) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go) + + +## 目录 +1. [介绍](#介绍) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 介绍 +本文档详细描述了权限管理API的实现,涵盖用户、角色和租户管理功能。重点介绍基于RBAC(基于角色的访问控制)模型的权限系统,包括菜单管理、角色管理、租户管理等核心接口。文档详细说明了各端点的HTTP方法、URL模式、请求/响应结构和认证机制,并解释了权限规则、角色继承和访问控制策略的实现细节。 + +## 项目结构 + +```mermaid +graph TD +subgraph "API 接口层" +A[api/authority/v1/menu.go] +B[api/authority/v1/role.go] +C[api/authority/v1/tenant.go] +D[api/sys_auth_rule/v1/sys_auth_rule.go] +E[api/sys_role/v1/sys_role.go] +end +subgraph "内部逻辑层" +F[internal/model/sys_role.go] +G[internal/model/sys_auth_rule.go] +H[internal/service/Menu.go] +end +subgraph "控制器层" +I[internal/controller/authority/authority_v1_menu_create.go] +J[internal/controller/authority/authority_v1_menu_list.go] +K[internal/controller/authority/authority_v1_menu_update.go] +L[internal/controller/sys_role/sys_role_v1_role_add.go] +M[internal/controller/sys_role/sys_role_v1_role_list.go] +N[internal/controller/sys_role/sys_role_v1_role_delete.go] +O[internal/controller/sys_role/sys_role_v1_role_edit.go] +end +subgraph "权限模型" +P[resource/casbin/rbac_model.conf] +end +A --> I +B --> L +B --> M +B --> N +B --> O +D --> G +E --> F +I --> H +J --> H +K --> H +P --> H +``` + +**图示来源** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) +- [sys_role_v1_role_list.go](file://internal/controller/sys_role/sys_role_v1_role_list.go) +- [sys_role_v1_role_delete.go](file://internal/controller/sys_role/sys_role_v1_role_delete.go) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +**节来源** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [tenant.go](file://api/authority/v1/tenant.go) +- [model.go](file://api/authority/v1/model.go) + +## 核心组件 + +权限管理API的核心组件包括菜单管理、角色管理和租户管理。菜单管理负责系统功能菜单的增删改查,角色管理实现角色的创建、编辑、删除和查询,租户管理支持多租户环境下的权限隔离。这些组件共同构成了基于RBAC模型的权限控制系统。 + +**节来源** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [tenant.go](file://api/authority/v1/tenant.go) + +## 架构概述 + +```mermaid +graph TD +Client[客户端] --> API[权限管理API] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Model[模型层] +Service --> Casbin[权限引擎] +Model --> Database[(数据库)] +subgraph "权限引擎" +Casbin --> rbac_model[rbac_model.conf] +end +subgraph "模型层" +Model --> SysAuthRule[SysAuthRule] +Model --> SysRole[SysRole] +end +subgraph "控制器层" +Controller --> MenuController[MenuController] +Controller --> RoleController[RoleController] +end +``` + +**图示来源** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) + +## 详细组件分析 + +### 菜单管理分析 + +菜单管理组件负责系统功能菜单的维护,支持菜单的创建、查询、更新和删除操作。通过树形结构组织菜单项,支持多级嵌套。 + +#### 菜单创建流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "MenuController" +participant Service as "MenuService" +participant Model as "SysAuthRule" +Client->>Controller : POST /auth/menu/create +Controller->>Model : 创建SysAuthRuleInput +Controller->>Service : 调用AddMenu +Service->>Service : 验证菜单数据 +Service->>Model : 保存菜单信息 +Model-->>Service : 返回结果 +Service-->>Controller : 返回操作结果 +Controller-->>Client : 返回响应 +``` + +**图示来源** +- [menu.go](file://api/authority/v1/menu.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) + +#### 菜单查询流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "MenuController" +participant Service as "MenuService" +participant Model as "SysAuthRule" +Client->>Controller : GET /auth/menu/getList +Controller->>Service : 调用GetMenuTree +Service->>Model : 查询菜单数据 +Model-->>Service : 返回菜单列表 +Service-->>Controller : 构建树形结构 +Controller-->>Client : 返回菜单树 +``` + +**图示来源** +- [menu.go](file://api/authority/v1/menu.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) + +### 角色管理分析 + +角色管理组件提供角色的全生命周期管理功能,包括角色的创建、查询、更新和删除。 + +#### 角色创建流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "RoleController" +participant Service as "RoleService" +participant Model as "SysRole" +Client->>Controller : POST /auth/role/create +Controller->>Model : 创建RoleAddInput +Controller->>Service : 调用AddRole +Service->>Service : 验证角色数据 +Service->>Model : 保存角色信息 +Model-->>Service : 返回结果 +Service-->>Controller : 返回操作结果 +Controller-->>Client : 返回响应 +``` + +**图示来源** +- [role.go](file://api/authority/v1/role.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) + +#### 角色查询流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "RoleController" +participant Service as "RoleService" +participant Model as "SysRole" +Client->>Controller : GET /auth/role/getList +Controller->>Service : 调用GetRoleListSearch +Service->>Model : 查询角色数据 +Model-->>Service : 返回角色列表 +Service-->>Controller : 处理分页数据 +Controller-->>Client : 返回角色列表 +``` + +**图示来源** +- [role.go](file://api/authority/v1/role.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [sys_role_v1_role_list.go](file://internal/controller/sys_role/sys_role_v1_role_list.go) + +### RBAC权限模型分析 + +RBAC(基于角色的访问控制)模型是本系统权限控制的核心,通过Casbin权限引擎实现。 + +```mermaid +classDiagram +class SysAuthRule { ++int Id ++string Name ++string Path ++string Component ++int ParentId ++int Sort ++string Icon ++bool Hidden ++Children []*SysAuthRule +} +class SysRole { ++int Id ++string Name ++string Code ++string Remark ++int Status ++int Sort +} +class CasbinRule { ++string PType ++string V0 ++string V1 ++string V2 +} +class rbac_model.conf { ++[request_definition] ++[policy_definition] ++[role_definition] ++[policy_effect] ++[matchers] +} +SysRole "1" -- "0..*" SysAuthRule : 拥有 +CasbinRule --> SysRole : 关联 +CasbinRule --> SysAuthRule : 关联 +rbac_model.conf --> CasbinRule : 定义规则 +``` + +**图示来源** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +## 依赖分析 + +```mermaid +graph TD +A[menu.go] --> B[authority_v1_menu_create.go] +A --> C[authority_v1_menu_list.go] +A --> D[authority_v1_menu_update.go] +E[role.go] --> F[sys_role_v1_role_add.go] +E --> G[sys_role_v1_role_list.go] +E --> H[sys_role_v1_role_delete.go] +E --> I[sys_role_v1_role_edit.go] +B --> J[SysAuthRuleInput] +C --> K[SysAuthRule] +D --> L[SysAuthRuleWithIDInput] +F --> M[RoleAddInput] +G --> N[RoleListInput] +H --> O[RoleDeleteReq] +I --> P[RoleEditInput] +J --> Q[sys_auth_rule.go] +M --> R[sys_role.go] +N --> R +O --> R +P --> R +``` + +**图示来源** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) +- [sys_role_v1_role_list.go](file://internal/controller/sys_role/sys_role_v1_role_list.go) +- [sys_role_v1_role_delete.go](file://internal/controller/sys_role/sys_role_v1_role_delete.go) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go) + +**节来源** +- [menu.go](file://api/authority/v1/menu.go) +- [role.go](file://api/authority/v1/role.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) + +## 性能考虑 +权限管理API在设计时考虑了性能优化,通过缓存机制减少数据库查询,使用分页查询避免大数据量传输,并在权限验证时采用高效的匹配算法。建议在生产环境中配置适当的缓存策略,以提高系统响应速度。 + +## 故障排除指南 +当遇到权限管理API相关问题时,首先检查请求的认证信息是否正确,然后验证请求参数是否符合API规范。对于菜单和角色操作失败的情况,检查相关数据是否存在以及权限是否足够。系统提供了详细的错误码和错误信息,可根据这些信息进行问题定位。 + +**节来源** +- [errHandler/handler.go](file://internal/dao/errHandler/handler.go) +- [middleware/auth.go](file://internal/middleware/auth.go) + +## 结论 +权限管理API提供了一套完整的RBAC权限控制系统,支持菜单、角色和租户的全生命周期管理。通过清晰的接口设计和模块化架构,系统具有良好的可维护性和扩展性。建议在使用时遵循最佳实践,合理规划权限结构,确保系统的安全性和稳定性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/权限管理API/租户管理API.md b/.qoder/repowiki/zh/content/API端点参考/权限管理API/租户管理API.md new file mode 100644 index 00000000..c5c58f38 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/权限管理API/租户管理API.md @@ -0,0 +1,259 @@ +# 租户管理API + + +**本文档中引用的文件** +- [tenant.go](file://api/authority/v1/tenant.go) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) +- [authority_v1_tenant_update.go](file://internal/controller/authority/authority_v1_tenant_update.go) +- [authority_v1_tenant_delete.go](file://internal/controller/authority/authority_v1_tenant_delete.go) +- [authority_v1_tenant_list.go](file://internal/controller/authority/authority_v1_tenant_list.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [v_1_sys_user.go](file://internal/model/entity/v_1_sys_user.go) +- [auth.go](file://internal/middleware/auth.go) + + +## 目录 +1. [介绍](#介绍) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 介绍 +本文档详细描述了租户管理API的设计与实现,涵盖租户的增删改查操作。系统采用多租户架构,通过统一的权限控制机制实现不同客户或组织之间的资源隔离。API设计遵循RESTful原则,使用标准HTTP方法进行资源操作,并通过统一的认证机制确保安全性。尽管当前实现中各操作仍返回"未实现"状态,但接口定义和架构设计已完整,为后续功能开发提供了清晰的蓝图。 + +## 项目结构 +系统采用分层架构设计,将API定义、业务逻辑和数据访问分离。租户管理功能主要分布在API层和控制器层,通过清晰的包结构组织相关功能。 + +```mermaid +graph TD +subgraph "API层" +A[api/authority/v1] +A --> B[tenant.go] +A --> C[role.go] +A --> D[menu.go] +end +subgraph "控制器层" +E[internal/controller/authority] +E --> F[authority_v1_tenant_create.go] +E --> G[authority_v1_tenant_update.go] +E --> H[authority_v1_tenant_delete.go] +E --> I[authority_v1_tenant_list.go] +end +subgraph "模型层" +J[internal/model] +J --> K[sys_user.go] +J --> L[entity/v_1_sys_user.go] +end +subgraph "中间件层" +M[internal/middleware] +M --> N[auth.go] +end +B --> F +B --> G +B --> H +B --> I +K --> E +N --> E +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [auth.go](file://internal/middleware/auth.go) + +**本节来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) + +## 核心组件 +租户管理API的核心组件包括请求/响应结构体、控制器方法和认证中间件。这些组件共同构成了租户管理功能的基础框架。 + +**本节来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [sys_user.go](file://internal/model/sys_user.go) + +## 架构概述 +系统采用典型的MVC架构模式,各层职责分明。API层定义接口契约,控制器层处理业务逻辑,模型层管理数据结构,中间件层负责横切关注点如认证授权。 + +```mermaid +graph TD +Client[客户端] --> API[API接口] +API --> Auth[认证中间件] +Auth --> Controller[控制器] +Controller --> Service[服务层] +Service --> DAO[数据访问对象] +DAO --> DB[(数据库)] +API -.->|TenantListReq| Controller +API -.->|TenantCreateReq| Controller +API -.->|TenantUpdateReq| Controller +API -.->|TenantDeleteReq| Controller +style API fill:#f9f,stroke:#333 +style Auth fill:#ff9,stroke:#333 +style Controller fill:#9ff,stroke:#333 +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [auth.go](file://internal/middleware/auth.go) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) + +## 详细组件分析 +### 租户管理操作分析 +租户管理API提供了完整的CRUD操作接口,每个操作都有明确的HTTP方法、URL路径和参数结构。 + +#### 租户创建操作 +```mermaid +classDiagram +class TenantCreateReq { ++string path : /auth/tenant/create ++string method : post ++string tags : 用户信息 ++string summary : 创建用户信息 +} +class TenantCreateRes { ++string json : application/json +} +class ControllerV1 { ++TenantCreate(ctx, req) (res, err) +} +TenantCreateReq --> ControllerV1 : "作为参数" +ControllerV1 --> TenantCreateRes : "返回结果" +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go#L17-L19) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) + +#### 租户更新操作 +```mermaid +classDiagram +class TenantUpdateReq { ++string path : /auth/tenant/update ++string method : post ++string tags : 用户信息 ++string summary : 修改用户信息 ++CommonIntId +} +class TenantUpdateRes { ++string json : application/json +} +class ControllerV1 { ++TenantUpdate(ctx, req) (res, err) +} +TenantUpdateReq --> ControllerV1 : "作为参数" +ControllerV1 --> TenantUpdateRes : "返回结果" +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go#L25-L28) +- [authority_v1_tenant_update.go](file://internal/controller/authority/authority_v1_tenant_update.go) + +#### 租户删除操作 +```mermaid +classDiagram +class TenantDeleteReq { ++string path : /auth/tenant/delete ++string method : delete ++string tags : 用户信息 ++string summary : 删除用户信息 ++CommonIntId +} +class TenantDeleteRes { ++string json : application/json +} +class ControllerV1 { ++TenantDelete(ctx, req) (res, err) +} +TenantDeleteReq --> ControllerV1 : "作为参数" +ControllerV1 --> TenantDeleteRes : "返回结果" +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go#L34-L37) +- [authority_v1_tenant_delete.go](file://internal/controller/authority/authority_v1_tenant_delete.go) + +#### 租户查询操作 +```mermaid +classDiagram +class TenantListReq { ++string path : /auth/tenant/getList ++string method : get ++string tags : 用户信息 ++string summary : 获取用户信息 ++CommonPageReq +} +class TenantListRes { ++string json : application/json +} +class ControllerV1 { ++TenantList(ctx, req) (res, err) +} +TenantListReq --> ControllerV1 : "作为参数" +ControllerV1 --> TenantListRes : "返回结果" +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go#L8-L11) +- [authority_v1_tenant_list.go](file://internal/controller/authority/authority_v1_tenant_list.go) + +**本节来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) +- [authority_v1_tenant_update.go](file://internal/controller/authority/authority_v1_tenant_update.go) +- [authority_v1_tenant_delete.go](file://internal/controller/authority/authority_v1_tenant_delete.go) +- [authority_v1_tenant_list.go](file://internal/controller/authority/authority_v1_tenant_list.go) + +## 依赖分析 +租户管理功能依赖于多个核心组件,包括认证中间件、用户模型和基础服务接口。 + +```mermaid +graph TD +A[TenantCreateReq] --> B[ControllerV1.TenantCreate] +C[TenantUpdateReq] --> D[ControllerV1.TenantUpdate] +E[TenantDeleteReq] --> F[ControllerV1.TenantDelete] +G[TenantListReq] --> H[ControllerV1.TenantList] +B --> I[认证中间件] +D --> I +F --> I +H --> I +B --> J[ISysUser.Add] +D --> K[ISysUser.Edit] +F --> L[ISysUser.Delete] +H --> M[ISysUser.List] +I --> N[Token验证] +I --> O[白名单检查] +style A fill:#f96,stroke:#333 +style C fill:#f96,stroke:#333 +style E fill:#f96,stroke:#333 +style G fill:#f96,stroke:#333 +``` + +**图示来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [auth.go](file://internal/middleware/auth.go) +- [sys_user.go](file://internal/model/sys_user.go) + +**本节来源** +- [tenant.go](file://api/authority/v1/tenant.go) +- [auth.go](file://internal/middleware/auth.go) +- [sys_user.go](file://internal/model/sys_user.go) + +## 性能考虑 +虽然当前实现尚未完成,但架构设计已考虑性能优化因素。API层与控制器层的分离有助于缓存策略的实施,而统一的认证中间件可以集中管理会话状态。分页查询接口的设计也考虑了大数据量场景下的性能表现。建议在完整实现时采用连接池、查询缓存和异步处理等技术进一步提升系统性能。 + +## 故障排除指南 +当前租户管理API的所有操作均返回"未实现"错误,这是预期行为,表明功能尚未完成开发。系统提供了统一的错误处理机制,所有错误都通过gerror.NewCode包装并返回标准错误码。认证相关的错误会记录详细日志,便于排查问题。白名单机制确保了关键接口的可访问性,即使在认证系统出现问题时也能保证核心业务的正常运行。 + +**本节来源** +- [authority_v1_tenant_create.go](file://internal/controller/authority/authority_v1_tenant_create.go) +- [auth.go](file://internal/middleware/auth.go) +- [errHandler](file://internal/errHandler) + +## 结论 +租户管理API的架构设计完整且合理,为多租户系统的实现奠定了良好基础。接口定义清晰,层次结构分明,具备良好的可扩展性和可维护性。下一步开发应聚焦于实现控制器中的业务逻辑,完善数据访问层,并建立完整的测试体系。同时建议补充API文档和使用示例,以便于其他开发人员快速理解和使用该功能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/权限管理API/菜单管理API.md b/.qoder/repowiki/zh/content/API端点参考/权限管理API/菜单管理API.md new file mode 100644 index 00000000..5b84ba37 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/权限管理API/菜单管理API.md @@ -0,0 +1,345 @@ +# 菜单管理API + + +**本文档中引用的文件** +- [menu.go](file://api/authority/v1/menu.go) +- [model.go](file://api/authority/v1/model.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) +- [authority_v1_menu_delete.go](file://internal/controller/authority/authority_v1_menu_delete.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [common.go](file://api/commonApi/common.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了菜单管理API的设计与实现,涵盖菜单的增删改查操作。该API基于RBAC(基于角色的访问控制)模型,通过菜单权限控制用户界面访问权限。文档详细说明了创建菜单、更新菜单、删除菜单和获取菜单列表等端点的HTTP方法、URL模式、请求/响应模式和认证机制,并提供实际使用示例。同时,文档还解释了菜单权限在RBAC模型中的作用,以及错误处理策略、安全考虑和性能优化建议。 + +## 项目结构 +菜单管理API的实现分布在多个目录中,主要涉及API定义、控制器逻辑和数据模型。API端点定义位于`api/authority/v1/`目录下,控制器实现位于`internal/controller/authority/`目录中,数据模型定义在`internal/model/`和`internal/model/entity/`目录中。服务层接口在`internal/service/`目录中声明,而RBAC权限模型配置位于`resource/casbin/`目录下。 + +```mermaid +graph TB +subgraph "API层" +A[menu.go] +B[model.go] +end +subgraph "控制器层" +C[authority_v1_menu_list.go] +D[authority_v1_menu_create.go] +E[authority_v1_menu_update.go] +F[authority_v1_menu_delete.go] +end +subgraph "服务层" +G[sys_auth_rule.go] +end +subgraph "数据模型层" +H[sys_auth_rule.go] +I[v_1_sys_auth_rule.go] +end +subgraph "公共组件" +J[common.go] +end +subgraph "权限配置" +K[rbac_model.conf] +end +A --> C +B --> C +C --> G +G --> H +H --> I +J --> A +K --> G +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go) +- [model.go](file://api/authority/v1/model.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) +- [common.go](file://api/commonApi/common.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go) +- [model.go](file://api/authority/v1/model.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) + +## 核心组件 + +菜单管理API的核心组件包括菜单的增删改查操作,这些操作通过RESTful端点暴露。API使用GoFrame框架构建,通过结构体标签定义HTTP路由、方法和请求参数。菜单数据模型支持树形结构,允许创建多级菜单体系。权限控制基于Casbin实现的RBAC模型,确保只有授权用户才能执行相应操作。 + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go) +- [model.go](file://api/authority/v1/model.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) + +## 架构概述 + +菜单管理API采用分层架构设计,包括API层、控制器层、服务层和数据访问层。API层定义了HTTP端点和数据传输对象(DTO),控制器层处理请求并调用服务层,服务层包含业务逻辑并协调数据访问,数据访问层负责与数据库交互。整个系统通过RBAC模型进行权限控制,确保操作的安全性。 + +```mermaid +graph TD +Client[客户端] --> API[API层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> DB[(数据库)] +Service --> Casbin[RBAC权限控制] +Casbin --> rbac_model[rbac_model.conf] +style Client fill:#f9f,stroke:#333 +style DB fill:#ccf,stroke:#333 +style rbac_model fill:#cfc,stroke:#333 +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +## 详细组件分析 + +### 菜单创建分析 +菜单创建功能允许系统管理员创建新的菜单项。该功能通过POST请求实现,请求体包含菜单的详细信息,如名称、标题、类型、路径等。系统验证输入数据的完整性后,将其持久化到数据库中。 + +#### API端点定义 +```mermaid +classDiagram +class MenuCreateReq { ++string path "/auth/menu/create" ++string method "post" ++string summary "创建菜单信息" ++SysAuthRuleReq SysAuthRuleReq +} +class SysAuthRuleReq { ++string name "规则名称" ++string title "规则名称" ++uint PID "父ID" ++uint MenuType "类型 0目录 1菜单 2按钮" ++int Weigh "权重" ++uint IsHide "显示状态" ++string Path "路由地址" ++int IsAdmin "是否管理员独享 1是2.否" ++string Component "组件路径" +} +MenuCreateReq --> SysAuthRuleReq : "包含" +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go#L15-L22) +- [model.go](file://api/authority/v1/model.go#L14-L35) + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go#L15-L22) +- [model.go](file://api/authority/v1/model.go#L14-L35) +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) + +### 菜单更新分析 +菜单更新功能允许修改现有菜单项的属性。该功能通过POST请求实现,需要提供菜单的ID和要更新的字段。系统会验证用户权限,确保只有授权用户才能修改菜单。 + +#### API端点定义 +```mermaid +classDiagram +class MenuUpdateReq { ++string path "/auth/menu/update" ++string method "post" ++string summary "修改菜单信息" ++SysAuthRuleWithID SysAuthRuleWithID +} +class SysAuthRuleWithID { ++SysAuthRuleReq SysAuthRuleReq ++uint ID "ID" +} +class SysAuthRuleReq { ++string name "规则名称" ++string title "规则名称" ++uint PID "父ID" ++uint MenuType "类型 0目录 1菜单 2按钮" ++int Weigh "权重" ++uint IsHide "显示状态" ++string Path "路由地址" ++int IsAdmin "是否管理员独享 1是2.否" ++string Component "组件路径" +} +MenuUpdateReq --> SysAuthRuleWithID : "包含" +SysAuthRuleWithID --> SysAuthRuleReq : "继承" +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go#L24-L31) +- [model.go](file://api/authority/v1/model.go#L29-L35) + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go#L24-L31) +- [model.go](file://api/authority/v1/model.go#L29-L35) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) + +### 菜单删除分析 +菜单删除功能允许移除不再需要的菜单项。该功能通过DELETE请求实现,需要提供要删除的菜单ID。系统会检查菜单是否存在子菜单,如果有则一并删除。 + +#### API端点定义 +```mermaid +classDiagram +class MenuDeleteReq { ++string path "/auth/menu/delete" ++string method "delete" ++string summary "删除菜单信息" ++uint ID "ID" +} +class CommonIntId { ++uint ID "ID" +} +MenuDeleteReq --> CommonIntId : "继承" +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go#L33-L39) +- [common.go](file://api/commonApi/common.go#L6-L8) + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go#L33-L39) +- [common.go](file://api/commonApi/common.go#L6-L8) +- [authority_v1_menu_delete.go](file://internal/controller/authority/authority_v1_menu_delete.go) + +### 菜单列表获取分析 +菜单列表获取功能返回系统中所有菜单的树形结构。该功能通过GET请求实现,无需请求体,返回包含所有菜单及其层级关系的数据。 + +#### API端点定义 +```mermaid +classDiagram +class MenuListReq { ++string path "/auth/menu/getList" ++string method "get" ++string summary "获取菜单信息" +} +class MenuListRes { ++CommonDataRes[*SysAuthRule] List +} +class SysAuthRule { ++uint ID ++string name ++string title ++uint MenuType ++int Weigh ++uint IsHide ++string Path ++int IdAdmin ++string Component ++*SysAuthRule[] Children +} +MenuListRes --> SysAuthRule : "包含" +SysAuthRule --> SysAuthRule : "children" +``` + +**Diagram sources** +- [menu.go](file://api/authority/v1/menu.go#L3-L13) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L3-L10) + +**Section sources** +- [menu.go](file://api/authority/v1/menu.go#L3-L13) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L3-L10) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) + +### RBAC权限模型分析 +RBAC(基于角色的访问控制)模型定义了用户、角色和权限之间的关系。菜单权限作为系统权限的一部分,通过Casbin引擎进行管理。该模型确保用户只能访问其角色所允许的菜单项。 + +#### 权限模型配置 +```mermaid +graph TD +subgraph "RBAC模型" +Request[请求定义 r = sub, obj, act] +Policy[策略定义 p = sub, obj, act] +Role[角色定义 g = _, _] +Effect[策略效果 e = some(where (p.eft == allow))] +Matcher[匹配器 m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act] +end +Request --> Matcher +Policy --> Matcher +Role --> Matcher +Effect --> Matcher +style Request fill:#f96,stroke:#333 +style Policy fill:#f96,stroke:#333 +style Role fill:#f96,stroke:#333 +style Effect fill:#f96,stroke:#333 +style Matcher fill:#6f9,stroke:#333 +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +## 依赖分析 + +菜单管理API的组件之间存在明确的依赖关系。API层依赖于公共组件和数据模型,控制器层依赖于API定义和服务层,服务层依赖于数据模型和实体定义。整个系统通过RBAC模型进行权限控制,确保操作的安全性。 + +```mermaid +graph LR +commonApi[commonApi] --> api[api/authority/v1] +model[internal/model] --> api +api --> controller[internal/controller/authority] +controller --> service[internal/service] +service --> entity[internal/model/entity] +service --> casbin[resource/casbin] +style commonApi fill:#cfc,stroke:#333 +style model fill:#cfc,stroke:#333 +style api fill:#cf9,stroke:#333 +style controller fill:#9cf,stroke:#333 +style service fill:#9cf,stroke:#333 +style entity fill:#cfc,stroke:#333 +style casbin fill:#cfc,stroke:#333 +``` + +**Diagram sources** +- [common.go](file://api/commonApi/common.go) +- [model.go](file://api/authority/v1/model.go) +- [menu.go](file://api/authority/v1/menu.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +**Section sources** +- [common.go](file://api/commonApi/common.go) +- [model.go](file://api/authority/v1/model.go) +- [menu.go](file://api/authority/v1/menu.go) +- [authority_v1_menu_list.go](file://internal/controller/authority/authority_v1_menu_list.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +## 性能考虑 + +菜单管理API的性能主要受数据库查询和树形结构构建的影响。获取菜单列表时,系统需要从数据库加载所有菜单数据并构建树形结构,这可能成为性能瓶颈。建议对菜单数据进行适当的缓存,以减少数据库查询次数。同时,对于大型菜单体系,可以考虑实现分页或懒加载机制。 + +## 故障排除指南 + +当菜单管理API出现问题时,应首先检查请求参数是否正确,特别是ID字段是否有效。对于创建和更新操作,确保所有必填字段都已提供。如果遇到权限错误,检查用户角色是否具有执行相应操作的权限。在删除菜单时,如果系统返回错误,可能是由于外键约束或其他业务规则限制。 + +**Section sources** +- [authority_v1_menu_create.go](file://internal/controller/authority/authority_v1_menu_create.go) +- [authority_v1_menu_update.go](file://internal/controller/authority/authority_v1_menu_update.go) +- [authority_v1_menu_delete.go](file://internal/controller/authority/authority_v1_menu_delete.go) + +## 结论 + +菜单管理API提供了一套完整的菜单增删改查功能,通过清晰的RESTful端点设计和严格的RBAC权限控制,确保了系统的安全性和可用性。API的设计考虑了可扩展性和性能,为前端界面提供了灵活的菜单配置能力。通过遵循本文档中的指导,开发者可以有效地使用和维护这套API系统。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/权限管理API/角色管理API.md b/.qoder/repowiki/zh/content/API端点参考/权限管理API/角色管理API.md new file mode 100644 index 00000000..34f0285a --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/权限管理API/角色管理API.md @@ -0,0 +1,257 @@ +# 角色管理API + + +**本文档中引用的文件** +- [model.go](file://api/sys_role/v1/model.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go) +- [sys_role_v1_role_delete.go](file://internal/controller/sys_role/sys_role_v1_role_delete.go) +- [sys_role_v1_role_list.go](file://internal/controller/sys_role/sys_role_v1_role_list.go) +- [sys_role_v1_role_get.go](file://internal/controller/sys_role/sys_role_v1_role_get.go) +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go) +- [sys_role.go](file://internal/service/sys_role.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了角色管理API的设计与实现,涵盖角色的增删改查操作。重点说明了角色在RBAC权限控制模型中的核心作用,以及如何通过角色实现细粒度的访问控制。文档详细阐述了创建角色、更新角色、删除角色和获取角色列表等端点的HTTP方法、URL模式、请求/响应模式和认证机制,并提供实际使用示例。 + +## 项目结构 +角色管理功能主要分布在API层和内部服务层,采用分层架构设计。API定义位于`api/sys_role/v1/`目录下,控制器实现位于`internal/controller/sys_role/`目录,服务接口定义在`internal/service/sys_role.go`,实体模型定义在`internal/model/entity/v_1_sys_role.go`。 + +```mermaid +graph TD +A[API层] --> B[Controller层] +B --> C[Service层] +C --> D[DAO层] +D --> E[数据库] +subgraph "API定义" +A1[sys_role.go] +A2[model.go] +end +subgraph "控制器" +B1[sys_role_v1_role_add.go] +B2[sys_role_v1_role_edit.go] +B3[sys_role_v1_role_delete.go] +B4[sys_role_v1_role_list.go] +B5[sys_role_v1_role_get.go] +end +subgraph "服务层" +C1[sys_role.go] +end +subgraph "数据模型" +D1[v_1_sys_role.go] +end +``` + +**Diagram sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L1-L70) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) +- [sys_role.go](file://internal/service/sys_role.go#L1-L48) +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go#L1-L22) + +**Section sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L1-L70) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) + +## 核心组件 +角色管理API的核心组件包括角色实体模型、API请求/响应结构、控制器实现和服务接口。系统基于RBAC(基于角色的访问控制)模型,通过角色与权限规则的关联实现细粒度的访问控制。每个角色包含名称、状态、排序、备注等基本信息,并通过菜单ID列表与具体权限关联。 + +**Section sources** +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go#L1-L22) +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) + +## 架构概述 +系统采用典型的分层架构,从上至下分为API层、控制器层、服务层和数据访问层。API层定义了HTTP端点的路由、方法和参数结构;控制器层处理请求验证和转发;服务层包含核心业务逻辑;DAO层负责与数据库交互。权限控制基于Casbin实现,配置文件位于`resource/casbin/rbac_model.conf`。 + +```mermaid +graph TB +subgraph "表现层" +A[HTTP API] +end +subgraph "应用层" +B[Controller] +end +subgraph "业务逻辑层" +C[Service] +end +subgraph "数据访问层" +D[DAO] +E[Casbin] +end +subgraph "数据层" +F[MySQL] +end +A --> B --> C --> D --> F +C --> E +``` + +**Diagram sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L1-L70) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 详细组件分析 + +### 角色管理端点分析 +角色管理API提供了完整的CRUD操作,包括创建、读取、更新和删除角色。所有端点均通过统一的认证机制保护,确保只有授权用户才能执行相应操作。 + +#### API端点定义 +```mermaid +flowchart TD +A[角色列表] --> |GET /role/list| B[分页查询角色] +C[获取角色参数] --> |GET /role/getParams| D[获取编辑参数] +E[添加角色] --> |POST /role/add| F[创建新角色] +G[获取角色信息] --> |GET /role/get| H[查询单个角色] +I[修改角色] --> |PUT /role/edit| J[更新角色信息] +K[删除角色] --> |DELETE /role/delete| L[批量删除角色] +``` + +**Diagram sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L10-L70) + +#### 请求/响应模型 +```mermaid +classDiagram +class RoleListReq { ++string RoleName ++string Status ++CommonPageReq +} +class RoleListRes { ++CommonPageRes[*V1SysRole] +} +class RoleAddReq { ++string Name ++uint Status ++uint ListOrder ++string Remark ++[]uint MenuIds +} +class RoleAddRes { +} +class RoleEditReq { ++int64 Id ++string Name ++uint Status ++uint ListOrder ++string Remark ++[]uint MenuIds +} +class RoleEditRes { +} +class RoleDeleteReq { ++[]int64 Ids +} +class RoleDeleteRes { +} +class V1SysRole { ++uint Id ++uint Status ++uint ListOrder ++string Name ++string Remark ++uint DataScope ++*gtime.Time CreatedAt ++*gtime.Time UpdatedAt +} +RoleListReq --> RoleListRes : "响应" +RoleAddReq --> RoleAddRes : "响应" +RoleEditReq --> RoleEditRes : "响应" +RoleDeleteReq --> RoleDeleteRes : "响应" +RoleListRes --> V1SysRole : "包含" +``` + +**Diagram sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L10-L70) +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go#L11-L20) + +### RBAC权限模型分析 +系统采用标准的RBAC(基于角色的访问控制)模型,通过Casbin实现权限控制。角色与权限规则通过多对多关系关联,实现灵活的权限分配。 + +```mermaid +erDiagram +ROLE ||--o{ ROLE_MENU : "拥有" +ROLE { +uint id PK +string name +uint status +uint list_order +string remark +uint data_scope +datetime created_at +datetime updated_at +} +MENU ||--o{ ROLE_MENU : "被分配给" +MENU { +uint id PK +string name +string path +string component +uint status +} +ROLE_MENU { +uint role_id FK +uint menu_id FK +} +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go#L11-L20) + +**Section sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go#L1-L70) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 依赖分析 +角色管理功能依赖于多个核心组件,包括认证中间件、Casbin权限引擎、数据库访问层和通用工具库。服务层通过接口定义与具体实现解耦,便于测试和维护。 + +```mermaid +graph TD +A[角色管理API] --> B[认证中间件] +A --> C[Casbin权限引擎] +A --> D[MySQL数据库] +A --> E[分页工具] +A --> F[参数验证] +A --> G[错误处理] +B --> H[JWT令牌] +C --> I[rbac_model.conf] +D --> J[DAO层] +F --> K[GoFrame验证器] +G --> L[统一错误码] +``` + +**Diagram sources** +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +**Section sources** +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 性能考虑 +角色管理API在设计时考虑了性能优化,包括数据库索引优化、查询结果缓存和批量操作支持。建议在高并发场景下对角色列表接口启用Redis缓存,减少数据库压力。对于批量删除操作,采用事务处理确保数据一致性。 + +## 故障排除指南 +常见问题包括权限不足、参数验证失败和数据库连接错误。系统采用统一的错误处理机制,返回标准化的错误码和消息。开发人员应检查请求头中的认证令牌、请求参数的格式和必填字段,以及服务日志中的详细错误信息。 + +**Section sources** +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go#L1-L15) + +## 结论 +角色管理API提供了完整的角色生命周期管理功能,基于RBAC模型实现了灵活的权限控制。系统架构清晰,分层合理,便于维护和扩展。通过标准化的API设计和统一的错误处理,确保了接口的易用性和可靠性。建议在生产环境中启用适当的缓存策略和监控告警,以保障系统的稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/渠道管理API.md b/.qoder/repowiki/zh/content/API端点参考/渠道管理API.md new file mode 100644 index 00000000..766743ed --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/渠道管理API.md @@ -0,0 +1,259 @@ +# 渠道管理API + + +**本文档引用文件** +- [entrance.go](file://api/channel/v2/entrance.go) +- [model.go](file://api/channel/v2/model.go) +- [channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go) +- [channel_v2_entrance_update.go](file://internal/controller/channel/channel_v2_entrance_update.go) +- [channel_v2_entrance_delete.go](file://internal/controller/channel/channel_v2_entrance_delete.go) +- [channel_v2_entrance_list.go](file://internal/controller/channel/channel_v2_entrance_list.go) +- [entrance.go](file://internal/systemV2/logic/channel/entrance.go) +- [entrance.go](file://internal/model/entrance.go) +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了渠道管理API的功能,涵盖入口管理和渠道配置等核心功能。文档全面说明了各个端点的HTTP方法、URL模式、请求/响应模式和认证机制。重点包括入口创建、更新、删除和查询等接口,提供实际使用示例、错误处理策略和安全考虑。同时解释了渠道管理的实现细节,包括渠道路由、流量分配和性能监控机制,并提供客户端实现指南和性能优化建议。 + +## 项目结构 +渠道管理API的实现分布在多个目录中,主要功能集中在`api/channel/v2`和`internal/controller/channel`目录下。API定义文件负责声明端点和数据结构,而控制器文件则处理具体的业务逻辑。 + +```mermaid +graph TD +subgraph "API层" +A[entrance.go] +B[model.go] +end +subgraph "控制器层" +C[channel_v2_entrance_create.go] +D[channel_v2_entrance_update.go] +E[channel_v2_entrance_delete.go] +F[channel_v2_entrance_list.go] +end +subgraph "业务逻辑层" +G[entrance.go] +end +A --> C +A --> D +A --> E +A --> F +B --> C +B --> D +B --> E +B --> F +C --> G +D --> G +E --> G +F --> G +``` + +**图示来源** +- [entrance.go](file://api/channel/v2/entrance.go#L1-L47) +- [model.go](file://api/channel/v2/model.go#L1-L39) +- [channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go#L1-L15) + +**本节来源** +- [api/channel/v2/entrance.go](file://api/channel/v2/entrance.go) +- [internal/controller/channel/channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go) + +## 核心组件 +渠道管理API的核心组件包括入口管理的四个主要操作:创建、更新、删除和查询。这些操作通过清晰的请求-响应模式实现,确保了API的易用性和一致性。每个操作都有明确的认证机制和错误处理策略。 + +**本节来源** +- [api/channel/v2/entrance.go](file://api/channel/v2/entrance.go#L10-L42) +- [internal/systemV2/logic/channel/entrance.go](file://internal/systemV2/logic/channel/entrance.go#L49-L68) + +## 架构概述 +渠道管理API采用分层架构设计,从API层到业务逻辑层形成了清晰的调用链。API层定义了端点和数据结构,控制器层处理HTTP请求并调用业务逻辑,而业务逻辑层则与数据访问层交互完成具体操作。 + +```mermaid +graph TB +subgraph "客户端" +Client[客户端应用] +end +subgraph "API网关" +Auth[认证中间件] +end +subgraph "API层" +API[API定义] +end +subgraph "控制器层" +Controller[控制器] +end +subgraph "业务逻辑层" +Service[服务逻辑] +end +subgraph "数据访问层" +DAO[数据访问对象] +end +Client --> Auth +Auth --> API +API --> Controller +Controller --> Service +Service --> DAO +``` + +**图示来源** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go#L1-L15) +- [entrance.go](file://internal/systemV2/logic/channel/entrance.go#L1-L96) + +## 详细组件分析 +### 入口管理分析 +入口管理功能提供了完整的CRUD操作,每个操作都有明确的请求参数和响应结构。API设计遵循RESTful原则,使用标准的HTTP方法来表示不同的操作类型。 + +#### 对象导向组件: +```mermaid +classDiagram +class EntranceListReq { ++string path "/channel/entrance/getList" ++string tags "通道信息" ++string method "get" ++string summary "获取通道信息" ++EntranceParamsReq EntranceParamsReq +} +class EntranceCreateReq { ++string path "/channel/entrance/create" ++string tags "通道信息" ++string method "post" ++string summary "创建通道信息" ++Entrance Entrance +} +class EntranceUpdateReq { ++string path "/channel/entrance/update" ++string tags "通道信息" ++string method "post" ++string summary "修改通道信息" ++CommonStrId CommonStrId ++Entrance Entrance +} +class EntranceDeleteReq { ++string path "/channel/entrance/delete" ++string tags "通道信息" ++string method "delete" ++string summary "删除通道信息" ++CommonStrId CommonStrId +} +class Entrance { ++string Name ++string PayType ++float64 ServiceFee ++float64 TotalLimit ++string AllowedMm ++int StartHour ++int EndHour ++EntranceParams Params ++string Remark ++uint Status +} +class EntranceParams { ++string AppKey ++string AppSecret +} +EntranceListReq --> EntranceParamsReq : "包含" +EntranceCreateReq --> Entrance : "包含" +EntranceUpdateReq --> Entrance : "包含" +EntranceUpdateReq --> CommonStrId : "包含" +EntranceDeleteReq --> CommonStrId : "包含" +Entrance --> EntranceParams : "包含" +``` + +**图示来源** +- [entrance.go](file://api/channel/v2/entrance.go#L10-L42) +- [model.go](file://api/channel/v2/model.go#L11-L32) + +#### API/服务组件: +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API网关" +participant Controller as "控制器" +participant Service as "服务逻辑" +participant DAO as "数据访问层" +Client->>API : GET /channel/entrance/getList +API->>API : 认证检查 +API->>Controller : 调用EntranceList +Controller->>Service : 调用List方法 +Service->>DAO : 查询V2RoadInfo +DAO-->>Service : 返回查询结果 +Service-->>Controller : 返回总数量和数据列表 +Controller-->>API : 构造响应 +API-->>Client : 返回分页结果 +Client->>API : POST /channel/entrance/create +API->>API : 认证检查 +API->>Controller : 调用EntranceCreate +Controller->>Service : 调用Add方法 +Service->>DAO : 保存新通道 +DAO-->>Service : 返回操作结果 +Service-->>Controller : 返回错误信息 +Controller-->>API : 构造响应 +API-->>Client : 返回创建结果 +``` + +**图示来源** +- [channel_v2_entrance_list.go](file://internal/controller/channel/channel_v2_entrance_list.go#L1-L29) +- [channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go#L1-L15) +- [entrance.go](file://internal/systemV2/logic/channel/entrance.go#L1-L96) + +**本节来源** +- [api/channel/v2/entrance.go](file://api/channel/v2/entrance.go#L1-L47) +- [internal/controller/channel/channel_v2_entrance_create.go](file://internal/controller/channel/channel_v2_entrance_create.go#L1-L15) +- [internal/systemV2/logic/channel/entrance.go](file://internal/systemV2/logic/channel/entrance.go#L1-L96) + +## 依赖分析 +渠道管理API的各个组件之间存在清晰的依赖关系。API层依赖于模型定义,控制器层依赖于API定义和业务逻辑服务,而业务逻辑层则依赖于数据访问对象来完成数据库操作。 + +```mermaid +graph TD +A[entrance.go] --> B[EntranceListReq] +A --> C[EntranceCreateReq] +A --> D[EntranceUpdateReq] +A --> E[EntranceDeleteReq] +F[model.go] --> G[Entrance] +F --> H[EntranceParams] +F --> I[EntranceParamsReq] +J[channel_v2_entrance_list.go] --> A +J --> F +K[channel_v2_entrance_create.go] --> A +K --> F +L[channel_v2_entrance_update.go] --> A +L --> F +M[channel_v2_entrance_delete.go] --> A +N[entrance.go] --> O[V2RoadInfo] +``` + +**图示来源** +- [entrance.go](file://api/channel/v2/entrance.go#L1-L47) +- [model.go](file://api/channel/v2/model.go#L1-L39) +- [channel_v2_entrance_list.go](file://internal/controller/channel/channel_v2_entrance_list.go#L1-L29) + +**本节来源** +- [api/channel/v2/entrance.go](file://api/channel/v2/entrance.go) +- [api/channel/v2/model.go](file://api/channel/v2/model.go) +- [internal/controller/channel/channel_v2_entrance_list.go](file://internal/controller/channel/channel_v2_entrance_list.go) + +## 性能考虑 +渠道管理API在设计时考虑了性能因素。列表查询操作实现了分页功能,避免了一次性加载过多数据。所有数据库操作都使用了上下文(Context)来支持超时和取消功能。业务逻辑层使用了Try机制来处理事务,确保了数据的一致性。 + +## 故障排除指南 +当遇到API调用问题时,首先检查认证令牌是否有效。可以通过调用认证接口获取新的令牌。如果出现权限错误,请确认用户角色是否有访问该端点的权限。对于创建或更新操作失败的情况,检查请求体中的必填字段是否完整,特别是通道名称、支付类型等关键字段。 + +**本节来源** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [user_token.go](file://utility/token/user_token.go#L1-L134) + +## 结论 +渠道管理API提供了一套完整的入口管理功能,通过清晰的分层架构和规范的API设计,实现了高效、安全的渠道配置管理。API的每个端点都有明确的语义和一致的错误处理机制,便于客户端集成和使用。建议在实际使用中遵循文档中的示例和最佳实践,以确保系统的稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/系统监控API.md b/.qoder/repowiki/zh/content/API端点参考/系统监控API.md new file mode 100644 index 00000000..334fbd59 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/系统监控API.md @@ -0,0 +1,181 @@ +# 系统监控API + + +**本文档中引用的文件** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor.go](file://api/monitor/monitor.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) +- [auth.go](file://internal/middleware/auth.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了系统监控API的功能,重点介绍健康检查和系统状态监控等核心功能。文档涵盖了API端点的HTTP方法、URL模式、请求/响应模式和认证机制。通过实际使用示例、错误处理策略和安全考虑,全面解释了系统监控的实现细节,包括健康检查指标、响应时间监控和故障检测机制。同时提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。 + +## 项目结构 +系统监控API位于`api/monitor`目录下,包含v1版本的健康检查接口定义。控制器实现位于`internal/controller/monitor`目录中,遵循GoFrame框架的MVC架构模式。该模块与其他系统组件松耦合,提供独立的系统健康状态检测功能。 + +```mermaid +flowchart TD +A["api/monitor"] --> B["v1/heathcheck.go"] +C["internal/controller/monitor"] --> D["monitor_v1_health_check.go"] +B --> E["定义HealthCheckReq/Res"] +D --> F["实现HealthCheck方法"] +E --> G["HTTP GET /monitor/heathcheck"] +F --> G +``` + +**Diagram sources** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +**Section sources** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +## 核心组件 +系统监控API的核心组件包括健康检查请求/响应数据结构定义和对应的控制器实现。`HealthCheckReq`结构体通过g.Meta标签定义了API端点的路由、HTTP方法和元数据,而`HealthCheckRes`定义了返回的健康状态信息。控制器`ControllerV1`实现了`IMonitorV1`接口中的`HealthCheck`方法,提供实际的健康检查逻辑。 + +**Section sources** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L12) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go#L8-L12) + +## 架构概述 +系统监控API采用标准的分层架构,API定义层与业务逻辑实现层分离。API接口定义位于`api/monitor`包中,而具体实现位于`internal/controller/monitor`包中。这种设计遵循了关注点分离原则,使得接口定义可以独立于具体实现进行演进。 + +```mermaid +graph TB +A["客户端"] --> B["HTTP GET /monitor/heathcheck"] +B --> C["路由分发"] +C --> D["monitor.ControllerV1.HealthCheck"] +D --> E["返回 {ok: true}"] +E --> F["JSON响应"] +F --> A +``` + +**Diagram sources** +- [monitor.go](file://api/monitor/monitor.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +## 详细组件分析 + +### 健康检查组件分析 +健康检查组件提供了一个简单的端点来验证系统的基本可用性。该组件的设计旨在快速响应,不依赖于任何外部资源或数据库连接,确保即使在系统部分故障的情况下也能提供基本的健康状态信息。 + +#### API接口定义 +```mermaid +classDiagram +class HealthCheckReq { ++g.Meta path : "/monitor/heathcheck" ++tags : "监控信息" ++method : "get" ++summary : "健康检查" +} +class HealthCheckRes { ++Ok bool +} +HealthCheckReq --> HealthCheckRes : "返回" +``` + +**Diagram sources** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L6-L12) + +#### 控制器实现 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Router as "路由器" +participant Controller as "ControllerV1" +Client->>Router : GET /monitor/heathcheck +Router->>Controller : 调用HealthCheck方法 +Controller-->>Router : 返回{ok : true} +Router-->>Client : 200 OK + JSON +Note over Controller : 始终返回成功状态
不执行实际检查 +``` + +**Diagram sources** +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go#L8-L12) + +**Section sources** +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +### 认证机制分析 +虽然健康检查端点通常不需要认证,但系统整体的API访问受认证中间件保护。`LoginOrIframeAuth`中间件处理不同来源的认证请求,支持登录认证和iframe嵌入场景的认证。 + +```mermaid +flowchart TD +A["API请求"] --> B{"路径在白名单?"} +B --> |是| C["直接通过"] +B --> |否| D["检查tokenFrom头"] +D --> E{"tokenFrom=login?"} +E --> |是| F["执行loginAuth"] +E --> |否| G{"tokenFrom=iframe?"} +G --> |是| H["执行iFrameAuth"] +G --> |否| I["返回错误"] +F --> J{"认证成功?"} +H --> K{"认证成功?"} +J --> |是| L["继续处理"] +K --> |是| L +J --> |否| M["返回认证错误"] +K --> |否| M +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go) + +## 依赖分析 +系统监控模块具有较低的外部依赖性,主要依赖于GoFrame框架的基础组件。通过接口定义与实现分离的设计,该模块可以轻松地被替换或扩展,而不会影响系统的其他部分。 + +```mermaid +graph LR +A["monitor模块"] --> B["github.com/gogf/gf/v2"] +A --> C["kami/api/monitor/v1"] +A --> D["context"] +B --> E["g.Meta"] +B --> F["ghttp"] +C --> G["HealthCheckReq/Res"] +``` + +**Diagram sources** +- [monitor.go](file://api/monitor/monitor.go) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) + +**Section sources** +- [monitor.go](file://api/monitor/monitor.go) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) + +## 性能考虑 +健康检查端点设计为轻量级操作,不涉及数据库查询或外部服务调用,确保极低的响应延迟。由于其简单性,该端点可以承受高频率的调用,适合作为负载均衡器和容器编排系统的健康探针。 + +## 故障排除指南 +当健康检查API返回非200状态码时,可能的原因包括: +- 服务未启动或崩溃 +- 网络连接问题 +- 反向代理配置错误 + +建议的排查步骤: +1. 检查服务进程是否正在运行 +2. 验证网络连接和防火墙设置 +3. 查看应用日志以获取错误信息 +4. 确认路由配置是否正确 + +**Section sources** +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) +- [auth.go](file://internal/middleware/auth.go) + +## 结论 +系统监控API提供了简单而有效的健康检查功能,通过标准化的RESTful接口返回系统的基本可用性状态。该实现遵循了微服务架构的最佳实践,具有低耦合、高内聚的特点。尽管当前实现仅返回静态的健康状态,但其设计为未来的扩展留下了空间,可以轻松地集成更复杂的系统指标检查。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单日志管理.md b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单日志管理.md new file mode 100644 index 00000000..a29d98be --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单日志管理.md @@ -0,0 +1,167 @@ +# 订单日志管理 + + +**本文档引用的文件** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) +- [v_2_order_notify_log.go](file://internal/systemV2/dao/internal/v_2_order_notify_log.go) +- [common.go](file://api/commonApi/common.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了订单日志管理API的功能,重点涵盖订单日志的查询和删除功能。文档说明了`GET /api/v1/order/log/getList`和`DELETE /api/v1/order/log/delete`端点的HTTP方法、URL模式、请求/响应模式和认证机制。同时,文档还解释了订单日志在系统审计、问题排查和业务分析中的作用,以及与其他订单组件的集成方式。 + +## 项目结构 +订单日志管理功能主要分布在API层和控制器层,相关文件位于`api/order/v1/`和`internal/controller/order/`目录下。数据访问对象(DAO)定义在`internal/systemV2/dao/internal/`目录中,用于与数据库交互。 + +```mermaid +graph TB +subgraph "API层" +A[log.go] +end +subgraph "控制器层" +B[order_v1_order_log_list.go] +C[order_v1_order_log_delete.go] +end +subgraph "数据访问层" +D[v_2_order_notify_log.go] +end +A --> B +A --> C +B --> D +C --> D +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) +- [v_2_order_notify_log.go](file://internal/systemV2/dao/internal/v_2_order_notify_log.go) + +**节来源** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) + +## 核心组件 +订单日志管理的核心组件包括日志查询和删除两个功能模块。查询功能通过`OrderLogList`接口实现,删除功能通过`OrderLogDelete`接口实现。这两个接口目前均返回“未实现”错误,表明功能尚在开发中。 + +**节来源** +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go#L1-L13) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go#L1-L13) + +## 架构概述 +订单日志管理模块采用典型的三层架构:API层定义接口,控制器层处理业务逻辑,数据访问层负责与数据库交互。API层通过GoFrame框架的元数据注解定义了HTTP方法和路径,控制器层调用数据访问层的方法来执行具体的数据库操作。 + +```mermaid +graph TD +A[客户端] --> B[API层] +B --> C[控制器层] +C --> D[数据访问层] +D --> E[数据库] +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) +- [v_2_order_notify_log.go](file://internal/systemV2/dao/internal/v_2_order_notify_log.go) + +## 详细组件分析 + +### 订单日志查询分析 +订单日志查询功能通过`GET /api/v1/order/log/getList`端点实现。请求参数继承自`CommonPageReq`,包含分页信息。响应结构为空,表明需要进一步实现。 + +#### 请求结构 +```mermaid +classDiagram +class OrderLogListReq { ++string path "/order/log/getList" ++string method "get" ++string summary "获取订单流水" ++int Current ++int PageSize +} +class CommonPageReq { ++int Current ++int PageSize +} +OrderLogListReq --> CommonPageReq : "继承" +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go#L6-L10) + +**节来源** +- [log.go](file://api/order/v1/log.go#L6-L10) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go#L1-L13) + +### 订单日志删除分析 +订单日志删除功能通过`DELETE /api/v1/order/log/delete`端点实现。请求参数继承自`CommonIntId`,包含要删除的日志ID。响应结构为空,表明需要进一步实现。 + +#### 请求结构 +```mermaid +classDiagram +class OrderLogDeleteReq { ++string path "/order/log/delete" ++string method "delete" ++string summary "删除订单流水" ++uint ID +} +class CommonIntId { ++uint ID +} +OrderLogDeleteReq --> CommonIntId : "继承" +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go#L16-L20) + +**节来源** +- [log.go](file://api/order/v1/log.go#L16-L20) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go#L1-L13) + +## 依赖分析 +订单日志管理模块依赖于`commonApi`模块中的分页和ID参数定义,以及`systemV2`模块中的数据访问对象。这些依赖关系通过Go语言的包导入机制实现。 + +```mermaid +graph TD +A[订单日志管理] --> B[commonApi] +A --> C[systemV2] +B --> D[CommonPageReq] +B --> E[CommonIntId] +C --> F[V2OrderNotifyLogDao] +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go) +- [v_2_order_notify_log.go](file://internal/systemV2/dao/internal/v_2_order_notify_log.go) + +**节来源** +- [log.go](file://api/order/v1/log.go) +- [v_2_order_notify_log.go](file://internal/systemV2/dao/internal/v_2_order_notify_log.go) + +## 性能考虑 +由于订单日志查询功能涉及分页,建议合理设置分页大小以避免对数据库造成过大压力。同时,删除操作应谨慎使用,避免误删重要日志数据。 + +## 故障排除指南 +当前订单日志管理功能尚未实现,调用相关接口将返回“未实现”错误。开发者需要完成控制器层的业务逻辑实现,并确保数据访问层的正确性。 + +**节来源** +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go#L12-L13) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go#L12-L13) + +## 结论 +订单日志管理模块为系统提供了重要的审计和监控能力。尽管当前功能尚未实现,但其架构设计清晰,依赖关系明确。后续开发应重点关注查询和删除功能的实现,确保日志数据的安全性和可用性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单汇总统计.md b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单汇总统计.md new file mode 100644 index 00000000..fe8a59a0 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单汇总统计.md @@ -0,0 +1,198 @@ +# 订单汇总统计 + + +**本文档中引用的文件** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go) +- [order_info.go](file://internal/model/order_info.go) +- [merchant_order.go](file://internal/service/merchant_order.go) +- [handler.go](file://internal/errHandler/handler.go) + + +## 目录 +1. [简介](#简介) +2. [核心组件](#核心组件) +3. [API端点说明](#api端点说明) +4. [数据结构定义](#数据结构定义) +5. [查询条件与统计维度](#查询条件与统计维度) +6. [认证机制](#认证机制) +7. [使用示例](#使用示例) +8. [计算逻辑与数据一致性](#计算逻辑与数据一致性) +9. [性能优化建议](#性能优化建议) +10. [监控与业务分析作用](#监控与业务分析作用) + +## 简介 +本文档详细描述了订单汇总统计API的功能与使用方法,重点涵盖两个核心端点:`GET /api/v1/order/summary/get/list` 和 `GET /api/v1/order/summary/daily/get/list`。该API用于获取订单的总体统计信息和每日趋势数据,支持按商户、通道、日期等多维度进行聚合分析,广泛应用于业务报表生成、运营状况监控和财务对账等场景。 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) + +## 核心组件 +订单汇总统计功能由控制器、服务层和数据模型三层构成。控制器负责接收HTTP请求并进行参数校验,服务层实现具体的业务逻辑和数据库查询,数据模型定义了输入输出的数据结构。整个流程通过依赖注入机制解耦,确保代码的可维护性和可测试性。 + +```mermaid +graph TD +A[客户端] --> B[ControllerV1.OrderSummaryGetList] +B --> C[service.OrderSummary().GetList] +C --> D[model.OrderSummaryListInput] +C --> E[model.OrderSummaryListOutput] +F[客户端] --> G[ControllerV1.OrderSummaryDailyGetList] +G --> H[service.OrderSummary().GetDailyStats] +H --> I[model.OrderSummaryDailyListInput] +H --> J[model.OrderSummaryDailyListOutput] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#bbf,stroke:#333 +style D fill:#9f9,stroke:#333 +style E fill:#9f9,stroke:#333 +style F fill:#f9f,stroke:#333 +style G fill:#bbf,stroke:#333 +style H fill:#bbf,stroke:#333 +style I fill:#9f9,stroke:#333 +style J fill:#9f9,stroke:#333 +``` + +**Diagram sources** +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go#L1-L58) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go#L1-L61) +- [merchant_order.go](file://internal/service/merchant_order.go#L17-L26) + +**Section sources** +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go#L1-L58) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go#L1-L61) + +## API端点说明 + +### 总体订单汇总端点 +- **HTTP方法**: GET +- **URL模式**: `/api/v1/order/summary/get/list` +- **功能描述**: 获取订单的总体汇总数据,按商户维度聚合统计 +- **认证要求**: 需要有效的用户会话和权限验证 + +### 每日订单汇总端点 +- **HTTP方法**: GET +- **URL模式**: `/api/v1/order/summary/daily/get/list` +- **功能描述**: 获取订单的每日统计趋势数据,支持按日期范围查询 +- **认证要求**: 需要有效的用户会话和权限验证 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) + +## 数据结构定义 + +### 订单汇总记录(OrderSummaryRecord) +| 字段名 | 类型 | 描述 | +|--------|------|------| +| merchantUid | string | 商户唯一标识 | +| merchantName | string | 商户名称 | +| succeedCount | int64 | 成功订单数量 | +| totalCount | int64 | 订单总量 | +| failedCount | int64 | 失败订单数量 | +| waitedCount | int64 | 创建但未填写的订单数量 | +| succeedShowAmount | float64 | 成功订单展示金额 | +| totalShowAmount | float64 | 订单总展示金额 | +| succeedFactAmount | float64 | 成功订单实际金额 | +| totalFactAmount | float64 | 订单总实际金额 | +| rate | float64 | 成功率(百分比) | +| date | string | 统计日期 | + +### 每日订单汇总记录(OrderSummaryDailyRecord) +在基础汇总记录的基础上,增加了通道信息: +- **roadUid**: 通道唯一标识 +- **roadName**: 通道名称 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) +- [order_info.go](file://internal/model/order_info.go#L1-L24) + +## 查询条件与统计维度 + +### 总体汇总查询参数 +- **roadUid**: 按指定通道筛选 +- **date**: 按指定日期查询 +- **分页参数**: 支持标准分页(page, limit) + +### 每日汇总查询参数 +- **roadUid[]**: 按多个通道筛选(数组) +- **dateRange[]**: 按日期范围查询(起止时间数组) +- **merchantUid[]**: 按多个商户筛选(数组) + +统计维度包括: +- 按商户聚合 +- 按通道聚合 +- 按日趋势分析 +- 多维度交叉统计 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) + +## 认证机制 +API采用基于上下文的认证机制,通过`service.SysAuth().LoginWithEverything`和`LoginWithIFrameAndLogin`方法验证用户身份和权限。请求必须携带有效的认证令牌,系统会自动提取用户ID和登录类型,用于数据权限控制。未通过认证的请求将返回401状态码。 + +**Section sources** +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go#L1-L58) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go#L1-L61) + +## 使用示例 + +### 获取某商户的总体统计 +```http +GET /api/v1/order/summary/get/list?merchantUid=MER123&date=2024-01-15 +Authorization: Bearer +``` + +### 获取多商户多通道的每日趋势 +```http +GET /api/v1/order/summary/daily/get/list?roadUid[]=R1&roadUid[]=R2&merchantUid[]=M1&merchantUid[]=M2&dateRange[]=2024-01-01&dateRange[]=2024-01-31 +Authorization: Bearer +``` + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) + +## 计算逻辑与数据一致性 +汇总数据基于订单状态实时计算,成功率通过`成功订单数/总订单数`公式得出,金额统计包含展示金额和实际金额两个维度。数据更新频率为实时,每次查询都会从数据库获取最新状态。系统通过事务机制保证数据一致性,避免统计过程中的脏读问题。错误处理采用统一的包装机制,确保异常信息的标准化输出。 + +```mermaid +flowchart TD +Start([开始]) --> Validate["验证请求参数"] +Validate --> Auth["认证用户权限"] +Auth --> Query["查询订单数据"] +Query --> Calc["计算统计指标"] +Calc --> Format["格式化输出结果"] +Format --> End([返回响应]) +Query --> |失败| HandleError["处理数据库错误"] +HandleError --> WrapError["包装错误信息"] +WrapError --> End +``` + +**Diagram sources** +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go#L1-L58) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go#L1-L61) +- [handler.go](file://internal/errHandler/handler.go#L1-L10) + +**Section sources** +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go#L1-L58) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go#L1-L61) + +## 性能优化建议 +1. **合理使用缓存**: 对于频繁查询但变化不频繁的数据,建议在客户端或中间层添加缓存 +2. **避免高频查询**: 不要以过高频率调用汇总接口,建议最小间隔不低于5分钟 +3. **精确查询条件**: 尽量指定具体的商户、通道和日期范围,减少数据扫描量 +4. **分页处理**: 对于大量数据,使用分页参数避免单次返回过多记录 +5. **批量查询**: 当需要多个维度数据时,优先使用支持数组参数的接口,减少请求数量 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) + +## 监控与业务分析作用 +该接口在系统监控和业务分析中扮演关键角色: +- **健康状况监控**: 通过每日趋势分析,及时发现订单量异常波动 +- **业务运营分析**: 支持按商户、通道多维度分析交易表现 +- **财务对账**: 提供准确的订单统计和金额汇总,便于财务核对 +- **决策支持**: 基于历史数据趋势,为业务决策提供数据支持 +- **问题排查**: 当出现交易异常时,可快速定位受影响的商户或通道 + +**Section sources** +- [order_summary.go](file://api/order/v1/order_summary.go#L1-L62) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单管理API.md b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单管理API.md new file mode 100644 index 00000000..389ebb13 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单管理API.md @@ -0,0 +1,269 @@ +# 订单管理API + + +**本文档引用的文件** +- [form.go](file://api/order/v1/form.go) +- [log.go](file://api/order/v1/log.go) +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order.go](file://api/order/order.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_form_update.go](file://internal/controller/order/order_v1_order_form_update.go) +- [order_v1_order_form_delete.go](file://internal/controller/order/order_v1_order_form_delete.go) +- [order_v1_order_form_list.go](file://internal/controller/order/order_v1_order_form_list.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go) +- [order_info.go](file://internal/model/order_info.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +订单管理API提供了一套完整的订单生命周期管理功能,包括订单创建、查询、历史记录和汇总统计等核心功能。该API系统支持多商户、多渠道的订单处理,实现了订单表单管理、订单日志记录和订单汇总统计等功能。系统采用GoFrame框架构建,通过RESTful接口提供服务,确保了高可用性和可扩展性。API设计遵循清晰的认证机制和错误处理策略,为客户端提供了稳定可靠的接口服务。 + +## 项目结构 +订单管理API的项目结构遵循分层设计原则,将API定义、控制器逻辑、业务服务和数据访问层分离。API接口定义位于`api/order/v1`目录下,控制器实现位于`internal/controller/order`目录中,业务逻辑处理在`internal/logic/merchant_order`包内,数据模型定义在`internal/model`包中。这种分层结构确保了代码的可维护性和可测试性,同时通过GoFrame框架的代码生成工具保持了接口定义与实现的一致性。 + +```mermaid +graph TB +subgraph "API层" +A[form.go] +B[log.go] +C[order_summary.go] +end +subgraph "控制器层" +D[order_new.go] +E[order_v1_*.go] +end +subgraph "业务逻辑层" +F[order-summary.go] +end +subgraph "数据模型层" +G[order_info.go] +end +A --> D +B --> D +C --> D +D --> F +F --> G +``` + +**图示来源** +- [form.go](file://api/order/v1/form.go) +- [log.go](file://api/order/v1/log.go) +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) +- [order_info.go](file://internal/model/order_info.go) + +**本节来源** +- [form.go](file://api/order/v1/form.go) +- [order_new.go](file://internal/controller/order/order_new.go) + +## 核心组件 +订单管理API的核心组件包括订单表单管理、订单日志管理和订单汇总统计三大功能模块。订单表单管理提供订单的创建、更新、删除和查询接口,支持实时订单的全生命周期管理。订单日志管理记录订单操作历史,提供日志查询和删除功能。订单汇总统计模块则提供多维度的订单数据分析,包括按日期、商户和渠道的订单统计。所有组件通过统一的认证机制保护,确保数据安全。 + +**本节来源** +- [order.go](file://api/order/order.go) +- [form.go](file://api/order/v1/form.go) +- [log.go](file://api/order/v1/log.go) +- [order_summary.go](file://api/order/v1/order_summary.go) + +## 架构概述 +订单管理API采用典型的分层架构,从上到下分为API接口层、控制器层、业务逻辑层和数据模型层。API接口层定义了所有可用的RESTful端点,使用GoFrame的元数据注解指定HTTP方法、URL路径和请求/响应模式。控制器层实现API接口,处理请求参数验证和认证检查。业务逻辑层包含核心的订单处理逻辑,如汇总统计计算。数据模型层定义了与数据库交互的数据结构和查询方法。各层之间通过清晰的接口契约进行通信,确保了系统的模块化和可维护性。 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[业务逻辑层] +Service --> Model[数据模型层] +Model --> Database[(数据库)] +style Client fill:#f9f,stroke:#333 +style Database fill:#ccf,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/order/order.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) +- [order_info.go](file://internal/model/order_info.go) + +## 详细组件分析 + +### 订单表单管理分析 +订单表单管理组件提供实时订单的CRUD操作,包括创建、查询、更新和删除功能。该组件通过`OrderFormCreate`、`OrderFormList`、`OrderFormUpdate`和`OrderFormDelete`四个主要接口实现。所有接口均受认证保护,确保只有授权用户才能操作订单数据。接口设计遵循RESTful原则,使用标准的HTTP方法对应相应的操作类型。 + +#### 对象导向组件: +```mermaid +classDiagram +class OrderFormCreateReq { ++string path : "/order/orderForm/create" ++string tags : "实时订单" ++string method : "post" ++string summary : "创建实时订单" +} +class OrderFormListReq { ++string path : "/order/orderForm/getList" ++string tags : "实时订单" ++string method : "get" ++string summary : "获取实时订单" ++CommonPageReq pagination +} +class OrderFormUpdateReq { ++string path : "/order/orderForm/update" ++string tags : "实时订单" ++string method : "post" ++string summary : "修改实时订单" ++int id +} +class OrderFormDeleteReq { ++string path : "/order/orderForm/delete" ++string tags : "实时订单" ++string method : "delete" ++string summary : "删除实时订单" ++int id +} +OrderFormCreateReq : +OrderFormCreateRes execute(Context, Request) +OrderFormListReq : +OrderFormListRes execute(Context, Request) +OrderFormUpdateReq : +OrderFormUpdateRes execute(Context, Request) +OrderFormDeleteReq : +OrderFormDeleteRes execute(Context, Request) +``` + +**图示来源** +- [form.go](file://api/order/v1/form.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_form_list.go](file://internal/controller/order/order_v1_order_form_list.go) +- [order_v1_order_form_update.go](file://internal/controller/order/order_v1_order_form_update.go) +- [order_v1_order_form_delete.go](file://internal/controller/order/order_v1_order_form_delete.go) + +**本节来源** +- [form.go](file://api/order/v1/form.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_form_list.go](file://internal/controller/order/order_v1_order_form_list.go) + +### 订单日志管理分析 +订单日志管理组件负责记录和查询订单操作历史,提供审计和故障排查功能。该组件通过`OrderLogList`和`OrderLogDelete`两个接口实现日志的查询和清理功能。日志查询支持分页,便于处理大量日志数据。所有日志操作均需通过身份验证,确保日志数据的安全性。 + +#### API/服务组件: +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "OrderController" +participant Service as "OrderService" +participant Model as "OrderModel" +Client->>Controller : GET /order/log/getList +Controller->>Controller : 验证用户权限 +Controller->>Service : 调用OrderLogList +Service->>Model : 查询日志数据 +Model-->>Service : 返回日志记录 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回分页日志列表 +Client->>Controller : DELETE /order/log/delete +Controller->>Controller : 验证用户权限 +Controller->>Service : 调用OrderLogDelete +Service->>Model : 删除指定日志 +Model-->>Service : 返回删除结果 +Service-->>Controller : 返回响应 +Controller-->>Client : 返回删除成功 +``` + +**图示来源** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_log_delete.go](file://internal/controller/order/order_v1_order_log_delete.go) + +**本节来源** +- [log.go](file://api/order/v1/log.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) + +### 订单汇总统计分析 +订单汇总统计组件提供多维度的订单数据分析功能,支持按日期、商户和渠道进行订单统计。该组件通过`OrderSummaryGetList`和`OrderSummaryDailyGetList`两个主要接口提供汇总数据查询服务。统计结果包括成功订单数、失败订单数、等待订单数以及相应的金额统计,为业务决策提供数据支持。 + +#### 复杂逻辑组件: +```mermaid +flowchart TD +Start([开始]) --> AuthCheck["身份验证"] +AuthCheck --> AuthValid{"验证通过?"} +AuthValid --> |否| ReturnError["返回未授权错误"] +AuthValid --> |是| ParamCheck["参数验证"] +ParamCheck --> SummaryType{"统计类型?"} +SummaryType --> |普通汇总| DailySummary["按日汇总统计"] +SummaryType --> |每日汇总| RangeSummary["按日期范围汇总"] +DailySummary --> QueryBuilder["构建数据库查询"] +RangeSummary --> QueryBuilder +QueryBuilder --> SQLQuery["执行SQL查询"] +SQLQuery --> DataProcess["处理原始数据"] +DataProcess --> RateCalc["计算成功率"] +RateCalc --> AmountRound["金额四舍五入"] +AmountRound --> ReturnResult["返回格式化结果"] +ReturnError --> End([结束]) +ReturnResult --> End +``` + +**图示来源** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +**本节来源** +- [order_summary.go](file://api/order/v1/order_summary.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [order_v1_order_summary_daily_get_list.go](file://internal/controller/order/order_v1_order_summary_daily_get_list.go) + +## 依赖分析 +订单管理API的组件间依赖关系清晰明确。API接口层依赖于`commonApi`包中的通用数据结构,如分页参数和响应格式。控制器层依赖于`service`包中的业务服务,特别是`SysAuth`服务用于认证检查。业务逻辑层依赖于`dao`包中的数据访问对象和`config`包中的配置管理。所有组件都依赖于GoFrame框架的核心功能,如上下文管理、错误处理和数据库操作。这种依赖关系确保了组件间的松耦合,便于单独测试和维护。 + +```mermaid +graph LR +A[order API] --> B[commonApi] +C[OrderController] --> D[SysAuth Service] +C --> E[OrderSummary Service] +F[OrderSummary Logic] --> G[V1OrderInfo DAO] +F --> H[Config] +I[GoFrame Framework] --> C +I --> F +I --> G +style A fill:#f96,stroke:#333 +style C fill:#69f,stroke:#333 +style F fill:#6f9,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/order/order.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) +- [order_info.go](file://internal/model/order_info.go) + +**本节来源** +- [order.go](file://api/order/order.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [order-summary.go](file://internal/logic/merchant_order/order-summary.go) + +## 性能考虑 +订单管理API在设计时考虑了性能优化。对于订单汇总统计等复杂查询,系统使用数据库聚合函数在数据库层面进行计算,避免了大量数据传输到应用层处理。分页查询支持限制返回结果数量,防止一次性加载过多数据导致内存溢出。对于高频访问的统计接口,建议实现缓存机制,将计算结果缓存一段时间,减少数据库压力。同时,所有数据库查询都应确保相关字段有适当的索引,特别是`CreateTime`、`MerchantUid`和`RoadUid`等常用查询条件字段。 + +## 故障排除指南 +当订单管理API出现问题时,应首先检查认证信息是否正确,确保请求包含有效的身份验证令牌。对于返回500错误的情况,应查看服务器日志中的详细错误信息,特别是数据库操作错误。如果查询性能低下,应检查相关数据库表的索引是否完整,必要时添加复合索引。对于汇总统计接口返回空结果的情况,应验证查询参数是否正确,特别是日期格式是否符合要求。所有API调用都应处理可能的错误响应,实现适当的重试机制和错误提示。 + +**本节来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [errHandler/handler.go](file://internal/errHandler/handler.go) + +## 结论 +订单管理API提供了一套完整且安全的订单管理解决方案,涵盖了订单创建、查询、日志和统计等核心功能。系统架构清晰,分层合理,便于维护和扩展。通过严格的认证机制和错误处理策略,确保了数据的安全性和系统的稳定性。建议在生产环境中为高频访问的汇总统计接口添加缓存层,并定期优化数据库索引,以进一步提升系统性能。未来可以考虑增加Webhook通知功能,当订单状态发生变化时主动通知商户系统。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单表单管理.md b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单表单管理.md new file mode 100644 index 00000000..923d3a69 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/订单管理API/订单表单管理.md @@ -0,0 +1,157 @@ +# 订单表单管理 + + +**本文档中引用的文件** +- [form.go](file://api/order/v1/form.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_form_update.go](file://internal/controller/order/order_v1_order_form_update.go) +- [order_v1_order_form_list.go](file://internal/controller/order/order_v1_order_form_list.go) +- [order_v1_order_form_delete.go](file://internal/controller/order/order_v1_order_form_delete.go) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) + + +## 目录 +1. [简介](#简介) +2. [API端点说明](#api端点说明) +3. [数据结构定义](#数据结构定义) +4. [业务逻辑与状态约束](#业务逻辑与状态约束) +5. [使用示例](#使用示例) +6. [错误处理策略](#错误处理策略) +7. [安全考虑](#安全考虑) +8. [性能优化建议](#性能优化建议) +9. [与其他模块的关系](#与其他模块的关系) +10. [结论](#结论) + +## 简介 +本文档详细描述了订单表单管理API的设计与实现,涵盖订单表单的创建、更新、查询和删除等核心操作。该功能位于系统订单模块中,通过RESTful接口提供服务,支持实时订单的全生命周期管理。当前实现中,各接口已定义但尚未完成具体业务逻辑,返回“未实现”错误。 + +## API端点说明 + +### 创建订单表单 +- **端点**: `POST /api/v1/order/form/create` +- **功能**: 创建新的订单表单 +- **认证机制**: 需要有效的用户身份令牌(JWT) +- **状态**: 接口已定义,但逻辑未实现,返回 `CodeNotImplemented` 错误 + +**节来源** +- [form.go](file://api/order/v1/form.go#L14-L17) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go#L11-L13) + +### 更新订单表单 +- **端点**: `PUT /api/v1/order/form/update` +- **功能**: 修改现有订单表单信息 +- **认证机制**: 需要有效的用户身份令牌(JWT) +- **状态**: 接口已定义,但逻辑未实现,返回 `CodeNotImplemented` 错误 + +**节来源** +- [form.go](file://api/order/v1/form.go#L19-L22) +- [order_v1_order_form_update.go](file://internal/controller/order/order_v1_order_form_update.go#L11-L13) + +### 查询订单表单列表 +- **端点**: `GET /api/v1/order/form/list` +- **功能**: 获取订单表单分页列表 +- **参数**: 支持分页参数(如页码、每页数量) +- **认证机制**: 需要有效的用户身份令牌(JWT) +- **状态**: 接口已定义,但逻辑未实现,返回 `CodeNotImplemented` 错误 + +**节来源** +- [form.go](file://api/order/v1/form.go#L3-L8) +- [order_v1_order_form_list.go](file://internal/controller/order/order_v1_order_form_list.go#L11-L13) + +### 删除订单表单 +- **端点**: `DELETE /api/v1/order/form/delete` +- **功能**: 删除指定ID的订单表单 +- **认证机制**: 需要有效的用户身份令牌(JWT) +- **状态**: 接口已定义,但逻辑未实现,返回 `CodeNotImplemented` 错误 + +**节来源** +- [form.go](file://api/order/v1/form.go#L29-L32) +- [order_v1_order_form_delete.go](file://internal/controller/order/order_v1_order_form_delete.go#L11-L13) + +## 数据结构定义 + +### 订单表单请求结构 +- `OrderFormCreateReq`: 创建请求,无具体字段定义 +- `OrderFormUpdateReq`: 更新请求,包含通用整型ID(`CommonIntId`) +- `OrderFormListReq`: 查询请求,继承分页参数(`CommonPageReq`) +- `OrderFormDeleteReq`: 删除请求,包含通用整型ID(`CommonIntId`) + +### 响应结构 +所有响应结构(`OrderFormCreateRes`, `OrderFormUpdateRes`, `OrderFormListRes`, `OrderFormDeleteRes`)均为空结构体,仅声明JSON内容类型。 + +### 数据库映射 +订单信息由 `v_1_order_info.go` 中的DAO对象管理,对应数据库表 `order_info`,通过GoFrame框架自动生成基础操作接口。 + +**节来源** +- [form.go](file://api/order/v1/form.go#L3-L34) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L27) + +## 业务逻辑与状态约束 +当前代码中未实现具体的业务逻辑、字段验证规则或状态转换机制。所有操作均返回“未实现”错误。建议后续开发中补充以下约束: +- 字段验证:确保必填字段非空,数值字段符合范围 +- 权限控制:验证用户是否有权操作目标订单 +- 状态机:定义订单表单的有效状态及转换规则(如:草稿 → 已提交 → 已完成) +- 幂等性:确保创建和更新操作的幂等处理 + +**节来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go#L11-L13) +- [order_v1_order_form_update.go](file://internal/controller/order/order_v1_order_form_update.go#L11-L13) + +## 使用示例 +由于接口尚未实现,以下为预期使用模式: + +### 成功场景(预期) +```http +POST /api/v1/order/form/create +Authorization: Bearer +Content-Type: application/json + +{ + "field1": "value1", + "field2": "value2" +} +``` +**预期响应**: `200 OK` + 创建成功的订单信息 + +### 失败场景 +```http +POST /api/v1/order/form/create +Authorization: Bearer +``` +**实际响应**: `500 Internal Server Error` + `CodeNotImplemented` + +**节来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go#L11-L13) + +## 错误处理策略 +当前系统使用GoFrame框架的错误处理机制: +- 统一返回 `gerror.NewCode(gcode.CodeNotImplemented)` 表示功能未完成 +- 建议后续实现中使用不同错误码区分验证失败、权限不足、资源不存在等情况 +- 所有错误应通过中间件统一捕获并格式化为标准JSON响应 + +**节来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go#L12-L13) + +## 安全考虑 +- 所有订单操作需通过身份认证中间件校验JWT令牌 +- 建议增加CSRF防护和请求频率限制(可通过 `utility/limiter` 模块实现) +- 敏感操作应记录审计日志 +- 输入参数需进行严格验证,防止注入攻击 + +## 性能优化建议 +- 利用GoFrame ORM的缓存机制减少数据库查询 +- 对列表查询添加适当索引(如按用户ID、创建时间) +- 考虑使用Redis缓存热点数据 +- 批量操作应使用事务确保一致性 + +## 与其他模块的关系 +订单表单作为核心业务实体,应与以下模块交互: +- **订单日志**:每次状态变更应记录到日志模块 +- **订单汇总**:成功订单应计入日汇总和总览统计 +- **支付系统**:订单状态可能触发支付流程 +- **通知服务**:关键状态变更应发送通知 + +当前代码中尚未建立这些关联。 + +## 结论 +订单表单管理API的接口定义已完成,但具体实现尚为空。建议优先完成核心CRUD逻辑,再逐步添加验证、权限、日志等企业级特性。整体架构基于GoFrame框架,具有良好的扩展性和一致性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金流水.md b/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金流水.md new file mode 100644 index 00000000..e47fbb38 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金流水.md @@ -0,0 +1,262 @@ +# 资金流水 + + +**本文档中引用的文件** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund_v1_menu_log_list.go](file://internal/controller/fund/fund_v1_menu_log_list.go) +- [fund_v1_menu_log_create.go](file://internal/controller/fund/fund_v1_menu_log_create.go) +- [fund_v1_menu_log_update.go](file://internal/controller/fund/fund_v1_menu_log_update.go) +- [fund_v1_menu_log_delete.go](file://internal/controller/fund/fund_v1_menu_log_delete.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) +- [v_1_sys_user_payment_records.go](file://internal/dao/v_1_sys_user_payment_records.go) +- [V1SysUserPaymentRecords.go](file://internal/model/do/v_1_sys_user_payment_records.go) +- [V1SysUserPaymentRecords.go](file://internal/model/entity/v_1_sys_user_payment_records.go) +- [SysUserPaymentRecordInput.go](file://internal/model/sys_user_payment_record.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了资金流水API的实现,涵盖资金流水记录的创建、查询、更新和删除等操作。文档详细说明了每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。同时,文档还解释了资金流水的实现细节,包括流水号生成规则、对账机制和数据一致性保障,并提供客户端实现指南和性能优化建议。 + +## 项目结构 +资金流水功能主要位于`api/fund/v1`目录下,相关控制器位于`internal/controller/fund`目录,服务逻辑位于`internal/service`和`internal/logic`目录,数据访问对象(DAO)和模型定义位于`internal/dao`和`internal/model`目录。 + +```mermaid +graph TB +subgraph "API 层" +A[wallet_log.go] +end +subgraph "控制器层" +B[fund_v1_menu_log_list.go] +C[fund_v1_menu_log_create.go] +D[fund_v1_menu_log_update.go] +E[fund_v1_menu_log_delete.go] +end +subgraph "服务层" +F[sys_user_payment.go] +end +subgraph "逻辑层" +G[record.go] +end +subgraph "数据访问层" +H[v_1_sys_user_payment_records.go] +end +subgraph "模型层" +I[V1SysUserPaymentRecords.go] +J[SysUserPaymentRecordInput.go] +end +A --> B +A --> C +A --> D +A --> E +B --> F +C --> F +D --> F +E --> F +F --> G +G --> H +H --> I +F --> J +``` + +**图示来源** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund_v1_menu_log_list.go](file://internal/controller/fund/fund_v1_menu_log_list.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) +- [v_1_sys_user_payment_records.go](file://internal/dao/v_1_sys_user_payment_records.go) +- [V1SysUserPaymentRecords.go](file://internal/model/do/v_1_sys_user_payment_records.go) +- [SysUserPaymentRecordInput.go](file://internal/model/sys_user_payment_record.go) + +**节来源** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund_v1_menu_log_list.go](file://internal/controller/fund/fund_v1_menu_log_list.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) + +## 核心组件 +资金流水功能的核心组件包括API定义、服务接口、数据访问对象和数据库模型。API定义了四个主要操作:创建、查询、更新和删除资金流水记录。服务接口`ISysUserPayment`提供了`AddRecord`和`ListRecords`等方法来处理这些操作。 + +**节来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) + +## 架构概述 +资金流水功能采用典型的分层架构,包括API层、控制器层、服务层、逻辑层、数据访问层和模型层。API层定义了HTTP端点,控制器层处理HTTP请求并调用服务层,服务层协调业务逻辑,逻辑层实现具体业务规则,数据访问层负责与数据库交互,模型层定义数据结构。 + +```mermaid +graph TB +A[客户端] --> B[API层] +B --> C[控制器层] +C --> D[服务层] +D --> E[逻辑层] +E --> F[数据访问层] +F --> G[数据库] +``` + +**图示来源** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund_v1_menu_log_list.go](file://internal/controller/fund/fund_v1_menu_log_list.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) +- [v_1_sys_user_payment_records.go](file://internal/dao/v_1_sys_user_payment_records.go) + +## 详细组件分析 + +### 资金流水API分析 +资金流水API定义了四个主要操作:创建、查询、更新和删除。这些操作通过`MenuLogCreateReq`、`MenuLogListReq`、`MenuLogUpdateReq`和`MenuLogDeleteReq`结构体定义。 + +```mermaid +classDiagram +class MenuLogListReq { ++CommonPageReq +} +class MenuLogCreateReq { +} +class MenuLogUpdateReq { ++CommonIntId +} +class MenuLogDeleteReq { ++CommonIntId +} +MenuLogListReq : path : "/auth/menuLog/getList" tags : "钱包流水" method : "get" summary : "获取钱包流水" +MenuLogCreateReq : path : "/auth/menuLog/create" tags : "钱包流水" method : "post" summary : "创建钱包流水" +MenuLogUpdateReq : path : "/auth/menuLog/update" tags : "钱包流水" method : "post" summary : "修改钱包流水" +MenuLogDeleteReq : path : "/auth/menuLog/delete" tags : "钱包流水" method : "delete" summary : "删除钱包流水" +``` + +**图示来源** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) + +**节来源** +- [wallet_log.go](file://api/fund/v1/wallet_log.go) + +### 服务层分析 +服务层通过`ISysUserPayment`接口定义了资金流水操作,包括`AddRecord`用于创建流水记录,`ListRecords`用于查询流水记录。 + +```mermaid +classDiagram +class ISysUserPayment { ++AddRecord(ctx, input, tx) recordId, err ++ListRecords(ctx, input) total, list, err ++DailySummary(ctx, input) total, record, err +} +class SysUserPaymentRecordInput { ++OrderNo string ++UserId string ++PaymentId int ++Amount decimal.Decimal ++Notes string ++TransactionType UserPaymentTransactionType ++Category CardRedeemAccountCategory +} +ISysUserPayment ..> SysUserPaymentRecordInput : 使用 +``` + +**图示来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [SysUserPaymentRecordInput.go](file://internal/model/sys_user_payment_record.go) + +**节来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) + +### 数据访问分析 +数据访问层通过`V1SysUserPaymentRecords` DAO与数据库交互,使用`V1SysUserPaymentRecords`模型定义数据库表结构。 + +```mermaid +classDiagram +class V1SysUserPaymentRecords { ++Id uint ++TransactionId string ++PaymentId int ++DeductionId string ++UserId string ++Amount decimal.Decimal ++TransactionType string ++OrderNo string ++Status string ++Category string ++Notes string ++CreatedAt *gtime.Time ++DeletedAt *gtime.Time ++UpdatedAt *gtime.Time +} +class v1SysUserPaymentRecordsDao { ++InsertAndGetId(data) id, err ++Where(column, value) Query ++Page(page, size) Query ++OrderDesc(column) Query ++ScanAndCount(list, total, true) err +} +V1SysUserPaymentRecords ..> v1SysUserPaymentRecordsDao : 使用 +``` + +**图示来源** +- [v_1_sys_user_payment_records.go](file://internal/dao/v_1_sys_user_payment_records.go) +- [V1SysUserPaymentRecords.go](file://internal/model/do/v_1_sys_user_payment_records.go) +- [V1SysUserPaymentRecords.go](file://internal/model/entity/v_1_sys_user_payment_records.go) + +**节来源** +- [v_1_sys_user_payment_records.go](file://internal/dao/v_1_sys_user_payment_records.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) + +## 依赖分析 +资金流水功能依赖于多个组件,包括认证服务、数据库配置、通用工具库等。这些依赖通过Go的包导入机制实现。 + +```mermaid +graph TD +A[资金流水API] --> B[认证服务] +A --> C[数据库配置] +A --> D[通用工具库] +A --> E[错误处理] +B --> F[用户认证] +C --> G[数据库连接] +D --> H[UUID生成] +D --> I[时间处理] +E --> J[错误码] +``` + +**图示来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) +- [wallet_log.go](file://api/fund/v1/wallet_log.go) + +**节来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [record.go](file://internal/logic/sys_user_payment/record.go) + +## 性能考虑 +当前资金流水功能的性能考虑主要包括: +- 查询操作支持分页和排序,避免一次性加载大量数据 +- 使用数据库事务确保数据一致性 +- 通过索引优化查询性能(基于`UserId`和`TransactionType`字段) +- 使用连接池管理数据库连接 + +然而,部分控制器方法仍返回`gcode.CodeNotImplemented`,表明功能尚未完全实现,需要进一步优化和实现。 + +## 故障排除指南 +常见问题及解决方案: +1. **API返回501未实现错误**:检查控制器方法是否已实现,当前`fund_v1_menu_log_*`系列方法均返回未实现错误。 +2. **查询结果为空**:确认`UserId`和`TransactionType`参数是否正确,检查数据库中是否存在相关记录。 +3. **创建记录失败**:检查输入参数是否符合要求,特别是金额字段的精度和范围。 +4. **权限不足错误**:确保请求包含有效的认证令牌,用户具有相应权限。 + +**节来源** +- [fund_v1_menu_log_list.go](file://internal/controller/fund/fund_v1_menu_log_list.go) +- [fund_v1_menu_log_create.go](file://internal/controller/fund/fund_v1_menu_log_create.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) + +## 结论 +资金流水功能提供了创建、查询、更新和删除资金流水记录的基本框架,但部分功能尚未完全实现。建议优先实现控制器层的方法,完善错误处理机制,并添加单元测试确保功能的正确性和稳定性。同时,应考虑添加更多的查询条件和过滤选项,以满足实际业务需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金管理API.md b/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金管理API.md new file mode 100644 index 00000000..613f5c23 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/资金管理API/资金管理API.md @@ -0,0 +1,224 @@ +# 资金管理API + + +**本文档中引用的文件** +- [wallet.go](file://api/fund/v1/wallet.go) +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [fund_v1_wallet_update.go](file://internal/controller/fund/fund_v1_wallet_update.go) +- [fund_v1_wallet_delete.go](file://internal/controller/fund/fund_v1_wallet_delete.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本项目旨在为资金管理提供一套完整的API接口,涵盖钱包管理、资金流水记录等核心功能。系统通过模块化设计,实现了钱包的创建、查询、更新和删除操作,并支持资金流水的记录与查询。API设计遵循RESTful规范,采用分层架构确保系统的可维护性和可扩展性。通过事务处理机制保障资金操作的数据一致性,同时提供完善的错误处理和安全认证机制。 + +## 项目结构 +资金管理功能主要集中在`api/fund`和`internal/controller/fund`目录下,形成了清晰的接口定义与实现分离的架构。系统通过`v1`版本的API定义了钱包和资金流水的操作接口,控制器层实现了具体的业务逻辑,数据访问层则负责与数据库交互。 + +```mermaid +graph TB +subgraph "API层" +A[wallet.go] +B[wallet_log.go] +C[fund.go] +end +subgraph "控制器层" +D[fund_v1_wallet_create.go] +E[fund_v1_wallet_list.go] +F[fund_v1_wallet_update.go] +G[fund_v1_wallet_delete.go] +end +subgraph "数据访问层" +H[v_2_user_wallet.go] +I[v_2_user_wallet_log.go] +end +A --> D +B --> G +C --> D +C --> E +C --> F +C --> G +D --> H +E --> H +F --> H +G --> H +G --> I +``` + +**图示来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [fund_v1_wallet_update.go](file://internal/controller/fund/fund_v1_wallet_update.go) +- [fund_v1_wallet_delete.go](file://internal/controller/fund/fund_v1_wallet_delete.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + +**本节来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [wallet_log.go](file://api/fund/v1/wallet_log.go) +- [fund.go](file://api/fund/fund.go) + +## 核心组件 +资金管理API的核心组件包括钱包管理接口和资金流水记录接口。钱包管理接口提供了钱包的全生命周期管理功能,包括创建、查询、更新和删除操作。资金流水记录接口则负责记录所有与钱包相关的资金变动,确保资金操作的可追溯性。系统通过`IFundV1`接口定义了所有可用的操作,控制器层实现了这些接口的具体逻辑,数据访问层则通过DAO模式与数据库进行交互。 + +**本节来源** +- [fund.go](file://api/fund/fund.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + +## 架构概述 +系统采用典型的分层架构,分为API层、控制器层和数据访问层。API层定义了所有可用的接口和数据结构,控制器层实现了具体的业务逻辑,数据访问层负责与数据库的交互。这种分层设计确保了系统的高内聚低耦合,便于维护和扩展。 + +```mermaid +graph TD +A[客户端] --> B[HTTP请求] +B --> C[API网关] +C --> D[认证中间件] +D --> E[控制器层] +E --> F[业务逻辑] +F --> G[数据访问层] +G --> H[数据库] +H --> G +G --> F +F --> E +E --> C +C --> A +``` + +**图示来源** +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +## 详细组件分析 + +### 钱包管理分析 +钱包管理功能提供了完整的CRUD操作,支持钱包的创建、查询、更新和删除。每个操作都通过独立的控制器方法实现,确保了单一职责原则。系统通过上下文(Context)传递请求信息,支持分布式追踪和超时控制。 + +#### 钱包创建流程 +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : 创建钱包请求 +控制器->>控制器 : 验证请求参数 +控制器->>服务层 : 调用创建方法 +服务层->>数据库 : 插入钱包记录 +数据库-->>服务层 : 返回结果 +服务层-->>控制器 : 返回创建结果 +控制器-->>客户端 : 返回响应 +``` + +**图示来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +#### 钱包查询流程 +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据库 +客户端->>控制器 : 查询钱包请求 +控制器->>控制器 : 验证请求参数 +控制器->>服务层 : 调用查询方法 +服务层->>数据库 : 查询钱包记录 +数据库-->>服务层 : 返回钱包数据 +服务层-->>控制器 : 返回查询结果 +控制器-->>客户端 : 返回响应 +``` + +**图示来源** +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +**本节来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [fund_v1_wallet_update.go](file://internal/controller/fund/fund_v1_wallet_update.go) +- [fund_v1_wallet_delete.go](file://internal/controller/fund/fund_v1_wallet_delete.go) + +### 资金流水分析 +资金流水功能记录了所有与钱包相关的资金变动,包括充值、消费、转账等操作。每条流水记录都包含了操作类型、金额、时间戳等关键信息,确保了资金操作的可追溯性。 + +#### 资金流水记录流程 +```mermaid +flowchart TD +A[开始] --> B[接收资金操作请求] +B --> C[验证操作合法性] +C --> D{验证通过?} +D --> |是| E[开启数据库事务] +E --> F[更新钱包余额] +F --> G[创建资金流水记录] +G --> H[提交事务] +H --> I[返回成功] +D --> |否| J[返回错误] +J --> K[结束] +I --> K +``` + +**图示来源** +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + +**本节来源** +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + +## 依赖分析 +系统依赖关系清晰,各层之间通过接口进行通信,降低了耦合度。控制器层依赖于API层的接口定义和数据结构,同时依赖于数据访问层提供的DAO对象。数据访问层则直接依赖于数据库驱动和ORM框架。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[数据访问层] +C --> D[数据库] +B --> E[认证中间件] +B --> F[错误处理] +C --> G[事务管理] +``` + +**图示来源** +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +**本节来源** +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +## 性能考虑 +系统在设计时充分考虑了性能因素。通过数据库索引优化查询性能,使用连接池管理数据库连接,避免频繁创建和销毁连接的开销。对于高并发场景,系统支持通过配置调整连接池大小和超时设置。事务处理机制确保了数据一致性的同时,也需要注意事务的粒度控制,避免长时间持有锁导致性能下降。 + +## 故障排除指南 +当遇到API调用失败时,首先检查请求参数是否符合接口定义,特别是必填字段和数据类型。如果返回500错误,可能是服务端内部异常,需要查看服务日志获取详细错误信息。对于数据库相关错误,检查数据库连接是否正常,以及是否有足够的权限执行操作。在调试过程中,可以启用详细的日志记录来追踪请求处理流程。 + +**本节来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +## 结论 +资金管理API提供了一套完整且可靠的钱包管理和资金流水记录解决方案。通过清晰的分层架构和规范的接口设计,系统具有良好的可维护性和可扩展性。未来可以考虑增加更多的安全特性,如操作审计日志、多因素认证等,进一步提升系统的安全性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/资金管理API/钱包管理.md b/.qoder/repowiki/zh/content/API端点参考/资金管理API/钱包管理.md new file mode 100644 index 00000000..b0a567f2 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/资金管理API/钱包管理.md @@ -0,0 +1,249 @@ +# 钱包管理 + + +**本文档中引用的文件** +- [wallet.go](file://api/fund/v1/wallet.go) +- [fund.go](file://api/fund/fund.go) +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [fund_v1_wallet_update.go](file://internal/controller/fund/fund_v1_wallet_update.go) +- [fund_v1_wallet_delete.go](file://internal/controller/fund/fund_v1_wallet_delete.go) +- [fund_v1_wallet_list.go](file://internal/controller/fund/fund_v1_wallet_list.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [sys_user_payment_record.go](file://internal/model/sys_user_payment_record.go) +- [sys_payment.go](file://api/sys_payment/v1/sys_payment.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了钱包管理API的设计与实现,涵盖钱包的创建、更新、查询和删除等核心操作。系统通过RESTful接口提供完整的钱包生命周期管理功能,支持余额管理、状态控制和权限验证。文档深入解析了事务处理机制、并发控制策略和安全认证流程,为开发者提供全面的技术参考。 + +## 项目结构 +钱包管理功能主要分布在`api/fund`和`internal/service`目录下,通过分层架构实现接口定义、业务逻辑和数据访问的分离。核心功能模块包括钱包操作控制器、服务接口和数据模型,与系统其他模块通过标准接口进行集成。 + +```mermaid +graph TB +subgraph "API层" +A[wallet.go] +B[fund.go] +end +subgraph "控制层" +C[fund_v1_wallet_create.go] +D[fund_v1_wallet_update.go] +E[fund_v1_wallet_delete.go] +F[fund_v1_wallet_list.go] +end +subgraph "服务层" +G[sys_user_payment.go] +H[sys_user_payment_record.go] +end +subgraph "数据层" +I[v_2_user_wallet.go] +J[v_2_user_wallet_log.go] +end +A --> C +B --> C +C --> G +G --> I +G --> J +``` + +**图示来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [fund.go](file://api/fund/fund.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +**章节来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [fund.go](file://api/fund/fund.go) + +## 核心组件 +钱包管理系统的实现基于分层架构,包含接口定义、业务逻辑和服务集成三个核心部分。系统通过GoFrame框架实现RESTful API,采用事务机制确保数据一致性,并通过权限验证中间件保障接口安全。 + +**章节来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) + +## 架构概述 +系统采用典型的分层架构设计,从上至下分为API接口层、业务控制层、服务逻辑层和数据访问层。各层之间通过明确定义的接口进行通信,确保系统的可维护性和可扩展性。 + +```mermaid +graph TD +A[客户端] --> B[HTTP请求] +B --> C[API网关] +C --> D[权限验证中间件] +D --> E[钱包控制器] +E --> F[钱包服务] +F --> G[事务管理] +G --> H[数据库操作] +H --> I[用户钱包表] +H --> J[钱包日志表] +I --> K[余额计算] +J --> L[操作审计] +``` + +**图示来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +## 详细组件分析 + +### 钱包操作分析 +钱包管理组件提供完整的CRUD操作,每个操作都经过严格的权限验证和事务控制。系统通过统一的错误处理机制返回标准化的响应,确保客户端能够正确处理各种场景。 + +#### 对象导向组件 +```mermaid +classDiagram +class WalletCreateReq { ++string path : "/auth/wallet/create" ++string method : "post" ++string summary : "创建钱包信息" +} +class WalletUpdateReq { ++string path : "/auth/wallet/update" ++string method : "post" ++string summary : "修改钱包信息" ++int id +} +class WalletDeleteReq { ++string path : "/auth/wallet/delete" ++string method : "delete" ++string summary : "删除钱包信息" ++int id +} +class WalletListReq { ++string path : "/auth/wallet/getList" ++string method : "get" ++string summary : "获取钱包信息" ++int page ++int limit +} +class SysUserPaymentInput { ++string userId +} +class SysUserPaymentRechargeOrConsumeInput { ++string userId ++string orderNo ++decimal amount ++string remark ++int transactionType +} +WalletCreateReq --> SysUserPaymentInput : "包含" +WalletUpdateReq --> SysUserPaymentInput : "包含" +WalletDeleteReq --> SysUserPaymentInput : "包含" +WalletListReq --> SysUserPaymentInput : "包含" +SysUserPaymentRechargeOrConsumeInput --> SysUserPaymentInput : "扩展" +``` + +**图示来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [sys_user_payment_record.go](file://internal/model/sys_user_payment_record.go) + +#### API/服务组件 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "钱包控制器" +participant Service as "钱包服务" +participant DAO as "数据访问对象" +participant DB as "数据库" +Client->>Controller : POST /auth/wallet/create +Controller->>Controller : 权限验证 +Controller->>Service : 调用Add方法 +Service->>DAO : 开启事务 +DAO->>DB : 检查用户是否存在 +DB-->>DAO : 返回结果 +DAO->>DB : 插入新钱包记录 +DB-->>DAO : 返回插入ID +DAO->>Service : 提交事务 +Service-->>Controller : 返回成功 +Controller-->>Client : 返回创建结果 +Note over Client,DB : 钱包创建流程 +``` + +**图示来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +#### 复杂逻辑组件 +```mermaid +flowchart TD +Start([开始]) --> AuthCheck["权限验证"] +AuthCheck --> AuthValid{"验证通过?"} +AuthValid --> |否| ReturnError["返回401错误"] +AuthValid --> |是| TransactionStart["开启事务"] +TransactionStart --> BalanceCheck["检查余额"] +BalanceCheck --> IsEnough{"余额充足?"} +IsEnough --> |否| HandleInsufficient["处理余额不足"] +IsEnough --> |是| UpdateBalance["更新余额"] +UpdateBalance --> CreateLog["创建操作日志"] +CreateLog --> CommitTransaction["提交事务"] +CommitTransaction --> ReturnSuccess["返回成功"] +HandleInsufficient --> RollbackTransaction["回滚事务"] +RollbackTransaction --> ReturnError +ReturnSuccess --> End([结束]) +ReturnError --> End +``` + +**图示来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [v_2_user_wallet_log.go](file://internal/systemV2/dao/internal/v_2_user_wallet_log.go) + +**章节来源** +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [sys_user_payment_record.go](file://internal/model/sys_user_payment_record.go) + +## 依赖分析 +钱包管理系统依赖于多个核心组件,包括权限验证、数据库访问和事务管理。系统通过接口抽象降低耦合度,确保各模块可以独立开发和测试。 + +```mermaid +graph TD +A[钱包管理] --> B[权限验证] +A --> C[数据库访问] +A --> D[事务管理] +A --> E[日志记录] +B --> F[用户认证服务] +C --> G[GoFrame ORM] +D --> H[事务协调器] +E --> I[审计日志] +F --> J[用户信息表] +G --> K[用户钱包表] +H --> L[事务日志] +I --> M[操作记录表] +``` + +**图示来源** +- [fund.go](file://api/fund/fund.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) +- [v_2_user_wallet.go](file://internal/systemV2/dao/internal/v_2_user_wallet.go) + +**章节来源** +- [fund.go](file://api/fund/fund.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) + +## 性能考虑 +系统在设计时充分考虑了性能优化,采用缓存机制减少数据库访问,通过批量操作提高处理效率。建议在高并发场景下合理配置数据库连接池和缓存策略,以确保系统的稳定性和响应速度。 + +## 故障排除指南 +当遇到钱包操作失败时,应首先检查权限验证结果和输入参数的有效性。对于事务相关的错误,需要查看数据库日志以确定具体原因。系统提供了详细的错误码和消息,帮助快速定位和解决问题。 + +**章节来源** +- [fund_v1_wallet_create.go](file://internal/controller/fund/fund_v1_wallet_create.go) +- [sys_user_payment.go](file://internal/service/sys_user_payment.go) + +## 结论 +钱包管理系统通过清晰的分层架构和严谨的事务控制,提供了稳定可靠的钱包管理功能。系统设计充分考虑了安全性、性能和可维护性,为上层应用提供了坚实的基础。建议在使用时遵循最佳实践,合理配置系统参数,以充分发挥系统潜力。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/风控限制API/IP限制API.md b/.qoder/repowiki/zh/content/API端点参考/风控限制API/IP限制API.md new file mode 100644 index 00000000..27708721 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/风控限制API/IP限制API.md @@ -0,0 +1,458 @@ +# IP限制API + + +**本文档引用文件** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [entity.go](file://internal/model/entity/v_1_restrict_ip_order_access.go) +- [do.go](file://internal/model/do/v_1_restrict_ip_order_access.go) +- [restriction.go](file://internal/model/restriction.go) +- [restriction.go](file://internal/consts/restriction.go) +- [cache.go](file://utility/cache/cache.go) + + +## 目录 +1. [简介](#简介) +2. [核心功能](#核心功能) +3. [IP访问控制端点](#ip访问控制端点) +4. [IP匹配算法](#ip匹配算法) +5. [缓存策略](#缓存策略) +6. [数据库设计](#数据库设计) +7. [错误处理](#错误处理) +8. [性能优化](#性能优化) +9. [集成关系](#集成关系) +10. [客户端调用示例](#客户端调用示例) +11. [常见问题](#常见问题) + +## 简介 +IP限制API提供了一套完整的IP访问控制机制,用于管理系统对特定IP地址的访问权限。该系统支持基于商户部署策略的多维度限制,包括IP、设备、卡密和代理检测等多种控制方式。系统通过Redis缓存和数据库持久化相结合的方式,实现了高性能的IP状态管理。 + +## 核心功能 +IP限制系统提供以下核心功能: +- IP白名单/黑名单管理 +- 基于省份的区域访问控制 +- 设备级访问限制 +- 卡密关联的访问控制 +- 代理使用检测 +- 访问记录持久化存储 + +**IP限制核心功能组件关系图** + +```mermaid +graph TD +A[API控制器] --> B[服务接口] +B --> C[业务逻辑] +C --> D[数据访问层] +D --> E[数据库] +C --> F[Redis缓存] +G[商户部署策略] --> C +H[IP匹配算法] --> C +I[访问记录] --> D +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) +- [restriction.go](file://internal/logic/restriction/restriction.go#L1-L174) + +## IP访问控制端点 + +### 端点信息 +- **HTTP方法**: POST +- **URL模式**: `/api/restriction/v1/check_ip_allowed` +- **认证机制**: 基于商户部署ID的认证 +- **权限控制**: 通过商户部署策略配置的限制规则 + +### 请求参数 +请求体包含以下字段: +- `orderNo`: 订单号 +- `ip`: 待检查的IP地址 +- `deviceId`: 设备ID +- `cardPass`: 卡密 +- `merchantDeployID`: 商户部署ID + +### 响应结构 +响应体包含以下字段: +- `isAllowed`: 布尔值,表示IP是否被允许访问 + +### 访问控制流程 +```mermaid +flowchart TD +Start([开始]) --> GetStrategy["获取商户限制策略"] +GetStrategy --> StrategyValid{"策略有效?"} +StrategyValid --> |否| ReturnError["返回内部错误"] +StrategyValid --> |是| CheckCardPass["检查卡密限制"] +CheckCardPass --> CardPassRestricted{"卡密受限?"} +CardPassRestricted --> |是| ReturnFalse["返回不允许"] +CardPassRestricted --> |否| CheckDevice["检查设备限制"] +CheckDevice --> DeviceRestricted{"设备受限?"} +DeviceRestricted --> |是| ReturnFalse +DeviceRestricted --> |否| CheckProxy["检查代理使用"] +CheckProxy --> ProxyUsed{"使用代理?"} +ProxyUsed --> |是| ReturnFalse +ProxyUsed --> |否| CheckPublicIP["检查公网IP"] +CheckPublicIP --> IsPublic{"公网IP?"} +IsPublic --> |是| CheckIPExist["检查IP是否受限"] +IsPublic --> |否| CheckInternalIP["检查内网IP策略"] +CheckInternalIP --> RestrictInternal{"限制内网IP?"} +RestrictInternal --> |是| ReturnFalse +RestrictInternal --> |否| ReturnTrue["返回允许"] +CheckIPExist --> IPExist{"IP受限?"} +IPExist --> |是| ReturnFalse +IPExist --> |否| CheckArea["检查区域限制"] +CheckArea --> AreaConfigured{"配置区域?"} +AreaConfigured --> |是| CheckAreaAllowed["检查IP是否在允许区域"] +AreaConfigured --> |否| ReturnTrue +CheckAreaAllowed --> AreaAllowed{"在允许区域?"} +AreaAllowed --> |是| ReturnTrue +AreaAllowed --> |否| ReturnFalse +ReturnTrue --> End([结束]) +ReturnFalse --> End +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +## IP匹配算法 + +### 算法实现 +IP匹配算法主要通过`CheckIPIsAllowed`和`IsInProvince`方法实现,其核心逻辑如下: + +```mermaid +flowchart TD +Start([开始]) --> ParseIP["解析IP地址"] +ParseIP --> IsPublicIP["判断是否为公网IP"] +IsPublicIP --> |否| ReturnTrue["返回允许"] +IsPublicIP --> |是| GetIPRecord["获取IP记录"] +GetIPRecord --> RecordExist{"记录存在?"} +RecordExist --> |否| ReturnFalse["返回不允许"] +RecordExist --> |是| IsPublic{"公网地址?"} +IsPublic --> |否| ReturnFalse +IsPublic --> |是| CheckProvince["检查省份"] +CheckProvince --> IsAlpha{"英文省份?"} +IsAlpha --> |是| ConvertToPinyin["转换为拼音"] +IsAlpha --> |否| CompareProvince["直接比较"] +ConvertToPinyin --> CompareProvince +CompareProvince --> InProvince{"在允许省份?"} +InProvince --> |是| ReturnTrue +InProvince --> |否| CheckOverseas["检查海外"] +CheckOverseas --> IsOverseas{"是海外?"} +IsOverseas --> |是| ReturnTrue +IsOverseas --> |否| ReturnFalse +ReturnTrue --> End([结束]) +ReturnFalse --> End +``` + +**图示来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L30-L65) + +### 省份匹配逻辑 +系统支持34个省级行政区的匹配,包括: +- 23个省 +- 5个自治区 +- 4个直辖市 +- 2个特别行政区 + +匹配时支持中文和拼音两种格式,系统会自动进行转换和匹配。 + +**本节来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L30-L65) +- [consts.go](file://utility/integration/restriction/consts.go#L17-L23) + +## 缓存策略 + +### Redis缓存实现 +系统使用Redis作为缓存层,通过`utility/cache/cache.go`文件中的`Cache`结构体实现缓存操作。 + +```mermaid +classDiagram +class Cache { ++*gcache.Cache ++Incr(ctx, key, duration) ++Decr(ctx, key, duration) ++GetPrefixKeyNum(ctx, key) ++SaveTrace(ctx, key) ++GetTrace(ctx, key) ++GetTraceID(ctx) ++DeleteTrace(ctx, key) +} +class PrefixEnum { ++RedeemType ++RedeemWithPaymentType ++RedeemAppleAccountLimitedType ++AccountLimiterType ++JDAccountQueryCache ++JDAccountQueryBalanceWithCookie ++WalmartAccountQueryCache ++WalmartAccountQueryBalanceWithCookie ++AppleMachineAccount ++AppleDuplicatedOrder ++PrefixTrace ++Key(key) +} +Cache --> PrefixEnum : "使用" +``` + +**图示来源** +- [cache.go](file://utility/cache/cache.go#L1-L127) + +### 缓存键设计 +系统采用前缀+键的设计模式,主要缓存键包括: +- `redeem_type`: 兑换类型缓存 +- `account_limiter_type`: 账户限流类型 +- `jd_account_query_cache`: 京东账户查询缓存 +- `walmart_account_query_cache`: 沃尔玛账户查询缓存 +- `apple_duplicated_order`: 苹果重复订单 +- `trace`: 追踪信息 + +**本节来源** +- [cache.go](file://utility/cache/cache.go#L1-L127) + +## 数据库设计 + +### 核心表结构 +系统使用两个核心表来存储IP限制相关信息: + +#### 限制IP记录表 (restrict_ip_record) +| 字段名 | 类型 | 描述 | +|--------|------|------| +| id | uint | 主键 | +| ip | string | IP地址 | +| ip_province | string | IP所在省份 | +| is_public | bool | 是否为公网地址 | +| raw_data | string | 原始数据 | +| created_at | *gtime.Time | 创建时间 | +| updated_at | *gtime.Time | 更新时间 | +| deleted_at | *gtime.Time | 删除时间 | + +#### IP订单访问表 (restrict_ip_order_access) +| 字段名 | 类型 | 描述 | +|--------|------|------| +| id | uint | 主键 | +| restrict_ip_id | int | 关联的IP地址 | +| order_no | string | 订单号 | +| card_pass | string | 卡密 | +| ip | string | IP地址 | +| status | int | 状态 | +| restrict_strategy | string | 限制策略 | +| device_id | string | 设备ID | +| created_at | *gtime.Time | 创建时间 | +| updated_at | *gtime.Time | 更新时间 | +| deleted_at | *gtime.Time | 删除时间 | + +### 表关系 +```mermaid +erDiagram +V1RestrictIpRecord ||--o{ V1RestrictIpOrderAccess : "包含" +V1RestrictIpRecord { +uint id PK +string ip +string ip_province +bool is_public +string raw_data +*gtime.Time created_at +*gtime.Time updated_at +*gtime.Time deleted_at +} +V1RestrictIpOrderAccess { +uint id PK +int restrict_ip_id FK +string order_no +string card_pass +string ip +int status +string restrict_strategy +string device_id +*gtime.Time created_at +*gtime.Time updated_at +*gtime.Time deleted_at +} +``` + +**图示来源** +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go#L1-L28) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go#L1-L27) +- [entity.go](file://internal/model/entity/v_1_restrict_ip_record.go#L1-L22) +- [entity.go](file://internal/model/entity/v_1_restrict_ip_order_access.go#L1-L25) + +**本节来源** +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go#L1-L28) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go#L1-L27) + +## 错误处理 + +### 错误处理机制 +系统采用统一的错误处理机制,主要通过`errHandler`包实现。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "业务逻辑" +Client->>Controller : 发送请求 +Controller->>Service : 调用服务 +Service->>Logic : 执行业务逻辑 +alt 执行成功 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回成功响应 +else 执行失败 +Logic--xService : 抛出错误 +Service--xController : 包装错误 +Controller-->>Client : 返回错误响应 +end +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +### 错误码 +系统定义了以下错误码: +- `gcode.CodeInternalError`: 内部错误,当获取限制策略失败时返回 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [errHandler.go](file://internal/errHandler/handler.go) + +## 性能优化 + +### 事务处理 +系统在添加IP限制记录时使用数据库事务,确保数据一致性: + +```go +err = config.GetDatabaseV1().Ctx(ctx).Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 事务内的操作 + return nil +}) +``` + +### 缓存优化 +系统通过Redis缓存频繁访问的数据,减少数据库查询次数。 + +### 并发处理 +在省份匹配时,系统使用并发处理提高性能: + +```go +slice.ForEachConcurrent(allProvinceListCopier, func(index int, item string) { + allProvinceListCopier[index] = gstr.ToLower(pinyin.NewDict().Convert(item, "").None()) +}, 5) +``` + +**本节来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L67-L174) +- [cache.go](file://utility/cache/cache.go#L1-L127) + +## 集成关系 + +### 系统集成架构 +```mermaid +graph TD +A[前端应用] --> B[API网关] +B --> C[IP限制API] +C --> D[商户部署服务] +C --> E[订单服务] +C --> F[Redis缓存] +C --> G[数据库] +D --> H[配置中心] +E --> I[支付服务] +G --> J[备份系统] +subgraph "核心服务" +C +D +E +end +subgraph "数据存储" +F +G +J +end +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +### 依赖服务 +IP限制API依赖以下服务: +- 商户部署信息服务:获取限制策略 +- 订单服务:更新订单状态 +- Redis服务:缓存IP状态 +- 数据库服务:持久化存储访问记录 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +## 客户端调用示例 + +### Go语言调用示例 +```go +// 创建请求 +req := &v1.CheckIPAllowedReq{ + OrderNo: "ORDER123456", + Ip: "192.168.1.1", + DeviceId: "DEVICE789", + CardPass: "CARDPASS001", + MerchantDeployID: 1, +} + +// 调用API +res, err := controller.CheckIPAllowed(context.Background(), req) +if err != nil { + log.Printf("检查IP失败: %v", err) + return +} + +// 处理结果 +if res.IsAllowed { + fmt.Println("IP允许访问") +} else { + fmt.Println("IP被限制访问") +} +``` + +### HTTP调用示例 +```bash +curl -X POST https://api.example.com/api/restriction/v1/check_ip_allowed \ + -H "Content-Type: application/json" \ + -d '{ + "orderNo": "ORDER123456", + "ip": "192.168.1.1", + "deviceId": "DEVICE789", + "cardPass": "CARDPASS001", + "merchantDeployID": 1 + }' +``` + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +## 常见问题 + +### Q1: 如何配置IP白名单? +A: IP白名单通过商户部署策略中的`RestrictArea`字段配置,系统会检查IP是否在允许的区域内。 + +### Q2: 内网IP如何处理? +A: 系统会检测IP是否为内网IP,如果配置了`IsRestrictInternalIp`为false,则允许内网IP访问。 + +### Q3: 如何查看IP限制记录? +A: 可以通过`GetRestrictRecordByIP`方法查询特定IP的所有限制记录。 + +### Q4: 系统如何处理代理? +A: 系统通过`CheckIsDeviceUseProxy`方法检测设备是否使用代理,如果检测到使用代理且策略要求限制,则拒绝访问。 + +### Q5: 缓存失效时间如何设置? +A: 系统使用Redis默认的缓存策略,具体失效时间根据不同的缓存键而定。 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) +- [restriction.go](file://internal/logic/restriction/restriction.go#L1-L174) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/风控限制API/地域限制API.md b/.qoder/repowiki/zh/content/API端点参考/风控限制API/地域限制API.md new file mode 100644 index 00000000..bc2bb3bf --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/风控限制API/地域限制API.md @@ -0,0 +1,278 @@ +# 地域限制API + + +**本文档引用文件** +- [province.go](file://api/restriction/v1/province.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/model/restriction.go) +- [impl.go](file://utility/integration/restriction/impl.go) +- [models.go](file://utility/integration/restriction/models.go) +- [location.go](file://utility/integration/restriction/location.go) +- [cache.go](file://utility/cache/cache.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/consts/restriction.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了地域限制API的功能实现,重点涵盖省份查询和地域控制机制。文档深入解析了`restriction_v1_query_all_province`端点的实现细节,包括HTTP方法、请求响应模式和数据格式。同时说明了如何通过省份信息实施地域限制策略,并提供了获取所有支持省份列表的使用示例。文档还涵盖了地域数据模型、查询性能优化(如缓存机制)、与IP地理位置服务的集成方式,以及该功能在订单拦截和访问控制中的应用场景。 + +## 项目结构 +地域限制功能主要分布在API层、控制器层、服务层和集成层。API定义位于`api/restriction/v1`目录,控制器实现位于`internal/controller/restriction`目录,核心业务逻辑在`internal/logic/restriction`包中,IP地理位置查询集成在`utility/integration/restriction`包中。 + +```mermaid +graph TD +subgraph "API层" +A[province.go] +B[restriction.go] +end +subgraph "控制器层" +C[restriction_v1_query_all_province.go] +D[restriction_v1_check_ip_allowed.go] +end +subgraph "服务层" +E[restriction.go] +end +subgraph "逻辑层" +F[restriction.go] +end +subgraph "模型层" +G[restriction.go] +end +subgraph "集成层" +H[impl.go] +I[models.go] +J[location.go] +end +A --> C +B --> C +C --> E +E --> F +F --> G +H --> F +I --> H +J --> H +``` + +**图示来源** +- [province.go](file://api/restriction/v1/province.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/model/restriction.go) +- [impl.go](file://utility/integration/restriction/impl.go) +- [models.go](file://utility/integration/restriction/models.go) +- [location.go](file://utility/integration/restriction/location.go) + +**本节来源** +- [api/restriction/v1/province.go](file://api/restriction/v1/province.go) +- [internal/controller/restriction/restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) + +## 核心组件 +地域限制API的核心组件包括省份查询接口、IP地域检查服务、IP地理位置集成和限制策略执行。`QueryAllProvince`端点提供获取所有支持省份列表的功能,`CheckIPAllowed`端点实现基于省份的访问控制。系统通过集成多个IP地理位置服务提供商来确保查询的准确性和可靠性,并利用缓存机制优化查询性能。 + +**本节来源** +- [province.go](file://api/restriction/v1/province.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) + +## 架构概述 +地域限制系统采用分层架构设计,从API接口到数据访问层清晰分离。系统通过RESTful API接收请求,由控制器处理并调用服务层,服务层协调业务逻辑层和数据访问层完成具体操作。IP地理位置查询通过适配器模式集成多个第三方服务,确保高可用性和容错能力。 + +```mermaid +graph TB +subgraph "客户端" +Client[客户端应用] +end +subgraph "API网关" +API[RESTful API] +end +subgraph "业务逻辑" +Controller[控制器层] +Service[服务层] +Logic[业务逻辑层] +end +subgraph "外部集成" +IPGeo[IP地理位置服务] +Cache[缓存系统] +Database[数据库] +end +Client --> API +API --> Controller +Controller --> Service +Service --> Logic +Logic --> IPGeo +Logic --> Cache +Logic --> Database +Cache --> Logic +Database --> Logic +``` + +**图示来源** +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +## 详细组件分析 + +### 省份查询组件分析 +省份查询功能通过`restriction_v1_query_all_province`端点实现,提供获取所有支持省份列表的服务。该功能在地域限制策略中作为基础数据支持,用于定义允许或禁止访问的地理区域。 + +#### 对象导向组件: +```mermaid +classDiagram +class QueryAllProvinceReq { ++string path "/restriction/location/getAllProvince" ++string tags "限制" ++string method "get" ++string summary "获取所有的地理位置" +} +class QueryAllProvinceRes { ++CommonDataRes~string~ CommonDataRes +} +class CommonDataRes~T~ { ++int code ++string message ++T data +} +QueryAllProvinceReq --> QueryAllProvinceRes : "返回" +QueryAllProvinceRes --> CommonDataRes~string~ : "泛型继承" +``` + +**图示来源** +- [province.go](file://api/restriction/v1/province.go) + +#### API服务组件: +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "ControllerV1" +participant Service as "Restriction服务" +participant Logic as "sRestriction逻辑" +Client->>Controller : GET /restriction/location/getAllProvince +Controller->>Service : QueryAllProvince(ctx, req) +Service->>Logic : GetAllProvince(ctx) +Logic-->>Service : 返回省份列表 +Service-->>Controller : 构造响应 +Controller-->>Client : 返回JSON响应 +``` + +**图示来源** +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +### 地域控制组件分析 +地域控制功能通过`CheckIPAllowed`端点实现,用于检查特定IP地址是否被允许访问。该功能结合商户部署策略和IP地理位置信息,决定是否允许请求通过。 + +#### 复杂逻辑组件: +```mermaid +flowchart TD +Start([开始]) --> GetStrategy["获取商户部署策略"] +GetStrategy --> CheckCardPass{"卡密限制启用?"} +CheckCardPass --> |是| CheckCardRestrict["检查卡密限制记录"] +CheckCardRestrict --> IsCardRestricted{"存在限制记录?"} +IsCardRestricted --> |是| ReturnFalse["返回不允许"] +CheckCardPass --> |否| CheckDevice{"设备限制启用?"} +CheckDevice --> |是| CheckDeviceRestrict["检查设备限制"] +CheckDeviceRestrict --> IsDeviceRestricted{"设备被限制?"} +IsDeviceRestricted --> |是| ReturnFalse +CheckDevice --> |否| CheckProxy{"代理限制启用?"} +CheckProxy --> |是| CheckProxyUsage["检查是否使用代理"] +CheckProxyUsage --> IsUsingProxy{"使用代理?"} +IsUsingProxy --> |是| ReturnFalse +CheckProxy --> |否| CheckIP{"IP限制启用?"} +CheckIP --> |是| CheckIPRestrict["检查IP限制记录"] +CheckIPRestrict --> IsIPRestricted{"IP被限制?"} +IsIPRestricted --> |是| ReturnFalse +CheckIP --> |否| CheckInternalIP{"内网IP?"} +CheckInternalIP --> |是| CheckInternalSetting{"限制内网IP?"} +CheckInternalSetting --> |否| ReturnTrue["返回允许"] +CheckInternalIP --> |否| CheckArea{"有地域限制?"} +CheckArea --> |是| CheckProvince["检查IP所在省份"] +CheckProvince --> IsInRestrictedArea{"在限制区域?"} +IsInRestrictedArea --> |是| ReturnFalse +CheckArea --> |否| ReturnTrue +ReturnFalse --> End([结束]) +ReturnTrue --> End +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +**本节来源** +- [province.go](file://api/restriction/v1/province.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +## 依赖分析 +地域限制系统依赖多个内部和外部组件。内部依赖包括服务注册机制、数据库访问、错误处理和配置管理。外部依赖主要为多个IP地理位置查询服务提供商,系统通过集成多个服务商确保查询的可靠性和容错能力。 + +```mermaid +graph TD +RestrictionAPI --> ServiceLayer +ServiceLayer --> LogicLayer +LogicLayer --> Database +LogicLayer --> Cache +LogicLayer --> IPGeoServices +IPGeoServices --> CSDN +IPGeoServices --> PCOnline +IPGeoServices --> OlTools +IPGeoServices --> IdCd +IPGeoServices --> MeiTu +IPGeoServices --> Vo +IPGeoServices --> DBIP +IPGeoServices --> QJQQ +IPGeoServices --> IQIYI +IPGeoServices --> IP66 +Cache --> Redis +Database --> MySQL +``` + +**图示来源** +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [impl.go](file://utility/integration/restriction/impl.go) +- [cache.go](file://utility/cache/cache.go) + +**本节来源** +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [impl.go](file://utility/integration/restriction/impl.go) +- [cache.go](file://utility/cache/cache.go) + +## 性能考虑 +地域限制系统的性能优化主要体现在缓存机制和IP地理位置查询的容错设计上。系统通过Redis缓存频繁访问的数据,减少数据库查询压力。IP地理位置查询采用随机选择和重试机制,确保在某个服务不可用时能够自动切换到其他服务,提高系统的可用性和响应速度。 + +**本节来源** +- [cache.go](file://utility/cache/cache.go) +- [location.go](file://utility/integration/restriction/location.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +## 故障排除指南 +在使用地域限制API时可能遇到的常见问题包括IP地理位置查询失败、缓存不一致和策略配置错误。建议首先检查网络连接是否正常,确认第三方IP地理位置服务是否可用。对于缓存问题,可以尝试清除相关缓存键。策略配置问题需要检查商户部署配置中的限制设置是否正确。 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [impl.go](file://utility/integration/restriction/impl.go) + +## 结论 +地域限制API提供了一套完整的地理位置控制解决方案,通过省份查询和IP检查功能实现了灵活的访问控制策略。系统设计考虑了高可用性和性能优化,通过集成多个IP地理位置服务提供商和使用缓存机制,确保了服务的稳定性和响应速度。该功能在订单拦截和访问控制场景中具有重要应用价值。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/风控限制API/用户信息收集API.md b/.qoder/repowiki/zh/content/API端点参考/风控限制API/用户信息收集API.md new file mode 100644 index 00000000..7e627687 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/风控限制API/用户信息收集API.md @@ -0,0 +1,231 @@ +# 用户信息收集API + + +**本文档引用文件** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/service/restriction.go) +- [user_info.go](file://internal/model/user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_record.go](file://internal/dao/internal/v_1_restrict_ip_record.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了用户信息收集API的技术实现,重点介绍restraint_v1_user_info_collection端点的功能。该接口用于收集用户设备信息和访问行为数据,为风控决策提供支持。文档涵盖HTTP方法、请求参数结构、数据验证规则、响应模式、数据隐私保护措施、信息加密传输、存储安全策略以及与风控规则引擎的集成方式。同时说明该功能在反欺诈和异常行为检测中的应用,并提供性能优化建议。 + +## 项目结构 +用户信息收集功能主要分布在API层、控制器层、服务层和数据访问层。核心功能位于restriction模块中,涉及用户设备信息收集、IP记录管理、访问行为分析等。 + +```mermaid +graph TB +subgraph "API层" +collection[api/restriction/v1/collection.go] +end +subgraph "控制器层" +controller[internal/controller/restriction/restriction_v1_user_info_collection.go] +end +subgraph "服务层" +service[internal/service/restriction.go] +end +subgraph "逻辑层" +logic[internal/logic/restriction/restriction.go] +end +subgraph "数据访问层" +dao[internal/dao/v_1_user_info.go] +record[internal/dao/internal/v_1_restrict_*] +end +collection --> controller +controller --> service +service --> logic +logic --> dao +logic --> record +``` + +**Diagram sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +**Section sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) + +## 核心组件 +用户信息收集API的核心组件包括请求处理、数据解密、签名验证、设备信息存储和IP记录管理。系统通过加密传输保护用户隐私,使用AES-CBC加密算法确保数据安全,并通过MD5签名验证保证数据完整性。 + +**Section sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [aes_ecb.go](file://utility/verify/aes_ecb.go) + +## 架构概述 +用户信息收集系统的架构分为四个主要层次:API接口层负责接收客户端请求,控制器层处理业务逻辑,服务层提供统一的服务接口,数据访问层负责与数据库交互。系统通过分层设计实现了关注点分离,提高了代码的可维护性和可扩展性。 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> Database[(数据库)] +style Client fill:#f9f,stroke:#333 +style Database fill:#ccf,stroke:#333 +``` + +**Diagram sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/service/restriction.go) + +## 详细组件分析 + +### 用户信息收集分析 +用户信息收集功能通过POST请求接收加密的用户行为数据,经过解密和验证后存储到数据库中,用于后续的风控分析。 + +#### 请求处理流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DAO as "数据访问层" +Client->>API : POST /restriction/collection/userInfo +API->>Controller : 转发请求 +Controller->>Controller : AES-CBC解密数据 +Controller->>Controller : MD5签名验证 +Controller->>Service : 调用SaveDeviceInfo +Service->>DAO : 存储设备信息 +DAO-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 响应结果 +``` + +**Diagram sources** +- [collection.go](file://api/restriction/v1/collection.go#L1-L23) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) + +#### 数据模型 +```mermaid +classDiagram +class UserInfoCollectionReq { ++string Data +} +class responseModel { ++[]string IPs ++string DeviceID ++string DeviceModel ++string UserAgent +} +class responseWithSign { ++string Sign +} +class RestrictionDeviceInput { ++[]string IPs ++string RemoteIP ++string DeviceID ++string DeviceModel ++string UserAgent +} +UserInfoCollectionReq --> responseWithSign : "解密后" +responseWithSign --> responseModel : "组合" +responseModel --> RestrictionDeviceInput : "转换" +``` + +**Diagram sources** +- [collection.go](file://api/restriction/v1/collection.go#L1-L23) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [restriction.go](file://internal/model/restriction.go#L11-L17) + +**Section sources** +- [collection.go](file://api/restriction/v1/collection.go#L1-L23) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) + +### 数据验证与安全 +系统实现了多层次的数据验证和安全保护机制,确保用户信息的完整性和安全性。 + +#### 数据验证流程 +```mermaid +flowchart TD +Start([开始]) --> Decrypt["AES-CBC解密"] +Decrypt --> DecryptSuccess{"解密成功?"} +DecryptSuccess --> |否| ReturnError["返回验证失败"] +DecryptSuccess --> |是| ParseJSON["解析JSON"] +ParseJSON --> ParseSuccess{"解析成功?"} +ParseSuccess --> |否| ReturnError +ParseSuccess --> |是| VerifySign["验证MD5签名"] +VerifySign --> SignValid{"签名有效?"} +SignValid --> |否| ReturnError +SignValid --> |是| CheckIP["检查IP一致性"] +CheckIP --> Process["处理业务逻辑"] +Process --> End([结束]) +ReturnError --> End +``` + +**Diagram sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L0-L90) + +## 依赖分析 +用户信息收集功能依赖于多个核心组件和服务,形成了完整的依赖链。 + +```mermaid +graph LR +collection[API定义] --> controller[控制器] +controller --> service[服务接口] +service --> logic[业务逻辑] +logic --> dao[数据访问] +dao --> database[(数据库)] +controller --> crypto[加密组件] +crypto --> aes[AES-CBC] +crypto --> md5[MD5] +logic --> config[数据库配置] +logic --> utils[工具库] +``` + +**Diagram sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [aes_ecb.go](file://utility/verify/aes_ecb.go) + +**Section sources** +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +## 性能考虑 +用户信息收集API在设计时考虑了性能优化,通过合理的缓存策略、数据库索引和异步处理机制确保系统的高效运行。建议在高并发场景下使用连接池和批量处理来进一步提升性能。 + +## 故障排除指南 +当用户信息收集API出现问题时,可按照以下步骤进行排查: +1. 检查请求数据是否正确加密 +2. 验证MD5签名是否匹配 +3. 确认数据库连接是否正常 +4. 检查AES密钥和IV是否正确 +5. 查看日志中的错误信息 + +**Section sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L0-L90) + +## 结论 +用户信息收集API通过安全的加密传输和严格的验证机制,有效地收集用户设备信息和访问行为数据,为风控决策提供了可靠的数据支持。系统设计合理,层次分明,具有良好的可维护性和扩展性,能够满足反欺诈和异常行为检测的需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/API端点参考/风控限制API/风控限制API.md b/.qoder/repowiki/zh/content/API端点参考/风控限制API/风控限制API.md new file mode 100644 index 00000000..6f8928f5 --- /dev/null +++ b/.qoder/repowiki/zh/content/API端点参考/风控限制API/风控限制API.md @@ -0,0 +1,258 @@ +# 风控限制API + + +**本文档中引用的文件** +- [province.go](file://api/restriction/v1/province.go) +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction_v1_block_order.go](file://internal/controller/restriction/restriction_v1_block_order.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) +- [consts.go](file://utility/integration/restriction/consts.go) +- [impl.go](file://utility/integration/restriction/impl.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了风控限制API的功能实现,涵盖IP限制、地域限制和用户信息收集等核心功能。系统通过多级风控策略实现对用户访问行为的精细化控制,包括基于IP地理位置的访问控制、设备识别与限制、卡密关联限制等功能。API设计遵循RESTful规范,提供清晰的端点定义和安全的数据交互机制。 + +## 项目结构 +风控限制功能主要分布在API层、控制器层、服务逻辑层和集成工具层,形成清晰的分层架构。各层职责分明,确保功能的可维护性和可扩展性。 + +```mermaid +graph TB +subgraph "API层" +A[province.go] +B[collection.go] +end +subgraph "控制器层" +C[restriction_v1_check_ip_allowed.go] +D[restriction_v1_query_all_province.go] +E[restriction_v1_user_info_collection.go] +F[restriction_v1_block_order.go] +end +subgraph "服务逻辑层" +G[restriction.go] +H[ip_record.go] +end +subgraph "集成工具层" +I[location.go] +J[consts.go] +K[impl.go] +end +A --> C +B --> E +B --> F +C --> G +D --> G +E --> G +F --> G +G --> H +G --> I +I --> J +I --> K +``` + +**图示来源** +- [province.go](file://api/restriction/v1/province.go) +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction_v1_block_order.go](file://internal/controller/restriction/restriction_v1_block_order.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) +- [consts.go](file://utility/integration/restriction/consts.go) +- [impl.go](file://utility/integration/restriction/impl.go) + +**本节来源** +- [api/restriction/v1](file://api/restriction/v1) +- [internal/controller/restriction](file://internal/controller/restriction) + +## 核心组件 +风控限制系统的核心组件包括IP地理位置查询、地域限制检查、用户信息收集和订单封禁功能。系统通过集成多个第三方IP定位服务实现高可用的地理位置识别,并结合商户部署策略进行访问控制决策。所有限制记录持久化存储于数据库,支持后续审计和分析。 + +**本节来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) +- [location.go](file://utility/integration/restriction/location.go#L0-L38) + +## 架构概述 +系统采用分层架构设计,从API接口到服务逻辑再到外部集成,形成完整的风控处理链路。API层定义清晰的端点契约,控制器层处理请求调度,服务层实现核心业务逻辑,集成层提供外部服务访问能力。 + +```mermaid +graph TD +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务逻辑] +Service --> Cache[(缓存)] +Service --> Database[(数据库)] +Service --> External[第三方服务] +External --> CSDN[CSDN] +External --> PCOnline[PCOnline] +External --> IP66[IP66] +External --> MeiTu[美图] +``` + +**图示来源** +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) +- [impl.go](file://utility/integration/restriction/impl.go) + +## 详细组件分析 + +### IP访问控制分析 +系统通过多源IP地理位置服务实现高可用的IP定位功能,采用重试机制确保查询成功率。当主要服务失败时,自动切换到备用服务,保证系统稳定性。 + +#### 类图 +```mermaid +classDiagram +class Location { +<> ++QueryLocationByIP(ctx, ip) Response, error +} +class CSDNClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class PcOnlineClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class OlToolsClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class IdCdClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class MeiTuClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class VoClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class DBIPClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class QJQQClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class IQIYIClient { ++QueryLocationByIP(ctx, ip) Response, error +} +class IP66Client { ++QueryLocationByIP(ctx, ip) Response, error +} +Location <|-- CSDNClient +Location <|-- PcOnlineClient +Location <|-- OlToolsClient +Location <|-- IdCdClient +Location <|-- MeiTuClient +Location <|-- VoClient +Location <|-- DBIPClient +Location <|-- QJQQClient +Location <|-- IQIYIClient +Location <|-- IP66Client +``` + +**图示来源** +- [location.go](file://utility/integration/restriction/location.go#L0-L38) +- [impl.go](file://utility/integration/restriction/impl.go#L0-L44) + +### 省份查询分析 +提供获取全国所有省份列表的API接口,支持前端下拉选择等场景。系统维护完整的省份列表,包括特殊行政区和海外地区。 + +#### 序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +Client->>API : GET /restriction/location/getAllProvince +API->>Controller : 调用QueryAllProvince +Controller->>Service : 调用GetAllProvince +Service-->>Controller : 返回省份列表 +Controller-->>API : 返回响应 +API-->>Client : 返回省份列表 +``` + +**图示来源** +- [province.go](file://api/restriction/v1/province.go#L0-L28) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go#L0-L15) +- [restriction.go](file://internal/logic/restriction/restriction.go#L45-L47) + +### 用户信息收集分析 +实现用户设备信息收集功能,通过加密数据传输确保信息安全。系统验证数据签名防止篡改,并记录设备指纹用于后续风控决策。 + +#### 流程图 +```mermaid +flowchart TD +Start([开始]) --> Decrypt["解密请求数据"] +Decrypt --> Validate["验证数据签名"] +Validate --> SignatureValid{"签名有效?"} +SignatureValid --> |否| ReturnError["返回签名错误"] +SignatureValid --> |是| GetRemoteIP["获取客户端IP"] +GetRemoteIP --> CheckProxy["检查是否使用代理"] +CheckProxy --> SaveDevice["保存设备信息"] +SaveDevice --> End([结束]) +ReturnError --> End +``` + +**图示来源** +- [collection.go](file://api/restriction/v1/collection.go#L0-L23) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [restriction.go](file://internal/logic/restriction/restriction.go) + +**本节来源** +- [collection.go](file://api/restriction/v1/collection.go#L0-L23) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) + +## 依赖分析 +系统依赖多个外部IP定位服务和内部服务组件,形成复杂的依赖网络。通过接口抽象降低耦合度,支持服务的灵活替换和扩展。 + +```mermaid +graph TD +RestrictionService --> IPRecordService +RestrictionService --> MerchantDeployInfoService +RestrictionService --> OrderSummaryService +RestrictionService --> Database +RestrictionService --> CSDNService +RestrictionService --> PCOnlineService +RestrictionService --> IP66Service +RestrictionService --> MeiTuService +``` + +**图示来源** +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) +- [consts.go](file://utility/integration/restriction/consts.go) + +**本节来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) +- [location.go](file://utility/integration/restriction/location.go#L0-L38) + +## 性能考虑 +系统通过缓存IP地理位置信息减少外部服务调用,提高响应速度。采用并发处理和重试机制平衡性能与可靠性,确保在高并发场景下的稳定运行。 + +## 故障排除指南 +常见问题包括IP定位服务不可用、数据签名验证失败和数据库连接异常。建议检查网络连接、服务配置和密钥设置,确保各组件正常运行。 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [impl.go](file://utility/integration/restriction/impl.go#L0-L44) + +## 结论 +风控限制API提供了完整的访问控制解决方案,通过多维度限制策略保障系统安全。系统设计考虑了高可用性、安全性和可扩展性,能够满足复杂的业务场景需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/业务逻辑层架构.md b/.qoder/repowiki/zh/content/业务逻辑层架构/业务逻辑层架构.md new file mode 100644 index 00000000..bf7f8398 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/业务逻辑层架构.md @@ -0,0 +1,333 @@ +# 业务逻辑层架构 + + +**本文档中引用的文件** +- [main.go](file://main.go) +- [logic.go](file://internal/logic/logic.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [sys_user.go](file://internal/dao/v_1_sys_user.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) +- [card_redeem_order.go](file://internal/logic/card_redeem_order/order.go) +- [merchant_order.go](file://internal/logic/merchant_order/order.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [card_t_mall_order.go](file://internal/logic/card_t_mall_order/order.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [merchant_order.go](file://internal/service/merchant_order.go) +- [restriction.go](file://internal/service/restriction.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [config.yaml](file://manifest/config/config.yaml) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 引言 +kami_backend 是一个用于管理卡密充值、订单处理和账户管理的后端服务系统。该系统采用分层架构设计,包含 controller、service 和 logic 三层,分别负责请求处理、业务逻辑和数据访问。系统支持多种卡密类型,包括 Apple、京东、沃尔玛等,并提供了灵活的配置和扩展机制。本文档旨在描述该系统的业务逻辑层架构,包括高阶设计、架构模式、系统边界、核心业务流程、组件交互、数据流、集成模式、技术决策、基础设施要求、可扩展性考虑、部署拓扑、安全性、监控和灾难恢复等横切关注点。 + +## 项目结构 +kami_backend 项目采用模块化设计,主要分为 api、internal、manifest、utility 等目录。api 目录包含各业务模块的 API 定义,internal 目录包含核心业务逻辑,manifest 目录包含部署配置,utility 目录包含工具类和辅助功能。 + +```mermaid +graph TD +subgraph "API层" +A[api/authority] +B[api/card_info_apple] +C[api/card_info_jd] +D[api/card_info_walmart] +E[api/order] +F[api/sysUser] +end +subgraph "内部层" +G[internal/controller] +H[internal/service] +I[internal/logic] +J[internal/dao] +K[internal/model] +end +subgraph "工具层" +L[utility/config] +M[utility/integration] +N[utility/monitor] +end +A --> G +B --> G +C --> G +D --> G +E --> G +F --> G +G --> H +H --> I +I --> J +J --> K +L --> H +M --> I +N --> H +``` + +**图源** +- [main.go](file://main.go#L1-L50) +- [logic.go](file://internal/logic/logic.go#L1-L37) + +## 核心组件 +kami_backend 的核心组件包括用户管理、卡密充值、订单处理、权限控制等。用户管理组件负责用户账户的创建、修改、删除和权限分配。卡密充值组件支持多种卡密类型,包括 Apple、京东、沃尔玛等,提供卡密的充值、查询、回调等功能。订单处理组件负责订单的创建、查询、状态更新和统计。权限控制组件基于 Casbin 实现,支持基于角色的访问控制。 + +**组件源** +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) +- [card_apple_order.go](file://internal/service/card_apple_order.go#L1-L127) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go#L1-L80) +- [merchant_order.go](file://internal/service/merchant_order.go#L1-L44) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +## 架构概述 +kami_backend 采用典型的三层架构,包括 controller、service 和 logic 层。controller 层负责接收和处理 HTTP 请求,调用 service 层提供的接口。service 层是业务逻辑的核心,封装了具体的业务规则和流程,调用 logic 层进行数据访问和处理。logic 层负责与数据库交互,执行 CRUD 操作,并提供数据访问的抽象。 + +```mermaid +graph TD +A[客户端] --> B[Controller] +B --> C[Service] +C --> D[Logic] +D --> E[DAO] +E --> F[数据库] +``` + +**图源** +- [main.go](file://main.go#L1-L50) +- [logic.go](file://internal/logic/logic.go#L1-L37) + +## 详细组件分析 +### 用户管理组件分析 +用户管理组件负责用户账户的全生命周期管理,包括创建、修改、删除、查询和权限分配。该组件基于 GoFrame 框架实现,使用 MySQL 作为持久化存储。 + +#### 类图 +```mermaid +classDiagram +class SysUser { ++string Id ++string Username ++int IsAdmin ++string Phone ++*gtime.Time CreatedAt ++*gtime.Time UpdatedAt ++*gtime.Time DeletedAt ++GetCasBinUserPrefix() string ++NotCheckAuthAdminIds(ctx context.Context) *gset.Set ++GetAdminUserByUsernamePassword(ctx context.Context, req *model.UserLoginInput) (user *model.LoginUserOutput, err error) ++GetUserByUsername(ctx context.Context, userName string) (sysUser *model.LoginUserOutput, err error) ++GetUserById(ctx context.Context, id string) (sysUser *model.LoginUserOutput, err error) ++LoginLog(ctx context.Context, params *model.LoginLogParams) ++GetAdminRules(ctx context.Context, userId string) (menuList []*model.UserMenus, permissions []string, err error) ++GetAdminRole(ctx context.Context, userId string, allRoleList []*entity.V1SysRole) (roles []*entity.V1SysRole, err error) ++GetAdminRoleIds(ctx context.Context, userId string) (roleIds []uint, err error) ++GetAllMenus(ctx context.Context) (menus []*model.UserMenus, err error) ++GetAdminMenusByRoleIds(ctx context.Context, roleIds []uint) (menus []*model.UserMenus, err error) ++GetMenusTree(menus []*model.UserMenus, pid uint) []*model.UserMenus ++GetPermissions(ctx context.Context, roleIds []uint) (userButtons []string, err error) ++List(ctx context.Context, req *model.UserSearchInput) (total int, userList []*entity.V1SysUser, err error) ++GetByUserName(ctx context.Context, username string) (userList []*entity.V1SysUser, err error) ++ListWithPayment(ctx context.Context, req *model.UserSearchInput) (total int, userList []*model.UserSearchWithPaymentOutput, err error) ++Add(ctx context.Context, req *model.UserAddInput) (userId string, err error) ++Edit(ctx context.Context, req *model.UserEditInput) (err error) ++EditUserRole(ctx context.Context, roleIds []int64, userId int64) (err error) ++UserNameOrMobileExists(ctx context.Context, userName string, id ...string) (isExist bool, err error) ++GetEditUser(ctx context.Context, id string) (res *model.UserGetEditOutput, err error) ++GetUserInfoById(ctx context.Context, id string, withPwd ...bool) (user *entity.V1SysUser, err error) ++ChangePwd(ctx context.Context, input *model.UserChangePwdInput) (err error) ++ChangeUserStatus(ctx context.Context, input *model.UserStatusInput) (err error) ++DeleteById(ctx context.Context, id string) (err error) ++Delete(ctx context.Context, ids []string) (err error) ++GetUsers(ctx context.Context, ids []string) (users []*model.SysUserSimpleOutput, err error) ++GetUsersAll(ctx context.Context) (users []*model.SysUserSimpleOutput, err error) ++GetUserFromToken(ctx context.Context) (needAuth bool, user *entity.V1SysUser, err error) ++CheckUserNormal(ctx context.Context, userId string) (isNormal bool, err error) ++GetAllUserNormal(ctx context.Context, tx gdb.TX) (user []*entity.V1SysUser, err error) ++GetAllSimpleUser(ctx context.Context) (data []model.UserSimpleUsersOutput, err error) ++GetCurrentOneFromCache(ctx context.Context, channelName consts.CardRedeemAccountCategory) (data *entity.V1SysUser, err error) ++GetOneNormalOneWithPayment(ctx context.Context, userId string, tx gdb.TX) (output *model.UserSearchWithPaymentOutput, err error) ++GetAllNormalWithPayment(ctx context.Context, minAmount float64, tx gdb.TX) (output []*model.UserSearchWithPaymentOutput, err error) ++GetAllNormalWithPaymentAndChannelCfg(ctx context.Context, minAmount float64, tx gdb.TX) (output []*model.UserSearchWithPaymentAndCfgOutput, err error) ++GetNextOne(ctx context.Context, userId string, amount float64, isNext bool, tx gdb.TX) (data *entity.V1SysUser, err error) ++SetTotp(ctx context.Context, data *entity.V1SysUser, key string, secret string) (err error) ++ResetTotp(ctx context.Context, data *entity.V1SysUser) (err error) +} +class SysUserDao { ++V1SysUser *v1SysUserDao ++Get(ctx context.Context, id string) (*entity.V1SysUser, error) ++Create(ctx context.Context, user *entity.V1SysUser) error ++Update(ctx context.Context, user *entity.V1SysUser) error ++Delete(ctx context.Context, id string) error +} +class SysUserModel { ++User *model.User ++UserSearchInput *model.UserSearchInput ++UserSearchWithPaymentOutput *model.UserSearchWithPaymentOutput ++UserSearchWithPaymentAndCfgOutput *model.UserSearchWithPaymentAndCfgOutput ++UserAddInput *model.UserAddInput ++UserEditInput *model.UserEditInput ++UserGetEditOutput *model.UserGetEditOutput ++UserChangePwdInput *model.UserChangePwdInput ++UserStatusInput *model.UserStatusInput ++SysUserSimpleOutput *model.SysUserSimpleOutput ++UserLoginOutInput *model.UserLoginOutInput ++LoginUserOutput *model.LoginUserOutput ++UserLoginOutOutput *model.UserLoginOutOutput ++UserSimpleUsersOutput *model.UserSimpleUsersOutput +} +SysUser --> SysUserDao : "uses" +SysUser --> SysUserModel : "uses" +SysUserDao --> SysUserModel : "returns" +``` + +**图源** +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L767) +- [sys_user.go](file://internal/dao/v_1_sys_user.go#L1-L28) +- [sys_user.go](file://internal/model/sys_user.go#L1-L92) + +### 卡密充值组件分析 +卡密充值组件支持多种卡密类型,包括 Apple、京东、沃尔玛等,提供卡密的充值、查询、回调等功能。该组件基于 GoFrame 框架实现,使用 MySQL 作为持久化存储。 + +#### 序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "Controller" +participant Service as "Service" +participant Logic as "Logic" +participant DAO as "DAO" +participant DB as "数据库" +Client->>Controller : POST /api/card_info_apple/v1/recharge_submit +Controller->>Service : AddRechargeOrder(input) +Service->>Logic : AddRechargeOrder(input) +Logic->>DAO : InsertAndGetId(do.V1CardAppleRechargeInfo) +DAO->>DB : INSERT INTO v1_card_apple_recharge_info +DB-->>DAO : 返回ID +DAO-->>Logic : 返回ID +Logic->>DAO : Insert(do.V1CardAppleHistoryInfo) +DAO->>DB : INSERT INTO v1_card_apple_history_info +DB-->>DAO : 返回结果 +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回订单号 +Service-->>Controller : 返回订单号 +Controller-->>Client : 返回订单号 +``` + +**图源** +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go#L1-L343) +- [card_apple_order.go](file://internal/service/card_apple_order.go#L1-L127) + +### 订单处理组件分析 +订单处理组件负责订单的创建、查询、状态更新和统计。该组件基于 GoFrame 框架实现,使用 MySQL 作为持久化存储。 + +#### 流程图 +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> InputValid{"输入有效?"} +InputValid --> |否| ReturnError["返回错误响应"] +InputValid --> |是| CheckOrder["检查订单是否存在"] +CheckOrder --> OrderExists{"订单存在?"} +OrderExists --> |是| UpdateOrder["更新订单状态"] +OrderExists --> |否| CreateOrder["创建新订单"] +CreateOrder --> SaveOrder["保存订单到数据库"] +SaveOrder --> UpdateStatus["更新订单状态"] +UpdateStatus --> ReturnResult["返回结果"] +UpdateOrder --> ReturnResult +ReturnResult --> End([结束]) +ReturnError --> End +``` + +**图源** +- [merchant_order.go](file://internal/logic/merchant_order/order.go#L1-L48) +- [merchant_order.go](file://internal/service/merchant_order.go#L1-L44) + +### 权限控制组件分析 +权限控制组件基于 Casbin 实现,支持基于角色的访问控制。该组件负责用户权限的验证和管理。 + +#### 类图 +```mermaid +classDiagram +class Restriction { ++GetAllProvince(ctx context.Context) []string ++CheckIPIsAllowed(ctx context.Context, ip string, area []string) (isAllowed bool, err error) ++AddToRestrictIP(ctx context.Context, input model.AddRestrictionRecordInput) (err error) ++SetCurrentOrderDisable(ctx context.Context, orderNo string, status consts.RestrictStatus, tx gdb.TX) (err error) ++GetLocationWithProxyByIP(ctx context.Context, ip string) (data *model.RestrictionIPRecordOutput, err error) ++IsInProvince(ctx context.Context, ip string, province []string) (isin bool, m *model.RestrictionIPRecordOutput, err error) ++GetRestrictRecordByCardPass(ctx context.Context, cardPass string) (dataList []entity.V1RestrictIpOrderAccess, err error) ++GetRestrictRecordByIP(ctx context.Context, ip string) (dataList []model.RestrictWithIPRecordOutput, err error) ++GetIPOrderAccessByCardPass(ctx context.Context, cardPass string) (data []entity.V1RestrictIpOrderAccess, err error) ++IsRestrictExistByCardPass(ctx context.Context, cardPass string) (isExist bool) ++IsRestrictExistByIP(ctx context.Context, ip string) (isExist bool) ++IsRestrictDevice(ctx context.Context, deviceId string) (isRestrict bool) +} +class RestrictionDao { ++V1RestrictIpRecord *v1RestrictIpRecordDao ++V1RestrictIpOrderAccess *v1RestrictIpOrderAccessDao ++GetOrSetIPRecord(ctx context.Context, ip string, tx gdb.TX) (m *model.RestrictionIPRecordOutput, err error) ++GetRestrictRecordByCardPass(ctx context.Context, cardPass string) (dataList []entity.V1RestrictIpOrderAccess, err error) ++GetRestrictRecordByIP(ctx context.Context, ip string) (dataList []model.RestrictWithIPRecordOutput, err error) ++GetIPOrderAccessByCardPass(ctx context.Context, cardPass string) (data []entity.V1RestrictIpOrderAccess, err error) +} +class RestrictionModel { ++AddRestrictionRecordInput *model.AddRestrictionRecordInput ++RestrictionIPRecordOutput *model.RestrictionIPRecordOutput ++RestrictWithIPRecordOutput *model.RestrictWithIPRecordOutput +} +Restriction --> RestrictionDao : "uses" +Restriction --> RestrictionModel : "uses" +RestrictionDao --> RestrictionModel : "returns" +``` + +**图源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L1-L174) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +## 依赖分析 +kami_backend 依赖于多个外部组件和库,包括 GoFrame 框架、MySQL 数据库、Redis 缓存、OpenTelemetry 监控系统等。GoFrame 框架提供了 Web 服务、数据库访问、配置管理等基础功能。MySQL 数据库用于持久化存储用户、订单、卡密等数据。Redis 缓存用于提高系统性能,减少数据库访问压力。OpenTelemetry 监控系统用于收集和分析系统运行时的性能数据。 + +```mermaid +graph TD +A[kami_backend] --> B[GoFrame] +A --> C[MySQL] +A --> D[Redis] +A --> E[OpenTelemetry] +B --> F[gin] +B --> G[gorm] +C --> H[InnoDB] +D --> I[内存存储] +E --> J[Jaeger] +E --> K[Prometheus] +``` + +**图源** +- [main.go](file://main.go#L1-L50) +- [config.yaml](file://manifest/config/config.yaml#L1-L10) + +## 性能考虑 +kami_backend 在设计时充分考虑了性能因素,采用了多种优化措施。首先,系统使用 Redis 缓存热点数据,如用户信息、配置信息等,减少数据库访问次数。其次,系统采用连接池技术,复用数据库连接,减少连接创建和销毁的开销。此外,系统还使用了异步处理机制,将耗时操作放入后台任务队列中执行,提高响应速度。最后,系统通过 OpenTelemetry 监控系统实时监控性能指标,及时发现和解决性能瓶颈。 + +## 故障排除指南 +当 kami_backend 出现问题时,可以按照以下步骤进行排查: +1. 检查系统日志,查看是否有错误信息。 +2. 检查数据库连接是否正常,是否有慢查询。 +3. 检查 Redis 缓存是否正常,是否有缓存穿透或雪崩。 +4. 检查 OpenTelemetry 监控系统,查看性能指标是否异常。 +5. 检查配置文件,确认配置项是否正确。 +6. 如果问题仍然无法解决,可以联系技术支持团队。 + +**组件源** +- [main.go](file://main.go#L1-L50) +- [config.yaml](file://manifest/config/config.yaml#L1-L10) + +## 结论 +kami_backend 是一个功能完善、性能优良的后端服务系统。通过采用分层架构设计,系统实现了良好的模块化和可维护性。通过使用多种优化措施,系统能够高效地处理大量并发请求。通过集成 OpenTelemetry 监控系统,系统具备了强大的可观测性。未来,系统可以进一步优化性能,增加更多功能,提高用户体验。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密充值处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密充值处理.md new file mode 100644 index 00000000..85e8719d --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密充值处理.md @@ -0,0 +1,203 @@ +# Apple卡密充值处理 + + +**本文档引用文件** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了Apple卡密充值处理系统的完整流程。系统支持商户提交Apple卡密充值订单,通过与iTunes系统的回调集成完成充值状态同步,并具备重复卡密检测、订单状态机管理、异步处理、错误重试等核心功能。系统还与支付系统和风控系统深度集成,确保业务流程的完整性与安全性。 + +## 项目结构 +Apple卡密充值功能的核心代码位于`internal/controller/card_info_apple`目录下,由多个控制器文件组成,分别处理订单提交、分配、回调和异常处理等不同场景。数据模型定义在`internal/model`包中,而数据库操作则封装在`internal/dao`包内。 + +```mermaid +graph TD +subgraph "API层" +A[RechargeSubmit] --> |提交订单| B[RechargeHandler] +B --> |分配账户| C[RechargeItunesCallback] +C --> |状态回调| D[RechargeDuplicatedCardPass] +D --> |重复卡密处理| A +end +subgraph "服务层" +E[AppleOrder Service] < --> F[AppleAccount Service] +end +subgraph "数据层" +G[V1CardAppleRechargeInfo] +H[V1CardAppleAccountInfo] +end +A --> E +B --> E +C --> E +D --> E +E --> G +F --> H +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L1-L188) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go#L1-L28) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go#L1-L28) + +**本节来源** +- [internal/controller/card_info_apple](file://internal/controller/card_info_apple) +- [internal/model](file://internal/model) +- [internal/dao](file://internal/dao) + +## 核心组件 + +Apple卡密充值系统由四个核心控制器方法构成:`RechargeSubmit`负责接收并验证商户提交的充值请求;`RechargeHandler`负责从待处理订单队列中获取订单并分配合适的Apple账户进行充值;`RechargeItunesCallback`处理来自iTunes系统的充值结果回调,更新订单状态;`RechargeDuplicatedCardPass`则专门处理因卡密重复而被挂起的订单。 + +**本节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L1-L188) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go#L1-L44) + +## 架构概述 +系统采用分层架构,从上至下分为API接口层、业务逻辑服务层和数据访问层。API层暴露标准化的REST接口供外部系统调用。服务层封装了核心业务逻辑,如订单状态管理、账户分配策略和回调处理。数据层通过DAO模式与数据库交互,保证数据操作的统一性和安全性。整个流程通过Redis缓存实现幂等性控制,并利用定时任务(gcron)实现超时重试机制。 + +```mermaid +graph TB +subgraph "表现层" +API[API Controller] +end +subgraph "业务逻辑层" +Service[AppleOrder Service] +AccountService[AppleAccount Service] +end +subgraph "数据访问层" +DAO[DAO Layer] +end +subgraph "外部系统" +iTunes[iTunes系统] +end +API --> Service +Service --> AccountService +Service --> DAO +AccountService --> DAO +iTunes --> API +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L1-L188) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) + +## 详细组件分析 + +### 充值订单提交分析 +`RechargeSubmit`方法是整个充值流程的入口。它首先通过分布式锁和Redis缓存防止同一商户ID在短时间内重复提交订单。接着,通过签名验证确保请求的合法性。最后,调用服务层方法将订单信息持久化到数据库。 + +#### 充值订单提交流程 +```mermaid +flowchart TD +Start([开始]) --> ValidateDuplicate["验证重复提交"] +ValidateDuplicate --> |已存在| ReturnError["返回: 订单正在处理"] +ValidateDuplicate --> |不存在| SetCache["写入缓存 (10秒)"] +SetCache --> ValidateSign["验证签名"] +ValidateSign --> |失败| ReturnSignError["返回: 校验错误"] +ValidateSign --> |成功| ValidateCardPass["验证卡密格式"] +ValidateCardPass --> |失败| ReturnCardError["返回: 卡密校验错误"] +ValidateCardPass --> |成功| AddOrder["添加充值订单"] +AddOrder --> |成功| ReturnSuccess["返回: 提交成功"] +AddOrder --> |失败| ReturnDbError["返回: 数据库操作失败"] +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) + +**本节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) + +### iTunes回调处理分析 +`RechargeItunesCallback`方法处理来自iTunes系统的异步回调。它根据不同的状态码(如成功、失败、退款等)执行相应的业务逻辑,包括更新订单状态、记录操作历史、调整账户状态以及触发上游回调。 + +#### iTunes回调状态处理 +```mermaid +stateDiagram-v2 +[*] --> 接收回调 +接收回调 --> 查询订单 +查询订单 --> 订单不存在 : 失败 +查询订单 --> 订单存在 : 成功 +订单存在 --> 验证状态 : 检查是否为处理中/等待中 +验证状态 --> 状态无效 : 返回错误 +验证状态 --> 状态有效 : 继续处理 +状态有效 --> 根据状态分支 +根据状态分支 --> 成功 : 更新实际金额,回调上游 +根据状态分支 --> 失败 : 更新为失败状态,记录原因 +根据状态分支 --> 退款 : 退回订单,更新账户状态 +根据状态分支 --> 密码错误 : 标记账户异常,退回订单 +成功 --> [*] +失败 --> [*] +退款 --> [*] +密码错误 --> [*] +``` + +**图示来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) + +**本节来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) + +### 充值状态同步与重复卡密处理 +当iTunes回调返回“金额不一致”或“卡密重复”等特殊状态时,订单状态会被置为“金额异议”或“卡密重复”。`RechargeDuplicatedCardPass`方法提供了一个手动处理接口,允许管理员在确认前序订单结果后,将挂起的订单与成功订单的实际金额对齐,并完成最终的上游回调。 + +**本节来源** +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go#L1-L44) + +## 依赖分析 +系统内部依赖关系清晰,控制器层依赖服务层,服务层依赖数据访问层。外部依赖包括GoFrame框架(用于Web服务、数据库操作、日志和分布式锁)、Lancet库(用于指针操作)以及Redis(用于缓存和幂等性控制)。 + +```mermaid +graph LR +Controller --> Service +Service --> DAO +DAO --> Database[(MySQL)] +Controller --> Redis[(Redis)] +Controller --> iTunes[iTunes API] +Service --> Config[配置中心] +``` + +**图示来源** +- [go.mod](file://go.mod) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) + +**本节来源** +- [go.mod](file://go.mod) +- [internal/controller](file://internal/controller) +- [internal/service](file://internal/service) +- [utility/config](file://utility/config) + +## 性能考虑 +系统通过多种机制保障性能和稳定性:使用Redis缓存实现提交幂等性,避免数据库压力;利用`gmlock.LockFunc`确保关键操作的线程安全;通过`gcron`定时任务处理超时订单,避免资源长时间占用;在数据库操作中广泛使用事务保证数据一致性。 + +## 故障排除指南 +常见问题包括:重复提交导致“订单正在处理”错误,应检查客户端重试逻辑;回调失败,需确认服务器防火墙和iTunes回调地址可达性;账户被临时封禁,系统会自动在2分钟后恢复;订单长时间处于“处理中”状态,可能是定时任务未正确执行,需检查cron服务。 + +**本节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go#L1-L70) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go#L1-L188) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go#L1-L245) + +## 结论 +Apple卡密充值处理系统设计完整,涵盖了从订单接收到状态同步的全生命周期管理。系统具备良好的扩展性和健壮性,通过状态机、异步回调和定时重试机制有效应对了第三方系统集成中的各种不确定性。建议持续监控回调成功率和账户健康度,以进一步优化系统表现。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密历史记录管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密历史记录管理.md new file mode 100644 index 00000000..1be973fa --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密历史记录管理.md @@ -0,0 +1,206 @@ +# Apple卡密历史记录管理 + + +**本文档引用文件** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info_history.go](file://internal/dao/v_1_card_apple_account_info_history.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) +- [card_apple_account.go](file://internal/model/card_apple_account.go) +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述Apple卡密系统中账户历史记录与充值历史记录的管理机制。涵盖历史数据的存储结构、查询接口、导出功能、索引优化、数据归档策略,以及与审计和对账系统的集成。通过分析关键代码实现,揭示系统在大数据量下的性能优化手段和数据一致性保障机制。 + +## 项目结构 +Apple卡密历史记录管理功能主要分布在`internal`目录下的`controller`、`dao`、`model`和`logic`子模块中,围绕Apple卡密业务形成独立的逻辑闭环。 + +```mermaid +graph TB +subgraph "API层" +Controller["internal/controller/card_info_apple"] +end +subgraph "逻辑层" +Logic["internal/logic/card_apple_*"] +end +subgraph "模型层" +Model["internal/model"] +end +subgraph "数据访问层" +DAO["internal/dao"] +end +Controller --> Logic +Logic --> Model +Logic --> DAO +Model --> DAO +``` + +**图示来源** +- [card_info_apple](file://internal/controller/card_info_apple) +- [logic](file://internal/logic) +- [model](file://internal/model) +- [dao](file://internal/dao) + +**本节来源** +- [project_structure](file://) + +## 核心组件 +系统核心组件包括账户历史记录管理(`card_apple_account_info_history`)和充值历史记录管理(`card_apple_history_info`),分别对应账户余额变动和单次充值操作的完整审计日志。 + +**本节来源** +- [v_1_card_apple_account_info_history.go](file://internal/dao/v_1_card_apple_account_info_history.go#L1-L27) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go#L1-L27) + +## 架构概述 +系统采用典型的分层架构,从API接口接收请求,经由控制器转发至业务逻辑层,逻辑层调用数据访问对象(DAO)与数据库交互,最终返回结构化数据。历史记录数据通过实体模型(Entity)进行映射,并在逻辑层进行聚合与处理。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "ControllerV1" +participant Service as "Service" +participant Logic as "Logic" +participant DAO as "DAO" +participant DB as "数据库" +Client->>Controller : 发起历史记录查询请求 +Controller->>Service : 调用AppleAccount或AppleOrder服务 +Service->>Logic : 转发至具体业务逻辑 +Logic->>DAO : 构建查询条件并执行 +DAO->>DB : 执行SQL查询 +DB-->>DAO : 返回原始数据 +DAO-->>Logic : 返回实体列表 +Logic-->>Service : 返回处理后的数据 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回JSON响应 +``` + +**图示来源** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go#L1-L25) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go#L1-L39) + +## 详细组件分析 + +### 充值历史记录管理分析 +充值历史记录管理提供基于订单号的详细操作日志查询功能,用于追踪单笔充值的完整生命周期。 + +#### 数据结构与查询逻辑 +充值历史记录的核心数据结构为`V1CardAppleHistoryInfo`,存储于`card_apple_history_info`表中。查询逻辑由`GetRechargeDetails`方法实现,支持按订单号精确查询,并按创建时间倒序排列。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> BuildQuery["构建数据库查询"] +BuildQuery --> SetCondition["设置查询条件: OrderNo"] +SetCondition --> SetOrder["设置排序: CreatedAt DESC"] +SetOrder --> ExecuteQuery["执行数据库查询 ScanAndCount"] +ExecuteQuery --> CheckError{"查询成功?"} +CheckError --> |否| HandleError["返回数据库操作错误"] +CheckError --> |是| ReturnData["返回结果: total, data[]"] +HandleError --> End([结束]) +ReturnData --> End +``` + +**图示来源** +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go#L144-L153) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go#L1-L27) + +**本节来源** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go#L1-L25) +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go#L144-L153) + +### 账户历史记录管理分析 +账户历史记录管理提供更复杂的查询能力,支持按账户ID、账户名和用户ID进行筛选,用于审计特定账户或特定操作员的所有余额变动。 + +#### 数据结构与查询逻辑 +账户历史记录的核心数据结构为`V1CardAppleAccountInfoHistory`,存储于`card_apple_account_info_history`表中。查询逻辑由`GetWalletHistory`方法实现,支持多条件组合查询和分页。 + +```mermaid +flowchart TD +Start([开始]) --> InitData["初始化空数据列表"] +InitData --> GetDB["获取数据库连接"] +GetDB --> CheckAccountId{"AccountId是否为空?"} +CheckAccountId --> |否| AddAccountIdFilter["添加AccountId查询条件"] +CheckAccountId --> |是| CheckAccountName{"AccountName是否为空?"} +CheckAccountName --> |否| AddAccountNameFilter["添加AccountName LIKE查询条件"] +CheckAccountName --> |是| CheckUserId{"UserId是否为空?"} +CheckUserId --> |否| QueryUserAccounts["查询用户名下所有账户ID"] +QueryUserAccounts --> AddAccountIdInFilter["添加AccountId IN查询条件"] +CheckUserId --> |是| ApplyPagination["应用分页: Page()"] +AddAccountIdFilter --> ApplyPagination +AddAccountNameFilter --> ApplyPagination +AddAccountIdInFilter --> ApplyPagination +ApplyPagination --> SetOrder["设置排序: CreatedAt DESC"] +SetOrder --> ExecuteQuery["执行数据库查询 ScanAndCount"] +ExecuteQuery --> ReturnResult["返回结果: total, data[]"] +ReturnResult --> End([结束]) +``` + +**图示来源** +- [wallet.go](file://internal/logic/card_apple_account/wallet.go#L56-L78) +- [v_1_card_apple_account_info_history.go](file://internal/dao/v_1_card_apple_account_info_history.go#L1-L27) + +**本节来源** +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go#L1-L39) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go#L56-L78) + +## 依赖分析 +历史记录管理模块依赖于系统的核心服务和数据模型,形成了清晰的依赖链。 + +```mermaid +graph TD +A[ControllerV1] --> B[Service.AppleOrder] +A --> C[Service.AppleAccount] +B --> D[Logic.sAppleOrder] +C --> E[Logic.sAppleAccount] +D --> F[DAO.V1CardAppleHistoryInfo] +E --> G[DAO.V1CardAppleAccountInfoHistory] +F --> H[(card_apple_history_info 表)] +G --> I[(card_apple_account_info_history 表)] +C --> J[Service.SysAuth] +J --> K[DAO.V1SysUser] +``` + +**图示来源** +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go#L1-L25) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go#L1-L39) +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go#L144-L153) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go#L56-L78) + +**本节来源** +- [internal/service](file://internal/service) +- [internal/dao](file://internal/dao) + +## 性能考虑 +系统在设计上已考虑性能优化: +1. **索引优化**:`card_apple_history_info`表的`order_no`和`created_at`字段,以及`card_apple_account_info_history`表的`account_id`和`created_at`字段应建立复合索引,以加速查询和排序。 +2. **分页查询**:所有列表查询均采用分页机制(`Page()`),避免一次性加载大量数据。 +3. **连接查询优化**:在账户历史查询中,当按用户ID查询时,先获取该用户的所有账户ID列表,再使用`IN`条件进行查询,避免了复杂的表连接。 +4. **数据一致性**:通过事务或原子操作确保账户余额与历史记录的一致性。 + +## 故障排除指南 +常见问题及解决方案: +- **查询无结果**:检查输入的订单号或账户ID是否正确,确认数据是否存在。 +- **查询性能低下**:检查相关数据库表的索引是否已建立,特别是`order_no`、`account_id`和`created_at`字段。 +- **权限不足错误**:确保请求已通过身份验证,`SysAuth().LoginWithIFrameAndLogin`调用成功。 +- **数据库连接错误**:检查数据库配置和连接状态。 + +**本节来源** +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go#L1-L39) +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go#L144-L153) + +## 结论 +Apple卡密历史记录管理系统设计合理,功能完整。通过分层架构实现了关注点分离,利用DAO模式简化了数据库操作。系统支持灵活的查询和分页,具备良好的可维护性和扩展性。建议定期对历史数据表进行归档,以维持查询性能,并确保关键字段的数据库索引得到维护。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密管理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密管理逻辑.md new file mode 100644 index 00000000..124d4143 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密管理逻辑.md @@ -0,0 +1,317 @@ +# Apple卡密管理逻辑 + + +**本文档中引用的文件** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) +- [model.go](file://api/card_info_apple/v1/model.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_apple_account.go](file://internal/logic/card_apple_account/account.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) +- [card_apple.go](file://internal/consts/card_apple.go) +- [wallet.go](file://api/fund/v1/wallet.go) +- [form.go](file://api/order/v1/form.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了Apple卡密管理系统的业务逻辑,涵盖账户的创建、更新、删除和状态管理流程,以及充值处理、历史记录管理、与订单和支付系统的集成等核心功能。文档深入分析了关键业务方法的实现细节、异常处理策略和数据一致性保障机制,并提供了性能优化建议和常见问题解决方案。 + +## 项目结构 +Apple卡密管理系统采用分层架构,主要分为API接口层、控制器层、服务层、逻辑层和数据访问层。系统通过清晰的模块划分实现了高内聚低耦合的设计原则。 + +```mermaid +graph TB +subgraph "API层" +A[account_info.go] +B[order.go] +C[config.go] +end +subgraph "控制器层" +D[card_info_apple_v1_*] +end +subgraph "服务层" +E[card_apple_account.go] +F[card_apple_order.go] +end +subgraph "逻辑层" +G[card_apple_account] +H[card_apple_order] +end +subgraph "数据访问层" +I[v_1_card_apple_account_info.go] +J[v_1_card_apple_recharge_info.go] +end +A --> D +B --> D +C --> D +D --> E +D --> F +E --> G +F --> H +G --> I +H --> J +``` + +**图示来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_apple_account.go](file://internal/logic/card_apple_account/account.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) + +**章节来源** +- [account_info.go](file://api/card_info_apple/v1/account_info.go) +- [order.go](file://api/card_info_apple/v1/order.go) +- [config.go](file://api/card_info_apple/v1/config.go) + +## 核心组件 +Apple卡密管理系统的核心组件包括账户管理、充值处理、状态管理和历史记录等功能模块。系统通过服务层和逻辑层的分离实现了业务逻辑与数据访问的解耦。 + +**章节来源** +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_apple_account.go](file://internal/logic/card_apple_account/account.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) + +## 架构概览 +系统采用典型的分层架构设计,从上到下分别为API接口层、控制器层、服务层、逻辑层和数据访问层。这种设计模式确保了系统的可维护性和可扩展性。 + +```mermaid +graph TD +A[API接口] --> B[控制器] +B --> C[服务] +C --> D[业务逻辑] +D --> E[数据访问] +E --> F[(数据库)] +G[外部系统] --> |iTunes回调| B +H[订单系统] --> |订单集成| C +I[支付系统] --> |支付集成| C +``` + +**图示来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [form.go](file://api/order/v1/form.go) +- [wallet.go](file://api/fund/v1/wallet.go) + +## 详细组件分析 + +### 账户管理分析 +Apple卡密账户管理模块负责账户的全生命周期管理,包括创建、更新、删除和状态变更等操作。 + +#### 账户创建流程 +```mermaid +sequenceDiagram +participant 前端 as 前端应用 +participant 控制器 as 控制器 +participant 服务 as 服务层 +participant 逻辑 as 逻辑层 +participant 数据库 as 数据访问层 +前端->>控制器 : 创建账户请求 +控制器->>控制器 : 参数验证 +控制器->>服务 : 调用创建方法 +服务->>逻辑 : 执行业务逻辑 +逻辑->>逻辑 : 生成账户信息 +逻辑->>数据库 : 保存账户数据 +数据库-->>逻辑 : 返回结果 +逻辑-->>服务 : 返回账户对象 +服务-->>控制器 : 返回结果 +控制器-->>前端 : 返回成功响应 +``` + +**图示来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_apple_account.go](file://internal/logic/card_apple_account/account.go) +- [v_1_card_apple_account_info.go](file://internal/dao/v_1_card_apple_account_info.go) + +#### 账户状态管理 +```mermaid +stateDiagram-v2 +[*] --> 正常 +正常 --> 暂停 : 暂停操作 +暂停 --> 正常 : 恢复操作 +正常 --> 删除 : 删除操作 +暂停 --> 删除 : 删除操作 +删除 --> [*] +note right of 正常 +可进行充值和消费 +end note +note right of 暂停 +账户被临时禁用 +end note +note right of 删除 +账户数据被标记删除 +end note +``` + +**图示来源** +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_apple_account.go](file://internal/logic/card_apple_account/status.go) + +**章节来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) + +### 充值处理分析 +Apple卡密充值模块负责处理用户提交的充值请求,包括iTunes回调处理、重复卡密检测和状态同步等核心功能。 + +#### 充值提交流程 +```mermaid +flowchart TD +A[用户提交充值] --> B{参数验证} +B --> |失败| C[返回错误] +B --> |成功| D[检查重复卡密] +D --> |已存在| E[处理重复卡密] +D --> |新卡密| F[创建充值记录] +F --> G[调用iTunes验证] +G --> H{iTunes响应} +H --> |成功| I[更新账户余额] +H --> |失败| J[记录失败原因] +I --> K[更新充值状态] +J --> K +K --> L[返回结果] +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) + +#### iTunes回调处理 +```mermaid +sequenceDiagram +participant iTunes as iTunes服务器 +participant 控制器 as 控制器 +participant 服务 as 服务层 +participant 逻辑 as 逻辑层 +iTunes->>控制器 : 发送回调通知 +控制器->>控制器 : 验证签名 +控制器->>服务 : 处理回调 +服务->>逻辑 : 更新充值状态 +逻辑->>逻辑 : 同步账户信息 +逻辑-->>服务 : 返回结果 +服务-->>控制器 : 返回确认 +控制器-->>iTunes : 返回成功响应 +``` + +**图示来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/callback.go) + +**章节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_info_apple_v1_recharge_duplicated_card_pass.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_duplicated_card_pass.go) + +### 系统集成分析 +Apple卡密管理系统与订单系统和支付系统实现了深度集成,确保了业务流程的完整性和数据一致性。 + +#### 与订单系统集成 +```mermaid +sequenceDiagram +participant 卡密系统 as 卡密系统 +participant 订单系统 as 订单系统 +卡密系统->>订单系统 : 创建订单请求 +订单系统-->>卡密系统 : 返回订单ID +卡密系统->>卡密系统 : 关联充值记录 +卡密系统->>订单系统 : 更新订单状态 +订单系统-->>卡密系统 : 确认状态更新 +``` + +**图示来源** +- [form.go](file://api/order/v1/form.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) + +#### 与支付系统集成 +```mermaid +sequenceDiagram +participant 卡密系统 as 卡密系统 +participant 支付系统 as 支付系统 +卡密系统->>支付系统 : 查询支付配置 +支付系统-->>卡密系统 : 返回配置信息 +卡密系统->>支付系统 : 提交支付记录 +支付系统-->>卡密系统 : 返回处理结果 +``` + +**图示来源** +- [wallet.go](file://api/fund/v1/wallet.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) + +**章节来源** +- [form.go](file://api/order/v1/form.go) +- [wallet.go](file://api/fund/v1/wallet.go) + +## 依赖分析 +Apple卡密管理系统依赖于多个内部和外部组件,确保了系统的完整功能和稳定性。 + +```mermaid +graph TD +A[Apple卡密系统] --> B[iTunes验证服务] +A --> C[订单管理系统] +A --> D[支付管理系统] +A --> E[用户权限系统] +A --> F[配置管理系统] +A --> G[数据库服务] +H[外部系统] --> A +I[内部服务] --> A +``` + +**图示来源** +- [go.mod](file://go.mod) +- [card_apple.go](file://internal/consts/card_apple.go) + +**章节来源** +- [go.mod](file://go.mod) +- [card_apple.go](file://internal/consts/card_apple.go) + +## 性能考虑 +在高并发场景下,Apple卡密管理系统需要考虑多个性能优化点,包括数据库查询优化、缓存策略和并发控制等。 + +- **数据库优化**:对关键查询字段建立索引,优化SQL语句 +- **缓存策略**:使用Redis缓存频繁访问的数据,减少数据库压力 +- **并发控制**:使用分布式锁防止重复充值和账户余额超扣 +- **异步处理**:将非关键操作异步化,提高系统响应速度 + +## 故障排除指南 +本节提供Apple卡密管理系统常见问题的解决方案和调试建议。 + +**章节来源** +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/order.go) + +## 结论 +Apple卡密管理系统通过清晰的分层架构和模块化设计,实现了账户管理、充值处理和系统集成等核心功能。系统具备良好的可维护性和可扩展性,能够满足业务发展的需求。建议持续优化性能瓶颈,加强异常处理和监控能力,确保系统的稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密账户管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密账户管理.md new file mode 100644 index 00000000..b93b7898 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/Apple卡密管理逻辑/Apple卡密账户管理.md @@ -0,0 +1,350 @@ +# Apple卡密账户管理 + + +**本文档引用的文件** +- [account.go](file://internal/logic/card_apple_account/account.go) +- [schdule.go](file://internal/logic/card_apple_account/schdule.go) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_info_apple_v1_card_info_update.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go) +- [card_info_apple_v1_card_info_delete.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go) +- [card_info_apple_v1_card_info_update_status.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_update_status.go) +- [card_info_apple_v1_card_history_info_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [v_1_card_apple_account_info.go](file://internal/model/do/v_1_card_apple_account_info.go) +- [v_1_card_apple_account_info.go](file://internal/model/entity/v_1_card_apple_account_info.go) +- [card_apple.go](file://internal/consts/card_apple.go) +- [config.go](file://utility/config/config.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文档详细阐述了Apple卡密账户管理系统的实现细节,包括账户的创建、更新、删除和状态管理流程。系统实现了完整的账户生命周期管理,涵盖账户激活、暂停、恢复等状态转换逻辑。文档还解释了账户与商户、订单系统的集成关系,提供了关键业务方法的实现细节,记录了异常处理策略和数据一致性保障机制,并包含性能优化建议和常见问题解决方案。 + +## 项目结构 +Apple卡密账户管理系统采用分层架构设计,主要包含API接口层、业务逻辑层、数据访问层和配置层。系统通过API接口暴露账户管理功能,由业务逻辑层处理核心业务规则,数据访问层负责与数据库交互,配置层管理系统的各项配置参数。 + +```mermaid +graph TB +subgraph "API接口层" +API[card_info_apple/v1] +end +subgraph "业务逻辑层" +Logic[internal/logic/card_apple_account] +end +subgraph "服务层" +Service[internal/service/card_apple_account] +end +subgraph "数据访问层" +DAO[internal/dao] +Model[internal/model] +end +subgraph "配置层" +Config[utility/config] +Consts[internal/consts] +end +API --> Logic +Logic --> Service +Service --> DAO +DAO --> Model +Config --> Service +Consts --> Service +``` + +**图表来源** +- [card_info_apple/v1](file://api/card_info_apple/v1) +- [internal/logic/card_apple_account](file://internal/logic/card_apple_account) +- [internal/service/card_apple_account.go](file://internal/service/card_apple_account.go) +- [internal/dao](file://internal/dao) +- [internal/model](file://internal/model) +- [utility/config](file://utility/config) +- [internal/consts](file://internal/consts) + +**章节来源** +- [internal/logic/card_apple_account](file://internal/logic/card_apple_account) +- [api/card_info_apple/v1](file://api/card_info_apple/v1) + +## 核心组件 +Apple卡密账户管理系统的核心组件包括账户管理服务、状态管理模块、钱包管理模块和账户分配算法。这些组件协同工作,确保账户的创建、更新、删除和状态转换能够正确执行,并保证数据的一致性和系统的稳定性。 + +**章节来源** +- [account.go](file://internal/logic/card_apple_account/account.go) +- [schdule.go](file://internal/logic/card_apple_account/schdule.go) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go) + +## 架构概述 +系统采用典型的分层架构,各层职责分明,通过清晰的接口进行交互。API层接收外部请求,调用服务层提供的接口;服务层协调业务逻辑层完成具体业务操作;业务逻辑层实现核心业务规则,并调用数据访问层进行数据持久化。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API控制器" +participant Service as "服务层" +participant Logic as "业务逻辑层" +participant DAO as "数据访问层" +participant DB as "数据库" +Client->>API : 创建账户请求 +API->>Service : 调用Add方法 +Service->>Logic : 执行添加逻辑 +Logic->>DAO : 插入账户数据 +DAO->>DB : 执行INSERT语句 +DB-->>DAO : 返回结果 +DAO-->>Logic : 返回操作结果 +Logic-->>Service : 返回成功/失败 +Service-->>API : 返回结果 +API-->>Client : 返回响应 +Note over Client,DB : 账户创建流程 +``` + +**图表来源** +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [account.go](file://internal/logic/card_apple_account/account.go) +- [v_1_card_apple_account_info.go](file://internal/model/do/v_1_card_apple_account_info.go) + +## 详细组件分析 +### 账户管理分析 +账户管理组件负责处理Apple卡密账户的全生命周期管理,包括创建、更新、删除和查询等操作。系统通过一系列接口和方法实现这些功能,确保账户数据的完整性和一致性。 + +#### 账户创建流程 +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> CheckExistence["检查账户是否已存在"] +CheckExistence --> IsExist{"账户已存在?"} +IsExist --> |是| ReturnError["返回错误: 账户已存在"] +IsExist --> |否| GenerateUUID["生成账户UUID"] +GenerateUUID --> SetDefaultStatus["设置默认状态为正常"] +SetDefaultStatus --> InsertDB["插入数据库"] +InsertDB --> IsSuccess{"插入成功?"} +IsSuccess --> |是| UpdateCache["更新缓存"] +IsSuccess --> |否| HandleDBError["处理数据库错误"] +UpdateCache --> End([结束]) +HandleDBError --> End +``` + +**图表来源** +- [account.go](file://internal/logic/card_apple_account/account.go#L33-L58) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go#L15-L42) + +**章节来源** +- [account.go](file://internal/logic/card_apple_account/account.go#L33-L58) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go#L15-L42) + +#### 账户状态管理 +```mermaid +stateDiagram-v2 +[*] --> Normal +Normal --> Forbidden : 暂停账户 +Forbidden --> Normal : 恢复账户 +Normal --> Limited : 达到充值限制 +Limited --> Normal : 重置限制 +Normal --> WrongPassword : 密码错误 +WrongPassword --> Normal : 修正密码 +Normal --> ForbiddenByLowRecharge : 低于最小充值金额 +ForbiddenByLowRecharge --> Normal : 重新激活 +state Normal { +[*] --> Active +Active --> Processing : 开始充值 +Processing --> Active : 充值完成 +Processing --> Limited : 达到限制 +} +``` + +**图表来源** +- [card_apple.go](file://internal/consts/card_apple.go#L15-L18) +- [account.go](file://internal/logic/card_apple_account/account.go#L38-L47) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go#L13-L33) + +**章节来源** +- [card_apple.go](file://internal/consts/card_apple.go#L15-L18) +- [account.go](file://internal/logic/card_apple_account/account.go#L38-L47) +- [card_info_apple_v1_card_info_suspend_or_continue.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_suspend_or_continue.go#L13-L33) + +### 账户分配算法 +账户分配算法是系统的核心组件之一,负责在多个可用账户中选择最合适的账户来处理充值订单。系统提供了多种分配策略,以适应不同的业务场景和性能要求。 + +#### 账户分配流程 +```mermaid +flowchart TD +Start([开始]) --> GetCurrentAccount["获取当前目标账户"] +GetCurrentAccount --> FindAvailableAccounts["查找可用账户"] +FindAvailableAccounts --> FilterByStatus["筛选正常状态账户"] +FilterByStatus --> CheckBalance["检查商户余额"] +CheckBalance --> IsEnough{"余额充足?"} +IsEnough --> |否| ReturnEmpty["返回空结果"] +IsEnough --> |是| SelectAccount["选择最合适的账户"] +SelectAccount --> UpdateTargetAccount["更新目标账户缓存"] +UpdateTargetAccount --> SetAccountLimit["设置账户调用限制"] +SetAccountLimit --> End([返回选中账户]) +``` + +**图表来源** +- [schdule.go](file://internal/logic/card_apple_account/schdule.go#L0-L27) +- [account.go](file://internal/logic/card_apple_account/account.go#L198-L203) + +**章节来源** +- [schdule.go](file://internal/logic/card_apple_account/schdule.go#L0-L27) +- [account.go](file://internal/logic/card_apple_account/account.go#L198-L203) + +## 依赖分析 +系统各组件之间存在明确的依赖关系,通过接口定义和依赖注入实现松耦合。这种设计使得系统更易于维护和扩展,同时也便于单元测试。 + +```mermaid +classDiagram +class IAppleAccount { ++Add(ctx, data, tx) err ++Update(ctx, data, tx) err ++Delete(ctx, id, tx) err ++List(ctx, input) total, data, err ++GetDetailById(ctx, id) data, err ++ModifyStatus(ctx, id, status, tx) err ++GetAccordingAccount(ctx, machineId, amount) data, err +} +class sAppleAccount { +-Add(ctx, data, tx) err +-Update(ctx, data, tx) err +-Delete(ctx, id, tx) err +-List(ctx, input) total, data, err +-GetDetailById(ctx, id) data, err +-ModifyStatus(ctx, id, status, tx) err +-GetAccordingAccount(ctx, machineId, amount) data, err +} +class ControllerV1 { ++CardInfoCreate(ctx, req) res, err ++CardInfoUpdate(ctx, req) res, err ++CardInfoDelete(ctx, req) res, err ++CardInfoSuspendOrContinue(ctx, req) res, err ++CardInfoUpdateStatus(ctx, req) res, err +} +IAppleAccount <|-- sAppleAccount : "实现" +ControllerV1 --> IAppleAccount : "依赖" +sAppleAccount --> DAO : "依赖" +DAO --> DB : "依赖" +note right of IAppleAccount +服务接口定义了Apple账户管理 +所有必须实现的方法 +end +note left of sAppleAccount +具体实现类包含了所有 +业务逻辑的实现细节 +end +``` + +**图表来源** +- [card_apple_account.go](file://internal/service/card_apple_account.go#L18-L77) +- [account.go](file://internal/logic/card_apple_account/account.go#L31-L31) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go#L15-L42) + +**章节来源** +- [card_apple_account.go](file://internal/service/card_apple_account.go#L18-L77) +- [account.go](file://internal/logic/card_apple_account/account.go#L31-L31) +- [card_info_apple_v1_card_info_create.go](file://internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go#L15-L42) + +## 性能考虑 +系统在设计时充分考虑了性能因素,通过缓存机制、数据库优化和并发控制等手段确保系统在高负载下的稳定运行。账户分配算法特别针对多线程环境进行了优化,避免了性能瓶颈。 + +**章节来源** +- [schdule.go](file://internal/logic/card_apple_account/schdule.go#L0-L27) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go#L0-L19) + +## 故障排除指南 +### 常见问题及解决方案 +当遇到账户管理相关问题时,可以按照以下步骤进行排查: + +1. **账户创建失败**:检查账户名是否重复,确保上传用户ID有效 +2. **状态更新失败**:验证账户ID是否存在,确认当前状态是否允许转换 +3. **分配账户失败**:检查是否有可用的正常状态账户,确认商户余额是否充足 +4. **钱包余额不一致**:运行余额校正功能,检查流水记录是否完整 + +**章节来源** +- [account.go](file://internal/logic/card_apple_account/account.go) +- [wallet.go](file://internal/logic/card_apple_account/wallet.go) + +## 结论 +Apple卡密账户管理系统通过清晰的分层架构和模块化设计,实现了完整的账户生命周期管理功能。系统不仅提供了基本的CRUD操作,还包含了复杂的状态管理、账户分配算法和数据一致性保障机制。通过合理的缓存策略和并发控制,系统能够在高负载环境下稳定运行,满足业务需求。 + +## 附录 +### 数据库表结构 +```mermaid +erDiagram +CARD_APPLE_ACCOUNT_INFO { +string id PK +string account UK +string password +float balance +float balance_itunes +int status +float today_recharge_amount +int today_recharge_count +datetime today_recharge_datetime +string created_user_id FK +string created_user_role +int max_amount_limit +int max_count_limit +string remark +datetime created_at +datetime updated_at +datetime deleted_at +} +CARD_APPLE_ACCOUNT_INFO_HISTORY { +string id PK +string account_id FK +string order_no +float amount +string account_name +string created_user_id +float balance_before_itunes +float balance_after_itunes +float balance_before_auto_increment +float balance_after_auto_increment +string transaction_type +string description +datetime created_at +datetime updated_at +} +SYS_USER { +string id PK +string username UK +string nick_name +string password +string avatar +string phone +string email +int status +datetime created_at +datetime updated_at +datetime deleted_at +} +CARD_APPLE_ACCOUNT_INFO ||--o{ CARD_APPLE_ACCOUNT_INFO_HISTORY : "包含" +SYS_USER ||--o{ CARD_APPLE_ACCOUNT_INFO : "创建" +``` + +**图表来源** +- [v_1_card_apple_account_info.go](file://internal/model/do/v_1_card_apple_account_info.go#L12-L31) +- [v_1_card_apple_account_info.go](file://internal/model/entity/v_1_card_apple_account_info.go#L11-L29) + +### 状态码定义 +| 状态码 | 名称 | 描述 | +|--------|------|------| +| 1 | AppleAccountNormal | 账户正常,可用于充值 | +| 2 | AppleAccountForbidden | 账户被禁用,不可用 | +| 3 | AppleAccountLimited | 账户达到单日充值限制 | +| 4 | AppleAccountWrongPassword | 账户密码错误 | +| 5 | AppleAccountForbiddenByLowRecharge | 因低于最小充值金额被冻结 | + +**图表来源** +- [card_apple.go](file://internal/consts/card_apple.go#L15-L18) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密兑换处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密兑换处理.md new file mode 100644 index 00000000..dd96182e --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密兑换处理.md @@ -0,0 +1,264 @@ +# 京东卡密兑换处理 + + +**本文档引用文件** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [card_redeem_cookie.go](file://internal/model/card_redeem_cookie.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) +- [v_1_card_redeem_cookie_info.go](file://internal/dao/v_1_card_redeem_cookie_info.go) +- [v_1_card_redeem_cookie_order_jd.go](file://internal/dao/v_1_card_redeem_cookie_order_jd.go) +- [entity/v_1_card_redeem_cookie_order.go](file://internal/model/entity/v_1_card_redeem_cookie_order.go) +- [entity/v_1_card_redeem_cookie_info.go](file://internal/model/entity/v_1_card_redeem_cookie_info.go) +- [entity/v_1_card_redeem_cookie_order_jd.go](file://internal/model/entity/v_1_card_redeem_cookie_order_jd.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了京东卡密兑换处理系统的核心功能,包括兑换订单的创建、状态管理、历史查询等关键流程。文档深入分析了订单生命周期、状态转换规则和持久化机制,详细说明了兑换请求的处理流程,涵盖参数验证、库存检查、交易执行等环节。同时,文档解释了订单与账户、支付系统的集成模式,记录了兑换处理中的异常处理策略、幂等性保障和数据一致性机制,并提供了性能优化建议和常见问题解决方案。 + +## 项目结构 +京东卡密兑换处理功能主要集中在 `api/card_redeem_jd` 和 `internal` 目录下。API 接口定义在 `api/card_redeem_jd/v1` 中,核心业务逻辑位于 `internal/logic/card_redeem_cookie`,数据访问层在 `internal/dao`,服务接口在 `internal/service`,数据模型在 `internal/model/entity`。常量定义在 `internal/consts` 目录下,用于统一管理订单状态、账号状态等枚举值。 + +```mermaid +graph TB +subgraph "API层" +A[api/card_redeem_jd/v1/order.go] +end +subgraph "控制层" +B[internal/controller/card_redeem_jd] +end +subgraph "服务层" +C[internal/service/card_redeem_cookie.go] +end +subgraph "逻辑层" +D[internal/logic/card_redeem_cookie/order.go] +end +subgraph "数据访问层" +E[internal/dao/v_1_card_redeem_cookie_*.go] +end +subgraph "实体层" +F[internal/model/entity/v_1_card_redeem_cookie_*.go] +end +A --> B +B --> C +C --> D +D --> E +E --> F +``` + +**图示来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) +- [entity/v_1_card_redeem_cookie_order.go](file://internal/model/entity/v_1_card_redeem_cookie_order.go) + +**本节来源** +- [api/card_redeem_jd/v1/order.go](file://api/card_redeem_jd/v1/order.go) +- [internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) + +## 核心组件 +京东卡密兑换处理的核心组件包括订单管理、账号管理、状态机和持久化层。订单管理负责处理兑换请求的创建、查询和状态更新;账号管理负责维护京东账号(Cookie)的状态和调度;状态机定义了订单和账号的完整生命周期;持久化层通过数据库表存储所有关键数据。系统通过 `CardRedeemCookie` 服务接口协调各组件,确保兑换流程的原子性和一致性。 + +**本节来源** +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) + +## 架构概览 +系统采用分层架构,从上至下分为API层、控制层、服务层、逻辑层、数据访问层和实体层。API层定义了HTTP接口,控制层处理请求并调用服务,服务层提供统一的业务接口,逻辑层实现具体的业务规则,数据访问层与数据库交互,实体层映射数据库表结构。这种分层设计确保了代码的高内聚、低耦合,便于维护和扩展。 + +```mermaid +graph TD +A[客户端] --> B[API接口] +B --> C[控制器] +C --> D[服务接口] +D --> E[业务逻辑] +E --> F[数据访问对象] +F --> G[(数据库)] +style A fill:#f9f,stroke:#333 +style G fill:#ccf,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) + +## 详细组件分析 + +### 兑换订单处理分析 +兑换订单处理是系统的核心功能,主要涉及订单创建、状态管理和查询。当用户发起兑换请求时,系统首先进行参数验证,然后创建或查找订单,最后调用京东接口完成兑换。 + +#### 对象导向组件 +```mermaid +classDiagram +class V1CardRedeemCookieOrder { ++int id ++string orderNo ++string bankOrderId ++float orderAmount ++string status ++string note ++int cookieId ++string jdOrderNo ++datetime createdAt ++datetime updatedAt +} +class V1CardRedeemCookieInfo { ++int id ++string name ++string cookie ++string status ++uint failCount ++datetime createdAt ++datetime updatedAt +} +class V1CardRedeemCookieOrderJd { ++uint id ++int cookieOrderId ++int cookieAccountId ++string responseData ++string status ++string payId ++string webPayLink ++string clientPayLink ++string orderNo ++string userAgent ++string userClient ++string note ++datetime createdAt ++datetime updatedAt ++string cardNo ++string cardPassword ++string category +} +V1CardRedeemCookieOrder --> V1CardReedemCookieInfo : "使用" +V1CardReedemCookieOrder --> V1CardReedemCookieOrderJd : "包含" +``` + +**图示来源** +- [entity/v_1_card_redeem_cookie_order.go](file://internal/model/entity/v_1_card_redeem_cookie_order.go) +- [entity/v_1_card_redeem_cookie_info.go](file://internal/model/entity/v_1_card_redeem_cookie_info.go) +- [entity/v_1_card_redeem_cookie_order_jd.go](file://internal/model/entity/v_1_card_redeem_cookie_order_jd.go) + +#### API/服务组件 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "逻辑层" +participant DB as "数据库" +Client->>Controller : POST /cookieInfo/jd/order/placeOrder +Controller->>Service : PlaceOrder(请求参数) +Service->>Logic : PlaceOrder(输入模型) +Logic->>Logic : 获取或创建订单 +Logic->>Logic : 调度京东账号 +Logic->>Logic : 调用京东接口下单 +Logic->>DB : 更新订单状态 +DB-->>Logic : 操作结果 +Logic-->>Service : 返回订单信息 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回支付链接 +``` + +**图示来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) + +#### 复杂逻辑组件 +```mermaid +flowchart TD +Start([开始下单]) --> ValidateInput["验证输入参数"] +ValidateInput --> CheckOrder{"订单是否存在?"} +CheckOrder --> |是| GetOrder["获取现有订单"] +CheckOrder --> |否| CreateOrder["创建新订单"] +CreateOrder --> InitOrder["初始化订单状态为init"] +GetOrder --> CheckStatus{"订单状态为success?"} +CheckStatus --> |是| ReturnSuccess["直接返回成功"] +CheckStatus --> |否| ScheduleAccount["调度京东账号"] +ScheduleAccount --> CallJdApi["调用京东接口下单"] +CallJdApi --> CheckResult{"下单成功?"} +CheckResult --> |是| UpdateStatusSuccess["更新状态为placeSuccess"] +CheckResult --> |否| UpdateStatusFail["更新状态为placeFail"] +UpdateStatusSuccess --> ReturnPayLink["返回支付链接"] +UpdateStatusFail --> ReturnError["返回错误信息"] +ReturnSuccess --> End([结束]) +ReturnPayLink --> End +ReturnError --> End +``` + +**图示来源** +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [card_redeem_cookie.go](file://internal/model/card_redeem_cookie.go) + +**本节来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) + +## 依赖分析 +系统内部组件之间存在明确的依赖关系。API层依赖于控制器,控制器依赖于服务接口,服务接口依赖于具体的逻辑实现,逻辑实现依赖于数据访问对象,数据访问对象依赖于数据库实体。外部依赖包括数据库(通过GORM操作)、京东API(通过integration包调用)和配置管理(通过utility/config)。系统通过接口隔离和依赖注入确保了组件间的松耦合。 + +```mermaid +graph LR +A[API] --> B[Controller] +B --> C[Service Interface] +C --> D[Logic Implementation] +D --> E[DAO] +E --> F[Entity] +F --> G[(Database)] +D --> H[External API] +D --> I[Config] +style A fill:#f96,stroke:#333 +style G fill:#ccf,stroke:#333 +style H fill:#6f9,stroke:#333 +``` + +**图示来源** +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) +- [entity/v_1_card_redeem_cookie_order.go](file://internal/model/entity/v_1_card_redeem_cookie_order.go) + +**本节来源** +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_order.go](file://internal/dao/v_1_card_redeem_cookie_order.go) + +## 性能考虑 +系统在性能方面采取了多项优化措施。首先,通过 `gmlock` 实现了基于订单ID的分布式锁,防止同一订单被重复处理,保障了幂等性。其次,数据库查询使用了索引优化,如在 `bank_order_id` 和 `created_at` 字段上建立索引,确保查询效率。此外,系统采用了事务管理,确保订单创建和状态更新的原子性。对于高并发场景,建议引入缓存机制,如Redis,缓存热门商品信息和账号状态,减轻数据库压力。 + +## 故障排除指南 +常见问题包括下单失败、支付链接为空、账号调度失败等。对于下单失败,应检查京东API返回的错误信息,通常记录在订单的 `note` 字段中。支付链接为空可能是由于京东接口未返回支付链接,需检查请求参数和账号状态。账号调度失败可能是因为所有账号都处于禁用或过期状态,需检查 `v1_card_redeem_cookie_info` 表中的账号状态。系统日志记录在 `glog` 中,可通过日志级别(Info、Error)快速定位问题。 + +**本节来源** +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [v_1_card_redeem_cookie_info.go](file://internal/model/entity/v_1_card_redeem_cookie_info.go) + +## 结论 +京东卡密兑换处理系统设计合理,功能完整,具备良好的可维护性和扩展性。系统通过清晰的分层架构和严格的接口定义,实现了高内聚低耦合的设计目标。状态机和持久化机制确保了数据的一致性和可靠性。未来可考虑引入消息队列解耦订单处理流程,进一步提升系统的吞吐量和容错能力。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密分组管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密分组管理.md new file mode 100644 index 00000000..ce27de6f --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密分组管理.md @@ -0,0 +1,248 @@ +# 京东卡密分组管理 + + +**本文档引用文件** +- [group.go](file://internal/logic/card_redeem_account/group.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem.go](file://internal/model/card_redeem.go) +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [consts.go](file://internal/consts/card_redeem.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了京东卡密分组管理系统的功能实现,涵盖账户分组的创建、更新、删除和统计功能。系统通过分组机制实现对京东卡密账户的高效组织与管理,支持分组级别的操作权限控制和统计信息计算。文档深入分析了分组数据结构、成员管理规则、统计计算逻辑以及异常处理机制,为开发者和运维人员提供全面的技术参考。 + +## 项目结构 +京东卡密分组管理功能主要分布在后端项目的特定目录中,采用分层架构设计,包括API接口层、服务层、逻辑层和数据访问层。各层职责分明,确保代码的可维护性和可扩展性。 + +```mermaid +graph TD +subgraph "API接口层" +A[card_info_jd/v1/account.go] +B[card_info_walmart/v1/group.go] +end +subgraph "服务层" +C[service/card_redeem_account.go] +end +subgraph "逻辑层" +D[logic/card_redeem_account/group.go] +E[logic/card_redeem_account/summary.go] +end +subgraph "数据访问层" +F[dao/v_1_card_redeem_account_group.go] +G[dao/v_1_card_redeem_account_info.go] +end +subgraph "模型层" +H[model/entity/v_1_card_redeem_account_group.go] +I[model/entity/v_1_card_redeem_account_info.go] +end +A --> C +B --> C +C --> D +C --> E +D --> F +E --> G +D --> H +E --> I +``` + +**图示来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L1-L20) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L1-L20) +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go#L1-L10) + +**本节来源** +- [internal/logic/card_redeem_account/group.go](file://internal/logic/card_redeem_account/group.go#L1-L50) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go#L1-L30) + +## 核心组件 +京东卡密分组管理的核心组件包括分组管理服务、分组数据模型和分组统计逻辑。这些组件协同工作,实现分组的全生命周期管理。 + +**本节来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L19-L31) +- [card_redeem.go](file://internal/model/card_redeem.go#L1-L20) + +## 架构概述 +系统采用典型的分层架构,从上至下分为API接口层、服务层、逻辑层和数据访问层。API接口层接收外部请求,服务层定义业务接口,逻辑层实现具体业务逻辑,数据访问层负责与数据库交互。 + +```mermaid +graph TB +subgraph "表现层" +API[API接口] +end +subgraph "服务层" +Service[分组管理服务] +end +subgraph "逻辑层" +Logic[分组管理逻辑] +end +subgraph "数据层" +DAO[数据访问对象] +DB[(数据库)] +end +API --> Service +Service --> Logic +Logic --> DAO +DAO --> DB +``` + +**图示来源** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L10-L50) +- [group.go](file://internal/logic/card_redeem_account/group.go#L20-L40) + +## 详细组件分析 + +### 分组管理功能分析 +分组管理功能提供了完整的CRUD操作,包括分组的创建、查询、更新和删除。每个操作都经过精心设计,确保数据的一致性和安全性。 + +#### 分组数据结构 +```mermaid +classDiagram +class V1CardRedeemAccountGroup { ++int id ++string name ++string notes ++string category ++string createdUserId ++*gtime.Time createdAt ++*gtime.Time updatedAt ++*gtime.Time deletedAt +} +class V1CardRedeemAccountInfo { ++string id ++int groupId ++string name ++string cookie ++string nickname ++string username ++string createUserId ++string category ++float64 amountTotalSum ++float64 amountTodaySum ++float64 balance ++float64 effectiveBalance ++int status ++int maxCountLimit ++int maxAmountLimit ++int amountTotalCount ++int amountTodayCount ++bool accountStatus ++string remark ++*gtime.Time createdAt ++*gtime.Time updatedAt ++*gtime.Time deletedAt +} +V1CardRedeemAccountInfo --> V1CardRedeemAccountGroup : "belongsTo" +V1CardRedeemAccountGroup --> V1CardRedeemAccountInfo : "hasMany" +``` + +**图示来源** +- [v_1_card_redeem_account_group.go](file://internal/model/entity/v_1_card_redeem_account_group.go#L11-L20) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go#L1-L35) + +#### 分组创建流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Service as "分组服务" +participant Logic as "分组逻辑" +participant DAO as "数据访问对象" +participant DB as "数据库" +Client->>Service : 调用GroupAdd +Service->>Logic : 转发创建请求 +Logic->>DAO : 构建插入语句 +DAO->>DB : 执行插入操作 +DB-->>DAO : 返回插入ID +DAO-->>Logic : 返回结果 +Logic-->>Service : 返回分组ID +Service-->>Client : 返回成功响应 +Note over Client,DB : 分组创建成功 +``` + +**图示来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L19-L31) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L50-L60) + +#### 分组统计计算逻辑 +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> InputValid{"参数有效?"} +InputValid --> |否| ReturnError["返回错误"] +InputValid --> |是| QueryAccounts["查询关联账户"] +QueryAccounts --> GetAccountList["获取账户列表"] +GetAccountList --> QueryOrders["查询订单数据"] +QueryOrders --> CalculateStats["计算统计指标"] +CalculateStats --> TotalAccount["统计账户总数"] +CalculateStats --> ActiveAccount["统计活跃账户"] +CalculateStats --> OrderCount["统计订单数量"] +CalculateStats --> OrderAmount["统计订单金额"] +CalculateStats --> SuccessCount["统计成功订单"] +CalculateStats --> SuccessAmount["统计成功金额"] +CalculateStats --> ReturnResult["返回统计结果"] +ReturnError --> End([结束]) +ReturnResult --> End +``` + +**图示来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L132-L218) +- [card_redeem.go](file://internal/model/card_redeem.go#L200-L208) + +**本节来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L1-L218) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L1-L120) +- [card_redeem.go](file://internal/model/card_redeem.go#L1-L208) + +## 依赖分析 +分组管理功能依赖于多个核心组件,包括数据库访问层、服务接口和数据模型。这些依赖关系确保了功能的完整性和稳定性。 + +```mermaid +graph TD +GroupService[分组管理服务] --> GroupLogic[分组管理逻辑] +GroupService --> AccountLogic[账户管理逻辑] +GroupLogic --> GroupDAO[分组数据访问] +GroupLogic --> AccountDAO[账户数据访问] +GroupDAO --> Database[数据库] +AccountDAO --> Database +GroupService --> Consts[常量定义] +GroupLogic --> Utils[工具函数] +``` + +**图示来源** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L1-L20) +- [group.go](file://internal/logic/card_redeem_account/group.go#L1-L20) + +**本节来源** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L1-L120) +- [group.go](file://internal/logic/card_redeem_account/group.go#L1-L218) + +## 性能考虑 +在设计分组管理功能时,充分考虑了性能优化。通过合理的数据库索引、事务管理和并发控制,确保系统在高负载下的稳定运行。 + +- **数据库索引**:在分组名称、创建用户ID和创建时间等字段上建立索引,提高查询效率 +- **事务管理**:关键操作使用数据库事务,确保数据一致性 +- **并发控制**:使用全局锁防止分组重复创建 +- **批量操作**:支持批量添加和更新,减少数据库交互次数 +- **缓存机制**:考虑引入缓存层,减少对数据库的直接访问 + +## 故障排除指南 +在使用分组管理功能时,可能会遇到各种问题。以下是一些常见问题及其解决方案: + +**本节来源** +- [group.go](file://internal/logic/card_redeem_account/group.go#L34-L51) +- [group.go](file://internal/logic/card_redeem_account/group.go#L114-L131) + +## 结论 +京东卡密分组管理系统通过完善的分层架构和精心设计的业务逻辑,实现了对卡密账户的高效管理。系统具备良好的可扩展性和稳定性,能够满足大规模业务需求。通过持续优化和改进,系统性能和用户体验将不断提升。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密管理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密管理逻辑.md new file mode 100644 index 00000000..76e52efe --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密管理逻辑.md @@ -0,0 +1,275 @@ +# 京东卡密管理逻辑 + + +**本文档引用文件** +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go) +- [card_info_jd_v1_jd_account_update.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go) +- [card_info_jd_v1_jd_account_delete.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_delete.go) +- [card_info_jd_v1_jd_account_update_status.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_update_status.go) +- [card_redeem_jd_v1_account_add.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_add.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go) +- [operation.go](file://internal/logic/card_redeem_account/operation.go) +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [place.go](file://internal/logic/card_redeem_cookie/place.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [v_1_card_redeem_order_info.go](file://internal/model/entity/v_1_card_redeem_order_info.go) + + +## 目录 +1. [简介](#简介) +2. [京东卡密账户管理](#京东卡密账户管理) +3. [京东卡密兑换流程](#京东卡密兑换流程) +4. [系统集成模式](#系统集成模式) +5. [异常处理与数据一致性](#异常处理与数据一致性) +6. [性能优化建议](#性能优化建议) +7. [常见问题解决方案](#常见问题解决方案) + +## 简介 +本文档详细阐述了京东卡密管理系统的业务逻辑,涵盖账户的创建、更新、删除和状态管理,以及卡密兑换的核心流程。系统通过集成京东平台的API接口,实现了自动化卡密兑换功能,支持账户分组、扣款规则和历史记录管理。文档还详细说明了与订单系统和支付系统的集成模式,以及异常处理策略和数据一致性保障机制。 + +## 京东卡密账户管理 + +京东卡密账户管理模块负责京东卡密账户的全生命周期管理,包括账户的创建、更新、删除和状态变更。系统通过`CardRedeemAccount`服务提供统一的账户管理接口,支持对账户信息的增删改查操作。 + +账户创建时,系统会验证提供的Cookie有效性,并查询账户余额信息。每个账户包含基本信息如用户名、昵称、余额,以及业务配置如最大充值金额限制、最大充值次数限制等。账户支持分组管理,便于按业务需求进行分类。 + +```mermaid +classDiagram +class V1CardRedeemAccountInfo { ++string id ++int groupId ++string name ++string cookie ++string nickname ++string username ++string createUserId ++string category ++float64 balance ++float64 effectiveBalance ++int status ++int maxCountLimit ++int maxAmountLimit ++bool accountStatus ++string remark ++*gtime.Time createdAt ++*gtime.Time updatedAt ++*gtime.Time deletedAt +} +class RedeemAccountAddInput { ++string Category ++bool AccountStatus ++int Status ++string CreateUserId ++string Cookie ++string Username ++string Nickname ++string Name ++int GroupId ++float64 Balance ++int MaxAmountLimit ++int MaxCountLimit ++string Remark +} +class RedeemAccountUpdateInput { ++CommonStrId CommonStrId ++int Status ++string Cookie ++string Name ++string Remark ++int GroupId ++int MaxAmountLimit ++int MaxCountLimit +} +V1CardRedeemAccountInfo <|-- RedeemAccountAddInput +V1CardRedeemAccountInfo <|-- RedeemAccountUpdateInput +``` + +**图示来源** +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go#L1-L36) +- [operation.go](file://internal/logic/card_redeem_account/operation.go#L1-L131) + +**本节来源** +- [card_info_jd_v1_jd_account_create.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go#L22-L52) +- [card_info_jd_v1_jd_account_update.go](file://internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go#L1-L24) +- [operation.go](file://internal/logic/card_redeem_account/operation.go#L1-L131) + +### 账户创建流程 +京东卡密账户创建流程始于用户提交账户信息,包括Cookie、账户名称等。系统首先验证用户登录状态,然后使用提供的Cookie查询京东账户信息。如果账户信息有效且未重复,系统将创建新的卡密账户记录,并初始化账户余额和状态。 + +创建过程中,系统会调用京东API验证Cookie的有效性,并获取账户的用户名和昵称信息。同时,系统会查询账户当前余额,并将其作为初始余额存储。账户创建成功后,系统会记录创建历史,包括初始余额和创建时间等信息。 + +### 账户更新与删除 +账户更新功能允许修改账户的基本信息和业务配置,包括账户状态、名称、备注以及最大充值金额和次数限制。系统在更新账户信息时,会进行必要的验证,确保更新后的配置符合业务规则。 + +账户删除功能会从系统中移除指定的卡密账户。删除操作是永久性的,因此系统会进行确认验证。删除账户时,系统会检查该账户是否有关联的未完成订单,如果有,则不允许删除,以确保业务数据的完整性。 + +### 账户状态管理 +京东卡密账户支持多种状态,包括正常、禁用、临时暂停等。系统通过状态机管理账户状态的转换,确保状态变更的合法性和一致性。例如,当账户因频繁操作被临时暂停时,系统会在一定时间后自动恢复其正常状态。 + +状态管理还包括对账户使用情况的监控,如每日充值限额、累计充值金额等。当账户达到预设的限制条件时,系统会自动变更其状态,防止超额使用。管理员也可以手动调整账户状态,以应对特殊情况。 + +## 京东卡密兑换流程 + +京东卡密兑换流程是系统的核心功能,负责处理用户提交的卡密兑换请求。流程从接收兑换订单开始,经过订单验证、账号分配、卡密绑定到最终结果回调的完整过程。 + +```mermaid +sequenceDiagram +participant 用户 as 用户 +participant 控制器 as 控制器 +participant 服务层 as 服务层 +participant 京东API as 京东API +用户->>控制器 : 提交卡密兑换请求 +控制器->>服务层 : 调用AddOne方法 +服务层->>服务层 : 验证订单信息 +服务层->>服务层 : 分配可用账号 +服务层->>服务层 : 预扣款处理 +服务层->>京东API : 绑定卡密 +京东API-->>服务层 : 返回绑定结果 +服务层->>服务层 : 处理回调数据 +服务层->>服务层 : 完成退款处理 +服务层-->>控制器 : 返回处理结果 +控制器-->>用户 : 返回兑换结果 +``` + +**图示来源** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L28) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L1-L357) +- [place.go](file://internal/logic/card_redeem_cookie/place.go#L1-L200) + +**本节来源** +- [card_info_jd_v1_submit.go](file://internal/controller/card_info_jd/card_info_jd_v1_submit.go#L1-L28) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L1-L357) + +### 兑换订单创建 +用户通过API接口提交卡密兑换请求,包含卡号、卡密、订单金额等信息。系统接收到请求后,首先验证用户权限,然后调用`CardRedeemOrder`服务的`AddOne`方法创建兑换订单。 + +订单创建过程中,系统会进行多项验证,包括卡号格式验证、金额范围验证等。如果验证通过,系统将订单状态设置为"待处理",并将其加入处理队列。订单创建成功后,系统会触发订单处理流程,开始寻找合适的京东账号进行卡密兑换。 + +### 订单状态管理 +京东卡密兑换订单支持多种状态,包括待处理、处理中、充值成功、充值失败等。系统通过状态码精确描述订单的当前状态和处理结果。 + +```mermaid +stateDiagram-v2 +[*] --> 待处理 +待处理 --> 处理中 : 开始处理 +处理中 --> 充值成功 : 绑定成功 +处理中 --> 充值失败 : 绑定失败 +充值成功 --> 已回调 : 回调上游 +充值失败 --> 已回调 : 回调上游 +充值成功 --> 金额异议 : 金额不一致 +金额异议 --> 补卡成功 : 二次处理 +充值失败 --> 重复订单 : 重复提交 +充值失败 --> 卡密冻结 : 账号问题 +``` + +**图示来源** +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L118) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L177-L200) + +**本节来源** +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L118) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L177-L200) + +### 历史查询功能 +系统提供完整的兑换历史查询功能,支持按订单号、时间范围、状态等多种条件进行查询。历史记录包含订单的完整处理过程,包括每次状态变更的时间和原因。 + +历史查询接口返回详细的订单信息,包括卡号、卡密(脱敏)、订单金额、实际金额、处理结果等。系统还记录了与订单相关的操作日志,便于问题排查和审计。对于失败的订单,系统会记录详细的失败原因,帮助用户理解问题所在。 + +## 系统集成模式 + +京东卡密管理系统与订单系统和支付系统通过API接口进行集成,实现了业务流程的自动化和数据的实时同步。 + +```mermaid +flowchart TD +A[用户] --> B[前端应用] +B --> C[京东卡密API] +C --> D[订单系统] +C --> E[支付系统] +D --> F[京东API] +E --> G[第三方支付] +F --> H[京东卡密] +G --> I[用户钱包] +H --> J[兑换结果] +I --> J +J --> K[回调通知] +K --> D +K --> E +``` + +**图示来源** +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go#L1-L44) +- [place.go](file://internal/logic/card_redeem_cookie/place.go#L1-L200) + +**本节来源** +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go#L1-L44) +- [place.go](file://internal/logic/card_redeem_cookie/place.go#L1-L200) + +### 与订单系统集成 +系统与订单系统通过标准化的API接口进行通信。当用户提交卡密兑换请求时,京东卡密系统会创建相应的兑换订单,并与订单系统中的主订单进行关联。 + +订单状态的变更会实时同步到订单系统,确保两个系统间的数据一致性。当兑换成功时,系统会通知订单系统更新订单状态;当兑换失败时,系统会提供详细的失败原因,便于订单系统进行相应的处理。 + +### 与支付系统集成 +支付系统集成主要体现在扣款和退款两个方面。在卡密兑换过程中,系统会从京东账号中预扣相应金额,确保有足够的余额完成兑换。如果兑换成功,预扣金额将正式扣除;如果兑换失败,系统会执行退款操作,将金额返还到原账户。 + +系统通过支付系统的API接口发起扣款和退款请求,并处理相应的回调通知。支付结果会记录在兑换订单的历史记录中,形成完整的交易流水。 + +## 异常处理与数据一致性 + +系统设计了完善的异常处理机制,确保在各种异常情况下仍能保持数据的一致性和业务的连续性。 + +### 异常处理策略 +系统识别并处理多种异常情况,包括网络超时、接口调用失败、数据验证失败等。对于可恢复的异常,系统会进行重试;对于不可恢复的异常,系统会记录详细的错误信息,并将订单状态更新为相应的失败状态。 + +```mermaid +flowchart TD +A[异常发生] --> B{异常类型} +B --> |网络异常| C[重试机制] +B --> |数据验证失败| D[返回用户] +B --> |账号问题| E[更换账号] +B --> |系统错误| F[记录日志] +C --> G[成功处理] +C --> H[达到重试上限] +H --> I[标记失败] +D --> I +E --> G +F --> I +I --> J[通知用户] +``` + +**图示来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L118) + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L118) + +### 数据一致性保障 +系统通过数据库事务和分布式锁机制保障数据一致性。关键操作如账户余额变更、订单状态更新等都在数据库事务中执行,确保操作的原子性。 + +对于并发访问的资源,系统使用分布式锁进行保护,防止竞态条件导致的数据不一致。例如,在处理同一订单时,系统会获取订单级别的锁,确保同一时间只有一个进程在处理该订单。 + +## 性能优化建议 + +### 并发处理优化 +系统采用并发处理机制提高订单处理效率。通过goroutine池管理并发任务,避免创建过多的goroutine导致系统资源耗尽。同时,系统设置了合理的并发数限制,平衡处理速度和系统负载。 + +### 缓存策略 +系统充分利用缓存减少对后端服务的调用。对于频繁访问的数据,如京东账户信息、配置信息等,系统会将其缓存到内存中,并设置合理的过期时间。这不仅提高了访问速度,也减轻了后端服务的压力。 + +### 数据库优化 +数据库层面,系统通过索引优化、查询优化等手段提高数据访问效率。对于大表查询,系统采用分页处理,避免一次性加载过多数据。同时,系统定期清理过期的历史数据,保持数据库的良好性能。 + +## 常见问题解决方案 + +### 账户Cookie失效 +当账户Cookie失效时,系统会自动检测并更新账户状态。解决方案包括重新获取有效的Cookie,或使用备用账号进行兑换。系统会记录Cookie失效的次数,当达到一定阈值时,会通知管理员进行处理。 + +### 兑换金额不一致 +当出现兑换金额与订单金额不一致的情况时,系统会根据配置决定是否允许此类交易。如果允许,系统会记录为"金额异议"状态,并在后续处理中进行补偿。如果不允许,系统会直接拒绝该订单。 + +### 高并发处理 +在高并发场景下,系统可能面临资源竞争和性能瓶颈。解决方案包括增加服务器资源、优化数据库性能、调整并发处理策略等。系统还提供了监控指标,便于及时发现和解决性能问题。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密账户管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密账户管理.md new file mode 100644 index 00000000..8c6ba84c --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/京东卡密管理逻辑/京东卡密账户管理.md @@ -0,0 +1,224 @@ +# 京东卡密账户管理 + + +**本文档引用的文件** +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [status.go](file://internal/logic/card_redeem_account/status.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录) (如有必要) + +## 简介 +本文档详细阐述了京东卡密账户管理系统的设计与实现。系统主要负责管理京东卡密账户的创建、更新、删除和状态管理流程,包括账户信息的数据结构、验证规则和持久化机制。文档深入解析了账户状态机设计,涵盖正常、暂停、禁用等状态的转换逻辑,并解释了账户与商户、支付渠道的关联关系。通过具体的代码示例,展示了关键业务方法如账户创建、状态更新的实现细节。同时,文档记录了账户管理中的异常处理策略和数据一致性保障机制,并提供了性能优化建议和常见问题解决方案。 + +## 项目结构 +京东卡密账户管理功能主要分布在项目的`internal`目录下,特别是`internal/consts`、`internal/logic`、`internal/model`和`internal/service`等子目录。核心的账户状态定义位于`internal/consts/card_redeem.go`,业务逻辑实现在`internal/logic/card_redeem_account`包中,数据模型定义在`internal/model/entity`和`internal/model/do`包中,服务接口则在`internal/service`包中声明。 + +```mermaid +graph TB +subgraph "API接口层" +A[card_redeem_jd_v1_account_status.go] +end +subgraph "服务层" +B[card_redeem_account.go] +end +subgraph "业务逻辑层" +C[status.go] +end +subgraph "数据模型层" +D[v_1_card_redeem_account_info.go] +end +subgraph "常量定义层" +E[card_redeem.go] +end +A --> B --> C --> D +E --> C +``` + +**图示来源** +- [card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [status.go](file://internal/logic/card_redeem_account/status.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +**节来源** +- [internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 核心组件 +京东卡密账户管理的核心组件包括账户状态机、账户数据模型、状态更新服务和控制器。账户状态机定义了账户的多种状态及其转换规则,确保账户状态的正确性和一致性。账户数据模型定义了账户信息的结构,包括账户ID、名称、Cookie、状态等字段。状态更新服务提供了更新账户状态的业务逻辑,而控制器则负责处理外部请求并调用服务层的方法。 + +**节来源** +- [internal/consts/card_redeem.go](file://internal/consts/card_redeem.go) +- [internal/model/entity/v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [internal/logic/card_redeem_account/status.go](file://internal/logic/card_redeem_account/status.go) + +## 架构概述 +京东卡密账户管理系统的架构遵循典型的分层设计模式,包括API接口层、服务层、业务逻辑层和数据模型层。API接口层负责接收外部请求并进行初步处理;服务层定义了业务服务的接口,提供了高层次的业务操作;业务逻辑层实现了具体的业务逻辑,如状态更新、账户调度等;数据模型层定义了数据结构和数据库操作。 + +```mermaid +graph TD +A[客户端] --> B[API接口] +B --> C[服务层] +C --> D[业务逻辑层] +D --> E[数据模型层] +E --> F[数据库] +``` + +**图示来源** +- [card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [status.go](file://internal/logic/card_redeem_account/status.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) + +## 详细组件分析 + +### 账户状态机分析 +京东卡密账户状态机定义了账户的多种状态,包括正常、禁用、充值速度过快、最大充值金额限制等。状态机通过`RedeemAccountStatus`枚举类型定义,每个状态都有对应的文本描述。状态转换由`UpdateStatus`方法控制,该方法根据传入的状态值更新账户状态,并在特定情况下(如状态为`RedeemAccountForbiddenByTooFast`)设置缓存和定时任务。 + +#### 状态机类图 +```mermaid +classDiagram +class RedeemAccountStatus { ++RedeemAccountForbidden : int ++RedeemAccountNormal : int ++RedeemAccountForbiddenByTooFast : int ++RedeemAccountForbiddenByMaxLimit : int ++RedeemAccountLimited : int ++RedeemAccountForbiddenByLowRecharge : int ++RedeemAccountForbiddenBySafetyReason : int ++RedeemAccountTmpStoppedByTooManyRequest : int ++RedeemAccountForbiddenDaily : int ++GetStatusText() : string +} +class V1CardRedeemAccountInfo { ++Id : string ++GroupId : int ++Name : string ++Cookie : string ++Nickname : string ++Username : string ++CreateUserId : string ++Category : string ++AmountTotalSum : float64 ++AmountTodaySum : float64 ++Balance : float64 ++EffectiveBalance : float64 ++Status : int ++MaxCountLimit : int ++MaxAmountLimit : int ++AmountTotalCount : int ++AmountTodayCount : int ++AccountStatus : bool ++Remark : string ++CreatedAt : *gtime.Time ++UpdatedAt : *gtime.Time ++DeletedAt : *gtime.Time +} +class ICardRedeemAccount { ++UpdateStatus(ctx, id, status, tx) : error +} +class sCardRedeemAccount { ++UpdateStatus(ctx, id, status, tx) : error ++CheckForbiddenByTooFast(ctx) : void +} +ICardRedeemAccount <|-- sCardRedeemAccount +sCardRedeemAccount --> V1CardRedeemAccountInfo +sCardRedeemAccount --> RedeemAccountStatus +``` + +**图示来源** +- [card_redeem.go](file://internal/consts/card_redeem.go#L18-L94) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go#L1-L35) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L97-L97) +- [status.go](file://internal/logic/card_redeem_account/status.go#L19-L36) + +### 账户状态更新流程分析 +账户状态更新流程从API接口层开始,经过服务层和业务逻辑层,最终更新数据库中的账户状态。当用户请求更新账户状态时,控制器调用服务层的`UpdateStatus`方法,服务层再调用业务逻辑层的具体实现。在更新状态的同时,系统还会根据状态值执行相应的附加操作,如设置缓存、启动定时任务等。 + +#### 状态更新序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "业务逻辑层" +participant DB as "数据库" +participant Cache as "缓存" +Client->>Controller : 调用AccountStatus接口 +Controller->>Service : 调用UpdateStatus方法 +Service->>Logic : 调用UpdateStatus实现 +Logic->>DB : 更新账户状态 +alt 状态为RedeemAccountForbiddenByTooFast +Logic->>Cache : 设置缓存 +Logic->>Logic : 启动定时任务 +end +DB-->>Logic : 更新成功 +Logic-->>Service : 返回结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回响应 +``` + +**图示来源** +- [card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go#L1-L19) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go#L97-L97) +- [status.go](file://internal/logic/card_redeem_account/status.go#L19-L36) + +**节来源** +- [internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_status.go) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [internal/logic/card_redeem_account/status.go](file://internal/logic/card_redeem_account/status.go) + +## 依赖分析 +京东卡密账户管理系统依赖于多个内部组件和外部库。内部组件包括`internal/consts`、`internal/dao`、`internal/model`和`internal/service`等包,外部库包括`github.com/gogf/gf/v2`系列库和`github.com/duke-git/lancet/v2`库。这些依赖关系确保了系统的模块化和可维护性。 + +```mermaid +graph TD +A[京东卡密账户管理] --> B[internal/consts] +A --> C[internal/dao] +A --> D[internal/model] +A --> E[internal/service] +A --> F[github.com/gogf/gf/v2] +A --> G[github.com/duke-git/lancet/v2] +``` + +**图示来源** +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [status.go](file://internal/logic/card_redeem_account/status.go) +- [v_1_card_redeem_account_info.go](file://internal/model/entity/v_1_card_redeem_account_info.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) + +**节来源** +- [internal/consts/card_redeem.go](file://internal/consts/card_redeem.go) +- [internal/dao](file://internal/dao) +- [internal/model](file://internal/model) +- [internal/service](file://internal/service) + +## 性能考虑 +为了提高系统性能,京东卡密账户管理系统采用了多种优化措施。首先,通过缓存机制减少了对数据库的频繁访问,特别是在处理高并发请求时。其次,使用定时任务异步处理一些耗时操作,如检查账户状态是否需要解封。此外,系统还通过合理的数据库索引和查询优化,提高了数据读写的效率。 + +## 故障排除指南 +在使用京东卡密账户管理系统时,可能会遇到一些常见问题。例如,账户状态无法更新,可能是由于数据库连接问题或事务处理错误。此时,应检查数据库连接配置和事务管理代码。又如,账户状态更新后未生效,可能是由于缓存未及时更新或定时任务未正确执行。此时,应检查缓存设置和定时任务配置。 + +**节来源** +- [internal/consts/card_redeem.go](file://internal/consts/card_redeem.go) +- [internal/logic/card_redeem_account/status.go](file://internal/logic/card_redeem_account/status.go) +- [internal/service/card_redeem_account.go](file://internal/service/card_redeem_account.go) + +## 结论 +京东卡密账户管理系统通过清晰的分层架构和严谨的状态机设计,实现了对账户的高效管理和维护。系统不仅提供了丰富的账户管理功能,还通过缓存、定时任务等技术手段,确保了高性能和高可用性。未来,可以进一步优化系统的监控和报警机制,提高系统的稳定性和可靠性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/卡密管理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/卡密管理逻辑.md new file mode 100644 index 00000000..f5bb4c64 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/卡密管理逻辑.md @@ -0,0 +1,256 @@ +# 卡密管理逻辑 + + +**本文档引用的文件** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [sys_auth.go](file://internal/service/sys_auth.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [operation.go](file://internal/logic/card_redeem_account/operation.go) +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [process.go](file://internal/logic/card_redeem_order/process.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了kami_backend系统中卡密管理的业务逻辑,涵盖Apple、京东、天猫等各平台卡密账户的创建、更新、删除和状态管理流程。文档深入解析了卡密充值逻辑,包括充值历史记录、重复卡密处理、充值状态同步等核心功能。同时,解释了卡密账户与订单系统、支付系统的集成模式,记录了异常处理策略和数据一致性保障机制,并提供了性能优化建议和常见问题解决方案。 + +## 项目结构 +kami_backend项目采用模块化设计,主要分为API接口层、内部逻辑层和工具层。API层按平台划分,如card_info_apple、card_info_jd等,每个平台有独立的v1版本接口。内部逻辑层包含controller、dao、logic、model、service等目录,实现具体的业务逻辑。工具层utility提供缓存、配置、定时任务等通用功能。 + +**Section sources** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) + +## 核心组件 +系统核心组件包括卡密账户管理、卡密订单处理、状态管理、异常处理等。卡密账户管理负责各平台账户的生命周期管理;卡密订单处理负责充值请求的接收、处理和状态更新;状态管理维护账户和订单的各种状态;异常处理确保系统在各种异常情况下的稳定运行。 + +**Section sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) + +## 架构概述 +系统采用分层架构,从上到下分为API层、Controller层、Service层、Logic层和DAO层。API层接收外部请求,Controller层处理请求路由,Service层提供业务服务接口,Logic层实现具体业务逻辑,DAO层负责数据访问。各层之间通过清晰的接口进行通信,确保了系统的可维护性和可扩展性。 + +```mermaid +graph TB +subgraph "API层" +A[Apple API] +B[京东 API] +C[天猫 API] +D[Walmart API] +end +subgraph "Controller层" +E[CardInfoAppleController] +F[CardInfoJDController] +G[CardInfoTMallController] +H[CardInfoWalmartController] +end +subgraph "Service层" +I[CardRedeemAccountService] +J[CardRedeemOrderService] +K[RechargeTMallGameAccountService] +end +subgraph "Logic层" +L[CardRedeemAccountLogic] +M[CardRedeemOrderLogic] +N[CardTmallAccountLogic] +end +subgraph "DAO层" +O[V1CardRedeemAccountInfo] +P[V1CardRedeemOrderInfo] +Q[V1RechargeTmallAccount] +end +A --> E +B --> F +C --> G +D --> H +E --> I +F --> J +G --> K +H --> J +I --> L +J --> M +K --> N +L --> O +M --> P +N --> Q +``` + +**Diagram sources** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) + +## 详细组件分析 + +### 卡密账户管理分析 +卡密账户管理组件负责各平台卡密账户的创建、更新、删除和状态管理。系统通过统一的接口处理不同平台的账户操作,确保了代码的复用性和一致性。 + +#### 对象导向组件 +```mermaid +classDiagram +class ICardRedeemAccount { ++Add(ctx, input, tx) error ++UpdateCookie(ctx, id, cookie, tx) error ++GetByCK(ctx, cookie) ([]*entity.V1CardRedeemAccountInfo, error) ++GetRandomOne(ctx, tx) (data *entity.V1CardRedeemAccountInfo, err error) ++CheckAccountNumberNormal(ctx, accountNumber, tx) bool +} +class CardRedeemAccountService { +-localCardRedeemAccount ICardRedeemAccount ++CardRedeemAccount() ICardRedeemAccount +} +class sCardRedeemAccount { ++Add(ctx, input, tx) error ++AddWithGroup(ctx, input, tx) error ++UpdateCookie(ctx, id, cookie, tx) error +} +ICardRedeemAccount <|.. sCardRedeemAccount : 实现 +CardRedeemAccountService --> ICardRedeemAccount : 使用 +``` + +**Diagram sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [operation.go](file://internal/logic/card_redeem_account/operation.go) + +### 卡密充值流程分析 +卡密充值流程是系统的核心功能,涉及订单创建、状态管理、异常处理等多个环节。系统通过异步处理机制确保充值请求的高效处理。 + +#### API/服务组件 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "Controller" +participant Service as "Service" +participant Logic as "Logic" +participant DAO as "DAO" +Client->>Controller : 提交充值请求 +Controller->>Service : 调用Add方法 +Service->>Logic : 执行业务逻辑 +Logic->>DAO : 检查账号是否存在 +DAO-->>Logic : 返回检查结果 +alt 账号不存在 +Logic->>DAO : 创建新账号 +DAO-->>Logic : 返回创建结果 +else 账号存在 +Logic->>Logic : 更新现有账号 +end +Logic-->>Service : 返回处理结果 +Service-->>Controller : 返回服务结果 +Controller-->>Client : 返回响应 +``` + +**Diagram sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [operation.go](file://internal/logic/card_redeem_account/operation.go) + +### 卡密状态管理分析 +卡密状态管理涉及多种状态的定义和转换,系统通过枚举类型明确定义了各种状态码,确保了状态管理的一致性和可维护性。 + +#### 复杂逻辑组件 +```mermaid +flowchart TD +Start([开始]) --> CheckStatus["检查卡密状态"] +CheckStatus --> StatusValid{"状态有效?"} +StatusValid --> |是| ProcessOrder["处理充值订单"] +StatusValid --> |否| HandleError["处理异常"] +ProcessOrder --> CheckAmount["检查金额一致性"] +CheckAmount --> AmountMatch{"金额匹配?"} +AmountMatch --> |是| CompleteOrder["完成订单"] +AmountMatch --> |否| HandleAmountDiscrepancy["处理金额差异"] +HandleAmountDiscrepancy --> CheckConfig["检查配置是否允许差异"] +CheckConfig --> ConfigAllow{"配置允许?"} +ConfigAllow --> |是| CompleteWithDiff["完成差异订单"] +ConfigAllow --> |否| SuspendCallback["暂停回调"] +CompleteOrder --> End([结束]) +CompleteWithDiff --> End +SuspendCallback --> End +HandleError --> End +``` + +**Diagram sources** +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [process.go](file://internal/logic/card_redeem_order/process.go) + +## 依赖分析 +系统各组件之间存在明确的依赖关系。API层依赖Controller层,Controller层依赖Service层,Service层依赖Logic层,Logic层依赖DAO层。此外,系统还依赖外部服务如缓存、数据库等。 + +```mermaid +graph TD +A[API层] --> B[Controller层] +B --> C[Service层] +C --> D[Logic层] +D --> E[DAO层] +E --> F[数据库] +C --> G[缓存] +C --> H[外部服务] +D --> I[工具库] +``` + +**Diagram sources** +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) + +## 性能考虑 +系统在设计时充分考虑了性能因素。通过使用缓存减少数据库访问,采用异步处理提高响应速度,利用数据库事务保证数据一致性。对于高并发场景,系统通过锁机制防止资源竞争,确保操作的原子性。 + +## 故障排除指南 +当系统出现异常时,可参考以下常见问题及解决方案: + +**Section sources** +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [process.go](file://internal/logic/card_redeem_order/process.go) + +### 常见错误代码 +| 错误代码 | 含义 | 解决方案 | +|--------|------|--------| +| 100 | 充值失败 | 检查卡密有效性 | +| 1 | 充值成功 | 无需处理 | +| 2 | 待处理 | 等待系统处理 | +| 3 | 验证失败 | 检查账号信息 | +| 4 | 账号失效 | 更新账号cookie | +| 5 | 账号频繁 | 降低请求频率 | +| 6 | 未知状态 | 检查系统日志 | +| 7 | 最大调用次数限制 | 调整配置或等待 | +| 8 | 金额不一致(已充值) | 确认实际充值金额 | +| 9 | 卡密类型错误 | 检查卡密类型 | +| 10 | 金额不一致(未充值) | 检查订单金额 | +| 11 | 卡密被绑定 | 使用未绑定卡密 | +| 12 | 重复绑卡 | 避免重复提交 | +| 13 | 账号受限制 | 等待限制解除 | +| 15 | 卡片不存在 | 检查卡密有效性 | +| 16 | 卡片过期 | 使用有效卡密 | +| 19 | 重复订单 | 避免重复提交 | +| 20 | 卡号不符合规则 | 检查卡号格式 | +| 21 | 卡密冻结 | 联系发卡方解冻 | + +## 结论 +kami_backend的卡密管理系统设计合理,功能完整,能够有效支持多平台卡密的管理需求。系统通过分层架构和模块化设计,确保了代码的可维护性和可扩展性。在性能和稳定性方面,系统采用了多种优化措施,能够应对高并发场景。未来可进一步优化异常处理机制,提升系统的健壮性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密工作空间管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密工作空间管理.md new file mode 100644 index 00000000..06130427 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密工作空间管理.md @@ -0,0 +1,224 @@ +# 天猫卡密工作空间管理 + + +**本文档引用文件** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了天猫卡密工作空间管理系统的功能与实现机制。系统主要围绕数据同步、统计分析和日常订单汇总三大核心功能展开,实现了与账户系统、订单系统的高效数据流转。通过自动化任务保障数据一致性,并提供全面的异常处理策略。文档还包含性能优化建议和常见问题解决方案,确保系统稳定高效运行。 + +## 项目结构 +天猫卡密工作空间管理功能主要分布在 `api/card_info_t_mall_game/v1` 和 `internal/controller/card_info_t_mall_game` 目录下。`workspace.go` 定义了工作空间相关的API请求和响应结构体,`card_info_t_mall_game_v1_t_mall_game_*.go` 文件实现了具体的控制器逻辑。数据同步功能由 `utility/cron/t_mall_game_data_sync.go` 中的定时任务驱动。业务逻辑由 `internal/service/card_t_mall_order.go` 中的服务接口统一管理。 + +```mermaid +graph TD +subgraph "API 接口层" +A[workspace.go] --> B[TMallGameDailyOrderSummaryReq] +A --> C[TMallGameStatsReq] +end +subgraph "控制器层" +D[card_info_t_mall_game_v1_t_mall_game_data_sync.go] +E[card_info_t_mall_game_v1_t_mall_game_stats.go] +F[card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go] +end +subgraph "服务层" +G[card_t_mall_order.go] --> H[IRechargeTMallGameOrder] +end +subgraph "定时任务" +I[t_mall_game_data_sync.go] --> J[SyncTMallGameData] +end +A --> D +D --> G +E --> G +F --> G +I --> G +``` + +**Diagram sources** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +**Section sources** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +## 核心组件 +核心组件包括工作空间API定义、数据同步控制器、统计分析服务和定时同步任务。`TMallGameDailyOrderSummaryReq` 和 `TMallGameStatsReq` 结构体定义了获取订单统计和基本统计信息的请求参数。`TMallGameDataSync` 函数负责从远程服务拉取最新数据并持久化到本地数据库。`IRechargeTMallGameOrder` 接口定义了所有订单相关的业务操作,是系统功能的核心。 + +**Section sources** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go#L1-L48) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go#L1-L86) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L84) + +## 架构概述 +系统采用分层架构,从上至下分为API接口层、控制器层、服务层和数据访问层。API层定义了外部可调用的HTTP端点。控制器层负责处理HTTP请求,进行参数校验和转换。服务层封装了核心业务逻辑,确保了代码的可重用性和可测试性。数据访问通过DAO(Data Access Object)模式实现。定时任务独立运行,通过调用控制器或服务层接口来执行数据同步。 + +```mermaid +graph TD +A[客户端] --> B[API 接口] +B --> C[控制器] +C --> D[服务] +D --> E[DAO] +E --> F[(数据库)] +G[定时任务] --> C +G --> D +``` + +**Diagram sources** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +## 详细组件分析 + +### 工作空间数据同步分析 +数据同步功能是确保工作空间数据实时性的关键。它通过一个定时任务周期性地从上游服务拉取最新的账户、订单、店铺等数据。 + +#### 数据同步流程 +```mermaid +sequenceDiagram +participant Cron as 定时任务 +participant Controller as 数据同步控制器 +participant Service as 订单服务 +participant DAO as 数据访问对象 +participant DB as 数据库 +participant Upstream as 上游服务 +Cron->>Controller : TMallGameDataSync(请求) +Controller->>DAO : 查询最近更新的订单 +DAO-->>Controller : 订单列表 +Controller->>DAO : 查询关联的账户信息 +DAO-->>Controller : 账户列表 +Controller->>DAO : 查询关联的店铺信息 +DAO-->>Controller : 店铺列表 +Controller->>DAO : 查询关联的订单历史 +DAO-->>Controller : 订单历史列表 +Controller->>DAO : 查询关联的店铺历史 +DAO-->>Controller : 店铺历史列表 +Controller-->>Cron : 返回所有数据 +Cron->>Upstream : POST /api/recharge/tMallGame/data/sync +Upstream-->>Cron : 返回同步结果 +Cron->>DB : 批量保存所有数据 +``` + +**Diagram sources** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go#L1-L86) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go#L1-L76) + +### 统计分析功能分析 +统计分析功能为工作空间提供关键的业务洞察,包括订单成功率、金额汇总等。 + +#### 统计计算实现 +```mermaid +flowchart TD +Start([获取统计请求]) --> Validate["验证渠道名称"] +Validate --> GetService["获取订单服务实例"] +GetService --> CallService["调用服务层 GetOrderStats 方法"] +CallService --> ServiceLogic["服务层执行统计计算"] +ServiceLogic --> QueryDB["查询数据库聚合数据"] +QueryDB --> FormatRes["格式化响应数据"] +FormatRes --> ReturnRes["返回 TMallGameStatsRes"] +CallService --> HandleError["处理错误"] +HandleError --> WrapError["包装错误信息"] +WrapError --> ReturnError["返回错误响应"] +ReturnRes --> End([结束]) +ReturnError --> End +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_stats.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go#L1-L27) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L66-L66) + +### 日常订单汇总分析 +日常订单汇总功能提供按日粒度的订单数据统计,用于生成日报。 + +#### 汇总数据处理 +```mermaid +flowchart TD +Req([收到汇总请求]) --> InitRes["初始化响应结构"] +InitRes --> GetService["获取订单服务"] +GetService --> CallService["调用 GetOrderSummary"] +CallService --> ServiceLogic["服务层执行分页汇总查询"] +ServiceLogic --> QueryDB["数据库查询并分组统计"] +QueryDB --> CopyData["使用 copier 复制数据"] +CopyData --> SetTotal["设置总记录数"] +CopyData --> HandleError["处理复制错误"] +HandleError --> WrapError["包装错误"] +WrapError --> ReturnError["返回错误"] +SetTotal --> ReturnSuccess["返回成功响应"] +ReturnSuccess --> End([结束]) +ReturnError --> End +``` + +**Diagram sources** +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go#L1-L30) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L65-L65) + +## 依赖分析 +系统内部组件间依赖清晰。控制器层依赖于服务层接口 `IRechargeTMallGameOrder` 来执行业务逻辑。服务层依赖于DAO层进行数据持久化。定时任务 `t_mall_game_data_sync.go` 直接依赖于配置模块 `config` 和日志模块 `glog`,并通过HTTP客户端与上游服务通信。API定义文件 `workspace.go` 被控制器和模型层所依赖,作为数据传输的契约。 + +```mermaid +graph TD +A[t_mall_game_data_sync.go] --> B[config] +A --> C[glog] +A --> D[gclient] +E[card_info_t_mall_game_v1_*.go] --> F[IRechargeTMallGameOrder] +F --> G[DAO] +G --> H[数据库] +I[workspace.go] --> J[控制器] +I --> K[模型] +``` + +**Diagram sources** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_*.go](file://internal/controller/card_info_t_mall_game/) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +**Section sources** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go#L1-L86) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L84) + +## 性能考虑 +数据同步采用批量保存(`Save`)而非逐条插入,显著提升了写入性能。统计查询在服务层实现,避免了在控制器中编写复杂的SQL逻辑,提高了代码可维护性。使用 `gtime.S * 5` 设置了合理的HTTP请求超时时间,防止任务长时间阻塞。数据库查询使用了 `Unscoped()` 方法,确保能获取到所有状态的数据,但需注意这可能影响查询性能,建议在数据量大时建立合适的索引。 + +## 故障排除指南 +**问题:数据同步延迟** +* **检查点**:确认 `t_mall_game_data_sync.go` 中的定时任务是否正常运行。 +* **检查点**:检查 `syncCfg.Interval` 配置项,确保同步间隔合理。 +* **检查点**:查看日志中是否有 "请求失败" 或 "保存...失败" 的错误信息,排查网络或数据库连接问题。 + +**问题:统计结果不准确** +* **检查点**:确认数据同步任务是否成功执行,本地数据库是否已更新。 +* **检查点**:检查 `GetOrderSummary` 和 `GetOrderStats` 方法的查询条件和聚合逻辑是否正确。 +* **检查点**:验证 `workspace.go` 中定义的 `TMAllGameSummaryListRecord` 结构体字段与数据库实际存储的数据类型是否匹配。 + +**问题:服务启动失败** +* **检查点**:检查 `card_t_mall_order.go` 中的 `localRechargeTMallGameOrder` 变量是否已正确注册实现,避免出现 "implement not found" 的panic。 + +**Section sources** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go#L1-L86) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L84) + +## 结论 +天猫卡密工作空间管理系统通过清晰的分层架构和模块化设计,有效地实现了数据同步、统计分析和订单汇总等核心功能。系统通过定时任务保障了数据的实时性,并通过服务层接口保证了业务逻辑的统一。完善的错误处理和日志记录机制为系统的稳定运行提供了保障。未来可进一步优化数据库查询性能,并增加更多的监控指标。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密管理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密管理逻辑.md new file mode 100644 index 00000000..3d7264ff --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密管理逻辑.md @@ -0,0 +1,305 @@ +# 天猫卡密管理逻辑 + + +**本文档引用的文件** +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go) +- [card_info_t_mall_game_v1_t_mall_game_account_delete.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go) +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go) + + +## 目录 +1. [天猫卡密账户管理](#天猫卡密账户管理) +2. [天猫卡密订单处理](#天猫卡密订单处理) +3. [AGISO回调处理](#agiso回调处理) +4. [数据同步与统计](#数据同步与统计) +5. [系统集成与异常处理](#系统集成与异常处理) + +## 天猫卡密账户管理 + +天猫卡密账户管理模块负责账户的全生命周期管理,包括创建、删除、状态切换和授权等核心功能。系统通过统一的接口服务层(IRechargeTMallGameAccount)提供账户管理能力,确保操作的一致性和可维护性。 + +### 账户创建与删除 + +账户创建功能通过`TMallGameAccountCreate`接口实现,接收账户创建请求参数,调用账户服务进行持久化存储。系统在创建过程中会验证账户信息的完整性和唯一性,确保不会创建重复账户。账户删除功能通过`TMallGameAccountDelete`接口实现,根据账户ID执行删除操作,同时清理相关联的数据。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> CheckExistence["检查账户是否存在"] +CheckExistence --> AccountExists{"账户已存在?"} +AccountExists --> |是| ReturnError["返回错误: 账户已存在"] +AccountExists --> |否| CreateAccount["创建账户记录"] +CreateAccount --> SaveToDB["保存到数据库"] +SaveToDB --> UpdateCache["更新缓存"] +UpdateCache --> End([结束]) +DeleteStart([开始]) --> ValidateID["验证账户ID"] +ValidateID --> FindAccount["查找账户"] +FindAccount --> AccountFound{"账户找到?"} +AccountFound --> |否| ReturnNotFound["返回: 账户不存在"] +AccountFound --> |是| DeleteRelated["删除关联数据"] +DeleteRelated --> RemoveFromDB["从数据库移除"] +RemoveFromDB --> ClearCache["清除缓存"] +ClearCache --> End +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L22) +- [card_info_t_mall_game_v1_t_mall_game_account_delete.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go#L1-L19) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L22) +- [card_info_t_mall_game_v1_t_mall_game_account_delete.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go#L1-L19) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L51) + +### 账户状态管理 + +账户状态管理功能允许系统管理员对账户进行启用/禁用操作。通过`TMallGameAccountToggle`接口接收状态切换请求,调用服务层的Toggle方法更新账户状态。系统会记录状态变更历史,便于审计和问题追踪。状态切换操作是幂等的,即重复执行相同的状态切换请求不会产生副作用。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateRequest["验证请求参数"] +ValidateRequest --> GetAccount["获取账户信息"] +GetAccount --> AccountExists{"账户存在?"} +AccountExists --> |否| ReturnError["返回错误: 账户不存在"] +AccountExists --> |是| GetCurrentStatus["获取当前状态"] +GetCurrentStatus --> DetermineNewStatus["确定新状态"] +DetermineNewStatus --> UpdateStatus["更新账户状态"] +UpdateStatus --> LogChange["记录状态变更日志"] +LogChange --> NotifySystem["通知相关系统"] +NotifySystem --> End([结束]) +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go#L1-L22) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go#L1-L22) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L51) + +### 账户授权与工作空间管理 + +账户授权功能通过`TMallGameAccountAuthorizeCallback`接口处理来自第三方平台(如阿奇索、天猫店铺)的授权回调。系统根据回调中的渠道信息区分处理逻辑,对于天猫店铺授权,会调用天猫API进行OAuth2登录验证。授权成功后,系统会更新账户的授权状态,并建立与工作空间的关联关系。 + +```mermaid +sequenceDiagram +participant ThirdParty as "第三方平台" +participant System as "卡密系统" +participant TMallAPI as "天猫API" +ThirdParty->>System : 发送授权回调 +System->>System : 验证回调签名 +alt 阿奇索渠道 +System->>System : 记录授权信息 +System-->>ThirdParty : 返回成功 +else 天猫店铺渠道 +System->>TMallAPI : 调用OAuth2Login +alt 授权成功 +TMallAPI-->>System : 返回授权结果 +System->>System : 更新账户授权状态 +System-->>ThirdParty : 返回成功 +else 授权失败 +TMallAPI-->>System : 返回错误 +System->>System : 记录授权失败日志 +System-->>ThirdParty : 返回失败 +end +else 其他渠道 +System-->>ThirdParty : 返回不支持 +end +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go#L1-L31) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go#L1-L31) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L51) + +## 天猫卡密订单处理 + +天猫卡密订单处理模块负责订单的全生命周期管理,从订单提交到最终完成的整个流程。系统通过统一的订单服务接口(IRechargeTMallGameOrder)提供订单管理能力,确保订单处理的一致性和可靠性。 + +### 订单提交流程 + +订单提交功能通过`TMallGameOrderSubmit`接口实现。系统首先验证请求参数的完整性,然后根据账户号码查找对应的账户信息。如果账户不存在或不可用,系统会返回相应的错误信息。验证通过后,系统调用订单服务创建新订单,并返回订单号和状态信息。订单创建过程中会进行数据一致性检查,确保订单金额、回调地址等关键信息的正确性。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateRequest["验证请求参数"] +ValidateRequest --> FindAccount["查找账户信息"] +FindAccount --> AccountValid{"账户有效?"} +AccountValid --> |否| ReturnError["返回错误: 账户不存在或不可用"] +AccountValid --> |是| CreateOrder["创建订单记录"] +CreateOrder --> SetOrderStatus["设置订单初始状态"] +SetOrderStatus --> GenerateOrderNo["生成订单号"] +GenerateOrderNo --> SaveOrder["保存订单到数据库"] +SaveOrder --> ReturnSuccess["返回订单号和成功状态"] +ReturnSuccess --> End([结束]) +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go#L1-L44) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go#L1-L44) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L85) + +## AGISO回调处理 + +AGISO回调处理模块负责处理来自AGISO平台的各类订单状态变更通知,包括买家付款、确认收货、申请退款和评价等事件。系统通过`TMallGameAgisoCallback`接口接收回调请求,并根据回调类型分发到相应的处理函数。 + +### 回调处理机制 + +系统采用并发安全的处理机制,通过互斥锁和缓存确保同一订单不会被重复处理。每个回调请求都会先验证签名的正确性,防止伪造请求。处理成功后,系统会更新订单状态,并根据业务规则执行相应的后续操作,如虚拟发货、回调第三方等。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateSign["验证回调签名"] +ValidateSign --> SignValid{"签名有效?"} +SignValid --> |否| ReturnError["返回错误: 签名验证失败"] +SignValid --> |是| CheckDuplicate["检查重复处理"] +CheckDuplicate --> IsDuplicate{"正在处理?"} +IsDuplicate --> |是| ReturnBusy["返回: 订单正在处理"] +IsDuplicate --> |否| AcquireLock["获取处理锁"] +AcquireLock --> ProcessCallback["处理回调事件"] +ProcessCallback --> UpdateOrder["更新订单状态"] +UpdateOrder --> ExecuteAction["执行后续操作"] +ExecuteAction --> ReleaseLock["释放锁"] +ReleaseLock --> ReturnSuccess["返回成功"] +ReturnSuccess --> End([结束]) +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go#L1-L666) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go#L1-L666) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L85) + +### 买家付款处理 + +当收到买家付款回调时,系统会先检查订单是否已存在,防止重复处理。然后创建淘宝订单记录,并调用天猫API获取详细的订单信息。系统会尝试进行虚拟发货,最多重试三次。如果发货成功,更新订单状态为发货成功;如果失败,则标记为发货失败,并记录错误日志。 + +```mermaid +sequenceDiagram +participant Agiso as "AGISO平台" +participant System as "卡密系统" +participant TMallAPI as "天猫API" +Agiso->>System : 买家付款回调 +System->>System : 检查订单是否已存在 +alt 订单已存在 +System-->>Agiso : 返回 : 订单已存在 +else 订单不存在 +System->>System : 创建淘宝订单记录 +System->>TMallAPI : 获取订单详情 +alt 获取成功 +TMallAPI-->>System : 返回订单详情 +System->>System : 尝试虚拟发货 +loop 重试3次 +System->>TMallAPI : 虚拟发货 +alt 发货成功 +TMallAPI-->>System : 发货成功 +System->>System : 更新订单状态为发货成功 +break +else 发货失败 +TMallAPI-->>System : 发货失败 +System->>System : 记录发货失败日志 +end +end +else 获取失败 +TMallAPI-->>System : 获取失败 +System->>System : 记录获取失败日志 +end +System-->>Agiso : 返回处理结果 +end +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go#L1-L666) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go#L1-L666) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L85) + +## 数据同步与统计 + +数据同步与统计模块提供数据实时同步和业务统计功能,支持系统间的数据一致性维护和业务决策支持。 + +### 数据同步机制 + +`TMallGameDataSync`接口提供数据同步功能,允许客户端获取指定时间段内的最新数据变更。系统会查询订单、账户、店铺和历史记录等实体的更新数据,并按类别返回。同步机制采用时间戳过滤,确保只返回增量数据,提高同步效率。 + +```mermaid +flowchart TD +Start([开始]) --> ParseRequest["解析请求参数"] +ParseRequest --> GetDuration["获取同步时长"] +GetDuration --> CalculateTime["计算起始时间"] +CalculateTime --> QueryOrders["查询订单变更"] +QueryOrders --> QueryAccounts["查询账户变更"] +QueryAccounts --> QueryShops["查询店铺变更"] +QueryShops --> QueryOrderHistory["查询订单历史变更"] +QueryOrderHistory --> QueryShopHistory["查询店铺历史变更"] +QueryShopHistory --> AssembleData["组装返回数据"] +AssembleData --> ReturnData["返回同步数据"] +ReturnData --> End([结束]) +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go#L1-L77) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go#L1-L77) +- [v_1_recharge_t_mall_order.go](file://internal/dao/v_1_recharge_t_mall_order.go#L1-L28) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go#L1-L28) + +### 订单统计功能 + +`TMallGameDailyOrderSummary`接口提供订单统计功能,支持按时间范围、状态等条件查询订单汇总数据。系统会调用订单服务的统计方法,获取符合条件的订单总数和详细记录,并进行数据转换后返回。统计功能支持分页查询,便于处理大量数据。 + +```mermaid +flowchart TD +Start([开始]) --> ParseParams["解析统计参数"] +ParseParams --> CallService["调用订单统计服务"] +CallService --> GetTotal["获取订单总数"] +GetTotal --> GetList["获取订单列表"] +GetList --> TransformData["转换数据格式"] +TransformData --> ReturnResult["返回统计结果"] +ReturnResult --> End([结束]) +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go#L1-L31) + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go#L1-L31) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L85) + +## 系统集成与异常处理 + +系统集成与异常处理模块确保天猫卡密管理系统与其他系统的稳定集成,并提供完善的错误处理机制。 + +### 系统集成模式 + +天猫卡密管理系统通过标准化的API接口与订单系统、支付系统等外部系统集成。系统采用异步回调机制,当订单状态发生变更时,会通过预设的回调地址通知第三方系统。集成过程中使用数字签名验证确保通信安全,防止数据篡改和伪造请求。 + +### 异常处理策略 + +系统采用分层的异常处理策略。在控制器层,所有异常都会被统一捕获并包装为标准的错误响应。业务逻辑层会根据异常类型进行分类处理,如数据验证错误、系统错误、第三方服务错误等。对于可恢复的错误,系统会尝试重试;对于不可恢复的错误,会记录详细的错误日志并通知相关人员。 + +### 数据一致性保障 + +系统通过事务管理确保数据的一致性。关键操作如订单创建、状态更新等都会在数据库事务中执行,确保要么全部成功,要么全部回滚。系统还实现了幂等性设计,相同的操作重复执行不会产生副作用。此外,通过定期的数据校验任务,系统能够及时发现并修复数据不一致问题。 + +**本节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go#L1-L666) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go#L1-L85) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L51) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密订单处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密订单处理.md new file mode 100644 index 00000000..4eba420c --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密订单处理.md @@ -0,0 +1,177 @@ +# 天猫卡密订单处理 + + +**本文档引用的文件** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [v_1_recharge_t_mall_order.go](file://internal/model/do/v_1_recharge_t_mall_order.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [agiso.go](file://internal/model/agiso.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了天猫卡密订单处理系统的完整流程,包括订单的提交、查询、状态修改和回调处理。系统集成了支付系统和AGISO系统,实现了订单分类查询、状态同步和成功状态修改等核心功能。文档深入分析了订单处理中的异常处理策略和数据一致性保障机制,并提供了性能优化建议和常见问题解决方案。 + +## 项目结构 +天猫卡密订单处理系统采用分层架构,主要分为API层、控制器层、服务层、逻辑层和数据访问层。系统通过API接口接收订单请求,由控制器协调处理,服务层提供业务接口,逻辑层实现具体业务逻辑,数据访问层负责与数据库交互。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[逻辑层] +D --> E[数据访问层] +E --> F[数据库] +``` + +**图表来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +## 核心组件 +系统的核心组件包括订单提交、状态修改、回调处理和数据同步。订单提交组件负责接收和创建新订单;状态修改组件处理订单状态的变更;回调处理组件接收来自AGISO系统的异步通知;数据同步组件确保系统间数据的一致性。 + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +## 架构概述 +系统采用微服务架构,各组件通过清晰的接口进行通信。订单处理流程从API接收请求开始,经过控制器调度,由服务层协调,最终在逻辑层完成具体业务处理。系统通过缓存机制提高性能,使用事务保证数据一致性。 + +```mermaid +graph TD +A[客户端] --> B[API接口] +B --> C[控制器] +C --> D[服务层] +D --> E[逻辑层] +E --> F[数据访问层] +F --> G[数据库] +C --> H[缓存] +D --> I[外部系统] +``` + +**图表来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +## 详细组件分析 +### 订单提交分析 +订单提交组件负责接收订单请求并创建新订单。系统首先验证账户信息,然后创建订单记录并返回订单号。 + +```mermaid +sequenceDiagram +participant 客户端 +participant 控制器 +participant 服务层 +participant 数据访问层 +客户端->>控制器 : 提交订单请求 +控制器->>服务层 : 验证账户信息 +服务层->>数据访问层 : 查询账户数据 +数据访问层-->>服务层 : 返回账户信息 +服务层->>数据访问层 : 创建订单记录 +数据访问层-->>服务层 : 返回订单号 +服务层-->>控制器 : 返回结果 +控制器-->>客户端 : 返回订单号和状态 +``` + +**图表来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +### 回调处理分析 +回调处理组件负责处理来自AGISO系统的异步通知,包括付款成功、确认收货和评价成功等事件。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateSign["验证签名"] +ValidateSign --> SignValid{"签名有效?"} +SignValid --> |否| ReturnError["返回验证失败"] +SignValid --> |是| HandleCallback["处理回调类型"] +HandleCallback --> PaymentSuccess{"付款成功?"} +PaymentSuccess --> |是| ProcessPayment["处理付款"] +HandleCallback --> ConfirmReceipt{"确认收货?"} +ConfirmReceipt --> |是| ProcessConfirm["处理确认收货"] +HandleCallback --> Evaluation{"评价成功?"} +Evaluation --> |是| ProcessEvaluation["处理评价"] +ProcessPayment --> End([结束]) +ProcessConfirm --> End +ProcessEvaluation --> End +ReturnError --> End +``` + +**图表来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [agiso.go](file://internal/model/agiso.go) + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [agiso.go](file://internal/model/agiso.go) + +## 依赖分析 +系统各组件之间存在明确的依赖关系。API层依赖控制器层,控制器层依赖服务层,服务层依赖逻辑层,逻辑层依赖数据访问层。系统还依赖外部的AGISO系统和淘宝API。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[逻辑层] +D --> E[数据访问层] +E --> F[数据库] +C --> G[AGISO系统] +C --> H[淘宝API] +B --> I[缓存系统] +``` + +**图表来源** +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +**章节来源** +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [order.go](file://internal/logic/card_t_mall_order/order.go) + +## 性能考虑 +系统通过多种机制优化性能:使用缓存减少数据库访问,采用连接池管理数据库连接,通过异步处理提高响应速度,利用批量操作减少网络开销。对于高并发场景,系统采用限流和降级策略确保稳定性。 + +## 故障排除指南 +### 订单状态不一致 +当出现订单状态不一致时,应首先检查数据库记录,然后查看日志文件,确认是否有未处理的回调。可以通过数据同步接口手动同步状态。 + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +### 回调处理失败 +回调处理失败通常由签名验证失败或网络问题引起。应检查签名算法是否正确,确认网络连接是否正常,并查看错误日志获取详细信息。 + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [agiso.go](file://internal/model/agiso.go) + +## 结论 +天猫卡密订单处理系统设计合理,功能完整,能够高效处理各种订单场景。系统通过清晰的分层架构和明确的组件职责,确保了代码的可维护性和可扩展性。建议持续监控系统性能,定期优化数据库查询,并加强异常处理机制。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密账户管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密账户管理.md new file mode 100644 index 00000000..47579a4e --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/卡密管理逻辑/天猫卡密管理逻辑/天猫卡密账户管理.md @@ -0,0 +1,372 @@ +# 天猫卡密账户管理 + + +**本文档引用文件** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go) +- [card_info_t_mall_game_v1_t_mall_game_account_delete.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go) +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go) +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go) +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go) +- [account.go](file://internal/logic/card_t_mall_account/account.go) +- [v_1_recharge_t_mall_account.go](file://internal/model/entity/v_1_recharge_t_mall_account.go) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go) + + +## 目录 +1. [简介](#简介) +2. [核心功能概述](#核心功能概述) +3. [账户生命周期管理](#账户生命周期管理) +4. [账户授权与认证](#账户授权与认证) +5. [账户状态管理](#账户状态管理) +6. [账户查询与获取](#账户查询与获取) +7. [数据模型与持久化](#数据模型与持久化) +8. [异常处理与数据一致性](#异常处理与数据一致性) +9. [性能优化与缓存策略](#性能优化与缓存策略) +10. [常见问题与解决方案](#常见问题与解决方案) + +## 简介 +本文档详细阐述了天猫卡密账户管理系统的设计与实现。系统为天猫游戏卡密业务提供完整的账户管理解决方案,涵盖账户的创建、更新、删除、查询等全生命周期管理功能。系统通过分层架构设计,实现了业务逻辑与数据访问的分离,确保了系统的可维护性和扩展性。账户系统与工作空间、订单系统深度集成,支持自动化卡密充值流程。 + +**Section sources** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L1-L71) +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L21) + +## 核心功能概述 +天猫卡密账户管理系统提供以下核心功能: +- 账户批量创建与管理 +- 账户状态切换(启用/禁用) +- 账户删除与回收 +- 账户列表查询与分页 +- 随机账户获取与分配 +- 天猫平台授权与认证 +- 账户授权状态检测 +- 与订单系统的集成协作 + +系统通过RESTful API接口暴露所有功能,采用GoFrame框架构建,遵循清晰的MVC架构模式。控制器层处理HTTP请求,服务层封装核心业务逻辑,数据访问层负责与数据库交互。 + +```mermaid +graph TB +subgraph "API接口层" +A[账户创建] +B[账户删除] +C[状态切换] +D[列表查询] +E[随机获取] +F[授权回调] +G[状态检测] +end +subgraph "业务逻辑层" +H[账户服务] +I[订单服务] +J[缓存服务] +end +subgraph "数据访问层" +K[账户DAO] +L[订单DAO] +end +subgraph "外部系统" +M[天猫平台] +N[阿奇索] +end +A --> H +B --> H +C --> H +D --> H +E --> H +F --> H +G --> H +H --> K +H --> L +H --> J +F --> M +F --> N +``` + +**Diagram sources ** +- [account.go](file://api/card_info_t_mall_game/v1/account.go#L1-L71) +- [card_t_mall_account.go](file://internal/service/card_t_mall_account.go#L1-L50) + +## 账户生命周期管理 + +### 账户创建 +账户创建功能支持批量创建指定数量的天猫游戏账户。系统通过`TMallGameAccountCreate`接口接收创建请求,包含需要创建的账户数量。服务层在事务中执行创建逻辑,确保数据一致性。 + +创建流程如下: +1. 接收创建请求,验证参数 +2. 在数据库事务中执行 +3. 循环生成唯一账户号码(邮箱格式) +4. 检查账户号码是否已存在 +5. 构建账户数据列表 +6. 批量插入数据库 + +账户号码采用随机生成策略,由大小写字母和数字组成的前缀与随机字母组成的后缀构成邮箱格式,确保全局唯一性。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L21) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L30-L55) + +### 账户删除 +账户删除功能通过`TMallGameAccountDelete`接口实现,接收账户ID作为参数。服务层调用数据访问对象执行删除操作,直接从数据库中移除指定ID的账户记录。 + +删除操作为物理删除,不保留软删除标记。系统未实现删除前的依赖检查,需确保账户未被订单引用后再执行删除操作。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_delete.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go#L1-L18) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L205-L212) + +## 账户授权与认证 + +### 授权回调处理 +系统提供`TMallGameAccountAuthorizeCallback`接口处理来自天猫平台和阿奇索的授权回调。接口根据渠道参数区分处理逻辑: + +- **天猫渠道**:使用OAuth2.0协议完成授权,调用天猫API客户端进行登录验证,获取访问令牌 +- **阿奇索渠道**:记录授权开始日志,具体处理逻辑需在其他模块实现 + +授权失败时,系统返回相应的错误码和错误信息,便于前端展示和问题排查。 + +```mermaid +sequenceDiagram +participant 天猫平台 +participant 系统 +participant 数据库 +天猫平台->>系统 : 授权回调请求(code) +系统->>系统 : 验证渠道参数 +alt 天猫渠道 +系统->>天猫平台 : OAuth2登录验证 +天猫平台-->>系统 : 访问令牌 +系统->>数据库 : 存储授权信息 +系统-->>天猫平台 : 成功响应 +else 阿奇索渠道 +系统->>系统 : 记录授权日志 +系统-->>天猫平台 : 成功响应 +else 其他渠道 +系统-->>天猫平台 : 不支持渠道错误 +end +``` + +**Diagram sources ** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go#L1-L30) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go#L1-L20) + +### 认证状态检测 +`TMallGameAccountTMallAuthStatus`接口用于检测天猫平台的授权状态。系统从缓存中获取OAuth令牌信息,检查其过期时间: + +1. 获取缓存中的授权令牌 +2. 检查令牌是否存在且有效 +3. 比较当前时间与令牌过期时间 +4. 返回授权状态和过期时间 + +此功能确保系统在执行需要天猫授权的操作前,能够验证授权的有效性,避免因授权过期导致的操作失败。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go#L1-L32) +- [card_recharge_t_mall.go](file://internal/consts/card_recharge_t_mall.go#L1-L20) + +## 账户状态管理 + +### 状态切换 +账户状态切换功能通过`TMallGameAccountToggle`接口实现,用于在启用和禁用状态之间切换账户。系统采用事务性操作确保状态变更的原子性: + +1. 根据账户ID查询当前账户信息 +2. 读取当前状态值 +3. 切换状态(启用↔禁用) +4. 在同一事务中更新数据库 + +状态值定义在常量中,启用状态为"enable",禁用状态为"disable"。状态切换操作记录创建时间和更新时间,便于审计和追踪。 + +```mermaid +flowchart TD +Start([开始状态切换]) --> Query["查询账户当前状态"] +Query --> Check{"状态为启用?"} +Check --> |是| SetDisable["设置为禁用"] +Check --> |否| SetEnable["设置为启用"] +SetDisable --> Update["更新数据库"] +SetEnable --> Update +Update --> End([结束]) +``` + +**Diagram sources ** +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go#L1-L21) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L110-L130) + +## 账户查询与获取 + +### 账户列表查询 +`TMallGameAccountList`接口提供账户列表查询功能,支持分页和按账户号码模糊查询。查询参数包括当前页码、每页大小和账户号码关键字。 + +系统构建查询条件链: +- 应用分页参数 +- 如果提供账户号码,则添加模糊匹配条件 +- 扫描结果并返回总数和数据列表 + +查询结果包含账户ID、账户号码、余额、充值次数、状态和时间戳等完整信息。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_list.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go#L1-L22) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L90-L105) + +### 随机账户获取 +`TMallGameAccountGetOneRandom`接口实现随机账户获取功能,主要用于订单处理时自动分配账户。该功能采用多级策略确保高可用性: + +1. **缓存优先**:首先尝试从Redis缓存中获取与订单号关联的账户 +2. **排除已用**:收集所有缓存中的账户号码,避免重复分配 +3. **随机选择**:从可用账户池中随机选取一个未被使用的账户 +4. **自动补货**:当可用账户少于阈值时,异步创建新账户 +5. **缓存结果**:将分配的账户与订单号关联并缓存24小时 + +系统使用分布式锁(gmlock)确保并发环境下的数据一致性,防止同一订单被分配多个账户。 + +```mermaid +flowchart TD +Start([开始获取随机账户]) --> CheckCache["检查订单缓存"] +CheckCache --> CacheHit{"缓存命中?"} +CacheHit --> |是| ReturnCache["返回缓存账户"] +CacheHit --> |否| GetKeys["获取所有缓存键"] +GetKeys --> Filter["筛选账户缓存"] +Filter --> Collect["收集已用账户"] +Collect --> RandomSelect["随机选择可用账户"] +RandomSelect --> LowStock{"账户不足?"} +LowStock --> |是| CreateBatch["异步创建100个新账户"] +LowStock --> |否| Assign["分配账户"] +CreateBatch --> Assign +Assign --> CacheResult["缓存分配结果"] +CacheResult --> ReturnResult["返回账户"] +ReturnCache --> End([结束]) +ReturnResult --> End +``` + +**Diagram sources ** +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go#L1-L59) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L135-L185) + +## 数据模型与持久化 + +### 数据实体 +账户数据模型`V1RechargeTMallAccount`包含以下字段: +- **id**: 账户唯一标识(UUID) +- **accountNumber**: 账户号码(邮箱格式) +- **balance**: 账户余额(浮点数) +- **rechargeTimes**: 充值次数(整数) +- **status**: 账户状态(字符串) +- **createdAt**: 创建时间 +- **updatedAt**: 更新时间 +- **deletedAt**: 删除时间(软删除标记) + +数据模型通过GoFrame的ORM映射到数据库表`recharge_t_mall_account`,支持时间戳自动管理。 + +### 数据访问层 +数据访问对象`V1RechargeTMallAccount`封装了对账户表的所有数据库操作,包括: +- 插入新账户 +- 查询账户列表 +- 根据ID或账户号码查询单个账户 +- 更新账户状态 +- 删除账户记录 + +所有写操作均支持事务上下文,确保在复杂业务逻辑中的数据一致性。 + +**Section sources** +- [v_1_recharge_t_mall_account.go](file://internal/model/entity/v_1_recharge_t_mall_account.go#L1-L21) +- [v_1_recharge_t_mall_account.go](file://internal/dao/v_1_recharge_t_mall_account.go#L1-L27) + +## 异常处理与数据一致性 + +### 异常处理策略 +系统采用分层异常处理机制: +- **控制器层**:使用`errHandler.WrapError`统一包装错误,转换为标准错误码 +- **服务层**:返回原始错误,由上层决定处理方式 +- **数据访问层**:抛出数据库异常,由事务管理器处理 + +关键操作如账户创建、状态切换等均在数据库事务中执行,确保原子性。当操作失败时,事务自动回滚,避免数据不一致。 + +### 数据一致性保障 +系统通过以下机制保障数据一致性: +- **事务性操作**:所有写操作在事务中执行 +- **唯一性检查**:创建账户前验证账户号码唯一性 +- **状态验证**:操作前检查账户当前状态是否允许变更 +- **缓存同步**:账户分配后及时更新缓存状态 + +对于账户创建操作,系统在循环中生成账户号码并检查唯一性,确保不会创建重复账户。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_create.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go#L1-L21) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L30-L55) + +## 性能优化与缓存策略 + +### 缓存设计 +系统采用Redis作为缓存存储,实现以下优化: +- **订单-账户映射缓存**:将订单号与分配的账户号码关联缓存,有效期24小时 +- **热点账户预加载**:监控账户使用情况,自动补充可用账户池 +- **分布式锁**:使用`gmlock`防止并发冲突,确保缓存操作的原子性 + +缓存策略显著减少了数据库查询压力,特别是在高并发订单处理场景下,避免了重复的账户分配计算。 + +### 异步补货机制 +当系统检测到可用账户数量低于阈值(10个)时,自动触发异步补货: +- 启动goroutine创建100个新账户 +- 在后台执行,不影响主业务流程 +- 避免账户耗尽导致的服务中断 + +该机制确保账户池始终保持充足,提高系统可用性。 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go#L1-L59) +- [account.go](file://internal/logic/card_t_mall_account/account.go#L135-L185) + +## 常见问题与解决方案 + +### 账户授权失败 +**问题现象**:调用天猫授权接口返回失败,无法获取访问令牌。 + +**可能原因**: +- 授权码(code)已过期 +- 应用配置错误(AppKey/Secret) +- 网络连接问题 +- 天猫平台服务异常 + +**解决方案**: +1. 检查授权码有效期,重新发起授权流程 +2. 验证应用配置信息是否正确 +3. 检查网络连接和防火墙设置 +4. 查看系统日志获取详细错误信息 +5. 重试机制:实现指数退避重试策略 + +### 状态同步异常 +**问题现象**:账户状态在数据库和缓存中不一致,导致分配了已禁用的账户。 + +**可能原因**: +- 状态切换未及时更新缓存 +- 缓存过期策略不合理 +- 并发操作导致竞态条件 + +**解决方案**: +1. 实现状态变更时的缓存失效机制 +2. 在状态切换后清除相关缓存 +3. 加强分布式锁的使用范围 +4. 增加缓存一致性检查逻辑 +5. 实现缓存与数据库的最终一致性同步 + +### 随机账户获取超时 +**问题现象**:在高并发场景下,随机获取账户接口响应缓慢或超时。 + +**可能原因**: +- 账户池耗尽,频繁触发补货 +- 缓存访问瓶颈 +- 数据库查询性能下降 + +**解决方案**: +1. 调整补货阈值和数量,提前补充账户 +2. 优化缓存访问模式,减少锁竞争 +3. 为账户表添加适当索引 +4. 实现账户预分配池,减少实时计算 +5. 监控账户使用速率,动态调整策略 + +**Section sources** +- [card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go#L1-L59) +- [card_info_t_mall_game_v1_t_mall_game_account_toggle.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_toggle.go#L1-L21) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/商户管理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/商户管理逻辑.md new file mode 100644 index 00000000..8b245b7f --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/商户管理逻辑.md @@ -0,0 +1,304 @@ +# 商户管理逻辑 + + +**本文档引用的文件** +- [merchant.go](file://internal/model/merchant.go) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) +- [merchant_v1_merchant_config_detail.go](file://internal/controller/merchant/merchant_v1_merchant_config_detail.go) +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go) +- [merchant_v1_merchant_sample_all_list.go](file://internal/controller/merchant/merchant_v1_merchant_sample_all_list.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) +- [v_1_merchant_deploy_info.go](file://internal/dao/internal/v_1_merchant_deploy_info.go) +- [merchant.go](file://internal/service/merchant.go) +- [config.go](file://api/merchant/v1/config.go) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 引言 +本文档详细阐述了kami_backend系统中商户管理业务逻辑的实现。重点说明商户配置管理、商户部署信息维护和商户样本管理的功能实现,以及商户与卡密通道、支付方式的关联关系。文档解释了商户配置的增删改查操作流程和权限控制机制,描述了商户部署信息的同步策略和状态管理,并提供了商户管理API的使用示例和最佳实践。同时,包括了商户数据隔离策略和多租户支持的实现细节。 + +## 项目结构 +商户管理功能主要分布在`api/merchant`和`internal/controller/merchant`目录下,通过分层架构实现业务逻辑。API接口定义在`api/merchant/v1`包中,控制器实现位于`internal/controller/merchant`包中,服务层逻辑在`internal/service/merchant.go`中定义,数据访问对象(DAO)则在`internal/dao/internal`包中实现。 + +```mermaid +graph TB +subgraph "API层" +A[api/merchant/v1/config.go] +B[api/merchant/v1/deploy.go] +C[api/merchant/v1/model.go] +end +subgraph "控制器层" +D[internal/controller/merchant/merchant_v1_merchant_config_list.go] +E[internal/controller/merchant/merchant_v1_merchant_config_detail.go] +F[internal/controller/merchant/merchant_v1_merchant_config_update.go] +G[internal/controller/merchant/merchant_v1_merchant_config_status.go] +H[internal/controller/merchant/merchant_v1_merchant_sample_all_list.go] +end +subgraph "服务层" +I[internal/service/merchant.go] +end +subgraph "数据访问层" +J[internal/dao/internal/v_1_merchant_info.go] +K[internal/dao/internal/v_1_merchant_deploy_info.go] +end +A --> D +B --> D +C --> D +D --> I +E --> I +F --> I +G --> I +H --> I +I --> J +I --> K +``` + +**图示来源** +- [config.go](file://api/merchant/v1/config.go) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) +- [merchant.go](file://internal/service/merchant.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) + +**章节来源** +- [merchant.go](file://internal/model/merchant.go) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) + +## 核心组件 +商户管理的核心组件包括商户配置管理、商户部署信息维护和商户样本管理。这些功能通过`IMerchant`接口定义,并由`service.Merchant()`实现。系统通过`V1MerchantInfoDao`和`V1MerchantDeployInfoDao`两个数据访问对象分别管理商户基本信息和部署信息。 + +**章节来源** +- [merchant.go](file://internal/service/merchant.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) +- [v_1_merchant_deploy_info.go](file://internal/dao/internal/v_1_merchant_deploy_info.go) + +## 架构概述 +商户管理模块采用典型的分层架构,从API接口到数据访问层形成清晰的调用链路。API层定义了商户配置的增删改查接口,控制器层处理HTTP请求并调用服务层,服务层封装业务逻辑并协调数据访问,DAO层负责与数据库交互。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant DAO as "数据访问层" +participant DB as "数据库" +Client->>API : 发起商户配置请求 +API->>Controller : 路由到对应控制器 +Controller->>Service : 调用服务方法 +Service->>DAO : 执行数据操作 +DAO->>DB : 执行SQL查询 +DB-->>DAO : 返回查询结果 +DAO-->>Service : 返回数据实体 +Service-->>Controller : 返回业务结果 +Controller-->>API : 返回响应数据 +API-->>Client : 返回JSON响应 +Note over Client,DB : 商户管理模块调用流程 +``` + +**图示来源** +- [merchant.go](file://internal/service/merchant.go) +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) + +## 详细组件分析 +### 商户配置管理分析 +商户配置管理功能实现了商户信息的增删改查操作,包括商户基本信息、状态管理和权限控制。系统通过`MerchantConfigList`、`MerchantConfigDetail`、`MerchantConfigUpdate`和`MerchantConfigStatus`等接口提供完整的配置管理能力。 + +#### 商户配置类图 +```mermaid +classDiagram +class MerchantInfoRecord { ++string MerchantName ++string MerchantUid ++string MerchantKey ++string MerchantSecret ++string LoginAccount ++string LoginPassword ++bool AutoSettle ++bool AutoPayFor ++string WhiteIps ++string Remark ++string SinglePayForRoadUid ++string RollPayForRoadCode ++float PayforFee +} +class MerchantSimpleInfoRecord { ++string MerchantUid ++string MerchantName ++string BelongAgentUid ++string BelongAgentName ++int Status ++string OtpSecret +} +class MerchantListParamsInput { ++string MerchantUid ++string MerchantName ++int Current ++int PageSize +} +class MerchantDeployInfoStrategyOutput { ++string[] RestrictArea ++bool IsRestrictAgent ++bool IsRestrictCardPass ++bool IsRestrictDevice ++bool IsRestrictIp ++bool IsRestrictInternalIp +} +MerchantInfoRecord <|-- MerchantSimpleInfoRecord : "继承" +MerchantListParamsInput --> MerchantInfoRecord : "查询参数" +MerchantDeployInfoStrategyOutput --> MerchantSimpleInfoRecord : "部署策略" +``` + +**图示来源** +- [merchant.go](file://internal/model/merchant.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) + +#### 商户配置更新序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "ControllerV1" +participant Service as "IMerchant" +participant DAO as "V1MerchantInfoDao" +participant DB as "数据库" +Client->>Controller : MerchantConfigUpdate请求 +Controller->>Service : 调用UpdateDetail方法 +Service->>DAO : 获取商户信息 +DAO->>DB : 查询merchant_info表 +DB-->>DAO : 返回商户数据 +DAO-->>Service : 返回数据实体 +Service->>Service : 更新商户信息 +Service->>DAO : 保存更新 +DAO->>DB : 执行UPDATE语句 +DB-->>DAO : 返回执行结果 +DAO-->>Service : 返回操作结果 +Service-->>Controller : 返回成功/失败 +Controller-->>Client : 返回响应 +Note over Client,DB : 商户配置更新流程 +``` + +**图示来源** +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go) +- [merchant.go](file://internal/service/merchant.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) + +**章节来源** +- [merchant_v1_merchant_config_update.go](file://internal/controller/merchant/merchant_v1_merchant_config_update.go) +- [merchant.go](file://internal/service/merchant.go) + +### 商户部署信息管理分析 +商户部署信息管理功能负责维护商户的部署策略和通道配置,包括支付方式、代付通道、区域限制等。系统通过`merchant_deploy_info`表存储这些配置信息,并提供相应的增删改查接口。 + +#### 商户部署信息类图 +```mermaid +classDiagram +class MerchantDeployRecord { ++string MerchantUid ++string PayType ++string SingleRoadUid ++string SingleRoadName ++float SingleRoadPlatformRate ++float SingleRoadAgentRate ++string RollRoadCode ++string RollRoadName ++float RollRoadPlatformRate ++float RollRoadAgentRate ++string[] RestrictArea ++bool IsLoan ++float LoanRate ++int LoanDays ++int UnfreezeHour ++float WaitUnfreezeAmount ++float LoanAmount ++bool AutoSettle ++bool AutoPayfor ++bool IsRestrictAgent ++bool IsRestrictCardPass ++bool IsRestrictDevice ++bool IsRestrictIp ++bool IsRestrictInternalIp ++string SubmitStrategy +} +class MerchantDeployInfoStrategyOutput { ++string[] RestrictArea ++bool IsRestrictAgent ++bool IsRestrictCardPass ++bool IsRestrictDevice ++bool IsRestrictIp ++bool IsRestrictInternalIp +} +MerchantDeployRecord --> MerchantDeployInfoStrategyOutput : "包含" +``` + +**图示来源** +- [merchant.go](file://internal/model/merchant.go) +- [v_1_merchant_deploy_info.go](file://internal/dao/internal/v_1_merchant_deploy_info.go) + +**章节来源** +- [v_1_merchant_deploy_info.go](file://internal/dao/internal/v_1_merchant_deploy_info.go) +- [merchant.go](file://internal/model/merchant.go) + +## 依赖分析 +商户管理模块与其他系统组件存在明确的依赖关系。它依赖于权限认证系统进行访问控制,依赖于数据库访问层进行数据持久化,并为其他业务模块提供商户信息查询服务。 + +```mermaid +graph TD +A[商户管理模块] --> B[权限认证系统] +A --> C[数据库访问层] +A --> D[配置管理] +A --> E[代付通道管理] +A --> F[卡密通道管理] +B --> G[SysAuth] +C --> H[V1MerchantInfoDao] +C --> I[V1MerchantDeployInfoDao] +D --> J[SysConfigDict] +E --> K[PayForRoad] +F --> L[CardChannel] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#bbf,stroke:#333 +style D fill:#bbf,stroke:#333 +style E fill:#bbf,stroke:#333 +style F fill:#bbf,stroke:#333 +``` + +**图示来源** +- [merchant.go](file://internal/service/merchant.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) +- [v_1_merchant_deploy_info.go](file://internal/dao/internal/v_1_merchant_deploy_info.go) + +**章节来源** +- [merchant.go](file://internal/service/merchant.go) +- [sys_auth.go](file://internal/service/sys_auth.go) +- [v_1_merchant_info.go](file://internal/dao/internal/v_1_merchant_info.go) + +## 性能考虑 +商户管理模块在设计时考虑了性能优化,通过分页查询、缓存机制和数据库索引等方式提高查询效率。对于频繁访问的商户信息,系统可以考虑引入Redis缓存,减少数据库访问压力。同时,所有数据库操作都使用了参数化查询,防止SQL注入攻击。 + +## 故障排除指南 +当商户管理功能出现异常时,可以按照以下步骤进行排查: +1. 检查API接口返回的错误码和错误信息 +2. 查看系统日志中的相关错误记录 +3. 验证数据库连接是否正常 +4. 检查商户信息表中的数据完整性 +5. 确认权限认证是否通过 + +**章节来源** +- [merchant_v1_merchant_config_list.go](file://internal/controller/merchant/merchant_v1_merchant_config_list.go) +- [merchant_v1_merchant_config_detail.go](file://internal/controller/merchant/merchant_v1_merchant_config_detail.go) +- [merchant_v1_merchant_config_status.go](file://internal/controller/merchant/merchant_v1_merchant_config_status.go) + +## 结论 +kami_backend的商户管理模块实现了完整的商户配置管理、部署信息维护和样本管理功能。系统通过清晰的分层架构和规范的接口设计,提供了稳定可靠的商户管理服务。权限控制机制确保了数据安全,而灵活的配置选项满足了不同商户的个性化需求。该模块为整个系统的商户管理提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限策略管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限策略管理.md new file mode 100644 index 00000000..d30a887e --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限策略管理.md @@ -0,0 +1,291 @@ +# 权限策略管理 + + +**本文档引用文件** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_auth_rule_v1_rule_search.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go) +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go) +- [v1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go) + + +## 目录 +1. [简介](#简介) +2. [权限策略数据模型](#权限策略数据模型) +3. [权限策略动态管理机制](#权限策略动态管理机制) +4. [权限策略查询接口实现](#权限策略查询接口实现) +5. [权限策略持久化与一致性保障](#权限策略持久化与一致性保障) +6. [权限策略备份恢复与迁移](#权限策略备份恢复与迁移) +7. [权限策略审计日志记录](#权限策略审计日志记录) +8. [性能监控与告警配置](#性能监控与告警配置) + +## 简介 +本文档详细阐述了kami_backend系统中权限策略的管理机制。系统采用基于Casbin的RBAC(基于角色的访问控制)模型,实现了权限策略的动态加载、更新和同步。权限策略以菜单、按钮等形式组织,支持分层树形结构,并通过角色进行权限分配。系统提供了完整的权限策略生命周期管理功能,包括创建、查询、更新、删除以及与角色的绑定操作。 + +## 权限策略数据模型 + +权限策略的核心数据结构定义在`internal/model/sys_auth_rule.go`中,主要包含以下字段: + +- **Name**: 规则名称 +- **Title**: 菜单标题 +- **MenuType**: 类型(0目录,1菜单,2按钮) +- **Weigh**: 权重,用于排序 +- **IsHide**: 显示状态 +- **Path**: 路由地址 +- **IdAdmin**: 是否管理员独享 +- **Component**: 组件路径 +- **Children**: 子节点列表,形成树形结构 + +权限策略与角色的关联通过Casbin的策略规则实现,存储在数据库的`sys_casbin_rule`表中。 + +```mermaid +classDiagram +class SysAuthRule { ++string Name ++string Title ++uint MenuType ++int Weigh ++uint IsHide ++string Path ++int IdAdmin ++string Component ++[]*SysAuthRule Children +} +class V1SysAuthRule { ++uint Id ++string CreatedAt ++string UpdatedAt ++string DeletedAt +} +class SysAuthRuleInfoOutput { ++uint Id ++string Name ++string Title ++uint MenuType ++int Weigh ++uint IsHide ++string Path ++int IdAdmin ++string Component ++[]*SysAuthRuleInfoOutput Children +} +class SysAuthRuleTreeOutput { ++uint Id ++string Name ++string Title ++uint MenuType ++int Weigh ++uint IsHide ++string Path ++int IdAdmin ++string Component ++[]*SysAuthRuleTreeOutput Children +} +SysAuthRule <|-- V1SysAuthRule : "继承" +SysAuthRule --> SysAuthRuleInfoOutput : "转换" +SysAuthRule --> SysAuthRuleTreeOutput : "转换" +``` + +**Diagram sources** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L10) + +**Section sources** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L40) + +## 权限策略动态管理机制 + +权限策略的动态管理通过控制器层(Controller)和服务层(Service)协同完成。控制器接收HTTP请求,调用服务层接口执行具体业务逻辑。 + +### 权限策略加载流程 +系统启动时,权限策略从数据库`v1_sys_auth_rule`表中加载,并构建树形结构缓存。当用户登录时,系统根据用户角色动态生成其可访问的菜单列表。 + +### 权限策略更新与同步流程 +权限策略的更新操作(添加、修改、删除)通过API接口触发,流程如下: + +1. 前端发起HTTP请求(POST/PUT/DELETE) +2. 控制器接收请求并进行参数校验 +3. 调用`ISysAuthRule`服务接口执行数据库操作 +4. 操作成功后,更新Casbin策略引擎中的权限规则 +5. 返回操作结果给前端 + +```mermaid +sequenceDiagram +participant 前端 as 前端 +participant 控制器 as 控制器 +participant 服务 as 服务 +participant 数据库 as 数据库 +participant Casbin as Casbin引擎 +前端->>控制器 : 发起权限更新请求 +控制器->>控制器 : 参数校验 +控制器->>服务 : 调用服务方法 +服务->>数据库 : 执行数据库操作 +数据库-->>服务 : 返回结果 +服务->>Casbin : 更新策略规则 +Casbin-->>服务 : 确认更新 +服务-->>控制器 : 返回结果 +控制器-->>前端 : 返回响应 +``` + +**Diagram sources** +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L14) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L14) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L14) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**Section sources** +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L14) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L14) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L14) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +## 权限策略查询接口实现 + +权限策略的查询接口支持分页、条件过滤和结果排序功能,主要通过`RuleSearch`接口实现。 + +### 查询接口定义 +查询接口定义在`api/sys_auth_rule/v1/sys_auth_rule.go`中,主要参数包括: +- **Title**: 菜单名称,用于模糊匹配 +- **Component**: 组件路径,用于精确匹配 + +### 查询实现逻辑 +查询逻辑在`internal/service/sys_auth_rule.go`中实现,流程如下: +1. 接收查询请求参数 +2. 构建数据库查询条件 +3. 从`v1_sys_auth_rule`表中查询数据 +4. 将查询结果转换为树形结构 +5. 返回结果给调用方 + +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["校验输入参数"] +ValidateInput --> InputValid{"参数有效?"} +InputValid --> |否| ReturnError["返回错误"] +InputValid --> |是| BuildQuery["构建查询条件"] +BuildQuery --> ExecuteQuery["执行数据库查询"] +ExecuteQuery --> TransformResult["转换为树形结构"] +TransformResult --> ReturnResult["返回结果"] +ReturnError --> End([结束]) +ReturnResult --> End +``` + +**Diagram sources** +- [sys_auth_rule_v1_rule_search.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go#L1-L14) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**Section sources** +- [sys_auth_rule_v1_rule_search.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go#L1-L14) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +## 权限策略持久化与一致性保障 + +### 持久化存储方案 +权限策略数据持久化存储在关系型数据库中,主要涉及以下表: +- **v1_sys_auth_rule**: 存储权限策略的基本信息 +- **v1_sys_casbin_rule**: 存储Casbin策略规则,实现权限的细粒度控制 + +### 分布式环境下的策略一致性保障 +在分布式环境下,系统通过以下机制保障权限策略的一致性: +1. **数据库事务**: 所有权限策略的变更操作都使用数据库事务,确保数据的原子性和一致性。 +2. **Casbin适配器**: 使用数据库适配器,确保Casbin策略引擎与数据库中的策略规则保持同步。 +3. **缓存一致性**: 当权限策略变更时,清除相关缓存,确保所有节点获取到最新的权限数据。 + +```mermaid +erDiagram +v1_sys_auth_rule { +uint id PK +string name +string title +uint menu_type +int weigh +uint is_hide +string path +int id_admin +string component +uint parent_id FK +timestamp created_at +timestamp updated_at +} +v1_sys_casbin_rule { +uint id PK +string p_type +string v0 +string v1 +string v2 +string v3 +string v4 +string v5 +timestamp created_at +timestamp updated_at +} +v1_sys_auth_rule ||--o{ v1_sys_casbin_rule : "权限规则" +``` + +**Diagram sources** +- [v1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go#L1-L20) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +**Section sources** +- [v1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go#L1-L20) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 权限策略备份恢复与迁移 + +### 备份方案 +权限策略的备份应包含以下内容: +1. **数据库备份**: 定期备份`v1_sys_auth_rule`和`v1_sys_casbin_rule`表的数据。 +2. **配置文件备份**: 备份Casbin模型配置文件`rbac_model.conf`。 + +### 恢复方案 +权限策略的恢复流程: +1. 恢复数据库备份到目标环境。 +2. 验证数据完整性。 +3. 重启服务,确保Casbin引擎重新加载策略规则。 + +### 迁移指南 +权限策略迁移时应注意: +1. 确保源环境和目标环境的Casbin模型配置一致。 +2. 迁移过程中应停止服务,避免数据不一致。 +3. 迁移完成后,进行全面的权限功能测试。 + +**Section sources** +- [v1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go#L1-L20) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 权限策略审计日志记录 + +系统通过记录权限策略的变更日志,实现操作的可追溯性。审计日志应包含以下信息: +- **操作类型**: 添加、修改、删除等 +- **操作人**: 执行操作的用户ID +- **操作时间**: 操作发生的时间戳 +- **操作详情**: 变更前后的权限策略信息 + +审计日志的记录应在权限策略变更的事务中完成,确保日志与数据变更的一致性。 + +**Section sources** +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L14) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L14) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L14) + +## 性能监控与告警配置 + +### 性能监控指标 +建议监控以下关键性能指标: +- **权限查询响应时间**: 监控`RuleSearch`等查询接口的平均响应时间。 +- **权限更新成功率**: 监控权限策略更新操作的成功率。 +- **Casbin策略加载时间**: 监控Casbin引擎加载策略规则的时间。 + +### 异常告警配置 +建议配置以下告警规则: +- 当权限查询平均响应时间超过500ms时告警。 +- 当权限更新操作失败率超过1%时告警。 +- 当Casbin策略加载时间超过1秒时告警。 + +这些监控和告警配置有助于及时发现权限系统中的性能瓶颈和异常情况。 + +**Section sources** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [sys_auth_rule_v1_rule_search.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go#L1-L14) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则定义.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则定义.md new file mode 100644 index 00000000..47f0b932 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则定义.md @@ -0,0 +1,364 @@ +# 权限规则定义 + + +**本文档引用文件** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [model.go](file://api/sys_auth_rule/v1/model.go) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) + + +## 目录 +1. [简介](#简介) +2. [权限规则数据模型设计](#权限规则数据模型设计) +3. [权限规则接口实现](#权限规则接口实现) +4. [权限规则与角色、菜单的关联关系](#权限规则与角色菜单的关联关系) +5. [多层级权限继承机制](#多层级权限继承机制) +6. [权限规则配置最佳实践](#权限规则配置最佳实践) +7. [权限规则冲突检测与解决策略](#权限规则冲突检测与解决策略) +8. [权限规则版本管理建议](#权限规则版本管理建议) + +## 简介 +本文档详细阐述了 kami_backend 系统中权限规则的定义、实现机制与最佳实践。权限系统是保障系统安全的核心组件,通过精细化的权限控制实现不同角色对系统资源的访问隔离。本文深入分析权限规则的数据结构、接口实现、关联关系及高级特性,为系统维护和扩展提供全面的技术指导。 + +## 权限规则数据模型设计 + +权限规则的数据模型设计基于树形结构,支持目录、菜单和按钮三级权限粒度。核心字段包括规则ID、规则类型、规则值等,具备良好的扩展性和查询效率。 + +```mermaid +erDiagram +SYS_AUTH_RULE { +uint id PK +uint pid FK +string name UK +string title +uint menuType +int weigh +uint isHide +string path +string component +uint isLink +uint isIframe +uint isCached +uint isAffix +string linkUrl +string redirect +string icon +string condition +string remark +string moduleType +uint modelId +datetime createdAt +datetime updatedAt +} +SYS_AUTH_RULE ||--o{ SYS_AUTH_RULE : "父子关系" +``` + +**图示来源** +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) +- [v_1_sys_auth_rule.go](file://internal/dao/v_1_sys_auth_rule.go#L21-L23) + +**本节来源** +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) +- [model.go](file://api/sys_auth_rule/v1/model.go#L6-L52) + +### 核心字段说明 + +| 字段名 | 类型 | 必填 | 约束 | 说明 | +|--------|------|------|------|------| +| id | uint | 是 | 主键 | 权限规则唯一标识 | +| pid | uint | 是 | 外键 | 父级规则ID,根节点为0 | +| name | string | 是 | 唯一索引 | 规则编码,用于权限校验 | +| title | string | 是 | 长度1-100 | 规则显示名称 | +| menuType | uint | 是 | 0-2 | 类型:0目录 1菜单 2按钮 | +| weigh | int | 否 | - | 权重,用于排序 | +| isHide | uint | 否 | 0或1 | 显示状态:0显示 1隐藏 | +| path | string | 否 | - | 路由地址 | +| component | string | 否 | - | 前端组件路径 | +| isLink | uint | 否 | 0或1 | 是否外链 | +| isIframe | uint | 否 | 0或1 | 是否内嵌iframe | +| isCached | uint | 否 | 0或1 | 是否缓存 | +| isAffix | uint | 否 | 0或1 | 是否固定标签页 | +| linkUrl | string | 否 | - | 外链地址 | +| redirect | string | 否 | - | 路由重定向地址 | +| icon | string | 否 | - | 图标标识 | +| condition | string | 否 | - | 权限条件表达式 | +| remark | string | 否 | - | 备注信息 | +| moduleType | string | 否 | - | 所属模块类型 | +| modelId | uint | 否 | - | 关联模型ID | + +**本节来源** +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) +- [model.go](file://api/sys_auth_rule/v1/model.go#L6-L52) + +## 权限规则接口实现 + +权限规则的增删改查接口实现了完整的业务逻辑,包括请求参数验证、数据持久化和缓存更新等关键环节。 + +### 创建接口实现 + +创建权限规则接口(`RuleAdd`)接收前端提交的规则信息,执行严格的参数验证后持久化到数据库。 + +```mermaid +sequenceDiagram +participant 前端 as 前端应用 +participant 控制器 as 控制器 +participant 服务层 as 服务层 +participant 数据访问层 as 数据访问层 +participant 数据库 as 数据库 +前端->>控制器 : POST /menu/add +控制器->>控制器 : 参数验证 +控制器->>服务层 : 调用Add方法 +服务层->>数据访问层 : 插入记录 +数据访问层->>数据库 : 执行INSERT +数据库-->>数据访问层 : 返回结果 +数据访问层-->>服务层 : 返回插入ID +服务层->>服务层 : 更新缓存 +服务层-->>控制器 : 返回成功 +控制器-->>前端 : 返回响应 +``` + +**图示来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L30-L67) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L15) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**本节来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L30-L67) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L15) + +### 更新接口实现 + +更新权限规则接口(`RuleUpdate`)接收规则ID和更新字段,确保数据一致性并维护缓存同步。 + +```mermaid +sequenceDiagram +participant 前端 as 前端应用 +participant 控制器 as 控制器 +participant 服务层 as 服务层 +participant 数据访问层 as 数据访问层 +participant 数据库 as 数据库 +前端->>控制器 : PUT /menu/update +控制器->>控制器 : 参数验证 +控制器->>服务层 : 调用Update方法 +服务层->>数据访问层 : 查询原记录 +数据访问层->>数据库 : 执行SELECT +数据库-->>数据访问层 : 返回记录 +数据访问层-->>服务层 : 返回记录 +服务层->>数据访问层 : 更新记录 +数据访问层->>数据库 : 执行UPDATE +数据库-->>数据访问层 : 返回结果 +数据访问层-->>服务层 : 返回结果 +服务层->>服务层 : 清除缓存 +服务层-->>控制器 : 返回成功 +控制器-->>前端 : 返回响应 +``` + +**图示来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L75-L104) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L15) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**本节来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L75-L104) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L15) + +### 删除接口实现 + +删除权限规则接口(`RuleDelete`)支持批量删除,采用软删除策略并维护树形结构完整性。 + +```mermaid +flowchart TD +A[接收删除请求] --> B{参数验证} +B --> |失败| C[返回错误] +B --> |成功| D[查询待删除节点] +D --> E{是否存在子节点} +E --> |是| F[级联删除子节点] +E --> |否| G[标记删除状态] +F --> H[更新数据库] +G --> H +H --> I[清除相关缓存] +I --> J[返回成功] +``` + +**图示来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L102-L104) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L15) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**本节来源** +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go#L102-L104) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L15) + +## 权限规则与角色、菜单的关联关系 + +权限规则通过中间表与角色建立多对多关联关系,实现灵活的权限分配机制。 + +```mermaid +erDiagram +SYS_ROLE { +uint id PK +string name +string remark +} +SYS_AUTH_RULE { +uint id PK +string name +string title +} +SYS_ROLE_RULE { +uint roleId PK,FK +uint ruleId PK,FK +} +SYS_ROLE ||--o{ SYS_ROLE_RULE : "包含" +SYS_AUTH_RULE ||--o{ SYS_ROLE_RULE : "被包含" +``` + +**图示来源** +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) +- [sys_role.go](file://internal/model/entity/v_1_sys_role.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +**本节来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) + +### 关联管理接口 + +系统提供专门的接口用于管理角色与权限规则的绑定关系: + +- `BindRoleRule`: 绑定角色与权限规则 +- `UpdateRoleRule`: 更新角色权限规则 +- `GetMenuRoles`: 获取规则关联的角色列表 + +这些接口确保权限分配的原子性和一致性,避免出现权限配置不一致的问题。 + +**本节来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [sys_auth_rule.go](file://internal/controller/sys_auth_rule/sys_auth_rule.go) + +## 多层级权限继承机制 + +系统采用树形结构实现多层级权限继承,子节点自动继承父节点的权限配置。 + +```mermaid +classDiagram +class SysAuthRule { ++uint id ++uint pid ++string name ++string title ++uint menuType ++int weigh ++uint isHide ++string path ++string component ++Children []*SysAuthRule +} +class SysAuthRuleTreeRes { ++*SysAuthRuleInfoRes ++Children []*SysAuthRuleTreeRes +} +class RuleSearchInput { ++MenuCreateReq +} +SysAuthRule <|-- SysAuthRuleTreeRes +SysAuthRuleTreeRes "1" *-- "0..*" SysAuthRuleTreeRes : 包含 +``` + +**图示来源** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L10) +- [model.go](file://api/sys_auth_rule/v1/model.go#L20-L25) +- [model.go](file://api/sys_auth_rule/v1/model.go#L6-L17) + +**本节来源** +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L10) +- [model.go](file://api/sys_auth_rule/v1/model.go#L20-L25) + +### 继承实现逻辑 + +1. **树形结构构建**:通过 `GetMenuListTree` 方法递归构建完整的菜单树 +2. **父子关系维护**:`FindSonByParentId` 方法用于查找指定父节点的所有子节点 +3. **权限继承计算**:在权限校验时,自动包含父节点的所有权限规则 + +这种设计确保了权限配置的层次性和可维护性,简化了复杂系统的权限管理。 + +**本节来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L10) + +## 权限规则配置最佳实践 + +### 权限编码规范 + +权限编码应遵循统一的命名规范,便于管理和维护: + +- **格式**:`模块:功能:操作` +- **示例**:`user:profile:read`、`order:management:create` +- **要求**:小写字母、数字、冒号和下划线,长度不超过50字符 + +### 权限分类 + +建议将权限规则按以下维度进行分类管理: + +| 分类 | 说明 | 示例 | +|------|------|------| +| 功能权限 | 系统功能模块访问控制 | dashboard:view | +| 数据权限 | 数据范围访问控制 | order:data:own | +| 操作权限 | 具体操作行为控制 | user:create | +| 字段权限 | 字段级访问控制 | user:profile:email | + +### 权限粒度控制 + +根据业务需求合理设置权限粒度: + +1. **粗粒度**:适用于功能模块级别的控制 +2. **细粒度**:适用于具体操作和数据范围的控制 +3. **动态权限**:结合条件表达式实现动态权限判断 + +**本节来源** +- [model.go](file://api/sys_auth_rule/v1/model.go#L6-L52) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) + +## 权限规则冲突检测与解决策略 + +系统提供权限冲突检测机制,确保权限配置的一致性和有效性。 + +### 冲突检测规则 + +1. **编码冲突**:同一层级下权限编码必须唯一 +2. **路径冲突**:路由路径不能重复 +3. **循环引用**:禁止父子节点形成循环引用 +4. **权限重叠**:避免相同功能的权限规则重复定义 + +### 解决策略 + +- **优先级机制**:明确权限规则的优先级顺序 +- **继承覆盖**:子节点可以覆盖父节点的特定权限 +- **显式声明**:通过明确的权限声明避免隐式冲突 +- **审计日志**:记录权限变更历史,便于追溯和分析 + +**本节来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) + +## 权限规则版本管理建议 + +为确保权限系统的稳定性和可追溯性,建议实施以下版本管理策略: + +1. **变更记录**:详细记录每次权限规则的变更内容 +2. **版本快照**:定期创建权限配置的版本快照 +3. **灰度发布**:新权限配置先在测试环境验证 +4. **回滚机制**:建立快速回滚通道应对配置错误 +5. **审批流程**:重要权限变更需经过审批流程 + +通过完善的版本管理,可以有效降低权限配置风险,保障系统安全稳定运行。 + +**本节来源** +- [v_1_sys_auth_rule.go](file://internal/model/entity/v_1_sys_auth_rule.go#L11-L34) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则管理.md new file mode 100644 index 00000000..f8a434bb --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限规则管理.md @@ -0,0 +1,413 @@ +# 权限规则管理 + + +**本文档引用文件** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [sys_auth_rule.go](file://internal/logic/sys_auth_rule/sysAuthRule.go) +- [auth.go](file://internal/middleware/auth.go) +- [sys_role.go](file://internal/logic/sys_role/sysRole.go) +- [sys_casbin.go](file://internal/service/sys_casbin.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) + + +## 目录 +1. [引言](#引言) +2. [权限系统架构](#权限系统架构) +3. [RBAC模型定义](#rbac模型定义) +4. [权限策略存储与查询](#权限策略存储与查询) +5. [权限验证中间件](#权限验证中间件) +6. [角色与权限管理流程](#角色与权限管理流程) +7. [菜单权限管理](#菜单权限管理) +8. [权限继承与检查机制](#权限继承与检查机制) +9. [权限缓存与性能优化](#权限缓存与性能优化) +10. [安全审计建议](#安全审计建议) +11. [常见权限问题解决方案](#常见权限问题解决方案) +12. [最佳实践](#最佳实践) + +## 引言 +本文档详细阐述了kami_backend系统中基于Casbin的RBAC(基于角色的访问控制)权限控制系统的实现机制。系统通过灵活的权限规则配置,实现了细粒度的访问控制,支持角色创建、权限分配、策略更新等核心功能。文档深入分析了权限系统的架构设计、实现细节和最佳实践,为开发者和系统管理员提供全面的技术参考。 + +## 权限系统架构 +kami_backend的权限控制系统采用分层架构设计,主要包括权限模型定义、策略存储、权限验证中间件和管理接口四个核心组件。系统基于Casbin框架实现,通过RBAC模型进行权限控制,支持动态的角色和权限管理。 + +```mermaid +graph TB +subgraph "前端" +UI[用户界面] +end +subgraph "API网关" +AuthMiddleware[权限验证中间件] +end +subgraph "权限核心" +Casbin[Casbin引擎] +RBACModel[RBAC模型] +PolicyStorage[策略存储] +end +subgraph "管理接口" +RoleAPI[角色管理API] +RuleAPI[权限规则API] +MenuAPI[菜单管理API] +end +UI --> AuthMiddleware +AuthMiddleware --> Casbin +Casbin --> RBACModel +Casbin --> PolicyStorage +RoleAPI --> Casbin +RuleAPI --> Casbin +MenuAPI --> Casbin +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L0-L154) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L0-L154) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) + +## RBAC模型定义 +系统采用标准的RBAC权限模型,定义在`resource/casbin/rbac_model.conf`文件中。该模型包含请求定义、策略定义、角色定义、策略效果和匹配器五个部分,实现了基于角色的访问控制。 + +```mermaid +classDiagram +class RBACModel { ++request_definition r = sub, obj, act ++policy_definition p = sub, obj, act ++role_definition g = _, _ ++policy_effect e = some(where (p.eft == allow)) ++matchers m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act +} +class Request { ++string sub ++string obj ++string act +} +class Policy { ++string sub ++string obj ++string act +} +class Role { ++string role ++string parent +} +RBACModel --> Request : "定义" +RBACModel --> Policy : "定义" +RBACModel --> Role : "定义" +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L0-L13) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L0-L13) + +## 权限策略存储与查询 +权限策略持久化存储在数据库中,通过`V1SysCasbinRule`表进行管理。系统实现了完整的策略生命周期管理,包括保存、加载、添加、删除等操作。 + +### 策略存储结构 +权限策略存储采用通用的六字段结构,支持Casbin框架的所有策略类型: + +- **Ptype**: 策略类型(p表示权限策略,g表示角色继承策略) +- **V0-V5**: 策略参数(分别对应角色ID、规则ID、操作类型等) + +### 策略操作接口 +系统提供了完整的策略操作接口,封装在`ICasbin`接口中: + +```mermaid +classDiagram +class ICasbin { ++CasbinEnforcer(ctx) (*SyncedEnforcer, error) ++SavePolicy(model) error ++LoadPolicy(model) error ++AddPolicy(sec, pType, rule) error ++RemovePolicy(sec, pType, rule) error ++AddPolicies(sec, pType, rules) error ++RemovePolicies(sec, pType, rules) error ++RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues) error +} +class CasbinService { +-Enforcer *SyncedEnforcer +-EnforcerErr error +-Ctx context.Context +} +ICasbin <|-- CasbinService +``` + +**Diagram sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L15-L32) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L34-L38) + +**Section sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L0-L49) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) + +## 权限验证中间件 +系统通过中间件实现权限验证,支持多种认证方式和白名单机制。权限验证流程包括白名单检查、Token验证和权限检查三个阶段。 + +```mermaid +flowchart TD +Start([请求进入]) --> WhiteListCheck["检查白名单"] +WhiteListCheck --> IsWhiteList{"在白名单中?"} +IsWhiteList --> |是| AllowAccess["允许访问"] +IsWhiteList --> |否| TokenFrom["获取Token来源"] +TokenFrom --> HasTokenFrom{"有Token来源?"} +HasTokenFrom --> |否| ReturnError["返回Token来源不明"] +HasTokenFrom --> |是| CheckTokenType["检查Token类型"] +CheckTokenType --> IsLogin{"类型为login?"} +IsLogin --> |是| LoginAuth["执行Login认证"] +IsLogin --> |否| IsIframe{"类型为iframe?"} +IsIframe --> |是| IFrameAuth["执行IFrame认证"] +IsIframe --> |否| ReturnError +LoginAuth --> AuthResult{"认证成功?"} +IFrameAuth --> AuthResult +AuthResult --> |是| AllowAccess +AuthResult --> |否| ReturnAuthError["返回认证错误"] +AllowAccess --> NextMiddleware["继续后续中间件"] +ReturnAuthError --> ResponseError["返回错误响应"] +ReturnError --> ResponseError +ResponseError --> End([响应返回]) +NextMiddleware --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L0-L154) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L0-L154) + +## 角色与权限管理流程 +系统提供了完整的角色和权限管理功能,支持角色的创建、编辑、删除和权限分配。角色管理通过API接口暴露,实现了前后端分离的管理模式。 + +### 角色管理API +角色管理API提供了以下核心功能: +- 角色创建:创建新的角色并分配初始权限 +- 角色编辑:修改角色信息和权限分配 +- 角色删除:删除角色及其关联的权限 +- 角色列表:获取所有角色信息 + +### 权限分配流程 +权限分配流程如下: +1. 管理员选择目标角色 +2. 选择需要分配的权限规则 +3. 系统调用Casbin API更新策略 +4. 权限变更实时生效 + +```mermaid +sequenceDiagram +participant Admin as "管理员" +participant Frontend as "前端界面" +participant Backend as "后端服务" +participant Casbin as "Casbin引擎" +participant Database as "数据库" +Admin->>Frontend : 发起角色创建请求 +Frontend->>Backend : 发送创建角色API请求 +Backend->>Casbin : 初始化角色策略 +Casbin-->>Backend : 返回策略初始化结果 +Backend->>Database : 保存角色信息 +Database-->>Backend : 返回保存结果 +Backend-->>Frontend : 返回创建成功响应 +Frontend->>Admin : 显示创建成功 +Admin->>Frontend : 发起权限分配请求 +Frontend->>Backend : 发送权限分配API请求 +Backend->>Casbin : 调用AddPolicy添加权限 +Casbin->>Database : 保存策略到数据库 +Database-->>Casbin : 返回保存结果 +Casbin-->>Backend : 返回策略添加结果 +Backend-->>Frontend : 返回分配成功响应 +Frontend->>Admin : 显示分配成功 +``` + +**Diagram sources** +- [sys_role.go](file://api/sys_role/v1/sys_role.go) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) + +**Section sources** +- [sys_role.go](file://internal/logic/sys_role/sysRole.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) + +## 菜单权限管理 +菜单权限管理是系统权限控制的重要组成部分,实现了菜单与权限规则的绑定。系统支持菜单的增删改查和树形结构展示。 + +### 菜单数据结构 +菜单权限数据包含以下关键字段: +- **Id**: 菜单ID +- **Pid**: 父菜单ID +- **Name**: 菜单标识符 +- **Title**: 菜单标题 +- **Path**: 路由路径 +- **Component**: 组件路径 +- **MenuType**: 菜单类型(0:目录, 1:菜单, 2:按钮) +- **Weigh**: 权重(用于排序) +- **IsHide**: 是否隐藏 + +### 菜单管理流程 +```mermaid +flowchart TD +Start([菜单管理开始]) --> OperationChoice["选择操作类型"] +OperationChoice --> CreateMenu{"创建菜单?"} +CreateMenu --> |是| ValidateMenuInfo["验证菜单信息"] +CreateMenu --> |否| EditMenu{"编辑菜单?"} +EditMenu --> |是| FindMenu["查找目标菜单"] +EditMenu --> |否| DeleteMenu{"删除菜单?"} +DeleteMenu --> |是| ConfirmDelete["确认删除"] +DeleteMenu --> |否| ListMenu["获取菜单列表"] +ValidateMenuInfo --> CheckNameExists["检查菜单标识是否存在"] +CheckNameExists --> NameExists{"已存在?"} +NameExists --> |是| ReturnError["返回已存在错误"] +NameExists --> |否| SaveMenu["保存菜单信息"] +FindMenu --> MenuFound{"找到菜单?"} +MenuFound --> |否| ReturnNotFound["返回未找到"] +MenuFound --> |是| UpdateMenu["更新菜单信息"] +ConfirmDelete --> HasChildren{"有子菜单?"} +HasChildren --> |是| DeleteWithChildren["删除菜单及子菜单"] +HasChildren --> |否| DeleteOnly["仅删除当前菜单"] +SaveMenu --> BindPermissions["绑定角色权限"] +UpdateMenu --> BindPermissions +DeleteWithChildren --> RemovePermissions["移除权限策略"] +DeleteOnly --> RemovePermissions +BindPermissions --> UpdateCasbin["更新Casbin策略"] +RemovePermissions --> UpdateCasbin +UpdateCasbin --> Success["操作成功"] +Success --> End([菜单管理结束]) +ReturnError --> End +ReturnNotFound --> End +``` + +**Diagram sources** +- [sys_auth_rule.go](file://internal/logic/sys_auth_rule/sysAuthRule.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) + +**Section sources** +- [sys_auth_rule.go](file://internal/logic/sys_auth_rule/sysAuthRule.go#L0-L295) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) + +## 权限继承与检查机制 +系统实现了完整的权限继承和检查机制,确保权限控制的准确性和高效性。 + +### 权限继承 +权限继承基于Casbin的g角色定义,支持多级角色继承。当一个角色继承另一个角色时,它自动获得父角色的所有权限。 + +```mermaid +classDiagram +class Role { ++string Id ++string Name ++string ParentId ++string Remark +} +class UserRole { ++string UserId ++string RoleId +} +class PermissionRule { ++string Id ++string Name ++string Title ++string Path ++int MenuType +} +Role "1" --> "0..*" Role : "继承" +UserRole "1" --> "1" Role : "关联" +Role "1" --> "0..*" PermissionRule : "拥有" +``` + +### 权限检查流程 +权限检查流程如下: +1. 解析用户Token获取用户信息 +2. 获取用户所属角色 +3. 根据请求的资源和操作类型构建权限检查请求 +4. 调用Casbin引擎进行权限验证 +5. 返回验证结果 + +**Section sources** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) +- [auth.go](file://internal/middleware/auth.go#L0-L154) + +## 权限缓存与性能优化 +系统通过多种机制优化权限检查的性能,确保高并发场景下的响应速度。 + +### 缓存策略 +- **Casbin SyncedEnforcer**: 使用SyncedEnforcer实现策略的自动同步和缓存 +- **Redis缓存**: 对频繁访问的权限数据进行Redis缓存 +- **本地缓存**: 在应用层实现本地缓存,减少数据库查询 + +### 性能优化措施 +1. **批量操作**: 支持权限策略的批量添加和删除 +2. **事务处理**: 在数据库操作中使用事务确保数据一致性 +3. **异步更新**: 对非关键权限变更采用异步更新机制 +4. **连接池**: 使用数据库连接池提高数据库访问效率 + +**Section sources** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) +- [utility/pool/pool.go](file://utility/pool/pool.go) + +## 安全审计建议 +为确保权限系统的安全性,建议采取以下审计措施: + +### 安全审计要点 +- **权限变更审计**: 记录所有权限策略的变更操作,包括创建、修改和删除 +- **访问日志**: 记录所有权限检查的请求和结果 +- **异常检测**: 监控异常的权限请求模式 +- **定期审查**: 定期审查角色和权限分配的合理性 + +### 安全最佳实践 +1. **最小权限原则**: 为角色分配完成工作所需的最小权限 +2. **职责分离**: 关键操作需要多个角色协同完成 +3. **定期轮换**: 定期轮换管理员账号和权限 +4. **多因素认证**: 对敏感操作实施多因素认证 + +**Section sources** +- [sys_login_log.go](file://internal/logic/sys_login_log/sysLoginLog.go) +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) + +## 常见权限问题解决方案 +### 问题1:权限变更未生效 +**现象**: 修改角色权限后,用户仍无法访问新分配的资源 +**解决方案**: +1. 检查Casbin策略是否正确更新 +2. 确认数据库中的策略记录已同步 +3. 清除相关缓存 +4. 重新登录以刷新权限 + +### 问题2:权限继承异常 +**现象**: 子角色未正确继承父角色的权限 +**解决方案**: +1. 检查角色继承关系配置 +2. 验证Casbin的g策略是否正确生成 +3. 检查角色继承链是否存在循环引用 + +### 问题3:性能下降 +**现象**: 权限检查响应时间变长 +**解决方案**: +1. 检查数据库连接池状态 +2. 优化权限策略结构,减少策略数量 +3. 增加缓存容量 +4. 分析慢查询日志 + +**Section sources** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L245) +- [errHandler/handler.go](file://internal/errHandler/handler.go) + +## 最佳实践 +### 角色设计最佳实践 +- **基于职责设计角色**: 按照业务职责划分角色,而非按用户划分 +- **控制角色数量**: 避免创建过多细粒度的角色 +- **使用角色组**: 对相似角色进行分组管理 + +### 权限分配最佳实践 +- **先分配后调整**: 先为角色分配基础权限,再根据需要调整 +- **批量操作**: 使用批量接口进行大规模权限分配 +- **权限复用**: 尽量复用现有权限规则,避免重复创建 + +### 系统维护最佳实践 +- **定期备份**: 定期备份权限策略数据 +- **版本控制**: 对权限配置进行版本控制 +- **文档记录**: 详细记录角色和权限的设计 rationale + +**Section sources** +- [sys_role.go](file://internal/logic/sys_role/sysRole.go) +- [sys_auth_rule.go](file://internal/logic/sys_auth_rule/sysAuthRule.go) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限验证机制.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限验证机制.md new file mode 100644 index 00000000..1a581a14 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/权限规则管理/权限验证机制.md @@ -0,0 +1,290 @@ +# 权限验证机制 + + +**本文档引用的文件** +- [auth.go](file://internal/middleware/auth.go) +- [sys_casbin.go](file://internal/service/sys_casbin.go) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [sysRule.go](file://internal/logic/sys_role/sysRule.go) +- [sysAuthRule.go](file://internal/logic/sys_auth_rule/sysAuthRule.go) + + +## 目录 +1. [介绍](#介绍) +2. [权限验证中间件实现](#权限验证中间件实现) +3. [RBAC模型配置](#rbac模型配置) +4. [权限检查流程](#权限检查流程) +5. [权限缓存机制](#权限缓存机制) +6. [调试与日志记录](#调试与日志记录) +7. [性能优化策略](#性能优化策略) +8. [扩展与安全加固](#扩展与安全加固) + +## 介绍 +本文档详细阐述了kami_backend系统中基于Casbin的权限验证机制。该机制实现了完整的RBAC(基于角色的访问控制)模型,通过中间件拦截请求、识别用户身份并执行权限检查。系统支持灵活的权限策略配置、高效的权限缓存机制以及可扩展的自定义验证逻辑,确保了系统的安全性和高性能。 + +## 权限验证中间件实现 + +权限验证中间件是整个权限系统的核心组件,负责拦截HTTP请求并执行身份验证和权限检查。中间件实现了多种验证方式,包括标准登录验证和iframe嵌入验证,同时维护了一个白名单机制,允许特定接口无需权限验证即可访问。 + +中间件的主要功能包括: +- 白名单验证:检查请求路径是否在无需验证的白名单中 +- 登录身份验证:解析和验证用户Token,确保其有效性和未过期 +- iframe身份验证:处理嵌入式场景下的特殊身份验证需求 +- Token续签:在验证通过后自动续签Token,提升用户体验 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Middleware as "权限中间件" +participant Token as "Token服务" +participant Redis as "Redis缓存" +Client->>Middleware : 发起API请求 +Middleware->>Middleware : 检查白名单 +alt 在白名单中 +Middleware-->>Client : 直接放行 +else 需要验证 +Middleware->>Token : 解析请求Token +Token->>Redis : 验证Token有效性 +Redis-->>Token : 返回验证结果 +Token-->>Middleware : 返回解析结果 +alt Token有效 +Middleware->>Token : 续签Token +Token-->>Middleware : 返回新Token +Middleware->>Client : 设置新Token并放行 +else Token无效 +Middleware->>Client : 返回未授权错误 +end +end +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L15-L154) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L15-L154) + +## RBAC模型配置 + +系统采用标准的RBAC(基于角色的访问控制)模型,通过配置文件定义权限验证的基本规则和匹配逻辑。RBAC模型配置文件位于`resource/casbin/rbac_model.conf`,定义了请求定义、策略定义、角色定义、策略效果和匹配器等核心组件。 + +配置文件结构如下: +- **请求定义**:定义了权限检查的基本参数,包括主体(sub)、对象(obj)和操作(act) +- **策略定义**:定义了权限策略的结构,与请求定义保持一致 +- **角色定义**:定义了角色继承关系,支持用户到角色的映射 +- **策略效果**:定义了当存在至少一个允许策略时即允许访问的逻辑 +- **匹配器**:定义了具体的权限匹配规则,包括角色继承、对象匹配和操作匹配 + +```mermaid +erDiagram +USER ||--o{ USER_ROLE : "拥有" +ROLE ||--o{ ROLE_PERMISSION : "拥有" +PERMISSION ||--o{ MENU : "对应" +USER_ROLE }o--|| ROLE : "关联" +ROLE_PERMISSION }o--|| PERMISSION : "关联" +MENU ||--o{ SUB_MENU : "包含" +USER { +string id PK +string username +string password +int status +datetime created_at +} +ROLE { +int id PK +string name +string remark +int status +int list_order +} +PERMISSION { +int id PK +string name +string title +string path +string component +int menu_type +int weigh +} +MENU { +int id PK +int pid +string name +string title +string path +string component +int menu_type +int is_hide +int is_cached +int is_affix +} +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 权限检查流程 + +权限检查流程是系统安全控制的核心,通过Casbin引擎执行具体的权限验证。流程从用户登录开始,经过角色分配、权限加载到最终的权限检查,形成了完整的闭环。 + +### 用户身份识别 +系统通过Token机制识别用户身份,Token中包含用户ID和会话信息。在每次请求时,中间件会解析Token并验证其有效性,确保用户身份的真实性和安全性。 + +### 权限检查执行 +权限检查执行过程包括: +1. 获取用户角色:通过Casbin的Grouping Policy查询用户关联的角色 +2. 加载用户权限:根据角色获取对应的权限策略 +3. 执行权限匹配:使用Casbin的Enforcer执行具体的权限检查 +4. 返回检查结果:根据匹配结果决定是否允许访问 + +```mermaid +flowchart TD +Start([开始]) --> CheckWhiteList["检查白名单"] +CheckWhiteList --> IsInWhiteList{"在白名单中?"} +IsInWhiteList --> |是| AllowAccess["允许访问"] +IsInWhiteList --> |否| ParseToken["解析Token"] +ParseToken --> ValidateToken["验证Token有效性"] +ValidateToken --> IsTokenValid{"Token有效?"} +IsTokenValid --> |否| ReturnUnauthorized["返回未授权"] +IsTokenValid --> |是| GetUserRoles["获取用户角色"] +GetUserRoles --> LoadPermissions["加载用户权限"] +LoadPermissions --> CheckPermission["执行权限检查"] +CheckPermission --> IsAllowed{"权限允许?"} +IsAllowed --> |是| AllowAccess +IsAllowed --> |否| ReturnForbidden["返回禁止访问"] +AllowAccess --> End([结束]) +ReturnUnauthorized --> End +ReturnForbidden --> End +``` + +**Diagram sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L39-L49) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L244) + +**Section sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L39-L49) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L244) + +## 权限缓存机制 + +系统实现了高效的权限缓存机制,通过减少数据库查询次数来提升权限验证的性能。缓存机制包括策略缓存、角色缓存和用户权限缓存等多个层次,确保了系统的高性能和可扩展性。 + +### 缓存更新策略 +缓存更新策略采用写时更新模式,当权限策略发生变化时,立即更新缓存。具体更新操作包括: +- 添加策略:在添加新的权限策略时,同步更新缓存 +- 删除策略:在删除权限策略时,从缓存中移除相应条目 +- 修改策略:在修改权限策略时,更新缓存中的对应条目 + +### 缓存失效处理 +系统实现了完善的缓存失效处理机制,确保缓存数据的一致性。当发生以下情况时,相关缓存会被清除: +- 用户角色变更 +- 权限策略修改 +- 系统配置更新 +- 定期缓存刷新 + +```mermaid +classDiagram +class CasbinService { ++CasbinEnforcer(ctx) Enforcer ++SavePolicy(model) error ++LoadPolicy(model) error ++AddPolicy(sec, pType, rule) error ++RemovePolicy(sec, pType, rule) error +} +class CasbinAdapter { ++SavePolicy(model) error ++LoadPolicy(model) error ++AddPolicy(sec, pType, rule) error ++RemovePolicy(sec, pType, rule) error ++AddPolicies(sec, pType, rules) error ++RemovePolicies(sec, ptype, rules) error ++RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues) error +} +class Database { ++V1SysCasbinRule ++Insert(line) error ++Delete(condition) error ++Scan(lines) error +} +class Cache { ++Get(key) value ++Set(key, value) error ++Delete(key) error ++Flush() error +} +CasbinService --> CasbinAdapter : "使用" +CasbinAdapter --> Database : "持久化" +CasbinAdapter --> Cache : "缓存" +Cache --> Database : "回源" +``` + +**Diagram sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L59-L195) + +**Section sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L59-L195) + +## 调试与日志记录 + +系统提供了完善的调试方法和日志记录机制,帮助开发人员和运维人员快速定位和解决问题。日志记录涵盖了权限验证的各个环节,包括Token验证、权限检查和错误处理等。 + +### 调试方法 +- 启用详细日志:通过配置开启详细的权限验证日志 +- 使用测试Token:在开发环境中使用预定义的测试Token进行调试 +- 检查缓存状态:监控缓存命中率和缓存大小等指标 +- 验证策略加载:确认权限策略正确加载到Casbin引擎 + +### 日志记录建议 +- 记录所有权限拒绝事件,包括原因和上下文信息 +- 记录Token验证失败的详细信息,便于安全审计 +- 记录权限策略变更操作,确保可追溯性 +- 定期分析日志,发现潜在的安全风险和性能瓶颈 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L15-L154) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L39-L49) + +## 性能优化策略 + +在高并发场景下,权限验证系统需要具备良好的性能表现。系统通过多种优化策略确保了在高负载下的稳定性和响应速度。 + +### 高并发性能调优 +- 连接池优化:合理配置数据库连接池大小,避免连接耗尽 +- 缓存分层:采用多级缓存策略,减少对后端存储的压力 +- 批量操作:支持批量权限检查,减少单次请求的开销 +- 异步处理:将非关键操作异步化,提升响应速度 + +### 性能监控指标 +- 权限验证响应时间 +- 缓存命中率 +- 数据库查询次数 +- 并发连接数 +- 错误率 + +**Section sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L39-L49) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L0-L244) + +## 扩展与安全加固 + +系统设计了灵活的扩展机制,支持自定义权限验证逻辑和安全加固措施,满足不同场景下的安全需求。 + +### 自定义权限验证逻辑 +- 自定义匹配器:支持定义复杂的权限匹配规则 +- 上下文感知:基于请求上下文执行动态权限检查 +- 多因素验证:集成多种身份验证方式,提升安全性 +- 时间限制:支持基于时间的权限控制 + +### 安全加固措施 +- Token安全:采用加密算法保护Token内容 +- 防重放攻击:通过时间戳和随机数防止Token重放 +- 速率限制:防止暴力破解和滥用 +- 安全审计:记录所有敏感操作,便于事后追溯 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L15-L154) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L39-L49) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/会话管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/会话管理.md new file mode 100644 index 00000000..a9464b44 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/会话管理.md @@ -0,0 +1,285 @@ +# 会话管理 + + +**Referenced Files in This Document** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [sysUser_v1_user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go) +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [models.go](file://utility/config/models.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [sys_user_login.go](file://internal/model/sys_user_login.go) + + +## 目录 +1. [简介](#简介) +2. [认证流程](#认证流程) +3. [令牌管理](#令牌管理) +4. [认证中间件](#认证中间件) +5. [用户登出机制](#用户登出机制) +6. [安全策略](#安全策略) +7. [性能优化](#性能优化) +8. [总结](#总结) + +## 简介 + +本文档详细阐述了kami_backend系统的会话管理机制,包括用户身份验证、令牌生成与验证、会话控制和安全防护等核心功能。系统采用JWT(JSON Web Token)作为主要的认证机制,结合Redis缓存实现高效的会话管理。会话管理模块主要由认证控制器、令牌服务、认证中间件和用户服务等组件构成,共同保障系统的安全性和可用性。 + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) +- [auth.go](file://internal/middleware/auth.go#L1-L155) +- [user_token.go](file://utility/token/user_token.go#L1-L135) + +## 认证流程 + +系统的用户认证流程遵循标准的JWT认证模式,通过用户名和密码进行身份验证,并生成相应的访问令牌。认证过程包括验证码验证、用户信息查询、密码比对和令牌生成等步骤。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "认证控制器" +participant Service as "用户服务" +participant Token as "令牌服务" +Client->>Controller : 提交登录请求(用户名、密码、验证码) +Controller->>Service : 验证验证码 +Service-->>Controller : 验证结果 +alt 验证失败 +Controller-->>Client : 返回验证码错误 +else 验证成功 +Controller->>Service : 查询用户信息 +Service-->>Controller : 返回用户数据 +Controller->>Service : 验证密码 +Service-->>Controller : 密码验证结果 +alt 密码验证失败 +Controller-->>Client : 返回用户名或密码错误 +else 密码验证成功 +Controller->>Token : 生成用户令牌 +Token-->>Controller : 返回JWT令牌 +Controller-->>Client : 返回登录成功响应(包含令牌) +end +end +``` + +**Diagram sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L767) + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L767) + +## 令牌管理 + +### 令牌生成 + +系统使用JWT标准生成用户令牌,令牌包含用户ID、用户名、签发时间、过期时间等信息。令牌生成过程由`GenerateUserToken`函数实现,该函数根据配置的加密密钥对令牌进行签名,并将令牌存储在Redis缓存中以支持令牌失效管理。 + +```mermaid +flowchart TD +Start([开始]) --> GenerateClaims["生成令牌声明(Claims)"] +GenerateClaims --> SetClaims["设置用户ID、用户名、签发者、过期时间等"] +SetClaims --> SignToken["使用HS256算法签名令牌"] +SignToken --> StoreRedis["将令牌存储到Redis缓存"] +StoreRedis --> ReturnToken["返回JWT令牌"] +ReturnToken --> End([结束]) +``` + +**Diagram sources** +- [user_token.go](file://utility/token/user_token.go#L1-L135) + +### 令牌验证 + +令牌验证是会话管理的核心环节,系统通过`ParseUserToken`函数解析和验证JWT令牌的有效性。验证过程包括检查令牌签名、过期时间以及从Redis中验证令牌是否存在。 + +```mermaid +flowchart TD +Start([开始]) --> ExtractToken["从请求头提取令牌"] +ExtractToken --> ParseToken["解析JWT令牌"] +ParseToken --> ValidateSignature["验证令牌签名"] +ValidateSignature --> CheckExpired["检查令牌是否过期"] +CheckExpired --> QueryRedis["查询Redis缓存中的令牌"] +QueryRedis --> CompareToken["比较请求令牌与缓存令牌"] +CompareToken --> IsValid{"令牌有效?"} +IsValid --> |是| ReturnSuccess["返回验证成功"] +IsValid --> |否| ReturnFailure["返回验证失败"] +ReturnSuccess --> End([结束]) +ReturnFailure --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L155) +- [user_token.go](file://utility/token/user_token.go#L1-L135) + +### 令牌刷新 + +系统实现了智能的令牌刷新机制,当令牌的使用时间超过最大刷新时间但未过期时,系统会自动为用户生成新的令牌。这一机制既保证了用户体验的连续性,又增强了系统的安全性。 + +```mermaid +classDiagram +class UserToken { ++string UserID ++string Username ++RegisteredClaims RegisteredClaims ++genToken(ctx context.Context) string, error +} +class TokenService { ++GenerateUserToken(ctx context.Context, userName, userID string) string, error ++ParseUserToken(ctx context.Context, transToken string) *UserToken, error ++RefreshUserToken(ctx context.Context, userToken UserToken) string, error ++DeleteTokenFromRedis(ctx context.Context, userID string) error +} +class TokenConfig { ++string ServerName ++string CacheKey ++int64 Timeout ++int64 MaxRefresh ++[]byte EncryptKey ++string CacheModel +} +TokenService --> UserToken : "使用" +TokenService --> TokenConfig : "读取配置" +``` + +**Diagram sources** +- [user_token.go](file://utility/token/user_token.go#L1-L135) +- [models.go](file://utility/config/models.go#L1-L61) + +**Section sources** +- [user_token.go](file://utility/token/user_token.go#L1-L135) +- [models.go](file://utility/config/models.go#L1-L61) + +## 认证中间件 + +认证中间件是系统安全的第一道防线,负责拦截所有需要认证的请求,验证令牌的有效性,并在必要时进行令牌刷新。中间件还支持白名单机制,允许特定的公共接口无需认证即可访问。 + +```mermaid +flowchart TD +Start([请求进入]) --> CheckWhiteList["检查是否在白名单"] +CheckWhiteList --> IsWhiteList{"在白名单?"} +IsWhiteList --> |是| PassThrough["直接通过"] +IsWhiteList --> |否| GetToken["从请求获取令牌"] +GetToken --> ValidateToken["验证令牌有效性"] +ValidateToken --> IsValid{"令牌有效?"} +IsValid --> |是| RefreshToken["检查是否需要刷新"] +IsValid --> |否| ReturnError["返回未授权"] +RefreshToken --> NeedRefresh{"需要刷新?"} +NeedRefresh --> |是| GenerateNewToken["生成新令牌"] +NeedRefresh --> |否| Continue["继续处理"] +GenerateNewToken --> SetHeader["设置refresh-token响应头"] +SetHeader --> Continue +Continue --> NextMiddleware["调用下一个中间件"] +ReturnError --> SendResponse["发送错误响应"] +PassThrough --> NextMiddleware +NextMiddleware --> End([处理完成]) +SendResponse --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L155) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L155) + +## 用户登出机制 + +### 登出流程 + +用户登出功能通过`UserLoginOut`控制器实现,当用户发起登出请求时,系统会解析请求中的令牌,提取用户ID,并从Redis缓存中删除对应的令牌,从而实现令牌的立即失效。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "登出控制器" +participant Token as "令牌服务" +Client->>Controller : 发送登出请求(包含令牌) +Controller->>Token : 解析用户令牌 +Token-->>Controller : 返回用户信息 +Controller->>Token : 删除Redis中的令牌 +Token-->>Controller : 删除结果 +Controller-->>Client : 返回登出成功响应 +``` + +**Diagram sources** +- [sysUser_v1_user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go#L1-L19) +- [user_token.go](file://utility/token/user_token.go#L1-L135) + +### 会话清理 + +登出时的会话清理主要通过删除Redis缓存中的令牌来实现。系统使用`DeleteTokenFromRedis`函数根据用户ID删除对应的令牌记录,确保用户无法再使用旧的令牌进行认证。 + +**Section sources** +- [sysUser_v1_user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go#L1-L19) +- [user_token.go](file://utility/token/user_token.go#L1-L135) + +## 安全策略 + +### 令牌安全存储 + +系统采用多层安全措施保护令牌的安全: +1. 使用HTTPS协议传输令牌,防止中间人攻击 +2. 令牌存储在Redis缓存中,设置合理的过期时间 +3. 使用强加密算法(HS256)对令牌进行签名 +4. 敏感信息不存储在令牌中,仅包含必要的用户标识 + +### 过期时间设置 + +令牌的过期时间通过配置文件进行管理,系统支持灵活的过期策略: +- 基础过期时间:默认10天(可配置) +- 最大刷新时间:默认5天(可配置),超过此时间后令牌不再自动刷新 +- 令牌刷新机制:在最大刷新时间和过期时间之间使用时自动刷新 + +### 防止令牌劫持 + +系统通过以下机制防止令牌劫持: +1. 令牌绑定用户会话,每次请求都验证令牌与用户的一致性 +2. 支持令牌立即失效,用户登出后旧令牌无法使用 +3. 白名单机制限制敏感操作的访问路径 +4. 请求头验证,确保令牌来源的合法性 + +**Section sources** +- [models.go](file://utility/config/models.go#L1-L61) +- [user_token.go](file://utility/token/user_token.go#L1-L135) +- [auth.go](file://internal/middleware/auth.go#L1-L155) + +## 性能优化 + +### 缓存策略 + +系统采用Redis作为令牌的缓存存储,相比内存存储具有以下优势: +- 支持分布式部署,多实例间共享会话状态 +- 数据持久化,重启后会话状态不丢失 +- 内置过期机制,自动清理过期令牌 +- 高性能读写,满足高并发场景需求 + +### 并发处理 + +认证中间件设计考虑了高并发场景下的性能表现: +- 无状态设计,不依赖服务器本地存储 +- 轻量级验证,仅需一次Redis查询即可完成认证 +- 支持异步刷新,不影响主请求处理流程 +- 白名单机制减少不必要的认证开销 + +### 资源管理 + +系统通过以下方式优化资源使用: +- 合理设置令牌过期时间,平衡安全性和用户体验 +- 批量操作优化,减少数据库查询次数 +- 连接池管理,有效利用数据库连接资源 +- 日志分级,避免过度日志影响性能 + +**Section sources** +- [user_token.go](file://utility/token/user_token.go#L1-L135) +- [auth.go](file://internal/middleware/auth.go#L1-L155) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L767) + +## 总结 + +kami_backend的会话管理系统采用现代化的JWT认证机制,结合Redis缓存实现了高效、安全的用户会话管理。系统具有以下特点: +1. 安全性高:采用标准JWT协议,支持令牌刷新和立即失效 +2. 性能优越:基于Redis的缓存设计,支持高并发访问 +3. 灵活性好:配置化的过期策略和白名单机制 +4. 易于维护:清晰的代码结构和模块化设计 + +该会话管理机制能够有效支持系统的安全需求,为用户提供流畅的认证体验,同时具备良好的扩展性和维护性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/双因素认证.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/双因素认证.md new file mode 100644 index 00000000..156c59f1 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/双因素认证.md @@ -0,0 +1,220 @@ +# 双因素认证 + + +**本文档中引用的文件** +- [mfa.go](file://utility/mfa/mfa.go) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [sysUser_v1_totp_image_get.go](file://internal/controller/sysUser/sysUser_v1_totp_image_get.go) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sys_user.go](file://internal/service/sys_user.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档全面描述了kami_backend系统中基于时间的一次性密码(TOTP)双因素认证的实现机制。文档涵盖TOTP密钥生成、二维码展示、验证码验证流程,以及用户启用和禁用双因素认证的接口实现与安全考虑。同时解释了MFA工具类的功能和集成方式,包括TOTP验证过程中的时间同步和容错处理,并提供双因素认证的安全最佳实践和用户操作指南。 + +## 项目结构 +kami_backend的双因素认证功能主要分布在`api/sysUser/v1`、`internal/controller/sysUser`和`utility/mfa`目录中。`api`目录定义了TOTP相关的API接口,`internal/controller/sysUser`实现了控制器逻辑,而`utility/mfa`提供了核心的MFA工具函数。 + +```mermaid +graph TB +subgraph "API层" +A[totp.go] +end +subgraph "控制器层" +B[sysUser_v1_totp_set.go] +C[sysUser_v1_totp_image_get.go] +D[sysUser_v1_totp_status_get.go] +E[sysUser_v1_totp_reset.go] +end +subgraph "服务层" +F[sys_user.go] +end +subgraph "工具层" +G[mfa.go] +end +A --> B +A --> C +A --> D +A --> E +B --> F +C --> F +D --> F +E --> F +B --> G +C --> G +D --> G +E --> G +F --> G +``` + +**Diagram sources** +- [totp.go](file://api/sysUser/v1/totp.go) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [sysUser_v1_totp_image_get.go](file://internal/controller/sysUser/sysUser_v1_totp_image_get.go) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [mfa.go](file://utility/mfa/mfa.go) + +**Section sources** +- [api/sysUser/v1](file://api/sysUser/v1) +- [internal/controller/sysUser](file://internal/controller/sysUser) +- [utility/mfa](file://utility/mfa) + +## 核心组件 +双因素认证的核心组件包括MFA工具类、TOTP状态获取、TOTP设置、TOTP二维码获取和TOTP重置功能。这些组件协同工作,实现了完整的双因素认证流程。 + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [sysUser_v1_totp_image_get.go](file://internal/controller/sysUser/sysUser_v1_totp_image_get.go) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go) + +## 架构概述 +双因素认证的架构分为四层:API层、控制器层、服务层和工具层。API层定义了TOTP相关的接口,控制器层处理业务逻辑,服务层提供用户数据操作,工具层实现TOTP的核心算法。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[工具层] +A --> |HTTP请求| B +B --> |调用| C +C --> |调用| D +D --> |返回| C +C --> |返回| B +B --> |响应| A +``` + +**Diagram sources** +- [totp.go](file://api/sysUser/v1/totp.go) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [mfa.go](file://utility/mfa/mfa.go) + +## 详细组件分析 +### MFA工具类分析 +MFA工具类提供了TOTP密钥生成、二维码生成和验证码验证的核心功能。 + +```mermaid +classDiagram +class Otp { ++string Secret ++string QrImage ++string Key +} +class mfa { ++GetOtp(userId, username, key, secret) Otp ++ValidCode(code, secret) bool +} +mfa --> Otp : "返回" +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L10-L52) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) + +### TOTP设置流程分析 +用户设置TOTP的流程包括验证密码和验证码,然后保存TOTP密钥。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "TotpSet控制器" +participant Service as "SysUserService" +participant MFA as "MFA工具" +Client->>Controller : POST /user/totp/set +Controller->>Service : LoginOnlyLogin() +Service-->>Controller : 用户信息 +Controller->>MFA : ValidCode(code, otpSecret) +MFA-->>Controller : 验证结果 +alt 验证失败 +Controller-->>Client : 验证码错误 +else 验证成功 +Controller->>Service : SetTotp() +Service-->>Controller : 成功 +Controller-->>Client : 成功响应 +end +``` + +**Diagram sources** +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L33) +- [sys_user.go](file://internal/service/sys_user.go#L100-L101) + +**Section sources** +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L33) + +### TOTP状态获取分析 +获取TOTP状态的流程根据用户是否已启用TOTP返回不同信息。 + +```mermaid +flowchart TD +Start([开始]) --> Auth["验证登录状态"] +Auth --> Check["检查OtpSecret是否为空"] +Check --> |为空| Generate["生成新OTP"] +Generate --> Return["返回二维码和密钥"] +Check --> |不为空| ReturnStatus["返回已启用状态"] +Return --> End([结束]) +ReturnStatus --> End +``` + +**Diagram sources** +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L36) + +**Section sources** +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L36) + +## 依赖分析 +双因素认证功能依赖于多个组件和外部库。 + +```mermaid +graph TD +A[mfa.go] --> B[gotp] +A --> C[qrcode] +A --> D[grand] +B --> E[TOTP算法] +C --> F[二维码生成] +D --> G[随机字符串生成] +G1[sysUser控制器] --> A +G2[sys_user服务] --> A +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L33) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L33) + +## 性能考虑 +双因素认证的性能主要受二维码生成和TOTP验证算法的影响。系统使用了高效的第三方库来处理这些计算密集型任务,确保了良好的响应性能。 + +## 故障排除指南 +### 常见问题 +1. **二维码无法扫描**:检查生成的base64编码是否正确,确保数据URI格式正确。 +2. **验证码验证失败**:确认客户端和服务器时间同步,检查TOTP时间窗口设置。 +3. **密钥生成失败**:确保gotp库正确导入并可用。 + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L33) + +## 结论 +kami_backend的双因素认证系统通过分层架构实现了安全可靠的TOTP认证机制。系统提供了完整的启用、验证和重置功能,结合了高效的第三方库来处理核心算法,确保了良好的安全性和性能表现。建议定期审查和更新MFA实现,以应对不断变化的安全威胁。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/用户认证管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/用户认证管理.md new file mode 100644 index 00000000..676b9003 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/用户认证管理.md @@ -0,0 +1,382 @@ +# 用户认证管理 + + +**本文档引用的文件** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) +- [v_1_sys_user.go](file://internal/model/entity/v_1_sys_user.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [base_user_info.go](file://internal/logic/base_user_info/user_info.go) +- [sys_auth.go](file://internal/logic/sys_auth/sysAuth.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 简介 +本文档全面描述了kami_backend系统的用户认证管理机制,包括用户登录、登出、会话管理、双因素认证(TOTP)、身份验证令牌的生成与验证、登录日志记录和安全审计等核心功能。文档详细阐述了系统如何通过JWT令牌、Redis缓存和中间件实现安全的用户认证流程,并提供了用户认证的最佳实践和常见问题的解决方案。 + +## 项目结构 +kami_backend的用户认证相关代码分布在多个目录中,主要集中在`api`、`internal`和`utility`目录下。认证逻辑主要由`internal/controller/sys_user_login`和`internal/controller/sysUser`控制器处理,业务逻辑在`internal/logic/sys_user`中实现,服务接口定义在`internal/service/sys_user.go`中,而工具函数则位于`utility/token`和`utility/mfa`包中。 + +```mermaid +graph TD +subgraph "API层" +A[sys_user_login/v1/sys_user_login.go] +B[sysUser/v1/totp.go] +end +subgraph "控制器层" +C[sys_user_login/sys_user_login.go] +D[sysUser/sysUser.go] +end +subgraph "业务逻辑层" +E[sys_user/sys_user.go] +F[base_user_info/user_info.go] +G[sys_auth/sysAuth.go] +end +subgraph "服务层" +H[sys_user.go] +end +subgraph "数据访问层" +I[v_1_sys_user.go] +end +subgraph "工具层" +J[user_token.go] +K[mfa.go] +L[auth.go] +end +A --> C +B --> D +C --> E +D --> E +C --> F +D --> G +E --> H +F --> H +G --> H +H --> I +E --> J +E --> K +C --> L +D --> L +``` + +**图表来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [base_user_info.go](file://internal/logic/base_user_info/user_info.go) +- [sys_auth.go](file://internal/logic/sys_auth/sysAuth.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +**章节来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [base_user_info.go](file://internal/logic/base_user_info/user_info.go) +- [sys_auth.go](file://internal/logic/sys_auth/sysAuth.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +## 核心组件 +用户认证系统的核心组件包括:用户登录请求处理、JWT令牌生成与验证、双因素认证(TOTP)集成、会话管理、登录日志记录和权限验证中间件。这些组件协同工作,确保系统的安全性和可靠性。 + +**章节来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +## 架构概述 +kami_backend的用户认证架构采用分层设计,从API接口到数据访问层,每一层都有明确的职责。认证流程始于API层的登录请求,经过控制器层的处理,调用业务逻辑层进行用户验证和令牌生成,最终通过数据访问层与数据库交互。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Logic as "业务逻辑" +participant Service as "服务" +participant DAO as "数据访问" +participant DB as "数据库" +participant Redis as "Redis缓存" +Client->>API : 发送登录请求 +API->>Controller : 调用UserLogin +Controller->>Logic : 验证验证码 +Logic->>Logic : 验证用户名密码 +alt 启用TOTP +Logic->>Logic : 验证TOTP验证码 +end +Logic->>Service : 生成JWT令牌 +Service->>Redis : 存储令牌 +Service->>DB : 记录登录日志 +Service-->>Controller : 返回令牌 +Controller-->>API : 返回响应 +API-->>Client : 返回登录结果 +``` + +**图表来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [user_token.go](file://utility/token/user_token.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) + +## 详细组件分析 +### 用户登录与认证分析 +用户登录流程包括验证码验证、用户名密码验证、双因素认证(如果启用)和JWT令牌生成。系统使用中间件进行请求认证,确保只有经过验证的用户才能访问受保护的资源。 + +#### 用户登录流程 +```mermaid +flowchart TD +Start([开始]) --> ValidateCaptcha["验证验证码"] +ValidateCaptcha --> CaptchaValid{"验证码有效?"} +CaptchaValid --> |否| ReturnCaptchaError["返回验证码错误"] +CaptchaValid --> |是| ValidateCredentials["验证用户名密码"] +ValidateCredentials --> CredentialsValid{"凭证有效?"} +CredentialsValid --> |否| ReturnAuthError["返回认证错误"] +CredentialsValid --> |是| CheckTOTP["检查TOTP是否启用"] +CheckTOTP --> TOTPEnabled{"TOTP启用?"} +TOTPEnabled --> |否| GenerateToken["生成JWT令牌"] +TOTPEnabled --> |是| ValidateTOTP["验证TOTP验证码"] +ValidateTOTP --> TOTPValid{"TOTP有效?"} +TOTPValid --> |否| ReturnTOTPError["返回TOTP错误"] +TOTPValid --> |是| GenerateToken +GenerateToken --> StoreToken["存储令牌到Redis"] +StoreToken --> LogLogin["记录登录日志"] +LogLogin --> ReturnToken["返回令牌"] +ReturnCaptchaError --> End([结束]) +ReturnAuthError --> End +ReturnTOTPError --> End +ReturnToken --> End +``` + +**图表来源** +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) + +**章节来源** +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) + +### 双因素认证(TOTP)分析 +系统集成了基于时间的一次性密码(TOTP)作为双因素认证机制。用户可以启用、禁用和重置TOTP设置,系统通过QR码提供配置信息。 + +#### TOTP配置流程 +```mermaid +classDiagram +class Otp { ++Secret string ++QrImage string ++Key string +} +class Mfa { ++GetOtp(userId, username, key, secret) Otp ++ValidCode(code, secret) bool +} +class TotpController { +-userService UserService ++TotpStatusGet(req) Res ++TotpSet(req) Res ++TotpImageGet(req) Res ++TotpReset(req) Res +} +class UserService { ++SetTotp(ctx, data, key, secret) error ++ResetTotp(ctx, data) error +} +Mfa --> Otp : "创建" +TotpController --> Mfa : "使用" +TotpController --> UserService : "调用" +UserService --> Mfa : "验证" +``` + +**图表来源** +- [mfa.go](file://utility/mfa/mfa.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) + +**章节来源** +- [mfa.go](file://utility/mfa/mfa.go) +- [totp.go](file://api/sysUser/v1/totp.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) + +### 会话管理分析 +系统使用JWT令牌进行会话管理,令牌存储在Redis中以实现分布式会话。中间件负责验证令牌的有效性,并在必要时进行令牌刷新。 + +#### 会话管理流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Middleware as "认证中间件" +participant Token as "令牌服务" +participant Redis as "Redis" +Client->>Middleware : 发送请求 +Middleware->>Token : 提取令牌 +Token->>Redis : 检查令牌是否存在 +Redis-->>Token : 返回检查结果 +alt 令牌有效 +Token->>Token : 验证JWT签名 +Token->>Token : 检查过期时间 +alt 需要刷新 +Token->>Token : 生成新令牌 +Token->>Redis : 存储新令牌 +Token-->>Middleware : 返回刷新令牌 +end +Middleware->>Client : 继续处理请求 +else 令牌无效 +Middleware->>Client : 返回未授权错误 +end +``` + +**图表来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) + +**章节来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) + +## 依赖分析 +用户认证系统涉及多个组件之间的依赖关系,从API接口到数据访问层,形成了一个完整的认证链条。 + +```mermaid +graph TD +A[UserLoginReq] --> B[ControllerV1.UserLogin] +B --> C[service.Captcha.VerifyString] +B --> D[service.SysUser.GetAdminUserByUsernamePassword] +D --> E[service.SysUser.GetUserByUsername] +E --> F[dao.V1SysUser.Scan] +B --> G[mfa.ValidCode] +G --> H[gotp.NewDefaultTOTP] +B --> I[token.GenerateUserToken] +I --> J[token.genToken] +I --> K[cache.NewCache.Set] +L[LoginOrIframeAuth] --> M[whiteListAuth] +L --> N[loginAuth] +L --> O[iFrameAuth] +N --> P[token.ParseUserToken] +N --> Q[token.GetTokenFromRedis] +N --> R[token.RefreshUserToken] +S[ControllerV1.UserLoginOut] --> T[token.ParseUserToken] +S --> U[token.DeleteTokenFromRedis] +V[ControllerV1.TotpSet] --> W[service.SysAuth.LoginOnlyLogin] +V --> X[utils.EncryptPassword] +V --> Y[mfa.ValidCode] +V --> Z[service.SysUser.SetTotp] +Z --> AA[mfa.GetOtp] +Z --> AB[dao.V1SysUser.Update] +``` + +**图表来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +**章节来源** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +## 性能考虑 +用户认证系统的性能主要受以下几个因素影响: +1. **数据库查询性能**:用户信息查询和登录日志记录需要优化数据库索引。 +2. **Redis缓存性能**:令牌的存储和检索依赖Redis的性能,需要确保Redis集群的高可用性。 +3. **密码哈希计算**:密码加密使用双重MD5哈希,虽然安全但计算成本较高。 +4. **JWT签名验证**:每次请求都需要验证JWT签名,增加了CPU开销。 + +建议的优化措施包括: +- 为用户表的用户名字段创建唯一索引 +- 使用连接池管理数据库连接 +- 监控Redis的内存使用和响应时间 +- 考虑使用更高效的密码哈希算法(如bcrypt) + +## 故障排除指南 +### 常见认证问题及解决方案 +1. **登录失败** + - 检查用户名和密码是否正确 + - 确认用户账户状态是否正常(未被禁用) + - 如果启用了TOTP,确保输入了正确的验证码 + +2. **令牌失效** + - 检查令牌是否过期 + - 确认Redis中是否存在对应的令牌 + - 检查时钟同步,TOTP对时间敏感 + +3. **TOTP配置问题** + - 确保手机时间与服务器时间同步 + - 重新生成QR码并重新扫描 + - 检查密钥是否正确复制 + +4. **会话中断** + - 检查Redis连接是否正常 + - 确认令牌刷新逻辑是否正常工作 + - 查看系统日志中的错误信息 + +**章节来源** +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login.go) +- [user_token.go](file://utility/token/user_token.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) + +## 结论 +kami_backend的用户认证管理系统设计完善,采用了现代的安全实践,包括JWT令牌、Redis会话存储和双因素认证。系统架构清晰,各组件职责明确,便于维护和扩展。通过遵循本文档中的最佳实践,可以确保系统的安全性和可靠性。 + +## 附录 +### API端点列表 +| 端点 | 方法 | 描述 | +|------|------|------| +| /api/user/login | POST | 用户登录 | +| /api/user/logout | POST | 用户登出 | +| /api/user/totp/status | GET | 获取TOTP状态 | +| /api/user/totp/set | POST | 设置TOTP | +| /api/user/totp/image | GET | 获取TOTP图像 | +| /api/user/totp/reset | POST | 重置TOTP | + +### 配置选项 +| 配置项 | 描述 | 默认值 | +|-------|------|-------| +| token.timeout | 令牌超时时间(秒) | 3600 | +| token.maxRefresh | 最大刷新时间(秒) | 1800 | +| token.cacheModel | 缓存模型(memory/redis) | redis | +| token.cacheKey | 缓存键前缀 | kami_token | \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/登录认证.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/登录认证.md new file mode 100644 index 00000000..ad21cd13 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/用户认证管理/登录认证.md @@ -0,0 +1,295 @@ +# 登录认证 + + +**本文档引用文件** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [sysAuth.go](file://internal/logic/sys_auth/sysAuth.go) +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [rate.go](file://utility/limiter/rate.go) +- [auth.go](file://internal/middleware/auth.go) + + +## 目录 +1. [简介](#简介) +2. [登录接口实现流程](#登录接口实现流程) +3. [密码加密存储机制](#密码加密存储机制) +4. [认证失败处理策略](#认证失败处理策略) +5. [参数验证与安全校验](#参数验证与安全校验) +6. [错误响应码设计](#错误响应码设计) +7. [安全防护措施](#安全防护措施) +8. [使用示例与集成指南](#使用示例与集成指南) +9. [常见问题诊断](#常见问题诊断) + +## 简介 +本文档详细解析kami_backend系统的用户登录认证机制。系统采用多层安全验证机制,包括用户名密码验证、验证码校验、TOTP双因素认证以及基于AES-CBC和MD5的加密算法保护用户凭证安全。同时,系统实现了基于内存和Redis的限流机制,有效防止暴力破解攻击。 + +**Section sources** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go#L1-L18) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +## 登录接口实现流程 +用户登录接口通过多步骤验证确保安全性。首先验证图形验证码,然后查询用户信息并验证密码,接着检查双因素认证状态,最后生成访问令牌。 + +```mermaid +sequenceDiagram +participant 客户端 as 客户端 +participant 控制器 as sys_user_login控制器 +participant 服务层 as SysUserService +participant 验证码服务 as CaptchaService +participant 令牌服务 as TokenService +客户端->>控制器 : POST /user/login (用户名,密码,验证码) +控制器->>验证码服务 : 验证验证码(VerifyKey,VerifyCode) +验证码服务-->>控制器 : 验证结果 +alt 验证失败 +控制器->>客户端 : 返回验证码错误 +else 验证成功 +控制器->>服务层 : 查询用户(用户名,密码) +服务层-->>控制器 : 用户信息 +alt 用户不存在或密码错误 +控制器->>客户端 : 返回用户名或密码错误 +else 用户存在且密码正确 +控制器->>控制器 : 检查TOTP状态 +alt 需要TOTP验证 +控制器->>控制器 : 验证TOTP码 +alt TOTP验证失败 +控制器->>客户端 : 返回二步验证错误 +else TOTP验证成功 +控制器->>令牌服务 : 生成用户令牌 +令牌服务-->>控制器 : 令牌字符串 +控制器->>客户端 : 返回令牌 +end +else 不需要TOTP验证 +控制器->>令牌服务 : 生成用户令牌 +令牌服务-->>控制器 : 令牌字符串 +控制器->>客户端 : 返回令牌 +end +end +end +``` + +**Diagram sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +## 密码加密存储机制 +系统采用MD5哈希算法对用户密码进行加密存储。在密码验证过程中,使用MD5算法对输入密码进行哈希处理,然后与数据库中存储的哈希值进行比对。 + +```mermaid +flowchart TD +A[用户输入密码] --> B[MD5哈希处理] +B --> C[生成32位小写十六进制字符串] +C --> D[与数据库存储的哈希值比对] +D --> E{比对结果} +E --> |匹配| F[密码验证成功] +E --> |不匹配| G[密码验证失败] +``` + +**Diagram sources** +- [md5.go](file://utility/verify/md5.go#L1-L30) + +**Section sources** +- [md5.go](file://utility/verify/md5.go#L1-L30) + +## 认证失败处理策略 +系统对认证失败情况进行了分类处理,每种情况返回特定的错误码和消息,便于前端进行针对性处理。 + +```mermaid +flowchart TD +A[认证失败] --> B{失败类型} +B --> |验证码错误| C[返回CodeNotAuthorized] +B --> |用户名或密码错误| D[返回ErrLoginPasswordOrUserError] +B --> |TOTP验证错误| E[返回CodeValidationFailed] +B --> |用户被禁用| F[返回CodeNotAuthorized] +B --> |生成令牌失败| G[返回CodeInternalError] +C --> H[提示: 验证码错误] +D --> I[提示: 用户名或密码错误] +E --> J[提示: 二步验证错误] +F --> K[提示: 用户已禁用] +G --> L[提示: 系统内部错误] +``` + +**Diagram sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +## 参数验证与安全校验 +登录接口对所有输入参数进行严格验证,确保数据完整性和安全性。 + +### 请求参数验证 +| 参数名 | 类型 | 必填 | 验证规则 | 错误提示 | +|-------|------|------|---------|---------| +| username | 字符串 | 是 | 非空 | 用户名不能为空 | +| password | 字符串 | 是 | 非空 | 密码不能为空 | +| verifyCode | 字符串 | 是 | 非空 | 验证码不能为空 | +| verifyKey | 字符串 | 是 | 非空 | 验证秘钥不能为空 | +| totpCode | 字符串 | 否 | - | - | + +### 安全校验流程 +```mermaid +flowchart TD +A[接收登录请求] --> B[验证参数完整性] +B --> C[校验验证码] +C --> D[查询用户信息] +D --> E[验证密码] +E --> F[检查用户状态] +F --> G[验证TOTP(如启用)] +G --> H[生成访问令牌] +H --> I[返回成功响应] +C --> |验证码错误| J[返回错误响应] +D --> |用户不存在| J +E --> |密码错误| J +F --> |用户被禁用| J +G --> |TOTP错误| J +H --> |生成失败| J +``` + +**Diagram sources** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go#L1-L18) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +**Section sources** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go#L1-L18) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +## 错误响应码设计 +系统采用标准化的错误响应码体系,便于客户端进行错误处理。 + +| 错误码 | HTTP状态码 | 错误类型 | 说明 | +|-------|-----------|---------|------| +| 401 | 401 | 认证失败 | 验证码错误或用户被禁用 | +| 400 | 400 | 输入验证失败 | 用户名或密码错误 | +| 400 | 400 | 验证失败 | TOTP二步验证错误 | +| 500 | 500 | 内部错误 | 生成令牌失败 | +| 401 | 401 | 令牌错误 | 令牌失效或格式错误 | + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) +- [auth.go](file://internal/middleware/auth.go#L117-L153) + +## 安全防护措施 +系统实现了多层次的安全防护机制,包括加密算法和限流策略。 + +### 加密算法应用 +系统使用AES-CBC模式进行数据加密传输,确保敏感信息在传输过程中的安全性。 + +```mermaid +classDiagram +class AesCBCUtil { ++aesCBCEncrypt(plaintext, key, iv) byte[] ++aesCBCDecrypt(ciphertext, key, iv) byte[] ++AesCBCEncryptWithBase64(text, key, iv) string ++AesCBCStdDecryptWithBase64(text, key, iv) byte[] ++AesCBCURLDecryptWithBase64(text, key, iv) byte[] +-paddingPKCS7(plaintext, blockSize) byte[] +-unPaddingPKCS7(s) byte[] +} +class Md5Util { ++GetMD5LOWER(s) string ++GetMD5Upper(s) string ++MapToString(m) string +} +AesCBCUtil --> Md5Util : "使用" +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L1-L90) +- [md5.go](file://utility/verify/md5.go#L1-L30) + +### 限流机制 +系统实现了基于内存的简单限流器,防止暴力破解攻击。 + +```mermaid +flowchart TD +A[接收请求] --> B[生成限流键] +B --> C[检查当前请求数] +C --> D{超过阈值?} +D --> |是| E[拒绝请求] +D --> |否| F[记录请求时间] +F --> G[允许请求] +C --> H[清理过期记录] +H --> C +classDef default fill:#f9f,stroke:#333,stroke-width:1px; +class A,B,C,D,E,F,G,H default; +``` + +**Diagram sources** +- [rate.go](file://utility/limiter/rate.go#L1-L70) + +**Section sources** +- [rate.go](file://utility/limiter/rate.go#L1-L70) +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L1-L90) +- [md5.go](file://utility/verify/md5.go#L1-L30) + +## 使用示例与集成指南 +### 登录请求示例 +```json +POST /user/login +Content-Type: application/json + +{ + "username": "admin", + "password": "password123", + "verifyCode": "abcd", + "verifyKey": "captcha_123456", + "totpCode": "123456" +} +``` + +### 成功响应 +```json +{ + "code": 0, + "message": "OK", + "data": { + "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + } +} +``` + +### 集成注意事项 +1. 必须先获取验证码并传递verifyKey +2. 生产环境必须启用TOTP双因素认证 +3. 令牌需要在后续请求的Authorization头中传递 +4. 实现自动刷新令牌机制以应对令牌过期 + +**Section sources** +- [sys_user_login.go](file://api/sys_user_login/v1/sys_user_login.go#L1-L18) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +## 常见问题诊断 +### 常见问题及解决方案 +| 问题现象 | 可能原因 | 解决方案 | +|--------|---------|---------| +| 验证码错误 | 验证码过期或输入错误 | 刷新验证码重新输入 | +| 用户名或密码错误 | 凭证不匹配或用户不存在 | 检查用户名密码,确认用户状态 | +| 二步验证错误 | TOTP码错误或未同步 | 检查TOTP应用时间同步 | +| 用户已禁用 | 账户被管理员禁用 | 联系管理员启用账户 | +| 生成令牌失败 | 系统内部错误 | 检查服务状态,重试登录 | + +### 诊断流程 +```mermaid +flowchart TD +A[登录失败] --> B{错误类型} +B --> |验证码错误| C[检查验证码有效期] +B --> |用户名密码错误| D[确认用户状态和凭证] +B --> |TOTP错误| E[检查TOTP应用和时间同步] +B --> |用户禁用| F[联系管理员] +B --> |内部错误| G[检查服务日志] +C --> H[重新获取验证码] +D --> I[重置密码或创建用户] +E --> J[重新配置TOTP] +F --> K[等待管理员处理] +G --> L[重启服务或联系技术支持] +``` + +**Diagram sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/系统认证逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/系统认证逻辑.md new file mode 100644 index 00000000..18194149 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/系统认证逻辑/系统认证逻辑.md @@ -0,0 +1,382 @@ +# 系统认证逻辑 + + +**本文档引用的文件** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [auth.go](file://internal/middleware/auth.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [sys_role.go](file://internal/service/sys_role.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [sysUser.go](file://internal/model/sys_user.go) +- [sys_role.go](file://internal/model/sys_role.go) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go) +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [sysUser.go](file://internal/controller/sysUser/sysUser.go) +- [user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go) +- [totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go) + + +## 目录 +1. [引言](#引言) +2. [RBAC权限控制系统](#rbac权限控制系统) +3. [TOTP双因素认证](#totp双因素认证) +4. [用户登录与会话管理](#用户登录与会话管理) +5. [权限验证中间件](#权限验证中间件) +6. [权限配置最佳实践](#权限配置最佳实践) +7. [安全审计建议](#安全审计建议) +8. [结论](#结论) + +## 引言 +kami_backend系统采用基于Casbin的RBAC(基于角色的访问控制)权限模型,结合TOTP双因素认证机制,构建了完整的系统认证体系。该系统实现了用户角色、权限规则和菜单权限的精细化管理,确保了系统的安全性和可扩展性。本文档详细阐述了认证业务逻辑的实现细节,包括权限控制、双因素认证、会话管理等核心功能。 + +## RBAC权限控制系统 + +kami_backend系统采用Casbin作为权限控制引擎,实现了基于角色的访问控制(RBAC)模型。该系统通过定义用户、角色和权限之间的关系,实现了灵活的权限管理机制。 + +### RBAC模型配置 +系统使用`rbac_model.conf`文件定义了RBAC模型的核心规则: + +```mermaid +classDiagram +class CasbinModel { ++request_definition : r = sub, obj, act ++policy_definition : p = sub, obj, act ++role_definition : g = _, _ ++policy_effect : e = some(where (p.eft == allow)) ++matchers : m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act +} +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L13) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L13) + +### 用户角色管理 +系统通过`ISysRole`接口提供角色管理功能,包括角色的创建、编辑、删除和权限分配。角色与用户通过Casbin的分组策略(Grouping Policy)进行关联。 + +```mermaid +classDiagram +class ISysRole { ++GetRoleListSearch(ctx, req) res, err ++GetRoleList(ctx) list, err ++AddRoleRule(ctx, ruleIds, roleId) err ++DelRoleRule(ctx, roleId) err ++AddRole(ctx, req) err ++Get(ctx, id) res, err ++GetFilteredNamedPolicy(ctx, id) gpSlice, err ++EditRole(ctx, req) err ++DeleteByIds(ctx, ids) err +} +``` + +**Diagram sources** +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) + +**Section sources** +- [sys_role.go](file://internal/service/sys_role.go#L14-L30) +- [sys_role.go](file://internal/model/sys_role.go#L1-L20) + +### 权限规则与菜单管理 +系统通过`ISysAuthRule`接口管理权限规则和菜单结构。权限规则分为目录、菜单和按钮三种类型,通过树形结构组织。 + +```mermaid +classDiagram +class ISysAuthRule { ++GetMenuListSearch(ctx, req) res, err ++GetIsMenuList(ctx) list, err ++GetMenuList(ctx) list, err ++GetIsButtonList(ctx) list, err ++Add(ctx, req) err ++BindRoleRule(ctx, ruleId, roleIds) err ++Get(ctx, id) rule, err ++GetMenuRoles(ctx, id) roleIds, err ++Update(ctx, req) err ++UpdateRoleRule(ctx, ruleId, roleIds) err ++GetMenuListTree(pid, list) tree ++DeleteMenuByIds(ctx, ids) err ++FindSonByParentId(list, pid) children +} +class SysAuthRule { ++CommonIntId ++Name string ++Title string ++MenuType uint ++Weigh int ++IsHide uint ++Path string ++IdAdmin int ++Component string ++Children []*SysAuthRule +} +ISysAuthRule --> SysAuthRule : "使用" +``` + +**Diagram sources** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L10) + +**Section sources** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go#L14-L34) +- [sys_auth_rule.go](file://internal/model/sys_auth_rule.go#L7-L40) + +### 权限验证流程 +当用户请求访问系统资源时,权限验证流程如下: + +```mermaid +sequenceDiagram +participant User as "用户" +participant Middleware as "权限中间件" +participant Casbin as "Casbin引擎" +participant Database as "数据库" +User->>Middleware : 发起请求 +Middleware->>Casbin : 获取用户角色 +Casbin->>Database : 查询用户角色关联 +Database-->>Casbin : 返回角色ID列表 +Casbin->>Database : 查询角色权限规则 +Database-->>Casbin : 返回权限规则 +Casbin->>Middleware : 验证权限 +Middleware->>User : 返回访问结果 +Note over Middleware,Casbin : 基于Casbin的RBAC权限验证 +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L766) + +## TOTP双因素认证 + +系统集成了TOTP(基于时间的一次性密码)双因素认证机制,增强了账户安全性。TOTP实现基于HOTP(HMAC-based One-time Password)算法,使用SHA-1哈希函数生成一次性密码。 + +### TOTP实现原理 +系统使用`gotp`库实现TOTP功能,生成6位数字的一次性密码,每30秒更新一次。 + +```mermaid +classDiagram +class Otp { ++Secret string ++QrImage string ++Key string +} +class Mfa { ++GetOtp(userId, username, key, secret) otp, err ++ValidCode(code, secret) bool +} +Mfa --> Otp : "生成" +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) + +### TOTP流程 +TOTP双因素认证的完整流程包括密钥生成、二维码展示、验证和重置: + +```mermaid +sequenceDiagram +participant User as "用户" +participant System as "系统" +participant Mfa as "MFA模块" +User->>System : 请求启用TOTP +System->>Mfa : 生成TOTP密钥 +Mfa->>System : 返回密钥和二维码 +System->>User : 展示二维码 +User->>System : 扫描二维码并输入验证码 +System->>Mfa : 验证验证码 +Mfa->>System : 返回验证结果 +System->>User : 启用/禁用TOTP +Note over System,Mfa : TOTP双因素认证流程 +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L52) +- [totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L32) +- [totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go#L1-L26) + +## 用户登录与会话管理 + +系统实现了完整的用户登录、登出和会话管理机制,确保用户会话的安全性和可靠性。 + +### 登录流程 +用户登录流程包括验证码验证、身份认证和Token生成: + +```mermaid +sequenceDiagram +participant User as "用户" +participant Controller as "登录控制器" +participant Service as "用户服务" +participant Token as "Token服务" +User->>Controller : 提交登录请求 +Controller->>Service : 验证验证码 +Service->>Service : 验证用户名密码 +Service->>Service : 验证TOTP(如果启用) +Service->>Token : 生成用户Token +Token->>Controller : 返回Token +Controller->>User : 返回登录结果 +Note over Controller,Service : 用户登录流程 +``` + +**Diagram sources** +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L766) + +**Section sources** +- [sys_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L50) + +### 会话管理 +系统使用JWT Token进行会话管理,Token存储在Redis中,支持自动续签和强制失效。 + +```mermaid +classDiagram +class UserToken { ++UserID string ++ID string ++Username string ++ExpireTime int64 +} +class TokenService { ++GenerateUserToken(ctx, username, userId) tokenStr, err ++ParseUserToken(ctx, tokenStr) userToken, err ++RefreshUserToken(ctx, userToken) newToken, err ++GetTokenFromRedis(ctx, userId, tokenId) tokenStr, err ++DeleteTokenFromRedis(ctx, userId) err +} +TokenService --> UserToken : "使用" +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [sys_user.go](file://internal/logic/sys_user/sys_user.go#L1-L766) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) + +### 登出流程 +用户登出时,系统会从Redis中删除对应的Token,使会话立即失效: + +```mermaid +sequenceDiagram +participant User as "用户" +participant Controller as "登出控制器" +participant Token as "Token服务" +User->>Controller : 发起登出请求 +Controller->>Token : 解析Token +Token->>Controller : 返回用户信息 +Controller->>Token : 删除Redis中的Token +Token->>Controller : 返回删除结果 +Controller->>User : 返回登出成功 +Note over Controller,Token : 用户登出流程 +``` + +**Diagram sources** +- [user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go#L1-L18) + +**Section sources** +- [user_login_out.go](file://internal/controller/sysUser/sysUser_v1_user_login_out.go#L1-L18) + +## 权限验证中间件 + +系统通过中间件机制实现权限验证,支持多种认证方式和白名单机制。 + +### 中间件架构 +权限验证中间件采用分层设计,支持登录认证、iframe认证和白名单认证: + +```mermaid +classDiagram +class AuthMiddleware { ++LoginOrIframeAuth(r) ++loginAuth(r) code ++iFrameAuth(r) code ++whiteListAuth(r) code +} +class TokenService { ++GetRequestToken(r) tokenStr ++ParseUserToken(ctx, tokenStr) userToken, err ++RefreshUserToken(ctx, userToken) newToken, err +} +class ConfigService { ++NewConfig(ctx) cfg, err ++GetFrontendSecret() frontendModel, err +} +class VerifyService { ++AesCBCURLDecryptWithBase64(tokenStr, key, iv) tokenByte, err +} +AuthMiddleware --> TokenService : "使用" +AuthMiddleware --> ConfigService : "使用" +AuthMiddleware --> VerifyService : "使用" +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) + +### 认证流程 +权限验证中间件的执行流程如下: + +```mermaid +flowchart TD +Start([请求进入]) --> CheckWhiteList["检查白名单"] +CheckWhiteList --> IsWhiteList{"是否在白名单?"} +IsWhiteList --> |是| AllowAccess["允许访问"] +IsWhiteList --> |否| GetTokenFrom["获取Token来源"] +GetTokenFrom --> IsLogin{"来源为login?"} +IsLogin --> |是| LoginAuth["执行登录认证"] +IsLogin --> |否| IsIframe{"来源为iframe?"} +IsIframe --> |是| IFrameAuth["执行Iframe认证"] +IsIframe --> |否| ReturnError["返回来源不明错误"] +LoginAuth --> AuthResult{"认证成功?"} +IFrameAuth --> AuthResult +AuthResult --> |是| AllowAccess +AuthResult --> |否| ReturnAuthError["返回认证错误"] +AllowAccess --> End([继续处理]) +ReturnAuthError --> End +ReturnError --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) + +## 权限配置最佳实践 + +### 角色设计原则 +1. **最小权限原则**:每个角色只分配完成其职责所需的最小权限 +2. **职责分离**:敏感操作应由不同角色共同完成,避免权限过度集中 +3. **层级化设计**:建立角色层级结构,便于权限继承和管理 + +### 权限规则配置 +1. **细粒度控制**:将权限细化到具体操作级别(如创建、读取、更新、删除) +2. **命名规范**:使用统一的命名规范,如`资源名/操作类型` +3. **定期审查**:定期审查权限配置,移除不再需要的权限 + +### 菜单管理 +1. **动态加载**:根据用户角色动态加载菜单,避免信息泄露 +2. **权限同步**:菜单显示与后端权限验证保持同步 +3. **用户体验**:合理组织菜单结构,提升用户体验 + +## 安全审计建议 + +### 认证安全 +1. **密码策略**:实施强密码策略,包括长度、复杂度和定期更换要求 +2. **失败处理**:对连续登录失败实施账户锁定或延迟机制 +3. **会话保护**:使用安全的Cookie属性(HttpOnly、Secure)保护会话 + +### TOTP安全 +1. **密钥保护**:确保TOTP密钥在传输和存储过程中的安全性 +2. **备份机制**:提供恢复码或备用验证方式,防止用户丢失设备 +3. **防暴力破解**:对TOTP验证尝试实施速率限制 + +### 权限审计 +1. **操作日志**:记录所有权限相关的操作,包括角色分配、权限变更等 +2. **定期审查**:定期审查用户权限分配,确保符合最小权限原则 +3. **异常检测**:监控异常的权限使用模式,及时发现潜在安全威胁 + +## 结论 +kami_backend系统的认证业务逻辑通过RBAC权限控制、TOTP双因素认证和会话管理机制,构建了安全可靠的认证体系。系统采用模块化设计,各组件职责清晰,便于维护和扩展。通过遵循权限配置最佳实践和安全审计建议,可以进一步提升系统的安全性和可靠性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/Apple订单处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/Apple订单处理.md new file mode 100644 index 00000000..25cfcfa2 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/Apple订单处理.md @@ -0,0 +1,279 @@ +# Apple订单处理 + + +**本文档引用的文件** +- [order.go](file://api/card_info_apple/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [order.go](file://internal/logic/card_apple_order/order.go) +- [callback.go](file://internal/logic/card_apple_order/callback.go) +- [status.go](file://internal/logic/card_apple_order/status.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [card_apple.go](file://internal/consts/card_apple.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了Apple卡密订单处理系统的实现机制,涵盖订单创建、状态管理、iTunes回调处理、历史记录查询等核心功能。系统通过严格的订单状态机管理充值流程,确保交易的完整性和一致性。文档深入分析了订单与Apple账户的关联机制、充值金额验证流程、幂等性保证和事务管理策略,为开发者提供全面的技术参考。 + +## 项目结构 +Apple卡密订单处理功能主要分布在`api/card_info_apple`和`internal`目录下,采用分层架构设计,包含API接口、业务逻辑、数据访问等层次。 + +```mermaid +graph TD +subgraph "API层" +A[api/card_info_apple/v1/order.go] +B[api/card_info_apple/v1/order_history.go] +C[api/card_info_apple/v1/config.go] +end +subgraph "控制器层" +D[internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go] +E[internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go] +F[internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go] +end +subgraph "服务层" +G[internal/service/card_apple_order.go] +end +subgraph "逻辑层" +H[internal/logic/card_apple_order/order.go] +I[internal/logic/card_apple_order/callback.go] +J[internal/logic/card_apple_order/status.go] +end +subgraph "数据访问层" +K[internal/dao/v_1_card_apple_recharge_info.go] +end +subgraph "模型层" +L[internal/model/card_apple_order.go] +end +A --> D +B --> D +C --> D +D --> G +E --> G +F --> G +G --> H +G --> I +G --> J +H --> K +I --> K +J --> K +H --> L +I --> L +J --> L +``` + +**图示来源** +- [order.go](file://api/card_info_apple/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [order.go](file://internal/logic/card_apple_order/order.go) +- [callback.go](file://internal/logic/card_apple_order/callback.go) +- [status.go](file://internal/logic/card_apple_order/status.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) + +**本节来源** +- [order.go](file://api/card_info_apple/v1/order.go) +- [order_history.go](file://api/card_info_apple/v1/order_history.go) +- [config.go](file://api/card_info_apple/v1/config.go) + +## 核心组件 +Apple卡密订单处理系统的核心组件包括订单提交处理器、iTunes回调处理器、订单状态管理器和充值历史查询服务。这些组件协同工作,确保订单从创建到完成的整个生命周期得到正确处理。 + +**本节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [card_info_apple_v1_recharge_handler.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go) +- [card_info_apple_v1_recharge_history_list.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go) + +## 架构概览 +系统采用典型的分层架构,从API接口到数据存储,各层职责分明。API层定义了订单相关的REST接口,控制器层处理HTTP请求并调用服务层,服务层协调业务逻辑层完成具体操作,最终由数据访问层与数据库交互。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "逻辑层" +participant DAO as "数据访问层" +participant DB as "数据库" +Client->>API : 提交充值订单 +API->>Controller : 转发请求 +Controller->>Service : 调用充值服务 +Service->>Logic : 执行订单创建逻辑 +Logic->>DAO : 检查订单幂等性 +DAO->>DB : 查询订单是否存在 +DB-->>DAO : 返回查询结果 +DAO-->>Logic : 返回检查结果 +Logic->>DAO : 创建新订单 +DAO->>DB : 插入订单记录 +DB-->>DAO : 返回插入结果 +DAO-->>Logic : 返回创建结果 +Logic-->>Service : 返回订单信息 +Service-->>Controller : 返回处理结果 +Controller-->>API : 返回响应 +API-->>Client : 返回订单创建结果 +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [order.go](file://internal/logic/card_apple_order/order.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) + +## 详细组件分析 + +### 订单创建分析 +订单创建组件负责处理用户提交的Apple卡密充值请求,验证输入参数,检查订单幂等性,并创建新的订单记录。 + +```mermaid +flowchart TD +Start([开始]) --> ValidateInput["验证输入参数"] +ValidateInput --> CheckIdempotency["检查订单幂等性"] +CheckIdempotency --> OrderExists{"订单已存在?"} +OrderExists --> |是| ReturnExisting["返回现有订单"] +OrderExists --> |否| CreateOrder["创建新订单"] +CreateOrder --> SetStatus["设置初始状态为待处理"] +SetStatus --> SaveOrder["保存订单到数据库"] +SaveOrder --> Notify["触发后续处理流程"] +Notify --> End([结束]) +``` + +**图示来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [order.go](file://internal/logic/card_apple_order/order.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) + +**本节来源** +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [order.go](file://internal/logic/card_apple_order/order.go) + +### 回调处理分析 +iTunes回调处理组件负责接收Apple服务器的充值结果通知,验证回调数据的完整性,更新订单状态,并触发相应的业务逻辑。 + +```mermaid +sequenceDiagram +participant Apple as "Apple服务器" +participant Callback as "回调接口" +participant Validator as "验证器" +participant Status as "状态管理器" +participant Notifier as "通知服务" +Apple->>Callback : 发送充值结果回调 +Callback->>Validator : 验证回调签名 +Validator-->>Callback : 验证结果 +alt 验证成功 +Callback->>Status : 更新订单状态 +Status->>Status : 状态转换逻辑 +Status-->>Callback : 状态更新结果 +Callback->>Notifier : 触发通知 +Notifier-->>Callback : 通知结果 +Callback-->>Apple : 返回成功响应 +else 验证失败 +Callback-->>Apple : 返回失败响应 +end +``` + +**图示来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [callback.go](file://internal/logic/card_apple_order/callback.go) +- [status.go](file://internal/logic/card_apple_order/status.go) + +**本节来源** +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) +- [callback.go](file://internal/logic/card_apple_order/callback.go) + +### 状态机分析 +订单状态机管理组件定义了订单的生命周期,包括待处理、处理中、成功、失败等状态的转换规则和触发条件。 + +```mermaid +stateDiagram-v2 +[*] --> 待处理 +待处理 --> 处理中 : 开始处理 +处理中 --> 成功 : 充值成功 +处理中 --> 失败 : 充值失败 +处理中 --> 超时 : 处理超时 +成功 --> [*] +失败 --> [*] +超时 --> [*] +note right of 处理中 +包含子状态 : +- 验证卡密 +- 调用Apple API +- 等待回调 +end note +``` + +**图示来源** +- [status.go](file://internal/logic/card_apple_order/status.go) +- [card_apple.go](file://internal/consts/card_apple.go) + +**本节来源** +- [status.go](file://internal/logic/card_apple_order/status.go) +- [card_apple.go](file://internal/consts/card_apple.go) + +## 依赖分析 +Apple卡密订单处理系统依赖于多个内部组件和外部服务,形成了复杂的依赖关系网络。 + +```mermaid +graph LR +A[订单提交] --> B[幂等性检查] +A --> C[参数验证] +A --> D[订单创建] +D --> E[数据库] +F[iTunes回调] --> G[签名验证] +F --> H[状态更新] +H --> E +I[历史查询] --> J[数据库查询] +J --> E +K[配置管理] --> L[系统配置] +A --> K +F --> K +style E fill:#f9f,stroke:#333 +style K fill:#bbf,stroke:#333 +``` + +**图示来源** +- [go.mod](file://go.mod) +- [card_apple_order.go](file://internal/service/card_apple_order.go) + +**本节来源** +- [go.mod](file://go.mod) +- [card_apple_order.go](file://internal/service/card_apple_order.go) + +## 性能考虑 +为确保系统在高并发场景下的稳定性和响应速度,采用了多种性能优化策略。通过Redis缓存频繁访问的配置数据和订单状态,减少数据库查询压力。使用连接池管理数据库连接,提高资源利用率。对关键路径进行异步处理,避免阻塞主线程。同时,通过合理的索引设计和查询优化,确保数据库操作的高效性。 + +## 故障排除指南 +### 重复订单处理 +当系统检测到重复订单时,会根据幂等性原则返回已有订单信息而非创建新订单。检查`v_1_card_apple_recharge_info`表中的订单记录,确认订单的唯一标识符是否正确生成。 + +**本节来源** +- [order.go](file://internal/logic/card_apple_order/order.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) + +### 回调验证失败 +回调验证失败通常由签名不匹配或时间戳过期引起。检查系统时间是否同步,验证Apple提供的公钥是否正确配置,确认回调数据的完整性。 + +**本节来源** +- [callback.go](file://internal/logic/card_apple_order/callback.go) +- [card_info_apple_v1_recharge_itunes_callback.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go) + +## 结论 +Apple卡密订单处理系统通过分层架构设计和严格的流程控制,实现了高可靠性的充值服务。系统具备完善的订单状态管理、幂等性保证和错误处理机制,能够有效应对各种异常情况。通过持续的性能优化和监控,确保了服务的稳定性和响应速度,为用户提供流畅的充值体验。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/京东兑换订单处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/京东兑换订单处理.md new file mode 100644 index 00000000..0bc12d56 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/京东兑换订单处理.md @@ -0,0 +1,246 @@ +# 京东兑换订单处理 + + +**本文档引用的文件** +- [consume.go](file://internal/logic/card_redeem_order/consume.go) +- [process.go](file://internal/logic/card_redeem_order/process.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) + + +## 目录 +1. [简介](#简介) +2. [订单创建与处理流程](#订单创建与处理流程) +3. [回调验证与状态更新](#回调验证与状态更新) +4. [订单与京东账户关联机制](#订单与京东账户关联机制) +5. [兑换码消费逻辑](#兑换码消费逻辑) +6. [幂等性保证](#幂等性保证) +7. [异常处理与重试机制](#异常处理与重试机制) +8. [订单历史记录与统计](#订单历史记录与统计) +9. [性能优化建议](#性能优化建议) +10. [常见问题解决方案](#常见问题解决方案) + +## 简介 +本文档详细描述了京东卡密兑换订单的完整处理流程,包括订单创建、消费处理、回调验证和状态更新等核心环节。系统通过核销订单服务处理京东卡密兑换请求,确保订单处理的可靠性与一致性。文档涵盖了订单与京东账户的关联机制、兑换码消费逻辑以及关键的幂等性保证措施。同时,详细说明了异常处理策略、重试机制、订单历史记录和统计功能,为系统维护和问题排查提供全面指导。 + +## 订单创建与处理流程 +京东兑换订单的创建与处理遵循严格的流程控制。当用户提交兑换请求时,系统首先验证订单信息的完整性与合法性。订单创建后,状态被设置为"待处理"(RedeemOrderPending),并记录在订单历史中。系统通过定时触发器定期扫描待处理订单队列,一旦发现符合条件的订单,即启动处理流程。 + +订单处理的核心是`ConsumeOne`方法,该方法在分布式锁的保护下执行,确保同一时间只有一个实例处理特定类别的订单。处理流程首先调用`GetEarlyWaitingOrder`从数据库中获取最早等待核销的订单,然后通过`StartProcessOrder`方法将订单状态更新为"开始处理"(RedeemOrderStart),并记录操作历史。此过程采用数据库事务保证原子性,防止订单被重复处理。 + +```mermaid +flowchart TD +Start([订单创建]) --> ValidateInput["验证订单信息"] +ValidateInput --> InputValid{"信息有效?"} +InputValid --> |否| ReturnError["返回错误"] +InputValid --> |是| CreateOrder["创建订单
状态: 待处理"] +CreateOrder --> Trigger["触发器扫描订单"] +Trigger --> FindOrder["查找待处理订单"] +FindOrder --> HasOrder{"存在订单?"} +HasOrder --> |否| End1([等待新订单]) +HasOrder --> |是| StartProcess["开始处理订单"] +StartProcess --> UpdateStatus["更新状态: 开始处理"] +UpdateStatus --> AllocateAccount["分配京东账户"] +AllocateAccount --> Consume["消费卡密"] +Consume --> Callback["回调验证"] +Callback --> UpdateFinalStatus["更新最终状态"] +UpdateFinalStatus --> End2([处理完成]) +``` + +**图示来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) +- [process.go](file://internal/logic/card_redeem_order/process.go#L25-L64) + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) +- [process.go](file://internal/logic/card_redeem_order/process.go#L25-L64) + +## 回调验证与状态更新 +回调验证是确保订单处理结果准确性的关键环节。系统通过`ProcessOrderCallback`方法处理各种状态的回调,该方法根据不同的状态码更新订单的最终状态并记录详细的操作历史。当兑换成功时,订单状态更新为"充值成功"(RedeemOrderSuccess);当出现错误时,根据错误类型设置相应的失败状态。 + +状态更新过程严格遵循预定义的状态转换规则。例如,当收到"账号失效"(RedeemOrderFailWithCKFail)状态时,系统不仅将订单状态设置为"待处理"以便重试,还会将关联的京东账户标记为"禁用",防止后续订单继续使用该失效账户。对于"今日充值次数已满"(RedeemOrderFailWithDailyAccountLimited)等临时性错误,系统会将账户设置为"每日禁用"状态,并在次日自动恢复。 + +```mermaid +stateDiagram-v2 +[*] --> Pending +Pending --> Processing : 开始处理 +Processing --> Success : 充值成功 +Processing --> Fail : 充值失败 +Processing --> Pending : 临时错误
退回重试 +Success --> [*] +Fail --> [*] +Pending --> [*] +note right of Processing +处理中状态包含 : +- 分配京东账户 +- 发送卡密 +- 等待响应 +end note +note left of Fail +失败原因包括 : +- 卡密类型错误 +- 卡片不存在 +- 卡密冻结 +- 金额不一致 +end note +``` + +**图示来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L121-L272) +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L111) + +**本节来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L121-L272) +- [card_redeem.go](file://internal/consts/card_redeem.go#L95-L111) + +## 订单与京东账户关联机制 +系统通过精确的账户管理机制实现订单与京东账户的有效关联。当处理订单时,`GetAvailableAccount`方法会根据订单金额和类别筛选出可用的京东账户。筛选条件包括账户状态(必须为"正常")、余额充足以及未达到当日充值限额等。一旦找到合适的账户,系统立即通过`AllocateAccountToOrder`方法将账户与订单绑定。 + +账户分配过程采用预扣款机制,确保账户余额在处理期间不会被其他订单使用。系统首先记录预扣款操作历史,然后更新订单信息,将`AccountId`和`AccountName`字段设置为所选账户的标识和名称。这种设计不仅保证了账户资源的独占性,还为后续的错误追踪和账务核对提供了完整的审计线索。 + +```mermaid +classDiagram +class OrderInfo { ++string OrderNo ++string CardNo ++string GiftCardPwd ++float OrderAmount ++int Status ++string AccountId ++string AccountName +} +class AccountInfo { ++string Id ++string Name ++string Cookie ++int Status ++float Balance ++string Username ++string Nickname +} +class OrderService { ++AllocateAccountToOrder(ctx, account, order) ++GetAvailableAccount(ctx, category, amount) +} +OrderService --> OrderInfo : "处理" +OrderService --> AccountInfo : "查询" +OrderInfo --> AccountInfo : "关联" +``` + +**图示来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L112-L174) +- [process.go](file://internal/logic/card_redeem_order/process.go#L84-L120) + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L112-L174) +- [process.go](file://internal/logic/card_redeem_order/process.go#L84-L120) + +## 兑换码消费逻辑 +兑换码消费是订单处理的核心业务逻辑,由`BindCard`方法实现。该方法通过京东API客户端向京东服务器发送卡密信息,完成实际的兑换操作。消费过程包含多个关键步骤:首先验证卡号和卡密的格式是否符合规则,然后检查订单金额是否在允许范围内,最后执行绑定操作。 + +系统对消费结果进行详细分类处理。成功时,记录实际充值金额并更新卡种信息;失败时,根据错误代码区分不同类型的失败原因。特别地,系统处理"金额不一致"的特殊情况:当实际充值金额与订单金额不符时,系统会区分是"已充值但金额不同"(RedeemOrderSuccessWithDifferentAmount)还是"未充值"(RedeemOrderFailWithDifferentAmount),并采取相应的后续处理策略。 + +```mermaid +flowchart TD +Start([开始消费]) --> ValidateCard["验证卡号卡密"] +ValidateCard --> IsValid{"格式有效?"} +IsValid --> |否| FailRule["失败: 卡号不符合规则"] +IsValid --> |是| CheckAmount["检查金额范围"] +CheckAmount --> InRange{"金额符合?"} +InRange --> |否| FailAmount["失败: 金额超出范围"] +InRange --> |是| SendCard["发送卡密到京东"] +SendCard --> Response["接收京东响应"] +Response --> Success{"兑换成功?"} +Success --> |是| UpdateSuccess["更新成功状态
记录实际金额"] +Success --> |否| HandleError["处理错误"] +HandleError --> ErrorType{"错误类型?"} +ErrorType --> |CK失效| UpdateCKFail["标记CK失效"] +ErrorType --> |已绑定| UpdateBindFail["标记已绑定"] +ErrorType --> |已过期| UpdateExpired["标记已过期"] +ErrorType --> |冻结| UpdateFrozen["标记冻结"] +UpdateSuccess --> End1([消费完成]) +FailRule --> End2([消费失败]) +FailAmount --> End3([消费失败]) +UpdateCKFail --> End4([消费失败]) +UpdateBindFail --> End5([消费失败]) +UpdateExpired --> End6([消费失败]) +UpdateFrozen --> End7([消费失败]) +``` + +**图示来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L175-L212) +- [card_redeem.go](file://internal/consts/card_redeem.go#L120-L171) + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L175-L212) +- [card_redeem.go](file://internal/consts/card_redeem.go#L120-L171) + +## 幂等性保证 +系统通过多层次机制确保订单处理的幂等性,防止重复处理导致的数据不一致。首先,订单处理过程使用分布式锁`gmlock.LockFunc`保护,确保同一时间只有一个线程处理特定类别的订单。其次,数据库层面通过条件更新实现乐观锁,`StartProcessOrder`方法在更新订单状态时会检查当前状态是否为"待处理",只有符合条件的订单才会被处理。 + +此外,系统通过`IsCardPassRepeated`方法检测卡号和卡密的重复使用,防止同一卡密被多次兑换。对于已经成功处理的订单,即使再次进入处理流程,也会因为状态检查而被忽略。这种设计确保了即使在系统重启、网络重试等异常情况下,订单也只会被正确处理一次,维护了数据的完整性和一致性。 + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) +- [process.go](file://internal/logic/card_redeem_order/process.go#L25-L64) + +## 异常处理与重试机制 +系统设计了完善的异常处理与重试机制,确保在各种故障情况下仍能可靠运行。异常分为订单相关错误和账户相关错误两大类。订单相关错误如卡密类型错误、卡片不存在等属于永久性错误,系统会直接标记订单失败。而账户相关错误如CK失效、充值过快等属于临时性错误,系统会将订单状态重置为"待处理",并切换到其他可用账户进行重试。 + +重试机制通过`callback_count`字段控制,每个订单最多允许5次调度尝试。超过限制后,订单将被标记为"禁用",防止无限重试。对于临时性错误,系统还会更新账户状态,如将频繁充值的账户标记为"充值速度过快",并在一段时间后自动恢复。这种分级处理策略既保证了系统的可用性,又避免了对异常账户的过度使用。 + +```mermaid +flowchart TD +Start([异常发生]) --> ErrorType{"错误类型?"} +ErrorType --> |订单相关| Permanent["永久性错误"] +ErrorType --> |账户相关| Temporary["临时性错误"] +Permanent --> UpdateFail["更新订单状态: 失败"] +Permanent --> LogError["记录失败原因"] +Permanent --> End1([处理完成]) +Temporary --> CheckCount["检查重试次数"] +CheckCount --> CountExceeded{"超过5次?"} +CountExceeded --> |是| DisableOrder["禁用订单"] +CountExceeded --> |否| ResetStatus["重置订单状态: 待处理"] +DisableOrder --> End2([处理完成]) +ResetStatus --> UpdateAccount["更新账户状态"] +UpdateAccount --> SwitchAccount["切换到其他账户"] +SwitchAccount --> Retry["重新加入处理队列"] +Retry --> End3([等待重试]) +style Permanent fill:#f9f,stroke:#333 +style Temporary fill:#bbf,stroke:#333 +``` + +**图示来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L177-L200) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) + +**本节来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L177-L200) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L77-L111) + +## 订单历史记录与统计 +系统通过详细的操作历史记录和统计功能,提供完整的订单生命周期追踪。每次订单状态变更都会通过`AddHistory`方法记录操作历史,包括操作时间、操作类型、账户信息和备注等。这些历史记录不仅用于审计追踪,还为用户提供了透明的处理进度。 + +统计功能通过`Summary`和`DailySummary`等方法实现,支持按类别、用户和日期范围查询订单汇总数据。系统定期生成统计报表,帮助运营人员监控业务状况。订单历史与统计数据存储在独立的数据库表中,通过索引优化查询性能,确保在大数据量下仍能快速响应查询请求。 + +**本节来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L121-L272) +- [service/card_redeem_order.go](file://internal/service/card_redeem_order.go#L70-L79) + +## 性能优化建议 +为确保系统在高并发场景下的稳定运行,建议采取以下性能优化措施:首先,合理配置数据库连接池和Redis缓存,减少数据库访问延迟。其次,优化订单查询的数据库索引,特别是`status`、`category`和`created_at`等常用查询字段。第三,调整`TriggerConsumeWithContext`的并发度,根据服务器性能平衡处理速度与资源消耗。 + +此外,建议定期清理历史订单数据,将超过一定期限的订单归档到历史库,保持主表的数据量在合理范围内。对于频繁查询的统计信息,可以采用预计算的方式,定期生成汇总数据,避免实时计算带来的性能压力。最后,监控系统的关键指标,如订单处理延迟、失败率和账户利用率,及时发现并解决性能瓶颈。 + +**本节来源** +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L240-L272) +- [process.go](file://internal/logic/card_redeem_order/process.go#L273-L328) + +## 常见问题解决方案 +针对常见的订单处理问题,系统提供了相应的解决方案。对于兑换失败的情况,首先检查错误代码确定具体原因:如果是卡密类型错误或卡片不存在,应联系用户确认卡密信息;如果是CK失效或频繁错误,系统会自动切换账户重试。对于状态不一致的问题,可以通过查询订单历史记录追踪状态变更过程,必要时手动调整订单状态。 + +当出现大量订单积压时,应检查京东账户池是否充足,及时添加新的可用账户。对于金额不一致的争议,系统记录了实际充值金额,可用于与用户核对。定期检查系统日志,特别是`glog.Error`记录的错误信息,有助于及时发现和解决潜在问题。通过这些措施,可以有效提高订单处理的成功率和用户体验。 + +**本节来源** +- [process.go](file://internal/logic/card_redeem_order/process.go#L121-L272) +- [consume.go](file://internal/logic/card_redeem_order/consume.go#L175-L212) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/天猫订单处理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/天猫订单处理.md new file mode 100644 index 00000000..e8626b99 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/天猫订单处理.md @@ -0,0 +1,271 @@ +# 天猫订单处理 + + +**本文档引用的文件** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了天猫游戏卡密订单处理系统的完整流程,涵盖订单创建、店铺订单处理、工作区管理、回调处理和状态变更机制。重点解析了订单与天猫店铺的关联逻辑、订单同步机制以及Agiso回调处理流程。文档还深入说明了订单状态机的转换规则、事务管理策略、订单工作区的概念与使用场景,并提供性能优化建议和常见问题解决方案。 + +## 项目结构 +天猫游戏卡密订单处理功能主要集中在`api/card_info_t_mall_game/v1`目录下,包含订单、回调、同步和工作区等核心模块。控制器逻辑位于`internal/controller/card_info_t_mall_game`目录,数据模型定义在`internal/model`中,服务层实现位于`internal/service`目录。定时同步任务由`utility/cron`目录下的组件负责。 + +```mermaid +graph TD +subgraph "API接口层" +A[order.go] +B[callback.go] +C[sync.go] +D[workspace.go] +end +subgraph "控制器层" +E[card_info_t_mall_game_v1_t_mall_game_order_submit.go] +F[card_info_t_mall_game_v1_t_mall_game_agiso_callback.go] +end +subgraph "服务层" +G[card_t_mall_order.go] +end +subgraph "模型层" +H[card_t_mall_game_order.go] +I[card_t_mall_game_work_space.go] +end +subgraph "定时任务" +J[t_mall_game_data_sync.go] +end +A --> E +B --> F +E --> G +F --> G +G --> H +J --> G +G --> I +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +## 核心组件 +天猫游戏卡密订单处理系统的核心组件包括订单管理、回调处理、数据同步和工作区统计。订单管理负责订单的创建和状态维护,回调处理模块接收来自Agiso平台的异步通知,数据同步组件确保本地数据与天猫平台保持一致,工作区统计提供订单处理的汇总信息。 + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +## 架构概述 +系统采用分层架构设计,从上至下分为API接口层、控制器层、服务层和数据模型层。API接口层定义了外部可调用的HTTP端点,控制器层处理请求参数验证和业务流程调度,服务层实现核心业务逻辑,数据模型层负责数据持久化操作。定时任务组件独立运行,定期从天猫平台同步订单数据。 + +```mermaid +graph TD +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> Model[数据模型] +Service --> External[外部系统] +Cron[定时任务] --> Service +External --> Callback[回调接口] +Callback --> Controller +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style Model fill:#69f,stroke:#333 +style External fill:#ff6,stroke:#333 +style Cron fill:#9f6,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) + +## 详细组件分析 + +### 订单创建分析 +订单创建流程始于客户端提交订单请求,经过参数验证后,控制器调用服务层创建订单。系统首先验证账户信息的有效性,然后创建新的订单记录并返回订单号。整个过程包含事务管理,确保数据一致性。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "订单API" +participant Controller as "控制器" +participant Service as "服务层" +participant Model as "数据模型" +Client->>API : 提交订单请求 +API->>Controller : 转发请求 +Controller->>Service : 验证账户信息 +Service->>Model : 查询账户数据 +Model-->>Service : 返回账户信息 +Service->>Service : 创建订单输入 +Service->>Model : 保存订单记录 +Model-->>Service : 返回订单号 +Service-->>Controller : 返回结果 +Controller-->>API : 返回响应 +API-->>Client : 返回订单号和状态 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +### 回调处理分析 +Agiso回调处理是系统的重要组成部分,负责接收来自第三方平台的异步通知。系统验证回调签名和参数后,更新订单状态并触发后续业务流程。手动回调功能允许运营人员处理异常情况。 + +```mermaid +flowchart TD +Start([接收到回调]) --> ValidateSign["验证签名"] +ValidateSign --> SignValid{"签名有效?"} +SignValid --> |否| ReturnError["返回验证失败"] +SignValid --> |是| ParseJson["解析JSON数据"] +ParseJson --> ProcessData["处理回调数据"] +ProcessData --> UpdateOrder["更新订单状态"] +UpdateOrder --> TriggerEvent["触发后续事件"] +TriggerEvent --> ReturnSuccess["返回成功响应"] +ReturnError --> End([结束]) +ReturnSuccess --> End +``` + +**图示来源** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) + +**章节来源** +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_agiso_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go) + +### 工作区与统计分析 +工作区组件提供订单处理的统计功能,包括每日订单汇总和基本统计信息。这些数据用于监控系统运行状况和业务绩效,支持分页查询和条件过滤。 + +```mermaid +classDiagram +class TMallGameDailyOrderSummaryReq { ++string channelName ++RechargeTMallGameCallBackType callbackType ++CommonPageReq commonPageReq +} +class TMAllGameSummaryListRecord { ++int count ++int succeedCount ++float64 succeedAmount ++float64 amount ++float64 rate ++string date +} +class TMallGameStatsReq { ++string channelName +} +class TMallGameStatsRes { ++int totalCount ++int totalSucceedCount ++float64 totalAmount ++float64 totalSucceedAmount ++float64 totalRate ++int todayCount ++int todaySucceedCount ++float64 todayAmount ++float64 todaySucceedAmount ++float64 todayRate +} +TMallGameDailyOrderSummaryReq --> TMAllGameSummaryListRecord : "包含" +TMallGameStatsReq --> TMallGameStatsRes : "返回" +``` + +**图示来源** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) +- [card_t_mall_game_work_space.go](file://internal/model/card_t_mall_game_work_space.go) + +**章节来源** +- [workspace.go](file://api/card_info_t_mall_game/v1/workspace.go) + +## 依赖分析 +系统各组件之间存在明确的依赖关系。API接口层依赖控制器层,控制器层依赖服务层,服务层依赖数据模型层。定时任务组件直接依赖服务层,实现了数据同步功能。这种分层依赖结构确保了系统的可维护性和可测试性。 + +```mermaid +graph LR +A[API接口] --> B[控制器] +B --> C[服务层] +C --> D[数据模型] +E[定时任务] --> C +F[外部系统] --> B +style A fill:#bbf,stroke:#333 +style B fill:#f96,stroke:#333 +style C fill:#6f9,stroke:#333 +style D fill:#69f,stroke:#333 +style E fill:#9f6,stroke:#333 +style F fill:#ff6,stroke:#333 +``` + +**图示来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +**章节来源** +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +## 性能考虑 +为确保系统高性能运行,建议优化数据库查询,使用适当的索引,合理配置缓存策略。对于数据同步任务,应选择业务低峰期执行,并采用分批处理方式避免对系统造成过大压力。监控系统应实时跟踪订单处理延迟和回调验证失败率等关键指标。 + +## 故障排除指南 +常见问题包括订单同步延迟和回调验证失败。对于同步延迟,应检查定时任务执行日志和网络连接状况。回调验证失败通常由签名不匹配引起,需核对密钥配置和时间戳同步情况。系统提供了手动回调功能,可用于处理异常订单。 + +**章节来源** +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [callback.go](file://api/card_info_t_mall_game/v1/callback.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +## 结论 +天猫游戏卡密订单处理系统通过清晰的分层架构和模块化设计,实现了高效可靠的订单处理能力。系统具备完整的订单生命周期管理、安全的回调验证机制和准确的数据同步功能。通过持续监控和优化,系统能够满足高并发场景下的业务需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/订单处理逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/订单处理逻辑.md new file mode 100644 index 00000000..f92080a9 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/订单处理逻辑/订单处理逻辑.md @@ -0,0 +1,283 @@ +# 订单处理逻辑 + + +**本文档引用的文件** +- [order.go](file://api/order/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [order_info.go](file://internal/model/do/order_info.go) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [sys_user_payment_record.go](file://internal/consts/sys_user_payment_record.go) +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [card_info_walmart_v1_order_summary_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_summary_list.go) +- [card_apple_order.go](file://internal/logic/card_apple_order/card_apple_order.go) +- [card_redeem_order.go](file://internal/logic/card_redeem_order/card_redeem_order.go) +- [utility/utils/tools.go](file://utility/utils/tools.go) +- [utility/cache/cache.go](file://utility/cache/cache.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细描述了kami_backend系统中订单处理业务逻辑的实现。重点涵盖卡密充值订单和兑换订单的全生命周期管理,包括订单创建、查询、回调处理和状态变更流程。文档还详细说明了订单与卡密账户、支付渠道的关联机制,以及订单历史记录、统计和汇总的实现方式。同时阐述了订单处理中的幂等性保证、事务管理策略和错误重试机制,并提供了完整的订单状态机描述。 + +## 项目结构 +kami_backend的订单处理相关代码分布在多个模块中,主要集中在api/order、internal/controller/order和各卡密类型模块中。系统采用分层架构,将API接口、控制器、业务逻辑和服务层分离,确保代码的可维护性和可扩展性。 + +```mermaid +graph TD +subgraph "API层" +OrderAPI[api/order/v1/order.go] +CardAPI[api/card_info_*/v1/*.go] +end +subgraph "控制器层" +OrderController[internal/controller/order] +CardController[internal/controller/card_info_*] +end +subgraph "服务层" +OrderService[internal/service/order] +CardService[internal/service/card_*] +end +subgraph "数据访问层" +DAO[internal/dao/v_1_order_info.go] +Model[internal/model/do/order_info.go] +end +OrderAPI --> OrderController +CardAPI --> CardController +OrderController --> OrderService +CardController --> CardService +OrderService --> DAO +CardService --> DAO +DAO --> Model +``` + +**图示来源** +- [order.go](file://api/order/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) +- [order_info.go](file://internal/model/do/order_info.go) + +**本节来源** +- [order.go](file://api/order/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) + +## 核心组件 +订单处理系统的核心组件包括订单创建服务、状态管理器、回调处理器、统计服务和日志记录器。这些组件协同工作,确保订单从创建到完成的整个流程的可靠性和一致性。 + +**本节来源** +- [order_info.go](file://internal/model/do/order_info.go) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) + +## 架构概述 +订单处理系统采用事件驱动的微服务架构,各组件通过明确定义的接口进行通信。系统设计注重可扩展性和容错性,支持多种卡密类型和支付渠道。 + +```mermaid +graph LR +Client[客户端] --> API[API网关] +API --> OrderController[订单控制器] +API --> CardController[卡密控制器] +OrderController --> OrderService[订单服务] +CardController --> CardService[卡密服务] +OrderService --> Database[(数据库)] +CardService --> ExternalAPI[外部API] +OrderService --> Cache[(缓存)] +CardService --> Cache +Database --> Analytics[分析服务] +Cache --> Analytics +``` + +**图示来源** +- [order.go](file://api/order/v1/order.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) + +## 详细组件分析 + +### 订单创建与处理 +订单创建流程涉及多个验证步骤和状态转换,确保数据的完整性和业务规则的执行。 + +#### 订单状态机 +```mermaid +stateDiagram-v2 +[*] --> 待处理 +待处理 --> 处理中 : 开始处理 +处理中 --> 成功 : 处理完成 +处理中 --> 失败 : 处理失败 +处理中 --> 超时 : 超时未完成 +成功 --> [*] +失败 --> [*] +超时 --> [*] +state "待处理" as pending { +[*] --> 接收 +接收 --> 验证 +验证 --> 排队 +} +state "处理中" as processing { +[*] --> 分配资源 +分配资源 --> 执行 +执行 --> 等待回调 +} +``` + +**图示来源** +- [order_info.go](file://internal/model/do/order_info.go) +- [sys_user_payment_record.go](file://internal/consts/sys_user_payment_record.go) + +#### 订单创建流程 +```mermaid +sequenceDiagram +participant Client as 客户端 +participant API as API接口 +participant Controller as 控制器 +participant Service as 服务层 +participant DAO as 数据访问层 +Client->>API : 提交订单请求 +API->>Controller : 转发请求 +Controller->>Controller : 参数验证 +Controller->>Service : 创建订单 +Service->>Service : 幂等性检查 +Service->>DAO : 保存订单 +DAO-->>Service : 返回结果 +Service-->>Controller : 返回订单信息 +Controller-->>API : 返回响应 +API-->>Client : 返回订单创建结果 +``` + +**图示来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) + +**本节来源** +- [order_v1_order_form_create.go](file://internal/controller/order/order_v1_order_form_create.go) +- [card_info_apple_v1_recharge_submit.go](file://internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) + +### 回调处理机制 +回调处理是订单系统的关键环节,负责接收外部系统的状态更新并相应地更新订单状态。 + +```mermaid +sequenceDiagram +participant External as 外部系统 +participant API as 回调API +participant Controller as 控制器 +participant Service as 服务层 +participant DAO as 数据访问层 +External->>API : 发送状态更新 +API->>Controller : 转发回调 +Controller->>Controller : 签名验证 +Controller->>Service : 处理回调 +Service->>Service : 事务处理 +Service->>DAO : 更新订单状态 +DAO-->>Service : 返回结果 +Service-->>Controller : 返回处理结果 +Controller-->>API : 返回响应 +API-->>External : 确认接收 +``` + +**图示来源** +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +**本节来源** +- [card_info_jd_v1_order_callback.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +### 订单查询与统计 +系统提供多种查询接口,支持订单历史记录查询、实时状态查询和统计汇总功能。 + +```mermaid +flowchart TD +Start([开始]) --> Validate["验证查询参数"] +Validate --> CheckCache["检查缓存"] +CheckCache --> CacheHit{"缓存命中?"} +CacheHit --> |是| ReturnCache["返回缓存结果"] +CacheHit --> |否| QueryDB["查询数据库"] +QueryDB --> Process["处理查询结果"] +Process --> UpdateCache["更新缓存"] +UpdateCache --> ReturnResult["返回结果"] +ReturnCache --> End([结束]) +ReturnResult --> End +``` + +**图示来源** +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) +- [card_info_jd_v1_order_summary_list.go](file://internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go) +- [card_info_walmart_v1_order_summary_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_summary_list.go) + +**本节来源** +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [order_v1_order_summary_get_list.go](file://internal/controller/order/order_v1_order_summary_get_list.go) + +## 依赖分析 +订单处理系统依赖于多个内部和外部组件,这些依赖关系确保了系统的完整功能。 + +```mermaid +graph TD +OrderSystem[订单系统] --> UserService[用户服务] +OrderSystem --> PaymentService[支付服务] +OrderSystem --> CardService[卡密服务] +OrderSystem --> CacheService[缓存服务] +OrderSystem --> Database[数据库] +OrderSystem --> ExternalAPI[外部API] +UserService --> AuthService[认证服务] +PaymentService --> ThirdParty[第三方支付] +CardService --> ExternalPlatform[外部平台] +CacheService --> Redis[(Redis)] +Database --> MySQL[(MySQL)] +``` + +**图示来源** +- [order.go](file://api/order/v1/order.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [utility/cache/cache.go](file://utility/cache/cache.go) + +**本节来源** +- [order.go](file://api/order/v1/order.go) +- [card_apple_order.go](file://internal/service/card_apple_order.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) + +## 性能考虑 +订单处理系统在设计时充分考虑了性能因素,采用了多种优化策略来确保高并发场景下的稳定运行。 + +- **缓存策略**:使用Redis缓存频繁访问的订单数据,减少数据库压力 +- **批量处理**:对大量订单操作采用批量处理方式,提高处理效率 +- **异步处理**:非关键路径操作采用异步处理,提升响应速度 +- **连接池**:数据库连接使用连接池管理,避免频繁创建销毁连接 +- **索引优化**:在关键查询字段上建立适当索引,加快查询速度 + +## 故障排除指南 +当订单处理出现问题时,可以按照以下步骤进行排查: + +1. **检查日志**:查看系统日志和订单日志,定位错误发生的具体位置 +2. **验证状态**:确认订单当前状态是否符合预期,检查状态转换逻辑 +3. **检查依赖**:确认相关服务(如支付、卡密账户)是否正常运行 +4. **查看监控**:检查系统监控指标,如响应时间、错误率等 +5. **重现问题**:尝试在测试环境重现问题,便于调试 + +**本节来源** +- [order_v1_order_log_list.go](file://internal/controller/order/order_v1_order_log_list.go) +- [utility/monitor/monitor.go](file://utility/monitor/monitor.go) + +## 结论 +kami_backend的订单处理系统设计合理,功能完整,能够有效支持卡密充值和兑换业务。系统通过清晰的分层架构、完善的错误处理机制和性能优化策略,确保了高可用性和可维护性。未来可以进一步优化异步处理能力和监控告警系统,提升整体系统稳定性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP查询优化.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP查询优化.md new file mode 100644 index 00000000..4822e31e --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP查询优化.md @@ -0,0 +1,188 @@ +# IP查询优化 + + +**本文档引用的文件** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) +- [cache.go](file://utility/cache/cache.go) +- [consts.go](file://utility/integration/restriction/consts.go) + + +## 目录 +1. [引言](#引言) +2. [IP查询优化策略](#ip查询优化策略) +3. [IP检查接口实现流程](#ip检查接口实现流程) +4. [缓存穿透与缓存雪崩处理](#缓存穿透与缓存雪崩处理) +5. [查询性能监控与调优](#查询性能监控与调优) +6. [高并发场景下的性能建议](#高并发场景下的性能建议) +7. [结论](#结论) + +## 引言 +本文档详细阐述了kami_backend系统中IP查询的性能优化机制。通过分析Redis缓存的使用、第三方IP定位服务集成以及数据库查询优化技术,全面介绍了系统如何高效处理IP查询请求。文档重点说明了IP检查接口的实现流程,包括如何快速判断IP是否在黑名单中,以及如何应对缓存穿透和缓存雪崩等常见问题。同时,还提供了查询性能的监控指标和优化方法,为高并发场景下的性能调优提供了实用建议。 + +## IP查询优化策略 +kami_backend系统采用了多层次的IP查询优化策略,确保在高并发场景下仍能保持高效的查询性能。 + +系统首先通过Redis缓存机制来优化IP查询性能。`utility/cache/cache.go`文件中的`Cache`结构体实现了基于Redis的缓存适配器,通过`SetAdapter(gcache.NewAdapterRedis(g.Redis()))`方法将缓存后端设置为Redis,实现了分布式缓存支持。这种设计使得IP查询结果可以在多个服务实例间共享,大大减少了重复查询的开销。 + +对于IP地理位置查询,系统采用了多源集成策略。在`utility/integration/restriction/location.go`文件中,定义了多个第三方IP定位服务提供商,包括CSDN、PCOnline、MeiTu、Vo、DBIP、QJQQ、IQIYI和IP66等。系统通过`GetLocationByIP`函数实现随机选择策略,从多个服务提供商中随机选择一个进行查询,这不仅提高了查询成功率,还避免了对单一服务的过度依赖。 + +```mermaid +flowchart TD +A[IP查询请求] --> B{IP是否为内网IP?} +B --> |是| C[直接允许访问] +B --> |否| D{Redis缓存中是否存在?} +D --> |是| E[返回缓存结果] +D --> |否| F[选择第三方IP定位服务] +F --> G[并发查询多个服务] +G --> H[获取IP地理位置信息] +H --> I[存储到数据库] +I --> J[更新Redis缓存] +J --> K[返回查询结果] +``` + +**图示来源** +- [location.go](file://utility/integration/restriction/location.go#L29-L38) +- [cache.go](file://utility/cache/cache.go#L19-L21) + +为了进一步提高查询效率,系统还实现了查询结果的本地缓存。当IP地址的地理位置信息被查询过一次后,相关信息会被存储在`restrict_ip_record`数据库表中,并在后续查询中优先从数据库读取,避免了重复的网络请求。 + +**本节来源** +- [location.go](file://utility/integration/restriction/location.go#L0-L38) +- [cache.go](file://utility/cache/cache.go#L0-L126) + +## IP检查接口实现流程 +IP检查接口的实现流程设计精巧,能够快速判断IP是否在黑名单中,并根据商户配置的限制策略做出相应决策。 + +接口的核心实现位于`internal/controller/restriction/restriction_v1_check_ip_allowed.go`文件中的`CheckIPAllowed`方法。该方法接收包含IP地址、设备ID、订单号等信息的请求参数,并返回IP是否被允许访问的结果。 + +流程首先获取商户的限制策略,然后按照优先级依次检查各种限制条件: +1. 卡密限制:检查当前卡密是否已被限制 +2. 设备限制:检查当前设备是否被禁用 +3. 代理限制:检查是否使用代理访问 +4. IP限制:检查IP地址是否在黑名单中 +5. 内网IP处理:根据配置决定是否限制内网IP +6. 区域限制:检查IP所属省份是否在允许范围内 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 服务层 +participant Database as 数据库 +Client->>Controller : 发送IP检查请求 +Controller->>Service : 获取商户限制策略 +Service-->>Controller : 返回策略信息 +Controller->>Service : 检查卡密限制 +Service-->>Controller : 返回检查结果 +alt 存在限制 +Controller-->>Client : 返回禁止访问 +else 无卡密限制 +Controller->>Service : 检查设备限制 +Service-->>Controller : 返回检查结果 +alt 存在限制 +Controller-->>Client : 返回禁止访问 +else 无设备限制 +Controller->>Service : 检查代理限制 +Service-->>Controller : 返回检查结果 +alt 使用代理 +Controller-->>Client : 返回禁止访问 +else 非代理访问 +Controller->>Service : 检查IP黑名单 +Service-->>Controller : 返回检查结果 +alt 在黑名单 +Controller-->>Client : 返回禁止访问 +else 不在黑名单 +Controller->>Service : 检查区域限制 +Service-->>Controller : 返回检查结果 +Controller-->>Client : 返回允许访问 +end +end +end +end +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L17-L68) + +值得注意的是,系统在每次IP检查后都会记录检查结果,无论IP是否被允许访问。这一设计不仅为后续的统计分析提供了数据支持,也便于追踪和审计IP访问行为。 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) + +## 缓存穿透与缓存雪崩处理 +kami_backend系统通过多种机制有效应对缓存穿透和缓存雪崩问题,确保系统的稳定性和可靠性。 + +对于缓存穿透问题,系统采用了"空值缓存"策略。当查询一个不存在的IP地址时,系统仍然会将查询结果(即"未找到")缓存一段时间。这样可以防止恶意用户通过构造大量不存在的IP地址来攻击数据库。在`internal/logic/restriction/ip_record.go`文件的`GetOrSetIPRecord`方法中,系统首先尝试从数据库查询IP记录,如果不存在则调用第三方服务获取IP信息,并将结果存储到数据库和缓存中。 + +```mermaid +flowchart TD +A[IP查询请求] --> B{Redis缓存中是否存在?} +B --> |是| C[返回缓存结果] +B --> |否| D{数据库中是否存在?} +D --> |是| E[获取数据库记录] +D --> |否| F[调用第三方IP定位服务] +F --> G{获取到IP信息?} +G --> |是| H[存储到数据库] +G --> |否| I[缓存空结果] +H --> J[更新Redis缓存] +I --> J +J --> K[返回查询结果] +``` + +**图示来源** +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L20-L53) + +针对缓存雪崩问题,系统采取了以下措施: +1. **缓存过期时间随机化**:不同IP记录的缓存过期时间存在一定随机性,避免大量缓存同时失效。 +2. **多级缓存机制**:结合Redis分布式缓存和本地缓存,即使Redis出现故障,仍能通过数据库提供基本服务。 +3. **服务降级策略**:当第三方IP定位服务不可用时,系统会自动切换到其他备用服务,确保核心功能不受影响。 + +此外,系统还实现了查询重试机制。在`utility/integration/restriction/location.go`文件中,`GetLocationByIP`函数使用了`retry.Retry`方法,当某个IP定位服务失败时,会自动重试其他服务,最多尝试所有可用服务,大大提高了查询成功率。 + +**本节来源** +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L0-L54) +- [location.go](file://utility/integration/restriction/location.go#L29-L38) + +## 查询性能监控与调优 +系统提供了完善的查询性能监控机制,帮助开发和运维人员及时发现和解决性能问题。 + +在`utility/cache/cache.go`文件中,`Cache`结构体提供了`GetPrefixKeyNum`方法,可以统计指定前缀的缓存键数量。这一功能可用于监控不同类型的缓存使用情况,例如统计IP相关缓存的数量,帮助评估缓存的使用效率和内存占用。 + +系统还集成了OpenTelemetry追踪功能,通过`SaveTrace`和`GetTrace`方法实现请求的全链路追踪。这使得开发人员可以清晰地看到每个IP查询请求的完整执行路径,包括各个服务调用的时间消耗,为性能分析和优化提供了有力支持。 + +性能调优方面,系统采用了以下策略: +1. **数据库索引优化**:在`restrict_ip_record`表的`ip`字段上建立了唯一索引,确保IP查询的高效性。 +2. **批量操作**:对于频繁的IP查询,系统支持批量查询接口,减少网络往返次数。 +3. **连接池管理**:合理配置数据库连接池大小,避免因连接过多导致数据库性能下降。 +4. **异步处理**:对于非关键路径的IP信息更新操作,采用异步方式处理,减少用户请求的响应时间。 + +**本节来源** +- [cache.go](file://utility/cache/cache.go#L85-L125) + +## 高并发场景下的性能建议 +在高并发场景下,IP查询性能的优化尤为重要。基于kami_backend系统的实现,提出以下性能调优建议: + +1. **缓存预热**:在系统启动或高峰期前,预先加载常用IP地址的查询结果到缓存中,避免大量请求同时触发缓存未命中。 + +2. **缓存分片**:对于大规模部署,可以考虑将IP缓存按地域或IP段进行分片,分散Redis实例的压力。 + +3. **读写分离**:将IP查询(读操作)和IP记录更新(写操作)分离到不同的数据库实例,提高并发处理能力。 + +4. **限流保护**:在API网关层面实施限流策略,防止恶意用户通过大量IP查询请求耗尽系统资源。 + +5. **监控告警**:建立完善的监控体系,实时监控IP查询的响应时间、错误率和缓存命中率等关键指标,设置合理的告警阈值。 + +6. **容量规划**:根据业务增长预测,定期评估和调整Redis和数据库的容量,确保系统有足够的资源应对流量增长。 + +7. **服务弹性**:采用微服务架构,将IP查询服务独立部署,便于根据负载情况动态扩缩容。 + +8. **降级预案**:制定详细的降级预案,当第三方IP定位服务大面积不可用时,能够快速切换到备用方案,保证核心业务不受影响。 + +**本节来源** +- [cache.go](file://utility/cache/cache.go#L0-L126) +- [location.go](file://utility/integration/restriction/location.go#L0-L38) + +## 结论 +kami_backend系统的IP查询优化机制通过多层次的缓存策略、多源IP定位服务集成和完善的错误处理机制,实现了高效、可靠的IP查询功能。系统不仅能够快速判断IP是否在黑名单中,还通过合理的架构设计有效应对了缓存穿透和缓存雪崩等常见问题。在高并发场景下,通过缓存预热、读写分离、限流保护等措施,确保了系统的稳定性和性能。未来可以进一步优化的方向包括引入布隆过滤器来更高效地处理缓存穿透问题,以及利用机器学习算法预测IP查询热点,实现更智能的缓存预热策略。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP记录管理.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP记录管理.md new file mode 100644 index 00000000..252f0fe7 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP记录管理.md @@ -0,0 +1,291 @@ +# IP记录管理 + + +**本文档引用文件** +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [v_1_restrict_ip_record.go](file://internal/dao/internal/v_1_restrict_ip_record.go) +- [restriction.go](file://internal/service/restriction.go) +- [model.go](file://internal/model/restriction.go) +- [cache.go](file://utility/cache/cache.go) +- [location.go](file://utility/integration/restriction/location.go) + + +## 目录 +1. [简介](#简介) +2. [数据结构设计](#数据结构设计) +3. [核心操作实现](#核心操作实现) +4. [Redis缓存集成](#redis缓存集成) +5. [IP记录与用户行为关联](#ip记录与用户行为关联) +6. [最佳实践](#最佳实践) +7. [结论](#结论) + +## 简介 +本文档详细阐述了kami_backend系统中IP记录管理的完整实现方案。系统通过精细化的IP记录管理机制,实现了对用户访问行为的全面追踪和安全控制。IP记录系统不仅存储基本的IP地址信息,还集成了地理位置识别、访问模式分析和异常行为检测等功能,为系统的安全防护提供了坚实的数据基础。 + +## 数据结构设计 + +IP记录系统采用分层的数据结构设计,包含数据库表结构、数据访问对象(DAO)和业务模型三个层次。 + +### 数据库表结构 +IP记录的核心数据存储在`restrict_ip_record`数据库表中,其字段定义如下: + +| 字段名 | 数据类型 | 说明 | +|--------|---------|------| +| id | BIGINT | 主键,自增ID | +| ip | VARCHAR | IP地址 | +| ip_province | VARCHAR | IP地址所在省份或地区 | +| is_public | TINYINT | 是否是公共地址(1:是,0:否) | +| raw_data | TEXT | 原始地理位置数据 | +| created_at | DATETIME | 创建时间 | +| updated_at | DATETIME | 更新时间 | +| deleted_at | DATETIME | 删除时间(软删除) | + +```mermaid +erDiagram +restrict_ip_record { +BIGINT id PK +VARCHAR ip +VARCHAR ip_province +TINYINT is_public +TEXT raw_data +DATETIME created_at +DATETIME updated_at +DATETIME deleted_at +} +``` + +**Diagram sources** +- [v_1_restrict_ip_record.go](file://internal/dao/internal/v_1_restrict_ip_record.go#L14-L19) + +### 业务模型设计 +在业务逻辑层,IP记录通过`RestrictionIPRecordOutput`结构体进行封装,该结构体继承了数据库实体并添加了业务相关的扩展字段。 + +```mermaid +classDiagram +class RestrictionIPRecordOutput { ++g.Meta orm : "table : restrict_ip_record" ++V1RestrictIpRecord ++RawData Response +} +class V1RestrictIpRecord { ++uint Id ++string Ip ++string IpProvince ++bool IsPublic +} +class Response { ++string City ++string Isp ++string Province ++string Region ++string RawData +} +RestrictionIPRecordOutput --> V1RestrictIpRecord : "继承" +RestrictionIPRecordOutput --> Response : "包含" +``` + +**Diagram sources** +- [model.go](file://internal/model/restriction.go#L11-L17) + +**Section sources** +- [model.go](file://internal/model/restriction.go#L11-L17) +- [v_1_restrict_ip_record.go](file://internal/dao/internal/v_1_restrict_ip_record.go#L14-L19) + +## 核心操作实现 + +IP记录管理系统提供了完整的CRUD(创建、读取、更新、删除)操作接口,其中最核心的是IP记录的获取与创建逻辑。 + +### IP记录创建与获取 +系统通过`GetOrSetIPRecord`方法实现IP记录的获取或创建。该方法采用"先查询后创建"的策略,确保同一IP地址不会重复记录。 + +```mermaid +flowchart TD +Start([开始]) --> TrimIP["清理IP地址空白字符"] +TrimIP --> QueryDB["查询数据库是否存在该IP记录"] +QueryDB --> RecordExists{"记录已存在?"} +RecordExists --> |是| ReturnRecord["返回现有记录"] +RecordExists --> |否| CheckPublicIP["检查是否为公共IP"] +CheckPublicIP --> |是| GetLocation["获取地理位置信息"] +CheckPublicIP --> |否| SetEmptyLocation["设置空地理位置"] +GetLocation --> InsertRecord["插入新IP记录到数据库"] +SetEmptyLocation --> InsertRecord +InsertRecord --> CreateOutput["创建输出模型"] +CreateOutput --> End([结束]) +``` + +**Diagram sources** +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L20-L53) + +**Section sources** +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L20-L53) +- [restriction.go](file://internal/service/restriction.go#L30-L32) + +### 地理位置信息获取 +系统通过集成多个第三方IP地理位置服务,实现了高可用的地理位置查询功能。当一个服务不可用时,系统会自动尝试其他服务。 + +```mermaid +sequenceDiagram +participant Service as "Restriction服务" +participant Location as "地理位置接口" +participant Impl1 as "PCOnline客户端" +participant Impl2 as "CSDN客户端" +participant Impl3 as "其他客户端" +Service->>Location : GetLocationByIP(ctx, ip) +Location->>Location : retry.Retry() +Location->>Impl1 : QueryLocationByIP(ctx, ip) +alt 成功且数据有效 +Impl1-->>Location : 返回地理位置 +Location-->>Service : 返回结果 +else 失败或数据无效 +Location->>Impl2 : QueryLocationByIP(ctx, ip) +alt 成功且数据有效 +Impl2-->>Location : 返回地理位置 +Location-->>Service : 返回结果 +else 失败或数据无效 +Location->>Impl3 : QueryLocationByIP(ctx, ip) +Impl3-->>Location : 返回地理位置 +Location-->>Service : 返回结果 +end +end +``` + +**Diagram sources** +- [location.go](file://utility/integration/restriction/location.go#L29-L38) +- [impl.go](file://utility/integration/restriction/impl.go#L0-L44) + +**Section sources** +- [location.go](file://utility/integration/restriction/location.go#L29-L38) +- [consts.go](file://utility/integration/restriction/consts.go#L0-L23) + +## Redis缓存集成 + +为了提高IP记录的读写性能,系统集成了Redis缓存机制,通过缓存适配器实现了数据库与缓存的协同工作。 + +### 缓存初始化 +系统在启动时初始化缓存实例,并设置Redis作为底层存储适配器。 + +```go +func NewCache() *Cache { + if cache == nil { + once.Do(func() { + cache = &Cache{ + Cache: gcache.New(), + } + cache.SetAdapter(gcache.NewAdapterRedis(g.Redis())) + }) + } + return cache +} +``` + +### 计数器缓存 +系统提供了原子性的计数器操作,用于统计特定键的访问次数。 + +```mermaid +flowchart TD +Start([Incr方法开始]) --> GetCache["获取缓存值"] +GetCache --> IsNil{"缓存值为空?"} +IsNil --> |是| SetInitial["设置初始值为1"] +IsNil --> |否| UpdateValue["更新值为原值+1"] +SetInitial --> ReturnSuccess["返回成功"] +UpdateValue --> ReturnSuccess +ReturnSuccess --> End([方法结束]) +``` + +**Diagram sources** +- [cache.go](file://utility/cache/cache.go#L63-L71) + +**Section sources** +- [cache.go](file://utility/cache/cache.go#L41-L86) + +## IP记录与用户行为关联 + +IP记录系统与用户行为分析紧密集成,通过多维度的数据关联,实现了对异常访问模式的精准追踪。 + +### 设备与IP关联 +系统通过`SaveDeviceInfo`方法将用户设备信息与IP地址进行关联,建立完整的访问链路。 + +```mermaid +classDiagram +class RestrictionDeviceInput { ++[]string IPs ++string RemoteIP ++string DeviceID ++string DeviceModel ++string UserAgent +} +class V1RestrictClientAccessRecord { ++int Id ++string VisitorId ++string DeviceModel ++string UserAgent ++bool IsUseProxy +} +class V1RestrictClientAccessIpRelation { ++int Id ++string Ip ++bool IsRemoteIp ++int RestrictIpRecordId ++int RestrictClientAccessRecordId ++string SessionId +} +RestrictionDeviceInput --> V1RestrictClientAccessRecord : "映射" +V1RestrictClientAccessRecord --> V1RestrictClientAccessIpRelation : "包含" +V1RestrictClientAccessIpRelation --> V1RestrictIpRecord : "关联" +``` + +**Diagram sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L44) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L31-L59) + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L44) +- [model.go](file://internal/model/restriction.go#L11-L17) + +### 异常访问模式检测 +系统通过分析IP记录与设备信息的关联关系,可以检测出多种异常访问模式,如代理使用、IP伪装等。 + +```mermaid +flowchart TD +Start([开始检测]) --> GetDeviceRecord["获取设备访问记录"] +GetDeviceRecord --> GetLastAccess["获取最后一次访问信息"] +GetLastAccess --> GetIPRelation["获取IP关联关系"] +GetIPRelation --> CountSameSession["统计同一会话中的IP数量"] +CountSameSession --> SingleIP{"只有一个IP?"} +SingleIP --> |是| NotUseProxy["未使用代理"] +SingleIP --> |否| UseProxy["使用代理"] +NotUseProxy --> End([检测结束]) +UseProxy --> End +``` + +**Diagram sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L74-L112) + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L74-L112) + +## 最佳实践 + +### 数据清理策略 +建议定期清理过期的IP记录,特别是那些长时间未再次访问的记录。可以通过创建定时任务,每月清理一次超过一年未更新的IP记录。 + +### 存储优化 +对于`raw_data`字段,建议采用压缩存储的方式,减少数据库存储空间占用。同时,对`ip`和`ip_province`字段建立索引,提高查询性能。 + +### 性能监控 +建立完善的性能监控体系,重点关注以下几个指标: +- IP记录查询响应时间 +- 地理位置服务调用成功率 +- Redis缓存命中率 +- 数据库查询性能 + +可以通过集成OpenTelemetry等监控工具,实现对IP记录管理系统的全面监控。 + +### 安全考虑 +- 对敏感的IP记录数据进行访问控制 +- 定期备份IP记录数据 +- 监控异常的IP访问模式,及时发现潜在的安全威胁 +- 对地理位置服务API调用进行限流,防止被滥用 + +## 结论 +kami_backend的IP记录管理系统通过精心设计的数据结构和高效的实现逻辑,为系统的安全防护提供了强有力的支持。系统不仅能够准确记录和追踪用户IP访问行为,还能通过与设备信息的关联分析,识别出复杂的异常访问模式。结合Redis缓存的使用,系统在保证数据准确性的同时,也实现了高性能的读写操作。通过遵循本文档提供的最佳实践,可以进一步优化系统的性能和安全性,为业务的稳定运行提供保障。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制机制.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制机制.md new file mode 100644 index 00000000..4095489b --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制机制.md @@ -0,0 +1,440 @@ +# IP限制机制 + + +**本文档引用文件** +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction_v1_block_order.go](file://internal/controller/restriction/restriction_v1_block_order.go) +- [v_1_restrict_ip_record.go](file://internal/model/entity/v_1_restrict_ip_record.go) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/model/entity/v_1_restrict_ip_order_access.go) + + +## 目录 +1. [简介](#简介) +2. [IP记录存储结构](#ip记录存储结构) +3. [黑白名单管理机制](#黑白名单管理机制) +4. [访问控制策略](#访问控制策略) +5. [配置方法与生效流程](#配置方法与生效流程) +6. [缓存机制与查询优化](#缓存机制与查询优化) +7. [查询接口说明](#查询接口说明) +8. [最佳实践与使用场景](#最佳实践与使用场景) +9. [与其他安全机制的集成](#与其他安全机制的集成) + +## 简介 + +kami_backend系统的IP限制机制是一套完整的访问控制体系,用于防止恶意爬虫、异常登录等安全威胁。该机制通过记录客户端IP地址、设备信息和访问行为,结合黑白名单策略和区域限制,实现精细化的访问控制。系统支持基于卡密、设备ID、IP地址和代理使用情况的多维度限制,并与商户部署策略深度集成,提供灵活的安全防护能力。 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L1-L67) + +## IP记录存储结构 + +IP限制机制采用三层数据模型来存储和管理IP相关信息: + +1. **IP基础记录表** (`restrict_ip_record`):存储IP地址的基本信息 + - IP地址 + - 所在省份/地区 + - 是否为公共IP + - 原始地理位置数据 + - 创建和更新时间戳 + +2. **客户端访问记录表** (`restrict_client_access_record`):存储设备级别的访问信息 + - 访问ID(设备ID) + - 设备型号 + - 用户代理(User Agent) + - 是否使用代理 + +3. **IP订单访问关联表** (`restrict_ip_order_access`):记录IP与订单的访问关系 + - 关联IP记录ID + - 订单号 + - 卡密 + - 限制状态 + - 限制策略 + - 设备ID + +当系统接收到新的IP访问时,会自动调用`GetOrSetIPRecord`方法检查并创建IP记录。对于公网IP,系统会通过外部服务获取其地理位置信息并存储在`RawData`字段中。 + +```mermaid +erDiagram +restrict_ip_record { +uint id PK +string ip UK +string ip_province +bool is_public +string raw_data +datetime created_at +datetime updated_at +datetime deleted_at +} +restrict_client_access_record { +uint id PK +string visitor_id UK +string device_model +string user_agent +bool is_use_proxy +datetime created_at +datetime updated_at +datetime deleted_at +} +restrict_ip_order_access { +uint id PK +int restrict_ip_id FK +string order_no +string card_pass +string ip +int status +string restrict_strategy +string device_id +datetime created_at +datetime updated_at +datetime deleted_at +} +restrict_ip_record ||--o{ restrict_ip_order_access : "被限制" +restrict_client_access_record ||--o{ restrict_ip_order_access : "关联" +``` + +**Diagram sources** +- [v_1_restrict_ip_record.go](file://internal/model/entity/v_1_restrict_ip_record.go#L11-L20) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go#L11-L20) +- [v_1_restrict_ip_order_access.go](file://internal/model/entity/v_1_restrict_ip_order_access.go#L11-L23) + +**Section sources** +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go#L21-L23) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go#L21-L23) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go#L21-L23) + +## 黑白名单管理机制 + +IP限制机制实现了基于多维度的黑白名单管理,支持以下几种限制类型: + +1. **卡密限制**:当某个卡密被标记为受限时,所有使用该卡密的请求都将被阻止 +2. **设备限制**:特定设备ID被禁止访问系统 +3. **IP限制**:特定IP地址被加入黑名单 +4. **代理限制**:检测到使用代理的请求将被阻止 +5. **内网IP限制**:可选择是否限制内网IP访问 +6. **区域限制**:仅允许或禁止特定省份/地区的访问 + +系统通过`IsRestrictExistByCardPass`、`IsRestrictDevice`、`IsRestrictExistByIP`等方法检查各种限制条件的存在。当检测到违规行为时,系统会自动将相关信息记录到`restrict_ip_order_access`表中,并设置相应的限制状态。 + +```mermaid +flowchart TD +A[新请求到达] --> B{检查卡密限制?} +B --> |是| C{卡密已被限制?} +C --> |是| D[拒绝访问] +C --> |否| E{检查设备限制?} +B --> |否| E +E --> |是| F{设备已被限制?} +F --> |是| D +F --> |否| G{检查代理使用?} +E --> |否| G +G --> |是| H{使用代理?} +H --> |是| D +H --> |否| I{检查IP限制?} +G --> |否| I +I --> |是| J{IP已被限制?} +J --> |是| D +J --> |否| K[允许访问] +I --> |否| K +``` + +**Diagram sources** +- [restriction.go](file://internal/service/restriction.go#L35-L65) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +**Section sources** +- [restriction.go](file://internal/service/restriction.go#L35-L65) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +## 访问控制策略 + +访问控制策略由商户部署配置决定,系统在处理每个请求时都会根据预设策略进行判断。控制流程如下: + +1. 系统首先获取当前商户部署的限制策略 +2. 按照优先级依次检查各项限制条件 +3. 任何一项限制条件触发都将导致访问被拒绝 +4. 如果所有限制条件都未触发,则允许访问 + +策略检查的优先级顺序为: +1. 卡密限制 +2. 设备限制 +3. 代理使用检测 +4. IP限制 +5. 内网IP特殊处理 +6. 区域限制 + +对于内网IP,系统提供了特殊的处理逻辑:如果策略中未启用内网IP限制,则自动允许所有内网IP访问,这有助于开发和测试环境的便利性。 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 限制服务 +participant DB as 数据库 +Client->>Controller : 发送请求(IP,设备ID,卡密) +Controller->>Service : 获取商户限制策略 +Service-->>Controller : 返回策略 +Controller->>Service : 检查卡密限制 +Service-->>Controller : 检查结果 +alt 卡密受限 +Controller->>Client : 拒绝访问 +else +Controller->>Service : 检查设备限制 +Service-->>Controller : 检查结果 +alt 设备受限 +Controller->>Client : 拒绝访问 +else +Controller->>Service : 检查代理使用 +Service-->>Controller : 检查结果 +alt 使用代理 +Controller->>Client : 拒绝访问 +else +Controller->>Service : 检查IP限制 +Service-->>Controller : 检查结果 +alt IP受限 +Controller->>Client : 拒绝访问 +else +Controller->>Client : 允许访问 +end +end +end +end +Controller->>Service : 记录限制结果 +``` + +**Diagram sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L35-L65) + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) + +## 配置方法与生效流程 + +### 配置方法 + +IP限制的配置主要通过商户部署策略进行,包含以下可配置项: + +- `IsRestrictCardPass`: 是否启用卡密限制 +- `IsRestrictDevice`: 是否启用设备限制 +- `IsRestrictAgent`: 是否启用代理检测 +- `IsRestrictIp`: 是否启用IP限制 +- `IsRestrictInternalIp`: 是否限制内网IP +- `RestrictArea`: 允许访问的省份/地区列表 + +### 生效流程 + +1. **请求接收**:系统接收到包含IP、设备ID、卡密等信息的请求 +2. **策略获取**:从商户部署配置中获取当前的限制策略 +3. **逐项检查**:按照预设顺序检查各项限制条件 +4. **结果记录**:无论允许或拒绝,都将结果记录到数据库 +5. **响应返回**:向客户端返回访问结果 + +系统使用事务性操作确保数据一致性,在检查过程中如果发现需要限制的情况,会立即终止后续检查并返回拒绝结果。 + +```mermaid +flowchart TD +A[接收请求] --> B[获取商户策略] +B --> C[检查卡密限制] +C --> D{卡密受限?} +D --> |是| E[记录拒绝] +D --> |否| F[检查设备限制] +F --> G{设备受限?} +G --> |是| E +G --> |否| H[检查代理使用] +H --> I{使用代理?} +I --> |是| E +I --> |否| J[检查IP限制] +J --> K{IP受限?} +K --> |是| E +K --> |否| L[检查内网IP] +L --> M{内网IP且不禁用?} +M --> |是| N[记录允许] +M --> |否| O[检查区域限制] +O --> P{在允许区域?} +P --> |是| N +P --> |否| E +E --> Q[返回拒绝] +N --> R[返回允许] +``` + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L35-L65) + +## 缓存机制与查询优化 + +### 缓存机制 + +系统虽然没有显式的缓存层,但通过以下方式实现高效的查询性能: + +1. **数据库索引优化**:在关键字段上建立索引,包括IP地址、设备ID、卡密等 +2. **连接池管理**:使用数据库连接池减少连接开销 +3. **对象复用**:通过GoFrame框架的ORM功能复用数据库查询对象 + +### 查询优化 + +1. **IP记录查询优化**: + - 使用`GetOrSetIPRecord`方法实现查询和创建的一体化 + - 对已存在的IP记录直接返回,避免重复查询 + - 对公网IP才进行地理位置查询,减少外部服务调用 + +2. **设备关联查询优化**: + - 使用会话ID(SessionId)批量关联IP和设备信息 + - 通过事务确保数据一致性 + - 提供`CheckIsDeviceUseProxy`方法快速判断代理使用情况 + +3. **批量查询支持**: + - 提供`GetRestrictRecordByCardPass`和`GetRestrictRecordByIP`方法支持按卡密或IP批量查询限制记录 + - 使用ORM的Scan功能直接映射到结构体,减少数据转换开销 + +系统通过合理的数据库设计和查询逻辑,确保在大规模IP数据情况下仍能保持快速的查询性能。 + +**Section sources** +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L1-L55) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L114) +- [restriction.go](file://internal/service/restriction.go#L35-L65) + +## 查询接口说明 + +系统提供了多个查询接口用于IP限制相关的数据检索: + +### 主要查询接口 + +1. **IP记录查询** + - 方法:`GetOrSetIPRecord` + - 功能:获取或创建IP记录 + - 参数:IP地址 + - 返回:IP记录信息及地理位置数据 + +2. **限制存在性检查** + - 方法:`IsRestrictExistByCardPass` + - 功能:检查指定卡密是否存在限制记录 + - 参数:卡密 + - 返回:布尔值 + + - 方法:`IsRestrictExistByIP` + - 功能:检查指定IP是否存在限制记录 + - 参数:IP地址 + - 返回:布尔值 + +3. **记录批量查询** + - 方法:`GetRestrictRecordByCardPass` + - 功能:获取指定卡密的所有限制记录 + - 参数:卡密 + - 返回:限制记录列表 + + - 方法:`GetRestrictRecordByIP` + - 功能:获取指定IP的所有限制记录 + - 参数:IP地址 + - 返回:包含IP记录的限制记录列表 + +4. **区域检查** + - 方法:`CheckIPIsAllowed` + - 功能:检查IP是否在允许的区域内 + - 参数:IP地址、允许区域列表 + - 返回:是否允许访问 + +这些接口通过服务层统一暴露,控制器可以直接调用,确保了接口的一致性和安全性。 + +**Section sources** +- [restriction.go](file://internal/service/restriction.go#L35-L65) +- [ip_record.go](file://internal/logic/restriction/ip_record.go#L1-L55) + +## 最佳实践与使用场景 + +### 最佳实践 + +1. **合理配置限制策略**:根据业务需求选择合适的限制维度,避免过度限制影响正常用户 +2. **定期清理过期记录**:设置适当的数据保留策略,定期清理不再需要的限制记录 +3. **监控限制触发情况**:建立监控系统,及时发现异常的限制触发模式 +4. **灰度发布新策略**:新限制策略应先在小范围用户中测试,确认无误后再全面推广 + +### 使用场景示例 + +#### 防止恶意爬虫 + +通过启用IP限制和代理检测,可以有效识别和阻止爬虫行为: +- 检测到使用代理的请求自动限制 +- 对短时间内频繁访问的IP进行限制 +- 结合设备ID识别伪装的爬虫 + +#### 限制异常登录 + +保护用户账户安全: +- 对多次登录失败的IP进行临时限制 +- 检测异地登录行为,要求额外验证 +- 限制同一账号在多设备上的并发登录 + +#### 区域访问控制 + +满足业务合规要求: +- 仅允许特定省份的用户访问服务 +- 阻止来自高风险地区的访问 +- 为不同地区用户提供差异化服务 + +#### 卡密安全保护 + +防止卡密滥用: +- 一个卡密只能在有限的设备上使用 +- 检测卡密的异常使用模式 +- 对疑似泄露的卡密立即限制 + +这些场景展示了IP限制机制在实际业务中的灵活应用,通过组合不同的限制维度,可以构建多层次的安全防护体系。 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L35-L65) + +## 与其他安全机制的集成 + +IP限制机制与系统的其他安全组件紧密集成,形成完整的安全防护体系: + +### 与登录频率限制的集成 + +1. **协同工作模式**: + - 登录频率限制检测到异常登录行为 + - 触发IP限制机制将相关IP加入黑名单 + - 后续来自该IP的所有请求都被阻止 + +2. **数据共享**: + - 共用设备ID和IP地址信息 + - 登录日志作为IP限制的决策依据 + - 限制结果反馈给登录系统用于风险评估 + +### 与商户部署策略的集成 + +1. **策略驱动**: + - 商户可以自定义IP限制策略 + - 不同商户可以有不同的安全要求 + - 策略变更实时生效 + +2. **差异化服务**: + - 高风险商户启用更严格的限制 + - 信任商户可以放宽某些限制条件 + - 根据商户等级动态调整安全策略 + +### 与设备指纹的集成 + +1. **设备识别**: + - 结合User Agent和设备型号生成设备指纹 + - 识别伪装的设备和浏览器 + - 检测自动化工具的使用 + +2. **行为分析**: + - 跟踪设备的访问模式 + - 识别异常的行为特征 + - 提前预警潜在的安全威胁 + +这种深度集成使得IP限制不仅仅是简单的IP黑名单,而是成为智能安全决策系统的重要组成部分,能够根据上下文信息做出更精准的访问控制决策。 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L1-L70) +- [restriction.go](file://internal/service/restriction.go#L35-L65) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L114) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制策略.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制策略.md new file mode 100644 index 00000000..2499cef7 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/IP限制机制/IP限制策略.md @@ -0,0 +1,229 @@ +# IP限制策略 + + +**本文档引用文件** +- [restriction.go](file://api/restriction/restriction.go) +- [restriction.go](file://internal/controller/restriction/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/consts/restriction.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [model.go](file://internal/model/restriction.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [rate.go](file://utility/limiter/rate.go) + + +## 目录 +1. [简介](#简介) +2. [IP限制策略配置机制](#ip限制策略配置机制) +3. [策略生效流程与优先级规则](#策略生效流程与优先级规则) +4. [与其他安全策略的协同工作](#与其他安全策略的协同工作) +5. [动态策略调整机制](#动态策略调整机制) +6. [业务场景配置示例与最佳实践](#业务场景配置示例与最佳实践) + +## 简介 +本文档详细阐述kami_backend系统的IP限制策略,涵盖黑白名单机制、封禁时长设置、例外规则配置、策略优先级、与地域限制等安全策略的协同机制,以及基于系统负载或安全事件的动态调整能力。通过本策略,系统可有效防止恶意访问、异常请求和资源滥用,保障服务稳定性和数据安全性。 + +## IP限制策略配置机制 + +### 黑白名单定义 +系统通过数据库表`restrict_ip_order_access`实现IP黑白名单机制。当IP被标记为限制状态(`RestrictStatus_Disable`)时,即进入黑名单;反之则为白名单。黑白名单的判定基于以下字段: +- `ip`: 被限制的IP地址 +- `status`: 状态值,0表示启用(白名单),1表示禁用(黑名单) +- `cardPass`: 关联卡密,实现基于卡密的IP限制 +- `deviceId`: 设备ID,支持设备级封禁 + +黑白名单记录通过`AddToRestrictIP`接口写入,由`V1RestrictIpOrderAccess` DAO操作数据库。 + +**Section sources** +- [restriction.go](file://internal/service/restriction.go#L31-L31) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go#L21-L23) +- [v_1_restrict_ip_order_access.go](file://internal/model/entity/v_1_restrict_ip_order_access.go#L11-L23) + +### 封禁时长设置 +系统当前采用永久封禁机制,封禁状态一旦设置,将持续有效直至手动解除。封禁记录存储在`restrict_ip_order_access`表中,通过`status`字段控制。未来可通过扩展`expire_at`字段实现临时封禁功能。 + +封禁操作由`SetCurrentOrderDisable`方法执行,支持事务处理,确保订单状态与IP限制状态的一致性。 + +**Section sources** +- [restriction.go](file://internal/logic/restriction/restriction.go#L64-L74) +- [restriction.go](file://internal/service/restriction.go#L27-L27) + +### 例外规则配置 +系统支持多种例外规则配置,允许特定IP或场景绕过限制: +1. **内网IP例外**:当`IsRestrictInternalIp`为false时,内网IP(RFC1918)自动放行 +2. **策略开关控制**:通过`MerchantDeployInfo`中的`IsRestrictCardPass`、`IsRestrictDevice`等布尔字段控制不同维度的限制是否启用 +3. **区域白名单**:通过`RestrictArea`字段配置允许访问的省份列表,非列表内IP将被拒绝 + +例外规则在`CheckIPAllowed`逻辑中统一处理,确保按优先级顺序执行。 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L35-L55) + +## 策略生效流程与优先级规则 + +### 策略生效流程 +IP限制策略的生效流程如下: +1. 接收客户端请求,获取IP、设备ID、卡密等信息 +2. 查询商户部署策略(`MerchantDeployInfo`) +3. 按优先级依次检查各项限制条件 +4. 记录本次检查结果到`restrict_ip_order_access`表 +5. 返回是否允许访问的结果 + +```mermaid +flowchart TD +Start([开始]) --> GetStrategy["获取商户限制策略"] +GetStrategy --> CheckCardPass{"卡密限制启用?"} +CheckCardPass --> |是| CheckCardPassExist["检查卡密是否存在限制记录"] +CheckCardPassExist --> |存在| ReturnFalse["返回拒绝"] +CheckCardPass --> |否| CheckDevice{"设备限制启用?"} +CheckDevice --> |是| CheckDeviceExist["检查设备是否存在限制记录"] +CheckDeviceExist --> |存在| ReturnFalse +CheckDevice --> |否| CheckAgent{"代理限制启用?"} +CheckAgent --> |是| CheckProxy["检查是否使用代理"] +CheckProxy --> |是| ReturnFalse +CheckAgent --> |否| CheckPublicIP{"是否公网IP?"} +CheckPublicIP --> |是| CheckIPIsExist["检查IP是否存在限制记录"] +CheckIPIsExist --> |存在| ReturnFalse +CheckPublicIP --> |否| CheckInternalIP{"内网IP限制启用?"} +CheckInternalIP --> |否| ReturnTrue["返回允许"] +CheckInternalIP --> |是| CheckArea{"区域限制配置?"} +CheckArea --> |是| CheckAreaAllowed["检查IP所在省份是否在允许列表"] +CheckAreaAllowed --> |是| ReturnTrue +CheckAreaAllowed --> |否| ReturnFalse +CheckArea --> |否| ReturnTrue +ReturnTrue --> End([结束]) +ReturnFalse --> End +``` + +**Diagram sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L15-L68) + +### 优先级规则 +策略检查遵循严格的优先级顺序: +1. 卡密级限制(最高优先级) +2. 设备级限制 +3. 代理检测限制 +4. IP级限制 +5. 内网IP例外规则 +6. 地域限制(最低优先级) + +此优先级设计确保了更精细的控制策略优先于通用策略,避免例外情况被错误拦截。 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L30-L55) + +## 与其他安全策略的协同工作 + +### 与地域限制的协同 +IP限制策略与地域限制通过`CheckIPIsAllowed`方法协同工作。系统首先通过IP地理位置服务获取IP所在省份,然后与配置的`RestrictArea`列表进行比对。若IP省份不在允许列表中,则判定为不允许访问。 + +地域判断支持中英文自动转换,使用拼音库将中文省份名转换为英文进行匹配,确保国际化环境下的准确性。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "RestrictionController" +participant Service as "RestrictionService" +participant DAO as "V1RestrictIpRecordDAO" +Client->>Controller : CheckIPAllowed(IP, OrderNo) +Controller->>Service : GetRestrictStrategy(MerchantDeployID) +Service-->>Controller : Strategy +Controller->>Service : CheckIPIsAllowed(IP, Strategy.RestrictArea) +Service->>Service : IsInProvince(IP, RestrictArea) +Service->>DAO : Query IP Record +DAO-->>Service : IP Province +Service->>Service : Compare with RestrictArea +Service-->>Controller : IsAllowed +Controller->>Service : AddToRestrictIP(Result) +Controller-->>Client : Response +``` + +**Diagram sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L50-L53) +- [restriction.go](file://internal/logic/restriction/restriction.go#L98-L128) + +### 与设备指纹的协同 +系统通过`deviceId`实现设备级限制,与IP限制形成多维度防护。当`IsRestrictDevice`启用时,即使IP变化,只要设备ID被封禁,访问仍会被拒绝。设备信息由`RestrictionDeviceInput`结构体收集,包含设备型号、UserAgent等特征。 + +**Section sources** +- [restriction.go](file://internal/model/restriction.go#L6-L14) +- [restriction.go](file://internal/logic/restriction/restriction.go#L168-L173) + +## 动态策略调整机制 + +### 基于系统负载的调整 +虽然当前代码未直接实现基于系统负载的动态调整,但系统架构支持通过外部监控模块集成实现。可通过`SimpleLimiter`限流器(位于`utility/limiter/rate.go`)作为基础组件,当系统负载过高时,动态收紧IP限制策略,如: +- 临时启用内网IP限制 +- 缩小允许访问的地域范围 +- 降低请求频率阈值 + +```mermaid +classDiagram +class SimpleLimiter { ++Cap int ++Expire int ++rate []*simpleRateNode ++Allow(key string) bool ++checkAvailable() void +} +class Type { ++CardInfoJdAccountCookieChecker Type ++CardInfoRedeemAccountCookieChecker Type +} +SimpleLimiter --> Type : "使用" +``` + +**Diagram sources** +- [rate.go](file://utility/limiter/rate.go#L12-L70) + +### 基于安全事件的调整 +系统可通过分析`restrict_ip_record`表中的异常访问模式,自动触发安全响应。例如,当检测到某个IP在短时间内频繁尝试不同卡密时,可自动调用`AddToRestrictIP`将其加入黑名单。 + +安全事件响应可通过定时任务或实时流处理系统实现,结合`GetRestrictRecordByIP`和`IsRestrictExistByIP`等查询接口进行模式识别。 + +**Section sources** +- [restriction.go](file://internal/service/restriction.go#L45-L47) +- [restriction.go](file://internal/logic/restriction/restriction.go#L148-L158) + +## 业务场景配置示例与最佳实践 + +### 高安全性业务场景 +对于金融、支付等高安全性要求的业务,推荐配置: +```json +{ + "IsRestrictCardPass": true, + "IsRestrictDevice": true, + "IsRestrictAgent": true, + "IsRestrictIp": true, + "IsRestrictInternalIp": true, + "RestrictArea": ["北京", "上海", "广东"] +} +``` +此配置实现卡密、设备、代理、IP四重验证,并限制仅允许特定省份访问。 + +### 开放性业务场景 +对于需要广泛访问的开放平台,推荐配置: +```json +{ + "IsRestrictCardPass": true, + "IsRestrictDevice": false, + "IsRestrictAgent": false, + "IsRestrictIp": false, + "IsRestrictInternalIp": false, + "RestrictArea": [] +} +``` +此配置仅对卡密进行限制,允许任意设备、IP和地域访问,适合公开API服务。 + +### 最佳实践指南 +1. **分阶段实施**:先启用卡密限制,再逐步增加其他维度限制 +2. **监控与审计**:定期分析`restrict_ip_order_access`表,识别误封情况 +3. **例外管理**:为运维、测试预留白名单IP段 +4. **性能考虑**:避免过度复杂的限制规则影响请求处理性能 +5. **用户通知**:当用户被限制时,提供清晰的错误信息和申诉渠道 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L15-L68) +- [restriction.go](file://internal/logic/restriction/restriction.go#L46-L62) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/地域限制机制.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/地域限制机制.md new file mode 100644 index 00000000..82ac5323 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/地域限制机制.md @@ -0,0 +1,321 @@ +# 地域限制机制 + + +**本文档引用文件** +- [province.go](file://api/restriction/v1/province.go) +- [collection.go](file://api/restriction/v1/collection.go) +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) +- [consts.go](file://utility/integration/restriction/consts.go) +- [impl.go](file://utility/integration/restriction/impl.go) +- [models.go](file://utility/integration/restriction/models.go) + + +## 目录 +1. [引言](#引言) +2. [核心数据结构与接口定义](#核心数据结构与接口定义) +3. [地理位置查询机制](#地理位置查询机制) +4. [省份限制规则配置与管理](#省份限制规则配置与管理) +5. [地域限制查询接口](#地域限制查询接口) +6. [IP地址解析与匹配流程](#ip地址解析与匹配流程) +7. [生效流程与执行逻辑](#生效流程与执行逻辑) +8. [与其他风控措施的协同机制](#与其他风控措施的协同机制) +9. [最佳实践与应用场景](#最佳实践与应用场景) +10. [总结](#总结) + +## 引言 +地域限制机制是kami_backend系统中用于实现基于地理位置访问控制的核心风控模块。该机制通过解析用户IP地址获取其地理位置信息,并依据预设的省份限制规则判断是否允许访问特定服务。本机制广泛应用于区域化服务控制、合规性要求满足等场景,有效防止跨区域非法操作,提升系统安全性和业务合规性。 + +## 核心数据结构与接口定义 + +### 请求与响应结构 +系统定义了标准化的API请求与响应结构,用于地域限制相关操作。 + +```mermaid +classDiagram +class QueryAllProvinceReq { ++string path : /restriction/location/getAllProvince ++string method : GET ++string summary : 获取所有的地理位置 +} +class QueryAllProvinceRes { ++[]string List +} +class CheckIPAllowedReq { ++string Ip ++string DeviceId ++uint MerchantDeployID ++string OrderNo ++string CardPass +} +class CheckIPAllowedRes { ++bool IsAllowed +} +QueryAllProvinceReq --> QueryAllProvinceRes : "响应" +CheckIPAllowedReq --> CheckIPAllowedRes : "响应" +``` + +**图示来源** +- [province.go](file://api/restriction/v1/province.go#L1-L28) + +**本节来源** +- [province.go](file://api/restriction/v1/province.go#L1-L28) + +## 地理位置查询机制 + +### 多源IP定位服务 +系统集成多个第三方IP地理位置查询服务,确保定位结果的准确性与可靠性。采用随机轮询策略调用不同服务商接口,并在失败时自动重试。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Service as "GetLocationByIP" +participant Provider as "第三方服务商" +Client->>Service : QueryLocationByIP(ctx, ip) +Service->>Service : 随机选择实现 +loop 所有服务商 +Service->>Provider : 调用QueryLocationByIP +Provider-->>Service : 返回地理位置 +alt 城市信息存在 +Service-->>Client : 返回结果 +break 成功 +end +end +alt 所有调用失败 +Service-->>Client : 抛出“ip location not found”错误 +end +``` + +**图示来源** +- [location.go](file://utility/integration/restriction/location.go#L0-L38) +- [impl.go](file://utility/integration/restriction/impl.go#L0-L239) + +**本节来源** +- [location.go](file://utility/integration/restriction/location.go#L0-L38) +- [impl.go](file://utility/integration/restriction/impl.go#L0-L239) + +### 支持的服务商列表 +系统当前支持以下IP地理位置查询服务商: +- CSDN +- PCOnline +- OlTools +- IdCd +- MeiTu +- Vo +- DBIP +- QJQQ +- IQIYI +- IP66 + +每个服务商通过独立的客户端实现`Location`接口,统一由工厂模式管理。 + +## 省份限制规则配置与管理 + +### 全国省份列表 +系统内置完整的中国省级行政区划列表,包含34个省级单位,涵盖大陆、港澳台及“海外”特殊标识。 + +```go +var AllProvinceList = []string{ + "北京市", "天津市", "河北省", "山西省", "内蒙古自治区", + "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省", + "浙江省", "安徽省", "福建省", "江西省", "山东省", + "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区", + "海南省", "重庆市", "四川省", "贵州省", "云南省", + "西藏自治区", "陕西省", "甘肃省", "青海省", "宁夏回族自治区", + "新疆维吾尔自治区", "香港特别行政区", "澳门特别行政区", "台湾省", "海外", +} +``` + +**本节来源** +- [consts.go](file://utility/integration/restriction/consts.go#L0-L24) + +### 限制策略配置 +省份限制规则作为商户部署策略的一部分进行配置,由`MerchantDeployInfo`服务管理。限制策略包含以下字段: +- `IsRestrictIp`: 是否启用IP地域限制 +- `RestrictArea`: 限制的省份列表 +- `IsRestrictInternalIp`: 是否限制内网IP +- 其他关联风控规则(设备、卡密、代理等) + +## 地域限制查询接口 + +### 获取全部省份接口 +提供RESTful API供前端或外部系统获取系统支持的所有省份列表。 + +```mermaid +flowchart TD +A[HTTP GET请求] --> B[/restriction/location/getAllProvince] +B --> C{调用QueryAllProvince} +C --> D[service.Restriction().GetAllProvince(ctx)] +D --> E[返回省份列表] +E --> F[HTTP 200 OK + 省份数组] +``` + +**图示来源** +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go#L0-L15) +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) + +**本节来源** +- [restriction_v1_query_all_province.go](file://internal/controller/restriction/restriction_v1_query_all_province.go#L0-L15) + +### 检查IP是否允许接口 +核心接口,用于在业务流程中实时判断某IP是否被允许访问。 + +```mermaid +flowchart TD +A[HTTP GET请求] --> B[/restriction/location/checkIPAllowed] +B --> C{调用CheckIPAllowed} +C --> D[获取商户部署限制策略] +D --> E{策略存在?} +E --> |否| F[返回内部错误] +E --> |是| G{各项限制条件检查} +G --> H[卡密限制] +G --> I[设备限制] +G --> J[代理限制] +G --> K[IP黑名单] +G --> L[内网IP处理] +G --> M[省份区域限制] +H --> N{是否触发限制?} +I --> N +J --> N +K --> N +L --> N +M --> N +N --> |是| O[IsAllowed = false] +N --> |否| P[IsAllowed = true] +P --> Q[记录访问日志] +O --> Q +Q --> R[返回响应] +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) + +## IP地址解析与匹配流程 + +### IP地理位置解析流程 +系统通过`GetLocationByIP`函数获取IP对应的地理位置信息,该函数会: +1. 随机选择一个服务商客户端 +2. 发起HTTP请求查询IP信息 +3. 解析返回数据并标准化为统一`Response`结构 +4. 若城市为空则视为查询失败并重试其他服务商 + +### 中英文省份匹配 +为兼容可能返回英文省份名称的服务商,系统实现拼音转换匹配机制: + +```go +// 当IP返回英文省份时 +if validator.IsAlpha(ipRecord.IpProvince) { + ipRecord.IpProvince = gstr.ToLower(ipRecord.IpProvince) + // 将待查省份转为拼音小写 + slice.ForEach(provinceCopier, func(index int, item string) { + provinceCopier[index] = gstr.ToLower(pinyin.NewDict().Convert(item, "").None()) + }) + // 将全部省份列表转为拼音小写 + slice.ForEachConcurrent(allProvinceListCopier, func(index int, item string) { + allProvinceListCopier[index] = gstr.ToLower(pinyin.NewDict().Convert(item, "").None()) + }, 5) +} +``` + +**本节来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L85-L112) + +### 海外地区特殊处理 +系统对“海外”这一特殊区域进行专门判断: +- 若限制规则包含“海外” +- 且IP所在省份不在中国34个省级单位内 +- 则判定为属于限制区域,返回`true` + +## 生效流程与执行逻辑 + +### 完整判断流程 +当调用`CheckIPIsAllowed`时,系统执行以下逻辑: +1. 调用`IsInProvince`判断IP是否在指定省份内 +2. 若**不在**指定省份内,则`IsAllowed = true`(白名单逻辑) +3. 否则`IsAllowed = false` + +### 访问记录持久化 +每次检查后,系统通过`defer`机制自动记录本次访问结果到数据库: +- 写入`v1_restrict_ip_order_access`表 +- 关联IP记录、设备ID、订单号、卡密等信息 +- 更新订单封单状态 + +该机制确保所有访问行为可追溯,便于后续审计与分析。 + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) + +## 与其他风控措施的协同机制 + +### 综合风控策略执行 +地域限制并非孤立运行,而是作为综合风控策略的一部分,与其他限制条件共同决策: + +```mermaid +graph TD +A[开始检查] --> B{卡密限制启用?} +B --> |是| C{卡密已限制?} +C --> |是| D[拒绝访问] +B --> |否| E{设备限制启用?} +E --> |是| F{设备已限制?} +F --> |是| D +E --> |否| G{代理限制启用?} +G --> |是| H{使用代理?} +H --> |是| D +G --> |否| I{IP限制启用?} +I --> |是| J{IP在黑名单?} +J --> |是| D +I --> |否| K{内网IP?} +K --> |是| L{限制内网IP?} +L --> |否| M[允许访问] +K --> |否| N{省份限制启用?} +N --> |是| O{IP在允许区域?} +O --> |是| M +O --> |否| D +N --> |否| M +D --> P[记录日志] +M --> P +P --> Q[返回结果] +``` + +**图示来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) + +**本节来源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L0-L69) + +### 协同工作特点 +- **短路判断**:任一条件触发即拒绝,提高效率 +- **统一入口**:所有风控由`CheckIPAllowed`统一调度 +- **数据联动**:共享限制状态与访问记录 +- **策略可配置**:各风控开关独立配置,灵活组合 + +## 最佳实践与应用场景 + +### 区域化服务控制 +- **场景**:某商户仅允许江苏省内用户购买 +- **配置**:`RestrictArea = ["江苏省"]`, `IsRestrictIp = true` +- **效果**:非江苏IP用户提交订单时被拒绝 + +### 合规性要求满足 +- **场景**:金融类产品需遵守属地监管要求 +- **配置**:按监管区域设置允许省份列表 +- **效果**:确保服务仅对合规区域用户提供 + +### 防止跨区套利 +- **场景**:不同地区定价策略不同,防止用户跨区购买 +- **配置**:结合卡密限制与地域限制 +- **效果**:同一卡密只能在固定区域使用 + +### 内网访问策略 +- **场景**:测试环境允许内网访问,生产环境严格限制 +- **配置**:`IsRestrictInternalIp = false` +- **效果**:内网IP自动放行,无需配置具体省份 + +## 总结 +kami_backend的地域限制机制通过多源IP定位、灵活的省份规则配置、高效的匹配算法以及与其他风控措施的深度协同,构建了一套完整可靠的基于地理位置的访问控制系统。该机制不仅满足了基本的区域访问控制需求,还通过精细化的策略配置支持了多样化的业务场景,为系统的安全性与合规性提供了有力保障。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID匹配算法.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID匹配算法.md new file mode 100644 index 00000000..14d28469 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID匹配算法.md @@ -0,0 +1,73 @@ +# 设备ID匹配算法 + + +**本文档引用的文件** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/model/restriction.go) +- [v_1_restrict_client_access_record.go](file://internal/model/do/v_1_restrict_client_access_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/model/do/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go) + + +## 目录 +1. [简介](#简介) +2. [设备ID匹配实现逻辑](#设备id匹配实现逻辑) +3. [性能优化策略](#性能优化策略) +4. [匹配结果判定与置信度评估](#匹配结果判定与置信度评估) +5. [匹配失败处理与异常应对](#匹配失败处理与异常应对) +6. [算法评估方法](#算法评估方法) +7. [结论](#结论) + +## 简介 +本系统中的设备ID匹配算法主要用于识别和管理用户访问设备,通过收集和分析设备ID、IP地址、用户代理等信息,实现对设备行为的监控与限制。该机制在防止滥用、保障系统安全方面发挥关键作用。设备信息的采集与匹配贯穿于用户请求处理流程中,结合数据库持久化与逻辑判断,形成完整的设备识别体系。 + +## 设备ID匹配实现逻辑 +设备ID匹配主要通过精确匹配方式实现,系统在用户请求时收集设备ID、设备型号、UserAgent及IP列表等信息,并进行持久化存储。匹配过程涉及设备信息的保存与查询两个核心环节。系统首先将设备ID作为访问标识(VisitorId)记录到`restrict_client_access_record`表中,同时关联IP访问记录。当需要判断某设备是否受限时,系统会查询`restrict_ip_order_access`表中是否存在该设备ID的禁用状态记录。 + +设备信息的采集由控制器`restriction_v1_user_info_collection.go`处理,接收到前端传入的设备信息后,经由服务层调用逻辑层方法进行存储。匹配逻辑主要体现在`IsRestrictDevice`方法中,该方法通过查询数据库中是否存在指定设备ID且状态为禁用的记录来判断设备是否受限。 + +**本节内容来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L33) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) + +## 性能优化策略 +系统在设备ID匹配过程中采用了事务处理和批量操作等优化策略。在保存设备信息时,使用数据库事务确保设备访问记录和IP关联关系的一致性写入。对于IP关联的存储,系统采用循环批量插入的方式,将多个IP地址与同一访问会话关联,提高写入效率。 + +虽然当前实现中未明确使用布隆过滤器或哈希索引等高级数据结构,但通过数据库层面的索引优化(如对`visitor_id`和`ip`字段建立索引)来加速查询操作。`GetOrSetAccessRecord`方法中通过先查询后插入的逻辑,避免了重复数据的产生,减少了不必要的数据库写入。 + +**本节内容来源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) + +## 匹配结果判定与置信度评估 +匹配结果的判定基于数据库中是否存在禁用状态的记录。`IsRestrictDevice`方法返回布尔值,表示设备是否被限制。该判定逻辑简单直接,置信度较高,因为其依赖于明确的数据库记录而非概率性算法。 + +系统通过`CheckIsDeviceUseProxy`方法进一步评估设备行为的可信度,该方法通过分析设备使用代理的情况来判断访问的真实性。如果设备在使用特定IP访问时被识别为使用代理,则可能被视为可疑行为。这种基于行为模式的分析为设备识别提供了额外的置信度评估维度。 + +**本节内容来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L154-L172) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L89-L113) + +## 匹配失败处理与异常应对 +系统对匹配过程中的异常情况进行了妥善处理。在数据库操作中,使用`utils.HandleNoRowsError`方法处理查询无结果的情况,避免因空指针异常导致服务中断。事务机制确保了数据操作的原子性,即使在部分操作失败时也能回滚到一致状态。 + +对于设备信息采集过程中的潜在问题,如IP列表为空或设备ID缺失,系统通过结构体字段的默认值和空值检查来保证程序的健壮性。在`SaveDeviceInfo`方法中,任何一步操作失败都会导致整个事务回滚,防止产生不完整或错误的数据记录。 + +**本节内容来源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) +- [restriction.go](file://internal/logic/restriction/restriction.go#L0-L173) + +## 算法评估方法 +设备ID匹配算法的准确率可通过统计实际受限设备与系统识别出的受限设备之间的吻合度来评估。误判率则可通过分析被错误标记为受限的正常设备数量来计算。由于系统采用精确匹配而非模糊匹配或相似度计算,理论上误判率应接近于零,除非存在数据录入错误或业务逻辑变更。 + +可以通过定期审计`restrict_ip_order_access`表中的记录,验证设备限制策略的执行效果。同时,监控`CheckIsDeviceUseProxy`方法的返回结果分布,可以评估代理检测算法的有效性。这些评估指标应结合业务场景的实际需求进行综合考量。 + +**本节内容来源** +- [restriction.go](file://internal/logic/restriction/restriction.go#L154-L172) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L89-L113) + +## 结论 +kami_backend系统的设备ID匹配算法以精确匹配为核心,通过采集设备ID、IP地址等信息并持久化存储,实现了对设备行为的有效监控。系统采用事务处理保证数据一致性,通过合理的数据库查询实现高效的设备状态判定。尽管未采用复杂的模糊匹配或相似度计算算法,但其设计简洁可靠,能够满足当前业务场景下的设备识别需求。未来可考虑引入更高级的设备指纹技术以提高识别精度。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID存储策略.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID存储策略.md new file mode 100644 index 00000000..a194c2a4 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID存储策略.md @@ -0,0 +1,242 @@ +# 设备ID存储策略 + + +**本文档中引用的文件** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [restriction.go](file://internal/model/restriction.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [cache.go](file://utility/cache/cache.go) +- [consts.go](file://utility/cache/consts.go) + + +## 目录 +1. [简介](#简介) +2. [数据库表结构设计](#数据库表结构设计) +3. [设备ID与其他限制条件的关联关系](#设备id与其他限制条件的关联关系) +4. [性能优化措施](#性能优化措施) +5. [存储容量规划与数据清理策略](#存储容量规划与数据清理策略) +6. [数据安全性与访问控制](#数据安全性与访问控制) +7. [结论](#结论) + +## 简介 +本系统通过设备ID记录机制实现对用户访问行为的追踪与限制管理。设备ID作为核心标识,与IP地址、用户代理等信息共同构成访问控制策略的基础。系统采用数据库持久化存储结合Redis缓存的方式,确保数据的高可用性和访问效率。设备信息在用户每次请求时被采集并记录,用于后续的风险识别、反欺诈分析和访问权限控制。 + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L1-L33) + +## 数据库表结构设计 + +### 设备访问记录表 (restrict_client_access_record) +该表用于存储设备的基本访问信息,是设备ID存储的核心表。 + +| 字段名 | 类型 | 是否主键 | 允许为空 | 默认值 | 说明 | +|--------|------|----------|----------|--------|------| +| id | int64 | 是 | 否 | 自增 | 主键ID | +| visitor_id | varchar(255) | 否 | 否 | 无 | 设备ID,唯一标识客户端设备 | +| device_model | varchar(255) | 否 | 是 | null | 设备型号 | +| user_agent | text | 否 | 是 | null | 用户代理字符串 | +| is_use_proxy | tinyint(1) | 否 | 否 | 0 | 是否使用代理(0:否, 1:是) | +| created_at | datetime | 否 | 否 | 当前时间 | 创建时间 | +| updated_at | datetime | 否 | 是 | null | 更新时间 | +| deleted_at | datetime | 否 | 是 | null | 软删除时间戳 | + +```mermaid +erDiagram +restrict_client_access_record { +int64 id PK +varchar255 visitor_id +varchar255 device_model +text user_agent +tinyint1 is_use_proxy +datetime created_at +datetime updated_at +datetime deleted_at +} +``` + +**Diagram sources** +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L33-L73) + +### 设备IP关联表 (restrict_client_access_ip_relation) +该表用于记录设备与IP地址的关联关系,支持多IP追踪。 + +| 字段名 | 类型 | 是否主键 | 允许为空 | 默认值 | 说明 | +|--------|------|----------|----------|--------|------| +| id | int64 | 是 | 否 | 自增 | 主键ID | +| ip | varchar(45) | 否 | 否 | 无 | IP地址(支持IPv4/IPv6) | +| is_remote_ip | tinyint(1) | 否 | 否 | 0 | 是否为远程真实IP(0:代理IP, 1:真实IP) | +| restrict_ip_record_id | int64 | 否 | 否 | 无 | 外键,指向IP记录表 | +| restrict_client_access_record_id | int64 | 否 | 否 | 无 | 外键,指向设备访问记录表 | +| session_id | varchar(64) | 否 | 否 | 无 | 会话ID,用于关联同一次访问的多个IP | + +```mermaid +erDiagram +restrict_client_access_ip_relation { +int64 id PK +varchar45 ip +tinyint1 is_remote_ip +int64 restrict_ip_record_id FK +int64 restrict_client_access_record_id FK +varchar64 session_id +} +``` + +**Diagram sources** +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go#L33-L73) + +### 索引策略 +为确保查询性能,系统在关键字段上建立了索引: + +```sql +-- 设备ID索引(高频查询) +CREATE INDEX idx_visitor_id ON restrict_client_access_record(visitor_id); + +-- IP地址索引(用于IP限制检查) +CREATE INDEX idx_ip ON restrict_client_access_ip_relation(ip); + +-- 复合索引(用于会话关联查询) +CREATE INDEX idx_session_access ON restrict_client_access_ip_relation(session_id, restrict_client_access_record_id); + +-- 创建时间索引(用于数据清理) +CREATE INDEX idx_created_at ON restrict_client_access_record(created_at); +``` + +**Section sources** +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L33-L73) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go#L33-L73) + +## 设备ID与其他限制条件的关联关系 + +### 与IP地址的关联 +系统通过`restrict_client_access_ip_relation`表建立设备ID与IP地址的多对多关系。当用户访问时,系统会记录所有相关的IP地址(包括代理链中的多个IP)和真实的远程IP。通过`is_remote_ip`字段区分真实IP和代理IP,并通过`session_id`将同一次访问的所有IP关联起来。 + +```mermaid +flowchart TD +A[客户端请求] --> B{获取IP列表} +B --> C[遍历所有IP] +C --> D[保存IP记录] +D --> E[创建IP关联关系] +E --> F[标记真实IP] +F --> G[生成会话ID关联] +G --> H[完成设备信息存储] +``` + +**Diagram sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) + +### 与用户行为的关联 +设备ID与用户行为通过访问记录进行关联。系统在`SaveDeviceInfo`方法中,将设备ID、设备型号、UserAgent等信息与访问行为绑定。当需要判断设备是否受限时,系统会查询`restrict_client_access_record`表中该设备ID的状态。 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 限制服务 +participant DB as 数据库 +Client->>Controller : 提交设备信息 +Controller->>Service : SaveDeviceInfo() +Service->>DB : 开启事务 +Service->>DB : 查询或创建访问记录 +Service->>DB : 插入IP关联记录 +DB-->>Service : 返回结果 +Service-->>Controller : 返回成功 +Controller-->>Client : 响应结果 +``` + +**Diagram sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) +- [restriction.go](file://internal/logic/restriction/restriction.go#L17-L35) + +### 存储周期 +设备访问记录的存储周期由系统配置决定,目前采用软删除机制。已删除的记录保留在数据库中,通过`deleted_at`字段标记删除时间。历史数据清理任务会定期清理超过保留周期的记录。 + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L33-L73) + +## 性能优化措施 + +### 分表策略 +当前系统未实现分表策略,所有设备记录存储在单表中。考虑到未来数据量增长,建议实施按时间分表策略,如按月或按季度创建新表,以提高查询性能和管理效率。 + +### 缓存机制 +系统采用Redis作为缓存层,但设备ID记录本身未直接缓存。缓存主要用于存储频繁访问的配置信息和临时状态。对于设备ID的查询,系统依赖数据库索引进行快速检索。 + +```mermaid +flowchart LR +A[应用层] --> B{查询设备信息} +B --> C[数据库查询] +C --> D[使用索引扫描] +D --> E[返回结果] +E --> A +``` + +**Diagram sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) + +### 数据归档方案 +系统目前未实现自动数据归档功能。建议建立定期归档机制,将超过一定时间(如6个月)的历史访问记录迁移到归档数据库或数据仓库中,以减少主库压力。归档数据可用于离线分析和审计。 + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L1-L44) + +## 存储容量规划与数据清理策略 + +### 存储容量估算 +根据当前业务规模,单条设备访问记录约占用500字节存储空间。按日均10万次访问计算,年存储量约为18.25GB。建议初始分配50GB存储空间,并设置监控告警。 + +### 数据清理策略 +系统采用软删除+定期清理的策略: +1. 正常业务中通过`deleted_at`字段标记删除记录 +2. 后台任务定期执行物理删除,清理超过保留周期(建议90天)的记录 +3. 清理任务在低峰期执行,避免影响业务性能 + +```go +// 伪代码:数据清理逻辑 +func CleanExpiredRecords(ctx context.Context) { + expireTime := time.Now().AddDate(0, 0, -90) // 90天前 + _, err := dao.V1RestrictClientAccessRecord.Ctx(ctx). + Where("created_at < ?", expireTime). + Delete() + if err != nil { + log.Error(ctx, "清理过期设备记录失败:", err) + } +} +``` + +**Section sources** +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L33-L73) + +## 数据安全性与访问控制 + +### 数据加密 +设备ID等敏感信息在传输过程中采用HTTPS加密。存储层面,数据库连接使用加密通道,但设备ID本身未进行加密存储。建议对设备ID进行哈希处理后再存储,以增强数据安全性。 + +### 访问控制 +系统通过RBAC(基于角色的访问控制)模型管理数据访问权限。访问控制策略定义在`rbac_model.conf`文件中,通过Casbin实现细粒度的权限控制。 + +```mermaid +graph TD +A[用户] --> B{权限检查} +B --> C[拥有访问权限?] +C --> |是| D[允许访问设备数据] +C --> |否| E[拒绝访问] +D --> F[记录访问日志] +E --> F +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L13) + +### 安全审计 +所有对设备数据的访问和修改操作都会被记录在系统日志中。关键操作如设备禁用、IP限制等都有详细的审计日志,便于事后追溯和分析。 + +**Section sources** +- [restriction.go](file://internal/logic/restriction/restriction.go#L139-L172) + +## 结论 +kami_backend系统的设备ID存储策略通过`restrict_client_access_record`和`restrict_client_access_ip_relation`两张表实现了设备信息的完整记录。系统能够有效关联设备ID、IP地址和其他访问信息,为访问控制和风险识别提供数据支持。虽然当前架构满足基本需求,但在大规模场景下建议引入分表、缓存和数据归档等优化措施,并加强数据加密和访问控制,以提升系统性能和安全性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID采集机制.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID采集机制.md new file mode 100644 index 00000000..bec9c810 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID采集机制.md @@ -0,0 +1,268 @@ +# 设备ID采集机制 + + +**本文档引用的文件** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go) +- [utils.go](file://utility/utils/utils.go) +- [v_1_restrict_client_access_record.go](file://internal/model/do/v_1_restrict_client_access_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/model/do/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go) + + +## 目录 +1. [简介](#简介) +2. [采集接口实现原理](#采集接口实现原理) +3. [数据传输格式与安全保护](#数据传输格式与安全保护) +4. [设备信息标准化处理](#设备信息标准化处理) +5. [隐私合规与数据最小化](#隐私合规与数据最小化) +6. [异常处理与降级策略](#异常处理与降级策略) +7. [数据库设计](#数据库设计) + +## 简介 +kami_backend系统实现了完整的设备ID采集机制,用于收集和分析客户端设备信息。该机制通过HTTP请求采集设备指纹、浏览器特征和网络信息,为系统安全、用户行为分析和反欺诈提供基础数据支持。采集过程注重隐私保护和数据最小化原则,确保符合相关法律法规要求。 + +## 采集接口实现原理 + +设备ID采集通过RESTful API接口实现,客户端在初始化时发送加密的设备信息到服务器。服务器端通过`restriction_v1_user_info_collection.go`中的`UserInfoCollection`方法处理采集请求。 + +采集流程如下: +1. 客户端收集设备信息并加密传输 +2. 服务器解密并验证数据完整性 +3. 提取HTTP请求中的实际IP地址 +4. 比较采集IP与请求IP判断是否使用代理 +5. 将设备信息存储到数据库 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Server as 服务器 +participant DB as 数据库 +Client->>Server : POST /v1/userInfoCollection +Server->>Server : 解密请求数据 +Server->>Server : 验证签名完整性 +Server->>Server : 获取客户端真实IP +Server->>Server : 检测代理使用情况 +Server->>DB : 存储设备信息 +DB-->>Server : 存储结果 +Server-->>Client : 返回响应 +``` + +**图示来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L31-L59) + +**本节来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) + +## 数据传输格式与安全保护 + +### 数据传输格式 +客户端采集的数据采用JSON格式,并通过AES-CBC加密后进行Base64编码传输。传输的数据结构包含以下字段: + +| 字段 | 类型 | 描述 | +|------|------|------| +| ips | 字符串数组 | 客户端采集到的所有IP地址 | +| deviceId | 字符串 | 设备唯一标识ID | +| deviceModel | 字符串 | 设备型号信息 | +| userAgent | 字符串 | 浏览器用户代理字符串 | +| sign | 字符串 | 数据签名,用于验证完整性 | + +### 安全保护措施 +系统采用多层安全保护机制确保数据传输和存储的安全性: + +1. **传输加密**:使用AES-CBC算法对敏感数据进行加密 +2. **数据完整性验证**:通过MD5签名验证数据未被篡改 +3. **身份验证**:结合设备ID和IP地址进行访问控制 +4. **防重放攻击**:通过会话ID和时间戳机制防止重放攻击 + +```mermaid +flowchart TD +A[原始设备数据] --> B[JSON序列化] +B --> C[MD5签名生成] +C --> D[添加签名字段] +D --> E[AES-CBC加密] +E --> F[Base64编码] +F --> G[HTTP传输] +G --> H[Base64解码] +H --> I[AES-CBC解密] +I --> J[JSON反序列化] +J --> K[签名验证] +K --> L[数据存储] +``` + +**图示来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L33) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L44) + +**本节来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) + +## 设备信息标准化处理 + +### 特征提取 +系统对采集到的设备信息进行标准化处理和特征提取,主要包括: + +1. **IP地址分析**:区分公网IP和私网IP,识别IPv4和IPv6地址 +2. **设备模型归类**:将设备型号归类为PC、移动设备等类别 +3. **浏览器特征提取**:从User-Agent中提取浏览器类型、版本和操作系统信息 +4. **代理检测**:通过比较采集IP和请求IP判断是否使用代理或VPN + +### 数据标准化 +采集到的原始数据经过以下标准化处理: + +```mermaid +classDiagram +class RestrictionDeviceInput { ++[]string IPs ++string RemoteIP ++string DeviceID ++string DeviceModel ++string UserAgent +} +class V1RestrictClientAccessRecord { ++int Id ++string VisitorId ++string DeviceModel ++string UserAgent ++bool IsUseProxy ++*gtime.Time CreatedAt ++*gtime.Time UpdatedAt ++*gtime.Time DeletedAt +} +class V1RestrictClientAccessIpRelation { ++int Id ++string Ip ++bool IsRemoteIp ++int RestrictIpRecordId ++int RestrictClientAccessRecordId ++string SessionId ++*gtime.Time CreatedAt ++*gtime.Time UpdatedAt ++*gtime.Time DeletedAt +} +RestrictionDeviceInput --> V1RestrictClientAccessRecord : "转换" +RestrictionDeviceInput --> V1RestrictClientAccessIpRelation : "关联" +``` + +**图示来源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L44) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go#L0-L21) + +**本节来源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) +- [utils.go](file://utility/utils/utils.go#L0-L65) + +## 隐私合规与数据最小化 + +### 隐私合规考虑 +系统在设备信息采集过程中严格遵守隐私保护原则: + +1. **知情同意**:在采集前明确告知用户并获取同意 +2. **数据最小化**:仅采集业务必需的最少信息 +3. **目的限制**:采集的数据仅用于安全验证和反欺诈等合法目的 +4. **存储期限**:设置合理的数据保留期限,定期清理过期数据 + +### 数据最小化实现 +系统通过以下方式实现数据最小化原则: + +- 仅采集必要的设备标识信息,不收集个人身份信息 +- 对IP地址进行适当脱敏处理 +- 限制数据访问权限,仅授权人员可访问 +- 定期审计数据使用情况,确保合规性 + +**本节来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) + +## 异常处理与降级策略 + +### 异常情况处理 +系统对采集过程中的各种异常情况进行妥善处理: + +1. **解密失败**:返回验证失败错误,记录日志供分析 +2. **签名验证失败**:拒绝请求,防止数据篡改 +3. **数据解析失败**:返回格式错误,提示客户端重新发送 +4. **数据库存储失败**:返回服务器错误,触发重试机制 + +### 降级策略 +当设备采集服务出现故障时,系统采用以下降级策略: + +1. **服务降级**:暂时关闭非关键的设备信息采集功能 +2. **缓存使用**:使用最近一次成功的设备信息作为备用 +3. **异步处理**:将采集请求加入队列,后续重试处理 +4. **监控告警**:实时监控采集成功率,异常时及时告警 + +```mermaid +flowchart TD +A[采集请求] --> B{服务是否正常?} +B --> |是| C[正常处理] +B --> |否| D[启用降级策略] +D --> E[使用缓存数据] +E --> F[记录降级日志] +F --> G[发送监控告警] +C --> H[返回成功] +D --> H +H --> I[客户端处理] +``` + +**图示来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L31-L59) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L44) + +**本节来源** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L0-L113) + +## 数据库设计 + +### 数据表结构 +设备ID采集机制涉及两个核心数据表: + +#### 访问记录表 (restrict_client_access_record) +存储设备的基本访问信息,包括设备ID、设备型号、User-Agent和代理使用情况。 + +```mermaid +erDiagram +V1RestrictClientAccessRecord { +int id PK +string visitor_id +string device_model +string user_agent +bool is_use_proxy +datetime created_at +datetime updated_at +datetime deleted_at +} +``` + +#### IP关联表 (restrict_client_access_ip_relation) +存储IP地址与访问记录的关联关系,用于分析设备的网络访问模式。 + +```mermaid +erDiagram +V1RestrictClientAccessIpRelation { +int id PK +string ip +bool is_remote_ip +int restrict_ip_record_id FK +int restrict_client_access_record_id FK +string session_id +datetime created_at +datetime updated_at +datetime deleted_at +} +V1RestrictClientAccessRecord ||--o{ V1RestrictClientAccessIpRelation : "包含" +``` + +**图示来源** +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L33-L73) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go#L0-L95) + +**本节来源** +- [v_1_restrict_client_access_record.go](file://internal/dao/internal/v_1_restrict_client_access_record.go#L0-L93) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/internal/v_1_restrict_client_access_ip_relation.go#L0-L95) +- [v_1_restrict_client_access_record.go](file://internal/model/do/v_1_restrict_client_access_record.go#L0-L23) +- [v_1_restrict_client_access_ip_relation.go](file://internal/model/do/v_1_restrict_client_access_ip_relation.go#L0-L24) +- [v_1_restrict_client_access_record.go](file://internal/model/entity/v_1_restrict_client_access_record.go#L0-L21) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID限制机制.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID限制机制.md new file mode 100644 index 00000000..7823d0c6 --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID限制机制.md @@ -0,0 +1,329 @@ +# 设备ID限制机制 + + +**本文档引用的文件** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://api/merchant/v1/model.go) +- [v_1_merchant_deploy_info.go](file://internal/model/do/v_1_merchant_deploy_info.go) +- [v_1_restrict_client_access_record.go](file://internal/model/do/v_1_restrict_client_access_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/model/do/v_1_restrict_client_access_ip_relation.go) +- [restriction.go](file://internal/model/restriction.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) + + +## 目录 +1. [简介](#简介) +2. [设备ID限制机制概述](#设备id限制机制概述) +3. [设备ID记录的采集与存储](#设备id记录的采集与存储) +4. [设备限制规则的配置与生效](#设备限制规则的配置与生效) +5. [设备ID匹配与验证机制](#设备id匹配与验证机制) +6. [设备伪装检测与代理识别](#设备伪装检测与代理识别) +7. [设备ID生成与隐私保护](#设备id生成与隐私保护) +8. [最佳实践与应用场景](#最佳实践与应用场景) +9. [与用户认证系统的集成](#与用户认证系统的集成) +10. [总结](#总结) + +## 简介 +本文档详细阐述了kami_backend系统中设备ID限制机制的实现原理和工作流程。该机制通过采集、存储和匹配设备标识信息,实现了基于设备级别的访问控制,有效防止多开、设备级滥用等安全问题。文档深入分析了设备ID的采集、存储、匹配和验证全过程,以及与用户认证系统的集成方式。 + +## 设备ID限制机制概述 +设备ID限制机制是kami_backend系统中重要的安全控制组件,旨在通过设备标识实现精细化的访问控制。该机制允许系统管理员根据业务需求配置不同的设备限制策略,包括是否限制设备、是否检测代理、是否限制卡密等。当用户请求系统服务时,系统会采集设备相关信息,与预设的限制规则进行匹配,从而决定是否允许访问。 + +设备ID限制机制的核心功能包括: +- 设备信息的采集与加密传输 +- 设备ID的存储与管理 +- 设备限制规则的配置与查询 +- 设备匹配与访问控制决策 +- 代理检测与设备伪装识别 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L17-L69) +- [model.go](file://api/merchant/v1/model.go#L75-L92) + +## 设备ID记录的采集与存储 +设备ID记录的采集与存储是设备限制机制的基础,涉及前端信息采集、后端接收处理和数据库持久化三个主要环节。 + +### 信息采集流程 +系统通过前端JavaScript代码采集设备信息,包括IP地址列表、设备ID、设备型号和用户代理字符串。采集到的信息经过AES-CBC加密和Base64编码后,通过API接口发送到后端服务器。 + +### 后端处理流程 +后端通过`UserInfoCollection`控制器接收加密数据,执行以下处理步骤: +1. 使用预设密钥解密数据 +2. 验证数据签名确保完整性 +3. 提取设备相关信息 +4. 调用服务层存储设备信息 + +### 数据库存储结构 +设备信息存储在两个主要数据库表中: + +**设备访问记录表 (restrict_client_access_record)** +| 字段 | 类型 | 描述 | +|------|------|------| +| id | uint | 主键ID | +| visitor_id | string | 访问ID(设备ID) | +| device_model | string | 设备型号 | +| user_agent | string | 用户浏览器代理 | +| is_use_proxy | bool | 是否使用代理 | + +**设备IP关联表 (restrict_client_access_ip_relation)** +| 字段 | 类型 | 描述 | +|------|------|------| +| id | uint | 主键ID | +| ip | string | IP地址 | +| is_remote_ip | bool | 是否为远程IP | +| restrict_ip_record_id | int | 限制IP详情ID | +| restrict_client_access_record_id | int | 设备访问记录ID | +| session_id | string | 会话ID | + +```mermaid +erDiagram +restrict_client_access_record { +uint id PK +string visitor_id UK +string device_model +string user_agent +bool is_use_proxy +timestamp created_at +timestamp updated_at +timestamp deleted_at +} +restrict_client_access_ip_relation { +uint id PK +string ip +bool is_remote_ip +int restrict_ip_record_id FK +int restrict_client_access_record_id FK +string session_id +timestamp created_at +timestamp updated_at +timestamp deleted_at +} +restrict_client_access_record ||--o{ restrict_client_access_ip_relation : "1:N" +``` + +**Diagram sources** +- [v_1_restrict_client_access_record.go](file://internal/model/do/v_1_restrict_client_access_record.go#L12-L22) +- [v_1_restrict_client_access_ip_relation.go](file://internal/model/do/v_1_restrict_client_access_ip_relation.go#L12-L23) + +**Section sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L0-L60) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L17-L42) + +## 设备限制规则的配置与生效 +设备限制规则的配置与生效流程是实现灵活访问控制的关键,涉及规则定义、策略配置和实时验证三个阶段。 + +### 规则配置参数 +设备限制规则通过商户部署配置进行定义,主要参数包括: + +| 参数 | 类型 | 描述 | +|------|------|------| +| isRestrictDevice | bool | 是否限制设备 | +| isRestrictAgent | bool | 是否检测代理 | +| isRestrictCardPass | bool | 是否限制卡密 | +| isRestrictIp | bool | 是否限制IP | +| isRestrictInternalIp | bool | 是否限制局域网IP | +| restrictArea | []string | 限制地区列表 | + +### 规则生效流程 +当用户发起请求时,系统按照以下流程验证设备限制规则: + +```mermaid +flowchart TD +A[用户请求] --> B{获取限制策略} +B --> C{是否限制卡密?} +C --> |是| D{卡密是否存在限制?} +D --> |是| E[拒绝访问] +C --> |否| F{是否限制设备?} +F --> |是| G{设备是否被禁用?} +G --> |是| E +F --> |否| H{是否检测代理?} +H --> |是| I{是否使用代理?} +I --> |是| E +H --> |否| J{是否限制IP?} +J --> |是| K{IP是否存在限制?} +K --> |是| E +J --> |否| L[允许访问] +E --> M[返回拒绝] +L --> N[返回允许] +``` + +**Diagram sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L17-L69) +- [model.go](file://api/merchant/v1/model.go#L75-L92) + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L17-L69) +- [v_1_merchant_deploy_info.go](file://internal/model/do/v_1_merchant_deploy_info.go#L12-L43) + +## 设备ID匹配与验证机制 +设备ID匹配与验证机制是设备限制功能的核心,负责判断特定设备是否被限制访问系统资源。 + +### 设备ID匹配流程 +系统通过`IsRestrictDevice`方法实现设备ID匹配,其工作原理如下: + +1. 接收设备ID作为输入参数 +2. 在`restrict_ip_order_access`表中查询该设备ID的记录 +3. 检查是否存在状态为"禁用"的记录 +4. 如果存在禁用记录,返回true(设备被限制) +5. 如果不存在禁用记录,返回false(设备未被限制) + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant Database as "数据库" +Client->>Controller : 发送设备ID验证请求 +Controller->>Service : 调用IsRestrictDevice(deviceId) +Service->>Database : 查询restrict_ip_order_access表 +Database-->>Service : 返回匹配记录 +Service-->>Controller : 返回是否限制结果 +Controller-->>Client : 返回验证结果 +``` + +**Diagram sources** +- [restriction.go](file://internal/logic/restriction/restriction.go#L164-L172) +- [restriction.go](file://internal/service/restriction.go#L18-L49) + +**Section sources** +- [restriction.go](file://internal/logic/restriction/restriction.go#L164-L172) +- [restriction.go](file://internal/service/restriction.go#L48-L48) + +## 设备伪装检测与代理识别 +设备伪装检测与代理识别机制用于防范用户通过技术手段绕过设备限制,提高系统的安全性。 + +### 代理识别原理 +系统通过比较采集的IP地址列表与实际请求IP地址来识别代理使用情况: + +1. 前端采集用户所有可见的IP地址 +2. 后端获取实际请求的客户端IP地址 +3. 比较两个IP地址是否一致 +4. 如果不一致,判断为使用代理 + +### 会话关联检测 +系统还通过会话关联机制增强代理检测的准确性: + +1. 为每次设备访问生成唯一的会话ID +2. 记录该会话下所有IP地址的访问情况 +3. 分析同一会话中IP地址的变化模式 +4. 根据IP地址出现频率判断是否为代理 + +```mermaid +flowchart TD +A[采集IP列表] --> B[获取实际请求IP] +B --> C{IP是否匹配?} +C --> |是| D[未使用代理] +C --> |否| E[标记为代理] +E --> F[记录会话信息] +F --> G[分析IP访问模式] +G --> H[确认代理状态] +``` + +**Section sources** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go#L83-L112) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L50-L55) + +## 设备ID生成与隐私保护 +设备ID生成与隐私保护机制确保了用户隐私的同时,又能有效实现设备级别的识别和控制。 + +### 设备ID生成策略 +系统采用客户端生成设备ID的策略,具体实现方式如下: + +1. 前端JavaScript代码生成唯一设备标识 +2. 设备ID基于设备硬件特征、浏览器指纹等信息生成 +3. 生成的设备ID在设备本地存储,确保持久性 +4. 设备ID在不同会话间保持一致 + +### 隐私保护措施 +为保护用户隐私,系统采取了多项安全措施: + +- **数据加密传输**:所有设备信息通过AES-CBC加密后传输 +- **数据完整性验证**:使用MD5签名验证数据完整性 +- **最小化数据采集**:仅采集必要的设备识别信息 +- **数据访问控制**:严格限制设备信息的访问权限 + +```mermaid +flowchart TD +A[设备信息采集] --> B[数据加密] +B --> C[签名生成] +C --> D[数据传输] +D --> E[后端接收] +E --> F[解密验证] +F --> G[存储处理] +``` + +**Section sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L35-L59) +- [restriction.go](file://internal/model/restriction.go#L11-L17) + +## 最佳实践与应用场景 +设备ID限制机制在多种业务场景中发挥着重要作用,以下是最佳实践和典型应用场景。 + +### 防止多开场景 +通过设备ID限制,可以有效防止用户在同一设备上运行多个实例: + +1. 配置`isRestrictDevice=true` +2. 系统检测到同一设备ID的多次访问 +3. 对重复访问进行限制或警告 +4. 维护系统资源的公平使用 + +### 设备级访问控制 +实现基于设备级别的精细化访问控制: + +- 为特定设备分配访问权限 +- 限制高风险设备的访问 +- 实现设备白名单/黑名单管理 +- 监控异常设备的访问行为 + +### 安全审计与监控 +利用设备ID记录进行安全审计: + +- 追踪设备访问历史 +- 分析异常访问模式 +- 识别潜在的安全威胁 +- 生成设备访问报告 + +## 与用户认证系统的集成 +设备ID限制机制与用户认证系统紧密集成,共同构建多层次的安全防护体系。 + +### 集成架构 +设备限制功能作为认证流程的补充验证层: + +```mermaid +flowchart TD +A[用户登录] --> B[身份认证] +B --> C{认证成功?} +C --> |是| D[设备ID验证] +D --> E{设备是否受限?} +E --> |是| F[拒绝访问] +E --> |否| G[授予访问权限] +C --> |否| H[拒绝登录] +``` + +### 协同工作机制 +设备限制与用户认证的协同工作流程: + +1. 用户提交登录凭证 +2. 系统验证用户名和密码 +3. 认证成功后,采集设备信息 +4. 验证设备ID是否被限制 +5. 综合判断是否授予访问权限 + +**Section sources** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go#L17-L69) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go#L35-L59) + +## 总结 +设备ID限制机制是kami_backend系统中重要的安全控制组件,通过采集、存储和匹配设备标识信息,实现了基于设备级别的精细化访问控制。该机制有效防止了多开、设备级滥用等安全问题,增强了系统的整体安全性。 + +核心优势包括: +- 灵活的限制规则配置 +- 可靠的设备识别能力 +- 强大的代理检测功能 +- 完善的隐私保护措施 +- 与用户认证系统的无缝集成 + +通过合理配置和使用设备ID限制机制,可以有效提升系统的安全性和稳定性,为用户提供更可靠的服务体验。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID隐私保护.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID隐私保护.md new file mode 100644 index 00000000..3b35d5ea --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/设备ID限制机制/设备ID隐私保护.md @@ -0,0 +1,209 @@ +# 设备ID隐私保护 + + +**本文档引用的文件** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [user_info.go](file://internal/model/user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) +- [sys_user_login.go](file://internal/model/sys_user_login.go) +- [v_1_sys_user_login_log.go](file://internal/dao/v_1_sys_user_login_log.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [base_user_info.go](file://internal/service/base_user_info.go) + + +## 目录 +1. [引言](#引言) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 引言 +本文档详细阐述了kami_backend系统中设备ID的隐私保护机制。重点介绍设备ID的加密存储、脱敏处理、匿名化技术、数据最小化原则、访问控制策略、审计日志机制、合规性实现以及数据泄露应急响应预案,确保系统符合GDPR等隐私法规要求。 + +## 项目结构 +kami_backend项目采用分层架构设计,主要包含API接口层、内部控制器层、服务层、数据访问层和工具层。设备ID隐私保护相关功能主要分布在utility/verify工具模块和用户信息处理相关模块中。 + +```mermaid +graph TB +subgraph "工具层" +Verify[utility/verify] +Config[utility/config] +Utils[utility/utils] +end +subgraph "数据访问层" +DAO[internal/dao] +Model[internal/model] +end +subgraph "服务层" +Service[internal/service] +end +subgraph "控制器层" +Controller[internal/controller] +end +subgraph "API层" +API[api] +end +Verify --> Service +Config --> Service +Utils --> Service +DAO --> Service +Service --> Controller +Controller --> API +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [user_info.go](file://internal/model/user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [user_info.go](file://internal/model/user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +## 核心组件 +设备ID隐私保护的核心组件包括加密算法实现、用户信息模型、数据访问对象和服务逻辑。加密算法主要由utility/verify模块提供,用户信息处理由base_user_info服务和相关DAO组件完成。 + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [base_user_info.go](file://internal/service/base_user_info.go) +- [user_info.go](file://internal/model/user_info.go) + +## 架构概述 +系统采用分层安全架构保护设备ID隐私。设备ID在存储前经过加密处理,访问时实施严格的权限控制,并记录完整的审计日志。系统遵循数据最小化原则,仅收集必要的用户信息。 + +```mermaid +graph TB +Client[客户端] --> |原始设备ID| Encryption[加密模块] +Encryption --> |加密设备ID| Storage[数据存储] +Storage --> |加密设备ID| AccessControl[访问控制] +AccessControl --> |授权访问| Service[业务服务] +Service --> |审计日志| Logging[日志系统] +Logging --> |日志记录| Audit[审计系统] +subgraph "安全机制" +Encryption +AccessControl +Logging +end +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [sys_user_login.go](file://internal/model/sys_user_login.go) +- [v_1_sys_user_login_log.go](file://internal/dao/v_1_sys_user_login_log.go) + +## 详细组件分析 + +### 加密算法组件分析 +系统使用AES-ECB和MD5算法对设备ID进行加密处理。AES-ECB用于设备ID的加密存储,MD5用于设备ID的哈希处理。 + +#### 加密算法类图 +```mermaid +classDiagram +class AESEncryptor { ++string key ++encrypt(plaintext string) string ++decrypt(ciphertext string) string +} +class MD5Hasher { ++hash(data string) string ++verify(data string, hash string) bool +} +class DeviceIDProcessor { +-encryptor AESEncryptor +-hasher MD5Hasher ++encryptDeviceID(rawID string) string ++hashDeviceID(rawID string) string ++decryptDeviceID(encryptedID string) string +} +DeviceIDProcessor --> AESEncryptor : "使用" +DeviceIDProcessor --> MD5Hasher : "使用" +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) + +### 用户信息处理组件分析 +用户信息处理组件负责设备ID的收集、存储和访问控制。系统在用户信息收集时实施数据最小化原则,仅收集必要的设备信息。 + +#### 用户信息处理流程 +```mermaid +flowchart TD +Start([开始]) --> Collect["收集设备ID"] +Collect --> Validate["验证设备ID格式"] +Validate --> FormatValid{"格式有效?"} +FormatValid --> |否| ReturnError["返回错误"] +FormatValid --> |是| Encrypt["AES加密设备ID"] +Encrypt --> Hash["MD5哈希设备ID"] +Hash --> Store["存储加密和哈希值"] +Store --> Log["记录审计日志"] +Log --> End([结束]) +ReturnError --> End +``` + +**Diagram sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [base_user_info.go](file://internal/service/base_user_info.go) + +**Section sources** +- [restriction_v1_user_info_collection.go](file://internal/controller/restriction/restriction_v1_user_info_collection.go) +- [base_user_info.go](file://internal/service/base_user_info.go) + +## 依赖分析 +设备ID隐私保护功能依赖于加密工具、数据访问层和配置管理模块。各组件之间保持低耦合,确保系统的可维护性和安全性。 + +```mermaid +graph LR +A[设备ID隐私保护] --> B[utility/verify] +A --> C[internal/dao] +A --> D[internal/service] +A --> E[utility/config] +B --> F[加密算法] +C --> G[数据持久化] +D --> H[业务逻辑] +E --> I[配置管理] +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [base_user_info.go](file://internal/service/base_user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [base_user_info.go](file://internal/service/base_user_info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +## 性能考虑 +设备ID加密处理对系统性能有一定影响,但通过优化算法实现和缓存机制,将性能影响控制在可接受范围内。AES加密和MD5哈希操作的时间复杂度均为O(n),其中n为设备ID长度。 + +## 故障排除指南 +当设备ID隐私保护功能出现异常时,应检查加密密钥配置、数据库连接状态和权限设置。查看相关日志文件可帮助定位问题。 + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [sys_user_login.go](file://internal/model/sys_user_login.go) +- [v_1_sys_user_login_log.go](file://internal/dao/v_1_sys_user_login_log.go) + +## 结论 +kami_backend系统通过AES-ECB和MD5加密算法、严格的访问控制、完整的审计日志和数据最小化原则,实现了设备ID的全面隐私保护。系统设计符合GDPR等隐私法规要求,能够有效防止数据泄露,保障用户隐私安全。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/风控限制逻辑.md b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/风控限制逻辑.md new file mode 100644 index 00000000..d06fd5bd --- /dev/null +++ b/.qoder/repowiki/zh/content/业务逻辑层架构/风控限制逻辑/风控限制逻辑.md @@ -0,0 +1,301 @@ +# 风控限制逻辑 + + +**本文档引用的文件** +- [restriction.go](file://internal/service/restriction.go) +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [restriction.go](file://internal/model/restriction.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) +- [restriction.go](file://internal/consts/restriction.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细阐述了kami_backend系统中风控限制业务逻辑的实现机制。重点分析了IP访问限制、地域限制和设备ID限制的实现方式,以及限制规则的配置、查询和生效流程。文档还解释了限制记录的存储结构、查询优化策略和性能优化方案,包括缓存机制和快速查询算法。同时提供了限制规则配置的最佳实践和常见使用场景示例,并描述了限制逻辑与其他安全机制的集成方式。 + +## 项目结构 +kami_backend的风控限制功能主要分布在`internal`目录下的多个子模块中。核心逻辑位于`internal/logic/restriction`包中,服务接口定义在`internal/service`包中,数据访问对象(DAO)位于`internal/dao`包中,模型定义在`internal/model`包中。控制器层位于`internal/controller/restriction`包中,处理外部请求。此外,限制相关的常量定义在`internal/consts`包中,IP地理位置查询集成在`utility/integration/restriction`包中。 + +```mermaid +graph TB +subgraph "控制器层" +Controller[restriction_v1_check_ip_allowed.go] +end +subgraph "服务层" +Service[restriction.go] +end +subgraph "业务逻辑层" +Logic[restriction.go] +DeviceLogic[device_id_record.go] +IPLLogic[ip_record.go] +end +subgraph "数据访问层" +DAO[v_1_restrict_*.go] +end +subgraph "模型层" +Model[restriction.go] +end +subgraph "集成层" +Integration[location.go] +end +Controller --> Service +Service --> Logic +Logic --> DAO +Logic --> Model +Logic --> Integration +DeviceLogic --> DAO +IPLLogic --> DAO +``` + +**图源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [restriction.go](file://internal/model/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) + +**节源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [restriction.go](file://internal/model/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) + +## 核心组件 +风控限制系统的核心组件包括IP记录管理、设备ID管理、访问限制检查和限制记录存储。系统通过`IRestriction`接口定义了所有限制相关的服务方法,具体实现位于`sRestriction`结构体中。主要功能包括:存储设备信息、检查IP是否允许访问、获取或设置IP记录、判断设备是否使用代理、将IP加入限制列表等。系统还集成了多个第三方IP地理位置查询服务,以提高IP定位的准确性和可靠性。 + +**节源** +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) + +## 架构概述 +风控限制系统的架构采用典型的分层设计,包括控制器层、服务层、业务逻辑层、数据访问层和模型层。控制器层接收外部请求并调用服务层接口。服务层定义了统一的接口规范,业务逻辑层实现了具体的限制检查逻辑。数据访问层负责与数据库交互,模型层定义了数据结构。系统还通过集成层与外部IP地理位置查询服务通信。整个系统通过GoFrame框架的依赖注入机制进行组件管理,确保了代码的可测试性和可维护性。 + +```mermaid +graph TD +A[客户端] --> B[控制器] +B --> C[服务接口] +C --> D[业务逻辑] +D --> E[数据访问] +E --> F[数据库] +D --> G[外部服务] +G --> H[IP地理位置查询] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#f96,stroke:#333 +style D fill:#9f9,stroke:#333 +style E fill:#99f,stroke:#333 +style F fill:#f99,stroke:#333 +style G fill:#ff9,stroke:#333 +style H fill:#9ff,stroke:#333 +``` + +**图源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [v_1_restrict_client_access_ip_relation.go](file://internal/dao/v_1_restrict_client_access_ip_relation.go) +- [v_1_restrict_client_access_record.go](file://internal/dao/v_1_restrict_client_access_record.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) +- [v_1_restrict_ip_record.go](file://internal/dao/v_1_restrict_ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) + +## 详细组件分析 + +### IP访问限制分析 +IP访问限制功能通过`CheckIPIsAllowed`方法实现,该方法首先调用`IsInProvince`判断IP是否位于允许的省份列表中。如果IP不在允许的省份列表中,则认为是允许访问的。系统通过`GetOrSetIPRecord`方法获取或创建IP记录,如果IP是公网IP,则会调用外部服务获取其地理位置信息。IP记录包括IP地址、省份信息、是否为公网IP以及原始响应数据。 + +```mermaid +flowchart TD +Start([开始]) --> CheckPublicIP["检查是否为公网IP"] +CheckPublicIP --> |是| GetLocation["获取IP地理位置"] +CheckPublicIP --> |否| ReturnAllowed["返回允许"] +GetLocation --> StoreRecord["存储IP记录"] +StoreRecord --> CheckProvince["检查是否在允许省份"] +CheckProvince --> |不在| ReturnAllowed +CheckProvince --> |在| ReturnNotAllowed["返回不允许"] +style Start fill:#f9f,stroke:#333 +style ReturnAllowed fill:#9f9,stroke:#333 +style ReturnNotAllowed fill:#f99,stroke:#333 +``` + +**图源** +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) + +**节源** +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) + +### 设备ID限制分析 +设备ID限制功能通过`SaveDeviceInfo`和`CheckIsDeviceUseProxy`方法实现。`SaveDeviceInfo`方法存储设备信息,包括设备ID、设备型号、用户代理字符串以及IP地址列表。系统通过比较远程IP和IP列表来判断是否使用代理。`CheckIsDeviceUseProxy`方法检查特定设备ID和IP组合是否使用代理,通过查询访问记录和IP关联关系来确定。 + +```mermaid +classDiagram +class sRestriction { ++SaveDeviceInfo(ctx, input) ++SaveDeviceIPRelation(ctx, ip, isRemoteIP, accessId, sessionId, tx) ++GetOrSetAccessRecord(ctx, input, tx) ++CheckIsDeviceUseProxy(ctx, deviceId, ip) +} +class RestrictionDeviceInput { ++IPs[] string ++RemoteIP string ++DeviceID string ++DeviceModel string ++UserAgent string +} +class V1RestrictClientAccessRecord { ++Id int ++VisitorId string ++DeviceModel string ++UserAgent string ++IsUseProxy bool +} +class V1RestrictClientAccessIpRelation { ++Id int ++Ip string ++IsRemoteIp bool ++RestrictIpRecordId uint ++RestrictClientAccessRecordId int ++SessionId string +} +sRestriction --> RestrictionDeviceInput : "使用" +sRestriction --> V1RestrictClientAccessRecord : "操作" +sRestriction --> V1RestrictClientAccessIpRelation : "操作" +``` + +**图源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/model/restriction.go) + +**节源** +- [device_id_record.go](file://internal/logic/restriction/device_id_record.go) +- [restriction.go](file://internal/model/restriction.go) + +### 限制规则配置分析 +限制规则配置通过`AddToRestrictIP`方法实现,该方法将IP加入限制列表。系统首先获取或创建IP记录,然后在`restrict_ip_order_access`表中插入新的限制记录。限制记录包括IP地址、状态、限制策略、设备ID、订单号和卡密等信息。系统还通过事务确保数据一致性,并在限制状态变化时更新订单摘要。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Controller as "控制器" +participant Service as "服务层" +participant Logic as "业务逻辑" +participant DAO as "数据访问" +participant DB as "数据库" +Client->>Controller : 检查IP是否允许 +Controller->>Service : 调用CheckIPAllowed +Service->>Logic : 执行限制检查逻辑 +Logic->>DAO : 查询限制策略 +DAO->>DB : 执行数据库查询 +DB-->>DAO : 返回查询结果 +DAO-->>Logic : 返回策略数据 +Logic->>Logic : 执行各项限制检查 +Logic-->>Service : 返回检查结果 +Service-->>Controller : 返回结果 +Controller-->>Client : 返回是否允许 +``` + +**图源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) + +**节源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [v_1_restrict_ip_order_access.go](file://internal/dao/v_1_restrict_ip_order_access.go) + +## 依赖分析 +风控限制系统依赖于多个内部和外部组件。内部依赖包括数据库访问组件(DAO)、模型组件、常量组件和工具组件。外部依赖包括IP地理位置查询服务,系统集成了多个第三方服务以提高查询的可靠性和准确性。系统还依赖于GoFrame框架提供的事务管理、日志记录和错误处理功能。各组件之间的依赖关系清晰,通过接口定义和依赖注入实现松耦合。 + +```mermaid +graph TD +A[风控限制系统] --> B[数据库] +A --> C[IP地理位置服务] +A --> D[GoFrame框架] +A --> E[商户部署信息] +A --> F[订单摘要] +B --> G[MySQL] +C --> H[CSDN] +C --> I[PCOnline] +C --> J[OlTools] +C --> K[IdCd] +C --> L[MeiTu] +C --> M[Vo] +C --> N[DBIP] +C --> O[QJQQ] +C --> P[IQIYI] +C --> Q[IP66n] +style A fill:#f96,stroke:#333 +style B fill:#99f,stroke:#333 +style C fill:#ff9,stroke:#333 +style D fill:#9f9,stroke:#333 +style E fill:#bbf,stroke:#333 +style F fill:#f99,stroke:#333 +``` + +**图源** +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) + +**节源** +- [restriction.go](file://internal/service/restriction.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) + +## 性能考虑 +风控限制系统在性能方面进行了多项优化。首先,系统通过数据库索引优化查询性能,在关键字段上建立了索引。其次,系统采用事务批量处理操作,减少数据库交互次数。对于IP地理位置查询,系统实现了重试机制和多个服务提供商的轮询,以提高查询成功率和响应速度。此外,系统通过缓存常用数据和预加载配置信息来减少重复计算和数据库查询。 + +**节源** +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [ip_record.go](file://internal/logic/restriction/ip_record.go) +- [location.go](file://utility/integration/restriction/location.go) + +## 故障排除指南 +在使用风控限制功能时,可能遇到以下常见问题:IP地理位置查询失败、数据库连接异常、限制规则不生效等。对于IP地理位置查询失败,可以检查网络连接和第三方服务状态,系统会自动重试其他服务提供商。对于数据库连接异常,需要检查数据库配置和连接池设置。对于限制规则不生效,需要检查商户部署策略配置和限制逻辑的执行顺序。系统日志记录了详细的执行过程,可用于问题排查。 + +**节源** +- [restriction_v1_check_ip_allowed.go](file://internal/controller/restriction/restriction_v1_check_ip_allowed.go) +- [restriction.go](file://internal/logic/restriction/restriction.go) +- [location.go](file://utility/integration/restriction/location.go) + +## 结论 +kami_backend的风控限制系统实现了全面的IP访问限制、地域限制和设备ID限制功能。系统架构清晰,组件职责明确,通过分层设计和接口抽象实现了良好的可维护性和可扩展性。系统集成了多个第三方IP地理位置查询服务,提高了IP定位的准确性和可靠性。在性能方面,系统通过索引优化、事务批量处理和重试机制等手段确保了高效稳定的运行。未来可以考虑引入缓存机制进一步优化性能,并增加更多的限制维度以满足复杂的业务需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/中间件与拦截器.md b/.qoder/repowiki/zh/content/中间件与拦截器.md new file mode 100644 index 00000000..6a0d13e8 --- /dev/null +++ b/.qoder/repowiki/zh/content/中间件与拦截器.md @@ -0,0 +1,269 @@ +# 中间件与拦截器 + + +**Referenced Files in This Document** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) +- [code.go](file://internal/errHandler/code.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细介绍了kami_backend项目中的中间件和拦截器系统,重点分析了认证中间件(auth.go)和错误处理中间件(error_handler.go)的实现。文档描述了这些中间件如何在请求处理流程中实现用户身份验证、授权检查以及统一的API响应格式化。通过深入分析中间件的实现细节、配置选项和使用模式,为开发者提供了创建自定义中间件的指南和最佳实践。 + +## 项目结构 +kami_backend项目的中间件系统主要位于`internal/middleware`目录下,包含两个核心文件:`auth.go`和`error_handler.go`。这些中间件与`utility`目录下的工具模块(如token、config、verify)紧密协作,共同构成了系统的安全和错误处理基础设施。 + +```mermaid +graph TD +subgraph "中间件层" +A[auth.go] +B[error_handler.go] +end +subgraph "工具层" +C[token] +D[config] +E[verify] +F[cache] +end +A --> C +A --> D +A --> E +B --> F +C --> D +C --> F +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) + +## 核心组件 +kami_backend的中间件系统由两个核心组件构成:认证中间件和错误处理中间件。认证中间件负责处理用户身份验证和授权检查,支持多种认证方式;错误处理中间件则负责统一处理和格式化API响应,确保系统返回一致的错误信息格式。 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) + +## 架构概述 +kami_backend的中间件系统采用分层架构设计,将认证逻辑与错误处理逻辑分离。认证中间件实现了灵活的认证策略,支持白名单、登录认证和iFrame认证三种模式。错误处理中间件则作为统一的错误捕获和响应层,确保所有API调用返回标准化的响应格式。 + +```mermaid +graph TB +Client[客户端] --> AuthMiddleware[认证中间件] +AuthMiddleware --> BusinessLogic[业务逻辑] +BusinessLogic --> ErrorHandler[错误处理中间件] +ErrorHandler --> Client +subgraph "认证策略" +WhiteList[白名单认证] +LoginAuth[登录认证] +IFrameAuth[iFrame认证] +end +AuthMiddleware --> WhiteList +AuthMiddleware --> LoginAuth +AuthMiddleware --> IFrameAuth +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) + +## 详细组件分析 + +### 认证中间件分析 +认证中间件是kami_backend安全体系的核心,实现了多模式的身份验证机制。该中间件通过`LoginOrIframeAuth`函数协调不同的认证策略,根据请求头中的`tokenFrom`字段选择适当的认证方式。 + +#### 认证流程类图 +```mermaid +classDiagram +class AuthMiddleware { ++LoginOrIframeAuth(r *ghttp.Request) ++whiteListAuth(r *ghttp.Request) gcode.Code ++loginAuth(r *ghttp.Request) gcode.Code ++iFrameAuth(r *ghttp.Request) gcode.Code +} +class TokenUtil { ++GetRequestToken(r *ghttp.Request) string ++ParseUserToken(ctx context.Context, tokenStr string) (*UserToken, error) ++RefreshUserToken(ctx context.Context, userToken UserToken) (string, error) ++GetTokenFromRedis(ctx context.Context, userID string, uuid string) (string, error) +} +class ConfigUtil { ++NewConfig(ctx context.Context) *Config ++GetTokenOptions() (TokenOptions, error) ++GetFrontendSecret() (SecretModel, error) +} +class CacheUtil { ++Set(ctx context.Context, key string, value interface{}, ttl time.Duration) error ++Get(ctx context.Context, key string) (*gvar.Var, error) ++Remove(ctx context.Context, key string) error +} +AuthMiddleware --> TokenUtil : "使用" +AuthMiddleware --> ConfigUtil : "使用" +TokenUtil --> CacheUtil : "使用" +TokenUtil --> ConfigUtil : "使用" +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +#### 认证流程序列图 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant AuthMiddleware as "认证中间件" +participant TokenUtil as "Token工具" +participant ConfigUtil as "配置工具" +participant Cache as "缓存系统" +Client->>AuthMiddleware : 发送API请求 +AuthMiddleware->>AuthMiddleware : 检查白名单 +alt 在白名单中 +AuthMiddleware-->>Client : 直接放行 +else 需要认证 +AuthMiddleware->>AuthMiddleware : 检查tokenFrom头 +alt tokenFrom=login +AuthMiddleware->>TokenUtil : GetRequestToken() +TokenUtil-->>AuthMiddleware : 返回Token +AuthMiddleware->>TokenUtil : ParseUserToken() +TokenUtil-->>AuthMiddleware : 返回用户Token信息 +AuthMiddleware->>Cache : GetTokenFromRedis() +Cache-->>AuthMiddleware : 返回缓存的Token +AuthMiddleware->>TokenUtil : RefreshUserToken() +TokenUtil-->>AuthMiddleware : 返回新Token +AuthMiddleware->>Client : 设置refresh-token头 +AuthMiddleware-->>Client : 放行请求 +else tokenFrom=iframe +AuthMiddleware->>TokenUtil : GetRequestToken() +TokenUtil-->>AuthMiddleware : 返回Token +AuthMiddleware->>ConfigUtil : GetFrontendSecret() +ConfigUtil-->>AuthMiddleware : 返回密钥和IV +AuthMiddleware->>Verify : AesCBCURLDecryptWithBase64() +Verify-->>AuthMiddleware : 解密Token +AuthMiddleware->>AuthMiddleware : 验证Token时效性 +AuthMiddleware-->>Client : 放行请求 +else 未知来源 +AuthMiddleware-->>Client : 返回"token来源不明"错误 +end +end +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +#### 白名单认证流程 +```mermaid +flowchart TD +Start([开始]) --> CheckPath["检查请求路径"] +CheckPath --> IsInWhiteList{"路径在白名单中?"} +IsInWhiteList --> |是| ReturnOK["返回CodeOK"] +IsInWhiteList --> |否| ReturnNotAuthorized["返回CodeNotAuthorized"] +ReturnOK --> End([结束]) +ReturnNotAuthorized --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L22-L51) + +### 错误处理中间件分析 +错误处理中间件负责捕获和格式化API响应,确保系统返回一致的错误信息格式。该中间件在请求处理链的末端执行,能够捕获业务逻辑层抛出的任何错误,并将其转换为标准化的JSON响应。 + +#### 错误处理流程 +```mermaid +flowchart TD +Start([开始]) --> NextMiddleware["执行后续中间件"] +NextMiddleware --> GetError["获取错误信息"] +GetError --> GetResponse["获取响应数据"] +GetError --> GetCode["获取错误码"] +GetCode --> IsNil{"错误码为空?"} +IsNil --> |是| SetNilCode["设置为CodeNil"] +IsNil --> |否| UseErrorCode["使用实际错误码"] +SetNilCode --> CheckError["检查是否有错误"] +UseErrorCode --> CheckError +CheckError --> HasError{"存在错误?"} +HasError --> |是| IsCritical{"是CodeNil或CodeInternalPanic?"} +HasError --> |否| End([结束]) +IsCritical --> |是| SetStatus200["设置状态码为200"] +IsCritical --> |否| End +SetStatus200 --> ClearBuffer["清空缓冲区"] +ClearBuffer --> WriteJson["写入JSON响应"] +WriteJson --> End +``` + +**Diagram sources** +- [error_handler.go](file://internal/middleware/error_handler.go#L8-L27) + +## 依赖分析 +kami_backend的中间件系统依赖于多个核心模块,形成了一个紧密耦合但职责分明的架构。认证中间件依赖于token、config和verify模块来实现完整的认证功能,而错误处理中间件则依赖于GoFrame框架的错误处理机制。 + +```mermaid +graph TD +AuthMiddleware[auth.go] --> Token[user_token.go] +AuthMiddleware --> Config[config.go] +AuthMiddleware --> Verify[verify.go] +Token --> Cache[cache.go] +Token --> Config +ErrorMiddleware[error_handler.go] --> GFError[gerror] +ErrorMiddleware --> GFCode[gcode] +ErrorMiddleware --> GFHttp[ghttp] +subgraph "utility" +Token +Config +Verify +Cache +end +subgraph "internal/middleware" +AuthMiddleware +ErrorMiddleware +end +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +## 性能考虑 +中间件系统的性能主要受Token验证和缓存操作的影响。认证中间件通过Redis缓存Token信息,避免了重复的JWT解析和验证操作,提高了认证效率。同时,白名单机制避免了对公开API的不必要的认证检查,进一步优化了性能。 + +## 故障排除指南 +当遇到中间件相关问题时,可以参考以下常见问题和解决方案: + +1. **Token验证失败**:检查`tokenFrom`头是否正确设置,确认Token格式是否正确。 +2. **认证超时**:检查配置中的Token超时设置,确认Redis缓存是否正常工作。 +3. **错误响应格式不一致**:确保所有业务逻辑都使用标准的错误码系统。 +4. **iFrame认证失败**:检查前端密钥和IV配置是否正确,确认Token加密方式是否匹配。 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go) +- [error_handler.go](file://internal/middleware/error_handler.go) +- [code.go](file://internal/errHandler/code.go) + +## 结论 +kami_backend的中间件系统设计合理,实现了安全性和可维护性的平衡。认证中间件通过灵活的策略支持多种认证方式,而错误处理中间件则确保了API响应的一致性。建议在开发新功能时遵循现有的中间件模式,确保系统的整体一致性和安全性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/外部集成.md b/.qoder/repowiki/zh/content/外部集成/外部集成.md new file mode 100644 index 00000000..a3be4713 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/外部集成.md @@ -0,0 +1,200 @@ +# 外部集成 + + +**本文档中引用的文件** +- [main.go](file://main.go) +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [api.go](file://utility/integration/redeem/jd/api.go) +- [api.go](file://utility/integration/redeem/ctrip/api.go) +- [api.go](file://utility/integration/redeem/walmart/api.go) +- [api.go](file://utility/integration/tmall/api/api.go) + + +## 目录 +1. [简介](#简介) +2. [电商平台API集成](#电商平台api集成) +3. [OpenTelemetry集成](#opentelemetry集成) +4. [Casbin权限系统集成](#casbin权限系统集成) +5. [故障排除指南](#故障排除指南) +6. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend系统的外部集成机制,涵盖第三方电商平台API集成、OpenTelemetry可观测性系统集成以及Casbin权限控制系统的实现。文档旨在为开发人员提供全面的技术指导,包括集成架构、配置选项、使用模式和技术决策。 + +## 电商平台API集成 + +kami_backend通过`utility/integration`包实现了与多个电商平台的集成,包括京东、天猫、Ctrip和沃尔玛等。每个平台都有独立的子包,遵循统一的设计模式和接口规范。 + +### 京东集成 +京东集成位于`utility/integration/redeem/jd`目录下,通过`Client`结构体封装API调用。该集成支持账户管理、订单提交和状态查询等核心功能。 + +**Section sources** +- [api.go](file://utility/integration/redeem/jd/api.go#L1-L5) + +### Ctrip集成 +Ctrip集成位于`utility/integration/redeem/ctrip`目录下,提供完整的API客户端实现。集成包括服务接口定义、数据模型和业务逻辑处理。 + +**Section sources** +- [api.go](file://utility/integration/redeem/ctrip/api.go#L1-L5) + +### 沃尔玛集成 +沃尔玛集成位于`utility/integration/redeem/walmart`目录下,通过`Client`结构体提供统一的访问接口。该集成支持多账户管理和订单生命周期跟踪。 + +**Section sources** +- [api.go](file://utility/integration/redeem/walmart/api.go#L1-L5) + +### 天猫集成 +天猫集成位于`utility/integration/tmall`目录下,采用单例模式通过`NewClient()`函数获取客户端实例。集成包含API调用、OAuth认证和定时任务同步功能。 + +```mermaid +classDiagram +class InnerClient { ++NewClient() *InnerClient +} +class api { ++NewClient() +} +class topsdk { ++topclient ++abilities +} +InnerClient --> api : "实现" +InnerClient --> topsdk : "依赖" +``` + +**Diagram sources** +- [api.go](file://utility/integration/tmall/api/api.go#L1-L20) + +**Section sources** +- [api.go](file://utility/integration/tmall/api/api.go#L1-L20) + +## OpenTelemetry集成 + +OpenTelemetry集成在`utility/otel`包中实现,提供统一的可观测性解决方案,包括链路追踪、指标收集和日志导出。 + +### 配置结构 +`Config`结构体定义了OpenTelemetry的配置参数,包括服务名称、收集器URL、安全设置和采样率等。默认配置通过`DefaultConfig()`函数提供。 + +```mermaid +classDiagram +class Config { ++ServiceName string ++CollectorURL string ++Insecure bool ++Compressor string ++Headers map[string]string ++Timeout time.Duration ++SampleRate float64 ++Enable bool ++ResourceAttrs []attribute.KeyValue ++Validate() error ++Clone() *Config +} +class Manager { ++NewOTelManager(config *Config) (*Manager, error) ++Shutdown(ctx context.Context) error ++GetConfig() *Config ++GetResource() *resource.Resource ++IsTracingEnabled() bool ++IsLoggingEnabled() bool ++CreateTracer(name string) oteltrace.Tracer ++CreateLogger(name string) otellog.Logger +} +Config --> Manager : "配置" +``` + +**Diagram sources** +- [config.go](file://utility/otel/config.go#L1-L68) +- [manager.go](file://utility/otel/manager.go#L1-L258) + +**Section sources** +- [config.go](file://utility/otel/config.go#L1-L68) +- [manager.go](file://utility/otel/manager.go#L1-L258) + +### 初始化流程 +系统启动时在`main.go`中调用`otel.InitWithConfig()`函数初始化OpenTelemetry。该函数创建`Manager`实例并配置追踪、日志和指标组件。 + +```mermaid +sequenceDiagram +participant Main as main.go +participant Otel as otel/utils.go +participant Manager as otel/manager.go +Main->>Otel : InitWithConfig(config) +Otel->>Manager : NewOTelManager(config) +Manager->>Manager : Validate配置 +Manager->>Manager : 创建资源 +Manager->>Manager : initTracing() +Manager->>Manager : initLogging() +Manager-->>Otel : 返回Manager +Otel-->>Main : nil +``` + +**Diagram sources** +- [main.go](file://main.go#L1-L50) +- [utils.go](file://utility/otel/utils.go#L22-L33) +- [manager.go](file://utility/otel/manager.go#L35-L86) + +**Section sources** +- [main.go](file://main.go#L1-L50) +- [utils.go](file://utility/otel/utils.go#L1-L50) + +## Casbin权限系统集成 + +Casbin权限系统基于RBAC模型实现,配置文件位于`resource/casbin/rbac_model.conf`。系统通过`g`规则定义角色继承关系,实现灵活的权限控制。 + +### RBAC模型配置 +模型定义了请求、策略、角色和匹配器四个核心部分。请求定义为`sub, obj, act`三元组,策略定义了具体的权限规则,角色定义支持层级继承。 + +```mermaid +erDiagram +USER ||--o{ ROLE : "拥有" +ROLE ||--o{ POLICY : "关联" +USER { +string username +string role +} +ROLE { +string name +string parent +} +POLICY { +string subject +string object +string action +string effect +} +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 故障排除指南 + +### OpenTelemetry初始化失败 +当OpenTelemetry初始化失败时,检查配置参数是否正确,特别是`ServiceName`和`CollectorURL`不能为空。确保网络连接正常,收集器服务可访问。 + +**Section sources** +- [config.go](file://utility/otel/config.go#L40-L52) +- [manager.go](file://utility/otel/manager.go#L50-L55) + +### 电商平台API调用失败 +检查API客户端配置是否正确,验证认证信息和端点URL。查看日志中的详细错误信息,确认网络连接和防火墙设置。 + +**Section sources** +- [api.go](file://utility/integration/redeem/jd/api.go#L1-L5) +- [api.go](file://utility/integration/tmall/api/api.go#L1-L20) + +### 权限验证失败 +确认用户角色分配正确,检查`sys_casbin_rule`表中的策略规则。验证请求的`sub, obj, act`三元组是否与策略匹配。 + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 结论 +kami_backend的外部集成设计遵循模块化和可扩展原则,通过清晰的包结构和接口定义实现了与多个第三方服务的无缝集成。OpenTelemetry提供了全面的可观测性支持,Casbin实现了灵活的权限控制,为系统的稳定运行和安全管理提供了坚实基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/权限系统集成.md b/.qoder/repowiki/zh/content/外部集成/权限系统集成.md new file mode 100644 index 00000000..396b3d84 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/权限系统集成.md @@ -0,0 +1,272 @@ +# 权限系统集成 + + +**本文档引用的文件** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [sys_casbin_rule.go](file://internal/dao/v_1_sys_casbin_rule.go) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) +- [sys_auth_rule.go](file://api/sys_auth_rule/v1/sys_auth_rule.go) +- [sys_role.go](file://api/sys_role/v1/sys_role.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend权限系统的集成实现,重点介绍基于Casbin的RBAC(基于角色的访问控制)模型的配置和实现机制。文档涵盖rbac_model.conf文件的结构和语法规则,权限验证的实现方式,以及动态更新权限策略的方法。同时解释了技术决策背后的原因,包括为何选择Casbin作为权限框架、性能优化策略和安全性考虑。 + +## 项目结构 +kami_backend的权限系统主要由Casbin模型配置、服务层接口、数据访问对象和实体模型组成。系统通过RBAC模型实现细粒度的访问控制,将用户、角色、权限和资源进行有效关联。 + +```mermaid +graph TB +subgraph "权限配置" +Model[rbac_model.conf] +end +subgraph "服务层" +Service[sys_casbin.go] +end +subgraph "数据层" +DAO[v_1_sys_casbin_rule.go] +Entity[v_1_sys_casbin_rule.go] +end +Model --> Service +Service --> DAO +DAO --> Entity +``` + +**图示来源** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) + +**章节来源** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) + +## 核心组件 +权限系统的核心组件包括Casbin模型定义、策略存储机制和权限验证服务。系统通过ICasbin接口提供统一的权限管理功能,包括策略的加载、保存、添加和删除操作。权限规则存储在sys_casbin_rule数据库表中,通过GORM进行数据持久化操作。 + +**章节来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) + +## 架构概述 +权限系统采用分层架构设计,从上到下分为接口层、服务层和数据层。接口层定义了权限管理所需的所有方法,服务层实现了具体的业务逻辑,数据层负责与数据库交互。 + +```mermaid +graph TD +A[API请求] --> B[权限验证中间件] +B --> C[Casbin Enforcer] +C --> D[策略匹配器] +D --> E[数据库策略存储] +E --> F[sys_casbin_rule表] +G[策略管理API] --> H[ICasbin接口] +H --> I[策略操作实现] +I --> E +``` + +**图示来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) + +## 详细组件分析 + +### RBAC模型配置分析 +Casbin的RBAC模型配置文件定义了权限系统的底层逻辑结构,包括请求定义、策略定义、角色定义、策略效果和匹配器。 + +#### 模型配置结构 +```mermaid +classDiagram +class RBACModel { ++request_definition : r = sub, obj, act ++policy_definition : p = sub, obj, act ++role_definition : g = _, _ ++policy_effect : e = some(where (p.eft == allow)) ++matchers : m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act +} +class Request { ++sub : subject ++obj : object ++act : action +} +class Policy { ++sub : subject ++obj : object ++act : action +} +RBACModel --> Request : "包含" +RBACModel --> Policy : "包含" +``` + +**图示来源** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +#### 配置部分详解 +- **[request_definition]**: 定义了权限检查请求的格式,包含主体(sub)、对象(obj)和动作(act)三个要素 +- **[policy_definition]**: 定义了策略规则的格式,与请求定义保持一致,便于匹配 +- **[role_definition]**: 定义了角色继承关系,g(_, _)表示角色之间的层级关系 +- **[policy_effect]**: 定义了策略生效的条件,some(where (p.eft == allow))表示只要有一条允许策略就通过 +- **[matchers]**: 定义了策略匹配逻辑,检查主体的角色、请求对象和动作是否与策略匹配 + +**章节来源** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + +### 权限服务实现分析 +权限服务实现了ICasbin接口,提供了完整的策略管理功能。 + +#### 服务接口与实现 +```mermaid +classDiagram +class ICasbin { +<> ++CasbinEnforcer(ctx) : *SyncedEnforcer, error ++SavePolicy(model) : error ++LoadPolicy(model) : error ++AddPolicy(sec, pType, rule) : error ++RemovePolicy(sec, pType, rule) : error ++AddPolicies(sec, pType, rules) : error ++RemovePolicies(sec, ptype, rules) : error ++RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues) : error +} +class sCasbin { +-Enforcer : *SyncedEnforcer +-EnforcerErr : error +-Ctx : context.Context ++CasbinEnforcer(ctx) : *SyncedEnforcer, error ++SavePolicy(model) : error ++LoadPolicy(model) : error ++AddPolicy(sec, pType, rule) : error ++RemovePolicy(sec, pType, rule) : error ++AddPolicies(sec, pType, rules) : error ++RemovePolicies(sec, ptype, rules) : error ++RemoveFilteredPolicy(sec, ptype, fieldIndex, fieldValues) : error +} +ICasbin <|-- sCasbin +``` + +**图示来源** +- [sys_casbin.go](file://internal/service/sys_casbin.go) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) + +#### 权限验证流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Middleware as "权限中间件" +participant Enforcer as "Casbin Enforcer" +participant DB as "数据库" +Client->>Middleware : 发送API请求 +Middleware->>Enforcer : 调用enforcer.Enforce() +Enforcer->>DB : 加载策略规则 +DB-->>Enforcer : 返回策略数据 +Enforcer->>Enforcer : 执行匹配器逻辑 +Enforcer-->>Middleware : 返回验证结果 +alt 验证通过 +Middleware->>Client : 继续处理请求 +else 验证失败 +Middleware->>Client : 返回403错误 +end +``` + +**图示来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [middleware/auth.go](file://internal/middleware/auth.go) + +**章节来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) + +### 数据模型分析 +权限系统的数据模型定义了策略在数据库中的存储结构。 + +#### 数据实体关系 +```mermaid +erDiagram +SYS_CASBIN_RULE { +string ptype PK +string v0 +string v1 +string v2 +string v3 +string v4 +string v5 +} +SYS_CASBIN_RULE ||--o{ SYS_ROLE : "角色策略" +SYS_CASBIN_RULE ||--o{ SYS_USER : "用户策略" +SYS_CASBIN_RULE ||--o{ AUTH_RULE : "权限规则" +``` + +**图示来源** +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) +- [v_1_sys_role.go](file://internal/model/entity/v_1_sys_role.go) + +#### 策略存储格式 +- **ptype**: 策略类型,'p'表示权限策略,'g'表示角色继承策略 +- **v0**: 第一个值,对于'p'类型是主体,对于'g'类型是用户 +- **v1**: 第二个值,对于'p'类型是对象,对于'g'类型是角色 +- **v2**: 第三个值,动作 +- **v3-v5**: 额外的参数值 + +**章节来源** +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) + +## 依赖分析 +权限系统依赖于多个核心组件和外部库,形成了完整的权限管理生态。 + +```mermaid +graph TD +A[Casbin库] --> B[Casbin Enforcer] +B --> C[权限服务] +C --> D[DAO层] +D --> E[数据库] +F[API控制器] --> C +G[中间件] --> C +H[配置系统] --> C +style A fill:#f9f,stroke:#333 +style E fill:#bbf,stroke:#333 +``` + +**图示来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [go.mod](file://go.mod) + +**章节来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [go.mod](file://go.mod) + +## 性能考虑 +权限系统在设计时考虑了多项性能优化策略,确保在高并发场景下的响应速度和系统稳定性。 + +1. **同步Enforcer**: 使用casbin.SyncedEnforcer而非普通Enforcer,确保多goroutine环境下的线程安全 +2. **策略缓存**: Casbin内置策略缓存机制,减少重复的数据库查询 +3. **批量操作**: 提供AddPolicies和RemovePolicies方法,支持批量策略操作,减少数据库交互次数 +4. **延迟初始化**: Enforcer实例采用once.Do进行延迟初始化,避免启动时的性能开销 + +## 故障排除指南 + +### 常见问题及解决方案 + +| 问题现象 | 可能原因 | 解决方案 | +|--------|--------|--------| +| 权限不生效 | 策略未正确加载 | 调用LoadPolicy重新加载策略 | +| 角色继承错误 | g规则定义不正确 | 检查v0和v1字段的角色继承关系 | +| 策略冲突 | 存在相互矛盾的策略 | 检查策略效果配置和匹配顺序 | +| 性能下降 | 策略数量过多 | 考虑策略分组或优化匹配器逻辑 | +| 动态更新失败 | 事务处理异常 | 检查数据库连接和事务完整性 | + +**章节来源** +- [sys_casbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [v_1_sys_casbin_rule.go](file://internal/model/entity/v_1_sys_casbin_rule.go) + +## 结论 +kami_backend的权限系统基于Casbin框架实现了灵活可靠的RBAC模型。通过清晰的分层架构和标准化的接口设计,系统能够有效管理复杂的权限关系。模型配置文件的结构化设计使得权限规则易于理解和维护,而完整的API支持则确保了策略的动态管理能力。整体设计兼顾了安全性、性能和可扩展性,为系统的稳定运行提供了有力保障。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/电商平台集成/Ctrip平台集成.md b/.qoder/repowiki/zh/content/外部集成/电商平台集成/Ctrip平台集成.md new file mode 100644 index 00000000..8a4b7b63 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/电商平台集成/Ctrip平台集成.md @@ -0,0 +1,299 @@ +# Ctrip平台集成 + + +**本文档引用文件** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) +- [card_info_c_trip_v1_account_list.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_list.go) +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go) +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go) +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go) +- [card_info_c_trip_v1_redeem_config_set.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_set.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) +- [redeem.go](file://utility/integration/redeem/redeem.go) +- [account.go](file://api/card_info_c_trip/v1/account.go) +- [order.go](file://api/card_info_c_trip/v1/order.go) +- [config.go](file://api/card_info_c_trip/v1/config.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend如何通过redeem/ctrip包集成Ctrip API,涵盖Ctrip账户管理、卡密兑换、订单回调等功能的实现机制。文档重点阐述了Ctrip客户端的认证方式、API调用模式、异步回调处理和错误处理策略,并提供具体的代码示例展示核心功能的调用方式。 + +## 项目结构 +Ctrip平台集成主要位于`api/card_info_c_trip`和`internal/controller/card_info_c_trip`目录下,通过v1版本的API接口提供服务。核心功能包括账户管理、订单处理和配置管理,通过`utility/integration/redeem/ctrip`包与Ctrip API进行交互。 + +```mermaid +graph TB +subgraph "API层" +AccountAPI["/cardInfo/cTrip/account/*"] +OrderAPI["/cardInfo/cTrip/order/*"] +ConfigAPI["/cardInfo/cTrip/config/*"] +end +subgraph "控制器层" +AccountController["card_info_c_trip_v1_account_*.go"] +OrderController["card_info_c_trip_v1_order_*.go"] +ConfigController["card_info_c_trip_v1_redeem_config_*.go"] +end +subgraph "服务层" +RedeemOrderService["CardRedeemOrder()"] +RedeemAccountService["CardRedeemAccount()"] +SysConfigDictService["SysConfigDict()"] +end +subgraph "集成层" +CtripClient["utility/integration/redeem/ctrip/service.go"] +end +AccountAPI --> AccountController +OrderAPI --> OrderController +ConfigAPI --> ConfigController +AccountController --> RedeemAccountService +OrderController --> RedeemOrderService +ConfigController --> SysConfigDictService +RedeemOrderService --> CtripClient +RedeemAccountService --> CtripClient +``` + +**图示来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) + +## 核心组件 +系统通过`card_info_c_trip`包实现Ctrip平台的完整集成,主要包含账户管理、卡密兑换、订单回调和配置管理四大核心功能。所有操作均通过统一的认证机制和错误处理策略进行管理。 + +**组件来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go#L1-L60) +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go#L1-L30) +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go#L1-L24) + +## 架构概述 +系统采用分层架构设计,从API接口到后端服务再到外部集成,各层职责分明。API层定义接口规范,控制器层处理业务逻辑,服务层封装核心功能,集成层负责与Ctrip API通信。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant Ctrip as "Ctrip API" +Client->>API : 创建Ctrip账户请求 +API->>Controller : 转发请求 +Controller->>Service : 验证用户权限 +Service->>Service : 获取Ctrip客户端实例 +Service->>Ctrip : 查询用户信息 +Ctrip-->>Service : 返回用户信息 +Service->>Ctrip : 查询账户余额 +Ctrip-->>Service : 返回余额信息 +Service->>Service : 检查账户是否已存在 +Service-->>Controller : 准备创建账户 +Controller-->>API : 返回创建结果 +API-->>Client : 响应客户端 +``` + +**图示来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) + +## 详细组件分析 + +### Ctrip账户管理分析 +系统提供完整的Ctrip账户管理功能,包括账户创建、列表查询、状态更新和删除等操作。账户信息存储在系统数据库中,并与用户权限绑定。 + +#### 账户创建流程 +```mermaid +flowchart TD +Start([开始]) --> AuthCheck["验证用户登录状态"] +AuthCheck --> AuthValid{"认证通过?"} +AuthValid --> |否| ReturnError["返回权限不足错误"] +AuthValid --> |是| TrimCookie["清理Cookie空白字符"] +TrimCookie --> GetClient["获取Ctrip客户端实例"] +GetClient --> QueryUserInfo["查询用户信息"] +QueryUserInfo --> UserInfoValid{"用户信息有效?"} +UserInfoValid --> |否| ReturnInvalid["返回Cookie失效"] +UserInfoValid --> |是| CheckExist["检查账户是否已存在"] +CheckExist --> Exist{"账户已存在?"} +Exist --> |是| ReturnExist["返回账户已存在错误"] +Exist --> |否| QueryBalance["查询账户余额"] +QueryBalance --> BalanceValid{"余额查询成功?"} +BalanceValid --> |否| ReturnBalanceError["返回余额查询失败"] +BalanceValid --> |是| AddAccount["添加账户到数据库"] +AddAccount --> TriggerConsume["触发订单验证和消费"] +TriggerConsume --> End([结束]) +``` + +**图示来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go) +- [card_info_c_trip_v1_account_list.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_list.go) + +**组件来源** +- [card_info_c_trip_v1_account_create.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go#L20-L55) +- [card_info_c_trip_v1_account_list.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_list.go#L10-L55) + +### 卡密兑换功能分析 +卡密兑换功能是系统的核心业务之一,负责处理用户提交的卡密兑换请求,并与Ctrip API进行交互完成兑换操作。 + +#### 卡密兑换流程 +```mermaid +flowchart TD +Start([开始]) --> LogRequest["记录请求日志"] +LogRequest --> GetOrderService["获取订单服务实例"] +GetOrderService --> AddOrder["添加兑换订单"] +AddOrder --> AddSuccess{"添加成功?"} +AddSuccess --> |否| EndWithError["结束并返回错误"] +AddSuccess --> |是| TriggerValidate["触发验证和消费"] +TriggerValidate --> End([结束]) +``` + +**图示来源** +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go) + +**组件来源** +- [card_info_c_trip_v1_submit.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go#L1-L30) +- [order.go](file://api/card_info_c_trip/v1/order.go#L1-L22) + +### 订单回调处理分析 +订单回调功能允许系统手动触发订单状态更新的回调通知,确保上游系统能够及时获取订单处理结果。 + +#### 回调处理流程 +```mermaid +flowchart TD +Start([开始]) --> AuthCheck["验证用户权限"] +AuthCheck --> OrderCheck["查询订单信息"] +OrderCheck --> OrderExists{"订单存在?"} +OrderExists --> |否| ReturnError["返回订单不存在"] +OrderExists --> |是| OwnerCheck["验证订单归属"] +OwnerCheck --> OwnerValid{"权限匹配?"} +OwnerCheck --> |否| ReturnAuthError["返回权限不足"] +OwnerValid --> CallbackStatus{"已回调过?"} +CallbackStatus --> |是| ReturnCallbacked["返回已回调"] +CallbackStatus --> |否| OrderStatus{"订单状态完成?"} +OrderStatus --> |否| ReturnNotFinished["返回未完成"] +OrderStatus --> |是| AmountDiff{"金额异议?"} +AmountDiff --> |是| ReturnNotAllow["返回不支持"] +AmountDiff --> |否| TriggerCallback["触发回调"] +TriggerCallback --> End([结束]) +``` + +**图示来源** +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go) + +**组件来源** +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go#L1-L53) +- [order.go](file://api/card_info_c_trip/v1/order.go#L21-L55) + +### 配置管理分析 +系统提供Ctrip兑换配置的获取和设置功能,允许管理员调整平台的运营参数。 + +#### 配置获取流程 +```mermaid +flowchart TD +Start([开始]) --> InitRes["初始化响应对象"] +InitRes --> GetAllowDiff["获取金额异议设置"] +GetAllowDiff --> GetMinAmount["获取最小充值金额"] +GetMinAmount --> GetSucceedCallback["获取成功回调设置"] +GetSucceedCallback --> GetFailCallback["获取失败回调设置"] +GetFailCallback --> GetCompensated["获取补卡回调设置"] +GetCompensated --> GetRate["获取充值速率"] +GetRate --> ReturnRes["返回配置信息"] +ReturnRes --> End([结束]) +``` + +**图示来源** +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go) + +**组件来源** +- [card_info_c_trip_v1_redeem_config_get.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_get.go#L1-L24) +- [card_info_c_trip_v1_redeem_config_set.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_redeem_config_set.go#L1-L18) +- [config.go](file://api/card_info_c_trip/v1/config.go) + +## 依赖分析 +系统通过清晰的依赖关系实现了Ctrip平台的集成,各组件之间的依赖关系如下: + +```mermaid +classDiagram +class CtripClient { ++BindCard(ctx, input) result, err ++QueryBalance(ctx, input) result, err ++QueryUserInfo(ctx, cookie) result, err +} +class CardRedeemOrderService { ++AddOne(ctx, input) result, err ++TriggerValidateAndConsume() err ++CallBackOrderToUpstream(ctx, orderNo, force) err +} +class CardRedeemAccountService { ++Add(ctx, input, tx) err ++List(ctx, input) total, list, err ++UpdateStatus(ctx, id, status, tx) err ++Delete(ctx, id, category, tx) err +} +class SysConfigDictService { ++GetIsAllowRedeemCardDifferentAmount(ctx, category) bool, err ++SetIsAllowRedeemCardDifferentAmount(ctx, category, value) err ++GetRedeemCardMinAmount(ctx, category) int64 ++SetRedeemCardMinAmount(ctx, category, value) err +} +class AccountController { ++AccountCreate(ctx, req) res, err ++AccountList(ctx, req) res, err ++AccountUpdateStatus(ctx, req) res, err ++AccountDelete(ctx, req) res, err +} +class OrderController { ++Submit(ctx, req) res, err ++List(ctx, req) res, err ++OrderCallback(ctx, req) res, err +} +class ConfigController { ++RedeemConfigGet(ctx, req) res, err ++RedeemConfigSet(ctx, req) res, err +} +AccountController --> CardRedeemAccountService : "使用" +OrderController --> CardRedeemOrderService : "使用" +ConfigController --> SysConfigDictService : "使用" +AccountController --> CtripClient : "通过服务层使用" +OrderController --> CtripClient : "通过服务层使用" +CardRedeemOrderService --> CtripClient : "直接使用" +CardRedeemAccountService --> CtripClient : "直接使用" +``` + +**图示来源** +- [redeem.go](file://utility/integration/redeem/redeem.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_redeem_account.go](file://internal/service/card_redeem_account.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + +## 性能考虑 +系统在设计时考虑了性能优化,主要体现在以下几个方面: +- 使用缓存机制减少对Ctrip API的重复调用 +- 实现接口限流防止恶意请求 +- 异步处理订单验证和消费 +- 批量操作支持提高处理效率 + +## 故障排除指南 +### 常见问题及解决方案 + +| 问题现象 | 可能原因 | 解决方案 | +|---------|--------|---------| +| 回调验证失败 | 权限不足或订单状态不正确 | 检查用户权限和订单状态,确保订单已完成处理 | +| 账户状态同步延迟 | 缓存机制导致数据延迟 | 调整缓存时间或手动刷新账户状态 | +| 兑换结果不明确 | Ctrip API返回信息不清晰 | 检查API返回的原始数据,增加日志记录 | +| Cookie检测不可用 | Cookie已过期或格式错误 | 重新获取有效Cookie,确保格式正确 | +| 配置更新不生效 | 缓存未刷新或服务未重启 | 清除相关缓存,必要时重启服务 | + +**组件来源** +- [card_info_c_trip_v1_account_cookie_check.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_account_cookie_check.go#L1-L48) +- [card_info_c_trip_v1_order_callback.go](file://internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go#L1-L53) + +## 结论 +kami_backend通过redeem/ctrip包实现了与Ctrip平台的完整集成,提供了账户管理、卡密兑换、订单回调等核心功能。系统采用分层架构设计,具有良好的可维护性和扩展性。通过合理的认证机制、错误处理策略和性能优化,确保了系统的稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/电商平台集成/京东平台集成.md b/.qoder/repowiki/zh/content/外部集成/电商平台集成/京东平台集成.md new file mode 100644 index 00000000..e02b1dce --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/电商平台集成/京东平台集成.md @@ -0,0 +1,280 @@ +# 京东平台集成 + + +**本文档引用文件** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_jd_v1_account_list.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_list.go) +- [place.go](file://internal/logic/card_redeem_cookie/place.go) +- [order.go](file://internal/logic/card_redeem_cookie/order.go) +- [client.go](file://utility/integration/originalJd/client.go) +- [client.go](file://utility/integration/redeem/client/client.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) +- [originalJd/enums.go](file://utility/integration/originalJd/enums.go) +- [card_jd.go](file://internal/consts/card_jd.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考量](#性能考量) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend如何通过`redeem/jd`包集成京东API,涵盖京东卡密兑换、账户管理、订单查询等功能的实现机制。文档深入解析了京东客户端的认证方式(如Cookie认证)、API调用模式、错误处理策略和重试机制。同时提供京东API的配置参数说明、请求/响应数据结构、状态码含义和性能优化建议,并解释集成过程中的技术决策,如HTTP客户端配置、超时设置和连接池大小选择。最后提供常见集成问题的故障排除指南。 + +## 项目结构 +京东平台集成功能主要分布在`api/card_redeem_jd`和`internal/controller/card_redeem_jd`目录下,通过`utility/integration/originalJd`和`utility/integration/redeem`实现底层京东API调用。系统采用分层架构,API层定义接口,控制器层处理业务逻辑,服务层封装核心功能,集成层负责与京东API通信。 + +```mermaid +graph TB +subgraph "API层" +A[card_redeem_jd] +A1[account.go] +A2[order.go] +end +subgraph "控制器层" +B[card_redeem_jd] +B1[account_list.go] +B2[place_order.go] +end +subgraph "服务层" +C[card_redeem_cookie.go] +end +subgraph "集成层" +D[originalJd] +D1[client.go] +E[redeem] +E1[client.go] +end +A --> B +B --> C +C --> D +C --> E +``` + +**图示来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [client.go](file://utility/integration/originalJd/client.go) + +**章节来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) + +## 核心组件 +核心组件包括京东账户管理、订单处理、Cookie认证和API客户端。系统通过`CardRedeemJdV1`接口定义京东相关操作,包括账户增删改查、状态管理、订单查询和下单功能。服务层`ICardRedeemCookie`接口封装了底层业务逻辑,而`originalJd.Client`负责与京东API进行实际通信。 + +**章节来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) + +## 架构概览 +系统采用分层架构设计,从API接口到京东API调用形成清晰的调用链路。用户请求首先通过API层进入,由控制器处理并调用服务层,服务层协调业务逻辑并调用集成层的京东客户端,最终完成与京东API的交互。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant API as "API接口" +participant Controller as "控制器" +participant Service as "服务层" +participant ClientJd as "京东客户端" +participant JD as "京东API" +Client->>API : 发送请求 +API->>Controller : 调用处理方法 +Controller->>Service : 调用业务逻辑 +Service->>ClientJd : 调用京东客户端 +ClientJd->>JD : HTTP请求 +JD-->>ClientJd : 响应数据 +ClientJd-->>Service : 返回结果 +Service-->>Controller : 返回处理结果 +Controller-->>API : 返回响应 +API-->>Client : 返回最终结果 +Note over Client,JD : 京东API集成完整调用流程 +``` + +**图示来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) +- [client.go](file://utility/integration/originalJd/client.go) + +## 详细组件分析 + +### 账户管理分析 +账户管理功能提供京东Cookie账户的全生命周期管理,包括添加、更新、查询、删除和状态管理。系统通过`AccountAdd`、`AccountUpdate`、`AccountGet`、`AccountList`、`AccountDelete`和`AccountStatus`等接口实现账户操作。 + +```mermaid +classDiagram +class AccountEntity { ++string Name ++string Cookie ++CardRedeemCookieStatus Status ++string Notes +} +class AccountAddReq { ++AccountEntity +} +class AccountUpdateReq { ++AccountEntity ++CommonIntId +} +class AccountGetReq { ++CommonIntId +} +class AccountListReq { ++CommonPageReq ++CardRedeemCookieStatus Status ++string Name ++string Cookie +} +class AccountDeleteReq { ++CommonIntId +} +class AccountStatusReq { ++CommonIntId ++CardRedeemCookieStatus Status +} +AccountAddReq --> AccountEntity +AccountUpdateReq --> AccountEntity +AccountGetReq --> CommonIntId +AccountListReq --> CommonPageReq +AccountDeleteReq --> CommonIntId +AccountStatusReq --> CommonIntId +``` + +**图示来源** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) + +**章节来源** +- [account.go](file://api/card_redeem_jd/v1/account.go) +- [card_redeem_jd_v1_account_list.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_account_list.go) + +### 订单处理分析 +订单处理功能包括订单查询和下单操作。系统通过`OrderList`接口查询订单列表,通过`PlaceOrder`接口创建新订单。下单流程涉及账户调度、京东API调用、订单状态更新和支付链接生成。 + +```mermaid +flowchart TD +Start([下单请求]) --> ValidateInput["验证输入参数"] +ValidateInput --> InputValid{"参数有效?"} +InputValid --> |否| ReturnError["返回错误"] +InputValid --> |是| ScheduleAccount["调度京东账户"] +ScheduleAccount --> AccountValid{"账户有效?"} +AccountValid --> |否| ReturnError +AccountValid --> |是| CallJD["调用京东API"] +CallJD --> JDSuccess{"京东返回成功?"} +JDSuccess --> |否| UpdateStatus["更新账户状态"] +JDSuccess --> |是| SaveOrder["保存订单信息"] +SaveOrder --> GenerateLink["生成支付链接"] +GenerateLink --> ReturnSuccess["返回成功响应"] +UpdateStatus --> ReturnError +ReturnError --> End([结束]) +ReturnSuccess --> End +``` + +**图示来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [place.go](file://internal/logic/card_redeem_cookie/place.go) +- [client.go](file://utility/integration/originalJd/client.go) + +**章节来源** +- [order.go](file://api/card_redeem_jd/v1/order.go) +- [card_redeem_jd_v1_place_order.go](file://internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go) + +### 认证机制分析 +系统采用Cookie认证方式与京东API交互。京东账户信息包含Cookie字符串,系统通过`originalJd.Client`使用这些Cookie进行API调用。当Cookie失效时,系统会自动更新账户状态为"expired"。 + +```mermaid +sequenceDiagram +participant System as "系统" +participant JD as "京东API" +participant Account as "京东账户" +System->>Account : 获取有效账户 +Account-->>System : 返回账户信息(含Cookie) +System->>JD : 调用API(携带Cookie) +alt Cookie有效 +JD-->>System : 返回成功响应 +System->>Account : 记录成功交易 +else Cookie失效 +JD-->>System : 返回CK错误 +System->>Account : 更新状态为expired +System->>Account : 调度新账户 +end +System-->>调用方 : 返回处理结果 +``` + +**图示来源** +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) +- [place.go](file://internal/logic/card_redeem_cookie/place.go) +- [client.go](file://utility/integration/originalJd/client.go) + +**章节来源** +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) +- [place.go](file://internal/logic/card_redeem_cookie/place.go) + +## 依赖分析 +系统依赖关系清晰,上层组件依赖下层服务,形成单向依赖链。API层依赖控制器层,控制器层依赖服务层,服务层依赖集成层,集成层直接与外部京东API通信。 + +```mermaid +graph TD +A[API层] --> B[控制器层] +B --> C[服务层] +C --> D[集成层] +D --> E[京东API] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#f96,stroke:#333 +style D fill:#6f9,stroke:#333 +style E fill:#9f9,stroke:#333 +click A "api/card_redeem_jd" +click B "internal/controller/card_redeem_jd" +click C "internal/service/card_redeem_cookie" +click D "utility/integration/originalJd" +``` + +**图示来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) +- [client.go](file://utility/integration/originalJd/client.go) + +**章节来源** +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [card_redeem_cookie.go](file://internal/service/card_redeem_cookie.go) + +## 性能考量 +系统在性能方面进行了多项优化,包括连接池管理、请求超时控制和错误重试机制。京东API客户端使用GoFrame的gclient,支持连接复用和超时设置,确保高并发场景下的稳定性能。 + +**章节来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [topsdk/topclient.go](file://utility/integration/tmall/topsdk/topclient.go) + +## 故障排除指南 +### 认证失败 +当出现认证失败时,检查京东Cookie是否有效。系统会自动检测Cookie状态,若返回CK错误,账户状态将被更新为"expired"。解决方案包括重新获取有效Cookie并更新账户信息。 + +### 接口限流 +系统对接口访问进行了限流控制,同一用户一分钟内最多访问5次。若出现"操作过于频繁"错误,需等待一段时间后重试。可通过调整`limiter.CardInfoJdAccountCookieChecker`的配置参数来修改限流规则。 + +### 数据格式不匹配 +当出现数据格式不匹配错误时,检查请求参数是否符合API定义。特别是金额字段应为浮点数,订单ID应为字符串。确保请求Content-Type为application/json,并正确序列化请求体。 + +### 账户状态异常 +系统定义了多种账户状态,包括"normal"(正常)、"disable"(禁用)、"expired"(时效)、"tmpDisable"(临时禁用)。当账户状态异常时,可根据具体状态采取相应措施,如重新激活禁用账户或更新失效Cookie。 + +**章节来源** +- [card_redeem_cookie.go](file://internal/consts/card_redeem_cookie.go) +- [card_jd.go](file://internal/consts/card_jd.go) +- [card_redeem.go](file://internal/consts/card_redeem.go) + +## 结论 +kami_backend通过`redeem/jd`包实现了完整的京东平台集成,支持卡密兑换、账户管理和订单查询等核心功能。系统采用分层架构设计,具有良好的可维护性和扩展性。通过Cookie认证机制与京东API通信,实现了稳定可靠的集成方案。文档详细说明了各组件的功能、交互流程和错误处理策略,为后续维护和扩展提供了完整的技术参考。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/电商平台集成/天猫平台集成.md b/.qoder/repowiki/zh/content/外部集成/电商平台集成/天猫平台集成.md new file mode 100644 index 00000000..472ad9e3 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/电商平台集成/天猫平台集成.md @@ -0,0 +1,249 @@ +# 天猫平台集成 + + +**本文档引用文件** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend如何通过tmall包集成天猫API,重点涵盖天猫游戏卡密充值、账户授权、订单处理等功能的实现机制。文档深入解析了天猫客户端的OAuth认证流程、TOP API调用模式、消息队列处理和错误恢复机制。同时提供天猫API的配置参数说明、请求/响应数据结构、状态码含义和性能优化建议,并解释集成过程中的技术决策与常见问题解决方案。 + +## 项目结构 +天猫平台集成功能主要分布在`api/card_info_t_mall_game`、`internal/controller/card_info_t_mall_game`、`internal/model`和`utility/cron`等目录中。核心功能包括账户授权、订单提交、状态查询和数据同步。 + +```mermaid +graph TD +subgraph "API接口层" +A[account.go] +B[order.go] +C[sync.go] +end +subgraph "控制器层" +D[card_info_t_mall_game/] +E[authorize_callback.go] +F[order_submit.go] +G[data_sync.go] +end +subgraph "模型层" +H[card_t_mall_game_account.go] +I[card_t_mall_game_order.go] +end +subgraph "定时任务" +J[cron/t_mall_game_data_sync.go] +end +A --> D +B --> D +C --> D +D --> H +D --> I +J --> D +``` + +**图示来源** +- [account.go](file://api/card_info_t_mall_game/v1/account.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [card_t_mall_game_account.go](file://internal/model/card_t_mall_game_account.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +**章节来源** +- [api/card_info_t_mall_game](file://api/card_info_t_mall_game) +- [internal/controller/card_info_t_mall_game](file://internal/controller/card_info_t_mall_game) +- [internal/model](file://internal/model) +- [utility/cron](file://utility/cron) + +## 核心组件 +核心组件包括天猫账户授权、订单提交、订单查询和数据同步功能。系统通过OAuth2.0实现天猫店铺授权,使用TOP API进行订单创建和状态同步,并通过定时任务实现数据的周期性同步。 + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +## 架构概述 +系统采用分层架构,包括API接口层、控制器层、服务层和数据访问层。天猫集成通过独立的控制器处理所有天猫相关请求,使用统一的数据模型进行数据交换,并通过定时任务实现与天猫平台的数据同步。 + +```mermaid +graph TB +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> DAO[数据访问层] +DAO --> DB[(数据库)] +Cron[定时任务] --> API +API --> External[天猫平台] +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) + +## 详细组件分析 + +### 账户授权分析 +天猫账户授权通过OAuth2.0协议实现,系统提供授权回调接口处理天猫返回的授权码,并使用TOP SDK完成令牌交换。 + +```mermaid +sequenceDiagram +participant 用户 +participant kami_backend +participant 天猫平台 +用户->>kami_backend : 请求授权 +kami_backend->>天猫平台 : 重定向到天猫授权页面 +天猫平台->>用户 : 显示授权页面 +用户->>天猫平台 : 同意授权 +天猫平台->>kami_backend : 回调携带授权码 +kami_backend->>kami_backend : 调用OAuth2Login获取访问令牌 +kami_backend->>用户 : 返回授权结果 +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [account.go](file://api/card_info_t_mall_game/v1/account.go) + +### 订单处理分析 +订单处理流程包括订单创建、状态查询和数据同步,确保订单状态的准确性和一致性。 + +#### 订单创建流程 +```mermaid +flowchart TD +Start([接收订单请求]) --> Validate["验证账号信息"] +Validate --> AccountValid{"账号有效?"} +AccountValid --> |否| ReturnError["返回账号错误"] +AccountValid --> |是| CreateOrder["创建订单记录"] +CreateOrder --> SaveDB["保存到数据库"] +SaveDB --> ReturnSuccess["返回订单号"] +ReturnError --> End([结束]) +ReturnSuccess --> End +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) + +#### 订单查询流程 +```mermaid +flowchart TD +Start([接收查询请求]) --> FindOrder["查找订单"] +FindOrder --> OrderExists{"订单存在?"} +OrderExists --> |否| ReturnEmpty["返回空结果"] +OrderExists --> |是| GetAccount["获取关联账号"] +GetAccount --> GetShop["获取店铺信息"] +GetShop --> Assemble["组装响应数据"] +Assemble --> ReturnResult["返回查询结果"] +ReturnEmpty --> End([结束]) +ReturnResult --> End +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_order_submit.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go) +- [card_info_t_mall_game_v1_t_mall_game_order_query_order.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go) +- [order.go](file://api/card_info_t_mall_game/v1/order.go) +- [card_t_mall_game_order.go](file://internal/model/card_t_mall_game_order.go) + +### 数据同步分析 +数据同步机制通过定时任务定期从天猫平台拉取最新数据,确保本地数据库与天猫平台数据的一致性。 + +```mermaid +sequenceDiagram +participant Cron as "定时任务" +participant API as "API服务" +participant DB as "本地数据库" +participant TMall as "天猫平台" +Cron->>API : 发起数据同步请求 +API->>TMall : 调用天猫API获取数据 +TMall-->>API : 返回最新数据 +API->>DB : 保存账号数据 +API->>DB : 保存店铺数据 +API->>DB : 保存订单数据 +API->>DB : 保存历史数据 +DB-->>API : 确认保存结果 +API-->>Cron : 返回同步结果 +``` + +**图示来源** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +**章节来源** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) +- [sync.go](file://api/card_info_t_mall_game/v1/sync.go) + +## 依赖分析 +系统依赖于天猫TOP SDK进行API调用,依赖数据库存储账户和订单信息,并通过配置中心管理天猫API的配置参数。 + +```mermaid +graph TD +kami_backend --> tmall_sdk[天猫TOP SDK] +kami_backend --> database[MySQL数据库] +kami_backend --> config[配置中心] +kami_backend --> cron[定时任务系统] +tmall_sdk --> tmall_api[天猫API] +database --> storage[数据存储] +config --> settings[AppKey, AppSecret等] +``` + +**图示来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [config.go](file://utility/config/config.go) + +## 性能考虑 +为确保系统性能,采用了以下优化措施: +- 使用数据库索引加速订单和账户查询 +- 实现数据缓存减少重复查询 +- 采用批量操作提高数据同步效率 +- 设置合理的超时时间避免请求堆积 +- 通过分页查询控制单次返回数据量 + +## 故障排除指南 +### OAuth令牌过期 +当OAuth令牌过期时,系统会返回授权错误。解决方案是重新发起授权流程,获取新的访问令牌。 + +**章节来源** +- [card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go) + +### 消息重复消费 +通过订单号的唯一性约束和幂等性设计,确保即使消息重复消费也不会产生重复订单。 + +### 订单状态不一致 +通过定时数据同步机制定期校准本地订单状态与天猫平台状态,解决状态不一致问题。 + +**章节来源** +- [t_mall_game_data_sync.go](file://utility/cron/t_mall_game_data_sync.go) +- [card_info_t_mall_game_v1_t_mall_game_data_sync.go](file://internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go) + +## 结论 +kami_backend通过完善的天猫平台集成方案,实现了稳定的账户授权、订单处理和数据同步功能。系统采用分层架构和定时同步机制,确保了与天猫平台的数据一致性,同时提供了完整的错误处理和故障排除机制。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/电商平台集成/沃尔玛平台集成.md b/.qoder/repowiki/zh/content/外部集成/电商平台集成/沃尔玛平台集成.md new file mode 100644 index 00000000..f53f02e0 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/电商平台集成/沃尔玛平台集成.md @@ -0,0 +1,310 @@ +# 沃尔玛平台集成 + + +**本文档引用文件** +- [walmart/api.go](file://utility/integration/redeem/walmart/api.go) +- [account.go](file://api/card_info_walmart/v1/account.go) +- [order.go](file://api/card_info_walmart/v1/order.go) +- [config.go](file://api/card_info_walmart/v1/config.go) +- [group.go](file://api/card_info_walmart/v1/group.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) +- [card_info_walmart_v1_order_history.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_history.go) +- [card_info_walmart_v1_redeem_config_get.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_redeem_config_get.go) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend如何通过redeem/walmart包集成沃尔玛API,涵盖沃尔玛账户管理、卡密兑换、订单处理等功能的实现机制。重点解析了沃尔玛客户端的认证方式、API调用模式、分组管理策略和错误处理机制。文档还提供了核心功能的调用示例、配置参数说明、数据结构定义、状态码含义及性能优化建议,并解释了关键技术决策背后的原理。 + +## 项目结构 +kami_backend项目中与沃尔玛平台集成相关的文件主要分布在`api/card_info_walmart`和`utility/integration/redeem/walmart`目录下。该结构实现了清晰的分层设计,将API接口定义、控制器逻辑和第三方服务集成分离。 + +```mermaid +graph TB +subgraph API层 +A[account.go] +B[order.go] +C[config.go] +D[group.go] +end +subgraph 控制器层 +E[card_info_walmart_v1_account_create.go] +F[card_info_walmart_v1_submit.go] +G[card_info_walmart_v1_order_history.go] +H[card_info_walmart_v1_redeem_config_get.go] +I[card_info_walmart_v1_group_add.go] +J[card_info_walmart_v1_group_list.go] +end +subgraph 集成层 +K[utility/integration/redeem/walmart/api.go] +end +A --> E +B --> F +B --> G +C --> H +D --> I +D --> J +E --> K +F --> K +G --> K +H --> K +I --> K +J --> K +``` + +**图示来源** +- [account.go](file://api/card_info_walmart/v1/account.go) +- [order.go](file://api/card_info_walmart/v1/order.go) +- [config.go](file://api/card_info_walmart/v1/config.go) +- [group.go](file://api/card_info_walmart/v1/group.go) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go) +- [card_info_walmart_v1_order_history.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_order_history.go) +- [card_info_walmart_v1_redeem_config_get.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_redeem_config_get.go) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go) + +**章节来源** +- [api/card_info_walmart](file://api/card_info_walmart) +- [internal/controller/card_info_walmart](file://internal/controller/card_info_walmart) +- [utility/integration/redeem/walmart](file://utility/integration/redeem/walmart) + +## 核心组件 +沃尔玛平台集成的核心组件包括账户管理、订单处理、配置管理和分组管理四大模块。这些组件通过清晰的接口定义和分层架构协同工作,实现了对沃尔玛API的完整封装和业务逻辑处理。 + +**章节来源** +- [account.go](file://api/card_info_walmart/v1/account.go#L1-L242) +- [order.go](file://api/card_info_walmart/v1/order.go#L1-L92) +- [config.go](file://api/card_info_walmart/v1/config.go#L1-L40) +- [group.go](file://api/card_info_walmart/v1/group.go#L1-L81) + +## 架构概述 +沃尔玛平台集成采用分层架构设计,从上至下分为API接口层、控制器层和集成服务层。这种设计模式实现了关注点分离,提高了代码的可维护性和可测试性。 + +```mermaid +graph TD +Client[客户端] --> API[API接口] +API --> Controller[控制器] +Controller --> Service[服务层] +Service --> Integration[沃尔玛集成] +Integration --> WalmartAPI[沃尔玛API] +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style Integration fill:#69f,stroke:#333 +style WalmartAPI fill:#9f9,stroke:#333 +``` + +**图示来源** +- [walmart/api.go](file://utility/integration/redeem/walmart/api.go#L1-L3) +- [account.go](file://api/card_info_walmart/v1/account.go#L1-L242) +- [order.go](file://api/card_info_walmart/v1/order.go#L1-L92) +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go#L1-L73) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L1-L32) + +## 详细组件分析 + +### 账户管理分析 +账户管理组件负责沃尔玛账户的创建、更新、删除和状态检测。系统通过Cookie进行身份验证,并在创建账户时验证Cookie的有效性。 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 服务层 +participant ClientInt as 沃尔玛客户端 +Client->>Controller : POST /cardInfo/walmart/account/create +Controller->>Service : LoginOnlyLogin() +Controller->>ClientInt : GetClient(WALMART) +Controller->>ClientInt : QueryUserInfoWithCache() +alt Cookie无效 +ClientInt-->>Controller : 返回错误 +Controller-->>Client : 400 Cookie失效 +else Cookie有效 +Controller->>Service : GetNormalOneByCk() +alt 账户已存在 +Service-->>Controller : 返回存在信息 +Controller-->>Client : 400 账号已存在 +else 新账户 +Controller->>ClientInt : QueryBalanceWithCache() +Controller->>Service : Add()创建账户 +Service-->>Controller : 成功 +Controller-->>Client : 200 创建成功 +end +end +``` + +**图示来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go#L15-L73) +- [walmart/api.go](file://utility/integration/redeem/walmart/api.go#L1-L3) + +**章节来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go#L1-L73) +- [account.go](file://api/card_info_walmart/v1/account.go#L1-L242) + +### 订单处理分析 +订单处理组件负责卡密兑换请求的接收、处理和状态查询。系统采用异步处理模式,接收到兑换请求后立即返回响应,后台任务负责实际的兑换操作。 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 服务层 +Client->>Controller : POST /cardInfo/walmart/order/submit +Controller->>Service : AddOne()添加订单 +Service-->>Controller : 订单创建成功 +Controller->>Client : 200 提交成功 +Controller->>Service : TriggerValidateAndConsume() +Note right of Service : 触发后台验证和消费任务 +``` + +**图示来源** +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L15-L32) +- [order.go](file://api/card_info_walmart/v1/order.go#L1-L92) + +**章节来源** +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L1-L32) +- [order.go](file://api/card_info_walmart/v1/order.go#L1-L92) + +### 配置管理分析 +配置管理组件提供了沃尔玛平台各项参数的获取和设置功能,包括最小充值金额、是否允许金额异议、单账户最大充值次数等关键业务规则。 + +```mermaid +flowchart TD +Start([获取配置]) --> GetConfig["GetIsAllowRedeemCardDifferentAmount()"] +GetConfig --> GetMinAmount["GetRedeemCardMinAmount()"] +GetMinAmount --> GetCallback["GetRedeemCardSucceedCallbackIsAllow()"] +GetCallback --> GetFailCallback["GetRedeemCardFailCallbackIsAllow()"] +GetFailCallback --> GetCompensated["GetRedeemCardCompensatedAutoCallback()"] +GetCompensated --> GetRate["GetRedeemCardRate()"] +GetRate --> GetRepeated["GetIsAllowedRepeated()"] +GetRepeated --> GetMaxCount["GetMaxAccountRedeemCount()"] +GetMaxCount --> GetStrategy["GetRedeemScheduleStrategy()"] +GetStrategy --> Return["返回配置对象"] +Return --> End([配置获取完成]) +``` + +**图示来源** +- [card_info_walmart_v1_redeem_config_get.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_redeem_config_get.go#L1-L23) +- [config.go](file://api/card_info_walmart/v1/config.go#L1-L40) + +**章节来源** +- [card_info_walmart_v1_redeem_config_get.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_redeem_config_get.go#L1-L23) +- [config.go](file://api/card_info_walmart/v1/config.go#L1-L40) + +### 分组管理分析 +分组管理组件允许用户将沃尔玛账户组织到不同的分组中,便于批量管理和统计分析。每个分组可以独立配置和管理。 + +```mermaid +classDiagram +class GroupRecord { ++string Name ++string Notes +} +class GroupAddReq { ++GroupRecord +} +class GroupUpdateReq { ++int ID ++GroupRecord +} +class GroupListReq { ++int Page ++int Size ++string UserId ++string Name +} +class GroupListRes { ++int Total ++[]*entity.V1CardRedeemAccountGroup List +} +class GroupDeleteReq { ++int ID +} +GroupAddReq --> GroupRecord : 包含 +GroupUpdateReq --> GroupRecord : 包含 +GroupListRes --> V1CardRedeemAccountGroup : 列表 +``` + +**图示来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L1-L81) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go#L1-L40) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go#L1-L37) + +**章节来源** +- [group.go](file://api/card_info_walmart/v1/group.go#L1-L81) +- [card_info_walmart_v1_group_add.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go#L1-L40) +- [card_info_walmart_v1_group_list.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go#L1-L37) + +## 依赖分析 +沃尔玛平台集成主要依赖于系统核心服务和第三方集成库。这些依赖关系确保了功能的完整性和系统的稳定性。 + +```mermaid +graph TD +WalmartIntegration[沃尔玛集成] --> SysAuth[认证服务] +WalmartIntegration --> CardRedeemAccount[账户服务] +WalmartIntegration --> CardRedeemOrder[订单服务] +WalmartIntegration --> SysConfigDict[配置字典服务] +SysAuth --> Database[(数据库)] +CardRedeemAccount --> Database +CardRedeemOrder --> Database +SysConfigDict --> Database +WalmartIntegration --> Cache[缓存服务] +WalmartIntegration --> Trace[追踪服务] +style WalmartIntegration fill:#f96,stroke:#333 +style SysAuth fill:#6f9,stroke:#333 +style CardRedeemAccount fill:#6f9,stroke:#333 +style CardRedeemOrder fill:#6f9,stroke:#333 +style SysConfigDict fill:#6f9,stroke:#333 +style Cache fill:#69f,stroke:#333 +style Trace fill:#69f,stroke:#333 +style Database fill:#9f9,stroke:#333 +``` + +**图示来源** +- [card_info_walmart_v1_account_create.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go#L15-L73) +- [card_info_walmart_v1_submit.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_submit.go#L15-L32) +- [card_info_walmart_v1_redeem_config_get.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_redeem_config_get.go#L1-L23) + +**章节来源** +- [internal/service](file://internal/service) +- [utility/cache](file://utility/cache) +- [utility/config](file://utility/config) + +## 性能考虑 +沃尔玛平台集成在设计时充分考虑了性能因素。系统采用缓存机制减少对沃尔玛API的频繁调用,使用异步处理模式提高响应速度,并通过分组管理实现批量操作的效率优化。配置参数中的"RedeemCardRate"字段用于控制兑换速率,防止因请求过于频繁而被沃尔玛API限流。 + +## 故障排除指南 +### 分组管理冲突 +当出现分组名称冲突时,系统会返回"分组已存在"的错误信息。解决方案是使用唯一的分组名称或先删除已存在的分组再创建。 + +### 账户状态不一致 +账户状态不一致通常由缓存延迟引起。可通过调用"AccountRefreshStatus"接口强制刷新账户状态,或等待缓存过期后自动更新。 + +### 兑换速率限制 +当遇到兑换速率限制时,应检查"RedeemCardRate"配置值是否过高。建议根据沃尔玛API的实际限制调整此参数,并实现指数退避重试机制。 + +### Cookie失效 +Cookie失效会导致账户验证失败。解决方案是重新获取有效的Cookie并更新账户信息,或实现自动Cookie刷新机制。 + +**章节来源** +- [card_info_walmart_v1_account_refresh_status.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_refresh_status.go#L1-L13) +- [card_info_walmart_v1_account_status_detect.go](file://internal/controller/card_info_walmart/card_info_walmart_v1_account_status_detect.go#L1-L38) +- [config.go](file://api/card_info_walmart/v1/config.go#L1-L40) + +## 结论 +kami_backend对沃尔玛平台的集成设计合理,功能完整。通过分层架构实现了良好的代码组织,利用分组管理策略提高了账户管理效率,采用异步处理模式优化了系统性能。集成方案充分考虑了错误处理和性能优化,为稳定可靠的沃尔玛卡密兑换服务提供了坚实的基础。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/电商平台集成/电商平台集成.md b/.qoder/repowiki/zh/content/外部集成/电商平台集成/电商平台集成.md new file mode 100644 index 00000000..ebf9256a --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/电商平台集成/电商平台集成.md @@ -0,0 +1,247 @@ +# 电商平台集成 + + +**本文档引用文件** +- [client.go](file://utility/integration/originalJd/client.go) +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [api.go](file://utility/integration/redeem/jd/api.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) +- [api.go](file://utility/integration/redeem/walmart/api.go) +- [models.go](file://utility/integration/tmall/models.go) +- [errHandler.go](file://internal/errHandler/handler.go) +- [code.go](file://internal/errHandler/code.go) +- [config.go](file://utility/config/config.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend电商平台如何通过integration包集成京东、天猫、Ctrip和沃尔玛等第三方电商平台的API。重点阐述了各平台客户端的实现机制,包括认证方式、API调用模式、错误处理策略和重试机制。文档还提供了核心功能调用示例、配置参数说明、数据结构定义和性能优化建议。 + +## 项目结构 +kami_backend的电商平台集成功能主要集中在`utility/integration`目录下,每个第三方平台都有独立的子包实现其API集成。系统通过统一的HTTP客户端配置与各平台通信,并采用标准化的错误处理机制。 + +```mermaid +graph TB +subgraph "集成层" +JD[京东集成] +Tmall[天猫集成] +Ctrip[Ctrip集成] +Walmart[沃尔玛集成] +end +subgraph "核心服务" +HTTPClient[HTTP客户端] +ErrorHandler[错误处理器] +ConfigManager[配置管理] +end +JD --> HTTPClient +Tmall --> HTTPClient +Ctrip --> HTTPClient +Walmart --> HTTPClient +HTTPClient --> ErrorHandler +ConfigManager --> JD +ConfigManager --> Tmall +ConfigManager --> Ctrip +ConfigManager --> Walmart +``` + +**图示来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) + +**本节来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) + +## 核心组件 +系统的核心集成组件包括京东、天猫、Ctrip和沃尔玛的API客户端实现。每个客户端都封装了特定平台的认证机制、请求格式和响应处理逻辑。集成层通过统一的接口抽象,使上层业务逻辑能够以一致的方式调用不同平台的API。 + +**本节来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [api.go](file://utility/integration/redeem/jd/api.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) +- [api.go](file://utility/integration/redeem/walmart/api.go) + +## 架构概述 +电商平台集成架构采用分层设计,上层为业务控制器,中间为服务逻辑层,底层为第三方API集成层。集成层使用统一的HTTP客户端配置,确保所有外部API调用具有一致的超时设置、连接池管理和错误处理策略。 + +```mermaid +graph TD +A[业务控制器] --> B[服务逻辑层] +B --> C[京东API客户端] +B --> D[天猫API客户端] +B --> E[Ctrip API客户端] +B --> F[沃尔玛API客户端] +C --> G[HTTP客户端] +D --> G +E --> G +F --> G +G --> H[错误处理器] +I[配置管理] --> C +I --> D +I --> E +I --> F +``` + +**图示来源** +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [config.go](file://utility/config/config.go) + +## 详细组件分析 + +### 京东集成分析 +京东集成通过originalJd包实现,包含客户端初始化、API调用和状态管理功能。客户端采用基于AppKey和AppSecret的认证机制,所有请求都经过签名处理。 + +```mermaid +classDiagram +class JDClient { ++string AppKey ++string AppSecret ++string ServerUrl ++Execute(method string, data map[string]interface{}) string +-signRequest(data map[string]interface{}) string +} +class JDOrderService { ++submitOrder(orderInfo map[string]interface{}) map[string]interface{} ++queryOrder(orderNo string) map[string]interface{} ++refundOrder(orderNo string) map[string]interface{} +} +JDClient --> JDOrderService : "使用" +``` + +**图示来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [api.go](file://utility/integration/redeem/jd/api.go) + +### 天猫集成分析 +天猫集成使用topsdk实现完整的TOP API支持,包括OAuth认证、API请求签名和响应解析。系统采用长连接和连接池优化性能。 + +```mermaid +sequenceDiagram +participant 应用 as 应用层 +participant 客户端 as TopClient +participant 天猫 as 天猫API +应用->>客户端 : 调用API方法 +客户端->>客户端 : 构建请求参数 +客户端->>客户端 : 生成签名 +客户端->>天猫 : 发送HTTP请求 +天猫-->>客户端 : 返回JSON响应 +客户端->>客户端 : 验证签名 +客户端->>客户端 : 解析响应 +客户端-->>应用 : 返回结果 +``` + +**图示来源** +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [oauth.go](file://utility/integration/tmall/api/oauth.go) + +### Ctrip集成分析 +Ctrip集成通过service层封装API调用,提供充值、兑换和账户查询等核心功能。系统实现了自动重试机制以应对网络波动。 + +```mermaid +flowchart TD +Start([开始]) --> Validate["验证请求参数"] +Validate --> CheckCache["检查缓存"] +CheckCache --> CacheHit{"缓存命中?"} +CacheHit --> |是| ReturnCache["返回缓存结果"] +CacheHit --> |否| CallAPI["调用Ctrip API"] +CallAPI --> APIResult{"调用成功?"} +APIResult --> |否| Retry{"重试次数<3?"} +Retry --> |是| Delay["等待1秒"] +Delay --> CallAPI +Retry --> |否| HandleError["处理错误"] +APIResult --> |是| UpdateCache["更新缓存"] +UpdateCache --> ReturnResult["返回结果"] +HandleError --> ReturnError["返回错误"] +ReturnCache --> End([结束]) +ReturnResult --> End +ReturnError --> End +``` + +**图示来源** +- [service.go](file://utility/integration/redeem/ctrip/service.go) +- [api.go](file://utility/integration/redeem/ctrip/api.go) + +### 沃尔玛集成分析 +沃尔玛集成实现了完整的API客户端,支持商品查询、订单创建和状态同步功能。系统采用JSON格式进行数据交换。 + +```mermaid +classDiagram +class WalmartClient { ++string ApiKey ++string BaseUrl ++GetProduct(sku string) map[string]interface{} ++CreateOrder(orderData map[string]interface{}) map[string]interface{} ++GetOrderStatus(orderId string) map[string]interface{} +-makeRequest(endpoint string, method string, data map[string]interface{}) map[string]interface{} +} +class WalmartModel { ++string Sku ++string Name ++float Price ++int Quantity +} +WalmartClient --> WalmartModel : "使用" +``` + +**图示来源** +- [api.go](file://utility/integration/redeem/walmart/api.go) +- [models.go](file://utility/integration/redeem/walmart/models.go) + +**本节来源** +- [client.go](file://utility/integration/originalJd/client.go) +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [service.go](file://utility/integration/redeem/ctrip/service.go) +- [api.go](file://utility/integration/redeem/walmart/api.go) + +## 依赖分析 +电商平台集成依赖于HTTP客户端、配置管理和错误处理等核心组件。各平台客户端共享相同的底层基础设施,确保一致性和可维护性。 + +```mermaid +graph TD +JDClient --> HTTPClient +TmallClient --> HTTPClient +CtripClient --> HTTPClient +WalmartClient --> HTTPClient +HTTPClient --> ConfigManager +HTTPClient --> ErrorHandler +ConfigManager --> Viper +ErrorHandler --> Logger +JDClient --> Crypto +TmallClient --> Crypto +``` + +**图示来源** +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [config.go](file://utility/config/config.go) +- [errHandler.go](file://internal/errHandler/handler.go) + +**本节来源** +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) +- [config.go](file://utility/config/config.go) +- [errHandler.go](file://internal/errHandler/handler.go) + +## 性能考虑 +系统在HTTP客户端配置中采用了多项性能优化措施,包括连接池管理、超时设置和长连接支持。这些配置确保了高并发场景下的稳定性和响应速度。 + +**本节来源** +- [topclient.go](file://utility/integration/tmall/topsdk/topclient.go) + +## 故障排除指南 +常见集成问题包括认证失败、接口限流和数据格式不匹配。系统提供了详细的错误码和日志记录,便于快速定位和解决问题。 + +**本节来源** +- [code.go](file://internal/errHandler/code.go) +- [errHandler.go](file://internal/errHandler/handler.go) + +## 结论 +kami_backend的电商平台集成架构设计合理,通过统一的集成层抽象了不同平台的差异性,提供了稳定可靠的API调用能力。系统的错误处理、性能优化和可维护性都达到了较高水平。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/外部集成/监控系统集成.md b/.qoder/repowiki/zh/content/外部集成/监控系统集成.md new file mode 100644 index 00000000..61c720e2 --- /dev/null +++ b/.qoder/repowiki/zh/content/外部集成/监控系统集成.md @@ -0,0 +1,407 @@ +# 监控系统集成 + + +**Referenced Files in This Document** +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [handler.go](file://utility/otel/handler.go) +- [errors.go](file://utility/otel/errors.go) +- [main.go](file://main.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend项目中OpenTelemetry监控系统的集成实现。文档涵盖了追踪(Tracing)、指标(Metrics)和日志(Logging)的收集与导出机制,解释了otel包的配置结构,以及如何在控制器、服务层和业务逻辑中创建和使用Span。同时提供了监控系统常见问题的故障排除指南。 + +## 项目结构 +kami_backend项目的监控系统集成主要集中在`utility/otel`目录下,该目录包含了OpenTelemetry的所有配置和实现代码。监控系统与GoFrame框架深度集成,通过统一的接口提供追踪、日志和指标功能。 + +```mermaid +graph TD +subgraph "监控系统" +otel[utility/otel] +config[config.go] +manager[manager.go] +utils[utils.go] +handler[handler.go] +errors[errors.go] +end +main[main.go] --> otel +internal[internal/] --> otel +api[api/] --> otel +otel --> config +otel --> manager +otel --> utils +otel --> handler +otel --> errors +``` + +**Diagram sources** +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [handler.go](file://utility/otel/handler.go) +- [errors.go](file://utility/otel/errors.go) +- [main.go](file://main.go) + +**Section sources** +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [handler.go](file://utility/otel/handler.go) +- [errors.go](file://utility/otel/errors.go) +- [main.go](file://main.go) + +## 核心组件 +kami_backend的监控系统由几个核心组件构成:配置管理、管理器、工具函数、日志处理器和错误处理。这些组件协同工作,实现了完整的可观测性解决方案。 + +**Section sources** +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [handler.go](file://utility/otel/handler.go) +- [errors.go](file://utility/otel/errors.go) + +## 架构概述 +kami_backend的监控系统采用分层架构设计,各组件职责明确,易于维护和扩展。系统通过OpenTelemetry协议与后端监控系统通信,支持追踪、日志和指标的统一收集。 + +```mermaid +graph TD +subgraph "应用层" +main[main.go] +controllers[Controllers] +services[Services] +logic[Business Logic] +end +subgraph "监控集成层" +otel[OpenTelemetry] +config[Config] +manager[Manager] +utils[Utils] +handler[Log Handler] +end +subgraph "导出层" +exporter[OTLP Exporter] +collector[Collector] +backend[Jaeger/Prometheus] +end +main --> config +main --> manager +controllers --> utils +services --> utils +logic --> utils +utils --> manager +manager --> exporter +exporter --> collector +collector --> backend +handler --> exporter +style otel fill:#f9f,stroke:#333,stroke-width:2px +style config fill:#bbf,stroke:#333,stroke-width:2px +style manager fill:#bbf,stroke:#333,stroke-width:2px +style utils fill:#bbf,stroke:#333,stroke-width:2px +style handler fill:#bbf,stroke:#333,stroke-width:2px +``` + +**Diagram sources** +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [handler.go](file://utility/otel/handler.go) + +## 详细组件分析 + +### 配置管理分析 +监控系统的配置管理通过`Config`结构体实现,该结构体定义了所有必要的配置参数,包括服务名称、收集器URL、安全设置、压缩方式、请求头、超时时间、采样率等。 + +```mermaid +classDiagram +class Config { ++string ServiceName ++string CollectorURL ++bool Insecure ++string Compressor ++map[string]string Headers ++time.Duration Timeout ++float64 SampleRate ++bool Enable ++[]attribute.KeyValue ResourceAttrs ++DefaultConfig() *Config ++Validate() error ++Clone() *Config +} +Config : +ServiceName : 服务名称,用于标识监控数据来源 +Config : +CollectorURL : OpenTelemetry收集器的URL地址 +Config : +Insecure : 是否使用不安全连接HTTP而非HTTPS +Config : +Compressor : 数据压缩方式,如gzip +Config : +Headers : 请求头,可用于认证等 +Config : +Timeout : 请求超时时间 +Config : +SampleRate : 采样率,0.0-1.0之间 +Config : +Enable : 是否启用监控 +Config : +ResourceAttrs : 资源属性,用于添加额外的元数据 +``` + +**Diagram sources** +- [config.go](file://utility/otel/config.go#L10-L30) + +**Section sources** +- [config.go](file://utility/otel/config.go#L1-L68) + +### 管理器分析 +`Manager`是监控系统的核心,负责初始化和管理追踪、日志和指标的提供者。它封装了OpenTelemetry SDK的复杂性,提供了简洁的接口供应用层使用。 + +```mermaid +classDiagram +class Manager { +-Config config +-resource.Resource resource +-trace.TracerProvider tracerProvider +-log.LoggerProvider logProvider +-[]func(context.Context) error shutdownFuncs ++NewOTelManager(config *Config) (*Manager, error) ++initTracing() error ++initLogging() error ++initMetrics() error ++Shutdown(ctx context.Context) error ++GetConfig() *Config ++GetResource() *resource.Resource ++IsTracingEnabled() bool ++IsLoggingEnabled() bool ++GetTracerProvider() *trace.TracerProvider ++GetLogProvider() *log.LoggerProvider ++CreateTracer(name string) oteltrace.Tracer ++CreateLogger(name string) otellog.Logger +} +Manager --> Config : "has" +Manager --> resource.Resource : "uses" +Manager --> trace.TracerProvider : "manages" +Manager --> log.LoggerProvider : "manages" +class Config { +<> +} +class resource.Resource { +<> +} +class trace.TracerProvider { +<> +} +class log.LoggerProvider { +<> +} +``` + +**Diagram sources** +- [manager.go](file://utility/otel/manager.go#L40-L60) + +**Section sources** +- [manager.go](file://utility/otel/manager.go#L1-L258) + +### 工具函数分析 +工具函数层提供了简化使用的API,使开发者能够轻松地在代码中添加监控功能,而无需了解OpenTelemetry SDK的底层细节。 + +```mermaid +classDiagram +class Utils { ++InitWithConfig(config *Config) error ++GetCurrentManager() *Manager ++Shutdown(ctx context.Context) error ++GetLogger() otellog.Logger ++CreateSpan(ctx context.Context, name string, opts ...oteltrace.SpanStartOption) (context.Context, oteltrace.Span) ++AddSpanAttribute(ctx context.Context, key string, value interface{}) ++AddSpanEvent(ctx context.Context, name string, attrs ...attribute.KeyValue) ++SetSpanError(ctx context.Context, err error) ++SetSpanStatus(ctx context.Context, code codes.Code, message string) ++LogWithContext(ctx context.Context, level string, message string, attrs ...attribute.KeyValue) ++WithTracer(ctx context.Context, operationName string, fn func(context.Context) error, opts ...oteltrace.SpanStartOption) error ++GetTraceID(ctx context.Context) string ++GetSpanID(ctx context.Context) string ++SetGlobalManager(manager *Manager) ++GetServiceName() string ++GetCollectorEndpoint() string ++Reset() +} +Utils : +InitWithConfig : 使用配置初始化OTel系统 +Utils : +CreateSpan : 创建新的span +Utils : +AddSpanAttribute : 添加span属性 +Utils : +SetSpanError : 设置span错误 +Utils : +LogWithContext : 在上下文中记录日志 +Utils : +WithTracer : 使用tracer执行函数 +``` + +**Diagram sources** +- [utils.go](file://utility/otel/utils.go#L20-L30) + +**Section sources** +- [utils.go](file://utility/otel/utils.go#L1-L231) + +### 日志处理器分析 +日志处理器负责将GoFrame框架的日志输出转换为OpenTelemetry格式,并发送到收集器。它实现了日志级别的映射、调用者信息提取和上下文传递。 + +```mermaid +sequenceDiagram +participant GF as GoFrame日志系统 +participant Handler as LogHandler +participant Manager as OTel Manager +participant Logger as OTel Logger +participant Exporter as OTLP Exporter +GF->>Handler : 日志事件 +Handler->>Handler : 检查监控是否启用 +alt 监控已启用 +Handler->>Manager : 获取配置 +Handler->>Manager : 创建Logger +Handler->>Handler : 创建日志记录 +Handler->>Handler : 添加基本属性 +Handler->>Handler : 添加调用者信息 +Handler->>Handler : 添加堆栈信息错误级别 +Handler->>Handler : 添加上下文信息 +Handler->>Logger : 发送日志记录 +Logger->>Exporter : 导出日志 +else 监控未启用 +Handler->>GF : 继续处理 +end +``` + +**Diagram sources** +- [handler.go](file://utility/otel/handler.go#L10-L165) + +**Section sources** +- [handler.go](file://utility/otel/handler.go#L1-L165) + +### 错误处理分析 +错误处理组件定义了监控系统专用的错误类型,提供了结构化的错误信息,便于问题诊断和错误分类。 + +```mermaid +classDiagram +class Error { ++string Code ++string Message ++error Cause ++Error() string ++Unwrap() error +} +class ErrInvalidConfig { +<> +} +class ErrInitFailed { +<> +} +class ErrShutdownFailed { +<> +} +class ErrExporterFailed { +<> +} +class ErrProviderNotInitialized { +<> +} +Error <|-- ErrInvalidConfig : "creates" +Error <|-- ErrInitFailed : "creates" +Error <|-- ErrShutdownFailed : "creates" +Error <|-- ErrExporterFailed : "creates" +Error <|-- ErrProviderNotInitialized : "creates" +Error : +Code : 错误代码,用于分类 +Error : +Message : 错误消息 +Error : +Cause : 根本原因 +``` + +**Diagram sources** +- [errors.go](file://utility/otel/errors.go#L5-L60) + +**Section sources** +- [errors.go](file://utility/otel/errors.go#L1-L61) + +## 依赖分析 +监控系统的组件之间存在明确的依赖关系,形成了一个层次化的架构。高层组件依赖于低层组件,但低层组件不依赖于高层组件,确保了系统的可维护性。 + +```mermaid +graph TD +main[main.go] --> utils[utils.go] +main --> config[config.go] +utils --> manager[manager.go] +utils --> config +manager --> config +handler --> manager +handler --> utils +manager --> errors[errors.go] +utils --> errors +config --> errors +style main fill:#f96,stroke:#333,stroke-width:2px +style utils fill:#6f9,stroke:#333,stroke-width:2px +style manager fill:#69f,stroke:#333,stroke-width:2px +style config fill:#69f,stroke:#333,stroke-width:2px +style handler fill:#69f,stroke:#333,stroke-width:2px +style errors fill:#96f,stroke:#333,stroke-width:2px +``` + +**Diagram sources** +- [main.go](file://main.go#L1-L50) +- [utils.go](file://utility/otel/utils.go#L1-L231) +- [manager.go](file://utility/otel/manager.go#L1-L258) +- [config.go](file://utility/otel/config.go#L1-L68) +- [handler.go](file://utility/otel/handler.go#L1-L165) +- [errors.go](file://utility/otel/errors.go#L1-L61) + +**Section sources** +- [main.go](file://main.go#L1-L50) +- [utils.go](file://utility/otel/utils.go#L1-L231) +- [manager.go](file://utility/otel/manager.go#L1-L258) +- [config.go](file://utility/otel/config.go#L1-L68) +- [handler.go](file://utility/otel/handler.go#L1-L165) +- [errors.go](file://utility/otel/errors.go#L1-L61) + +## 性能考虑 +监控系统的性能开销主要来自数据序列化、网络传输和采样决策。系统通过以下方式控制性能开销: + +1. **采样率控制**:通过`SampleRate`配置项控制追踪数据的采样率,减少数据量 +2. **批量导出**:使用批处理方式导出数据,减少网络请求次数 +3. **异步处理**:日志和追踪数据的导出在后台线程中进行,不影响主业务逻辑 +4. **数据压缩**:使用gzip等压缩算法减少网络传输数据量 +5. **资源限制**:设置合理的超时时间和资源限制,防止监控系统影响主服务 + +**Section sources** +- [config.go](file://utility/otel/config.go#L1-L68) +- [manager.go](file://utility/otel/manager.go#L1-L258) + +## 故障排除指南 +### 数据丢失问题 +当监控数据丢失时,可能的原因和解决方案包括: + +1. **网络连接问题**:检查收集器URL是否正确,网络是否通畅 +2. **认证失败**:检查请求头中的认证信息是否正确 +3. **采样率过低**:检查`SampleRate`配置,适当提高采样率 +4. **导出器错误**:查看应用日志中的`ErrExporterFailed`错误 + +### 延迟高问题 +当监控数据延迟高时,可能的原因和解决方案包括: + +1. **网络延迟**:检查网络状况,优化网络路径 +2. **批量大小过大**:调整批处理大小,减少单次导出的数据量 +3. **导出频率过低**:增加导出频率,减少数据积压 +4. **资源不足**:检查服务器CPU和内存使用情况,适当增加资源 + +### 资源消耗过大问题 +当监控系统消耗过多资源时,可能的原因和解决方案包括: + +1. **采样率过高**:降低`SampleRate`配置值 +2. **日志级别过低**:调整日志级别,减少日志输出量 +3. **追踪范围过大**:限制追踪的代码范围,只追踪关键路径 +4. **压缩未启用**:启用数据压缩,减少网络和存储开销 + +**Section sources** +- [config.go](file://utility/otel/config.go#L1-L68) +- [manager.go](file://utility/otel/manager.go#L1-L258) +- [utils.go](file://utility/otel/utils.go#L1-L231) +- [errors.go](file://utility/otel/errors.go#L1-L61) + +## 结论 +kami_backend的监控系统集成通过OpenTelemetry实现了全面的可观测性。系统设计简洁,易于使用,同时提供了足够的灵活性来满足不同的监控需求。通过合理的配置和使用,可以有效地监控系统性能,快速定位和解决问题。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/安全考虑/双因素认证.md b/.qoder/repowiki/zh/content/安全考虑/双因素认证.md new file mode 100644 index 00000000..f0487e19 --- /dev/null +++ b/.qoder/repowiki/zh/content/安全考虑/双因素认证.md @@ -0,0 +1,492 @@ +# 双因素认证 + + +**本文档引用的文件** +- [mfa.go](file://utility/mfa/mfa.go) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go) +- [sysUser_v1_totp_image_get.go](file://internal/controller/sysUser/sysUser_v1_totp_image_get.go) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [totp.go](file://internal/logic/sys_user/totp.go) +- [user_info.go](file://internal/logic/base_user_info/user_info.go) +- [sys_user.go](file://internal/service/sys_user.go) + + +## 目录 +1. [简介](#简介) +2. [MFA系统架构](#mfa系统架构) +3. [TOTP实现机制](#totp实现机制) +4. [MFA功能实现](#mfa功能实现) +5. [登录流程集成](#登录流程集成) +6. [关键操作二次验证](#关键操作二次验证) +7. [配置选项与安全策略](#配置选项与安全策略) +8. [开发者集成指南](#开发者集成指南) +9. [用户体验优化建议](#用户体验优化建议) + +## 简介 +本文档详细介绍了kami_backend系统的双因素认证(MFA)实现方案。系统采用基于时间的一次性密码(TOTP)作为主要的双因素认证机制,为用户提供额外的安全保护层。文档全面解释了TOTP的实现机制,包括密钥生成、二维码展示和验证码验证流程,描述了MFA的启用、禁用和重置功能的实现细节,并说明了MFA与用户登录流程的集成方式。 + +**MFA系统的主要特点包括:** +- 基于TOTP标准的双因素认证 +- 与主流身份验证应用(如Google Authenticator)兼容 +- 完整的MFA生命周期管理(启用、禁用、重置) +- 在关键操作中强制要求二次验证 +- 灵活的配置选项和安全策略 + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) + +## MFA系统架构 + +```mermaid +graph TD +subgraph "API接口层" +A[TotpStatusGet] --> B[TotpImageGet] +B --> C[TotpSet] +C --> D[TotpReset] +D --> E[UserLogin] +end +subgraph "业务逻辑层" +F[SysUser Service] --> G[Totp Logic] +H[BaseUserInfo Service] --> I[TotpValidate] +end +subgraph "工具层" +J[MFA Utility] --> K[GetOtp] +J --> L[ValidCode] +end +subgraph "数据层" +M[SysUser Database] --> N[OtpSecret存储] +M --> O[OtpKey存储] +end +A --> F +B --> F +C --> F +G --> J +D --> F +E --> F +F --> M +H --> J +J --> M +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) +- [totp.go](file://internal/logic/sys_user/totp.go#L1-L50) +- [user_info.go](file://internal/logic/base_user_info/user_info.go#L1-L36) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) + +## TOTP实现机制 + +### 密钥生成与管理 +系统使用`gotp`库实现TOTP标准,密钥生成遵循RFC 6238规范。当用户首次启用MFA时,系统会生成一个16位的随机密钥作为TOTP的共享密钥。 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +participant 数据库 +用户->>前端 : 请求启用MFA +前端->>后端 : 调用TotpStatusGet接口 +后端->>后端 : 检查用户MFA状态 +alt 用户未启用MFA +后端->>后端 : 调用GetOtp生成密钥 +后端->>后端 : 生成二维码数据 +后端->>前端 : 返回二维码图像和临时密钥 +前端->>用户 : 显示二维码供扫描 +else 用户已启用MFA +后端->>前端 : 返回已启用状态 +end +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) + +### 二维码生成与展示 +系统通过`GetOtp`函数生成包含TOTP配置信息的二维码,该二维码可被Google Authenticator等身份验证应用扫描。二维码包含以下信息: +- 用户ID +- 用户名 +- 随机生成的密钥 +- 服务名称(卡销平台(供销端)) + +```mermaid +flowchart TD +Start([开始]) --> GenerateSecret["生成16位随机密钥"] +GenerateSecret --> CreateUri["创建TOTP配置URI"] +CreateUri --> EncodeUri["对URI进行URL解码"] +EncodeUri --> GenerateQr["生成二维码图像"] +GenerateQr --> ConvertBase64["转换为Base64编码"] +ConvertBase64 --> FormatData["格式化为data:image/png;base64格式"] +FormatData --> ReturnResult["返回包含二维码的响应"] +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) + +### 验证码验证流程 +TOTP验证码验证遵循标准的时间窗口机制,系统使用30秒作为时间步长,允许前后各一个时间窗口的容差,总共提供90秒的有效期。 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +用户->>前端 : 输入TOTP验证码 +前端->>后端 : 提交验证码和用户凭证 +后端->>后端 : 获取用户存储的OtpSecret +后端->>后端 : 调用ValidCode进行验证 +后端->>后端 : 计算当前时间窗口的TOTP值 +后端->>后端 : 比较用户输入与计算值 +alt 验证成功 +后端->>前端 : 返回验证成功 +else 验证失败 +后端->>前端 : 返回验证失败错误 +end +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) + +## MFA功能实现 + +### MFA启用流程 +用户启用MFA需要经过以下步骤: +1. 用户请求获取MFA配置信息 +2. 系统生成新的密钥对并返回二维码 +3. 用户使用身份验证应用扫描二维码 +4. 用户输入当前生成的TOTP验证码进行验证 +5. 系统验证成功后保存MFA配置 + +```mermaid +flowchart TD +A[用户请求启用MFA] --> B{检查当前MFA状态} +B --> |未启用| C[生成新密钥和二维码] +C --> D[前端显示二维码] +D --> E[用户扫描二维码] +E --> F[用户输入TOTP验证码] +F --> G[系统验证验证码] +G --> |验证成功| H[保存OtpSecret和OtpKey] +G --> |验证失败| I[返回错误信息] +H --> J[MFA启用成功] +I --> K[提示用户重新尝试] +``` + +**Diagram sources** +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) +- [totp.go](file://internal/logic/sys_user/totp.go#L1-L50) + +### MFA禁用与重置 +系统提供了MFA的禁用和重置功能,允许用户在需要时管理自己的双因素认证设置。 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +participant 数据库 +用户->>前端 : 请求重置MFA +前端->>后端 : 调用TotpReset接口 +后端->>后端 : 验证用户身份 +后端->>后端 : 验证提供的TOTP验证码 +alt 验证成功 +后端->>数据库 : 清除OtpSecret和OtpKey +数据库-->>后端 : 返回更新结果 +后端-->>前端 : 返回重置成功 +else 验证失败 +后端-->>前端 : 返回验证失败错误 +end +``` + +**Diagram sources** +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go#L1-L28) +- [totp.go](file://internal/logic/sys_user/totp.go#L1-L50) + +**Section sources** +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go#L1-L28) +- [totp.go](file://internal/logic/sys_user/totp.go#L1-L50) + +## 登录流程集成 + +### 登录时的MFA验证 +MFA与用户登录流程深度集成,当用户账户启用了MFA时,系统会在登录过程中强制要求提供TOTP验证码。 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +participant 数据库 +用户->>前端 : 输入用户名、密码和验证码 +前端->>后端 : 提交登录请求 +后端->>后端 : 验证图形验证码 +alt 验证失败 +后端-->>前端 : 返回验证码错误 +else 验证成功 +后端->>数据库 : 查询用户凭据 +数据库-->>后端 : 返回用户信息 +alt 用户凭据错误 +后端-->>前端 : 返回用户名或密码错误 +else 用户凭据正确 +alt 用户启用了MFA +后端->>后端 : 验证TOTP验证码 +alt TOTP验证失败 +后端-->>前端 : 返回二步验证错误 +else TOTP验证成功 +后端->>后端 : 生成用户Token +后端-->>前端 : 返回Token和登录成功 +end +else 用户未启用MFA +后端->>后端 : 生成用户Token +后端-->>前端 : 返回Token和登录成功 +end +end +end +``` + +**Diagram sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) + +### MFA状态检查 +系统在登录前会检查用户的MFA状态,以确定是否需要进行二次验证。 + +```mermaid +flowchart TD +A[接收登录请求] --> B[验证图形验证码] +B --> C{用户凭据验证} +C --> |失败| D[返回凭据错误] +C --> |成功| E{检查OtpSecret字段} +E --> |为空| F[跳过MFA验证] +E --> |不为空| G[要求TOTP验证码] +G --> H[验证TOTP验证码] +H --> |失败| I[返回MFA验证错误] +H --> |成功| J[完成登录流程] +``` + +**Section sources** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) + +## 关键操作二次验证 + +### 敏感操作保护 +系统在执行关键操作时会强制要求二次验证,确保操作的安全性。 + +```mermaid +sequenceDiagram +participant 用户 +participant 前端 +participant 后端 +用户->>前端 : 请求修改密码 +前端->>后端 : 调用UserChangePwd接口 +后端->>后端 : 验证用户身份 +后端->>后端 : 验证原密码 +alt 用户启用了MFA +后端->>后端 : 验证TOTP验证码 +alt 验证成功 +后端->>后端 : 更新密码 +后端-->>前端 : 返回修改成功 +else 验证失败 +后端-->>前端 : 返回MFA验证错误 +end +else 用户未启用MFA +后端->>后端 : 更新密码 +后端-->>前端 : 返回修改成功 +end +``` + +**Section sources** +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) + +## 配置选项与安全策略 + +### 时间窗口配置 +系统采用标准的TOTP时间窗口配置,确保与主流身份验证应用的兼容性。 + +```mermaid +erDiagram +USER ||--o{ MFA_CONFIG : has +USER { +string id PK +string username +string user_password +string user_salt +uint user_status +} +MFA_CONFIG { +string user_id FK +string otp_secret +string otp_key +datetime created_at +datetime updated_at +} +USER ||--o{ LOGIN_LOG : has +LOGIN_LOG { +uuid id PK +string user_id FK +string ip_address +datetime login_time +bool success +string failure_reason +} +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) + +### 尝试次数限制 +系统实现了MFA验证的尝试次数限制,防止暴力破解攻击。 + +```mermaid +flowchart TD +A[开始MFA验证] --> B[记录尝试次数] +B --> C{尝试次数 < 最大限制} +C --> |是| D[执行验证逻辑] +D --> E{验证成功} +E --> |是| F[重置尝试计数器] +E --> |否| G[增加尝试计数] +G --> H{达到最大尝试次数} +H --> |是| I[锁定账户一段时间] +H --> |否| J[返回验证失败] +C --> |否| I +F --> K[验证成功] +I --> L[返回锁定错误] +``` + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) + +## 开发者集成指南 + +### API接口说明 +系统提供了完整的MFA管理API接口,方便开发者集成和使用。 + +```mermaid +classDiagram +class TotpStatusGetReq { ++string Code +} +class TotpStatusGetRes { ++bool Status ++string Image ++string OtpSecret ++string OtpKey +} +class TotpSetReq { ++string Password ++string Code ++string OtpSecret +} +class TotpSetRes { +} +class TotpResetReq { ++string Code +} +class TotpResetRes { +} +class UserLoginReq { ++string Username ++string Password ++string VerifyKey ++string VerifyCode ++string TotpCode +} +class UserLoginRes { ++string Token +} +TotpStatusGetReq <|-- ControllerV1 +TotpStatusGetRes <|-- ControllerV1 +TotpSetReq <|-- ControllerV1 +TotpSetRes <|-- ControllerV1 +TotpResetReq <|-- ControllerV1 +TotpResetRes <|-- ControllerV1 +UserLoginReq <|-- ControllerV1 +UserLoginRes <|-- ControllerV1 +``` + +**Diagram sources** +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go#L1-L28) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go#L1-L52) + +### 服务层接口 +MFA功能通过服务层接口提供给其他模块使用。 + +```mermaid +classDiagram +class ISysUser { ++SetTotp(ctx, data, key, secret) ++ResetTotp(ctx, data) +} +class IBaseUserInfo { ++TotpValidate(ctx, totpCode) +} +class MfaUtility { ++GetOtp(userId, username, key, secret) ++ValidCode(code, secret) +} +ISysUser <|-- SysUserServiceImpl +IBaseUserInfo <|-- BaseUserInfoServiceImpl +MfaUtility <|-- MfaUtilityImpl +SysUserServiceImpl ..> MfaUtility : uses +BaseUserInfoServiceImpl ..> MfaUtility : uses +``` + +**Diagram sources** +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) +- [user_info.go](file://internal/logic/base_user_info/user_info.go#L1-L36) +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) + +**Section sources** +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) +- [user_info.go](file://internal/logic/base_user_info/user_info.go#L1-L36) + +## 用户体验优化建议 + +### 渐进式安全增强 +建议采用渐进式的方式引导用户启用MFA,提高用户接受度。 + +```mermaid +flowchart TD +A[新用户注册] --> B[基础密码保护] +B --> C{用户活跃度达到阈值} +C --> |是| D[提示启用MFA] +D --> E{用户选择启用} +E --> |是| F[引导完成MFA设置] +E --> |否| G[定期提醒] +F --> H[增强账户安全性] +G --> C +``` + +### 恢复机制设计 +系统应提供安全的MFA恢复机制,防止用户因丢失验证设备而无法访问账户。 + +```mermaid +flowchart TD +A[用户丢失验证设备] --> B[使用恢复码登录] +B --> C{验证成功} +C --> |是| D[重置MFA设置] +D --> E[重新配置新设备] +E --> F[MFA恢复完成] +C --> |否| G[联系管理员协助] +G --> H[管理员验证身份] +H --> I[重置用户MFA] +``` + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_reset.go](file://internal/controller/sysUser/sysUser_v1_totp_reset.go#L1-L28) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/安全考虑/安全考虑.md b/.qoder/repowiki/zh/content/安全考虑/安全考虑.md new file mode 100644 index 00000000..e94dd39d --- /dev/null +++ b/.qoder/repowiki/zh/content/安全考虑/安全考虑.md @@ -0,0 +1,384 @@ +# 安全考虑 + + +**本文档中引用的文件** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [mfa.go](file://utility/mfa/mfa.go) +- [auth.go](file://internal/middleware/auth.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [sys_auth.go](file://internal/service/sys_auth.go) +- [sys_casbin.go](file://internal/service/sys_casbin.go) +- [v_1_sys_user.go](file://internal/dao/v_1_sys_user.go) +- [v_1_sys_casbin_rule.go](file://internal/dao/v_1_sys_casbin_rule.go) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) + + +## 目录 +1. [引言](#引言) +2. [系统安全架构概述](#系统安全架构概述) +3. [身份验证机制](#身份验证机制) +4. [基于JWT的认证系统](#基于jwt的认证系统) +5. [基于Casbin的RBAC授权](#基于casbin的rbac授权) +6. [TOTP双因素认证(MFA)](#totp双因素认证mfa) +7. [数据加密机制](#数据加密机制) +8. [会话管理与令牌续签](#会话管理与令牌续签) +9. [安全最佳实践](#安全最佳实践) +10. [常见安全威胁与缓解措施](#常见安全威胁与缓解措施) +11. [开发者安全编码指南](#开发者安全编码指南) +12. [结论](#结论) + +## 引言 +本文档全面阐述了kami_backend系统的安全架构设计,涵盖多层安全机制,包括基于JWT的身份认证、基于Casbin的RBAC权限控制、TOTP双因素认证以及数据加密技术。文档详细说明了各安全组件的实现原理、配置方式和使用模式,并提供安全最佳实践和漏洞防范指南。 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [sys_user.go](file://internal/model/sys_user.go#L1-L92) + +## 系统安全架构概述 +kami_backend系统采用分层安全架构,包含身份验证、授权、会话管理和数据保护等多个安全层面。系统通过JWT实现无状态认证,利用Casbin框架实现灵活的基于角色的访问控制(RBAC),并集成TOTP双因素认证增强账户安全性。同时,系统使用AES和MD5算法对敏感数据进行加密保护。 + +```mermaid +graph TB +subgraph "安全架构" +Auth[身份验证] +Authorization[授权] +Session[会话管理] +Encryption[数据加密] +end +Auth --> |JWT| Authorization +Authorization --> |Casbin| Session +Session --> |Token| Encryption +Encryption --> |AES/MD5| Auth +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L1-L50) + +## 身份验证机制 +系统实现了多模式身份验证机制,支持标准登录认证和iframe嵌入式认证两种模式。通过中间件统一处理身份验证逻辑,确保所有受保护的API端点都经过严格的身份验证。 + +### 认证流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Middleware as "认证中间件" +participant Token as "令牌服务" +participant Redis as "Redis缓存" +Client->>Middleware : 发送请求(含Token) +Middleware->>Token : 提取请求Token +alt Token不存在 +Middleware-->>Client : 返回未授权错误 +else Token存在 +Middleware->>Token : 解析用户Token +Token->>Redis : 验证Token有效性 +Redis-->>Token : 返回验证结果 +alt Token有效 +Token->>Middleware : 返回用户信息 +Middleware->>Token : 续签Token +Token-->>Middleware : 返回新Token +Middleware->>Client : 设置refresh-token头 +Middleware->>Client : 允许请求继续 +else Token无效 +Middleware-->>Client : 返回Token失效错误 +end +end +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L50-L100) +- [token.go](file://utility/token/user_token.go#L1-L50) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) + +## 基于JWT的认证系统 +系统采用JWT(JSON Web Token)实现无状态认证机制。用户登录成功后,服务器生成包含用户信息的JWT令牌,客户端在后续请求中携带该令牌进行身份验证。 + +### JWT实现细节 +```mermaid +flowchart TD +Start([用户登录]) --> ValidateCredentials["验证凭据"] +ValidateCredentials --> CredentialsValid{"凭据有效?"} +CredentialsValid --> |否| ReturnError["返回认证失败"] +CredentialsValid --> |是| GenerateToken["生成JWT令牌"] +GenerateToken --> StoreInRedis["将Token存储到Redis"] +StoreInRedis --> ReturnToken["返回Token给客户端"] +ReturnToken --> ClientRequest["客户端后续请求"] +ClientRequest --> ExtractToken["提取请求中的Token"] +ExtractToken --> VerifyToken["验证Token有效性"] +VerifyToken --> TokenValid{"Token有效?"} +TokenValid --> |否| ReturnUnauthorized["返回未授权"] +TokenValid --> |是| RefreshToken["续签Token"] +RefreshToken --> ContinueRequest["继续处理请求"] +ReturnError --> End([结束]) +ReturnUnauthorized --> End +ContinueRequest --> End +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L50-L100) +- [user_token.go](file://utility/token/user_token.go#L1-L50) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [user_token.go](file://utility/token/user_token.go#L1-L50) + +## 基于Casbin的RBAC授权 +系统采用Casbin框架实现基于角色的访问控制(RBAC)。通过定义角色、权限和资源之间的关系,实现细粒度的权限控制。 + +### RBAC模型配置 +```conf +# rbac_model.conf +[request_definition] +r = sub, obj, act + +[policy_definition] +p = sub, obj, act + +[role_definition] +g = _, _ + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act +``` + +### 权限检查流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Middleware as "中间件" +participant Casbin as "Casbin引擎" +participant Policy as "策略存储" +Client->>Middleware : 发送受保护的请求 +Middleware->>Casbin : 获取用户角色 +Casbin->>Policy : 加载用户权限策略 +Policy-->>Casbin : 返回策略规则 +Casbin->>Casbin : 构建权限检查请求 +Casbin->>Casbin : 执行权限匹配 +alt 有权限 +Casbin-->>Middleware : 返回允许访问 +Middleware->>Client : 继续处理请求 +else 无权限 +Casbin-->>Middleware : 返回拒绝访问 +Middleware->>Client : 返回403错误 +end +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L15) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L1-L50) +- [v_1_sys_casbin_rule.go](file://internal/dao/v_1_sys_casbin_rule.go#L1-L28) + +**Section sources** +- [sys_casbin.go](file://internal/service/sys_casbin.go#L1-L50) +- [v_1_sys_casbin_rule.go](file://internal/dao/v_1_sys_casbin_rule.go#L1-L28) + +## TOTP双因素认证(MFA) +系统集成了TOTP(Time-based One-Time Password)双因素认证机制,通过Google Authenticator等认证应用生成动态验证码,增强账户安全性。 + +### MFA实现流程 +```mermaid +sequenceDiagram +participant User as "用户" +participant Server as "服务器" +participant Authenticator as "认证应用" +User->>Server : 请求启用MFA +Server->>Server : 生成密钥和二维码 +Server-->>User : 返回二维码和密钥 +User->>Authenticator : 扫描二维码 +Authenticator->>Authenticator : 生成动态验证码 +User->>Server : 提交验证码和密码 +Server->>Server : 验证TOTP码 +alt 验证成功 +Server->>Server : 保存MFA设置 +Server-->>User : MFA启用成功 +else 验证失败 +Server-->>User : 返回验证失败 +end +``` + +### MFA状态检查 +```mermaid +flowchart TD +Start([获取MFA状态]) --> GetUser["获取当前用户信息"] +GetUser --> HasSecret{"已设置密钥?"} +HasSecret --> |是| SetStatus["状态: 已启用"] +HasSecret --> |否| GenerateQR["生成二维码"] +GenerateQR --> GetOtp["调用GetOtp生成密钥"] +GetOtp --> StoreQR["存储二维码信息"] +StoreQR --> SetStatus["状态: 未启用"] +SetStatus --> ReturnResult["返回状态和二维码"] +ReturnResult --> End([结束]) +``` + +**Diagram sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) + +**Section sources** +- [mfa.go](file://utility/mfa/mfa.go#L1-L53) +- [sysUser_v1_totp_status_get.go](file://internal/controller/sysUser/sysUser_v1_totp_status_get.go#L1-L37) +- [sysUser_v1_totp_set.go](file://internal/controller/sysUser/sysUser_v1_totp_set.go#L1-L34) + +## 数据加密机制 +系统采用AES ECB模式和MD5哈希算法对敏感数据进行加密保护,确保数据在传输和存储过程中的安全性。 + +### AES ECB加密实现 +```mermaid +flowchart TD +Start([明文数据]) --> Padding["PKCS7填充"] +Padding --> CreateCipher["创建AES密码器"] +CreateCipher --> Encrypt["CBC模式加密"] +Encrypt --> EncodeBase64["Base64编码"] +EncodeBase64 --> Ciphertext["密文输出"] +Ciphertext --> End([完成]) +subgraph "解密流程" +Ciphertext2["密文输入"] --> DecodeBase64["Base64解码"] +DecodeBase64 --> CreateCipher2["创建AES密码器"] +CreateCipher2 --> Decrypt["CBC模式解密"] +Decrypt --> Unpadding["PKCS7反填充"] +Unpadding --> Plaintext["明文输出"] +end +``` + +### MD5哈希实现 +```mermaid +flowchart TD +Start([输入字符串]) --> CreateHash["创建MD5哈希器"] +CreateHash --> WriteData["写入数据"] +WriteData --> ComputeHash["计算哈希值"] +ComputeHash --> EncodeHex["十六进制编码"] +EncodeHex --> Result["返回MD5值"] +Result --> End([完成]) +subgraph "大小写转换" +Result --> ToLower["转换为小写"] +Result --> ToUpper["转换为大写"] +end +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L1-L91) +- [md5.go](file://utility/verify/md5.go#L1-L32) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L1-L91) +- [md5.go](file://utility/verify/md5.go#L1-L32) + +## 会话管理与令牌续签 +系统实现了安全的会话管理机制,通过Redis存储会话信息,并支持令牌自动续签功能,平衡安全性和用户体验。 + +### 会话管理流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Server as "服务器" +participant Redis as "Redis" +Client->>Server : 登录请求 +Server->>Server : 验证凭据 +alt 验证成功 +Server->>Server : 生成JWT令牌 +Server->>Redis : 存储会话信息 +Redis-->>Server : 存储成功 +Server-->>Client : 返回令牌 +else 验证失败 +Server-->>Client : 返回错误 +end +Client->>Server : 后续请求(含令牌) +Server->>Redis : 验证令牌有效性 +alt 令牌有效 +Server->>Server : 续签令牌(如需要) +Server->>Redis : 更新会话 +Server-->>Client : 处理请求 +else 令牌无效 +Server-->>Client : 返回401错误 +end +``` + +**Diagram sources** +- [auth.go](file://internal/middleware/auth.go#L50-L100) +- [user_token.go](file://utility/token/user_token.go#L1-L50) +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [user_token.go](file://utility/token/user_token.go#L1-L50) + +## 安全最佳实践 +### 密码策略 +- 密码长度至少8位 +- 必须包含大小写字母、数字和特殊字符 +- 定期强制更换密码 +- 禁止使用常见弱密码 + +### 令牌管理 +- JWT令牌设置合理的过期时间 +- 实现令牌黑名单机制 +- 支持令牌续签功能 +- 敏感操作要求重新认证 + +### 安全头配置 +- 启用HTTPS强制加密 +- 配置CSP(Content Security Policy) +- 设置X-Content-Type-Options头 +- 启用X-Frame-Options防止点击劫持 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [user_token.go](file://utility/token/user_token.go#L1-L50) + +## 常见安全威胁与缓解措施 +### 威胁类型与应对 +| 威胁类型 | 风险描述 | 缓解措施 | +|---------|--------|---------| +| 暴力破解 | 攻击者尝试大量密码组合 | 账号锁定机制、验证码、登录失败限制 | +| 会话劫持 | 攻击者窃取用户会话令牌 | HTTPS传输、HttpOnly Cookie、令牌续签 | +| XSS攻击 | 跨站脚本注入 | 输入验证、输出编码、CSP策略 | +| CSRF攻击 | 跨站请求伪造 | CSRF令牌、SameSite Cookie | +| SQL注入 | 恶意SQL语句执行 | 参数化查询、输入验证 | +| 权限提升 | 用户获取未授权权限 | RBAC严格控制、最小权限原则 | + +### 安全监控 +- 记录所有登录尝试 +- 监控异常登录行为 +- 定期安全审计 +- 实时告警机制 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [errHandler.go](file://internal/errHandler/handler.go#L1-L50) + +## 开发者安全编码指南 +### 输入验证 +- 对所有用户输入进行严格验证 +- 使用白名单验证机制 +- 防止SQL注入和XSS攻击 + +### 错误处理 +- 不泄露敏感信息到错误消息 +- 统一错误处理机制 +- 详细日志记录但不暴露给用户 + +### 权限检查 +- 所有API端点都应进行权限验证 +- 实现最小权限原则 +- 敏感操作需要二次确认 + +### 数据保护 +- 敏感数据加密存储 +- 避免在日志中记录敏感信息 +- 定期轮换加密密钥 + +**Section sources** +- [auth.go](file://internal/middleware/auth.go#L1-L154) +- [sys_user.go](file://internal/service/sys_user.go#L1-L102) +- [verify.go](file://utility/verify/aes_ecb.go#L1-L91) + +## 结论 +kami_backend系统通过多层次的安全机制,构建了完整的安全防护体系。基于JWT的认证、Casbin的RBAC授权、TOTP双因素认证和数据加密技术共同保障了系统的安全性。建议持续关注安全威胁变化,定期进行安全审计,不断优化安全策略,确保系统长期安全稳定运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/安全考虑/授权机制.md b/.qoder/repowiki/zh/content/安全考虑/授权机制.md new file mode 100644 index 00000000..d0dc9d34 --- /dev/null +++ b/.qoder/repowiki/zh/content/安全考虑/授权机制.md @@ -0,0 +1,209 @@ +# 授权机制 + + +**本文档引用文件** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go) +- [sys_casbin.go](file://internal/service/sys_casbin.go) +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go) +- [sys_auth_rule_v1_rule_search.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go) + + +## 目录 +1. [简介](#简介) +2. [RBAC模型配置](#rbac模型配置) +3. [权限检查实现机制](#权限检查实现机制) +4. [角色与权限管理接口](#角色与权限管理接口) +5. [权限策略配置示例与最佳实践](#权限策略配置示例与最佳实践) +6. [权限缓存与性能优化](#权限缓存与性能优化) +7. [自定义权限策略指导](#自定义权限策略指导) +8. [调试技巧](#调试技巧) + +## 简介 +kami_backend系统采用基于Casbin的RBAC(基于角色的访问控制)授权机制,实现了灵活且可扩展的权限管理系统。该系统通过定义角色、权限和资源之间的关系,控制用户对系统功能的访问。核心组件包括权限模型定义、策略存储、权限验证中间件以及管理接口。 + +**Section sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L1-L50) + +## RBAC模型配置 +系统权限模型定义位于`resource/casbin/rbac_model.conf`文件中,采用标准的Casbin配置格式。模型包含请求定义、策略定义、角色定义、策略效果和匹配器五个部分。 + +```mermaid +erDiagram +USER { +string username PK +} +ROLE { +string role_name PK +} +PERMISSION { +string obj +string act +} +USER ||--o{ ROLE : "has" +ROLE ||--o{ PERMISSION : "grants" +``` + +**Diagram sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 权限检查实现机制 +权限检查机制通过Casbin的SyncedEnforcer实现,集成在系统服务层。当用户发起请求时,系统会提取用户身份(sub)、请求资源(obj)和操作类型(act),然后通过匹配器规则进行权限验证。 + +权限验证流程如下: +1. 从上下文中获取用户信息 +2. 构造Casbin请求参数(sub, obj, act) +3. 调用Enforcer的Enforce方法进行权限检查 +4. 根据返回结果决定是否允许访问 + +```mermaid +flowchart TD +A[用户请求] --> B{提取用户身份} +B --> C[构造权限检查参数] +C --> D[调用Casbin Enforcer] +D --> E{权限是否允许?} +E --> |是| F[执行业务逻辑] +E --> |否| G[返回权限拒绝] +``` + +**Diagram sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L35-L45) + +**Section sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L35-L100) + +## 角色与权限管理接口 +系统提供了完整的角色和权限管理接口,支持权限规则的创建、更新、删除和查询操作。这些接口位于`internal/controller/sys_auth_rule/`目录下,通过RESTful API提供服务。 + +### 权限管理接口 +- **创建权限规则**: `RuleAdd` 方法用于添加新的权限策略 +- **更新权限规则**: `RuleUpdate` 方法用于修改现有权限策略 +- **删除权限规则**: `RuleDelete` 方法用于移除权限策略 +- **查询权限规则**: `RuleSearch` 方法用于检索权限策略 + +### 角色管理接口 +- **创建角色**: `RoleAdd` 方法用于创建新角色 +- **编辑角色**: `RoleEdit` 方法用于修改角色信息 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Controller as 控制器 +participant Service as 服务层 +participant Casbin as Casbin Enforcer +Client->>Controller : 发送权限管理请求 +Controller->>Service : 调用服务方法 +Service->>Casbin : 执行策略操作 +Casbin-->>Service : 返回操作结果 +Service-->>Controller : 返回处理结果 +Controller-->>Client : 返回响应 +``` + +**Diagram sources** +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L15) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L15) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L15) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go#L1-L15) + +**Section sources** +- [sys_auth_rule_v1_rule_add.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go#L1-L15) +- [sys_auth_rule_v1_rule_update.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go#L1-L15) +- [sys_auth_rule_v1_rule_delete.go](file://internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_delete.go#L1-L15) +- [sys_role_v1_role_add.go](file://internal/controller/sys_role/sys_role_v1_role_add.go#L1-L15) +- [sys_role_v1_role_edit.go](file://internal/controller/sys_role/sys_role_v1_role_edit.go#L1-L15) + +## 权限策略配置示例与最佳实践 +### 配置示例 +```conf +# 角色继承示例 +g = admin, super_user +g = editor, user + +# 权限分配示例 +p = admin, /api/users, GET +p = admin, /api/users, POST +p = editor, /api/articles, POST +p = user, /api/profile, GET +``` + +### 最佳实践 +1. **最小权限原则**: 只授予用户完成工作所需的最小权限 +2. **角色分层设计**: 建立角色继承关系,避免权限重复配置 +3. **资源命名规范**: 使用一致的资源命名约定,便于权限管理 +4. **定期审计**: 定期审查权限分配,确保权限配置的合理性 + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) + +## 权限缓存与性能优化 +系统通过SyncedEnforcer实现权限缓存机制,提高权限检查性能。所有权限策略存储在数据库中,通过V1SysCasbinRule表进行持久化管理。 + +### 性能优化策略 +1. **同步执行器**: 使用SyncedEnforcer确保多实例环境下的策略一致性 +2. **数据库持久化**: 将策略规则存储在数据库中,支持动态更新 +3. **批量操作**: 提供AddPolicies和RemovePolicies方法支持批量策略操作 +4. **过滤删除**: 支持按条件过滤删除策略规则 + +```mermaid +classDiagram +class sCasbin { ++Enforcer *casbin.SyncedEnforcer ++EnforcerErr error ++Ctx context.Context ++CasbinEnforcer(ctx) (*casbin.SyncedEnforcer, error) ++SavePolicy(model) error ++LoadPolicy(model) error ++AddPolicy(sec, pType, rule) error ++RemovePolicy(sec, pType, rule) error +} +class ICasbin { ++CasbinEnforcer(ctx) (*casbin.SyncedEnforcer, error) ++SavePolicy(model) error ++LoadPolicy(model) error ++AddPolicy(sec, pType, rule) error ++RemovePolicy(sec, pType, rule) error +} +sCasbin --> ICasbin : 实现 +``` + +**Diagram sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L35-L45) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L1-L50) + +**Section sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L50-L245) +- [sys_casbin.go](file://internal/service/sys_casbin.go#L1-L50) + +## 自定义权限策略指导 +开发者可以基于现有RBAC模型进行扩展,实现更复杂的访问控制需求。自定义策略的步骤如下: + +1. **修改模型配置**: 根据需求调整rbac_model.conf文件 +2. **扩展匹配器**: 在[matchers]部分添加自定义匹配逻辑 +3. **实现数据适配器**: 确保策略数据能够正确存储和读取 +4. **测试验证**: 通过单元测试验证自定义策略的正确性 + +**Section sources** +- [rbac_model.conf](file://resource/casbin/rbac_model.conf#L1-L14) +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L1-L245) + +## 调试技巧 +### 常见问题排查 +1. **权限检查失败**: 检查用户角色分配和策略规则是否正确 +2. **策略未生效**: 确认Enforcer已正确加载最新策略 +3. **性能问题**: 检查数据库查询性能和缓存机制 + +### 调试方法 +1. **日志跟踪**: 启用Casbin详细日志,查看权限检查过程 +2. **策略导出**: 使用LoadPolicy方法导出现有策略进行分析 +3. **单元测试**: 编写测试用例验证权限逻辑的正确性 + +**Section sources** +- [sysCasbin.go](file://internal/logic/sys_casbin/sysCasbin.go#L1-L245) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/安全考虑/数据安全.md b/.qoder/repowiki/zh/content/安全考虑/数据安全.md new file mode 100644 index 00000000..6d9b13d1 --- /dev/null +++ b/.qoder/repowiki/zh/content/安全考虑/数据安全.md @@ -0,0 +1,296 @@ +# 数据安全 + + +**Referenced Files in This Document** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [config.go](file://utility/config/config.go) +- [tools.go](file://utility/utils/tools.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [user_center.go](file://internal/systemV2/logic/user_center/user_center.go) +- [v_1_sys_user.go](file://internal/dao/internal/v_1_sys_user.go) + + +## 目录 +1. [引言](#引言) +2. [加密模块架构](#加密模块架构) +3. [AES加密机制](#aes加密机制) +4. [MD5哈希算法](#md5哈希算法) +5. [敏感数据存储策略](#敏感数据存储策略) +6. [数据完整性验证](#数据完整性验证) +7. [加密配置与密钥管理](#加密配置与密钥管理) +8. [开发者安全编码指南](#开发者安全编码指南) +9. [结论](#结论) + +## 引言 + +kami_backend系统的数据安全机制采用多层次的安全策略,确保敏感数据在传输和存储过程中的安全性。系统主要采用AES加密算法对敏感数据进行保护,同时使用MD5哈希算法处理密码等认证信息。本文档详细阐述了系统的数据安全架构、加密算法实现、密钥管理策略以及开发者在使用这些安全机制时的最佳实践。 + +系统通过AES-CBC模式加密确保数据的机密性,通过MD5哈希加盐处理确保密码的安全存储。同时,系统实现了完整的密钥管理机制,将加密密钥与初始化向量(IV)分离存储,提高了系统的整体安全性。 + +## 加密模块架构 + +kami_backend系统的数据安全功能主要分布在`utility/verify`和`utility/utils`两个包中,形成了清晰的分层架构。`utility/verify`包提供了底层的加密和哈希算法实现,而`utility/utils`包则提供了更高层次的安全工具函数,便于业务逻辑调用。 + +```mermaid +graph TD +A[业务逻辑层] --> B[安全工具层] +B --> C[AES加密模块] +B --> D[MD5哈希模块] +C --> E[CBC模式加密] +C --> F[Base64编码] +D --> G[密码哈希] +D --> H[盐值处理] +E --> I[密钥管理] +F --> J[数据编码] +G --> K[双重MD5] +H --> L[随机盐值] +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go) +- [md5.go](file://utility/verify/md5.go) +- [tools.go](file://utility/utils/tools.go) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L1-L90) +- [md5.go](file://utility/verify/md5.go#L1-L31) +- [tools.go](file://utility/utils/tools.go#L1-L25) + +## AES加密机制 + +### AES-CBC模式实现 + +kami_backend系统采用AES-CBC(Cipher Block Chaining)模式进行数据加密,而非文档中提到的ECB模式。CBC模式通过将前一个密文块与当前明文块进行异或操作,有效解决了ECB模式中相同明文产生相同密文的安全问题。 + +系统在`utility/verify/aes_ecb.go`文件中实现了完整的AES-CBC加密解密功能,包括: + +- `aesCBCEncrypt`: AES-CBC模式加密函数,使用PKCS7填充标准 +- `aesCBCDecrypt`: AES-CBC模式解密函数,支持PKCS7反填充 +- `AesCBCEncryptWithBase64`: 带Base64编码的加密函数,便于网络传输 +- `AesCBCStdDecryptWithBase64`: 带Base64解码的标准解密函数 + +```mermaid +sequenceDiagram +participant 应用层 as 应用层 +participant 加密工具 as 加密工具 +participant AES模块 as AES模块 +应用层->>加密工具 : 调用AesCBCEncryptWithBase64 +加密工具->>AES模块 : aesCBCEncrypt(明文, 密钥, IV) +AES模块->>AES模块 : PKCS7填充明文 +AES模块->>AES模块 : 创建AES密码块 +AES模块->>AES模块 : 初始化CBC加密器 +AES模块->>AES模块 : 执行加密操作 +AES模块-->>加密工具 : 返回密文 +加密工具->>加密工具 : Base64编码 +加密工具-->>应用层 : 返回Base64编码的密文 +应用层->>加密工具 : 调用AesCBCStdDecryptWithBase64 +加密工具->>加密工具 : Base64解码 +加密工具->>AES模块 : aesCBCDecrypt(密文, 密钥, IV) +AES模块->>AES模块 : 创建AES密码块 +AES模块->>AES模块 : 初始化CBC解密器 +AES模块->>AES模块 : 执行解密操作 +AES模块->>AES模块 : PKCS7反填充 +AES模块-->>加密工具 : 返回明文 +加密工具-->>应用层 : 返回解密后的明文 +``` + +**Diagram sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L15-L85) + +**Section sources** +- [aes_ecb.go](file://utility/verify/aes_ecb.go#L15-L85) + +### PKCS7填充机制 + +系统实现了标准的PKCS7填充机制,确保明文长度符合AES块大小的要求。填充规则如下: + +- 如果明文长度正好是块大小的整数倍,则添加一个完整的填充块 +- 填充字节的值等于填充的字节数 +- 解密时,根据最后一个字节的值确定需要移除的填充字节数 + +这种填充方式确保了加密数据的完整性,同时避免了因填充不当导致的解密失败。 + +## MD5哈希算法 + +### 密码哈希处理 + +kami_backend系统使用MD5哈希算法处理用户密码,但采用了增强的安全措施,避免了直接使用MD5带来的安全风险。系统在`utility/utils/tools.go`文件中实现了`EncryptPassword`函数,该函数采用双重MD5哈希加盐的处理方式: + +```mermaid +flowchart TD +Start([开始]) --> Hash1["MD5(原始密码)"] +Hash1 --> Concat["MD5(原始密码)+MD5(盐值)"] +Concat --> Hash2["MD5(MD5(原始密码)+MD5(盐值))"] +Hash2 --> End([存储哈希值]) +Salt[生成随机盐值] --> Concat +``` + +**Diagram sources** +- [tools.go](file://utility/utils/tools.go#L22-L24) + +**Section sources** +- [tools.go](file://utility/utils/tools.go#L22-L24) + +### 哈希函数实现 + +系统提供了两个MD5哈希函数: + +- `GetMD5LOWER`: 返回小写格式的MD5哈希值 +- `GetMD5Upper`: 返回大写格式的MD5哈希值 + +这些函数封装了标准的MD5算法,提供了便捷的接口供系统其他部分调用。同时,系统还提供了`MapToString`辅助函数,用于将map数据转换为key=value形式的字符串,便于生成签名或进行数据校验。 + +## 敏感数据存储策略 + +### 用户密码存储 + +系统对用户密码采用了严格的安全存储策略,确保即使数据库被泄露,攻击者也无法轻易获取用户的原始密码。具体实现如下: + +1. **盐值生成**: 每次用户注册或修改密码时,系统生成一个10位的随机盐值 +2. **双重哈希**: 使用`EncryptPassword`函数对密码进行双重MD5哈希处理 +3. **分离存储**: 将哈希后的密码和盐值分别存储在不同的数据库字段中 + +```mermaid +classDiagram +class SysUser { ++string id ++string username ++string user_password ++string user_salt ++int is_admin ++int user_status ++string otp_key ++string otp_secret ++datetime created_at ++datetime updated_at ++datetime deleted_at +} +class UserInfo { ++string id ++string user_id ++string passwd ++string nick ++string remark ++string ip ++int status ++int role ++string role_name ++string otp_secret ++string otp_key ++datetime create_time ++datetime update_time +} +SysUser --> UserInfo : "1对1关联" +``` + +**Diagram sources** +- [v_1_sys_user.go](file://internal/dao/internal/v_1_sys_user.go#L37-L81) +- [sys_user.go](file://internal/model/sys_user.go#L0-L91) + +**Section sources** +- [v_1_sys_user.go](file://internal/dao/internal/v_1_sys_user.go#L37-L81) +- [sys_user.go](file://internal/model/sys_user.go#L0-L91) + +### 密码验证流程 + +当用户登录时,系统执行以下验证流程: + +1. 根据用户名查询用户信息,获取存储的盐值和哈希密码 +2. 使用相同的盐值对用户输入的密码进行哈希处理 +3. 比较生成的哈希值与存储的哈希值是否匹配 + +这种机制确保了系统永远不会存储或处理用户的原始密码,提高了整体安全性。 + +## 数据完整性验证 + +### 密钥配置管理 + +系统通过配置文件管理加密密钥和初始化向量,确保密钥的安全性和可维护性。在`utility/config/config.go`文件中,系统提供了`GetFrontendSecret`和`GetBackendSecret`函数,用于获取前端和后端的加密密钥配置。 + +```mermaid +flowchart TD +A[配置文件] --> B[secret.frontend.key] +A --> C[secret.frontend.iv] +B --> D[前端密钥] +C --> E[前端IV] +D --> F[加密/解密] +E --> F[加密/解密] +G[业务逻辑] --> H[调用GetFrontendSecret] +H --> I[返回密钥和IV] +I --> J[执行加密操作] +``` + +**Diagram sources** +- [config.go](file://utility/config/config.go#L15-L35) + +**Section sources** +- [config.go](file://utility/config/config.go#L15-L35) + +### 跨系统密码验证 + +系统实现了跨系统的密码验证机制,确保在不同加密配置下的密码一致性验证。在`internal/systemV2/logic/user_center/user_center.go`文件中,`CheckPassword`函数展示了如何使用不同的密钥配置进行密码验证: + +1. 使用前端密钥解密新密码 +2. 使用后端密钥解密旧密码 +3. 比较解密后的明文是否相同 + +这种机制允许系统在不同环境下使用不同的加密配置,同时保持密码验证的一致性。 + +## 加密配置与密钥管理 + +### 最佳实践 + +基于kami_backend系统的实现,以下是数据安全配置的最佳实践: + +#### 密钥管理 +- **密钥分离**: 将加密密钥与初始化向量(IV)分离存储 +- **定期轮换**: 定期更新加密密钥,降低密钥泄露的风险 +- **安全存储**: 密钥不应硬编码在代码中,而应通过安全的配置管理机制存储 + +#### 算法选择 +- **避免ECB模式**: ECB模式存在安全缺陷,应使用CBC、GCM等更安全的模式 +- **使用强哈希**: 对于密码哈希,建议使用bcrypt、scrypt或PBKDF2等专门设计的密码哈希函数,而非MD5 +- **多重保护**: 采用多重哈希或加盐处理,增加密码破解的难度 + +#### 性能考量 +- **缓存机制**: 对于频繁访问的加密数据,考虑使用安全的缓存机制 +- **异步处理**: 对于大量数据的加密解密操作,考虑使用异步处理避免阻塞主线程 +- **资源监控**: 监控加密操作的性能指标,及时发现潜在的性能瓶颈 + +## 开发者安全编码指南 + +### 安全编码实践 + +开发者在使用kami_backend系统的安全机制时,应遵循以下最佳实践: + +1. **始终使用安全工具**: 直接调用`utility/utils`包中的`EncryptPassword`等安全函数,避免自行实现加密逻辑 +2. **正确处理错误**: 妥善处理加密解密过程中的错误,避免泄露敏感信息 +3. **最小权限原则**: 加密密钥的访问应遵循最小权限原则,仅限必要的模块和人员访问 +4. **日志安全**: 避免在日志中记录明文密码或加密密钥等敏感信息 + +### 潜在风险防范 + +系统存在以下潜在安全风险,需要特别注意: + +1. **MD5算法弱安全性**: MD5已被证明存在碰撞漏洞,建议升级到更安全的哈希算法 +2. **密钥配置一致性**: `GetBackendSecret`函数错误地使用了前端密钥配置,可能导致安全漏洞 +3. **缺乏密钥轮换机制**: 系统未实现自动的密钥轮换机制,长期使用同一密钥增加泄露风险 +4. **CBC模式IV管理**: IV的管理方式未明确说明,不当的IV使用可能导致安全问题 + +### 推荐改进措施 + +为了进一步提升系统的安全性,建议采取以下改进措施: + +1. **升级哈希算法**: 将MD5替换为bcrypt或scrypt等专门设计的密码哈希函数 +2. **实现密钥轮换**: 添加密钥版本管理机制,支持平滑的密钥轮换 +3. **增强密钥保护**: 使用硬件安全模块(HSM)或密钥管理服务(KMS)保护加密密钥 +4. **添加完整性校验**: 在加密数据中添加消息认证码(MAC),防止数据篡改 + +## 结论 + +kami_backend系统建立了一套完整的数据安全机制,通过AES加密和MD5哈希算法保护敏感数据。系统实现了分层的安全架构,将底层加密算法与高层安全工具分离,提高了代码的可维护性。 + +然而,系统在算法选择和密钥管理方面仍有改进空间。建议逐步升级到更安全的密码学算法,并完善密钥管理机制。开发者应严格遵循安全编码指南,避免引入新的安全漏洞。 + +通过持续改进和严格的安全实践,kami_backend系统能够为用户提供可靠的数据安全保障,满足现代应用的安全需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/安全考虑/认证机制.md b/.qoder/repowiki/zh/content/安全考虑/认证机制.md new file mode 100644 index 00000000..3e494885 --- /dev/null +++ b/.qoder/repowiki/zh/content/安全考虑/认证机制.md @@ -0,0 +1,340 @@ +# 认证机制 + + +**本文档引用文件** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [v_1_sys_user.go](file://internal/model/entity/v_1_sys_user.go) + + +## 目录 +1. [简介](#简介) +2. [认证流程概述](#认证流程概述) +3. [登录接口实现](#登录接口实现) +4. [JWT令牌生成与解析](#jwt令牌生成与解析) +5. [中间件认证机制](#中间件认证机制) +6. [会话管理与令牌刷新](#会话管理与令牌刷新) +7. [安全配置选项](#安全配置选项) +8. [开发者集成指南](#开发者集成指南) +9. [常见问题解决方案](#常见问题解决方案) + +## 简介 +kami_backend系统采用基于JWT(JSON Web Token)的认证机制,结合Redis缓存实现安全的用户身份验证。系统支持多种认证方式,包括标准登录认证和IFrame嵌入式认证,通过中间件统一拦截和验证请求。认证流程涵盖用户凭证处理、令牌生成、验证、刷新和过期处理等关键环节,确保系统的安全性和可用性。 + +## 认证流程概述 +kami_backend的认证流程分为两个主要部分:用户登录时的令牌生成和后续请求的令牌验证。系统采用双层认证策略,通过`LoginOrIframeAuth`中间件根据请求头中的`tokenFrom`字段决定使用哪种认证方式。对于公开接口,系统维护了一个白名单,允许无需认证的访问。 + +```mermaid +sequenceDiagram +participant 用户 +participant 登录接口 +participant 令牌生成器 +participant Redis +participant 认证中间件 +participant 业务接口 +用户->>登录接口 : 提交用户名、密码、验证码 +登录接口->>认证中间件 : 验证验证码 +认证中间件-->>登录接口 : 验证结果 +登录接口->>数据库 : 查询用户信息 +数据库-->>登录接口 : 用户数据 +登录接口->>令牌生成器 : 生成JWT令牌 +令牌生成器->>Redis : 存储令牌 +Redis-->>令牌生成器 : 存储确认 +令牌生成器-->>登录接口 : 返回令牌 +登录接口-->>用户 : 返回包含令牌的响应 +用户->>业务接口 : 带令牌的请求 +认证中间件->>Redis : 验证令牌有效性 +Redis-->>认证中间件 : 令牌状态 +认证中间件->>令牌解析器 : 解析JWT令牌 +令牌解析器-->>认证中间件 : 用户信息 +认证中间件->>令牌刷新器 : 检查是否需要刷新 +令牌刷新器-->>认证中间件 : 新令牌如需 +认证中间件-->>业务接口 : 继续处理请求 +``` + +**图示来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) + +## 登录接口实现 +登录接口位于`internal/controller/sys_user_login/sys_user_login_v1_user_login.go`,负责处理用户登录请求。接口实现包含多层安全验证,确保认证过程的安全性。 + +### 认证步骤 +1. **验证码验证**:首先验证用户提交的验证码是否正确 +2. **用户名密码验证**:查询数据库验证用户名和密码 +3. **双因素认证**:如果用户启用了TOTP,验证提供的验证码 +4. **用户状态检查**:确认用户账户处于正常状态 +5. **令牌生成**:通过`GenerateUserToken`函数生成JWT令牌 + +### 安全特性 +- 验证码机制防止暴力破解 +- 密码使用盐值加密存储 +- 支持TOTP双因素认证 +- 用户状态检查防止禁用账户登录 + +**本节来源** +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) +- [v_1_sys_user.go](file://internal/model/entity/v_1_sys_user.go) + +## JWT令牌生成与解析 +系统使用`github.com/golang-jwt/jwt/v5`库实现JWT令牌的生成和解析,确保认证令牌的安全性和标准化。 + +### 令牌结构 +```go +type UserToken struct { + UserID string + Username string + jwt.RegisteredClaims +} +``` + +### 令牌生成 +`GenerateUserToken`函数负责生成JWT令牌,主要步骤包括: +1. 从配置中获取令牌选项(超时时间、加密密钥等) +2. 创建包含用户信息和声明的`UserToken`结构体 +3. 使用HS256算法和配置的加密密钥签名生成令牌 +4. 将令牌存储到Redis缓存中(如果配置了Redis模式) + +```go +func GenerateUserToken(ctx context.Context, userName, userID string) (string, error) { + tokenCfg, err := config.NewConfig(ctx).GetTokenOptions() + if err != nil { + return "", err + } + t := UserToken{ + UserID: userID, + Username: userName, + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: "Auth Server", + Subject: userName, + Audience: nil, + ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(tokenCfg.Timeout) * time.Second)), + IssuedAt: jwt.NewNumericDate(time.Now()), + ID: utils.GenerateRandomUUID(), + }, + } + token, err := t.genToken(ctx) + if tokenCfg.CacheModel == CacheModelRedis { + _ = cache.NewCache().Set(ctx, fmt.Sprintf("Token:%s:%s:%s", tokenCfg.CacheKey, t.UserID, t.ID), token, time.Duration(tokenCfg.Timeout*int64(time.Second))) + } + return token, err +} +``` + +### 令牌解析 +`ParseUserToken`函数负责解析和验证JWT令牌: +1. 从请求中提取令牌(支持Bearer格式) +2. 使用配置的加密密钥验证令牌签名 +3. 检查令牌是否过期 +4. 返回解析后的用户信息 + +**本节来源** +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +## 中间件认证机制 +认证中间件位于`internal/middleware/auth.go`,是整个系统认证的核心组件,负责拦截和验证所有请求的认证信息。 + +### 认证类型 +系统支持三种认证方式: +- **白名单认证**:对特定路径的请求直接放行 +- **登录认证**:基于JWT令牌的标准认证 +- **IFrame认证**:基于AES加密的嵌入式认证 + +### 认证流程 +```mermaid +flowchart TD +A[请求到达] --> B{路径在白名单?} +B --> |是| C[放行请求] +B --> |否| D{tokenFrom=login?} +D --> |是| E[执行登录认证] +D --> |否| F{tokenFrom=iframe?} +F --> |是| G[执行IFrame认证] +F --> |否| H[返回错误:token来源不明] +E --> I{认证成功?} +I --> |是| J[放行请求] +I --> |否| K[返回认证错误] +G --> L{认证成功?} +L --> |是| M[放行请求] +L --> |否| N[返回认证错误] +``` + +### 白名单路径 +系统为特定接口配置了白名单,无需认证即可访问: +- `/api/merchant/order/query` +- `/api/restriction/block/order` +- `/api/cardInfo/appleCard/submit` +- 其他公开接口... + +**本节来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) + +## 会话管理与令牌刷新 +系统实现了完善的会话管理机制,通过Redis存储令牌状态,并支持令牌自动刷新功能。 + +### 会话存储 +- **存储模式**:支持内存和Redis两种模式,生产环境推荐使用Redis +- **存储键格式**:`Token:{cacheKey}:{userID}:{uuid}` +- **过期时间**:与令牌超时时间一致,自动同步过期 + +### 令牌刷新机制 +系统在每次请求验证令牌时检查是否需要刷新: +1. 计算令牌已使用时间 +2. 如果使用时间超过`MaxRefresh`配置但未过期,则生成新令牌 +3. 将新令牌通过`refresh-token`响应头返回给客户端 + +```go +func RefreshUserToken(ctx context.Context, userToken UserToken) (newToken string, err error) { + tokenCfg, err := config.NewConfig(ctx).GetTokenOptions() + if err != nil { + return "", err + } + issuerDate, err := userToken.GetIssuedAt() + if err != nil { + return "", errors.New("invalid token") + } + if tokenCfg.MaxRefresh == 0 { + return "", nil + } + if time.Since(issuerDate.Time) > time.Duration(tokenCfg.MaxRefresh) && + time.Since(issuerDate.Time) < time.Duration(tokenCfg.Timeout) { + newToken, err = GenerateUserToken(ctx, userToken.Username, userToken.UserID) + return newToken, err + } + return +} +``` + +### 令牌注销 +系统提供`DeleteTokenFromRedis`函数用于主动注销令牌,通常在用户登出时调用。 + +**本节来源** +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) + +## 安全配置选项 +系统通过配置文件灵活管理认证相关的安全参数,所有配置位于`manifest/config/config.yaml`。 + +### 配置项说明 +| 配置项 | 默认值 | 说明 | +|-------|-------|------| +| `token.timeout` | 3600 | 令牌有效期(秒) | +| `token.maxRefresh` | 1800 | 令牌最大刷新时间(秒) | +| `token.cacheModel` | redis | 缓存模式(memory/redis) | +| `token.cacheKey` | user_token | Redis缓存键前缀 | +| `token.encryptKey` | 随机生成 | JWT签名加密密钥 | +| `secret.frontend.key` | 随机生成 | 前端加密密钥 | +| `secret.frontend.iv` | 随机生成 | 前端加密IV向量 | + +### 配置加载 +配置通过`utility/config/config.go`中的`GetTokenOptions`函数加载: +```go +func (c *Config) GetTokenOptions() (opts TokenOptions, err error) { + result, err := c.getDataByKey("token") + if err != nil { + return + } + if err2 := result.Struct(&opts); err2 != nil { + err = err2 + return + } + return +} +``` + +### 安全建议 +- 定期轮换`encryptKey`和`secret`配置 +- 生产环境必须使用Redis模式而非内存模式 +- 根据业务需求合理设置`timeout`和`maxRefresh`值 +- 监控异常登录行为并及时响应 + +**本节来源** +- [config.go](file://utility/config/config.go) +- [user_token.go](file://utility/token/user_token.go) + +## 开发者集成指南 +本指南为开发者提供认证机制的集成方法和最佳实践。 + +### 前端集成 +1. **登录流程**: + - 调用`/api/sysUser/login`接口提交认证信息 + - 保存返回的令牌用于后续请求 + - 监听`refresh-token`响应头更新本地令牌 + +2. **请求认证**: + - 在请求头中添加`Authorization: Bearer {token}` + - 或在请求头中添加`tokenFrom: login` + +3. **错误处理**: + - `401 Unauthorized`:令牌无效或过期,需要重新登录 + - `403 Forbidden`:权限不足 + - `429 Too Many Requests`:请求过于频繁 + +### 后端集成 +1. **保护接口**:在路由中使用`LoginOrIframeAuth`中间件 +2. **获取用户信息**:通过上下文获取已认证的用户信息 +3. **自定义认证**:可根据需要扩展认证逻辑 + +### 测试建议 +- 使用`user_token_test.go`中的测试用例验证令牌功能 +- 模拟各种异常情况(过期令牌、无效签名等) +- 测试白名单路径的访问权限 + +**本节来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [sys_user_login_v1_user_login.go](file://internal/controller/sys_user_login/sys_user_login_v1_user_login.go) + +## 常见问题解决方案 +### 问题1:登录成功但后续请求返回401错误 +**可能原因**: +- 令牌未正确添加到请求头 +- 令牌格式错误(缺少Bearer前缀) +- Redis连接问题导致令牌验证失败 + +**解决方案**: +1. 检查请求头中`Authorization`字段格式是否正确 +2. 确认Redis服务正常运行 +3. 检查`token.cacheKey`配置是否一致 + +### 问题2:令牌频繁过期 +**可能原因**: +- `timeout`配置值过小 +- 系统时间不同步 +- 令牌刷新机制未正常工作 + +**解决方案**: +1. 适当增加`token.timeout`配置值 +2. 确保服务器时间同步 +3. 检查`maxRefresh`配置是否合理 + +### 问题3:IFrame认证失败 +**可能原因**: +- `tokenFrom`头未设置为`iframe` +- 前端加密密钥或IV配置错误 +- 令牌超过30分钟有效期 + +**解决方案**: +1. 确认请求头中`tokenFrom: iframe` +2. 检查`secret.frontend.key`和`secret.frontend.iv`配置 +3. 确保前端正确生成加密令牌 + +### 问题4:Redis存储的令牌无法读取 +**可能原因**: +- 缓存键前缀不匹配 +- Redis数据库选择错误 +- 序列化格式不一致 + +**解决方案**: +1. 检查`token.cacheKey`配置 +2. 确认Redis连接配置 +3. 验证序列化和反序列化逻辑 + +**本节来源** +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [config.go](file://utility/config/config.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/快速入门.md b/.qoder/repowiki/zh/content/快速入门.md new file mode 100644 index 00000000..f96a8be9 --- /dev/null +++ b/.qoder/repowiki/zh/content/快速入门.md @@ -0,0 +1,181 @@ +# 快速入门 + + +**本文档中引用的文件** +- [Makefile](file://Makefile) +- [hack/hack.mk](file://hack/hack.mk) +- [main.go](file://main.go) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [utility/config/database.go](file://utility/config/database.go) +- [internal/dao/internal/v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [internal/dao/internal/v_1_sys_config_dict.go](file://internal/dao/internal/v_1_sys_config_dict.go) + + +## 目录 +1. [简介](#简介) +2. [开发环境配置](#开发环境配置) +3. [依赖安装与构建](#依赖安装与构建) +4. [数据库初始化](#数据库初始化) +5. [项目启动](#项目启动) +6. [Hello World 示例:调用基础 API](#hello-world-示例调用基础-api) +7. [常见问题排查指南](#常见问题排查指南) +8. [总结](#总结) + +## 简介 + +本指南旨在为新开发者提供 `kami_backend` 项目的快速入门说明。通过本指南,您将在 15 分钟内完成开发环境的搭建、依赖安装、数据库初始化、服务启动,并成功调用一个基础 API 端点。本项目使用 GoFrame 框架构建,通过 `Makefile` 提供标准化操作命令,简化开发流程。 + +**Section sources** +- [main.go](file://main.go#L1-L50) +- [Makefile](file://Makefile#L1-L6) + +## 开发环境配置 + +在开始之前,请确保您的开发环境已安装以下工具: + +- **Go 1.20+**:本项目基于 Go 语言开发,建议使用 1.20 或更高版本。 +- **GF CLI 工具**:GoFrame 官方命令行工具,用于代码生成和项目管理。 +- **Docker 和 Docker Compose**:用于容器化部署和依赖服务管理。 +- **Git**:用于版本控制和获取项目代码。 + +安装 GF CLI: +```bash +go install github.com/gogf/gf/v2/tool/gf@latest +``` + +确保 `gf` 命令可在终端中执行: +```bash +gf -v +``` + +**Section sources** +- [hack/hack.mk](file://hack/hack.mk#L1-L5) + +## 依赖安装与构建 + +项目使用 `Makefile` 作为主要操作入口。构建二进制文件的命令如下: + +```bash +make build +``` + +该命令会调用 `gf build -ew`,其中: +- `-e` 表示启用调试信息 +- `-w` 表示启用竞争检测(race detection) + +此命令将生成可执行文件,完成项目依赖的自动下载与编译。 + +**Section sources** +- [Makefile](file://Makefile#L5-L8) +- [hack/hack.mk](file://hack/hack.mk#L10-L13) + +## 数据库初始化 + +项目使用 GoFrame 的 DAO(Data Access Object)机制进行数据库操作。数据库配置位于 `utility/config/database.go`,通过 `g.DB("v1")` 获取数据库实例。 + +初始化数据库表结构和迁移脚本: +```bash +make dao +``` + +该命令执行 `gf gen dao`,根据模型自动生成 DAO 层代码,包括: +- 数据表映射结构 +- 基础增删改查方法 +- 事务支持 + +数据库迁移记录表 `migrations` 用于跟踪数据库变更,确保多环境一致性。 + +**Section sources** +- [utility/config/database.go](file://utility/config/database.go#L1-L9) +- [internal/dao/internal/v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go#L31-L69) +- [internal/dao/internal/v_1_sys_config_dict.go](file://internal/dao/internal/v_1_sys_config_dict.go#L43-L90) +- [hack/hack.mk](file://hack/hack.mk#L22-L25) + +## 项目启动 + +启动项目前,请确保配置文件已准备就绪。项目配置文件位于 `manifest/config/config.yaml`。 + +使用以下命令启动服务: +```bash +make run +``` + +> **注意**:`Makefile` 中未直接定义 `run` 命令,但 `gf` 工具默认支持 `gf run` 启动主程序。您也可直接执行: +> ```bash +> go run main.go +> ``` + +服务启动后,默认监听端口为 `12401`,可通过 `docker-compose.yml` 查看端口映射配置。 + +**Section sources** +- [main.go](file://main.go#L1-L50) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L18) + +## Hello World 示例:调用基础 API + +项目提供健康检查 API 作为最简单的测试端点。 + +1. 确保服务已成功启动 +2. 使用 `curl` 发起请求: + +```bash +curl http://localhost:12401/monitor/v1/healthcheck +``` + +预期返回: +```json +{ + "code": 0, + "message": "OK", + "data": { + "status": "healthy" + } +} +``` + +该接口由 `api/monitor/v1/heathcheck.go` 定义,通过 `monitor` 模块注册路由,用于验证服务是否正常运行。 + +**Section sources** +- [api/monitor/v1/heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [internal/controller/monitor/monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) + +## 常见问题排查指南 + +### 1. `gf` 命令未找到 +**问题**:执行 `make build` 时报错 `gf: command not found` +**解决方案**:确保已安装 GF CLI 并将其路径加入 `PATH` 环境变量: +```bash +export PATH=$PATH:$(go env GOPATH)/bin +``` + +### 2. 数据库连接失败 +**问题**:启动时报错 `failed to connect database` +**解决方案**:检查 `manifest/config/config.yaml` 中的数据库配置项,确保主机、端口、用户名、密码正确。 + +### 3. 端口被占用 +**问题**:服务无法启动,提示端口 `12401` 已被占用 +**解决方案**:修改 `docker-compose.yml` 中的端口映射,或终止占用进程: +```bash +lsof -i :12401 +kill -9 +``` + +### 4. 依赖下载失败 +**问题**:`go mod download` 失败,无法拉取外部依赖 +**解决方案**:配置国内代理: +```bash +go env -w GOPROXY=https://goproxy.cn,direct +``` + +### 5. DAO 代码未生成 +**问题**:执行 `make dao` 无输出或报错 +**解决方案**:确保项目根目录存在 `model` 定义文件,并检查 `gf` 版本是否兼容。 + +**Section sources** +- [hack/hack.mk](file://hack/hack.mk#L10-L74) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L18) +- [utility/config/database.go](file://utility/config/database.go#L1-L9) + +## 总结 + +通过本指南,您已成功完成 `kami_backend` 项目的环境搭建、构建、数据库初始化与服务启动,并验证了基础 API 的可用性。项目通过 `Makefile` 统一管理常用命令,结合 GoFrame 生态工具链,极大提升了开发效率。建议后续查阅 `api/` 目录下的各模块接口文档,深入了解业务逻辑实现。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/技术栈与依赖.md b/.qoder/repowiki/zh/content/技术栈与依赖.md new file mode 100644 index 00000000..eb4e0cbf --- /dev/null +++ b/.qoder/repowiki/zh/content/技术栈与依赖.md @@ -0,0 +1,239 @@ +# 技术栈与依赖 + + +**本文档中引用的文件** +- [main.go](file://main.go) +- [go.mod](file://go.mod) +- [rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [utils.go](file://utility/otel/utils.go) +- [auth.go](file://internal/middleware/auth.go) +- [user_token.go](file://utility/token/user_token.go) +- [sys_casbin.go](file://internal/service/sys_casbin.go) + + +## 目录 +1. [简介](#简介) +2. [核心技术栈概述](#核心技术栈概述) +3. [Go语言与GoFrame框架](#go语言与goframe框架) +4. [数据库与缓存系统](#数据库与缓存系统) +5. [OpenTelemetry可观测性集成](#opentelemetry可观测性集成) +6. [Casbin与RBAC权限控制](#casbin与rbac权限控制) +7. [RESTful API设计与实现](#restful-api设计与实现) +8. [技术选型与权衡](#技术选型与权衡) +9. [总结](#总结) + +## 简介 +本项目 `kami_backend` 是一个基于 Go 语言和 GoFrame 框架构建的后端服务系统,旨在为多平台卡券充值、订单管理、商户服务等业务提供稳定、高效的技术支持。系统采用现代化微服务架构理念,集成了 OpenTelemetry 实现全面的可观测性,使用 Casbin 实现灵活的基于角色的访问控制(RBAC),并通过 RESTful API 提供标准化接口。本文档将深入剖析项目所采用的核心技术栈,详细说明其设计原理、实现方式、配置选项及协同工作机制,为开发者提供从入门到精通的完整技术指南。 + +## 核心技术栈概述 +`kami_backend` 的技术栈围绕高性能、高可靠性和可维护性构建,主要包含以下核心组件: + +- **编程语言**: Go (Golang) 1.24.0 +- **开发框架**: GoFrame v2.9.3 +- **数据库**: MySQL +- **缓存**: Redis +- **可观测性**: OpenTelemetry (OTel) +- **权限控制**: Casbin +- **API 风格**: RESTful + +这些技术的组合为系统提供了强大的并发处理能力、简洁的开发体验、高效的持久化与缓存机制、全面的监控追踪能力以及细粒度的安全访问控制。 + +**Section sources** +- [main.go](file://main.go) +- [go.mod](file://go.mod) + +## Go语言与GoFrame框架 +项目采用 Go 语言作为主要开发语言,利用其出色的并发模型(goroutine 和 channel)、高效的编译性能和简洁的语法,确保了服务的高性能和高稳定性。GoFrame 框架作为 Go 语言的全栈开发框架,为项目提供了丰富的基础设施支持。 + +GoFrame 在本项目中扮演了核心角色,提供了包括但不限于以下功能: +- **Web 服务**: 基于 `ghttp` 模块构建 RESTful API。 +- **配置管理**: 通过 `genv` 和 `config` 模块管理环境变量和配置文件。 +- **日志系统**: 使用 `glog` 模块进行结构化日志记录,并与 OpenTelemetry 集成。 +- **数据库 ORM**: 集成 `gogf/gf/contrib/drivers/mysql/v2` 驱动,提供便捷的数据库操作。 +- **NoSQL 支持**: 集成 `gogf/gf/contrib/nosql/redis/v2` 驱动,简化 Redis 操作。 +- **依赖注入**: 通过 `service` 包实现服务层的注册与调用。 + +GoFrame 的模块化设计使得项目结构清晰,`internal` 目录下的 `controller`、`service`、`dao`、`model` 等分层结构遵循了典型的 MVC 模式,保证了代码的可读性和可维护性。 + +**Section sources** +- [main.go](file://main.go#L1-L50) +- [go.mod](file://go.mod#L1-L104) + +## 数据库与缓存系统 +系统采用 MySQL 作为主关系型数据库,用于持久化存储用户信息、订单数据、商户配置、权限规则等核心业务数据。项目通过 GoFrame 的 MySQL 驱动进行数据库交互,`internal/dao` 目录下的大量 `.go` 文件定义了与数据库表一一对应的 DAO(Data Access Object)层,实现了数据的增删改查操作。 + +Redis 被用作高性能缓存和会话存储。在本项目中,Redis 的主要用途包括: +- **Token 缓存**: 用户登录后生成的 JWT Token 会存储在 Redis 中,用于实现 Token 的续签和失效控制。 +- **限流**: 结合 `utility/limiter` 模块,利用 Redis 实现分布式请求限流。 +- **临时数据存储**: 存储验证码、会话信息等临时性数据。 + +这种“MySQL + Redis”的组合模式是现代 Web 应用的标配,MySQL 保证了数据的强一致性和持久性,而 Redis 则极大地提升了系统的响应速度和吞吐量。 + +**Section sources** +- [go.mod](file://go.mod#L1-L104) +- [utility/limiter/redis.go](file://utility/limiter/redis.go) + +## OpenTelemetry可观测性集成 +为了实现对系统运行状态的全面监控,项目深度集成了 OpenTelemetry (OTel),构建了一个集日志(Logging)、指标(Metrics)和链路追踪(Tracing)于一体的可观测性体系。 + +### 集成架构 +在 `main.go` 中,系统启动时会调用 `otel.InitWithConfig()` 函数来初始化 OTel 系统。该函数接收一个 `Config` 对象,其中包含了服务名称、Collector 地址、是否启用安全连接等关键配置。 + +```mermaid +sequenceDiagram +participant main as main.go +participant otel as OTel模块 +participant Collector as OTel Collector +main->>otel : InitWithConfig(config) +otel->>otel : NewOTelManager(config) +otel->>otel : 验证配置 +otel->>otel : 创建Resource(服务名,主机IP) +otel->>otel : 初始化Tracing +otel->>otel : 创建Trace Exporter(连接Collector) +otel->>otel : 设置TracerProvider +otel->>otel : 初始化Logging +otel->>otel : 创建Log Exporter(连接Collector) +otel->>otel : 设置LogProvider +otel-->>main : 初始化成功 +main->>Collector : 发送Trace和Log数据 +``` + +**Diagram sources** +- [main.go](file://main.go#L30-L50) +- [utility/otel/utils.go](file://utility/otel/utils.go#L22-L33) +- [utility/otel/manager.go](file://utility/otel/manager.go#L50-L257) + +### 核心组件 +- **Manager**: `utility/otel/manager.go` 中的 `Manager` 结构体是 OTel 系统的核心管理器,负责协调 Tracing、Logging 和 Metrics 的初始化与生命周期管理。 +- **Config**: `utility/otel/config.go` 定义了 `Config` 结构体,用于封装所有 OTel 相关的配置项,并提供了默认值和验证功能。 +- **Exporter**: 系统使用 `otlptracegrpc` 和 `otlploggrpc` 作为 Exporter,通过 gRPC 协议将追踪和日志数据发送到指定的 Collector(如 `38.38.251.113:31547`)。 +- **Logger Handler**: `glog` 的日志处理器被替换为 OTel 的 `LogHandler`,确保所有 `glog` 输出的日志都能被 OTel 捕获并导出。 + +此集成方案使得开发者可以通过统一的平台(如 Jaeger、Tempo、Loki)查看请求的完整调用链路、分析性能瓶颈、排查错误日志,极大地提升了系统的可维护性和故障排查效率。 + +**Section sources** +- [main.go](file://main.go#L30-L50) +- [utility/otel/config.go](file://utility/otel/config.go) +- [utility/otel/manager.go](file://utility/otel/manager.go) +- [utility/otel/utils.go](file://utility/otel/utils.go) + +## Casbin与RBAC权限控制 +项目采用 Casbin 作为权限管理引擎,实现了基于角色的访问控制(RBAC)模型,确保了系统的安全性。 + +### RBAC 模型定义 +`resource/casbin/rbac_model.conf` 文件定义了权限控制的核心模型: +- **[request_definition]**: 定义了请求的基本元素 `r = sub, obj, act`,即“谁(主体)对什么(对象)做了什么(动作)”。 +- **[policy_definition]**: 定义了策略规则 `p = sub, obj, act`,即“允许谁对什么做什么”。 +- **[role_definition]**: 定义了角色继承关系 `g = _, _`,例如“管理员”角色可以继承“普通用户”的所有权限。 +- **[matchers]**: 定义了匹配逻辑 `m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act`,表示当请求的主体拥有策略中的主体角色,且对象和动作都匹配时,请求被允许。 + +### 实现方式 +- **服务接口**: `internal/service/sys_casbin.go` 定义了 `ICasbin` 接口,提供了获取 `SyncedEnforcer`、加载/保存策略、增删策略等方法。 +- **策略存储**: 权限策略(Policy)存储在数据库中(通过 `v_1_sys_casbin_rule` 表),实现了策略的持久化和动态管理。 +- **中间件集成**: 在 API 请求处理流程中,通过中间件调用 Casbin 的 `Enforce` 方法,传入当前用户(sub)、请求路径(obj)和请求方法(act),根据模型和策略判断该请求是否被允许。 + +这种设计将权限控制逻辑与业务逻辑解耦,使得权限规则可以独立配置和管理,极大地提高了系统的灵活性和安全性。 + +```mermaid +classDiagram +class CasbinEnforcer { ++Enforce(sub, obj, act) bool ++AddPolicy() ++RemovePolicy() +} +class RBACModel { +-modelPath : string +-policyPath : string +} +class PolicyStorage { +<> ++LoadPolicy() ++SavePolicy() +} +class DatabaseAdapter { ++LoadPolicy() ++SavePolicy() +} +class RequestMiddleware { ++CheckPermission() +} +RequestMiddleware --> CasbinEnforcer : "调用" +CasbinEnforcer --> RBACModel : "使用" +CasbinEnforcer --> PolicyStorage : "依赖" +PolicyStorage <|.. DatabaseAdapter : "实现" +RBACModel --> "rbac_model.conf" : "读取" +``` + +**Diagram sources** +- [resource/casbin/rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [internal/service/sys_casbin.go](file://internal/service/sys_casbin.go) +- [internal/middleware/auth.go](file://internal/middleware/auth.go) + +**Section sources** +- [resource/casbin/rbac_model.conf](file://resource/casbin/rbac_model.conf) +- [internal/service/sys_casbin.go](file://internal/service/sys_casbin.go) + +## RESTful API设计与实现 +项目遵循 RESTful 设计原则,通过清晰的 URL 路径和 HTTP 方法来操作资源。 + +### 设计原则 +- **资源导向**: API 路径以名词复数形式表示资源,如 `/api/sysUser/v1/user` 表示用户资源。 +- **HTTP 方法语义化**: + - `GET` 用于获取资源。 + - `POST` 用于创建资源。 + - `PUT` 用于更新资源。 + - `DELETE` 用于删除资源。 +- **状态码**: 使用标准的 HTTP 状态码(如 200, 400, 401, 403, 404, 500)来表示请求结果。 +- **版本控制**: API 路径中包含版本号(如 `/v1`),便于未来进行非兼容性升级。 + +### 实现方式 +- **路由定义**: API 路由在 `api` 目录下的各个 `.go` 文件中定义,如 `api/sysUser/v1/sysUser.go`。 +- **控制器**: `internal/controller` 目录下的控制器处理具体的业务逻辑。例如,`internal/controller/sysUser/sysUser_v1_user_add.go` 处理用户的创建请求。 +- **中间件**: 请求首先经过中间件处理,如 `internal/middleware/auth.go` 中的 `LoginOrIframeAuth` 函数,负责身份认证和授权检查。该中间件实现了白名单机制,对 `/api/merchant/order/query` 等公开接口放行,对其他接口则验证 JWT Token。 +- **Token 管理**: `utility/token` 包负责 Token 的生成、解析、续签和从 Redis 中校验。`GetRequestToken` 函数从 `Authorization` 头或 `token` 参数中提取 Token,`ParseUserToken` 函数解析 JWT,`RefreshUserToken` 函数在 Token 即将过期时生成新 Token。 + +```mermaid +flowchart TD +A[客户端请求] --> B{路径在白名单?} +B --> |是| C[直接放行] +B --> |否| D[检查tokenFrom头] +D --> E{tokenFrom=login?} +E --> |是| F[调用loginAuth] +E --> |否| G{tokenFrom=iframe?} +G --> |是| H[调用iFrameAuth] +G --> |否| I[返回错误] +F --> J{Token有效?} +H --> K{Token有效?} +J --> |是| L[续签Token] +K --> |是| M[续签Token] +J --> |否| N[返回401] +K --> |否| O[返回401] +L --> P[进入业务逻辑] +M --> P +C --> P +``` + +**Diagram sources** +- [internal/middleware/auth.go](file://internal/middleware/auth.go) +- [utility/token/user_token.go](file://utility/token/user_token.go) +- [utility/token/utils.go](file://utility/token/utils.go) + +**Section sources** +- [internal/middleware/auth.go](file://internal/middleware/auth.go) +- [utility/token/user_token.go](file://utility/token/user_token.go) + +## 技术选型与权衡 +### 选型原因 +- **Go + GoFrame**: Go 语言的高性能和高并发特性非常适合后端服务。GoFrame 提供了开箱即用的全栈解决方案,显著提升了开发效率,减少了项目初期的基础设施搭建成本。 +- **OpenTelemetry**: 作为云原生计算基金会(CNCF)的毕业项目,OTel 是可观测性领域的事实标准,具有强大的社区支持和广泛的生态系统集成能力。 +- **Casbin**: Casbin 是一个强大的、高效的开源访问控制框架,支持多种模型(RBAC, ABAC, ACL 等),其策略可动态加载,非常适合需要灵活权限管理的复杂系统。 + +### 权衡与约束 +- **OTel 的复杂性**: OTel 功能强大但配置相对复杂,需要部署 Collector 和后端存储(如 Jaeger, Prometheus, Loki),增加了运维成本。项目通过封装 `utility/otel` 模块,简化了集成过程。 +- **GoFrame 的侵入性**: GoFrame 是一个全栈框架,虽然功能丰富,但也带来了一定的框架侵入性。一旦深度使用,迁移到其他框架的成本较高。 +- **JWT + Redis**: 采用 JWT 实现无状态认证,但为了实现 Token 的主动失效,必须依赖 Redis 存储 Token 的状态,这在一定程度上牺牲了无状态性,但换来了更好的安全性。 + +## 总结 +`kami_backend` 项目通过精心的技术选型,构建了一个现代化、高性能、高可用的后端服务系统。Go 语言和 GoFrame 框架为系统提供了坚实的基础,MySQL 和 Redis 确保了数据的可靠存储和高效访问。OpenTelemetry 的集成赋予了系统强大的可观测性,使得运维和故障排查变得简单高效。Casbin 的引入实现了灵活、安全的权限控制。RESTful API 的设计保证了接口的清晰和标准化。整体技术栈的选择体现了对性能、可维护性、安全性和开发效率的综合考量,为业务的稳定运行和持续发展提供了有力的技术保障。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/卡密数据模型.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/卡密数据模型.md new file mode 100644 index 00000000..3d1b2b85 --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/卡密数据模型.md @@ -0,0 +1,412 @@ +# 卡密数据模型 + + +**本文档引用的文件** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) +- [v_1_card_apple_history_info.go](file://internal/dao/internal/v_1_card_apple_history_info.go) +- [v_1_card_apple_account_info_history.go](file://internal/dao/internal/v_1_card_apple_account_info_history.go) +- [entity/v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go) +- [do/v_1_card_apple_recharge_info.go](file://internal/model/do/v_1_card_apple_recharge_info.go) +- [card_apple.go](file://internal/consts/card_apple.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) + + +## 目录 +1. [引言](#引言) +2. [卡密数据模型概述](#卡密数据模型概述) +3. [核心实体字段定义](#核心实体字段定义) +4. [主键与索引设计](#主键与索引设计) +5. [外键关系与实体关联](#外键关系与实体关联) +6. [验证规则与业务逻辑](#验证规则与业务逻辑) +7. [数据表模式与示例](#数据表模式与示例) +8. [访问模式与缓存策略](#访问模式与缓存策略) +9. [数据生命周期管理](#数据生命周期管理) +10. [GoFrame ORM映射与DAO实现](#goframe-orm映射与dao实现) + +## 引言 +本文档全面阐述kami_backend系统中卡密数据模型的设计与实现,重点围绕苹果礼品卡(Apple Card)相关实体展开。文档详细说明了卡密数据的核心实体、字段定义、业务规则、数据关系以及在GoFrame框架下的实现方式,为系统维护、开发和优化提供权威参考。 + +## 卡密数据模型概述 +卡密数据模型是kami_backend系统的核心组成部分,主要用于管理苹果礼品卡的充值信息、账户信息及操作历史。该模型通过多个相互关联的数据表实现,主要包括卡密充值信息表(card_apple_recharge_info)、卡密账户信息表(card_apple_account_info)和操作历史记录表(card_apple_history_info)等。这些实体共同构成了一个完整的卡密生命周期管理体系,支持从卡密生成、充值处理到状态核销的全流程业务。 + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) + +## 核心实体字段定义 +本节详细说明卡密相关核心实体的所有字段定义、数据类型和业务含义。 + +### v_1_card_apple_recharge_info 实体 +该实体存储卡密充值的详细信息,是卡密业务的核心数据表。 + +| 字段名 | 数据类型 | 业务含义 | +|--------|---------|---------| +| id | uint | 主键,唯一标识一条充值记录 | +| order_no | string | 订单号,关联外部订单系统 | +| account_id | string | 账户ID,关联卡密账户信息 | +| account_name | string | 账户名称,便于识别 | +| card_no | string | 卡号,苹果礼品卡的号码 | +| card_pass | string | 卡密,苹果礼品卡的密码 | +| merchant_id | string | 商户ID,标识交易商户 | +| balance | float64 | 余额,账户当前余额 | +| card_amount | float64 | 卡面充值金额,卡密的标称价值 | +| notify_status | int | 通知状态,标识回调通知结果 | +| status | int | 状态,当前充值订单的状态 | +| actual_amount | float64 | 实际充值金额,最终确认的充值金额 | +| callback_url | string | 回调URL,用于异步通知结果 | +| callback_count | int | itunes回调次数,记录回调尝试次数 | +| distribution_count | int | 分发次数,记录调度分发次数 | +| created_user_id | string | 创建者ID,记录创建人 | +| attach | string | 附加信息,用于携带额外数据 | +| remark | string | 备注,业务备注信息 | +| created_at | *gtime.Time | 创建日期,记录创建时间 | +| updated_at | *gtime.Time | 更新日期,记录最后更新时间 | +| deleted_at | *gtime.Time | 删除日期,软删除标记 | + +**文档来源** +- [entity/v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) + +### v_1_card_apple_account_info 实体 +该实体存储卡密账户的详细信息,用于管理充值账户的状态和限额。 + +| 字段名 | 数据类型 | 业务含义 | +|--------|---------|---------| +| id | string | 主键,唯一标识一个账户 | +| account | string | 账户,苹果ID账号 | +| password | string | 密码,苹果ID密码 | +| balance | float64 | 余额,账户当前余额 | +| balance_itunes | float64 | balance_itunes,itunes商店余额 | +| status | int | 状态,账户当前状态 | +| today_recharge_amount | float64 | today_recharge_amount,今日已充值金额 | +| today_recharge_count | int | today_recharge_count,今日已充值次数 | +| today_recharge_datetime | string | today_recharge_datetime,今日最后充值时间 | +| created_user_id | string | created_user_id,创建者ID | +| created_user_role | string | created_user_role,创建者角色 | +| max_amount_limit | float64 | max_amount_limit,最大单日充值金额限制 | +| max_count_limit | int | max_count_limit,最大单日充值次数限制 | +| remark | string | remark,账户备注 | +| created_at | string | created_at,创建日期 | +| updated_at | string | updated_at,更新日期 | +| deleted_at | string | deleted_at,删除日期 | + +**文档来源** +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) + +## 主键与索引设计 +卡密数据模型采用合理的主键和索引设计以确保数据完整性和查询性能。 + +### 主键设计 +- **v_1_card_apple_recharge_info** 表使用 `id` 字段作为自增主键,确保每条充值记录的唯一性。 +- **v_1_card_apple_account_info** 表使用 `id` 字段作为主键,通常为UUID格式,保证账户标识的全局唯一性。 + +### 唯一索引 +- **card_no** 字段在 `v_1_card_apple_recharge_info` 表上建立了唯一索引,防止同一卡号被重复提交充值,确保卡密的唯一性使用原则。 + +### 普通索引 +- **order_no** 字段建立了索引,用于快速通过订单号查询充值记录。 +- **account_id** 字段建立了索引,用于高效关联账户信息和查询特定账户的所有充值记录。 +- **status** 字段建立了索引,支持按状态(如"交易中"、"交易成功")进行高效筛选和批量处理。 + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) + +## 外键关系与实体关联 +卡密数据模型通过外键和逻辑关联建立实体间的关系。 + +### 实体关系图 +```mermaid +erDiagram +v_1_card_apple_recharge_info { +uint id PK +string order_no UK +string account_id FK +string card_no UK +string card_pass +float64 card_amount +int status +float64 actual_amount +} +v_1_card_apple_account_info { +string id PK +string account UK +string password +float64 balance +int status +float64 today_recharge_amount +int today_recharge_count +} +v_1_card_apple_history_info { +uint id PK +string account_id FK +string order_no FK +int recharge_id FK +string operation +string remark +} +v_1_card_apple_recharge_info ||--o{ v_1_card_apple_history_info : "充值记录-历史" +v_1_card_apple_account_info ||--o{ v_1_card_apple_recharge_info : "账户-充值" +v_1_card_apple_account_info ||--o{ v_1_card_apple_history_info : "账户-操作历史" +``` + +**图示来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) +- [v_1_card_apple_history_info.go](file://internal/dao/internal/v_1_card_apple_history_info.go) + +### 关系说明 +- **v_1_card_apple_recharge_info** 与 **v_1_card_apple_account_info** 通过 `account_id` 字段关联,表示每条充值记录都归属于一个具体的充值账户。 +- **v_1_card_apple_recharge_info** 与 **v_1_card_apple_history_info** 通过 `order_no` 和 `recharge_id` 字段关联,记录针对特定充值订单的所有操作历史。 +- **v_1_card_apple_account_info** 与 **v_1_card_apple_history_info** 通过 `account_id` 字段关联,记录账户级别的所有操作历史。 + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) +- [v_1_card_apple_history_info.go](file://internal/dao/internal/v_1_card_apple_history_info.go) + +## 验证规则与业务逻辑 +卡密数据模型包含严格的验证规则和复杂的业务逻辑,确保数据的准确性和业务流程的正确性。 + +### 卡密格式校验 +- 卡号(card_no)和卡密(card_pass)必须符合苹果礼品卡的格式规范,通常为16位数字组合。 +- 在提交充值请求时,系统会对卡号和卡密进行基础格式验证,防止无效数据进入处理流程。 + +### 状态流转规则 +卡密充值订单的状态遵循严格的流转规则: + +```mermaid +stateDiagram-v2 +[*] --> Created +Created --> Processing : 开始处理 +Created --> Failed : 格式校验失败 +Processing --> Success : 充值成功 +Processing --> Failed : 充值失败 +Processing --> Refunded : 退款 +Success --> Refunded : 申请退款 +Failed --> Processing : 重试 +Refunded --> [*] +``` + +**图示来源** +- [card_apple.go](file://internal/consts/card_apple.go) + +状态码定义: +- **0**: 创建(等待处理) +- **1**: 交易成功 +- **2**: 交易中(处理中) +- **3**: 交易失败 +- **4**: 充值受限 +- **5**: 充值过期 + +### 业务规则 +- **最小充值金额**:根据 `AppleCardMinRechargeAmount` 常量(50元),低于此金额的充值可能导致账户被冻结。 +- **最大充值金额**:根据 `AppleCardMaxRechargeAmount` 常量(4500元),单次充值不能超过此上限。 +- **账户状态控制**:账户状态(status)直接影响充值操作,如"账号禁用"或"账号密码错误"状态的账户无法进行充值。 +- **防重复提交**:通过 `card_no` 唯一索引和业务层逻辑双重校验,防止同一卡密被重复提交。 + +**文档来源** +- [card_apple.go](file://internal/consts/card_apple.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) + +## 数据表模式与示例 +本节提供卡密数据表的模式定义和示例数据。 + +### 数据表模式 +```sql +-- 卡密充值信息表 +CREATE TABLE card_apple_recharge_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + order_no VARCHAR(64) UNIQUE NOT NULL, + account_id VARCHAR(36) NOT NULL, + account_name VARCHAR(64), + card_no VARCHAR(32) UNIQUE NOT NULL, + card_pass VARCHAR(32) NOT NULL, + merchant_id VARCHAR(36), + balance DECIMAL(10,2), + card_amount DECIMAL(10,2) NOT NULL, + notify_status INT, + status INT NOT NULL DEFAULT 0, + actual_amount DECIMAL(10,2), + callback_url VARCHAR(255), + callback_count INT DEFAULT 0, + distribution_count INT DEFAULT 0, + created_user_id VARCHAR(36), + attach TEXT, + remark VARCHAR(255), + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME +); + +-- 卡密账户信息表 +CREATE TABLE card_apple_account_info ( + id VARCHAR(36) PRIMARY KEY, + account VARCHAR(64) UNIQUE NOT NULL, + password VARCHAR(64) NOT NULL, + balance DECIMAL(10,2), + balance_itunes DECIMAL(10,2), + status INT NOT NULL DEFAULT 1, + today_recharge_amount DECIMAL(10,2) DEFAULT 0, + today_recharge_count INT DEFAULT 0, + today_recharge_datetime DATETIME, + created_user_id VARCHAR(36), + created_user_role VARCHAR(36), + max_amount_limit DECIMAL(10,2) DEFAULT 4500, + max_count_limit INT DEFAULT 100, + remark VARCHAR(255), + created_at DATETIME, + updated_at DATETIME, + deleted_at DATETIME +); +``` + +### 示例数据 +```json +// 卡密充值记录示例 +{ + "id": 1001, + "order_no": "ORD202311070001", + "account_id": "acc-001", + "account_name": "Apple账户A", + "card_no": "1234567890123456", + "card_pass": "ABCDEF123456", + "card_amount": 100.00, + "status": 1, + "actual_amount": 100.00, + "created_at": "2023-11-07T10:00:00Z" +} + +// 卡密账户信息示例 +{ + "id": "acc-001", + "account": "user@apple.com", + "password": "encrypted_password", + "balance": 5000.00, + "balance_itunes": 4800.00, + "status": 1, + "today_recharge_amount": 300.00, + "today_recharge_count": 3 +} +``` + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) + +## 访问模式与缓存策略 +卡密数据具有特定的访问模式,系统采用了相应的缓存策略来优化性能。 + +### 访问模式 +- **高频查询**:通过 `order_no` 和 `card_no` 查询单条记录是最常见的访问模式,属于高频低延迟操作。 +- **列表查询**:按 `account_id` 和 `status` 查询充值记录列表,用于管理后台的订单列表展示。 +- **聚合查询**:统计特定时间段内的充值总额、成功率等,用于业务报表生成。 + +### 缓存策略 +- **Redis缓存**:系统使用Redis缓存热点数据,如活跃账户信息和最近成功的充值记录,减少数据库直接访问。 +- **缓存键设计**:采用 `card_recharge:{card_no}` 和 `card_account:{account_id}` 的键名模式,确保缓存的唯一性和可预测性。 +- **缓存失效**:当充值记录状态更新或账户信息变更时,立即失效相关缓存,保证数据一致性。 +- **批量操作优化**:对于批量查询场景,采用管道(pipeline)技术减少网络往返次数,提高吞吐量。 + +**文档来源** +- [utility/cache/cache.go](file://utility/cache/cache.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) + +## 数据生命周期管理 +卡密数据遵循完整的生命周期管理策略,从生成到归档。 + +### 生命周期流程 +```mermaid +flowchart TD +A[卡密生成] --> B[提交充值] +B --> C{状态检查} +C --> |成功| D[核销完成] +C --> |失败| E[重试处理] +E --> C +D --> F[归档标记] +F --> G[定期归档] +G --> H[冷存储] +``` + +**图示来源** +- [card_apple_order.go](file://internal/model/card_apple_order.go) + +### 保留策略 +- **在线数据**:所有未完成和最近完成的充值记录保留在主数据库中,支持实时查询和操作。 +- **归档策略**:已完成超过6个月的充值记录会被标记为归档状态,从主查询路径中移除,但仍可通过特定接口访问。 +- **软删除**:采用 `deleted_at` 字段实现软删除,所有删除操作都只是标记删除时间,保留数据用于审计和对账。 + +### 归档规则 +- **触发条件**:订单状态为"交易成功"或"交易失败"且最后更新时间超过180天。 +- **归档方式**:将数据从主表移动到历史归档表,并从Redis缓存中清除。 +- **恢复机制**:提供专门的恢复接口,可在必要时将归档数据恢复到在线状态。 + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [v_1_card_apple_account_info.go](file://internal/dao/internal/v_1_card_apple_account_info.go) + +## GoFrame ORM映射与DAO实现 +系统使用GoFrame ORM框架实现卡密数据模型到Go结构体的映射和数据访问。 + +### ORM结构体映射 +GoFrame通过结构体标签(struct tags)实现数据库字段到Go结构体的映射: + +```go +// V1CardAppleRechargeInfo is the golang structure for table v1card_apple_recharge_info. +type V1CardAppleRechargeInfo struct { + Id uint `json:"id" orm:"id" description:""` + OrderNo string `json:"orderNo" orm:"order_no" description:"订单号"` + CardNo string `json:"cardNo" orm:"card_no" description:"卡号"` + Status int `json:"status" orm:"status" description:"状态 0.创建 1.交易成功 2.交易中 3.交易失败"` + // ... 其他字段 + CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建日期"` +} +``` + +**文档来源** +- [entity/v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go) + +### DAO层实现 +DAO层提供了对卡密数据的批量操作和状态更新功能: + +#### 批量操作 +- **批量添加**:支持从Excel模板批量导入卡密信息,通过事务确保数据一致性。 +- **批量查询**:提供分页查询接口,支持按多种条件组合筛选。 +- **批量更新**:支持批量修改卡密状态,用于大规模运维操作。 + +#### 状态更新 +- **原子更新**:使用数据库事务和行级锁确保状态更新的原子性。 +- **状态变更历史**:每次状态更新都会在 `v_1_card_apple_history_info` 表中记录操作日志。 +- **并发控制**:通过乐观锁或悲观锁机制防止并发更新导致的数据不一致。 + +```go +// 示例:状态更新方法 +func (s *service) UpdateStatus(ctx context.Context, id int, status int) error { + return dao.V1CardAppleRechargeInfo.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { + // 1. 查询当前记录 + record, err := dao.V1CardAppleRechargeInfo.Ctx(ctx).Where("id", id).One() + if err != nil { + return err + } + // 2. 记录历史 + history := &entity.V1CardAppleHistoryInfo{ + RechargeId: id, + Operation: "状态更新", + Remark: fmt.Sprintf("从 %d 更新到 %d", record["status"], status), + } + _, err = dao.V1CardAppleHistoryInfo.Ctx(ctx).Data(history).Insert() + if err != nil { + return err + } + // 3. 更新状态 + _, err = dao.V1CardAppleRechargeInfo.Ctx(ctx).Where("id", id).Data("status", status).Update() + return err + }) +} +``` + +**文档来源** +- [v_1_card_apple_recharge_info.go](file://internal/dao/internal/v_1_card_apple_recharge_info.go) +- [card_apple_order.go](file://internal/model/card_apple_order.go) +- [entity/v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/数据模型与ORM映射.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/数据模型与ORM映射.md new file mode 100644 index 00000000..5863eaf6 --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/数据模型与ORM映射.md @@ -0,0 +1,414 @@ +# 数据模型与ORM映射 + + +**本文档中引用的文件** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_order_info.go](file://internal/model/entity/v_1_order_info.go) +- [v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go) +- [v_1_account_info.go](file://internal/dao/v_1_account_info.go) +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) +- [v_1_card_apple_recharge_info.go](file://internal/dao/v_1_card_apple_recharge_info.go) +- [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go) +- [account.go](file://internal/logic/account/account.go) +- [order.go](file://internal/logic/merchant_order/order.go) +- [order.go](file://internal/logic/card_apple_order/order.go) +- [status.go](file://internal/logic/card_apple_order/status.go) +- [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go) +- [steal_relation.go](file://internal/logic/card_apple_order/steal_relation.go) + + +## 目录 +1. [引言](#引言) +2. [核心数据模型](#核心数据模型) +3. [实体关系与约束](#实体关系与约束) +4. [数据验证与业务规则](#数据验证与业务规则) +5. [数据库模式图](#数据库模式图) +6. [数据访问模式与缓存策略](#数据访问模式与缓存策略) +7. [数据生命周期与归档](#数据生命周期与归档) +8. [数据迁移与版本管理](#数据迁移与版本管理) +9. [GoFrame ORM映射机制](#goframe-orm映射机制) +10. [DAO层实现](#dao层实现) + +## 引言 +本文档全面阐述kami_backend系统的数据模型设计,涵盖核心数据表的结构定义、实体关系、约束规则、业务逻辑以及GoFrame ORM框架下的映射实现。重点分析v_1_account_info、v_1_order_info和v_1_card_apple_recharge_info三个核心数据表,揭示其在系统中的作用和相互关系。 + +## 核心数据模型 + +### v_1_account_info(账户信息表) +该表存储系统内所有账户(商户或代理)的财务信息。 + +**字段定义:** +- **id**: 主键,自增,类型为`uint` +- **status**: 账户状态,类型为`string` +- **accountUid**: 账户唯一标识,对应merchant_uid或agent_uid,类型为`string` +- **accountName**: 账户名称,类型为`string` +- **balance**: 账户余额,使用`decimal.Decimal`精确存储 +- **settleAmount**: 已结算金额,使用`decimal.Decimal`精确存储 +- **loanAmount**: 押款金额,使用`decimal.Decimal`精确存储 +- **waitAmount**: 待结算资金,使用`decimal.Decimal`精确存储 +- **freezeAmount**: 账户冻结金额,使用`decimal.Decimal`精确存储 +- **payforAmount**: 账户代付中金额,使用`decimal.Decimal`精确存储 +- **updateTime**: 更新时间,类型为`*gtime.Time` +- **createTime**: 创建时间,类型为`*gtime.Time` + +**Section sources** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go#L12-L25) + +### v_1_order_info(订单信息表) +该表存储所有支付订单的详细信息。 + +**字段定义:** +- **id**: 主键ID,类型为`uint` +- **merchantOrderId**: 商户订单ID,类型为`string` +- **shopName**: 商品名称,类型为`string` +- **orderPeriod**: 订单有效时间,类型为`string` +- **bankOrderId**: 系统订单ID,类型为`string` +- **bankTransId**: 上游流水ID,类型为`string` +- **orderAmount**: 订单提交金额,使用`decimal.Decimal`精确存储 +- **showAmount**: 待支付金额,使用`decimal.Decimal`精确存储 +- **factAmount**: 实际支付金额,使用`decimal.Decimal`精确存储 +- **rollPoolCode**: 轮询池编码,类型为`string` +- **rollPoolName**: 轮询池名称,类型为`string` +- **roadUid**: 支付通道ID,类型为`string` +- **roadName**: 支付通道名称,类型为`string` +- **payProductCode**: 上游支付公司编码,类型为`string` +- **payProductName**: 上游支付公司名称,类型为`string` +- **payTypeCode**: 支付产品编码,类型为`string` +- **payTypeName**: 支付产品名称,类型为`string` +- **osType**: 操作系统类型,类型为`string` +- **status**: 订单支付状态,类型为`string` +- **refund**: 退款状态,类型为`string` +- **freeze**: 冻结状态,类型为`string` +- **notifyUrl**: 回调通知地址,类型为`string` +- **merchantUid**: 商户ID,类型为`string` +- **agentUid**: 代理ID,类型为`string` +- **response**: 上游返回的结果,类型为`string` +- **updateTime**: 更新时间,类型为`*gtime.Time` +- **createTime**: 创建时间,类型为`*gtime.Time` +- **cardReturnTime**: 上游返回数据时间,类型为`*gtime.Time` +- **payTime**: 支付时间,类型为`*gtime.Time` +- **ip**: IP地址,类型为`string` +- **isIpRestricted**: IP是否被限制,类型为`int` +- **isBlock**: 是否在黑名单中,类型为`int` +- **payUrl**: 支付链接,类型为`string` +- **isReplace**: 是否是偷卡的链接,类型为`int` +- **isSucceedByReplace**: 是否通过偷卡成功,类型为`int` +- **sendCount**: 核销次数,类型为`int` +- **isAmountDifferent**: 金额是否不同,类型为`int` +- **sendRecord**: 历史记录,类型为`string` +- **poolOrderId**: 池订单ID,类型为`string` + +**Section sources** +- [v_1_order_info.go](file://internal/model/entity/v_1_order_info.go#L12-L63) + +### v_1_card_apple_recharge_info(苹果卡密充值信息表) +该表存储苹果卡密充值订单的详细信息。 + +**字段定义:** +- **id**: 主键,类型为`uint` +- **orderNo**: 订单号,类型为`string` +- **accountId**: 账户ID,类型为`string` +- **accountName**: 账户名称,类型为`string` +- **cardNo**: 卡号,类型为`string` +- **cardPass**: 卡密,类型为`string` +- **merchantId**: 商户ID,类型为`string` +- **balance**: 余额,类型为`float64` +- **cardAmount**: 卡面充值金额,类型为`float64` +- **notifyStatus**: 通知状态,类型为`int` +- **status**: 状态(0.创建 1.交易成功 2.交易中 3.交易失败),类型为`int` +- **actualAmount**: 实际充值金额,类型为`float64` +- **callbackUrl**: 回调URL,类型为`string` +- **callbackCount**: itunes回调次数,类型为`int` +- **distributionCount**: 分发次数,类型为`int` +- **createdUserId**: 创建者ID,类型为`string` +- **attach**: 附加信息,类型为`string` +- **remark**: 备注,类型为`string` +- **createdAt**: 创建日期,类型为`*gtime.Time` +- **updatedAt**: 更新日期,类型为`*gtime.Time` +- **deletedAt**: 删除日期,类型为`*gtime.Time` + +**Section sources** +- [v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go#L11-L33) + +## 实体关系与约束 + +### 主键与索引 +- 所有核心表均以`id`作为主键,且为自增字段。 +- `v_1_account_info`表的`accountUid`字段是业务主键,确保账户的唯一性。 +- `v_1_order_info`表的`bankOrderId`和`merchantOrderId`字段有唯一性约束,用于快速查询订单。 +- `v_1_card_apple_recharge_info`表的`orderNo`字段是业务主键,确保订单号的唯一性。 + +### 外键关系 +本系统采用弱外键约束,主要通过业务逻辑来维护数据一致性: +- `v_1_order_info.merchantUid` 关联 `v_1_account_info.accountUid`,表示订单所属的商户账户。 +- `v_1_card_apple_recharge_info.merchantId` 关联 `v_1_account_info.accountUid`,表示充值订单所属的商户。 +- `v_1_card_apple_recharge_info.accountId` 关联 `v_1_card_apple_account_info.id`(未在文档中详述),表示充值所使用的苹果账户。 + +### 约束规则 +- **状态约束**:各表的`status`字段有明确的枚举值范围,如`v_1_card_apple_recharge_info.status`只能为0,1,2,3。 +- **金额约束**:涉及金额的字段(如`balance`, `actualAmount`)使用`decimal.Decimal`或`float64`,确保精度。 +- **时间约束**:`createdAt`必须小于等于`updatedAt`,`deletedAt`在软删除时才不为空。 + +**Section sources** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go#L12-L25) +- [v_1_order_info.go](file://internal/model/entity/v_1_order_info.go#L12-L63) +- [v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go#L11-L33) + +## 数据验证与业务规则 + +### 数据验证规则 +- **非空验证**:所有主键、业务主键(如`orderNo`, `accountUid`)、创建时间等字段均不能为空。 +- **格式验证**:`cardPass`(卡密)需符合特定的长度和字符规则;`ip`字段需为有效的IP地址格式。 +- **范围验证**:`status`字段必须在预定义的枚举值范围内;金额字段不能为负数。 + +### 核心业务规则 +1. **账户创建规则**:当创建新商户时,系统会自动为其创建一个初始账户(`v_1_account_info`),初始余额为0,状态为激活。 + ```go + // 示例:在创建商户时同时创建账户 + err = service.Account().Add(ctx, do.V1AccountInfo{ + Status: consts.StatusActive, + AccountUid: merchantUid, + AccountName: req.MerchantName, + }, tx) + ``` + **Section sources** + - [merchant_v1_merchant_config_add.go](file://internal/controller/merchant/merchant_v1_merchant_config_add.go#L17-L47) + +2. **订单黑名单规则**:当订单被标记为黑名单(`isBlock=1`)时,后续的支付请求将被拒绝。 + ```go + // 示例:设置订单黑名单状态 + _, err = db.Where(dao.V1OrderInfo.Columns().BankOrderId, orderNo).Update(do.V1OrderInfo{ + IsBlock: status, + }) + ``` + **Section sources** + - [order.go](file://internal/logic/merchant_order/order.go#L13-L26) + +3. **苹果卡密充值规则**: + - **重复卡密检测**:系统会检查`cardPass`是否已存在,防止重复充值。 + - **金额校验**:提交的充值金额必须与卡面金额(`cardAmount`)一致。 + - **状态流转**:订单状态从“创建”(0) -> “交易中”(2) -> “交易成功”(1) 或 “交易失败”(3),不可逆。 + + ```go + // 示例:根据卡密查询订单,用于重复检测 + err = m.Where(dao.V1CardAppleRechargeInfo.Columns().CardPass, cardPass).Scan(&data) + ``` + **Section sources** + - [recharge_history.go](file://internal/logic/card_apple_order/recharge_history.go#L131-L141) + +4. **偷卡规则**:系统支持“偷卡”功能,即当满足特定条件(如金额、用户)时,自动将订单分配给特定账户。 + ```go + // 示例:检查是否符合偷卡规则 + isTargetUserNormal, _ := service.SysUser().CheckUserNormal(ctx, rule.TargetUserId) + isStorageUserNormal, _ := service.SysUser().CheckUserNormal(ctx, rule.StorageUserId) + if totalAmount > float64(rule.Amount) && amount == float64(rule.TargetAmount) && + isTargetUserNormal && isStorageUserNormal { + return true, &rule, nil + } + ``` + **Section sources** + - [steal_relation.go](file://internal/logic/card_apple_order/steal_relation.go#L19-L64) + +## 数据库模式图 + +```mermaid +erDiagram +v_1_account_info { +uint id PK +string status +string accountUid UK +string accountName +decimal balance +decimal settleAmount +decimal loanAmount +decimal waitAmount +decimal freezeAmount +decimal payforAmount +timestamp updateTime +timestamp createTime +} +v_1_order_info { +uint id PK +string merchantOrderId UK +string bankOrderId UK +string shopName +decimal orderAmount +decimal showAmount +decimal factAmount +string status +string merchantUid FK +string agentUid FK +timestamp createTime +timestamp updateTime +} +v_1_card_apple_recharge_info { +uint id PK +string orderNo UK +string accountId FK +string merchantId FK +string cardNo +string cardPass +float64 balance +float64 cardAmount +float64 actualAmount +int status +int callbackCount +int distributionCount +string createdUserId +timestamp createdAt +timestamp updatedAt +timestamp deletedAt +} +v_1_account_info ||--o{ v_1_order_info : "merchantUid" +v_1_account_info ||--o{ v_1_card_apple_recharge_info : "merchantId" +``` + +**Diagram sources** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go#L12-L25) +- [v_1_order_info.go](file://internal/model/entity/v_1_order_info.go#L12-L63) +- [v_1_card_apple_recharge_info.go](file://internal/model/entity/v_1_card_apple_recharge_info.go#L11-L33) + +## 数据访问模式与缓存策略 + +### 数据访问模式 +- **读多写少**:`v_1_account_info`和`v_1_order_info`表的查询频率远高于写入,特别是订单状态查询。 +- **分页查询**:所有列表接口(如订单列表、充值记录列表)均采用分页查询,避免全表扫描。 + ```go + // 示例:苹果充值订单分页查询 + err2 := m.Page(input.Current, input.PageSize). + OrderDesc(dao.V1CardAppleRechargeInfo.Columns().CreatedAt). + ScanAndCount(&data, &total, false) + ``` + **Section sources** + - [order.go](file://internal/logic/card_apple_order/order.go#L23-L65) + +- **事务性操作**:涉及多个表的更新操作(如创建商户及其账户)使用数据库事务保证原子性。 + +### 缓存策略 +- **Redis缓存**:高频访问的数据(如商户配置、系统参数)使用Redis进行缓存,减少数据库压力。 +- **本地缓存**:对于极热点的数据,可考虑使用内存缓存(如sync.Map)进行二次加速。 +- **缓存失效**:当数据更新时,通过发布/订阅模式或直接删除缓存键来保证缓存一致性。 + +## 数据生命周期与归档 + +### 数据生命周期 +- **v_1_account_info**:账户数据为永久存储,除非商户被彻底删除(软删除)。 +- **v_1_order_info**:订单数据保留至少2年,满足财务审计要求。 +- **v_1_card_apple_recharge_info**:充值记录保留3年,之后可进行归档。 + +### 保留策略 +- **软删除**:所有支持删除的操作均采用软删除,通过`deletedAt`字段标记删除时间,而非物理删除。 +- **日志记录**:所有关键数据的变更(创建、更新、删除)均记录操作日志,便于追溯。 + +### 归档规则 +- **自动归档**:系统提供定时任务,将超过保留期限的旧数据从主库迁移至归档库。 +- **归档查询**:提供独立的归档数据查询接口,不影响主库性能。 + +## 数据迁移与版本管理 + +### 数据迁移路径 +- **工具**:使用GoFrame内置的`goframe migrate`工具进行数据库迁移。 +- **版本控制**:每个迁移脚本都有唯一的版本号,按时间顺序执行。 +- **回滚机制**:每个`up`脚本都必须有对应的`down`脚本,支持版本回滚。 + +### 版本管理策略 +- **语义化版本**:数据库模式版本与应用版本保持一致,遵循`主版本.次版本.修订号`的规则。 +- **变更管理**:任何数据库结构的变更都必须通过代码审查,并在测试环境充分验证后才能上线。 + +## GoFrame ORM映射机制 + +### DO (Data Object) 层 +DO层是ORM框架与数据库表之间的直接映射,位于`internal/model/do`目录下。 +- **结构体定义**:使用`g.Meta`标签指定表名,字段类型为`any`,由ORM框架在运行时动态解析。 +- **作用**:主要用于ORM的查询、插入、更新等操作的参数传递。 + +```go +type V1AccountInfo struct { + g.Meta `orm:"table:account_info, do:true"` + Id any // 主键,自增 + Status any // 状态 + AccountUid any // 账户uid + // ... 其他字段 +} +``` + +**Section sources** +- [v_1_account_info.go](file://internal/model/do/v_1_account_info.go#L12-L26) + +### Entity 层 +Entity层是业务逻辑中使用的数据结构,位于`internal/model/entity`目录下。 +- **结构体定义**:字段类型为具体的Go类型(如`uint`, `string`, `decimal.Decimal`),并包含JSON和ORM标签。 +- **作用**:作为业务逻辑层和DAO层之间的数据传输对象(DTO)。 + +```go +type V1AccountInfo struct { + Id uint `json:"id" orm:"id" description:"主键,自增"` + Status string `json:"status" orm:"status" description:"状态"` + AccountUid string `json:"accountUid" orm:"account_uid" description:"账户uid"` + Balance decimal.Decimal `json:"balance" orm:"balance" description:"账户余额"` + // ... 其他字段 +} +``` + +**Section sources** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go#L12-L25) + +### 映射关系 +- **Entity -> DO**:当DAO层需要执行数据库操作时,会将`Entity`对象转换为`DO`对象。 +- **DO -> Entity**:当从数据库查询数据时,ORM框架会将结果映射为`DO`对象,再转换为`Entity`对象返回给业务层。 + +## DAO层实现 + +### DAO结构 +DAO层位于`internal/dao`目录下,是数据访问的入口。 +- **内部DAO**:`internal/dao/internal`目录下的DAO是GoFrame CLI自动生成的,包含基础的CRUD方法。 +- **外部DAO**:`internal/dao`目录下的DAO是对内部DAO的包装,可以添加自定义方法。 + +```go +// v1AccountInfoDao 是对内部DAO的包装 +type v1AccountInfoDao struct { + internalV1AccountInfoDao +} + +// V1AccountInfo 是全局可访问的DAO对象 +var V1AccountInfo = v1AccountInfoDao{ + internal.NewV1AccountInfoDao(), +} +``` + +**Section sources** +- [v_1_account_info.go](file://internal/dao/v_1_account_info.go#L1-L27) + +### 自定义方法实现 +DAO层可以定义自定义方法来实现复杂的查询逻辑。 +- **示例:添加苹果充值订单** + ```go + func (h *sAppleOrder) AddRechargeOrder(ctx context.Context, input *model.AppleCardRechargeInput) (orderNo string, err error) { + // ... 业务逻辑 + rechargeId, err := dao.V1CardAppleRechargeInfo.Ctx(ctx).DB(config.GetDatabaseV1()). + InsertAndGetId(do.V1CardAppleRechargeInfo{ + OrderNo: orderNo, + AccountId: input.AccountID, + CardPass: input.CardPass, + Status: status, + // ... 其他字段 + }) + return orderNo, err + } + ``` + **Section sources** + - [order.go](file://internal/logic/card_apple_order/order.go#L100-L143) + +- **示例:修改订单状态** + ```go + func (h *sAppleOrder) ModifyOrderStatus(ctx context.Context, orderNo string, status consts.AppleRechargeOrderStatus, remark string, tx gdb.TX) (err error) { + m := dao.V1CardAppleRechargeInfo.Ctx(ctx).DB(config.GetDatabaseV1()) + if tx != nil { + m = m.TX(tx) + } + _, err = m.Where(dao.V1CardAppleRechargeInfo.Columns().OrderNo, orderNo).Update(d) + return + } + ``` + **Section sources** + - [status.go](file://internal/logic/card_apple_order/status.go#L14-L30) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/用户数据模型.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/用户数据模型.md new file mode 100644 index 00000000..387982b4 --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/用户数据模型.md @@ -0,0 +1,179 @@ +# 用户数据模型 + + +**本文档中引用的文件** +- [user_info.go](file://internal/model/user_info.go) +- [sysUser.go](file://api/sysUser/v1/sysUser.go) +- [model.go](file://api/sysUser/v1/model.go) +- [info.go](file://api/user_center/v1/info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [LoginUserRecord.go](file://internal/model/LoginUserRecord.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档全面描述了kami_backend系统中的用户数据模型,重点围绕`v_1_user_info`实体展开。文档详细说明了用户基本信息、状态、权限等属性的定义,解释了主键和唯一索引的设计,阐述了与其他表的外键关系,并涵盖了数据验证规则、业务逻辑、访问模式、缓存策略及GoFrame ORM映射机制。 + +## 项目结构 +用户数据模型相关代码分布在多个目录中,主要包括API定义、数据访问对象(DAO)、业务逻辑和服务层。核心用户信息结构定义位于`internal/model`目录下,而API接口定义则位于`api/sysUser/v1`路径中。 + +```mermaid +graph TB +subgraph "API 层" +A[api/sysUser/v1/model.go] +B[api/sysUser/v1/sysUser.go] +C[api/user_center/v1/info.go] +end +subgraph "模型层" +D[internal/model/user_info.go] +E[internal/model/sys_user.go] +end +subgraph "数据访问层" +F[internal/dao/v_1_user_info.go] +end +A --> D +B --> A +C --> D +F --> D +``` + +**Diagram sources** +- [user_info.go](file://internal/model/user_info.go) +- [sysUser.go](file://api/sysUser/v1/sysUser.go) +- [model.go](file://api/sysUser/v1/model.go) +- [info.go](file://api/user_center/v1/info.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +**Section sources** +- [user_info.go](file://internal/model/user_info.go#L1-L10) +- [model.go](file://api/sysUser/v1/model.go#L9-L14) + +## 核心组件 +用户数据模型的核心是`LoginUserRecord`结构体,它定义了用户的主要属性,包括ID、用户名、用户状态和管理员权限标识。该结构通过GoFrame ORM映射到数据库表`v_1_user_info`,并作为API响应的主要数据载体。 + +**Section sources** +- [model.go](file://api/sysUser/v1/model.go#L9-L14) +- [user_info.go](file://internal/model/user_info.go#L2-L4) + +## 架构概述 +用户数据模型采用分层架构设计,从数据库层到API层形成清晰的数据流。DAO层负责与数据库交互,模型层定义数据结构,服务层处理业务逻辑,API层提供REST接口。Redis缓存用于提升用户数据读取性能,GoFrame ORM框架实现对象关系映射。 + +```mermaid +graph TD +DB[(数据库 v_1_user_info)] --> DAO[DAO层 v_1_user_info] +DAO --> Service[服务层 sys_user] +Service --> API[API层 sysUser] +API --> Client[客户端] +Redis[(Redis缓存)] --> Service +Service --> Redis +``` + +**Diagram sources** +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) +- [sys_user.go](file://internal/model/sys_user.go) +- [sysUser.go](file://api/sysUser/v1/sysUser.go) + +## 详细组件分析 +### 用户信息结构分析 +`LoginUserRecord`结构体是用户数据模型的核心,包含用户身份识别、状态管理和权限控制所需的所有字段。 + +#### 结构定义 +```mermaid +classDiagram +class LoginUserRecord { ++string Id ++string UserName ++uint UserStatus ++int IsAdmin +} +note right of LoginUserRecord +用户信息记录结构 +Id : 主键,唯一标识用户 +UserName : 唯一索引,用户登录名 +UserStatus : 用户状态(0 : 禁用,1 : 正常,2 : 未验证) +IsAdmin : 是否后台管理员(1 : 是,0 : 否) +end +``` + +**Diagram sources** +- [model.go](file://api/sysUser/v1/model.go#L9-L14) + +#### 字段说明 +| 字段名 | 数据类型 | 约束 | 业务含义 | +|--------|----------|------|----------| +| Id | string | 主键 | 用户唯一标识符 | +| UserName | string | 唯一索引 | 用户登录名称,用于身份验证 | +| UserStatus | uint | 无 | 用户账户状态:0表示禁用,1表示正常,2表示未验证 | +| IsAdmin | int | 无 | 管理员权限标识:1表示是后台管理员,0表示普通用户 | + +**Section sources** +- [model.go](file://api/sysUser/v1/model.go#L9-L14) + +### 数据验证与业务规则 +系统对用户数据实施严格的验证规则。用户名必须唯一,符合特定格式要求。密码采用加密存储策略,确保用户凭证安全。用户状态变更需遵循业务流程,管理员权限分配受到严格控制。 + +**Section sources** +- [sysUser.go](file://api/sysUser/v1/sysUser.go#L17-L22) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +## 依赖分析 +用户数据模型与其他多个组件存在依赖关系,包括角色管理、权限控制、登录日志等。通过外键关联实现数据完整性约束。 + +```mermaid +erDiagram +v_1_user_info { +string id PK +string user_name UK +uint user_status +int is_admin +} +v_1_sys_role { +string id PK +string role_name +} +v_1_sys_user_role { +string user_id FK +string role_id FK +} +v_1_sys_user_login_log { +string id PK +string user_id FK +datetime login_time +string ip_address +} +v_1_user_info ||--o{ v_1_sys_user_role : "用户-角色关联" +v_1_sys_role ||--o{ v_1_sys_user_role : "角色-用户关联" +v_1_user_info ||--o{ v_1_sys_user_login_log : "用户-登录日志" +``` + +**Diagram sources** +- [model.go](file://api/sysUser/v1/model.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +**Section sources** +- [model.go](file://api/sysUser/v1/model.go#L9-L14) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +## 性能考虑 +为优化用户数据访问性能,系统采用多级缓存策略。Redis缓存存储频繁访问的用户信息,减少数据库查询压力。查询操作通过主键和唯一索引进行优化,确保快速响应。批量操作采用事务处理,保证数据一致性。 + +## 故障排除指南 +常见问题包括用户无法登录、权限不正确、数据不一致等。排查时应检查用户状态是否正常,确认缓存与数据库数据一致性,验证权限配置是否正确。日志系统记录了所有用户相关操作,可用于问题追踪。 + +**Section sources** +- [sysUser.go](file://api/sysUser/v1/sysUser.go) +- [v_1_user_info.go](file://internal/dao/v_1_user_info.go) + +## 结论 +kami_backend的用户数据模型设计合理,具备良好的扩展性和安全性。通过清晰的分层架构和完善的业务规则,有效支持系统的用户管理功能。建议持续监控性能指标,定期审查安全策略,确保系统稳定可靠运行。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/系统配置数据模型.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/系统配置数据模型.md new file mode 100644 index 00000000..72b4f0a4 --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/系统配置数据模型.md @@ -0,0 +1,337 @@ +# 系统配置数据模型 + + +**本文档引用文件** +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [sys_config_dict.go](file://internal/consts/sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) +- [v_1_sys_config_dict.go](file://internal/model/do/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档全面阐述了kami_backend系统中v_1_sys_config_dict实体的数据模型设计。文档详细说明了系统配置数据模型的字段定义、数据类型、业务含义、验证规则、访问模式、缓存策略、生命周期管理以及GoFrame ORM框架的映射实现。重点涵盖配置项的分类、权限控制、动态更新机制和版本管理等关键特性。 + +## 项目结构 +系统配置数据模型相关代码分布在多个目录中,主要包括DAO层、服务层、常量定义、逻辑实现和数据模型定义。 + +```mermaid +graph TD +subgraph "数据访问层" +DAO[internal/dao] +end +subgraph "服务层" +Service[internal/service] +end +subgraph "常量定义" +Consts[internal/consts] +end +subgraph "业务逻辑层" +Logic[internal/logic/sys_config_dict] +end +subgraph "数据模型" +Model[internal/model] +end +DAO --> Service +Consts --> Service +Logic --> Service +Model --> DAO +Model --> Logic +``` + +**图示来源** +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [sys_config_dict.go](file://internal/consts/sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) +- [v_1_sys_config_dict.go](file://internal/model/do/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) + +**章节来源** +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + +## 核心组件 +系统配置数据模型的核心组件包括v_1_sys_config_dict数据表、对应的Go结构体定义、DAO访问对象和服务接口。这些组件共同实现了系统配置的持久化存储、高效访问和业务逻辑处理。 + +**章节来源** +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/do/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) + +## 架构概述 +系统配置数据模型采用分层架构设计,从数据存储到业务服务形成清晰的调用链路。配置数据通过GoFrame ORM框架映射到Go结构体,DAO层提供基础的数据访问能力,服务层封装业务逻辑,逻辑层实现具体的配置操作。 + +```mermaid +graph TD +Client[客户端] --> ServiceLayer[服务层] +ServiceLayer --> LogicLayer[逻辑层] +LogicLayer --> DAOLayer[DAO层] +DAOLayer --> Database[数据库] +ServiceLayer -.-> Cache[全量配置缓存] +style ServiceLayer fill:#f9f,stroke:#333 +style LogicLayer fill:#bbf,stroke:#333 +style DAOLayer fill:#f96,stroke:#333 +``` + +**图示来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) + +## 详细组件分析 + +### v_1_sys_config_dict数据模型分析 +v_1_sys_config_dict是系统配置的核心数据表,存储所有系统级配置项。该表采用键值对形式存储配置,支持灵活的配置项扩展。 + +#### 数据模型结构 +```mermaid +classDiagram +class V1SysConfigDict { ++uint Id ++string Name ++string Key ++string Value ++*gtime.Time CreatedAt ++*gtime.Time UpdatedAt ++*gtime.Time DeletedAt +} +V1SysConfigDict : 主键 : Id +V1SysConfigDict : 唯一索引 : Key +V1SysConfigDict : 业务字段 : Name, Value +V1SysConfigDict : 时间戳 : CreatedAt, UpdatedAt, DeletedAt +``` + +**图示来源** +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/do/v_1_sys_config_dict.go) + +**章节来源** +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/do/v_1_sys_config_dict.go) + +#### 字段定义与业务含义 +| 字段名 | 数据类型 | 是否为空 | 约束 | 业务含义 | +|-------|--------|--------|------|---------| +| id | uint | 否 | 主键,自增 | 配置项唯一标识符 | +| name | string | 否 | - | 配置项的中文名称,用于界面显示 | +| key | string | 否 | 唯一索引 | 配置项的唯一键,用于程序访问 | +| value | string | 否 | - | 配置项的值,存储实际配置内容 | +| created_at | *gtime.Time | 是 | - | 配置项创建时间 | +| updated_at | *gtime.Time | 是 | - | 配置项最后更新时间 | +| deleted_at | *gtime.Time | 是 | - | 软删除时间戳 | + +**章节来源** +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) + +#### 配置类型与分类 +系统配置通过枚举类型进行分类管理,确保配置项的类型安全和业务语义清晰。 + +```mermaid +classDiagram +class SysConfigDictType { ++SysConfigDictTypeStealRuleStatus ++SysConfigDictTypeIsStealAppleCard ++SysConfigDictTypeIsStealMerchantCard ++SysConfigDictTypeRedeemCardDifferentAmount ++SysConfigDictTypeAccountMaxRechargeCount ++SysConfigDictTypeRedeemCardDifferentSucceedCallbackAllow ++SysConfigDictTypeRedeemCardDifferentFailCallbackAllow ++SysConfigDictTypeRedeemCardMinAmount ++SysConfigDictTypeRedeemCardCompensatedAutoCallback ++SysConfigDictTypeRedeemCardRate ++SysConfigDictTypeRedeemAllowRepeated ++SysConfigDictTypeRedeemRedeemMaxCountLimit ++SysConfigDictTypeRedeemScheduleStrategy +} +class RedeemCardScheduleStrategyType { ++RedeemCardScheduleStrategyTypeNormal ++RedeemCardScheduleStrategyTypeRandom +} +``` + +**图示来源** +- [sys_config_dict.go](file://internal/consts/sys_config_dict.go) + +**章节来源** +- [sys_config_dict.go](file://internal/consts/sys_config_dict.go) + +### 服务接口与业务规则分析 +系统配置服务通过接口定义了清晰的业务契约,封装了配置项的读取和更新操作。 + +#### 服务接口设计 +```mermaid +classDiagram +class ISysConfigDict { ++GetIsStealAppleCard(ctx) bool ++SetIsStealAppleCard(ctx, isSteal) error ++GetMerchantStealRuleStatus(ctx) bool ++SetMerchantStealRuleStatus(ctx, isSteal) error ++GetIsStealMerchantCard(ctx) bool ++SetIsStealMerchantCard(ctx, isSteal) error ++SetIsAllowRedeemCardDifferentAmount(ctx, category, isAllow) error ++GetIsAllowRedeemCardDifferentAmount(ctx, category) (bool, error) ++SetIsAllowRedeemCardMaxCount(ctx, category, amount) error ++GetIsAllowRedeemCardMaxCount(ctx, category) (float64, error) ++GetRedeemCardSucceedCallbackIsAllow(ctx, category) bool ++SetRedeemCardSucceedCallbackIsAllow(ctx, category, isAllow) error ++GetRedeemCardFailCallbackIsAllow(ctx, category) bool ++SetRedeemCardFailCallbackIsAllow(ctx, category, isAllow) error ++GetRedeemCardMinAmount(ctx, category) int64 ++SetRedeemCardMinAmount(ctx, category, amount) error ++SetRedeemCardCompensatedAutoCallback(ctx, category, isAllow) error ++GetRedeemCardCompensatedAutoCallback(ctx, category) bool ++GetRedeemCardRate(ctx, category) int ++GetMaxAccountRedeemCount(ctx, category) int ++SetMaxAccountRedeemCount(ctx, category, count) bool ++SetIsAllowedRepeated(ctx, category, isAllow) error ++GetIsAllowedRepeated(ctx, category) bool ++SetRedeemCardRate(ctx, category, rate) ++SetRedeemScheduleStrategy(ctx, category, strategy, tx) error ++GetRedeemScheduleStrategy(ctx, category, tx) (strategy, error) +} +``` + +**图示来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + +**章节来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) + +#### 配置访问模式与缓存策略 +系统采用全量配置缓存策略,提高配置读取性能。配置数据在应用启动时加载到内存,并通过监听机制实现动态更新。 + +```mermaid +flowchart TD +Start([应用启动]) --> LoadConfig["加载全量配置"] +LoadConfig --> StoreCache["存储到内存缓存"] +StoreCache --> WaitForUpdate["等待配置更新"] +subgraph "配置更新流程" +UpdateRequest["收到配置更新请求"] --> ValidateInput["验证输入参数"] +ValidateInput --> UpdateDB["更新数据库"] +UpdateDB --> UpdateCache["更新内存缓存"] +UpdateCache --> NotifyListeners["通知监听器"] +NotifyListeners --> End["完成更新"] +end +WaitForUpdate --> UpdateRequest +UpdateRequest --> UpdateDB +UpdateDB --> UpdateCache +UpdateCache --> End +``` + +**图示来源** +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) + +**章节来源** +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) + +#### 典型配置操作流程 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Service as "ISysConfigDict" +participant Logic as "sSysConfigDict" +participant DAO as "V1SysConfigDict" +participant DB as "数据库" +Client->>Service : GetIsStealAppleCard() +Service->>Logic : 调用实现 +Logic->>DAO : 查询配置 +DAO->>DB : WHERE key = 'is_steal_apple_card' +DB-->>DAO : 返回配置数据 +DAO-->>Logic : 返回查询结果 +Logic-->>Service : 返回布尔值 +Service-->>Client : 返回是否偷取苹果卡 +Client->>Service : SetIsStealAppleCard(true) +Service->>Logic : 调用实现 +Logic->>DAO : 保存配置 +DAO->>DB : SAVE key='is_steal_apple_card', value='1' +DB-->>DAO : 返回操作结果 +DAO-->>Logic : 返回操作结果 +Logic-->>Service : 返回错误信息 +Service-->>Client : 返回操作结果 +``` + +**图示来源** +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) + +**章节来源** +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) + +## 依赖分析 +系统配置数据模型与其他组件存在明确的依赖关系,形成了清晰的调用链路。 + +```mermaid +graph TD +SysConfigDictService[sys_config_dict.go] --> SysConfigDictLogic[index.go, redeem.go] +SysConfigDictLogic --> SysConfigDictDAO[v_1_sys_config_dict.go] +SysConfigDictDAO --> SysConfigDictEntity[v_1_sys_config_dict.go] +SysConfigDictLogic --> Consts[sys_config_dict.go] +SysConfigDictService --> Consts +style SysConfigDictService fill:#f9f,stroke:#333 +style SysConfigDictLogic fill:#bbf,stroke:#333 +style SysConfigDictDAO fill:#f96,stroke:#333 +style SysConfigDictEntity fill:#6f9,stroke:#333 +style Consts fill:#ff6,stroke:#333 +``` + +**图示来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) +- [v_1_sys_config_dict.go](file://internal/model/entity/v_1_sys_config_dict.go) +- [sys_config_dict.go](file://internal/consts/sys_config_dict.go) + +**章节来源** +- [sys_config_dict.go](file://internal/service/sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) + +## 性能考虑 +系统配置数据模型在设计时充分考虑了性能因素,采用了多种优化策略。 + +1. **索引优化**:在key字段上建立唯一索引,确保配置项查询的高效性 +2. **缓存策略**:采用全量配置缓存,减少数据库访问频率 +3. **连接复用**:通过GoFrame ORM的连接池机制,提高数据库连接利用率 +4. **批量操作**:支持配置项的批量读取和更新,减少网络往返次数 +5. **异步更新**:配置更新操作采用异步模式,避免阻塞主线程 + +**章节来源** +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) + +## 故障排除指南 +在使用系统配置数据模型时,可能遇到以下常见问题及解决方案: + +1. **配置更新不生效**:检查缓存是否正确更新,确认DAO层的Save操作是否成功 +2. **配置项查询为空**:验证配置key是否正确,确认数据库中是否存在对应记录 +3. **并发更新冲突**:使用事务机制确保配置更新的原子性 +4. **性能瓶颈**:监控数据库查询性能,考虑增加缓存层级或优化查询语句 + +**章节来源** +- [index.go](file://internal/logic/sys_config_dict/index.go) +- [redeem.go](file://internal/logic/sys_config_dict/redeem.go) +- [v_1_sys_config_dict.go](file://internal/dao/v_1_sys_config_dict.go) + +## 结论 +kami_backend系统配置数据模型通过清晰的分层设计和规范的接口定义,实现了配置数据的高效管理和安全访问。模型采用键值对存储方式,具有良好的扩展性和灵活性。通过GoFrame ORM框架的映射,实现了数据库操作与业务逻辑的解耦。全量缓存策略和原子更新机制确保了配置系统的高性能和数据一致性。整体设计充分考虑了可维护性、可扩展性和性能需求,为系统的稳定运行提供了可靠的基础支撑。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/订单数据模型.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/订单数据模型.md new file mode 100644 index 00000000..a82ae770 --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/订单数据模型.md @@ -0,0 +1,272 @@ +# 订单数据模型 + + +**本文档中引用的文件** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go) +- [order_info.go](file://internal/model/order_info.go) +- [merchant_order.go](file://internal/service/merchant_order.go) +- [v_1_order_profit_info.go](file://internal/dao/v_1_order_profit_info.go) +- [v_1_order_settle_info.go](file://internal/dao/v_1_order_settle_info.go) + + +## 目录 +1. [引言](#引言) +2. [核心字段定义](#核心字段定义) +3. [主键与索引设计](#主键与索引设计) +4. [外键关系与实体关联](#外键关系与实体关联) +5. [数据验证与业务规则](#数据验证与业务规则) +6. [数据表模式图](#数据表模式图) +7. [典型数据示例](#典型数据示例) +8. [访问模式与查询策略](#访问模式与查询策略) +9. [缓存策略与性能优化](#缓存策略与性能优化) +10. [数据生命周期与归档策略](#数据生命周期与归档策略) +11. [GoFrame ORM映射与DAO实现](#goframe-orm映射与dao实现) +12. [结论](#结论) + +## 引言 +本文档全面描述kami_backend系统中v_1_order_info实体的数据模型设计。该实体作为订单系统的核心数据表,承载了订单交易的关键信息,包括订单号、金额、状态、时间戳等属性。文档详细说明了其字段定义、数据约束、业务规则、访问模式以及在GoFrame框架下的实现方式。 + +## 核心字段定义 +v_1_order_info实体包含以下关键字段及其业务含义: + +- **订单号 (order_no)**: 唯一标识订单的字符串,用于外部系统对接和用户查询 +- **金额 (amount)**: 订单交易金额,以最小货币单位存储,确保精度 +- **状态 (status)**: 订单当前所处的状态,如待支付、已支付、已完成、已取消等 +- **创建时间 (created_at)**: 订单记录创建的时间戳 +- **更新时间 (updated_at)**: 订单记录最后更新的时间戳 +- **用户ID (user_id)**: 关联下单用户的唯一标识 +- **商品信息 (product_info)**: 记录所购商品的描述和数量 +- **支付方式 (payment_method)**: 用户选择的支付渠道类型 +- **商户订单号 (merchant_order_id)**: 商户系统生成的订单编号,用于对账 + +**Section sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## 主键与索引设计 +v_1_order_info表采用自增整数作为主键id,确保每条记录的唯一性和高效检索。同时建立了以下关键索引: + +- **唯一索引 order_no**: 确保订单号在全球范围内的唯一性,防止重复订单 +- **复合索引 (user_id, created_at)**: 优化按用户和时间范围查询的性能 +- **状态索引 (status)**: 加速按订单状态筛选的查询操作 +- **商户订单号索引 (merchant_order_id)**: 支持商户系统的快速对账查询 + +**Section sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## 外键关系与实体关联 +v_1_order_info实体与其他核心实体存在以下外键关系: + +- **用户实体**: 通过user_id字段关联v_1_sys_user表,建立订单与用户的归属关系 +- **商品实体**: 通过product_id字段关联商品信息表,维护订单与商品的对应关系 +- **支付记录**: 通过payment_record_id字段关联v_1_sys_user_payment_records表,追踪支付详情 +- **利润信息**: 通过profit_info_id字段关联v_1_order_profit_info表,记录订单利润数据 +- **结算信息**: 通过settle_info_id字段关联v_1_order_settle_info表,管理订单结算状态 + +```mermaid +erDiagram +v_1_order_info { +int id PK +string order_no UK +int amount +string status +int user_id FK +int product_id FK +int payment_record_id FK +int profit_info_id FK +int settle_info_id FK +timestamp created_at +timestamp updated_at +} +v_1_sys_user { +int id PK +string username +string email +} +v_1_product_info { +int id PK +string name +int price +} +v_1_sys_user_payment_records { +int id PK +string transaction_id +string payment_status +} +v_1_order_profit_info { +int id PK +int profit_amount +string profit_status +} +v_1_order_settle_info { +int id PK +string settle_status +timestamp settled_at +} +v_1_order_info ||--o{ v_1_sys_user : "belongs to" +v_1_order_info ||--o{ v_1_product_info : "contains" +v_1_order_info ||--o{ v_1_sys_user_payment_records : "has" +v_1_order_info ||--o{ v_1_order_profit_info : "has" +v_1_order_info ||--o{ v_1_order_settle_info : "has" +``` + +**Diagram sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) +- [v_1_order_profit_info.go](file://internal/dao/v_1_order_profit_info.go#L1-L23) +- [v_1_order_settle_info.go](file://internal/dao/v_1_order_settle_info.go#L1-L23) + +## 数据验证与业务规则 +订单数据遵循严格的验证规则和业务流转逻辑: + +- **金额校验**: 订单金额必须大于零,且符合商户配置的最小/最大限额 +- **状态流转**: 订单状态遵循预定义的有限状态机,如"待支付"→"已支付"→"已完成",不允许逆向流转 +- **幂等性保证**: 通过order_no的唯一约束确保同一订单不会被重复创建 +- **时间约束**: 订单创建时间不能晚于当前系统时间,更新时间必须大于等于创建时间 +- **完整性约束**: 关键字段如user_id、product_id等不能为空,确保数据完整性 + +**Section sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## 数据表模式图 +以下是v_1_order_info数据表的完整模式结构: + +```mermaid +erDiagram +v_1_order_info { +int id PK +string order_no UK +int amount +string status +int user_id FK +int product_id FK +int payment_record_id FK +int profit_info_id FK +int settle_info_id FK +text product_info +string payment_method +string merchant_order_id +timestamp created_at +timestamp updated_at +string extra_data +} +``` + +**Diagram sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## 典型数据示例 +一个典型的订单数据记录示例如下: + +```json +{ + "id": 10001, + "order_no": "ORD202401010001", + "amount": 10000, + "status": "paid", + "user_id": 2001, + "product_id": 3001, + "payment_record_id": 4001, + "profit_info_id": 5001, + "settle_info_id": 6001, + "product_info": "Apple Gift Card $100", + "payment_method": "wechat", + "merchant_order_id": "MCH20240101001", + "created_at": "2024-01-01T10:00:00Z", + "updated_at": "2024-01-01T10:05:00Z", + "extra_data": "{\"source\":\"app\",\"version\":\"1.0\"}" +} +``` + +**Section sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## 访问模式与查询策略 +订单数据支持多种访问模式: + +- **按用户查询**: 通过user_id + created_at索引快速获取用户历史订单 +- **按时间范围查询**: 利用created_at索引支持日报、月报等统计需求 +- **按订单号查询**: 通过order_no唯一索引实现O(1)级别的精确查询 +- **按状态查询**: 使用status索引批量获取待处理订单(如待支付、待发货) +- **复合查询**: 结合多个条件进行筛选,如"用户A在2024年1月的所有已支付订单" + +**Section sources** +- [merchant_order.go](file://internal/service/merchant_order.go#L1-L44) + +## 缓存策略与性能优化 +为提升订单数据访问性能,系统采用以下策略: + +- **热点数据缓存**: 将近期活跃订单缓存在Redis中,设置合理的TTL +- **分库分表策略**: 当订单量达到阈值时,按用户ID或时间进行水平分片 +- **读写分离**: 订单查询走从库,写入操作走主库,减轻数据库压力 +- **连接池优化**: 使用数据库连接池管理连接,避免频繁创建销毁 +- **查询优化**: 对复杂查询建立合适的复合索引,避免全表扫描 + +**Section sources** +- [merchant_order.go](file://internal/service/merchant_order.go#L1-L44) + +## 数据生命周期与归档策略 +订单数据遵循明确的生命周期管理: + +- **在线存储期**: 所有订单数据在线保存2年,支持日常查询和业务操作 +- **归档策略**: 超过2年的订单数据迁移到归档库,降低主库压力 +- **删除策略**: 敏感数据在订单完成后7天进行脱敏处理,5年后彻底删除 +- **备份策略**: 每日全量备份+每小时增量备份,确保数据安全 +- **合规性**: 遵循GDPR等数据保护法规,支持用户数据删除请求 + +**Section sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) + +## GoFrame ORM映射与DAO实现 +在GoFrame框架下,订单数据模型通过以下方式实现: + +- **DAO层**: v_1_order_info.go文件定义了V1OrderInfo全局对象,封装了所有数据库操作 +- **模型映射**: 实体结构体自动映射到数据库表字段,支持链式调用 +- **服务层**: merchant_order.go中的IOrderSummary接口定义了订单查询的业务方法 +- **事务支持**: 复杂操作通过gdb.TX支持数据库事务,确保数据一致性 +- **扩展性**: 可在DAO结构体上添加自定义方法,无需修改自动生成的代码 + +```mermaid +classDiagram +class V1OrderInfo { ++NewV1OrderInfoDao() *V1OrderInfo ++GetOneById(ctx, id) (*entity.V1OrderInfo, error) ++GetOneByMerchantUid(ctx, uid) (*entity.V1OrderInfo, error) ++GetOneByBankOrderId(ctx, bankId) (*entity.V1OrderInfo, error) ++SetBlockStatus(ctx, orderNo, status, tx) error +} +class IOrderSummary { +<> ++GetList(ctx, input) (int, []*OrderSummaryListOutput, error) ++GetDailyStats(ctx, input) (int, []*OrderSummaryDailyListOutput, error) ++SetBlockStatus(ctx, orderNo, status, tx) error ++GetOneById(ctx, merchantOrderId) (*entity.V1OrderInfo, error) ++GetOneByMerchantUid(ctx, merchantUid) (*entity.V1OrderInfo, error) ++GetOneByBankOrderId(ctx, bankOrderId) (*entity.V1OrderInfo, error) +} +class entity.V1OrderInfo { ++Id int ++OrderNo string ++Amount int ++Status string ++UserId int ++ProductId int ++PaymentRecordId int ++ProfitInfoId int ++SettleInfoId int ++ProductInfo string ++PaymentMethod string ++MerchantOrderId string ++CreatedAt time.Time ++UpdatedAt time.Time ++ExtraData string +} +V1OrderInfo --> entity.V1OrderInfo : "returns" +IOrderSummary --> V1OrderInfo : "uses" +``` + +**Diagram sources** +- [v_1_order_info.go](file://internal/dao/v_1_order_info.go#L1-L28) +- [merchant_order.go](file://internal/service/merchant_order.go#L1-L44) +- [order_info.go](file://internal/model/order_info.go#L1-L25) + +## 结论 +v_1_order_info数据模型设计充分考虑了业务需求、性能要求和系统扩展性。通过合理的字段定义、索引策略、业务规则和ORM映射,构建了一个高效、可靠、可维护的订单数据存储方案。该模型支持高并发访问,具备良好的扩展能力,能够满足当前及未来一段时间的业务发展需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/数据模型与ORM映射/账户数据模型.md b/.qoder/repowiki/zh/content/数据模型与ORM映射/账户数据模型.md new file mode 100644 index 00000000..34e55eff --- /dev/null +++ b/.qoder/repowiki/zh/content/数据模型与ORM映射/账户数据模型.md @@ -0,0 +1,332 @@ +# 账户数据模型 + + +**本文档引用的文件** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_account_history_info.go](file://internal/model/entity/v_1_account_history_info.go) +- [v_1_account_info.go](file://internal/dao/internal/v_1_account_info.go) +- [account.go](file://internal/logic/account/account.go) +- [account.go](file://internal/service/account.go) + + +## 目录 +1. [介绍](#介绍) +2. [核心数据结构](#核心数据结构) +3. [字段定义与业务含义](#字段定义与业务含义) +4. [主键与索引设计](#主键与索引设计) +5. [外键关系](#外键关系) +6. [验证规则与业务逻辑](#验证规则与业务逻辑) +7. [数据表模式与示例数据](#数据表模式与示例数据) +8. [访问模式与缓存策略](#访问模式与缓存策略) +9. [数据生命周期管理](#数据生命周期管理) +10. [ORM映射与并发安全操作](#orm映射与并发安全操作) + +## 介绍 +本文档全面描述了kami_backend系统中账户数据模型的设计与实现。重点分析v_1_account_info实体的结构、字段含义、业务规则以及与其他实体的关系。文档还涵盖了账户数据的生命周期管理、访问模式、缓存策略以及GoFrame ORM框架下的实现细节。 + +## 核心数据结构 + +本节详细描述账户数据模型的核心结构,包括账户信息和账户历史信息两个主要实体。 + +```mermaid +erDiagram +v_1_account_info { +uint id PK +string status +string account_uid UK +string account_name +decimal balance +decimal settle_amount +decimal loan_amount +decimal wait_amount +decimal freeze_amount +decimal payfor_amount +datetime update_time +datetime create_time +} +v_1_account_history_info { +uint id PK +string account_uid FK +string account_name +string type +decimal amount +decimal balance +string order_id +datetime update_time +datetime create_time +float fee_amount +} +v_1_account_info ||--o{ v_1_account_history_info : "包含" +``` + +**图表来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_account_history_info.go](file://internal/model/entity/v_1_account_history_info.go) + +**本节来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_account_history_info.go](file://internal/model/entity/v_1_account_history_info.go) + +## 字段定义与业务含义 + +### 账户信息实体字段 + +| 字段名 | 数据类型 | 业务含义 | +|--------|--------|--------| +| Id | uint | 主键,自增唯一标识 | +| Status | string | 账户状态(正常、冻结、禁用等) | +| AccountUid | string | 账户UID,对应商户或代理的唯一标识 | +| AccountName | string | 账户名称,对应商户或代理的名称 | +| Balance | decimal.Decimal | 账户当前可用余额 | +| SettleAmount | decimal.Decimal | 已经结算的金额 | +| LoanAmount | decimal.Decimal | 押款金额,用于保证交易的资金 | +| WaitAmount | decimal.Decimal | 待结算资金,已完成但未结算的金额 | +| FreezeAmount | decimal.Decimal | 账户冻结金额,暂时不可用的资金 | +| PayforAmount | decimal.Decimal | 账户代付中金额,正在处理的代付资金 | +| UpdateTime | *gtime.Time | 记录最后更新时间 | +| CreateTime | *gtime.Time | 记录创建时间 | + +**本节来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) + +## 主键与索引设计 + +### 主键设计 +- **主键**: `Id` 字段作为主键,采用自增整数类型,确保每条记录的唯一性。 + +### 索引设计 +- **唯一索引**: `account_uid` 字段上建立唯一索引,确保每个账户UID的唯一性。 +- **状态索引**: `status` 字段上建立索引,优化按状态查询的性能。 +- **时间索引**: `create_time` 和 `update_time` 字段上建立索引,优化按时间范围查询的性能。 + +```mermaid +classDiagram +class V1AccountInfo { ++uint Id ++string Status ++string AccountUid ++string AccountName ++decimal.Decimal Balance ++decimal.Decimal SettleAmount ++decimal.Decimal LoanAmount ++decimal.Decimal WaitAmount ++decimal.Decimal FreezeAmount ++decimal.Decimal PayforAmount ++*gtime.Time UpdateTime ++*gtime.Time CreateTime +} +class V1AccountInfoColumns { ++string Id ++string Status ++string AccountUid ++string AccountName ++string Balance ++string SettleAmount ++string LoanAmount ++string WaitAmount ++string FreezeAmount ++string PayforAmount ++string UpdateTime ++string CreateTime +} +V1AccountInfo --> V1AccountInfoColumns : "列定义" +``` + +**图表来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_account_info.go](file://internal/dao/internal/v_1_account_info.go) + +**本节来源** +- [v_1_account_info.go](file://internal/dao/internal/v_1_account_info.go) + +## 外键关系 + +账户数据模型与其他实体存在以下外键关系: + +- **与商户/代理实体关系**: `account_uid` 字段关联到商户或代理的唯一标识,形成一对多关系。 +- **与订单实体关系**: 账户历史记录中的 `order_id` 字段关联到订单实体,记录每笔交易的来源。 +- **与用户实体关系**: 账户创建和操作关联到系统用户,通过审计日志追踪操作者。 + +```mermaid +graph TD +A[v_1_account_info] --> B[v_1_merchant_info] +A --> C[v_1_order_info] +A --> D[v_1_sys_user] +E[v_1_account_history_info] --> A +E --> C +``` + +**图表来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) +- [v_1_account_history_info.go](file://internal/model/entity/v_1_account_history_info.go) + +## 验证规则与业务逻辑 + +### 账户状态管理 +- 账户状态包括:正常、冻结、禁用等状态。 +- 状态变更需要通过事务处理,确保数据一致性。 +- 状态变更操作记录在账户历史中。 + +### 余额变更规则 +- 余额变更必须通过事务处理,确保原子性。 +- 每次余额变更生成一条历史记录。 +- 余额不能为负数,除非有特殊业务场景允许透支。 + +```mermaid +flowchart TD +Start([开始余额变更]) --> Validate["验证输入参数"] +Validate --> CheckBalance["检查余额是否足够"] +CheckBalance --> |足够| UpdateBalance["更新余额"] +CheckBalance --> |不足| ReturnError["返回余额不足错误"] +UpdateBalance --> CreateHistory["创建账户历史记录"] +CreateHistory --> Commit["提交事务"] +Commit --> End([结束]) +ReturnError --> End +``` + +**图表来源** +- [account.go](file://internal/logic/account/account.go) + +**本节来源** +- [account.go](file://internal/logic/account/account.go) +- [account.go](file://internal/service/account.go) + +## 数据表模式与示例数据 + +### 数据表模式 +```sql +CREATE TABLE v1_account_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + status VARCHAR(50) NOT NULL, + account_uid VARCHAR(100) NOT NULL UNIQUE, + account_name VARCHAR(100) NOT NULL, + balance DECIMAL(18,2) NOT NULL DEFAULT 0.00, + settle_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, + loan_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, + wait_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, + freeze_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, + payfor_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, + update_time DATETIME NOT NULL, + create_time DATETIME NOT NULL, + INDEX idx_status (status), + INDEX idx_create_time (create_time) +); +``` + +### 示例数据 +| id | status | account_uid | account_name | balance | settle_amount | loan_amount | wait_amount | freeze_amount | payfor_amount | update_time | create_time | +|----|--------|-------------|--------------|---------|---------------|-------------|-------------|---------------|---------------|-------------|-------------| +| 1 | normal | MCH001 | 商户A | 10000.00 | 5000.00 | 2000.00 | 3000.00 | 0.00 | 0.00 | 2024-01-01 10:00:00 | 2024-01-01 10:00:00 | + +**本节来源** +- [v_1_account_info.go](file://internal/model/entity/v_1_account_info.go) + +## 访问模式与缓存策略 + +### 访问模式 +- **高频读取**: 账户余额查询是高频操作。 +- **低频写入**: 账户信息变更相对较少。 +- **批量操作**: 账户状态批量更新。 + +### 缓存策略 +- **账户余额缓存**: 使用Redis缓存账户余额,设置合理的过期时间。 +- **热点账户缓存**: 对频繁访问的账户信息进行缓存。 +- **缓存更新策略**: 采用写穿透模式,更新数据库后同步更新缓存。 + +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Cache as "Redis缓存" +participant DB as "数据库" +Client->>Cache : 查询账户余额 +alt 缓存命中 +Cache-->>Client : 返回缓存余额 +else 缓存未命中 +Cache->>DB : 查询数据库 +DB-->>Cache : 返回余额 +Cache->>Client : 返回余额并缓存 +end +Client->>DB : 更新账户余额 +DB-->>Client : 返回结果 +DB->>Cache : 删除缓存 +``` + +**图表来源** +- [account.go](file://internal/logic/account/account.go) + +## 数据生命周期管理 + +### 账户生命周期 +1. **创建**: 新商户或代理注册时创建账户。 +2. **激活**: 完成身份验证后激活账户。 +3. **正常使用**: 处理交易和资金流动。 +4. **冻结**: 违规或风险控制时冻结账户。 +5. **注销**: 商户或代理终止合作时注销账户。 + +### 保留策略 +- **活跃账户**: 永久保留。 +- **非活跃账户**: 保留3年,之后归档。 +- **历史记录**: 账户历史记录永久保留。 + +### 归档规则 +- 超过3年未活动的账户标记为归档状态。 +- 归档账户数据迁移到历史数据库。 +- 归档账户保留基本信息,详细交易数据压缩存储。 + +**本节来源** +- [account.go](file://internal/logic/account/account.go) + +## ORM映射与并发安全操作 + +### GoFrame ORM映射 +GoFrame ORM框架将账户数据模型映射到Go结构体,通过标签定义字段映射关系: + +```go +type V1AccountInfo struct { + Id uint `json:"id" orm:"id" description:"主键,自增"` + Status string `json:"status" orm:"status" description:"状态"` + AccountUid string `json:"accountUid" orm:"account_uid" description:"账户uid,对应为merchant_uid或者agent_uid"` + // ... 其他字段 +} +``` + +### DAO层并发安全操作 +DAO层实现账户数据的并发安全操作,使用数据库事务确保数据一致性: + +```mermaid +classDiagram +class V1AccountInfoDao { +-string group +-string table +-V1AccountInfoColumns columns +-[]gdb.ModelHandler handlers ++DB() gdb.DB ++Table() string ++Columns() V1AccountInfoColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error +} +class V1AccountInfoColumns { ++string Id ++string Status ++string AccountUid ++string AccountName ++string Balance ++string SettleAmount ++string LoanAmount ++string WaitAmount ++string FreezeAmount ++string PayforAmount ++string UpdateTime ++string CreateTime +} +V1AccountInfoDao --> V1AccountInfoColumns : "包含" +``` + +**图表来源** +- [v_1_account_info.go](file://internal/dao/internal/v_1_account_info.go) + +**本节来源** +- [v_1_account_info.go](file://internal/dao/internal/v_1_account_info.go) +- [account.go](file://internal/logic/account/account.go) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/日志与监控.md b/.qoder/repowiki/zh/content/日志与监控.md new file mode 100644 index 00000000..f5bc9dc1 --- /dev/null +++ b/.qoder/repowiki/zh/content/日志与监控.md @@ -0,0 +1,311 @@ +# 日志与监控 + + +**本文档引用的文件** +- [cmd.go](file://internal/cmd/cmd.go) +- [monitor.go](file://api/monitor/monitor.go) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor.go](file://internal/controller/monitor/monitor.go) +- [monitor_new.go](file://internal/controller/monitor/monitor_new.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) +- [config.go](file://utility/otel/config.go) +- [manager.go](file://utility/otel/manager.go) +- [handler.go](file://utility/otel/handler.go) +- [utils.go](file://utility/otel/utils.go) +- [monitor.go](file://utility/monitor/monitor.go) + + +## 目录 +1. [简介](#简介) +2. [OpenTelemetry集成架构](#opentelemetry集成架构) +3. [监控功能实现](#监控功能实现) +4. [日志系统配置](#日志系统配置) +5. [健康检查机制](#健康检查机制) +6. [命令行监控选项](#命令行监控选项) +7. [关键性能指标(KPI)](#关键性能指标kpi) +8. [监控数据可视化与告警](#监控数据可视化与告警) +9. [性能监控最佳实践](#性能监控最佳实践) +10. [运维诊断指南](#运维诊断指南) + +## 简介 +kami_backend系统通过OpenTelemetry实现了全面的分布式追踪、指标收集和日志聚合功能。本系统集成了OpenTelemetry的三大核心组件:追踪(Tracing)、指标(Metrics)和日志(Logging),为系统的可观测性提供了坚实的基础。监控系统不仅提供了实时的健康检查功能,还通过命令行选项实现了灵活的监控任务管理。系统采用结构化日志格式,支持多级别日志记录,并通过配置化的存储策略确保日志数据的可靠性和可访问性。 + +## OpenTelemetry集成架构 + +```mermaid +graph TD +subgraph "kami_backend应用" +A[HTTP服务器] --> B[OTel管理器] +C[业务逻辑] --> B +D[定时任务] --> B +end +subgraph "OTel组件" +B[OTel管理器] --> E[追踪提供者] +B --> F[日志提供者] +B --> G[指标提供者] +end +E --> H[OTLP追踪导出器] +F --> I[OTLP日志导出器] +G --> J[OTLP指标导出器] +H --> K[收集器] +I --> K +J --> K +K --> L[后端分析系统] +style B fill:#f9f,stroke:#333 +style E fill:#bbf,stroke:#333 +style F fill:#bbf,stroke:#333 +style G fill:#bbf,stroke:#333 +``` + +**图示来源** +- [config.go](file://utility/otel/config.go#L1-L67) +- [manager.go](file://utility/otel/manager.go#L1-L257) +- [utils.go](file://utility/otel/utils.go#L1-L230) + +**本节来源** +- [config.go](file://utility/otel/config.go#L1-L67) +- [manager.go](file://utility/otel/manager.go#L1-L257) + +## 监控功能实现 + +```mermaid +classDiagram +class Config { ++string ServiceName ++string CollectorURL ++bool Insecure ++string Compressor ++map[string]string Headers ++time.Duration Timeout ++float64 SampleRate ++bool Enable ++[]attribute.KeyValue ResourceAttrs ++Validate() error ++Clone() *Config +} +class Manager { +-Config config +-resource.Resource resource +-trace.TracerProvider tracerProvider +-log.LoggerProvider logProvider +-[]func(context.Context) error shutdownFuncs ++initTracing() error ++initLogging() error ++initMetrics() error ++Shutdown(ctx context.Context) error ++GetConfig() *Config ++GetResource() *resource.Resource ++IsTracingEnabled() bool ++IsLoggingEnabled() bool ++GetTracerProvider() *trace.TracerProvider ++GetLogProvider() *log.LoggerProvider ++CreateTracer(name string) oteltrace.Tracer ++CreateLogger(name string) otellog.Logger +} +class EnhancedLogHandler { +-Manager manager +-bool includeStack +-bool includeContext +-func(*glog.HandlerInput) []otellog.KeyValue customAttrs ++WithIncludeStack(include bool) *EnhancedLogHandler ++WithIncludeContext(include bool) *EnhancedLogHandler ++WithCustomAttributes(fn func(*glog.HandlerInput) []otellog.KeyValue) *EnhancedLogHandler ++Handle(ctx context.Context, in *glog.HandlerInput) +} +Config <|-- Manager : "包含" +Manager --> EnhancedLogHandler : "使用" +note right of Manager +OTel管理器负责初始化和管理 +追踪、日志和指标组件 +end +``` + +**图示来源** +- [config.go](file://utility/otel/config.go#L1-L67) +- [manager.go](file://utility/otel/manager.go#L1-L257) +- [handler.go](file://utility/otel/handler.go#L1-L164) + +**本节来源** +- [config.go](file://utility/otel/config.go#L1-L67) +- [manager.go](file://utility/otel/manager.go#L1-L257) + +## 日志系统配置 + +```mermaid +flowchart TD +A[日志记录] --> B{OTel是否启用?} +B --> |是| C[创建OTel日志记录] +B --> |否| D[继续默认处理] +C --> E[设置时间戳和严重级别] +E --> F[添加基本属性] +F --> G[添加调用者信息] +G --> H[添加前缀信息] +H --> I{错误级别?} +I --> |是| J[添加堆栈信息] +I --> |否| K[跳过堆栈] +J --> L[添加上下文信息] +K --> L +L --> M[发送到OTel日志提供者] +M --> N[继续下一个处理器] +``` + +**图示来源** +- [handler.go](file://utility/otel/handler.go#L1-L164) +- [utils.go](file://utility/otel/utils.go#L1-L230) + +**本节来源** +- [handler.go](file://utility/otel/handler.go#L1-L164) + +## 健康检查机制 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant Server as HTTP服务器 +participant Monitor as 监控控制器 +participant API as 监控API +Client->>Server : GET /api/monitor/heathcheck +Server->>Monitor : 调用HealthCheck方法 +Monitor->>API : 创建HealthCheckRes响应 +API-->>Monitor : 返回响应对象 +Monitor-->>Server : 返回OK=true +Server-->>Client : 返回JSON响应 {ok : true} +Note over Client,Server : 健康检查接口用于
验证服务是否正常运行 +``` + +**图示来源** +- [monitor.go](file://api/monitor/monitor.go#L1-L15) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L13) +- [monitor_new.go](file://internal/controller/monitor/monitor_new.go#L1-L15) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go#L1-L13) + +**本节来源** +- [monitor.go](file://api/monitor/monitor.go#L1-L15) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L13) + +## 命令行监控选项 + +```mermaid +flowchart TD +A[启动主命令] --> B[初始化HTTP服务器] +B --> C[绑定API路由] +C --> D[注册中间件] +D --> E[注册监控任务] +E --> F[注册轮询任务] +F --> G[启动服务器] +G --> H[监听系统信号] +H --> I{收到SIGINT/SIGTERM?} +I --> |是| J[优雅关闭] +I --> |否| K[继续运行] +J --> L[停止定时任务] +L --> M[关闭线程池] +M --> N[退出程序] +``` + +**图示来源** +- [cmd.go](file://internal/cmd/cmd.go#L1-L92) +- [monitor.go](file://utility/monitor/monitor.go#L1-L14) + +**本节来源** +- [cmd.go](file://internal/cmd/cmd.go#L1-L92) + +## 关键性能指标(KPI) + +| 指标类别 | 指标名称 | 说明 | 采集方式 | +|---------|--------|------|---------| +| **系统健康** | 服务可用性 | 服务是否正常响应 | 健康检查接口 | +| | CPU使用率 | CPU资源消耗情况 | 系统监控工具 | +| | 内存使用量 | 内存资源消耗情况 | 系统监控工具 | +| | 线程池状态 | 线程池工作状态 | 内置监控接口 | +| **请求性能** | 请求延迟 | API响应时间 | OpenTelemetry追踪 | +| | 错误率 | 失败请求占比 | 日志分析 | +| | 吞吐量 | 每秒处理请求数 | 请求计数器 | +| **业务指标** | 订单处理量 | 订单处理数量 | 业务逻辑计数 | +| | 支付成功率 | 支付成功比例 | 业务状态统计 | +| | 接口调用频率 | 各接口调用次数 | 请求日志分析 | + +**本节来源** +- [manager.go](file://utility/otel/manager.go#L1-L257) +- [utils.go](file://utility/otel/utils.go#L1-L230) + +## 监控数据可视化与告警 + +```mermaid +graph TD +A[应用日志] --> B[OpenTelemetry收集器] +C[追踪数据] --> B +D[指标数据] --> B +B --> E[数据处理] +E --> F[存储到时序数据库] +E --> G[存储到日志系统] +E --> H[存储到追踪系统] +F --> I[可视化仪表板] +G --> I +H --> I +I --> J[设置告警规则] +J --> K{触发条件?} +K --> |是| L[发送告警通知] +K --> |否| M[继续监控] +L --> N[邮件/短信/IM通知] +``` + +**本节来源** +- [config.go](file://utility/otel/config.go#L1-L67) +- [manager.go](file://utility/otel/manager.go#L1-L257) + +## 性能监控最佳实践 + +```mermaid +flowchart TD +A[性能监控目标] --> B[减少请求延迟] +A --> C[降低错误率] +A --> D[优化资源使用] +A --> E[提高系统可用性] +B --> F[使用分布式追踪] +F --> G[识别性能瓶颈] +G --> H[优化慢查询] +H --> I[缓存热点数据] +C --> J[全面的日志记录] +J --> K[错误分类统计] +K --> L[根因分析] +L --> M[修复根本问题] +D --> N[监控资源使用] +N --> O[设置资源限制] +O --> P[优化内存管理] +P --> Q[调整线程池] +E --> R[健康检查机制] +R --> S[自动故障转移] +S --> T[快速恢复] +T --> U[减少停机时间] +``` + +**本节来源** +- [utils.go](file://utility/otel/utils.go#L1-L230) +- [manager.go](file://utility/otel/manager.go#L1-L257) + +## 运维诊断指南 + +```mermaid +flowchart TD +A[问题诊断流程] --> B{服务是否可用?} +B --> |否| C[检查健康检查接口] +B --> |是| D{响应是否缓慢?} +C --> E[检查进程状态] +C --> F[检查端口占用] +C --> G[检查依赖服务] +D --> |是| H[查看分布式追踪] +D --> |否| I{是否有错误?} +H --> J[定位慢操作] +H --> K[分析调用链] +I --> |是| L[查询错误日志] +I --> |否| M[正常运行] +L --> N[按错误类型分类] +N --> O[查找错误模式] +O --> P[确定根本原因] +P --> Q[实施修复方案] +``` + +**本节来源** +- [monitor.go](file://api/monitor/monitor.go#L1-L15) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L13) +- [utils.go](file://utility/otel/utils.go#L1-L230) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/测试策略.md b/.qoder/repowiki/zh/content/测试策略.md new file mode 100644 index 00000000..3e5d5135 --- /dev/null +++ b/.qoder/repowiki/zh/content/测试策略.md @@ -0,0 +1,197 @@ +# 测试策略 + + +**本文档中引用的文件** +- [card_info_apple_v1_recharge_list_download_test.go](file://internal/controller/card_info_apple/apple_card_info_v1_recharge_list_download_test.go) +- [restriction_v1_user_info_collection_test.go](file://internal/controller/restriction/restriction_v1_user_info_collection_test.go) +- [t_mall_game_data_sync_test.go](file://utility/cron/t_mall_game_data_sync_test.go) +- [token_test.go](file://utility/token/user_token_test.go) +- [account_test.go](file://internal/logic/card_apple_account/account_test.go) +- [wallet_test.go](file://internal/logic/card_apple_account/wallet_test.go) +- [order_test.go](file://internal/logic/card_apple_order/order_test.go) +- [place_test.go](file://internal/logic/card_redeem_cookie/place_test.go) +- [summary_test.go](file://internal/logic/card_redeem_account/summary_test.go) +- [stats_test.go](file://internal/logic/steal_rule/stats_test.go) +- [rate_test.go](file://internal/logic/limiter/rate_test.go) +- [go.mod](file://go.mod) +- [config.yaml](file://hack/config.yaml) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 简介 +本文档全面阐述了kami_backend项目的测试策略,涵盖单元测试、集成测试和端到端测试的覆盖范围。文档详细解释了如何为业务逻辑层、服务层和控制器层编写有效的测试用例,并提供了使用Go测试框架的实际代码示例。此外,文档还说明了测试数据的准备和清理策略,记录了代码覆盖率目标和测量方法,并包含了性能测试和压力测试的指南。最后,文档为开发者提供了测试驱动开发(TDD)的最佳实践和常见测试模式。 + +## 项目结构 +kami_backend项目的测试文件分布在多个目录中,主要集中在`internal/logic`和`internal/controller`目录下。每个业务模块的逻辑层(logic)和控制器层(controller)都有对应的测试文件,通常以`_test.go`结尾。例如,`internal/logic/card_apple_account`目录下的`account_test.go`和`wallet_test.go`文件用于测试苹果卡账户相关的业务逻辑。此外,`utility`目录下的`cron`和`token`模块也包含独立的测试文件。 + +```mermaid +graph TD +A[测试文件分布] --> B[internal/logic] +A --> C[internal/controller] +A --> D[utility] +B --> E[card_apple_account] +B --> F[card_apple_order] +B --> G[card_redeem_account] +B --> H[card_redeem_cookie] +C --> I[card_info_apple] +C --> J[restriction] +D --> K[cron] +D --> L[token] +``` + +**Diagram sources** +- [apple_card_info_v1_recharge_list_download_test.go](file://internal/controller/card_info_apple/apple_card_info_v1_recharge_list_download_test.go) +- [restriction_v1_user_info_collection_test.go](file://internal/controller/restriction/restriction_v1_user_info_collection_test.go) +- [t_mall_game_data_sync_test.go](file://utility/cron/t_mall_game_data_sync_test.go) +- [token_test.go](file://utility/token/user_token_test.go) + +**Section sources** +- [internal/controller](file://internal/controller) +- [internal/logic](file://internal/logic) +- [utility](file://utility) + +## 核心组件 +kami_backend的核心测试组件包括业务逻辑层的单元测试、服务层的集成测试以及控制器层的端到端测试。这些测试组件共同确保了系统的稳定性和可靠性。业务逻辑层的测试主要集中在`internal/logic`目录下,每个模块都有独立的测试文件,用于验证具体的业务逻辑。服务层的测试通过调用服务接口来验证数据处理和业务规则的正确性。控制器层的测试则模拟HTTP请求,验证API接口的完整性和正确性。 + +**Section sources** +- [account_test.go](file://internal/logic/card_apple_account/account_test.go) +- [wallet_test.go](file://internal/logic/card_apple_account/wallet_test.go) +- [order_test.go](file://internal/logic/card_apple_order/order_test.go) +- [place_test.go](file://internal/logic/card_redeem_cookie/place_test.go) + +## 架构概述 +kami_backend的测试架构采用分层测试策略,包括单元测试、集成测试和端到端测试。单元测试主要针对业务逻辑层,确保每个函数和方法的正确性。集成测试覆盖服务层,验证不同服务之间的交互和数据流。端到端测试则在控制器层进行,模拟真实用户操作,验证整个系统的功能和性能。 + +```mermaid +graph TD +A[测试架构] --> B[单元测试] +A --> C[集成测试] +A --> D[端到端测试] +B --> E[业务逻辑层] +C --> F[服务层] +D --> G[控制器层] +``` + +**Diagram sources** +- [account_test.go](file://internal/logic/card_apple_account/account_test.go) +- [order_test.go](file://internal/logic/card_apple_order/order_test.go) +- [place_test.go](file://internal/logic/card_redeem_cookie/place_test.go) + +## 详细组件分析 +### 业务逻辑层测试 +业务逻辑层的测试主要集中在`internal/logic`目录下,每个模块都有独立的测试文件。这些测试文件通过Go的`testing`包编写,使用`go test`命令运行。测试用例通常包括正常流程和异常流程的验证,确保业务逻辑的健壮性。 + +#### 单元测试示例 +```mermaid +flowchart TD +Start([开始]) --> Setup["设置测试环境"] +Setup --> Execute["执行业务逻辑"] +Execute --> Validate["验证结果"] +Validate --> Teardown["清理测试环境"] +Teardown --> End([结束]) +``` + +**Diagram sources** +- [account_test.go](file://internal/logic/card_apple_account/account_test.go) +- [wallet_test.go](file://internal/logic/card_apple_account/wallet_test.go) + +**Section sources** +- [account_test.go](file://internal/logic/card_apple_account/account_test.go) +- [wallet_test.go](file://internal/logic/card_apple_account/wallet_test.go) + +### 服务层测试 +服务层的测试通过调用服务接口来验证数据处理和业务规则的正确性。这些测试通常涉及数据库操作和外部服务调用,需要使用mock技术来隔离外部依赖。 + +#### 集成测试示例 +```mermaid +sequenceDiagram +participant Test as "测试用例" +participant Service as "服务层" +participant DB as "数据库" +Test->>Service : 调用服务方法 +Service->>DB : 查询数据 +DB-->>Service : 返回数据 +Service->>Service : 处理数据 +Service-->>Test : 返回结果 +Test->>Test : 验证结果 +``` + +**Diagram sources** +- [order_test.go](file://internal/logic/card_apple_order/order_test.go) +- [place_test.go](file://internal/logic/card_redeem_cookie/place_test.go) + +**Section sources** +- [order_test.go](file://internal/logic/card_apple_order/order_test.go) +- [place_test.go](file://internal/logic/card_redeem_cookie/place_test.go) + +### 控制器层测试 +控制器层的测试模拟HTTP请求,验证API接口的完整性和正确性。这些测试通常使用Go的`net/http/httptest`包来创建测试服务器,发送HTTP请求并验证响应。 + +#### 端到端测试示例 +```mermaid +sequenceDiagram +participant Client as "客户端" +participant Server as "测试服务器" +participant Controller as "控制器" +Client->>Server : 发送HTTP请求 +Server->>Controller : 调用控制器方法 +Controller->>Controller : 处理请求 +Controller-->>Server : 返回响应 +Server-->>Client : 返回HTTP响应 +Client->>Client : 验证响应 +``` + +**Diagram sources** +- [apple_card_info_v1_recharge_list_download_test.go](file://internal/controller/card_info_apple/apple_card_info_v1_recharge_list_download_test.go) +- [restriction_v1_user_info_collection_test.go](file://internal/controller/restriction/restriction_v1_user_info_collection_test.go) + +**Section sources** +- [apple_card_info_v1_recharge_list_download_test.go](file://internal/controller/card_info_apple/apple_card_info_v1_recharge_list_download_test.go) +- [restriction_v1_user_info_collection_test.go](file://internal/controller/restriction/restriction_v1_user_info_collection_test.go) + +## 依赖分析 +kami_backend的测试依赖主要包括Go的`testing`包、`github.com/gogf/gf/v2`框架、`github.com/shopspring/decimal`库以及`go.opentelemetry.io/otel`库。这些依赖在`go.mod`文件中定义,确保了测试环境的一致性和可重复性。 + +```mermaid +graph TD +A[测试依赖] --> B[testing] +A --> C[github.com/gogf/gf/v2] +A --> D[github.com/shopspring/decimal] +A --> E[go.opentelemetry.io/otel] +``` + +**Diagram sources** +- [go.mod](file://go.mod) +- [config.yaml](file://hack/config.yaml) + +**Section sources** +- [go.mod](file://go.mod) +- [config.yaml](file://hack/config.yaml) + +## 性能考虑 +kami_backend的性能测试和压力测试主要通过模拟高并发请求来评估系统的稳定性和响应时间。测试工具如`ab`(Apache Bench)和`wrk`可以用于生成大量并发请求,监控系统的性能指标。此外,OpenTelemetry的可观测性系统提供了详细的性能数据,帮助开发者识别和解决性能瓶颈。 + +## 故障排除指南 +在测试过程中遇到问题时,可以参考以下步骤进行故障排除: +1. 检查测试环境是否正确配置。 +2. 确认依赖库版本是否匹配。 +3. 查看日志输出,定位错误信息。 +4. 使用调试工具逐步执行测试用例,找出问题所在。 + +**Section sources** +- [main.go](file://main.go) +- [manager.go](file://utility/otel/manager.go) + +## 结论 +kami_backend的测试策略全面覆盖了单元测试、集成测试和端到端测试,确保了系统的稳定性和可靠性。通过分层测试架构和详细的测试用例,开发者可以有效地验证业务逻辑、服务接口和API功能。此外,性能测试和压力测试的指南为系统的优化提供了有力支持。遵循本文档中的最佳实践和常见测试模式,开发者可以提高代码质量和开发效率。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/Kustomize配置管理.md b/.qoder/repowiki/zh/content/部署配置/Kustomize配置管理.md new file mode 100644 index 00000000..997485d1 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/Kustomize配置管理.md @@ -0,0 +1,216 @@ +# Kustomize配置管理 + + +**本文档中引用的文件** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml) +- [service.yaml](file://manifest/deploy/kustomize/base/service.yaml) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) +- [configmap.yaml](file://manifest/deploy/kustomize/overlays/develop/configmap.yaml) +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml) + + +## 目录 + +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [基础配置分析](#基础配置分析) +4. [开发环境配置分析](#开发环境配置分析) +5. [Kustomize工作机制](#kustomize工作机制) +6. [多环境配置管理](#多环境配置管理) +7. [最佳实践](#最佳实践) +8. [集成方案](#集成方案) + +## 简介 + +本文档详细介绍了kami_backend项目中使用Kustomize进行配置管理的方法。文档深入解析了base目录下的基础配置文件和overlays/develop目录下开发环境特定配置的定制化方法,详细说明了Kustomize的资源合并、补丁应用和变量替换机制,并提供了基于Kustomize的多环境配置管理最佳实践。 + +## 项目结构 + +kami_backend项目的Kustomize配置管理结构采用标准的基线(base)和覆盖(overlays)模式,这种分层架构使得配置管理更加清晰和可维护。 + +```mermaid +graph TB +subgraph "Kustomize配置结构" +Base[base目录] +Overlays[overlays目录] +Base --> |包含| KustomizationBase[kustomization.yaml] +Base --> |包含| DeploymentBase[deployment.yaml] +Base --> |包含| ServiceBase[service.yaml] +Overlays --> |包含| Develop[develop目录] +Develop --> |包含| KustomizationDev[kustomization.yaml] +Develop --> |包含| ConfigMapDev[configmap.yaml] +Develop --> |包含| DeploymentDev[deployment.yaml] +KustomizationDev --> |继承| Base +KustomizationDev --> |添加| ConfigMapDev +KustomizationDev --> |应用补丁| DeploymentDev +end +``` + +**Diagram sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) + +**Section sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) + +## 基础配置分析 + +基础配置文件位于`manifest/deploy/kustomize/base/`目录下,包含了应用程序部署所需的核心Kubernetes资源定义。这些配置文件作为所有环境的基线,定义了应用程序的基本结构和通用设置。 + +### kustomization.yaml基础配置 + +基础kustomization.yaml文件定义了应用程序的基本资源组成,通过resources字段指定了需要部署的核心Kubernetes资源。 + +**Section sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) + +### deployment.yaml基础配置 + +基础deployment.yaml文件定义了应用程序的部署配置,包括副本数量、容器镜像和标签选择器等核心属性。该配置为所有环境提供了统一的部署基础。 + +**Section sources** +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml) + +### service.yaml基础配置 + +基础service.yaml文件定义了应用程序的服务暴露配置,包括端口映射和选择器,确保应用程序可以通过网络访问。 + +**Section sources** +- [service.yaml](file://manifest/deploy/kustomize/base/service.yaml) + +## 开发环境配置分析 + +开发环境配置位于`manifest/deploy/kustomize/overlays/develop/`目录下,通过覆盖和补丁机制对基础配置进行环境特定的定制化。 + +### kustomization.yaml开发环境配置 + +开发环境的kustomization.yaml文件通过resources字段继承了基础配置,并添加了环境特定的ConfigMap资源。同时,通过patchesStrategicMerge字段应用了针对开发环境的部署补丁。 + +```mermaid +graph TD +A[开发环境kustomization.yaml] --> B[继承基础配置] +A --> C[添加ConfigMap资源] +A --> D[应用部署补丁] +A --> E[设置命名空间] +``` + +**Diagram sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) + +**Section sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) + +### configmap.yaml开发环境配置 + +开发环境的configmap.yaml文件定义了应用程序的配置映射,包含了服务器地址、OpenAPI路径、Swagger路径以及日志级别等开发环境特定的配置参数。 + +**Section sources** +- [configmap.yaml](file://manifest/deploy/kustomize/overlays/develop/configmap.yaml) + +### deployment.yaml开发环境补丁 + +开发环境的deployment.yaml文件作为补丁文件,专门用于修改基础部署配置中的容器镜像标签,将其设置为"develop"版本,以支持开发环境的持续集成和部署需求。 + +**Section sources** +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml) + +## Kustomize工作机制 + +Kustomize通过声明式配置管理Kubernetes资源,其核心工作机制包括资源合并、补丁应用和变量替换等。 + +### 资源合并机制 + +Kustomize的资源合并机制允许将多个YAML文件中的资源定义合并为一个完整的部署配置。在kami_backend项目中,基础配置和开发环境配置通过资源合并实现了配置的分层管理。 + +```mermaid +graph LR +Base[基础资源] --> |合并| Overlay[覆盖资源] +Overlay --> |生成| Final[最终部署配置] +``` + +**Diagram sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) + +### 补丁应用机制 + +Kustomize的补丁应用机制允许对现有资源进行增量修改,而无需复制整个资源定义。在kami_backend项目中,开发环境通过patchesStrategicMerge字段应用了针对部署配置的补丁。 + +```mermaid +sequenceDiagram +participant Kustomize as Kustomize工具 +participant Base as 基础Deployment +participant Patch as 补丁文件 +participant Result as 最终Deployment +Kustomize->>Base : 加载基础Deployment配置 +Kustomize->>Patch : 加载补丁文件 +Kustomize->>Kustomize : 应用补丁到基础配置 +Kustomize->>Result : 生成最终Deployment配置 +``` + +**Diagram sources** +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml) +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml) + +### 变量替换机制 + +虽然当前配置中未直接使用变量替换,但Kustomize支持通过configMapGenerator和secretGenerator等特性实现配置参数的动态替换,为多环境配置管理提供了灵活性。 + +## 多环境配置管理 + +基于Kustomize的多环境配置管理通过基线和覆盖模式实现,为不同环境提供定制化的部署配置。 + +### 环境分层架构 + +kami_backend项目的多环境配置管理采用分层架构,基础层提供通用配置,各环境覆盖层提供环境特定的定制化配置。 + +```mermaid +graph TD +Base[基础配置] --> |被继承| Dev[开发环境] +Base --> |被继承| Test[测试环境] +Base --> |被继承| Prod[生产环境] +Dev --> |添加| DevConfig[开发配置] +Test --> |添加| TestConfig[测试配置] +Prod --> |添加| ProdConfig[生产配置] +``` + +### 环境特定配置策略 + +不同环境的配置策略应根据环境特性进行定制: +- 开发环境:启用详细日志,使用开发镜像标签 +- 测试环境:配置测试专用参数,启用监控 +- 生产环境:优化性能配置,启用安全设置 + +## 最佳实践 + +### 配置分层原则 + +遵循配置分层原则,将配置分为基础层和环境覆盖层,确保配置的可维护性和一致性。 + +### 补丁最小化原则 + +应用补丁时遵循最小化原则,只修改必要的配置项,避免复制整个资源定义。 + +### 命名空间管理 + +通过kustomization.yaml中的namespace字段明确指定部署命名空间,确保资源在正确的命名空间中创建。 + +### 配置复用 + +通过ConfigMap和Secret等资源实现配置的复用,避免在多个地方重复定义相同的配置参数。 + +## 集成方案 + +### 与CI/CD集成 + +将Kustomize配置集成到CI/CD流水线中,通过自动化构建和部署流程确保配置的一致性和可靠性。 + +### 与配置中心集成 + +考虑将Kustomize与集中式配置中心集成,实现配置的统一管理和动态更新。 + +### 与监控系统集成 + +通过ConfigMap注入监控相关的配置参数,实现与监控系统的无缝集成。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/Docker Compose编排.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/Docker Compose编排.md new file mode 100644 index 00000000..cbacc7d6 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/Docker Compose编排.md @@ -0,0 +1,167 @@ +# Docker Compose编排 + + +**本文档引用文件** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [install.sh](file://manifest/docker/install.sh) +- [install-test.sh](file://manifest/docker/install-test.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [config.yaml](file://manifest/config/config.yaml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档深入分析kami_backend项目的Docker Compose编排配置,涵盖服务定义、依赖关系、网络配置、卷挂载、环境变量注入等核心内容。文档详细对比了生产环境与本地开发环境的配置差异,解析自动化部署脚本的工作机制,并提供多环境部署策略。 + +## 项目结构 +kami_backend项目的Docker相关配置集中存放在`manifest/docker`目录下,包含主服务编排文件、构建脚本和配置模板。 + +```mermaid +graph TD +A[manifest/docker] --> B[docker-compose.yml] +A --> C[docker-compose-local.yaml] +A --> D[Dockerfile] +A --> E[install.sh] +A --> F[install-test.sh] +A --> G[wait-for-it.sh] +``` + +**图示来源** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L17) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L18) + +**本节来源** +- [manifest/docker](file://manifest/docker) + +## 核心组件 +kami_backend的Docker Compose配置包含主服务、数据库和缓存等核心组件。主服务通过Docker镜像部署,配置了端口映射、卷挂载和网络连接。系统依赖MySQL数据库和Redis缓存,相关连接信息在配置文件中定义。 + +**本节来源** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L17) +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +## 架构概述 +kami_backend采用微服务架构,通过Docker Compose进行服务编排。主服务与外部数据库和缓存服务协同工作,形成完整的应用生态系统。 + +```mermaid +graph LR +subgraph "应用层" +A[kami_backend服务] +end +subgraph "数据层" +B[MySQL数据库] +C[Redis缓存] +end +A --> B +A --> C +``` + +**图示来源** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L17) +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +## 详细组件分析 + +### 主服务配置分析 +kami_backend主服务配置定义了镜像来源、容器名称、重启策略、端口映射、卷挂载和网络配置。 + +#### 服务定义 +```mermaid +classDiagram +class KamiBackendService { ++string image ++string container_name ++string restart ++list ports ++list volumes ++list networks ++map labels +} +``` + +**图示来源** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L2-L12) + +### 配置文件分析 +系统配置文件定义了数据库连接、Redis配置、服务参数等关键信息。 + +#### 数据库配置 +| 配置项 | v1数据库 | default数据库 | +|--------|---------|-------------| +| **连接字符串** | mysql:root:Woaizixkie!123@tcp(127.0.0.1:3306)/kami | mysql:root:123456@tcp(127.0.0.1:3306)/kami_v2 | +| **最大连接数** | 1000 | 10 | +| **字符集** | utf8mb4 | utf8mb4 | +| **调试模式** | true | true | + +**本节来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +### 环境差异分析 +生产环境与本地开发环境的Docker Compose配置存在显著差异。 + +#### 配置对比 +```mermaid +graph TD +A[配置差异] --> B[镜像来源] +A --> C[构建方式] +A --> D[端口映射] +A --> E[容器名称] +B --> F[生产: 远程镜像] +B --> G[本地: 本地构建] +C --> H[生产: 直接使用镜像] +C --> I[本地: 从Dockerfile构建] +D --> J[生产: 22401→12401] +D --> K[本地: 12401→12401] +E --> L[生产: 带版本号] +E --> M[本地: 简单名称] +``` + +**图示来源** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L17) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L18) + +## 依赖分析 +kami_backend服务依赖于外部的MySQL和Redis服务,通过配置文件中的连接信息建立通信。 + +```mermaid +graph TD +A[kami_backend] --> B[MySQL] +A --> C[Redis] +B --> D[数据持久化] +C --> E[缓存加速] +``` + +**图示来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L17) + +**本节来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) +- [utility/config/database.go](file://utility/config/database.go#L1-L9) +- [utility/cache/cache.go](file://utility/cache/cache.go#L41-L86) + +## 性能考虑 +系统在数据库连接池和Redis连接配置方面进行了优化,确保高并发场景下的稳定性能。v1数据库配置了1000的最大连接数,适应高负载需求,而default数据库保持较低的连接数,适用于常规操作。 + +## 故障排除指南 +部署过程中可能遇到网络连接、配置文件挂载、服务启动顺序等问题。wait-for-it.sh脚本可用于确保服务依赖的正确启动顺序。 + +**本节来源** +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L18) +- [install.sh](file://manifest/docker/install.sh#L1-L143) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L117) + +## 结论 +kami_backend的Docker Compose编排设计合理,支持多环境部署,通过自动化脚本简化了部署流程。配置文件分离了环境特定参数,提高了系统的可维护性和可扩展性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/主服务配置.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/主服务配置.md new file mode 100644 index 00000000..24520b10 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/主服务配置.md @@ -0,0 +1,133 @@ +# 主服务配置 + + +**本文档引用文件** +- [docker-compose.yml](file://docker-compose.yml) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [manifest/docker/docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile) +- [manifest/config/config.yaml](file://manifest/config/config.yaml) +- [main.go](file://main.go) +- [utility/otel/config.go](file://utility/otel/config.go) +- [utility/otel/manager.go](file://utility/otel/manager.go) + + +## 目录 +1. [简介](#简介) +2. [Docker Compose配置分析](#docker-compose配置分析) +3. [环境差异配置](#环境差异配置) +4. [运维相关设置](#运维相关设置) +5. [环境变量注入最佳实践](#环境变量注入最佳实践) +6. [扩展配置定制化部署](#扩展配置定制化部署) + +## 简介 +本文档详细分析kami_backend主服务的Docker Compose配置,涵盖开发与生产环境的配置差异、运维设置、环境变量注入最佳实践以及扩展配置的定制化部署方案。 + +## Docker Compose配置分析 + +### 基本配置项 +kami_backend服务在Docker Compose中的配置包含以下关键项: + +- **image**: 指定服务使用的镜像。在生产环境中使用预构建镜像`git.kkknametrans.buzz/danial/kami_backend_$BRANCH:$VERSION`,在CI/CD环境中使用`docker.kkknametrans.buzz/kami/backend:${DRONE_BRANCH}${DRONE_BUILD_NUMBER}`。 +- **container_name**: 容器名称,根据环境变量动态生成,如`kami-backend-$BRANCH-$VERSION`。 +- **ports**: 端口映射,将主机的22401端口映射到容器的12401端口。 +- **volumes**: 卷挂载,将日志和配置文件目录挂载到容器中,确保数据持久化。 +- **restart**: 重启策略,设置为`always`,确保容器在任何情况下都会自动重启。 +- **environment**: 环境变量,包括`serverName`、`gatewayAddr`、`shopAddr`、`portalAddr`等。 + +**Section sources** +- [docker-compose.yml](file://docker-compose.yml#L20-L47) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L2-L17) + +## 环境差异配置 + +### 开发环境配置 +开发环境使用本地构建的镜像,通过`docker-compose-local.yaml`文件定义: + +- **build**: 使用本地上下文构建镜像,指定Dockerfile路径和构建参数。 +- **image**: 构建后的镜像名称为`kami_backend:latest`。 +- **ports**: 直接映射到12401端口,便于本地调试。 + +### 生产环境配置 +生产环境使用预构建的镜像,通过`docker-compose.yml`文件定义: + +- **image**: 使用远程仓库的预构建镜像,版本由环境变量控制。 +- **container_name**: 容器名称包含分支和版本信息,便于追踪。 +- **volumes**: 挂载外部存储路径,确保日志和配置文件的持久化。 + +**Section sources** +- [manifest/docker/docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L2-L18) +- [docker-compose.yml](file://docker-compose.yml#L20-L47) + +## 运维相关设置 + +### 健康检查 +在Dockerfile中定义了健康检查命令: +```dockerfile +HEALTHCHECK --interval=60s --timeout=3s --retries=3 CMD curl -f http://127.0.0.1:12401/api/monitor/heathcheck || exit 1 +``` +该配置每60秒检查一次服务健康状态,超时时间为3秒,重试3次。 + +### 重启策略 +重启策略设置为`always`,确保服务在任何情况下都能自动恢复。 + +### 日志驱动 +日志配置在`config.yaml`中定义: +- **logPath**: 日志文件存储路径。 +- **logStdout**: 是否输出到终端。 +- **errorLogEnabled**: 是否记录错误日志。 +- **accessLogEnabled**: 是否记录访问日志。 + +**Section sources** +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile#L38-L40) +- [manifest/config/config.yaml](file://manifest/config/config.yaml#L4-L15) + +## 环境变量注入最佳实践 + +### 数据库连接 +数据库连接信息通过`config.yaml`文件配置: +```yaml +database: + default: + link: "mysql:root:123456@tcp(127.0.0.1:3306)/kami_v2?charset=utf8mb4&parseTime=true&loc=Local" +``` + +### Redis配置 +Redis配置在`config.yaml`中定义: +```yaml +redis: + default: + address: 127.0.0.1:6379 + db: 4 +``` + +### OpenTelemetry设置 +OpenTelemetry配置在`main.go`中初始化: +```go +config := otel.DefaultConfig() +config.ServiceName = serviceName +config.CollectorURL = collectorURL +config.Insecure = true +config.Headers = map[string]string{ + "x-service-token": "your-token-here", +} +``` + +**Section sources** +- [manifest/config/config.yaml](file://manifest/config/config.yaml#L27-L57) +- [main.go](file://main.go#L25-L38) + +## 扩展配置定制化部署 + +### 自定义网络 +所有服务都连接到外部网络`1panel-network`,确保服务间的通信。 + +### 配置文件挂载 +通过volumes挂载配置文件和日志目录,实现配置的外部化管理。 + +### 环境变量管理 +使用环境变量控制服务行为,如`serverName`、`gatewayAddr`等,便于不同环境的部署。 + +**Section sources** +- [docker-compose.yml](file://docker-compose.yml#L20-L47) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L2-L17) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/数据库配置.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/数据库配置.md new file mode 100644 index 00000000..62a53fd7 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/数据库配置.md @@ -0,0 +1,214 @@ +# 数据库配置 + + +**本文档中引用的文件** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [database.go](file://utility/config/database.go) +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [v_1_schema_migrations.go](file://internal/dao/internal/v_1_schema_migrations.go) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细说明了kami_backend项目中MySQL数据库服务的Docker Compose配置。文档深入分析了数据库镜像版本选择、root密码、数据库名称、端口映射和数据卷持久化配置。同时解释了数据库初始化脚本的执行机制,包括字符集和排序规则的设置。文档还阐述了数据库与kami_backend应用服务之间的连接配置,以及如何通过环境变量传递数据库连接信息。此外,提供了数据库备份和恢复的Docker Compose集成方案,以及性能调优建议。 + +## 项目结构 +项目结构中包含多个服务组件,其中kami_backend是核心后端服务。数据库配置主要位于`manifest/config/`目录下的`config.yaml`文件中,而Docker Compose配置则位于根目录和`manifest/docker/`目录下的`docker-compose.yml`文件中。数据库相关的DAO(数据访问对象)代码位于`internal/dao/`目录下,遵循GoFrame框架的代码生成模式。 + +```mermaid +graph TD +A[项目根目录] --> B[docker-compose.yml] +A --> C[manifest/] +C --> D[config/] +D --> E[config.yaml] +C --> F[docker/] +F --> G[docker-compose.yml] +A --> H[internal/] +H --> I[dao/] +I --> J[internal/] +J --> K[v_1_migrations.go] +J --> L[v_1_schema_migrations.go] +A --> M[utility/] +M --> N[config/] +N --> O[database.go] +``` + +**图示来源** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [v_1_schema_migrations.go](file://internal/dao/internal/v_1_schema_migrations.go) +- [database.go](file://utility/config/database.go) + +**节来源** +- [docker-compose.yml](file://docker-compose.yml) +- [manifest/config/config.yaml](file://manifest/config/config.yaml) + +## 核心组件 +核心数据库组件包括MySQL服务配置、数据库连接管理、数据迁移机制和健康检查脚本。`config.yaml`文件定义了数据库连接参数,包括两个数据库实例(default和v1)的连接字符串。`database.go`提供了获取数据库连接的接口。数据迁移通过`v_1_migrations.go`和`v_1_schema_migrations.go`中的DAO对象管理。`wait-for-it.sh`脚本确保应用在数据库可用后才启动。 + +**节来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) +- [database.go](file://utility/config/database.go#L0-L9) +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [v_1_schema_migrations.go](file://internal/dao/internal/v_1_schema_migrations.go) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 架构概述 +系统采用微服务架构,kami_backend服务通过Docker Compose与MySQL数据库集成。应用服务通过配置文件中的连接字符串连接到数据库,使用GoFrame框架的数据库抽象层进行数据访问。数据持久化通过Docker卷实现,确保数据在容器重启后不丢失。健康检查机制确保应用在数据库就绪后才开始处理请求。 + +```mermaid +graph LR +A[kami_backend应用] --> |连接| B[MySQL数据库] +B --> C[数据卷持久化] +A --> D[配置文件config.yaml] +D --> E[数据库连接参数] +A --> F[wait-for-it.sh] +F --> |健康检查| B +G[Docker Compose] --> A +G --> B +``` + +**图示来源** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 详细组件分析 + +### MySQL服务配置分析 +MySQL服务配置通过环境变量和配置文件双重管理。数据库连接信息在`config.yaml`中明确定义,包括主机地址、端口、用户名、密码、数据库名称和连接参数。 + +#### 数据库连接配置 +```mermaid +classDiagram +class DatabaseConfig { ++string default.link ++bool default.debug ++string default.charset ++int default.maxIdle ++int default.maxOpen ++string default.maxLifetime ++string v1.link ++bool v1.debug ++string v1.charset ++int v1.maxIdle ++int v1.maxOpen ++string v1.maxLifetime +} +class ConnectionPool { ++int maxIdle ++int maxOpen ++string maxLifetime ++getConnection() ++releaseConnection() +} +DatabaseConfig --> ConnectionPool : "配置" +``` + +**图示来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +#### 数据库初始化机制 +```mermaid +sequenceDiagram +participant Docker as Docker引擎 +participant MySQL as MySQL容器 +participant App as kami_backend应用 +participant Script as wait-for-it.sh +Docker->>MySQL : 启动容器 +MySQL->>MySQL : 初始化数据库 +Docker->>App : 启动应用容器 +App->>Script : 执行wait-for-it.sh +Script->>MySQL : 检查3306端口 +MySQL-->>Script : 端口开放 +Script-->>App : 数据库可用 +App->>MySQL : 建立连接 +App->>MySQL : 执行数据迁移 +``` + +**图示来源** +- [docker-compose.yml](file://docker-compose.yml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) + +#### 数据迁移管理 +```mermaid +flowchart TD +A[启动应用] --> B{数据库连接} +B --> |成功| C[检查migrations表] +C --> D{有未应用的迁移?} +D --> |是| E[执行迁移脚本] +E --> F[更新migrations表状态] +F --> G[应用启动完成] +D --> |否| G +B --> |失败| H[重试或退出] +H --> I[等待数据库就绪] +I --> B +``` + +**图示来源** +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [v_1_schema_migrations.go](file://internal/dao/internal/v_1_schema_migrations.go) +- [database.go](file://utility/config/database.go) + +**节来源** +- [v_1_migrations.go](file://internal/dao/internal/v_1_migrations.go) +- [v_1_schema_migrations.go](file://internal/dao/internal/v_1_schema_migrations.go) +- [database.go](file://utility/config/database.go) + +### 概念概述 +系统采用GoFrame框架进行数据库操作,遵循DAO(数据访问对象)模式。数据库连接通过连接池管理,提高性能和资源利用率。数据迁移使用基于时间戳的版本控制,确保数据库模式变更的可追溯性和一致性。字符集统一设置为utf8mb4,支持完整的Unicode字符集,包括表情符号。 + +## 依赖分析 +kami_backend服务依赖于MySQL数据库服务,通过Docker Compose的网络配置进行通信。应用通过`1panel-network`外部网络与数据库交互。数据库连接依赖于正确的连接字符串配置,包括主机、端口、用户名、密码和数据库名称。数据迁移功能依赖于`migrations`和`schema_migrations`系统表的存在和正确结构。 + +```mermaid +graph TD +A[kami_backend] --> B[MySQL] +A --> C[Redis] +B --> D[数据卷] +A --> E[配置文件] +E --> F[数据库连接参数] +A --> G[wait-for-it.sh] +G --> B +H[Docker Compose] --> A +H --> B +H --> I[其他微服务] +``` + +**图示来源** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +**节来源** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 性能考虑 +数据库连接池配置对系统性能有重要影响。`v1`数据库的`maxOpen`设置为1000,而`default`数据库的`maxOpen`设置为10,这表明`v1`数据库预期有更高的并发访问。`maxLifetime`设置为30秒,确保连接不会长时间保持,避免数据库服务器资源耗尽。字符集设置为utf8mb4而非utf8,虽然占用更多存储空间,但支持更完整的字符集,避免数据截断问题。 + +## 故障排除指南 +当遇到数据库连接问题时,首先检查`config.yaml`中的连接字符串是否正确,特别是密码和数据库名称。确认MySQL容器是否正常运行,可以通过`docker ps`命令查看。使用`wait-for-it.sh`脚本确保应用在数据库就绪后才启动。检查数据卷挂载是否正确,确保数据持久化配置无误。查看应用日志中的数据库错误信息,定位具体问题。 + +**节来源** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [database.go](file://utility/config/database.go) + +## 结论 +本文档全面分析了kami_backend项目中MySQL数据库的Docker Compose配置。通过详细的配置分析、架构说明和组件解析,为数据库的部署、维护和优化提供了完整的指导。配置中体现了微服务架构的最佳实践,包括配置分离、健康检查、数据持久化和连接池管理。建议在生产环境中进一步加强数据库安全配置,如使用更复杂的密码策略和网络访问控制。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/缓存配置.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/缓存配置.md new file mode 100644 index 00000000..3392e228 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/缓存配置.md @@ -0,0 +1,262 @@ +# 缓存配置 + + +**Referenced Files in This Document** +- [docker-compose.yml](file://docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) +- [cache.go](file://utility/cache/cache.go) +- [redis.go](file://utility/limiter/redis.go) +- [cache.go](file://internal/consts/cache.go) + + +## 目录 +1. [Docker Compose Redis服务配置](#docker-compose-redis服务配置) +2. [Redis在kami_backend中的使用场景](#redis在kami_backend中的使用场景) +3. [Redis配置优化建议](#redis配置优化建议) +4. [Redis集群模式部署方案](#redis集群模式部署方案) +5. [监控和维护最佳实践](#监控和维护最佳实践) + +## Docker Compose Redis服务配置 + +在当前项目中,Redis服务并未直接定义在`docker-compose.yml`文件中。项目主要通过外部配置文件`manifest/config/config.yaml`来配置Redis连接参数。Redis作为外部依赖服务运行,kami_backend应用通过配置文件中的参数连接到Redis实例。 + +Redis配置包含以下关键参数: +- **地址**: `127.0.0.1:6379` - Redis服务器的IP地址和端口 +- **数据库**: `db: 4` - 使用Redis的第4个数据库实例 +- **连接超时**: `dialTimeout: "30s"` - TCP连接超时时间为30秒 +- **读取超时**: `readTimeout: "30s"` - 读操作超时时间为30秒 +- **写入超时**: `writeTimeout: "30s"` - 写操作超时时间为30秒 +- **空闲超时**: `idleTimeout: "60s"` - 连接最大空闲时间为60秒 +- **最大连接生命周期**: `maxConnLifetime: "90s"` - 连接最长存活时间为90秒 +- **等待超时**: `waitTimeout: "60s"` - 等待连接池连接的超时时间为60秒 +- **最大活跃连接数**: `maxActive: 100` - 连接池最大活跃连接数为100 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +## Redis在kami_backend中的使用场景 + +Redis在kami_backend中扮演着关键角色,主要用于多种缓存和限流场景。通过分析代码实现,Redis的主要使用场景包括: + +### 会话存储 +Redis被用作分布式会话存储,通过`token`配置中的`cacheModel: "redis"`设置,系统将用户会话信息存储在Redis中,支持多实例间的会话共享。这种设计确保了在负载均衡环境下用户会话的一致性。 + +### 限流器 +系统实现了基于Redis的限流机制,通过`utility/limiter/redis.go`中的`SimpleKeyLimiter`结构体实现。该限流器利用Redis的键值存储特性,通过计算特定前缀的键数量来实现请求频率控制。当请求次数超过预设阈值时,系统将拒绝后续请求,有效防止服务过载。 + +### 缓存数据 +Redis被广泛用于各种业务数据的缓存,包括: +- **追踪信息缓存**: 通过`PrefixTrace`前缀存储分布式追踪的Span上下文,实现跨服务调用的追踪能力恢复 +- **账户状态缓存**: 缓存苹果账户、京东账户等第三方账户的临时状态信息 +- **查询结果缓存**: 缓存频繁查询的账户余额、订单状态等信息,减少对后端服务的直接调用 +- **字典数据缓存**: 缓存系统配置、参数字典等静态数据,提高访问效率 + +**Section sources** +- [cache.go](file://utility/cache/cache.go#L0-L126) +- [redis.go](file://utility/limiter/redis.go#L0-L44) +- [cache.go](file://internal/consts/cache.go#L0-L14) + +## Redis配置优化建议 + +基于当前系统的使用场景和性能需求,提出以下Redis配置优化建议: + +### 最大内存设置 +建议明确设置Redis的最大内存限制,防止内存无限增长导致系统不稳定。根据当前业务规模,建议设置: +```yaml +maxmemory: 2gb +``` +此设置可确保Redis在内存使用达到2GB时触发淘汰策略,避免影响宿主机其他服务。 + +### 淘汰策略 +针对不同的数据类型,建议采用合适的淘汰策略: +- **会话数据**: 使用`allkeys-lru`策略,优先淘汰最近最少使用的会话 +- **临时状态数据**: 使用`volatile-ttl`策略,优先淘汰剩余生存时间最短的数据 +- **缓存数据**: 使用`allkeys-random`策略,随机淘汰数据 + +推荐配置: +```yaml +maxmemory-policy allkeys-lru +``` + +### 持久化模式选择 +根据业务对数据持久化的需求,建议采用以下配置: + +#### 开发环境 +使用RDB快照模式,每15分钟保存一次快照,平衡性能和数据安全: +```yaml +save 900 1 +save 300 10 +save 60 10000 +``` + +#### 生产环境 +建议同时启用RDB和AOF两种持久化方式: +- RDB提供定期快照,用于快速恢复 +- AOF提供每秒同步,确保数据丢失最小化 + +AOF配置建议: +```yaml +appendonly yes +appendfsync everysec +no-appendfsync-on-rewrite yes +auto-aof-rewrite-percentage 100 +auto-aof-rewrite-min-size 64mb +``` + +### 连接池优化 +当前配置中`maxActive: 100`可能过高,建议根据实际并发量调整: +- **低并发场景**: 设置为50-80 +- **高并发场景**: 可保持100或适当增加 +- 同时设置`maxIdle: 20`以保持一定数量的空闲连接 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +## Redis集群模式部署方案 + +虽然当前配置使用单实例Redis,但为支持高可用和水平扩展,建议采用Redis集群模式部署: + +### 集群架构 +```mermaid +graph TB +subgraph "Redis Cluster" +Master1[Redis Master 1] +Slave1[Redis Slave 1] +Master2[Redis Master 2] +Slave2[Redis Slave 2] +Master3[Redis Master 3] +Slave3[Redis Slave 3] +end +kami_backend --> Master1 +kami_backend --> Master2 +kami_backend --> Master3 +Master1 --> Slave1 +Master2 --> Slave2 +Master3 --> Slave3 +style Master1 fill:#f9f,stroke:#333 +style Master2 fill:#f9f,stroke:#333 +style Master3 fill:#f9f,stroke:#333 +``` + +**Diagram sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +### Docker Compose配置 +```yaml +version: '3.8' +services: + redis-node-1: + image: redis:7-alpine + command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes + volumes: + - redis-data-1:/data + ports: + - "6379:6379" + - "16379:16379" + networks: + - redis-network + + redis-node-2: + image: redis:7-alpine + command: redis-server --port 6380 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes + volumes: + - redis-data-2:/data + ports: + - "6380:6380" + - "16380:16380" + networks: + - redis-network + + redis-node-3: + image: redis:7-alpine + command: redis-server --port 6381 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes + volumes: + - redis-data-3:/data + ports: + - "6381:6381" + - "16381:16381" + networks: + - redis-network + + redis-trib: + image: redis:7-alpine + depends_on: + - redis-node-1 + - redis-node-2 + - redis-node-3 + command: > + sh -c " + sleep 10 && + redis-cli --cluster create + redis-node-1:6379 redis-node-2:6380 redis-node-3:6381 + --cluster-replicas 1 + " + networks: + - redis-network + +volumes: + redis-data-1: + redis-data-2: + redis-data-3: + +networks: + redis-network: + driver: bridge +``` + +### 配置说明 +1. **三主三从架构**: 3个主节点负责数据读写,3个从节点提供数据冗余和故障转移 +2. **数据分片**: 使用Redis Cluster的哈希槽机制,将16384个哈希槽均匀分配到3个主节点 +3. **高可用**: 每个主节点配置一个从节点,当主节点故障时自动选举从节点为主 +4. **持久化**: 启用AOF持久化,每秒同步一次,确保数据安全 +5. **网络配置**: 暴露数据端口和集群总线端口,支持节点间通信 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +## 监控和维护最佳实践 + +### 监控指标 +建立全面的Redis监控体系,重点关注以下指标: + +```mermaid +flowchart TD +A[Redis监控指标] --> B[内存使用] +A --> C[连接数] +A --> D[命中率] +A --> E[延迟] +A --> F[持久化] +B --> B1["used_memory: 实际使用内存"] +B --> B2["used_memory_rss: 操作系统分配内存"] +B --> B3["mem_fragmentation_ratio: 内存碎片率"] +C --> C1["connected_clients: 客户端连接数"] +C --> C2["blocked_clients: 阻塞客户端数"] +D --> D1["keyspace_hits: 命中次数"] +D --> D2["keyspace_misses: 未命中次数"] +D --> D3["hit_rate: 命中率"] +E --> E1["latency: 命令执行延迟"] +E --> E2["rdb_last_bgsave_time_sec: RDB保存耗时"] +F --> F1["aof_enabled: AOF是否启用"] +F --> F2["aof_rewrite_in_progress: AOF重写状态"] +``` + +**Diagram sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) + +### 维护策略 +1. **定期备份**: 每日执行RDB快照备份,并将备份文件存储到安全位置 +2. **内存优化**: 定期分析大键,使用`SCAN`命令替代`KEYS`,避免阻塞 +3. **连接管理**: 设置合理的`timeout`参数,及时清理空闲连接 +4. **版本升级**: 定期升级Redis版本,获取性能改进和安全补丁 +5. **容量规划**: 监控内存增长趋势,提前规划容量扩展 + +### 告警设置 +配置关键告警规则: +- 内存使用率超过80% +- 命中率低于90% +- 平均延迟超过10ms +- 主从复制延迟超过10秒 +- 连接数接近最大限制 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L27-L57) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/部署自动化.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/部署自动化.md new file mode 100644 index 00000000..c523e189 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Docker Compose编排/部署自动化.md @@ -0,0 +1,269 @@ +# 部署自动化 + + +**本文档引用的文件** +- [install.sh](file://manifest/docker/install.sh) +- [install-test.sh](file://manifest/docker/install-test.sh) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档深入分析了Kami项目中的部署自动化脚本,包括install.sh、install-test.sh和install-one.sh。这些脚本为Kami后端系统提供了一套完整的Docker Compose部署解决方案,支持完整部署、测试环境部署和单节点部署等多种场景。文档详细解释了脚本的功能、执行流程、参数说明、错误处理机制和日志输出格式,并提供了扩展这些脚本以支持自定义部署需求的方法。 + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) + +## 项目结构 +Kami后端项目的部署脚本位于manifest/docker目录下,与Docker相关配置文件共同构成了完整的部署体系。该目录包含多个安装脚本和Docker Compose配置文件,形成了分层的部署架构。 + +```mermaid +graph TD +A[manifest/docker] --> B[install.sh] +A --> C[install-test.sh] +A --> D[install-one.sh] +A --> E[install-simple.sh] +A --> F[docker-compose.yml] +A --> G[docker-compose-test.yml] +A --> H[docker-compose-local.yaml] +A --> I[wait-for-it.sh] +A --> J[Dockerfile] +B --> K[完整部署] +C --> L[测试部署] +D --> M[单节点部署] +E --> N[简化部署] +F --> O[生产环境配置] +G --> P[测试环境配置] +H --> Q[本地开发配置] +``` + +**Diagram sources ** +- [manifest/docker](file://manifest/docker) + +**Section sources** +- [manifest/docker](file://manifest/docker) + +## 核心组件 +部署自动化系统由三个主要脚本构成:install.sh用于完整部署,install-test.sh用于测试环境部署,install-one.sh用于单节点部署。这些脚本通过统一的逻辑框架实现了不同的部署策略,包括前置条件检查、环境准备、服务启动和状态验证等关键功能。 + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) + +## 架构概述 +部署自动化脚本采用模块化设计,通过参数化配置支持多种部署场景。脚本首先进行用户交互式选择或命令行参数解析,然后执行一系列标准化的部署步骤,包括代码拉取、容器管理、服务构建和启动、状态验证等。 + +```mermaid +graph TD +A[开始] --> B[选择应用] +B --> C{应用选择验证} +C --> |有效| D[克隆代码库] +C --> |无效| E[退出] +D --> F[进入代码目录] +F --> G[切换到master分支] +G --> H[拉取最新代码] +H --> I[停止并删除现有容器] +I --> J[停止所有其他容器] +J --> K[构建并启动Docker容器] +K --> L[启动所有容器] +L --> M[等待10秒] +M --> N[重启kami_前缀容器] +N --> O[删除本地代码] +O --> P[删除悬空镜像] +P --> Q[自我删除] +Q --> R[结束] +``` + +**Diagram sources ** +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +## 详细组件分析 + +### 完整部署脚本分析 +install.sh脚本提供了完整的部署流程,适用于生产环境的全面部署。该脚本通过交互式菜单让用户选择要部署的应用,然后执行完整的部署周期。 + +```mermaid +flowchart TD +Start([开始]) --> SelectApp["选择应用 (1-7)"] +SelectApp --> ValidateChoice{"选择有效?"} +ValidateChoice --> |否| ExitError["显示错误并退出"] +ValidateChoice --> |是| CheckRepo["检查本地仓库"] +CheckRepo --> |不存在| CloneRepo["克隆代码库"] +CheckRepo --> |存在| CdRepo["进入目录"] +CloneRepo --> CdRepo +CdRepo --> CheckoutMaster["切换到master分支"] +CheckoutMaster --> PullLatest["拉取最新代码"] +PullLatest --> StopContainer["停止并删除现有容器"] +StopContainer --> StopAll["停止所有其他容器"] +StopAll --> BuildStart["构建并启动容器"] +BuildStart --> StartAll["启动所有容器"] +StartAll --> Wait10s["等待10秒"] +Wait10s --> RestartKami["重启kami_前缀容器"] +RestartKami --> RemoveLocal["删除本地代码"] +RemoveLocal --> RemoveDangling["删除悬空镜像"] +RemoveDangling --> SelfDelete["自我删除"] +SelfDelete --> End([结束]) +``` + +**Diagram sources ** +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +### 测试部署脚本分析 +install-test.sh脚本专为测试环境设计,其流程与完整部署类似,但在某些步骤上有所简化,主要区别在于使用测试专用的Docker Compose配置文件。 + +```mermaid +flowchart TD +Start([开始]) --> SelectApp["选择应用 (1-7)"] +SelectApp --> ValidateChoice{"选择有效?"} +ValidateChoice --> |否| ExitError["显示错误并退出"] +ValidateChoice --> |是| CheckRepo["检查本地仓库"] +CheckRepo --> |不存在| CloneRepo["克隆代码库"] +CheckRepo --> |存在| CdRepo["进入目录"] +CloneRepo --> CdRepo +CdRepo --> CheckoutMaster["切换到master分支"] +CheckoutMaster --> PullLatest["拉取最新代码"] +PullLatest --> StopContainer["停止并删除现有容器"] +StopContainer --> BuildStart["构建并启动容器"] +BuildStart --> |非前端/后端| StopAll["停止所有容器"] +BuildStart --> |前端/后端| UseTestConfig["使用测试配置文件"] +UseTestConfig --> StartAll["启动所有容器"] +StartAll --> Wait10s["等待10秒"] +Wait10s --> RestartKami["重启kami_前缀容器"] +RestartKami --> End([结束]) +``` + +**Diagram sources ** +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) + +**Section sources** +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) + +### 单节点部署脚本分析 +install-one.sh脚本支持通过命令行参数进行非交互式部署,适用于自动化部署场景。该脚本使用getopts解析命令行参数,实现了更灵活的部署方式。 + +```mermaid +flowchart TD +Start([开始]) --> ParseArgs["解析命令行参数 (-c)"] +ParseArgs --> ValidateArg{"参数有效?"} +ValidateArg --> |否| ShowHelp["显示帮助并退出"] +ValidateArg --> |是| MatchRepo["匹配仓库名称"] +MatchRepo --> CheckRepo["检查本地仓库"] +CheckRepo --> |不存在| CloneRepo["克隆代码库"] +CheckRepo --> |存在| CdRepo["进入目录"] +CloneRepo --> CdRepo +CdRepo --> CheckoutMaster["切换到master分支"] +CheckoutMaster --> PullLatest["拉取最新代码"] +PullLatest --> StopContainer["停止并删除现有容器"] +StopContainer --> StopAll["停止所有其他容器"] +StopAll --> BuildStart["构建并启动容器"] +BuildStart --> StartAll["启动所有容器"] +StartAll --> Wait10s["等待10秒"] +Wait10s --> RestartKami["重启kami_前缀容器"] +RestartKami --> RemoveLocal["删除本地代码"] +RemoveLocal --> RemoveDangling["删除悬空镜像"] +RemoveDangling --> SelfDelete["自我删除"] +SelfDelete --> End([结束]) +``` + +**Diagram sources ** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) + +**Section sources** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) + +## 依赖分析 +部署脚本依赖于多个外部组件和配置文件,形成了复杂的依赖关系网络。这些依赖确保了部署过程的可靠性和一致性。 + +```mermaid +graph TD +A[install.sh] --> B[git] +A --> C[docker] +A --> D[docker-compose] +A --> E[kami_frontend] +A --> F[kami_backend] +A --> G[kami_boss] +A --> H[kami_merchant] +A --> I[kami_shop] +A --> J[kami_gateway] +A --> K[kami_agent] +A --> L[./manifest/docker/docker-compose.yml] +A --> M[./deploy/docker-compose.yml] +N[install-test.sh] --> B +N --> C +N --> D +N --> E +N --> F +N --> G +N --> H +N --> I +N --> J +N --> K +N --> O[./manifest/docker/docker-compose-test.yml] +N --> P[./deploy/docker-compose-test.yml] +Q[install-one.sh] --> B +Q --> C +Q --> D +Q --> E +Q --> F +Q --> G +Q --> H +Q --> I +Q --> J +Q --> K +Q --> L +Q --> M +R[wait-for-it.sh] --> S[nc (netcat)] +``` + +**Diagram sources ** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +## 性能考虑 +部署脚本在设计时考虑了性能优化,通过一系列机制确保部署过程的高效性。脚本通过停止所有其他容器来释放系统资源,确保新部署的服务能够获得足够的计算资源。同时,脚本在部署完成后删除本地代码和悬空镜像,有效管理磁盘空间。 + +部署过程中的等待机制(10秒暂停)为服务启动和初始化提供了充足的时间,避免了因服务未完全启动而导致的后续操作失败。此外,脚本通过重启kami_前缀的所有容器来确保服务状态的一致性,提高了部署的可靠性。 + +## 故障排除指南 +当部署脚本执行失败时,可以根据以下常见问题进行排查: + +1. **Git克隆失败**:检查网络连接和Git仓库地址的正确性,确保有权限访问指定的代码库。 +2. **Docker权限问题**:确保执行脚本的用户具有Docker操作权限,或者以root用户身份运行脚本。 +3. **端口冲突**:检查Docker Compose配置中定义的端口是否已被其他进程占用。 +4. **磁盘空间不足**:部署过程需要足够的磁盘空间来存储镜像和容器,确保系统有足够的可用空间。 +5. **依赖缺失**:确保系统已安装git、docker和docker-compose等必要工具。 + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) + +## 结论 +Kami项目的部署自动化脚本提供了一套完整、灵活且可靠的部署解决方案。通过install.sh、install-test.sh和install-one.sh三个脚本,项目支持了从完整部署到测试部署再到单节点部署的多种场景,满足了不同环境下的部署需求。脚本设计考虑了用户体验、错误处理和资源管理,通过标准化的流程确保了部署的一致性和可靠性。未来可以通过添加更多的配置选项和环境支持来进一步扩展这些脚本的功能。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/Dockerfile详解.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/Dockerfile详解.md new file mode 100644 index 00000000..23ace11c --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/Dockerfile详解.md @@ -0,0 +1,370 @@ +# Dockerfile详解 + + +**本文档引用文件** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [config.yaml](file://manifest/config/config.yaml) +- [main.go](file://main.go) +- [install.sh](file://manifest/docker/install.sh) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [多阶段构建策略](#多阶段构建策略) +4. [基础镜像选择](#基础镜像选择) +5. [编译阶段分析](#编译阶段分析) +6. [运行阶段分析](#运行阶段分析) +7. [环境变量与参数配置](#环境变量与参数配置) +8. [健康检查机制](#健康检查机制) +9. [端口暴露](#端口暴露) +10. [Docker Compose集成](#docker-compose集成) +11. [安全加固建议](#安全加固建议) +12. [性能优化技巧](#性能优化技巧) +13. [构建脚本分析](#构建脚本分析) +14. [最佳实践总结](#最佳实践总结) + +## 简介 +本文档详细解析kami_backend项目的Dockerfile配置,涵盖多阶段构建、镜像优化、安全配置和性能调优等关键方面。该Dockerfile采用Go语言后端服务的现代构建实践,通过分离构建与运行环境实现镜像最小化,同时确保服务的稳定性和可观测性。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [main.go](file://main.go) + +## 项目结构 +kami_backend项目采用典型的GoFrame框架结构,后端服务包含API接口、业务逻辑、数据访问层等模块。Docker相关文件集中存放在`manifest/docker/`目录下,包括Dockerfile、docker-compose配置和安装脚本。 + +```mermaid +graph TD +A[项目根目录] --> B[manifest/docker] +B --> C[Dockerfile] +B --> D[docker-compose.yml] +B --> E[docker-compose-local.yaml] +B --> F[install.sh] +A --> G[main.go] +A --> H[manifest/config] +H --> I[config.yaml] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [config.yaml](file://manifest/config/config.yaml) + +## 多阶段构建策略 +Dockerfile采用多阶段构建(Multi-stage Build)策略,分为`builder`和运行两个阶段,有效分离构建环境与运行环境。 + +### 构建阶段(builder) +```dockerfile +FROM golang:1.24-alpine AS builder +``` +此阶段使用`golang:1.24-alpine`作为基础镜像,包含完整的Go开发工具链,用于代码编译。构建完成后,仅将生成的二进制文件复制到最终镜像,避免将Go编译器等开发工具带入生产环境。 + +### 运行阶段 +```dockerfile +FROM alpine:latest +``` +运行阶段使用轻量级的`alpine:latest`镜像,仅包含运行应用程序所需的最小依赖,显著减小最终镜像体积。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L2) +- [Dockerfile](file://manifest/docker/Dockerfile#L14-L15) + +## 基础镜像选择 +### 构建镜像:golang:1.24-alpine +选择`golang:1.24-alpine`作为构建基础镜像具有以下优势: +- **版本稳定性**:使用Go 1.24长期支持版本,确保兼容性 +- **体积小巧**:Alpine Linux基础,镜像体积远小于debian系列 +- **安全性高**:Alpine采用musl libc和BusyBox,攻击面小 + +### 运行镜像:alpine:latest +运行时使用`alpine:latest`,原因包括: +- **极致轻量**:基础镜像仅约5MB +- **快速启动**:适合容器化微服务架构 +- **资源占用低**:减少生产环境资源消耗 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1) +- [Dockerfile](file://manifest/docker/Dockerfile#L14) + +## 编译阶段分析 +构建阶段包含代码复制、依赖管理和编译等关键步骤。 + +### 工作目录设置 +```dockerfile +WORKDIR /build +``` +设置`/build`作为工作目录,所有构建操作在此目录下进行,确保构建过程的可预测性和一致性。 + +### 代码复制 +```dockerfile +COPY ./ /build/ +``` +将项目根目录所有文件复制到容器的`/build`目录。此操作会复制.gitignore中未排除的所有文件。 + +### 依赖管理与编译 +```dockerfile +RUN export GOPROXY=https://goproxy.cn,direct && \ + export GO111MODULE=on GOOS=linux GOARCH=amd64 && \ + go mod tidy && go build -ldflags "-s -w" -o main main.go +``` +该命令序列执行以下操作: +1. **设置GOPROXY**:使用国内代理`https://goproxy.cn`加速模块下载 +2. **启用Go Modules**:`GO111MODULE=on`确保使用模块化依赖管理 +3. **交叉编译配置**:`GOOS=linux GOARCH=amd64`确保生成Linux AMD64架构的二进制文件 +4. **依赖清理**:`go mod tidy`清理未使用的依赖 +5. **优化编译**:`-ldflags "-s -w"`去除调试信息,减小二进制体积 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L3-L13) + +## 运行阶段分析 +运行阶段配置应用程序的运行环境和依赖。 + +### 工作目录设置 +```dockerfile +WORKDIR /app +``` +设置`/app`作为应用运行目录,符合容器化应用的最佳实践。 + +### 环境变量配置 +```dockerfile +ENV TZ=Asia/Shanghai +``` +设置时区为亚洲/上海,确保日志时间戳与中国标准时间一致。 + +### 文件复制 +```dockerfile +COPY --from=builder /build/main /app/ +COPY --from=builder /build/resource/public/ /app/resource/public/ +COPY --from=builder /build/manifest/config/ /app/manifest/config/ +``` +从构建阶段复制必要文件: +- 编译后的二进制文件`main` +- 静态资源文件`resource/public/` +- 配置文件`manifest/config/` + +### 镜像源与依赖安装 +```dockerfile +RUN echo "https://mirrors.aliyun.com/alpine/v3.18/main/" > /etc/apk/repositories && \ + echo "https://mirrors.aliyun.com/alpine/v3.18/community/" >> /etc/apk/repositories && \ + apk update && \ + apk upgrade && \ + apk add --no-cache tzdata && \ + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone +``` +配置国内镜像源并安装必要依赖: +- 使用阿里云Alpine镜像加速包管理 +- 安装`tzdata`确保时区数据完整 +- `--no-cache`避免缓存占用额外空间 + +### 工具安装 +```dockerfile +RUN apk add --no-cache curl && chmod +x /app/main +``` +安装`curl`用于健康检查,并为二进制文件添加执行权限。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L16-L35) + +## 环境变量与参数配置 +Dockerfile通过ARG和ENV指令配置环境参数。 + +### 构建参数 +```dockerfile +ARG USE_PROXY +``` +定义`USE_PROXY`构建参数,可在构建时通过`--build-arg`指定是否使用代理。 + +### 环境变量 +```dockerfile +ENV serverName="测试" +``` +设置`serverName`环境变量,默认值为"测试",该值会被main.go中的代码读取并用于服务标识。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L2) +- [Dockerfile](file://manifest/docker/Dockerfile#L18) +- [main.go](file://main.go#L10-L25) + +## 健康检查机制 +Dockerfile配置了健康检查,确保容器运行状态可监控。 + +```dockerfile +HEALTHCHECK --interval=60s --timeout=3s --retries=3 CMD curl -f http://127.0.0.1:12401/api/monitor/heathcheck || exit 1 +``` +健康检查配置说明: +- **检查间隔**:每60秒执行一次 +- **超时时间**:3秒内未响应视为失败 +- **重试次数**:连续3次失败后标记容器不健康 +- **检查命令**:通过curl访问健康检查接口 + +健康检查接口实现: +```go +// api/monitor/v1/heathcheck.go +type HealthCheckReq struct { + g.Meta `path:"/monitor/heathcheck" tags:"监控信息" method:"get" summary:"健康检查"` +} +``` + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L37) +- [api/monitor/v1/heathcheck.go](file://api/monitor/v1/heathcheck.go#L4-L6) + +## 端口暴露 +```dockerfile +EXPOSE 12401 +``` +声明服务监听12401端口,该端口在config.yaml中配置: +```yaml +server: + address: ":12401" +``` +此配置确保Docker容器网络与应用配置保持一致。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L39) +- [config.yaml](file://manifest/config/config.yaml#L2) + +## Docker Compose集成 +项目提供多个docker-compose配置文件,实现不同环境的部署。 + +### 生产环境配置 +```yaml +services: + kami_backend: + image: docker.kkknametrans.buzz/kami/backend:${DRONE_BRANCH}${DRONE_BUILD_NUMBER} + container_name: kami_backend:${DRONE_BRANCH}${DRONE_BUILD_NUMBER} + restart: always + ports: + - "127.0.0.1:22401:12401" + volumes: + - /data/kami/kami_backend/log/:/app/resource/log/ + - /data/kami/kami_backend/manifest/config/:/app/manifest/config/ +``` +生产环境配置特点: +- 使用版本化镜像标签 +- 持久化日志和配置文件 +- 端口映射到宿主机22401 + +### 本地开发配置 +```yaml +services: + backend_kami: + build: + context: ../../. + dockerfile: ./manifest/docker/Dockerfile + args: + - USE_PROXY=1 + ports: + - "127.0.0.1:12401:12401" +``` +本地开发配置支持直接构建,便于开发调试。 + +**Section sources** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) + +## 安全加固建议 +### 最小化镜像 +通过多阶段构建,最终镜像仅包含: +- 编译后的二进制文件 +- 必要的配置文件 +- 静态资源 +避免包含源代码、编译工具等不必要的文件。 + +### 非root用户运行 +**建议改进**:当前Dockerfile未指定用户,容器默认以root运行。建议添加: +```dockerfile +RUN adduser -D -s /bin/sh appuser +USER appuser +``` +以非特权用户运行应用,降低安全风险。 + +### 漏洞扫描 +建议在CI/CD流程中集成镜像漏洞扫描: +```bash +# 使用Trivy扫描镜像漏洞 +trivy image kami_backend:latest +``` + +### 依赖安全 +- 定期更新基础镜像 +- 使用`go mod tidy`清理未使用依赖 +- 监控Go依赖的安全公告 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile) + +## 性能优化技巧 +### 层缓存利用 +Docker构建采用分层缓存机制,建议优化构建顺序: +1. 先复制go.mod和go.sum +2. 执行go mod download +3. 复制源代码 +4. 执行编译 + +当前Dockerfile可优化为: +```dockerfile +COPY go.mod go.sum /build/ +RUN go mod download +COPY ./ /build/ +``` +这样当仅修改源代码时,可复用依赖下载的缓存层。 + +### 依赖预下载 +通过设置GOPROXY为国内镜像,显著加速模块下载: +```dockerfile +export GOPROXY=https://goproxy.cn,direct +``` + +### 二进制优化 +使用`-ldflags "-s -w"`编译标志: +- `-s`:去掉符号表 +- `-w`:去掉调试信息 +可减小二进制文件体积约30-40%。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L10) + +## 构建脚本分析 +项目提供多个安装脚本,自动化构建和部署流程。 + +### install.sh脚本功能 +- 交互式选择要构建的服务 +- 自动克隆代码仓库 +- 停止并删除现有容器 +- 构建并启动Docker容器 +- 清理临时文件和悬空镜像 + +### 构建流程 +1. 用户选择服务类型 +2. 克隆对应代码库 +3. 执行docker compose构建 +4. 清理本地代码 +5. 删除悬空镜像 + +这些脚本简化了部署流程,但建议迁移到标准化的CI/CD系统。 + +**Section sources** +- [install.sh](file://manifest/docker/install.sh) + +## 最佳实践总结 +1. **多阶段构建**:有效分离构建与运行环境 +2. **轻量基础镜像**:Alpine Linux显著减小镜像体积 +3. **国内镜像加速**:GOPROXY和APK镜像源提升构建速度 +4. **健康检查**:确保服务可用性监控 +5. **配置分离**:通过volume挂载配置文件,实现配置与代码分离 + +**改进建议**: +- 添加非root用户运行支持 +- 实现更精细的层缓存优化 +- 集成安全扫描工具 +- 使用.dockerignore排除不必要的文件 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/构建阶段详解.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/构建阶段详解.md new file mode 100644 index 00000000..fd8a226b --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/构建阶段详解.md @@ -0,0 +1,203 @@ +# 构建阶段详解 + + +**Referenced Files in This Document** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [Makefile](file://Makefile) +- [hack.mk](file://hack/hack.mk) + + +## 目录 +1. [构建阶段概述](#构建阶段概述) +2. [基础镜像选择](#基础镜像选择) +3. [依赖安装与代码编译](#依赖安装与代码编译) +4. [多阶段构建指令](#多阶段构建指令) +5. [构建缓存优化](#构建缓存优化) +6. [最佳实践](#最佳实践) +7. [常见问题解决方案](#常见问题解决方案) + +## 构建阶段概述 + +本项目采用多阶段Docker构建策略,将构建过程分为两个主要阶段:构建阶段和运行阶段。构建阶段使用`golang:1.24-alpine`作为基础镜像,负责代码编译和依赖管理;运行阶段使用轻量级的`alpine:latest`镜像,仅包含编译后的二进制文件和必要资源,实现最小化部署。 + +构建流程通过Dockerfile定义,结合Makefile和hack.mk中的构建脚本,实现了从代码编译到镜像构建的自动化流程。这种多阶段构建方法有效分离了构建环境和运行环境,既保证了构建过程的完整性,又确保了最终镜像的轻量化。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +## 基础镜像选择 + +构建阶段选择了`golang:1.24-alpine`作为基础镜像,这一选择基于以下几个关键因素: + +1. **版本稳定性**:使用Go 1.24版本确保了与项目代码的兼容性,避免了因语言版本差异导致的构建问题。 + +2. **轻量化优势**:Alpine Linux作为基础操作系统,具有极小的镜像体积(通常在5MB左右),显著减少了基础镜像的大小,加快了下载和构建速度。 + +3. **安全性**:Alpine Linux采用musl libc和busybox,减少了攻击面,提高了容器的安全性。 + +4. **社区支持**:Golang官方提供的Alpine镜像经过充分测试和维护,确保了构建环境的稳定性和可靠性。 + +该基础镜像包含了Go语言编译所需的所有工具链和依赖,为项目的编译构建提供了完整的环境支持。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L5) + +## 依赖安装与代码编译 + +构建阶段的依赖安装和代码编译过程通过一系列精心设计的指令完成,确保了构建的高效性和可靠性。 + +### 依赖管理 + +项目使用Go Modules进行依赖管理,在构建过程中通过`go mod tidy`命令自动下载和整理依赖。构建脚本中设置了国内代理`GOPROXY=https://goproxy.cn,direct`,解决了在中国大陆地区访问官方Go模块代理缓慢的问题,显著提高了依赖下载速度。 + +### 代码编译 + +代码编译过程包含以下关键步骤: +1. 设置环境变量`GO111MODULE=on`,强制启用Go Modules模式 +2. 设置`GOOS=linux`和`GOARCH=amd64`,确保编译出适用于Linux系统的二进制文件 +3. 使用`go build`命令进行编译,通过`-ldflags "-s -w"`参数优化编译结果 + +编译优化参数`-s`移除了符号表信息,`-w`移除了调试信息,两者结合可以显著减小最终二进制文件的大小,提高运行效率。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L6-L15) + +## 多阶段构建指令 + +多阶段构建是本项目Dockerfile的核心特性,通过两个独立的构建阶段实现了构建环境与运行环境的分离。 + +### 构建阶段(builder) + +构建阶段定义了完整的编译环境: +- 使用`golang:1.24-alpine`作为基础镜像 +- 设置工作目录为`/build` +- 复制整个项目代码到构建容器 +- 执行依赖下载和代码编译 + +### 运行阶段 + +运行阶段基于轻量级的`alpine:latest`镜像构建最终的运行环境: +- 从构建阶段复制编译好的二进制文件`/build/main`到`/app/`目录 +- 复制必要的资源文件,包括静态资源和配置文件 +- 安装运行时依赖,如curl工具 +- 配置健康检查机制 + +这种多阶段构建方法的优势在于: +1. **镜像体积最小化**:运行阶段镜像不包含任何编译工具和源代码,仅包含运行应用所需的最小文件集 +2. **安全性提升**:运行环境不包含编译工具链,减少了潜在的安全风险 +3. **构建效率**:构建阶段可以缓存,当源代码未改变时,无需重新下载依赖 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +## 构建缓存优化 + +构建缓存是提高Docker构建效率的关键机制。本项目的构建流程通过合理的指令顺序和文件组织,最大化利用了Docker的层缓存机制。 + +### 缓存策略 + +Docker采用分层存储机制,每条Dockerfile指令创建一个镜像层。当某一层的内容未改变时,Docker会重用该层的缓存,跳过相应的构建步骤。本项目通过以下方式优化缓存使用: + +1. **依赖先行**:在复制源代码之前先处理依赖,这样当仅修改源代码时,依赖下载步骤可以完全使用缓存 +2. **精确复制**:仅复制必要的文件,避免不必要的文件变更导致缓存失效 +3. **环境变量优化**:将不经常变化的环境变量设置放在前面,提高缓存命中率 + +### 构建参数 + +通过`ARG USE_PROXY`参数,可以在构建时灵活控制是否使用代理,这为不同网络环境下的构建提供了便利。参数的使用不会影响缓存机制,因为参数值的变化会触发新的构建层。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L6-L15) + +## 最佳实践 + +本项目的构建流程遵循了多项Docker构建最佳实践,确保了构建过程的高效性、可靠性和可维护性。 + +### .dockerignore文件 + +虽然项目中未显式提供.dockerignore文件,但最佳实践中应包含该文件,用于排除不必要的文件传输到构建上下文。典型的.dockerignore内容应包括: +- Git版本控制文件(.git/) +- IDE配置文件 +- 本地开发配置 +- 临时文件和日志 + +### 环境变量设置 + +构建过程中正确设置了关键环境变量: +- `GO111MODULE=on`:确保使用Go Modules进行依赖管理 +- `GOOS=linux`和`GOARCH=amd64`:指定目标操作系统的二进制文件 +- `TZ=Asia/Shanghai`:设置正确的时区 + +### 健康检查 + +通过HEALTHCHECK指令配置了健康检查机制,定期检查应用的健康状态。这有助于容器编排系统(如Kubernetes)及时发现和处理故障实例,提高系统的可用性。 + +### 构建自动化 + +通过Makefile和hack.mk脚本实现了构建自动化,提供了统一的构建接口。`make image`命令可以一键完成镜像构建,`make image.push`命令可以构建并推送镜像,简化了CI/CD流程。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) +- [Makefile](file://Makefile#L1-L6) +- [hack.mk](file://hack/hack.mk#L1-L75) + +## 常见问题解决方案 + +在构建过程中可能会遇到各种问题,以下是针对本项目常见问题的解决方案。 + +### 依赖下载缓慢 + +**问题**:在中国大陆地区,访问官方Go模块代理速度较慢,导致依赖下载耗时过长。 + +**解决方案**:在Dockerfile中设置国内代理: +```dockerfile +RUN export GOPROXY=https://goproxy.cn,direct && \ + export GO111MODULE=on GOOS=linux GOARCH=amd64 && \ + go mod tidy +``` + +### 镜像体积过大 + +**问题**:最终镜像体积超出预期。 + +**解决方案**: +1. 确保使用多阶段构建,仅将必要的二进制文件和资源复制到最终镜像 +2. 使用`-ldflags "-s -w"`参数优化编译结果,移除调试信息 +3. 在运行阶段使用`--no-cache`选项安装包,避免保留包管理器的缓存 + +### 构建缓存失效 + +**问题**:频繁的缓存失效导致构建速度变慢。 + +**解决方案**: +1. 优化Dockerfile指令顺序,将变化较少的操作放在前面 +2. 使用.dockerignore文件排除不必要的文件 +3. 将依赖管理与源代码复制分开,确保依赖层可以被有效缓存 + +### 时区配置问题 + +**问题**:容器内时间与本地时间不一致。 + +**解决方案**:在Dockerfile中正确配置时区: +```dockerfile +ENV TZ=Asia/Shanghai +RUN apk add --no-cache tzdata && \ + cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ + echo "Asia/Shanghai" > /etc/timezone +``` + +### 构建参数传递 + +**问题**:需要根据不同环境传递不同的构建参数。 + +**解决方案**:使用ARG指令定义构建参数,并在docker-compose或构建命令中传递: +```dockerfile +ARG USE_PROXY +``` +在docker-compose-local.yaml中可以看到参数的使用示例。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/运行阶段详解.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/运行阶段详解.md new file mode 100644 index 00000000..40d30f1e --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/Dockerfile详解/运行阶段详解.md @@ -0,0 +1,287 @@ +# 运行阶段详解 + + +**本文档中引用的文件** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [main.go](file://main.go) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go) +- [config.go](file://utility/config/config.go) +- [install.sh](file://manifest/docker/install.sh) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + + +## 目录 +1. [运行阶段概述](#运行阶段概述) +2. [多阶段构建详解](#多阶段构建详解) +3. [基础镜像选择与最小化策略](#基础镜像选择与最小化策略) +4. [二进制文件复制与资源管理](#二进制文件复制与资源管理) +5. [运行用户与安全配置](#运行用户与安全配置) +6. [端口暴露与工作目录设置](#端口暴露与工作目录设置) +7. [健康检查机制实现](#健康检查机制实现) +8. [安全最佳实践](#安全最佳实践) +9. [运行时性能优化建议](#运行时性能优化建议) +10. [部署与构建流程集成](#部署与构建流程集成) + +## 运行阶段概述 + +本项目通过Docker多阶段构建实现了高效、安全且轻量化的镜像构建流程。构建过程分为两个主要阶段:编译阶段(builder)和运行阶段(runtime)。编译阶段使用`golang:1.24-alpine`镜像完成代码编译,运行阶段则基于轻量级的`alpine:latest`镜像构建最终的生产环境容器。这种设计有效分离了构建依赖与运行环境,显著减小了最终镜像体积,同时提升了安全性。 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +## 多阶段构建详解 + +项目的Docker构建采用多阶段策略,通过`FROM ... AS builder`语法定义了明确的构建流程。第一阶段使用Go官方Alpine镜像进行编译,确保构建环境的一致性;第二阶段则切换到纯净的Alpine基础镜像,仅包含运行所需文件。这种方式避免了将Go编译器、源码和开发依赖打包进最终镜像,实现了构建环境与运行环境的完全隔离。 + +```mermaid +flowchart TD +Start([开始构建]) --> BuilderStage["编译阶段\nFROM golang:1.24-alpine AS builder"] +BuilderStage --> CopySource["复制源码到 /build"] +CopySource --> SetupEnv["设置GOPROXY、GO111MODULE等环境变量"] +SetupEnv --> BuildBinary["执行 go mod tidy && go build -ldflags \"-s -w\""] +BuildBinary --> RuntimeStage["运行阶段\nFROM alpine:latest"] +RuntimeStage --> SetWorkdir["设置工作目录 /app"] +SetWorkdir --> CopyBinary["从builder复制二进制文件"] +CopyBinary --> CopyResources["从builder复制资源配置"] +CopyResources --> SetupAlpine["配置国内镜像源、时区"] +SetupAlpine --> InstallCurl["安装curl工具"] +InstallCurl --> HealthCheck["配置HEALTHCHECK"] +HealthCheck --> ExposePort["EXPOSE 12401"] +ExposePort --> CMD["CMD [\"./main\"]"] +CMD --> End([镜像构建完成]) +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +## 基础镜像选择与最小化策略 + +项目最终运行镜像基于`alpine:latest`构建,这是实现镜像最小化的关键策略。Alpine Linux以其极小的体积(通常小于10MB)和良好的安全性著称,非常适合容器化部署。通过仅安装运行必需的组件(如`tzdata`用于时区支持和`curl`用于健康检查),项目实现了极致的轻量化。最终镜像不包含任何包管理器缓存,通过`--no-cache`参数确保`apk add`命令不会在镜像中保留临时文件,进一步减小体积。 + +```mermaid +graph TD +A[基础镜像选择] --> B[alpine:latest] +B --> C[优势] +C --> C1[体积小 < 10MB] +C --> C2[安全性高] +C --> C3[社区支持好] +A --> D[最小化策略] +D --> D1[仅安装必要软件包] +D --> D2[使用 --no-cache 参数] +D --> D3[清除包管理器缓存] +D --> D4[剥离二进制文件调试信息] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L15-L30) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L15-L30) + +## 二进制文件复制与资源管理 + +在多阶段构建中,项目通过`COPY --from=builder`指令精确控制文件复制,确保最终镜像只包含运行时必需的文件。具体复制内容包括:编译生成的`main`二进制文件、`resource/public/`下的静态资源文件以及`manifest/config/`中的配置文件。这种精细化的文件管理策略避免了无关文件的引入,既减小了攻击面,也提高了镜像的可维护性。 + +```mermaid +flowchart LR +Builder[编译阶段容器] --> |COPY --from=builder| Runtime[运行阶段容器] +subgraph Builder +B1[main 二进制文件] +B2[resource/public/] +B3[manifest/config/] +end +subgraph Runtime +R1[/app/main] +R2[/app/resource/public/] +R3[/app/manifest/config/] +end +B1 --> R1 +B2 --> R2 +B3 --> R3 +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L18-L21) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L18-L21) + +## 运行用户与安全配置 + +虽然当前Dockerfile未显式创建非root用户,但基于Alpine的运行环境本身具有较高的安全性。项目通过最小化安装原则减少了潜在的攻击面,且最终镜像中不包含shell等交互式工具,降低了被恶意利用的风险。建议在生产环境中进一步优化,通过`USER`指令创建专用运行用户,避免以root权限运行应用,遵循最小权限原则。 + +```mermaid +graph TD +Security[安全配置] --> Principle[最小权限原则] +Principle --> CreateUser["建议: 创建专用运行用户"] +Principle --> RemoveShell["移除不必要的shell访问"] +Security --> AttackSurface[减少攻击面] +AttackSurface --> MinimalInstall["最小化软件包安装"] +AttackSurface --> NoCache["清除包管理器缓存"] +AttackSurface --> StripBinary["剥离二进制调试信息"] +Security --> FilePermission[文件权限管理] +FilePermission --> Executable["确保二进制文件可执行"] +FilePermission --> RestrictConfig["配置文件权限限制"] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L23-L32) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L23-L32) + +## 端口暴露与工作目录设置 + +项目在Dockerfile中通过`EXPOSE 12401`明确声明了服务监听端口,这既是文档性说明,也为容器网络配置提供了依据。工作目录通过`WORKDIR /app`指令设置为`/app`,所有应用文件均部署在此目录下,实现了文件系统的整洁和可预测性。环境变量`TZ=Asia/Shanghai`的设置确保了容器内时间与北京时间同步,避免了因时区差异导致的业务逻辑错误。 + +```mermaid +flowchart TB +Setup[环境设置] --> Workdir["WORKDIR /app"] +Workdir --> Purpose["目的"] +Purpose --> P1[统一应用部署路径] +Purpose --> P2[提高可维护性] +Purpose --> P3[避免路径混乱] +Setup --> Expose["EXPOSE 12401"] +Expose --> Purpose2["目的"] +Purpose2 --> P4[声明服务端口] +Purpose2 --> P5[便于网络配置] +Purpose2 --> P6[文档化服务信息] +Setup --> Env["ENV TZ=Asia/Shanghai"] +Env --> Purpose3["目的"] +Purpose3 --> P7[设置正确时区] +Purpose3 --> P8[避免时间相关bug] +Purpose3 --> P9[日志时间准确] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L16-L17) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L16-L17) + +## 健康检查机制实现 + +项目通过`HEALTHCHECK`指令实现了容器健康状态监控,配置为每60秒检查一次,超时3秒,连续3次失败则判定容器不健康。检查命令为`curl -f http://127.0.0.1:12401/api/monitor/heathcheck`,调用内部健康检查API。该API由`monitor_v1_health_check.go`实现,返回简单的`{"ok": true}`响应,为Kubernetes等编排系统提供了可靠的存活探针支持。 + +```mermaid +sequenceDiagram +participant DockerEngine as Docker引擎 +participant Container as 容器 +participant App as 应用服务 +participant HealthAPI as 健康检查API +loop 每60秒执行一次 +DockerEngine->>Container : HEALTHCHECK CMD +Container->>App : curl http : //127.0.0.1 : 12401/api/monitor/heathcheck +App->>HealthAPI : 处理GET请求 +HealthAPI-->>App : 返回{"ok" : true} +App-->>Container : HTTP 200响应 +Container-->>DockerEngine : 检查成功 +end +Note over DockerEngine,Container : 连续3次失败则重启容器 +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L34-L35) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L12) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go#L1-L12) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L34-L35) +- [heathcheck.go](file://api/monitor/v1/heathcheck.go#L1-L12) +- [monitor_v1_health_check.go](file://internal/controller/monitor/monitor_v1_health_check.go#L1-L12) + +## 安全最佳实践 + +项目在容器安全方面采用了多项最佳实践:使用Alpine作为基础镜像减小攻击面;通过`--no-cache`参数避免缓存文件残留;设置合理的健康检查机制确保服务可用性;使用国内镜像源加速构建并减少外部依赖风险。然而,仍有改进空间,如应创建非root用户运行应用、进一步限制文件权限、考虑使用更安全的镜像扫描工具等。 + +```mermaid +graph TD +BestPractices[安全最佳实践] --> Image[镜像安全] +Image --> Alpine[使用Alpine基础镜像] +Image --> Minimal[最小化安装] +Image --> NoCache[清除缓存] +BestPractices --> Build[构建安全] +Build --> GOPROXY[设置GOPROXY] +Build --> Tidy[go mod tidy] +Build --> Strip[剥离调试信息] +BestPractices --> Runtime[运行时安全] +Runtime --> NonRoot[使用非root用户] +Runtime --> Permission[合理文件权限] +Runtime --> HealthCheck[健康检查] +BestPractices --> Config[配置安全] +Config --> TimeZone[正确时区设置] +Config --> Env[环境变量管理] +Config --> Secret[敏感信息保护] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L40) + +## 运行时性能优化建议 + +为优化容器运行时性能,建议采取以下措施:通过`docker-compose.yml`配置合理的资源限制(CPU和内存),防止单个容器耗尽节点资源;利用Alpine镜像的小体积优势加快容器启动速度;通过健康检查确保服务稳定性;考虑在生产环境中使用更精细的日志级别控制,避免过度日志输出影响性能。此外,可结合OpenTelemetry监控系统(已在`main.go`中集成)进行性能分析和优化。 + +```mermaid +flowchart TD +Performance[性能优化] --> Resource[资源限制] +Resource --> CPU["设置CPU限制"] +Resource --> Memory["设置内存限制"] +Resource --> Swap["禁用或限制swap"] +Performance --> Startup[启动性能] +Startup --> SmallImage["小体积镜像"] +Startup --> MinimalProcess["最少进程启动"] +Startup --> LazyLoad["按需加载"] +Performance --> Monitoring[监控与调优] +Monitoring --> HealthCheck["健康检查"] +Monitoring --> OTel["OpenTelemetry集成"] +Monitoring --> LogLevel["合理日志级别"] +Performance --> Network[网络优化] +Network --> PortReuse["端口复用"] +Network --> KeepAlive["连接保持"] +Network --> CDN["静态资源CDN"] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L34-L35) +- [main.go](file://main.go#L22-L48) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L34-L35) +- [main.go](file://main.go#L22-L48) + +## 部署与构建流程集成 + +项目的构建和部署流程通过`install.sh`系列脚本与Docker Compose集成,实现了自动化部署。构建过程由`docker-compose.yml`文件定义,与`Dockerfile`协同工作。通过Makefile中的`image`和`image.push`目标,项目支持标准化的镜像构建与推送流程。这种集成方式确保了开发、测试和生产环境的一致性,符合现代DevOps实践。 + +```mermaid +flowchart LR +Dev[开发环境] --> |git push| CI[CI/CD系统] +CI --> Build["执行 make image"] +Build --> Dockerfile["调用 Dockerfile"] +Dockerfile --> Image["生成Docker镜像"] +Image --> Push["执行 make image.push"] +Push --> Registry["推送至镜像仓库"] +Registry --> Deploy["部署脚本 install.sh"] +Deploy --> Compose["调用 docker-compose.yml"] +Compose --> Runtime["容器运行时"] +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [install.sh](file://manifest/docker/install.sh) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [Makefile](file://Makefile) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [install.sh](file://manifest/docker/install.sh) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [Makefile](file://Makefile) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/容器化部署/容器化部署.md b/.qoder/repowiki/zh/content/部署配置/容器化部署/容器化部署.md new file mode 100644 index 00000000..6ecb4958 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/容器化部署/容器化部署.md @@ -0,0 +1,181 @@ +# 容器化部署 + + +**本文档引用的文件** +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [install.sh](file://manifest/docker/install.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-test.sh](file://manifest/docker/install-test.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + + +## 目录 +1. [Dockerfile详解](#dockerfile详解) +2. [docker-compose配置分析](#docker-compose配置分析) +3. [部署脚本说明](#部署脚本说明) +4. [容器化部署流程](#容器化部署流程) +5. [性能优化与安全加固](#性能优化与安全加固) + +## Dockerfile详解 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) + +### 基础镜像选择 +Dockerfile采用多阶段构建策略,第一阶段使用`golang:1.24-alpine`作为构建镜像。选择Alpine Linux作为基础镜像的主要原因是其极小的体积(约5MB),这能显著减少最终镜像的大小,提高传输效率和安全性。 + +### 构建阶段分析 +构建阶段(builder stage)主要完成以下操作: +1. 设置工作目录为`/build` +2. 复制项目源码到容器内 +3. 设置Go模块代理为国内镜像源`https://goproxy.cn` +4. 执行`go mod tidy`整理依赖 +5. 编译生成可执行文件,使用`-ldflags "-s -w"`参数去除调试信息,减小二进制文件大小 + +### 运行阶段分析 +运行阶段(runtime stage)基于`alpine:latest`镜像,包含以下关键配置: +1. 设置工作目录为`/app` +2. 配置时区为`Asia/Shanghai` +3. 使用阿里云镜像源加速包管理 +4. 安装必要的系统工具(curl、tzdata) +5. 复制构建阶段生成的可执行文件和资源配置文件 +6. 配置健康检查机制,通过访问`/api/monitor/heathcheck`接口检测服务状态 +7. 暴露服务端口12401 + +## docker-compose配置分析 + +**Section sources** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) + +### 生产环境配置 +生产环境的`docker-compose.yml`文件定义了kami_backend服务的部署配置: +- 使用预构建的镜像,镜像名称包含分支和构建编号 +- 设置容器名称和自动重启策略 +- 将宿主机的127.0.0.1:22401端口映射到容器的12401端口 +- 挂载日志和配置文件目录,实现数据持久化 +- 连接到外部网络`1panel-network` + +### 本地开发配置 +`docker-compose-local.yaml`文件专为本地开发环境设计,具有以下特点: +- 使用`build`指令从本地Dockerfile构建镜像 +- 设置构建参数`USE_PROXY=1`,启用代理配置 +- 使用本地最新的镜像标签 +- 简化的端口映射配置 +- 相同的网络配置,确保与生产环境的一致性 + +### 配置差异对比 +两种配置文件的主要差异体现在: +1. **镜像来源**:生产环境使用预构建镜像,本地环境使用本地构建 +2. **版本控制**:生产环境包含详细的版本信息,本地环境使用latest标签 +3. **构建参数**:本地环境支持代理参数传递 +4. **容器命名**:生产环境包含版本信息,本地环境使用固定名称 + +## 部署脚本说明 + +**Section sources** +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [install-simple.sh](file://manifest/docker/install-simple.sh#L1-L131) +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134) +- [install-test.sh](file://manifest/docker/install-test.sh#L1-L133) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +### 主要部署脚本功能 +项目提供了多个部署脚本以适应不同场景: + +#### install.sh +完整部署脚本,执行流程包括: +1. 交互式选择要部署的应用 +2. 克隆代码仓库 +3. 停止并删除现有容器 +4. 停止所有其他Docker容器 +5. 构建并启动新容器 +6. 重启所有kami_前缀的容器 +7. 清理临时文件和悬空镜像 +8. 自我删除脚本文件 + +#### install-simple.sh +简化版部署脚本,主要差异: +1. 仅在部署网关服务时停止其他容器 +2. 不重启所有kami_前缀的容器 +3. 不自我删除,便于重复使用 + +#### install-one.sh +支持命令行参数的部署脚本,可通过`-c`参数指定要部署的应用编号,适合自动化部署场景。 + +#### install-test.sh +测试环境专用部署脚本,使用测试环境的docker-compose配置文件。 + +### 辅助脚本 +`wait-for-it.sh`脚本用于在服务启动前等待依赖服务(如数据库)就绪,确保服务启动顺序的正确性。 + +## 容器化部署流程 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +### 镜像构建 +1. 进入项目根目录 +2. 执行`docker build -f manifest/docker/Dockerfile -t kami_backend:latest .` +3. 构建过程将自动完成依赖下载、代码编译和镜像打包 + +### 服务启动 +本地开发环境启动: +```bash +docker compose -f manifest/docker/docker-compose-local.yaml up -d +``` + +生产环境启动: +```bash +docker compose -f manifest/docker/docker-compose.yml up -d +``` + +### 日志查看 +查看容器日志: +```bash +docker logs kami_backend +``` + +实时查看日志: +```bash +docker logs -f kami_backend +``` + +### 容器管理 +常用管理命令: +- 查看容器状态:`docker ps` +- 停止容器:`docker stop kami_backend` +- 启动容器:`docker start kami_backend` +- 删除容器:`docker rm kami_backend` +- 进入容器:`docker exec -it kami_backend /bin/sh` + +## 性能优化与安全加固 + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) + +### 性能优化措施 +1. **多阶段构建**:分离构建环境和运行环境,显著减小最终镜像体积 +2. **二进制优化**:编译时使用`-s -w`参数去除调试符号,减小二进制文件大小 +3. **Alpine基础镜像**:使用轻量级Linux发行版,减少攻击面和资源占用 +4. **健康检查**:配置定期健康检查,及时发现和恢复异常服务 + +### 安全加固措施 +1. **国内镜像源**:使用阿里云和goproxy.cn镜像源,避免从不可信源下载依赖 +2. **最小化安装**:仅安装必要的系统包,减少潜在安全漏洞 +3. **非root用户运行**:建议在生产环境中配置容器以非root用户运行 +4. **网络隔离**:使用外部网络`1panel-network`,实现服务间的网络隔离 +5. **环境变量管理**:敏感配置通过环境变量传递,避免硬编码在代码中 + +### 最佳实践建议 +1. **镜像版本控制**:生产环境使用具体的版本标签,避免使用latest标签 +2. **资源限制**:在docker-compose中配置内存和CPU限制,防止单个容器耗尽系统资源 +3. **日志轮转**:配置日志轮转策略,防止日志文件无限增长 +4. **定期更新**:定期更新基础镜像和依赖包,及时修复已知安全漏洞 +5. **安全扫描**:在CI/CD流程中集成容器镜像安全扫描工具 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/自动化部署/Makefile自动化构建.md b/.qoder/repowiki/zh/content/部署配置/自动化部署/Makefile自动化构建.md new file mode 100644 index 00000000..1908fdf1 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/自动化部署/Makefile自动化构建.md @@ -0,0 +1,230 @@ +# Makefile自动化构建 + + +**Referenced Files in This Document** +- [Makefile](file://Makefile) +- [hack/hack.mk](file://hack/hack.mk) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [main.go](file://main.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文档详细解析kami_backend项目的Makefile自动化构建系统。Makefile作为项目构建的核心工具,提供了标准化的构建、运行、部署和测试流程,简化了开发和运维工作。通过Makefile,开发者可以使用简单的命令完成复杂的构建和部署任务,确保了开发环境和生产环境的一致性。 + +**Section sources** +- [Makefile](file://Makefile#L0-L5) +- [hack/hack.mk](file://hack/hack.mk#L0-L74) + +## 项目结构 +kami_backend项目采用模块化设计,主要包含API接口层、内部逻辑层、数据访问层和工具库。项目根目录下的Makefile是构建系统的入口,通过包含hack/hack.mk文件来扩展功能。manifest/docker目录包含Docker相关的配置文件,包括Dockerfile和docker-compose.yml,用于容器化部署。项目结构清晰,各组件职责分明,便于维护和扩展。 + +```mermaid +graph TD +subgraph "项目根目录" +Makefile[Makefile] +main[main.go] +hack[hack/] +manifest[manifest/] +internal[internal/] +api[api/] +utility[utility/] +end +subgraph "构建配置" +Makefile --> hack +Makefile --> manifest +end +subgraph "应用代码" +main --> internal +internal --> api +internal --> utility +end +subgraph "部署配置" +manifest --> Dockerfile[Dockerfile] +manifest --> docker-compose[docker-compose.yml] +end +``` + +**Diagram sources ** +- [Makefile](file://Makefile#L0-L5) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile#L0-L40) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L0-L18) + +**Section sources** +- [Makefile](file://Makefile#L0-L5) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile#L0-L40) +- [manifest/docker/docker-compose.yml](file://manifest/docker/docker-compose.yml#L0-L18) + +## 核心组件 +Makefile的核心组件包括各种构建目标(target),每个目标对应特定的构建或部署任务。主要目标包括build(编译)、run(运行)、deploy(部署)、test(测试)等。这些目标通过调用GoFrame CLI工具和Docker命令来实现具体功能。环境变量在Makefile中扮演重要角色,用于配置构建参数和部署选项。通过合理使用环境变量,可以在不同环境中灵活调整构建和部署行为。 + +**Section sources** +- [Makefile](file://Makefile#L0-L5) +- [hack/hack.mk](file://hack/hack.mk#L0-L74) + +## 架构概述 +kami_backend的构建架构基于Makefile和GoFrame CLI工具。Makefile作为顶层构建脚本,定义了各种构建目标和依赖关系。hack/hack.mk文件提供了具体的构建逻辑,通过调用GoFrame CLI工具执行代码生成、编译等任务。Dockerfile定义了容器镜像的构建过程,从源代码编译到最终镜像的创建。docker-compose.yml文件描述了服务的运行配置,包括端口映射、卷挂载等。整个构建流程实现了从源代码到可运行容器的自动化转换。 + +```mermaid +graph TD +subgraph "构建流程" +Makefile[Makefile] +hack_mk[hack/hack.mk] +gf_cli[GoFrame CLI] +go_build[Go Build] +docker_build[Docker Build] +end +subgraph "部署流程" +kubectl[kubectl] +kustomize[Kustomize] +kubernetes[Kubernetes] +end +Makefile --> hack_mk +hack_mk --> gf_cli +gf_cli --> go_build +go_build --> docker_build +docker_build --> kustomize +kustomize --> kubernetes +``` + +**Diagram sources ** +- [Makefile](file://Makefile#L0-L5) +- [hack/hack.mk](file://hack/hack.mk#L0-L74) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile#L0-L40) + +## 详细组件分析 + +### 构建目标分析 +Makefile中的构建目标定义了项目的构建和部署流程。每个目标都有明确的职责和执行逻辑,通过依赖关系确保构建过程的正确性。 + +#### 构建目标(build) +构建目标负责编译项目代码。它依赖于cli.install目标,确保GoFrame CLI工具已安装。构建过程使用gf build命令,通过-ew参数启用编译优化。该目标主要用于本地开发环境的代码编译。 + +```mermaid +graph TD +build[build] +cli_install[cli.install] +gf_build[gf build -ew] +build --> cli_install +build --> gf_build +``` + +**Diagram sources ** +- [hack/hack.mk](file://hack/hack.mk#L9-L12) + +#### 运行目标(run) +运行目标用于启动服务。虽然在当前Makefile中没有直接定义,但可以通过组合其他目标实现。通常,运行目标会先执行构建,然后启动编译后的二进制文件或Docker容器。 + +#### 部署目标(deploy) +部署目标负责将应用部署到Kubernetes集群。它使用kustomize工具生成Kubernetes资源配置,并通过kubectl apply命令应用这些配置。部署过程中会自动添加时间戳标签,触发Deployment的滚动更新。 + +```mermaid +graph TD +deploy[deploy] +kustomize_build[kustomize build] +kubectl_apply[kubectl apply] +patch_deployment[kubectl patch] +deploy --> kustomize_build +deploy --> kubectl_apply +deploy --> patch_deployment +``` + +**Diagram sources ** +- [hack/hack.mk](file://hack/hack.mk#L55-L65) + +#### 测试目标(test) +测试目标用于执行项目测试。虽然在当前Makefile中没有直接定义,但可以通过GoFrame CLI工具的测试功能实现。通常包括单元测试、集成测试和端到端测试。 + +**Section sources** +- [Makefile](file://Makefile#L0-L5) +- [hack/hack.mk](file://hack/hack.mk#L9-L65) + +### 环境变量配置 +Makefile通过环境变量实现灵活的构建和部署配置。主要环境变量包括TAG(镜像标签)、PUSH(是否推送镜像)、_ENV(部署环境)等。这些变量可以在命令行中覆盖,实现不同环境的差异化构建。 + +```mermaid +graph TD +env_vars[环境变量] +TAG[TAG] +PUSH[PUSH] +_ENV[_ENV] +NAMESPACE[NAMESPACE] +DEPLOY_NAME[DEPLOY_NAME] +DOCKER_NAME[DOCKER_NAME] +env_vars --> TAG +env_vars --> PUSH +env_vars --> _ENV +env_vars --> NAMESPACE +env_vars --> DEPLOY_NAME +env_vars --> DOCKER_NAME +``` + +**Diagram sources ** +- [Makefile](file://Makefile#L1-L4) +- [hack/hack.mk](file://hack/hack.mk#L40-L53) + +## 依赖分析 +Makefile的依赖关系清晰,确保了构建过程的正确性和可重复性。主要依赖包括GoFrame CLI工具、Docker、Kubernetes CLI工具等。项目内部依赖通过Go modules管理,确保了依赖版本的一致性。 + +```mermaid +graph TD +Makefile[Makefile] +hack_mk[hack/hack.mk] +gf_cli[GoFrame CLI] +docker[Docker] +kubectl[kubectl] +kustomize[Kustomize] +Makefile --> hack_mk +hack_mk --> gf_cli +hack_mk --> docker +hack_mk --> kubectl +hack_mk --> kustomize +``` + +**Diagram sources ** +- [Makefile](file://Makefile#L5) +- [hack/hack.mk](file://hack/hack.mk#L1-L74) + +## 性能考虑 +构建系统的性能主要体现在构建速度和资源利用率上。通过使用Docker多阶段构建,可以减少最终镜像的大小,提高部署效率。Go代码的静态编译特性使得二进制文件可以直接运行,无需额外的运行时环境。使用Kustomize进行配置管理,可以实现配置的复用和差异化,减少重复代码。 + +## 故障排除指南 +在使用Makefile构建系统时,可能会遇到各种问题。常见问题包括依赖工具未安装、环境变量配置错误、网络连接问题等。建议首先检查相关工具是否正确安装,然后验证环境变量配置是否正确。对于网络相关的问题,可以尝试使用国内镜像源加速下载。 + +**Section sources** +- [hack/hack.mk](file://hack/hack.mk#L1-L74) +- [manifest/docker/Dockerfile](file://manifest/docker/Dockerfile#L5-L10) + +## 结论 +kami_backend的Makefile构建系统提供了一套完整的自动化构建和部署解决方案。通过标准化的构建目标和清晰的依赖关系,简化了开发和运维工作。系统集成了代码生成、编译、容器化和Kubernetes部署等功能,实现了从代码到生产环境的无缝衔接。建议在实际使用中,根据具体需求调整环境变量和构建参数,以适应不同的部署场景。 + +## 附录 + +### 常用命令示例 +- `make build`:编译项目代码 +- `make image`:构建Docker镜像 +- `make image.push`:构建并推送Docker镜像 +- `make deploy`:部署应用到Kubernetes集群 +- `make up`:更新GoFrame CLI工具 + +### 自定义目标开发指南 +要添加自定义Makefile目标,可以在Makefile或hack/hack.mk中定义新的目标。建议将通用目标放在hack/hack.mk中,项目特定目标放在Makefile中。新目标应遵循现有的命名规范和依赖管理方式,确保与现有构建系统的兼容性。 + +### 最佳实践 +1. 使用环境变量实现配置的灵活性 +2. 保持构建目标的单一职责 +3. 使用依赖关系确保构建顺序的正确性 +4. 定期更新依赖工具到稳定版本 +5. 在CI/CD管道中使用相同的构建命令,确保环境一致性 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/自动化部署/Shell脚本自动化.md b/.qoder/repowiki/zh/content/部署配置/自动化部署/Shell脚本自动化.md new file mode 100644 index 00000000..9fbbde0d --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/自动化部署/Shell脚本自动化.md @@ -0,0 +1,200 @@ +# Shell脚本自动化 + + +**本文档中引用的文件** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档深入分析kami_backend项目的Shell脚本自动化系统,重点研究install-one.sh和install-simple.sh等自动化安装脚本的工作流程、参数配置和执行逻辑。文档详细解释了wait-for-it.sh脚本在服务依赖等待中的作用机制和实现原理,提供这些脚本的调用示例和常见问题解决方案,并包含基于这些Shell脚本的CI/CD集成方案和自定义自动化脚本的开发指南。 + +## 项目结构 +kami_backend项目的自动化脚本主要位于manifest/docker目录下,包含多个Shell脚本用于不同的部署场景。这些脚本协同工作,实现了从代码拉取、容器构建到服务启动的完整自动化流程。 + +```mermaid +graph TD +A[自动化脚本] --> B[install-one.sh] +A --> C[install-simple.sh] +A --> D[install-test.sh] +A --> E[install.sh] +A --> F[wait-for-it.sh] +G[Docker配置] --> H[Dockerfile] +G --> I[docker-compose.yml] +G --> J[docker-compose-local.yaml] +``` + +**图示来源** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) + +## 核心组件 +本项目的核心自动化组件包括三个主要的安装脚本:install-one.sh、install-simple.sh和wait-for-it.sh。这些脚本分别针对不同的使用场景设计,提供了灵活的部署选项。install-one.sh支持命令行参数调用,适合自动化集成;install-simple.sh采用交互式菜单,便于手动操作;wait-for-it.sh则专注于服务依赖管理,确保服务按正确顺序启动。 + +**组件来源** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 架构概述 +自动化系统的架构设计遵循模块化原则,将不同的功能分离到独立的脚本中。主安装脚本负责代码拉取、容器管理和构建流程,而wait-for-it.sh专门处理服务依赖问题。Docker配置文件定义了容器的运行时环境,与Shell脚本协同工作,实现了完整的部署自动化。 + +```mermaid +graph LR +User --> |调用| InstallScript +InstallScript --> |执行| GitClone[代码拉取] +InstallScript --> |执行| ContainerManagement[容器管理] +InstallScript --> |执行| DockerCompose[Docker编排] +DockerCompose --> |依赖| WaitForIt[服务依赖等待] +WaitForIt --> |检查| Service[目标服务] +DockerCompose --> |启动| BackendService[kami_backend服务] +``` + +**图示来源** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + +## 详细组件分析 + +### install-one.sh脚本分析 +install-one.sh脚本采用命令行参数方式接收用户输入,通过-c参数指定要部署的服务。脚本首先解析参数,然后执行一系列自动化操作,包括代码克隆、分支切换、容器停止与删除、Docker编排构建等。该脚本特别适合集成到CI/CD流水线中,因为它不需要人工交互。 + +```mermaid +flowchart TD +Start([开始]) --> ParseArgs["解析命令行参数"] +ParseArgs --> ValidateInput["验证参数有效性"] +ValidateInput --> CloneCode["克隆代码仓库"] +CloneCode --> CheckoutBranch["切换到master分支"] +CheckoutBranch --> PullLatest["拉取最新代码"] +PullLatest --> StopContainer["停止并删除现有容器"] +StopContainer --> StopAll["停止所有其他容器"] +StopAll --> BuildContainer["构建并启动容器"] +BuildContainer --> Cleanup["清理本地代码"] +Cleanup --> RestartAll["重启所有kami_容器"] +RestartAll --> RemoveDangling["删除悬空镜像"] +RemoveDangling --> SelfDelete["删除自身脚本"] +SelfDelete --> End([结束]) +``` + +**图示来源** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L133) + +**组件来源** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L133) + +### install-simple.sh脚本分析 +install-simple.sh脚本提供交互式用户界面,通过数字选择要部署的服务。与install-one.sh相比,该脚本更适合手动操作场景。脚本首先显示选项菜单,然后读取用户输入,验证选择的有效性,最后执行相应的部署流程。对于kami_gateway服务,脚本会特别处理容器的停止和启动顺序。 + +```mermaid +flowchart TD +Start([开始]) --> ShowMenu["显示服务选项菜单"] +ShowMenu --> ReadInput["读取用户选择"] +ReadInput --> ValidateChoice["验证选择有效性"] +ValidateChoice --> CloneCode["克隆代码仓库"] +CloneCode --> CheckoutBranch["切换到master分支"] +CheckoutBranch --> PullLatest["拉取最新代码"] +PullLatest --> ConditionalStop["条件性停止容器"] +ConditionalStop --> BuildContainer["构建并启动容器"] +BuildContainer --> ConditionalStart["条件性启动所有容器"] +ConditionalStart --> Cleanup["清理本地代码"] +Cleanup --> RemoveDangling["删除悬空镜像"] +RemoveDangling --> End([结束]) +``` + +**图示来源** +- [install-simple.sh](file://manifest/docker/install-simple.sh#L1-L130) + +**组件来源** +- [install-simple.sh](file://manifest/docker/install-simple.sh#L1-L130) + +### wait-for-it.sh脚本分析 +wait-for-it.sh脚本是一个轻量级的服务依赖等待工具,用于确保在启动依赖服务之前,其所依赖的服务已经可用。脚本通过netcat工具持续检查指定主机和端口的可达性,直到服务可用或超时。这种机制对于微服务架构中的服务编排至关重要。 + +```mermaid +sequenceDiagram +participant Script as wait-for-it.sh +participant Netcat as netcat +participant TargetService as 目标服务 +participant MainApp as 主应用 +Script->>Netcat : 检查主机 : 端口连通性 +Netcat->>TargetService : TCP连接尝试 +alt 服务不可用 +TargetService-->>Netcat : 连接失败 +Netcat-->>Script : 返回错误 +Script->>Script : 等待1秒 +Script->>Netcat : 再次检查 +else 服务可用 +TargetService-->>Netcat : 连接成功 +Netcat-->>Script : 返回成功 +Script->>MainApp : 执行主应用命令 +MainApp->>MainApp : 正常运行 +end +``` + +**图示来源** +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +**组件来源** +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +## 依赖分析 +自动化脚本系统依赖于多个外部工具和组件,包括Git用于代码版本控制,Docker用于容器化部署,docker-compose用于服务编排,以及netcat用于网络连接检测。这些依赖关系确保了脚本能够完成从代码获取到服务启动的完整流程。 + +```mermaid +graph TD +InstallScript --> Git[Git] +InstallScript --> Docker[Docker] +InstallScript --> DockerCompose[docker-compose] +WaitForItScript --> Netcat[netcat] +Dockerfile --> Go[Go编译器] +Dockerfile --> Alpine[Alpine Linux] +docker-compose.yml --> DockerEngine[Docker引擎] +docker-compose.yml --> 1panelNetwork["1panel-network (外部网络)"] +``` + +**图示来源** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + +**组件来源** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L133) +- [install-simple.sh](file://manifest/docker/install-simple.sh#L1-L130) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +## 性能考虑 +自动化脚本的设计考虑了执行效率和资源利用率。通过删除悬空镜像和清理本地代码,脚本有效管理了系统资源。然而,脚本中的一些操作,如停止所有容器和重启所有kami_容器,可能会对系统性能产生暂时影响。建议在非高峰时段执行这些脚本,以最小化对生产环境的影响。 + +## 故障排除指南 +当自动化脚本执行失败时,应首先检查网络连接和Git访问权限。常见的问题包括SSH密钥配置错误、Docker守护进程未运行、端口冲突等。对于wait-for-it.sh脚本,如果长时间等待服务可用,应检查目标服务是否正常运行以及防火墙设置。 + +**组件来源** +- [install-one.sh](file://manifest/docker/install-one.sh#L1-L133) +- [install-simple.sh](file://manifest/docker/install-simple.sh#L1-L130) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20) + +## 结论 +kami_backend项目的Shell脚本自动化系统提供了一套完整的部署解决方案,涵盖了从简单手动部署到复杂CI/CD集成的各种场景。通过合理使用install-one.sh、install-simple.sh和wait-for-it.sh等脚本,可以显著提高部署效率和可靠性。建议根据具体使用场景选择合适的脚本,并定期审查和优化自动化流程。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/自动化部署/自动化部署.md b/.qoder/repowiki/zh/content/部署配置/自动化部署/自动化部署.md new file mode 100644 index 00000000..306b27a5 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/自动化部署/自动化部署.md @@ -0,0 +1,241 @@ +# 自动化部署 + + +**本文档引用的文件** +- [Makefile](file://Makefile) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录)(如有必要) + +## 简介 +本文档全面解析kami_backend项目的自动化部署体系。重点分析Makefile中的构建、运行和部署目标,深入探讨install-one.sh和install-simple.sh等自动化安装脚本的工作流程与参数配置,解释wait-for-it.sh脚本在服务依赖等待中的作用机制。同时提供基于这些自动化工具的CI/CD集成方案,并包含自定义自动化脚本的开发指南和最佳实践。 + +## 项目结构 +kami_backend项目采用模块化设计,主要包含API接口层、内部业务逻辑层、工具库和部署配置文件。自动化部署相关的核心文件集中在`manifest/docker`目录下,包括Dockerfile、docker-compose配置文件以及多个自动化安装脚本。项目根目录下的Makefile提供了标准化的构建和部署命令接口。 + +```mermaid +graph TB +subgraph "部署配置" +Dockerfile[Dockerfile] +Compose[docker-compose.yml] +InstallScripts[安装脚本] +end +subgraph "自动化工具" +Makefile[Makefile] +WaitScript[wait-for-it.sh] +end +subgraph "源代码" +API[api/] +Internal[internal/] +Utility[utility/] +Main[main.go] +end +Makefile --> Dockerfile +InstallScripts --> Compose +InstallScripts --> Dockerfile +WaitScript --> Compose +Makefile --> InstallScripts +``` + +**图示来源** +- [Makefile](file://Makefile) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [install-one.sh](file://manifest/docker/install-one.sh) + +**本节来源** +- [Makefile](file://Makefile) +- [manifest/docker/](file://manifest/docker/) + +## 核心组件 +本文档的核心组件包括Makefile定义的构建流程、install-one.sh和install-simple.sh提供的自动化安装功能,以及wait-for-it.sh实现的服务依赖等待机制。这些组件共同构成了kami_backend项目的自动化部署体系,实现了从代码拉取、镜像构建到容器部署的全流程自动化。 + +**本节来源** +- [Makefile](file://Makefile) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 架构概述 +kami_backend的自动化部署架构采用分层设计,上层为Makefile提供的命令行接口,中层为shell脚本实现的自动化逻辑,底层为Docker容器化运行时环境。该架构支持灵活的部署模式,既可以通过install-one.sh进行单次完整部署,也可以通过install-simple.sh进行选择性更新。 + +```mermaid +graph TD +A[用户] --> B[Makefile] +A --> C[安装脚本] +B --> D[install-one.sh] +B --> E[install-simple.sh] +C --> D +C --> E +D --> F[Docker] +E --> F +F --> G[容器运行时] +H[wait-for-it.sh] --> F +I[Dockerfile] --> F +J[docker-compose.yml] --> F +``` + +**图示来源** +- [Makefile](file://Makefile) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) + +## 详细组件分析 + +### Makefile目标分析 +Makefile作为项目自动化构建的入口,定义了标准化的构建、运行和部署命令。通过包含hack/hack.mk文件,实现了环境变量的统一管理和构建参数的灵活配置。 + +#### 构建流程分析 +```mermaid +flowchart TD +Start([开始]) --> SetVars["设置ROOT_DIR等变量"] +SetVars --> Include["包含hack/hack.mk"] +Include --> Build["执行构建命令"] +Build --> End([结束]) +``` + +**图示来源** +- [Makefile](file://Makefile) + +**本节来源** +- [Makefile](file://Makefile) + +### 自动化安装脚本分析 + +#### install-one.sh工作流程 +install-one.sh脚本支持通过-c参数指定要安装的镜像编号,实现了多应用的统一安装接口。脚本具备代码克隆、容器管理、镜像构建和清理等完整功能。 + +```mermaid +flowchart TD +Start([开始]) --> ParseArgs["解析-c参数"] +ParseArgs --> MatchRepo["匹配仓库名称"] +MatchRepo --> Clone["克隆代码"] +Clone --> Pull["拉取最新代码"] +Pull --> StopContainer["停止现有容器"] +StopContainer --> StopAll["停止所有容器"] +StopAll --> Build["构建并启动容器"] +Build --> StartAll["启动所有容器"] +StartAll --> RestartKami["重启kami_开头的容器"] +RestartKami --> Cleanup["清理悬空镜像"] +Cleanup --> SelfDelete["删除自身"] +SelfDelete --> End([结束]) +``` + +**图示来源** +- [install-one.sh](file://manifest/docker/install-one.sh) + +**本节来源** +- [install-one.sh](file://manifest/docker/install-one.sh) + +#### install-simple.sh工作流程 +install-simple.sh提供交互式安装界面,用户通过数字选择要部署的应用。相比install-one.sh,该脚本更加注重用户体验,但功能相对简化。 + +```mermaid +flowchart TD +Start([开始]) --> ShowMenu["显示选项菜单"] +ShowMenu --> ReadChoice["读取用户选择"] +ReadChoice --> Validate["验证选择有效性"] +Validate --> MatchRepo["匹配仓库名称"] +MatchRepo --> Clone["克隆代码"] +Clone --> Pull["拉取最新代码"] +Pull --> ConditionalStop["条件停止容器"] +ConditionalStop --> Build["构建并启动容器"] +Build --> ConditionalStart["条件启动所有容器"] +ConditionalStart --> Cleanup["清理本地代码"] +Cleanup --> CleanupImages["清理悬空镜像"] +CleanupImages --> End([结束]) +``` + +**图示来源** +- [install-simple.sh](file://manifest/docker/install-simple.sh) + +**本节来源** +- [install-simple.sh](file://manifest/docker/install-simple.sh) + +### 服务依赖等待机制 + +#### wait-for-it.sh作用机制 +wait-for-it.sh脚本用于在容器启动时等待依赖服务的端口可用,确保服务间的正确启动顺序。该脚本通过netcat检查目标主机和端口的连通性。 + +```mermaid +sequenceDiagram +participant Script as wait-for-it.sh +participant Target as 目标服务 +participant Command as 后续命令 +Script->>Target : 检查host : port连通性 +loop 等待可用 +Target-->>Script : 连接失败 +Script->>Script : 等待1秒 +Script->>Target : 重试连接 +end +Target-->>Script : 连接成功 +Script->>Command : 执行后续命令 +``` + +**图示来源** +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +**本节来源** +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 依赖分析 +kami_backend的自动化部署系统依赖于Docker环境和git版本控制系统。各组件之间的依赖关系清晰,Makefile依赖于具体的shell脚本,而shell脚本又依赖于Docker和系统工具。 + +```mermaid +graph LR +Makefile --> install-one.sh +Makefile --> install-simple.sh +install-one.sh --> Docker +install-simple.sh --> Docker +install-one.sh --> git +install-simple.sh --> git +wait-for-it.sh --> netcat +Dockerfile --> alpine +Dockerfile --> golang +``` + +**图示来源** +- [Makefile](file://Makefile) +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) +- [Dockerfile](file://manifest/docker/Dockerfile) + +**本节来源** +- [Makefile](file://Makefile) +- [manifest/docker/](file://manifest/docker/) + +## 性能考虑 +自动化部署脚本在执行过程中会进行大量的磁盘I/O操作和网络通信。install-one.sh脚本的自我删除功能可以避免重复执行,而镜像清理机制有助于节省存储空间。建议在生产环境中使用SSD存储以提高部署效率。 + +## 故障排除指南 +当自动化部署出现问题时,应首先检查Docker服务状态和网络连接。对于install-one.sh和install-simple.sh脚本,可通过添加set -x指令启用调试模式,查看详细的执行过程。wait-for-it.sh脚本的超时问题通常源于目标服务未正确启动或防火墙配置不当。 + +**本节来源** +- [install-one.sh](file://manifest/docker/install-one.sh) +- [install-simple.sh](file://manifest/docker/install-simple.sh) +- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh) + +## 结论 +kami_backend项目建立了一套完整的自动化部署体系,通过Makefile、shell脚本和Docker技术的有机结合,实现了高效、可靠的部署流程。该体系既支持一键式完整部署,也提供灵活的选择性更新功能,同时通过服务依赖等待机制确保了微服务架构下的正确启动顺序。 + +## 附录 +本文档所涉及的自动化脚本均经过实际生产环境验证,可根据具体需求进行定制化修改。建议在实施CI/CD集成时,结合Drone等持续集成工具,进一步提升部署自动化水平。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/部署配置.md b/.qoder/repowiki/zh/content/部署配置/部署配置.md new file mode 100644 index 00000000..622693df --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/部署配置.md @@ -0,0 +1,276 @@ +# 部署配置 + + +**本文档中引用的文件** +- [config.yaml](file://manifest/config/config.yaml) +- [Dockerfile](file://manifest/docker/Dockerfile) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml) +- [install.sh](file://manifest/docker/install.sh) +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml) +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml) +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml) +- [configmap.yaml](file://manifest/deploy/kustomize/overlays/develop/configmap.yaml) +- [Makefile](file://Makefile) +- [hack.mk](file://hack/hack.mk) + + +## 目录 +1. [配置管理](#配置管理) +2. [Docker容器化部署](#docker容器化部署) +3. [自动化部署脚本](#自动化部署脚本) +4. [多环境配置与部署](#多环境配置与部署) +5. [Kustomize配置管理](#kustomize配置管理) +6. [部署检查清单与最佳实践](#部署检查清单与最佳实践) + +## 配置管理 + +`manifest/config/config.yaml` 文件是系统的核心配置文件,包含了服务器、数据库、缓存、安全等关键配置项。该文件采用YAML格式,结构清晰,便于维护。 + +**服务器配置**部分定义了服务监听地址、日志输出、访问控制等参数。`server.address` 指定服务监听端口,默认为":12401"。日志配置中,`logStdout` 控制是否输出到终端,`errorLogEnabled` 决定是否记录异常日志,`accessLogEnabled` 控制访问日志的开启状态。 + +**数据库配置**支持多数据源,当前配置了`default`和`v1`两个MySQL连接。每个数据源包含连接字符串、调试模式、字符集、连接池参数等。`maxOpen` 和 `maxIdle` 分别控制最大打开连接数和最大闲置连接数,对系统性能有重要影响。 + +**Redis配置**为缓存系统提供连接参数,包括地址、数据库编号、超时设置和最大活跃连接数。`idleTimeout` 和 `maxConnLifetime` 等参数确保连接的有效性和资源的合理利用。 + +**安全配置**包含加密密钥和令牌设置。`secret` 部分定义了前后端加密的密钥和初始化向量(IV),`token` 部分配置了令牌的超时时间、刷新策略和存储方式。 + +**第三方服务集成**配置了OAuth认证、通知平台等外部服务的连接信息,如天猫游戏网关、Agiso应用凭证等。 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L1-L104) + +## Docker容器化部署 + +### Dockerfile构建过程 + +`manifest/docker/Dockerfile` 文件定义了kami_backend服务的容器镜像构建流程,采用多阶段构建策略以减小最终镜像体积。 + +构建过程分为两个阶段:**构建阶段**使用 `golang:1.24-alpine` 作为基础镜像,设置Go模块代理,执行依赖整理和二进制编译。**运行阶段**基于轻量级的 `alpine:latest` 镜像,复制编译好的二进制文件和必要的资源文件(如静态资源和配置文件)。 + +运行阶段还配置了时区为亚洲/上海,安装了curl工具用于健康检查,并设置了 `HEALTHCHECK` 指令,通过curl命令定期检查服务的健康状态。容器暴露12401端口,通过CMD指令启动主程序。 + +### docker-compose编排配置 + +项目提供了两个docker-compose配置文件:`docker-compose.yml` 用于生产环境,`docker-compose-local.yaml` 用于本地开发。 + +**生产环境配置** (`docker-compose.yml`) 使用预构建的镜像,通过环境变量 `${DRONE_BRANCH}${DRONE_BUILD_NUMBER}` 实现版本控制。容器端口映射为 `127.0.0.1:22401:12401`,限制外部访问。通过volumes将日志目录和配置目录挂载到宿主机,实现日志持久化和配置热更新。容器连接到外部网络 `1panel-network`。 + +**本地开发配置** (`docker-compose-local.yaml`) 使用本地构建方式,直接从项目根目录构建镜像,便于开发调试。端口映射为 `127.0.0.1:12401:12401`,方便本地访问。同样挂载了必要的资源文件。 + +```mermaid +graph TD +A[Docker构建阶段] --> B[golang:1.24-alpine] +B --> C[复制源码] +C --> D[go mod tidy] +D --> E[go build] +E --> F[生成二进制] +G[Docker运行阶段] --> H[alpine:latest] +H --> I[复制二进制] +I --> J[复制资源文件] +J --> K[设置时区] +K --> L[安装curl] +L --> M[HEALTHCHECK] +M --> N[CMD启动] +F --> I +``` + +**Diagram sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) + +**Section sources** +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) + +## 自动化部署脚本 + +### Makefile自动化构建 + +`Makefile` 提供了标准化的构建和部署命令。通过包含 `hack/hack.mk` 文件,继承了GoFrame框架的构建能力。 + +关键目标包括: +- `up`: 更新GoFrame框架和CLI工具 +- `build`: 编译二进制文件 +- `dao`: 生成数据访问对象(DAO)代码 +- `image`: 构建Docker镜像,自动获取Git标签作为镜像版本 +- `image.push`: 构建并推送镜像到仓库 +- `deploy`: 部署应用到Kubernetes环境 + +`image` 目标通过Git描述自动生成镜像标签,支持脏工作区标记,确保版本可追溯。 + +### install.sh一键部署脚本 + +`manifest/docker/install.sh` 是一个功能完整的自动化部署脚本,支持多个kami系列应用的部署。 + +脚本流程: +1. 用户选择要部署的应用 +2. 克隆或更新代码仓库 +3. 停止并删除现有容器 +4. 停止所有Docker容器 +5. 根据应用类型使用相应的docker-compose文件构建并启动服务 +6. 重启所有kami_前缀的容器 +7. 清理临时文件和悬空镜像 +8. 自我删除 + +该脚本实现了从代码拉取到服务启动的完整自动化流程,大大简化了部署操作。 + +```mermaid +flowchart TD +Start([开始]) --> SelectApp["选择应用 (1-7)"] +SelectApp --> CheckRepo{"仓库存在?"} +CheckRepo --> |否| CloneRepo["克隆代码"] +CheckRepo --> |是| UpdateRepo["更新代码"] +CloneRepo --> CdRepo +UpdateRepo --> CdRepo +CdRepo --> StopContainer["停止现有容器"] +StopContainer --> StopAll["停止所有容器"] +StopAll --> BuildStart["构建并启动服务"] +BuildStart --> RestartKami["重启kami_容器"] +RestartKami --> Cleanup["清理临时文件"] +Cleanup --> RemoveDangling["删除悬空镜像"] +RemoveDangling --> SelfDelete["自我删除"] +SelfDelete --> End([完成]) +``` + +**Diagram sources** +- [Makefile](file://Makefile#L1-L6) +- [hack.mk](file://hack/hack.mk#L1-L75) +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +**Section sources** +- [Makefile](file://Makefile#L1-L6) +- [hack.mk](file://hack/hack.mk#L1-L75) +- [install.sh](file://manifest/docker/install.sh#L1-L144) + +## 多环境配置与部署 + +系统通过不同的配置文件和部署策略支持开发、测试、生产等多环境部署。 + +**开发环境**使用 `docker-compose-local.yaml`,直接从本地代码构建镜像,便于快速迭代。配置文件中的服务地址通常指向本地或开发服务器。 + +**测试环境**可能使用 `install-test.sh` 脚本(未在文件列表中显示,但命名暗示存在),配置指向测试数据库和第三方服务沙箱环境。 + +**生产环境**使用 `docker-compose.yml`,从镜像仓库拉取指定版本的镜像,确保部署一致性。配置文件中的服务地址指向生产环境的真实服务。 + +环境差异主要体现在: +- 镜像来源(本地构建 vs 仓库拉取) +- 数据库连接信息 +- 第三方服务API密钥 +- 日志级别和输出位置 +- 资源限制和副本数量 + +通过环境变量和不同的docker-compose文件,实现了配置与代码的分离,确保了环境间的一致性和安全性。 + +**Section sources** +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) +- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml#L1-L20) +- [config.yaml](file://manifest/config/config.yaml#L1-L104) + +## Kustomize配置管理 + +Kustomize用于Kubernetes环境下的配置管理,通过基础配置和环境覆盖实现配置的复用和差异化。 + +**基础配置**位于 `manifest/deploy/kustomize/base/` 目录,包含 `deployment.yaml` 和 `service.yaml` 两个资源文件,以及 `kustomization.yaml` 定义文件。基础配置定义了应用的基本部署结构,如副本数、容器镜像名称等。 + +**环境覆盖**位于 `manifest/deploy/kustomize/overlays/` 目录,当前有 `develop` 开发环境覆盖。覆盖配置通过 `kustomization.yaml` 引用基础配置,并添加或修改特定于环境的设置。 + +`develop/kustomization.yaml` 文件: +- 通过 `resources` 引用基础配置和额外的 `configmap.yaml` +- 使用 `patchesStrategicMerge` 对基础Deployment进行策略性合并补丁 +- 设置命名空间为 `default` + +`develop/configmap.yaml` 定义了一个ConfigMap,用于覆盖基础配置中的 `config.yaml` 内容,如修改服务器监听端口为8000。 + +`develop/deployment.yaml` 补丁文件将容器镜像修改为 `template-single:develop`,实现开发环境的特定版本部署。 + +这种分层配置管理方式实现了"一次编写,多处部署"的目标,提高了配置的可维护性和一致性。 + +```mermaid +graph TD +subgraph Base +B_Kustom["kustomization.yaml"] +B_Deploy["deployment.yaml"] +B_Service["service.yaml"] +end +subgraph Overlays +subgraph Develop +D_Kustom["kustomization.yaml"] +D_Config["configmap.yaml"] +D_Patch["deployment.yaml"] +end +end +B_Kustom --> D_Kustom +B_Deploy --> D_Patch +D_Kustom --> D_Config +D_Kustom --> D_Patch +``` + +**Diagram sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml#L1-L9) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml#L1-L15) +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml#L1-L22) +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml#L1-L10) +- [configmap.yaml](file://manifest/deploy/kustomize/overlays/develop/configmap.yaml#L1-L15) + +**Section sources** +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml#L1-L9) +- [kustomization.yaml](file://manifest/deploy/kustomize/overlays/develop/kustomization.yaml#L1-L15) +- [deployment.yaml](file://manifest/deploy/kustomize/base/deployment.yaml#L1-L22) +- [deployment.yaml](file://manifest/deploy/kustomize/overlays/develop/deployment.yaml#L1-L10) +- [configmap.yaml](file://manifest/deploy/kustomize/overlays/develop/configmap.yaml#L1-L15) + +## 部署检查清单与最佳实践 + +### 部署前检查清单 + +- [ ] 确认 `config.yaml` 中的数据库连接信息正确 +- [ ] 验证Redis服务可访问 +- [ ] 检查第三方服务API密钥有效 +- [ ] 确认日志目录有写入权限 +- [ ] 验证Docker和docker-compose已安装 +- [ ] 确保目标端口未被占用 + +### 部署后验证清单 + +- [ ] 检查容器状态为running +- [ ] 验证服务健康检查通过 +- [ ] 测试API端点可访问 +- [ ] 检查日志文件正常生成 +- [ ] 验证数据库连接正常 +- [ ] 确认缓存服务工作正常 + +### 最佳实践 + +**安全实践** +- 生产环境禁用 `accessLogEnabled` +- 定期轮换 `secret` 中的加密密钥 +- 使用专用的数据库用户,限制权限 +- 敏感信息通过环境变量注入,而非硬编码 + +**性能实践** +- 根据实际负载调整 `database.maxOpen` 连接池大小 +- 合理设置 `redis.maxActive` 避免资源耗尽 +- 监控连接池使用情况,及时发现瓶颈 + +**运维实践** +- 使用 `Makefile` 的 `image.push` 目标确保镜像版本可追溯 +- 定期清理悬空镜像和停止的容器 +- 备份重要配置文件 +- 建立部署回滚机制 + +**开发实践** +- 本地开发使用 `docker-compose-local.yaml` +- 避免在代码中硬编码环境相关配置 +- 使用Kustomize管理Kubernetes配置差异 +- 通过 `install.sh` 脚本实现一键部署 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L1-L104) +- [Dockerfile](file://manifest/docker/Dockerfile#L1-L41) +- [docker-compose.yml](file://manifest/docker/docker-compose.yml#L1-L19) +- [install.sh](file://manifest/docker/install.sh#L1-L144) +- [kustomization.yaml](file://manifest/deploy/kustomize/base/kustomization.yaml#L1-L9) \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/部署配置/配置管理.md b/.qoder/repowiki/zh/content/部署配置/配置管理.md new file mode 100644 index 00000000..a7dd5610 --- /dev/null +++ b/.qoder/repowiki/zh/content/部署配置/配置管理.md @@ -0,0 +1,233 @@ +# 配置管理 + + +**本文档引用的文件** +- [config.yaml](file://manifest/config/config.yaml) +- [config.go](file://utility/config/config.go) +- [database.go](file://utility/config/database.go) +- [models.go](file://utility/config/models.go) +- [otel/config.go](file://utility/otel/config.go) +- [otel/manager.go](file://utility/otel/manager.go) +- [otel/handler.go](file://utility/otel/handler.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心配置项分析](#核心配置项分析) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文档详细分析了kami_backend项目的配置管理系统,重点解析manifest/config/config.yaml文件中的各项配置参数。文档涵盖了数据库连接、Redis缓存、OpenTelemetry监控、第三方服务集成等配置项的具体含义和取值范围,解释了不同环境下的配置差异和最佳实践,描述了配置文件的加载机制和优先级,并提供了配置参数的验证方法和常见配置错误的排查指南。 + +## 项目结构 + +```mermaid +graph TD +A[配置管理] --> B[manifest/config/config.yaml] +A --> C[utility/config] +A --> D[utility/otel] +C --> E[config.go] +C --> F[database.go] +C --> G[models.go] +D --> H[config.go] +D --> I[manager.go] +D --> J[handler.go] +``` + +**Diagram sources** +- [config.yaml](file://manifest/config/config.yaml) +- [config.go](file://utility/config/config.go) +- [otel/config.go](file://utility/otel/config.go) + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml) +- [config.go](file://utility/config/config.go) + +## 核心配置项分析 + +### 服务器配置 +服务器配置定义了应用的基本运行参数,包括监听地址、日志设置、访问控制等。 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L1-L30) + +### 数据库配置 +数据库配置包含了多个数据库实例的连接信息,支持不同数据库的配置。 + +```mermaid +classDiagram +class DatabaseConfig { ++string link ++bool debug ++string charset ++bool dryRun ++int maxIdle ++int maxOpen ++string maxLifetime +} +class ServerConfig { ++string address ++int NameToUriType ++string maxHeaderBytes ++string clientMaxBodySize ++string logPath ++bool logStdout ++bool errorStack ++bool errorLogEnabled ++string errorLogPattern ++bool accessLogEnabled ++string accessLogPattern ++bool dumpRouterMap ++bool graceful ++int gracefulTimeout ++string openapiPath ++string swaggerPath +} +DatabaseConfig <|-- DefaultDatabase +DatabaseConfig <|-- V1Database +``` + +**Diagram sources** +- [config.yaml](file://manifest/config/config.yaml#L31-L53) +- [database.go](file://utility/config/database.go#L6-L8) + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L31-L53) +- [database.go](file://utility/config/database.go) + +### Redis配置 +Redis配置提供了缓存系统的连接参数,支持单实例配置。 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L55-L68) + +### OpenTelemetry配置 +OpenTelemetry配置用于分布式追踪和监控,包含服务名称、收集器URL、安全设置等。 + +```mermaid +classDiagram +class OTelConfig { ++string ServiceName ++string CollectorURL ++bool Insecure ++string Compressor ++map[string]string Headers ++time.Duration Timeout ++float64 SampleRate ++bool Enable ++[]attribute.KeyValue ResourceAttrs +} +OTelConfig --> DefaultConfig : "默认值" +``` + +**Diagram sources** +- [otel/config.go](file://utility/otel/config.go#L9-L19) +- [otel/config.go](file://utility/otel/config.go#L22-L31) + +**Section sources** +- [otel/config.go](file://utility/otel/config.go) + +### 第三方服务集成配置 +第三方服务集成配置包含了OAuth认证、通知平台等外部服务的连接信息。 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml#L80-L103) + +## 架构概述 + +```mermaid +graph TD +A[配置文件] --> B[配置加载器] +B --> C[服务器配置] +B --> D[数据库配置] +B --> E[Redis配置] +B --> F[OpenTelemetry配置] +B --> G[第三方服务配置] +C --> H[HTTP服务器] +D --> I[数据库连接池] +E --> J[缓存系统] +F --> K[监控系统] +G --> L[外部API集成] +``` + +**Diagram sources** +- [config.yaml](file://manifest/config/config.yaml) +- [config.go](file://utility/config/config.go) +- [otel/manager.go](file://utility/otel/manager.go) + +## 详细组件分析 + +### 配置加载机制 +配置加载机制使用GoFrame框架的配置系统,通过g.Cfg()获取配置实例。 + +```mermaid +sequenceDiagram +participant App as 应用程序 +participant Config as 配置系统 +participant File as config.yaml +App->>Config : NewConfig(ctx) +Config->>File : 读取配置文件 +File-->>Config : 返回配置数据 +Config-->>App : 返回配置实例 +App->>Config : Get(key) +Config-->>App : 返回配置值 +``` + +**Diagram sources** +- [config.go](file://utility/config/config.go#L12-L15) +- [config.go](file://utility/config/config.go#L141-L146) + +**Section sources** +- [config.go](file://utility/config/config.go) + +### 配置优先级 +配置系统支持多种配置源,优先级从高到低为:命令行参数 > 环境变量 > 配置文件。 + +**Section sources** +- [config.go](file://utility/config/config.go) + +## 依赖分析 + +```mermaid +graph LR +A[main.go] --> B[config.go] +B --> C[config.yaml] +B --> D[g.Cfg()] +E[otel/manager.go] --> F[otel/config.go] +F --> G[DefaultConfig()] +H[database.go] --> I[g.DB()] +``` + +**Diagram sources** +- [config.go](file://utility/config/config.go) +- [database.go](file://utility/config/database.go) +- [otel/manager.go](file://utility/otel/manager.go) + +**Section sources** +- [config.go](file://utility/config/config.go) +- [database.go](file://utility/config/database.go) +- [otel/manager.go](file://utility/otel/manager.go) + +## 性能考虑 +配置管理系统的性能主要体现在配置加载速度和内存占用上。系统采用懒加载策略,只在需要时才解析配置项,减少了启动时间。对于频繁访问的配置项,建议在应用启动时一次性读取并缓存。 + +## 故障排除指南 + +### 常见配置错误 +1. 数据库连接字符串格式错误 +2. Redis地址无法访问 +3. OpenTelemetry收集器URL配置错误 +4. 第三方服务密钥配置不正确 + +**Section sources** +- [config.yaml](file://manifest/config/config.yaml) +- [config.go](file://utility/config/config.go) + +## 结论 +kami_backend的配置管理系统设计合理,支持多种配置源和灵活的配置结构。通过YAML文件集中管理所有配置项,结合GoFrame框架的强大配置功能,实现了配置的可维护性和可扩展性。建议在生产环境中使用环境变量覆盖敏感配置,确保安全性。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/content/项目概述.md b/.qoder/repowiki/zh/content/项目概述.md new file mode 100644 index 00000000..108c3f8f --- /dev/null +++ b/.qoder/repowiki/zh/content/项目概述.md @@ -0,0 +1,500 @@ +# 项目概述 + + +**本文档引用文件** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [boot_enums.go](file://internal/boot/boot_enums.go) +- [sysUser_new.go](file://internal/controller/sysUser/sysUser_new.go) +- [road_new.go](file://internal/controller/road/road_new.go) +- [road_pool_new.go](file://internal/controller/road_pool/road_pool_new.go) +- [merchant_new.go](file://internal/controller/merchant/merchant_new.go) +- [order_new.go](file://internal/controller/order/order_new.go) +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_c_trip.go](file://api/card_info_c_trip/card_info_c_trip.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [sys_payment.go](file://api/sys_payment/sys_payment.go) +- [user_center.go](file://api/user_center/user_center.go) +- [restriction.go](file://api/restriction/restriction.go) +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go) +- [v_1_second_menu_info.go](file://internal/dao/internal/v_1_second_menu_info.go) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概述](#架构概述) +5. [详细组件分析](#详细组件分析) +6. [依赖分析](#依赖分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +kami_backend项目是一个基于GoFrame框架构建的电商平台卡密管理后端系统,旨在为京东、天猫、沃尔玛、Ctrip等多个主流电商平台提供统一的卡密充值与兑换、订单处理和账户管理API服务。该系统采用MVC(模型-视图-控制器)架构模式,实现了清晰的分层设计,包括API层、控制器层、服务层、业务逻辑层和数据访问层。系统通过模块化设计支持多个电商平台的集成,每个平台都有独立的API和控制器模块,确保了功能的可扩展性和维护性。项目利用Go语言的高性能特性,结合GoFrame框架提供的丰富功能,如路由管理、中间件支持、数据库操作等,构建了一个稳定、高效、易于维护的后端服务。系统还集成了OpenTelemetry进行可观测性监控,确保服务的稳定运行和问题的快速定位。 + +## 项目结构 + +```mermaid +graph TD +A[kami_backend] --> B[api] +A --> C[internal] +A --> D[utility] +A --> E[manifest] +A --> F[resource] +A --> G[main.go] +B --> B1[card_info_apple] +B --> B2[card_info_jd] +B --> B3[card_info_t_mall_game] +B --> B4[card_info_walmart] +B --> B5[card_info_c_trip] +B --> B6[card_redeem_jd] +B --> B7[merchant] +B --> B8[order] +B --> B9[sysUser] +B --> B10[sys_payment] +B --> B11[restriction] +C --> C1[controller] +C --> C2[service] +C --> C3[dao] +C --> C4[logic] +C --> C5[model] +C --> C6[consts] +C --> C7[cmd] +C --> C8[boot] +D --> D1[integration] +D --> D2[cron] +D --> D3[config] +D --> D4[utils] +E --> E1[config] +E --> E2[docker] +F --> F1[casbin] +``` + +**图示来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [boot_enums.go](file://internal/boot/boot_enums.go) + +**本节来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) + +## 核心组件 + +kami_backend项目的核心组件包括API接口层、控制器层、服务层、数据访问层和业务逻辑层。API接口层定义了与外部系统交互的RESTful API,每个电商平台都有独立的API模块,如`card_info_apple`、`card_info_jd`等,这些模块定义了具体的请求和响应结构。控制器层负责接收API请求,调用相应的服务层方法,并返回结果,每个控制器模块对应一个API模块,如`card_info_apple`控制器处理苹果卡密相关的请求。服务层实现了核心业务逻辑,如卡密充值、订单处理、账户管理等,提供了可重用的服务接口。数据访问层通过DAO(Data Access Object)模式封装了数据库操作,提供了对MySQL数据库的访问能力。业务逻辑层位于服务层之下,包含了具体的业务规则和流程处理。此外,系统还包含了一系列工具模块,如配置管理、定时任务、集成客户端等,支持系统的正常运行。整个系统通过GoFrame框架的依赖注入机制紧密耦合,确保了各组件之间的协调工作。 + +**本节来源** +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_c_trip.go](file://api/card_info_c_trip/card_info_c_trip.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) +- [merchant.go](file://api/merchant/merchant.go) +- [order.go](file://api/order/order.go) +- [sysUser.go](file://api/sysUser/sysUser.go) +- [sys_payment.go](file://api/sys_payment/sys_payment.go) +- [restriction.go](file://api/restriction/restriction.go) + +## 架构概述 + +```mermaid +graph TD +Client[客户端] --> API[API接口层] +API --> Controller[控制器层] +Controller --> Service[服务层] +Service --> Logic[业务逻辑层] +Service --> DAO[数据访问层] +DAO --> DB[(MySQL数据库)] +Service --> Cache[(Redis缓存)] +Utility[工具模块] --> Config[配置管理] +Utility --> Cron[定时任务] +Utility --> Integration[第三方集成] +Controller --> Middleware[中间件] +Middleware --> Auth[认证授权] +Middleware --> CORS[CORS处理] +Middleware --> ErrorHandler[错误处理] +Middleware --> Gzip[Gzip压缩] +Middleware --> NeverDoneCtx[永不完成上下文] +style Client fill:#f9f,stroke:#333 +style API fill:#bbf,stroke:#333 +style Controller fill:#f96,stroke:#333 +style Service fill:#6f9,stroke:#333 +style Logic fill:#69f,stroke:#333 +style DAO fill:#96f,stroke:#333 +style DB fill:#9f6,stroke:#333 +style Cache fill:#f69,stroke:#333 +style Utility fill:#ff6,stroke:#333 +style Config fill:#6ff,stroke:#333 +style Cron fill:#f66,stroke:#333 +style Integration fill:#66f,stroke:#333 +style Middleware fill:#ccc,stroke:#333 +style Auth fill:#c99,stroke:#333 +style CORS fill:#9c9,stroke:#333 +style ErrorHandler fill:#c9c,stroke:#333 +style Gzip fill:#9cc,stroke:#333 +style NeverDoneCtx fill:#cc9,stroke:#333 +``` + +**图示来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [sysUser_new.go](file://internal/controller/sysUser/sysUser_new.go) +- [road_new.go](file://internal/controller/road/road_new.go) +- [road_pool_new.go](file://internal/controller/road_pool/road_pool_new.go) +- [merchant_new.go](file://internal/controller/merchant/merchant_new.go) +- [order_new.go](file://internal/controller/order/order_new.go) + +## 详细组件分析 + +### API接口层分析 + +API接口层是系统与外部交互的入口,定义了所有对外提供的RESTful API。每个电商平台都有独立的API模块,如`card_info_apple`、`card_info_jd`等,这些模块通过GoFrame框架的路由系统注册到服务器。API模块定义了请求和响应的数据结构,使用Go的结构体标签来指定JSON字段名和验证规则。例如,`card_info_jd`模块定义了京东卡密充值的请求结构,包括礼品卡密码、商户ID、附加信息等字段。API层还集成了Swagger文档生成,方便开发者查看和测试API接口。 + +```mermaid +classDiagram +class CardInfoJdApi { ++SubmitReq ++SubmitRes ++ListReq ++ListRes ++OrderHistoryReq ++OrderHistoryRes ++OrderCallbackReq ++OrderCallbackRes +} +class CardInfoAppleApi { ++RechargeSubmitReq ++RechargeSubmitRes ++RechargeListReq ++RechargeListRes ++CardInfoListReq ++CardInfoListRes +} +class CardInfoTMallGameApi { ++OrderSubmitReq ++OrderSubmitRes ++OrderListReq ++OrderListRes ++AccountCreateReq ++AccountCreateRes +} +class CardInfoWalmartApi { ++OrderExportReq ++OrderExportRes ++OrderStatusResetReq ++OrderStatusResetRes ++AccountCreateReq ++AccountCreateRes +} +class CardInfoCTripApi { ++SubmitReq ++SubmitRes ++AccountListReq ++AccountListRes ++AccountCreateReq ++AccountCreateRes +} +class CardRedeemJdApi { ++PlaceOrderReq ++PlaceOrderRes ++AccountListReq ++AccountListRes ++AccountAddReq ++AccountAddRes +} +``` + +**图示来源** +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_c_trip.go](file://api/card_info_c_trip/card_info_c_trip.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) + +**本节来源** +- [card_info_jd.go](file://api/card_info_jd/card_info_jd.go) +- [card_info_apple.go](file://api/card_info_apple/card_info_apple.go) +- [card_info_t_mall_game.go](file://api/card_info_t_mall_game/card_info_t_mall_game.go) +- [card_info_walmart.go](file://api/card_info_walmart/card_info_walmart.go) +- [card_info_c_trip.go](file://api/card_info_c_trip/card_info_c_trip.go) +- [card_redeem_jd.go](file://api/card_redeem_jd/card_redeem_jd.go) + +### 控制器层分析 + +控制器层负责接收API请求,调用相应的服务层方法,并返回结果。每个控制器模块对应一个API模块,如`card_info_apple`控制器处理苹果卡密相关的请求。控制器通过GoFrame框架的依赖注入机制获取服务层实例,调用其方法完成业务逻辑处理。控制器还负责处理请求参数的验证、错误处理、日志记录等横切关注点。例如,`card_info_jd`控制器中的`Submit`方法接收京东卡密充值请求,调用`card_redeem_order`服务完成订单创建和处理。 + +```mermaid +sequenceDiagram +participant Client as 客户端 +participant API as API接口 +participant Controller as 控制器 +participant Service as 服务层 +participant Logic as 业务逻辑 +participant DAO as 数据访问层 +participant DB as 数据库 +Client->>API : 发送充值请求 +API->>Controller : 路由到控制器 +Controller->>Controller : 验证请求参数 +Controller->>Service : 调用服务方法 +Service->>Logic : 执行业务逻辑 +Logic->>DAO : 访问数据库 +DAO->>DB : 执行SQL查询 +DB-->>DAO : 返回查询结果 +DAO-->>Logic : 返回数据 +Logic-->>Service : 返回处理结果 +Service-->>Controller : 返回服务结果 +Controller-->>API : 返回响应 +API-->>Client : 返回JSON响应 +``` + +**图示来源** +- [cmd.go](file://internal/cmd/cmd.go) +- [sysUser_new.go](file://internal/controller/sysUser/sysUser_new.go) +- [road_new.go](file://internal/controller/road/road_new.go) +- [road_pool_new.go](file://internal/controller/road_pool/road_pool_new.go) +- [merchant_new.go](file://internal/controller/merchant/merchant_new.go) +- [order_new.go](file://internal/controller/order/order_new.go) + +**本节来源** +- [cmd.go](file://internal/cmd/cmd.go) +- [sysUser_new.go](file://internal/controller/sysUser/sysUser_new.go) +- [road_new.go](file://internal/controller/road/road_new.go) +- [road_pool_new.go](file://internal/controller/road_pool/road_pool_new.go) +- [merchant_new.go](file://internal/controller/merchant/merchant_new.go) +- [order_new.go](file://internal/controller/order/order_new.go) + +### 服务层分析 + +服务层实现了系统的核心业务逻辑,提供了可重用的服务接口。每个服务模块对应一个业务领域,如`card_apple_account`服务处理苹果卡密账户相关逻辑,`card_redeem_order`服务处理卡密兑换订单逻辑。服务层通过依赖注入获取数据访问层实例,调用其方法完成数据库操作。服务层还负责事务管理、缓存操作、第三方服务调用等。例如,`card_redeem_order`服务在创建订单时,会启动数据库事务,确保订单创建和库存扣减的原子性。 + +```mermaid +classDiagram +class SysAuthRuleService { ++GetRuleList(ctx, req) Res ++AddRule(ctx, req) Res ++UpdateRule(ctx, req) Res ++DeleteRule(ctx, req) Res +} +class CardAppleAccountService { ++CreateAccount(ctx, req) Res ++UpdateAccount(ctx, req) Res ++DeleteAccount(ctx, req) Res ++GetAccountList(ctx, req) Res +} +class CardRedeemOrderService { ++CreateOrder(ctx, req) Res ++UpdateOrderStatus(ctx, req) Res ++GetOrderList(ctx, req) Res ++HandleCallback(ctx, req) Res +} +class CardTMallOrderService { ++SubmitOrder(ctx, req) Res ++QueryOrder(ctx, req) Res ++SyncOrderData(ctx, req) Res ++GetDailySummary(ctx, req) Res +} +class SysUserService { ++CreateUser(ctx, req) Res ++UpdateUser(ctx, req) Res ++DeleteUser(ctx, req) Res ++GetUserList(ctx, req) Res ++Authenticate(ctx, req) Res +} +class MerchantDeployInfoService { ++AddDeployInfo(ctx, req) Res ++UpdateDeployInfo(ctx, req) Res ++GetDeployInfoList(ctx, req) Res ++GetDeployDetail(ctx, req) Res +} +SysAuthRuleService --> DAO : 使用 +CardAppleAccountService --> DAO : 使用 +CardRedeemOrderService --> DAO : 使用 +CardTMallOrderService --> DAO : 使用 +SysUserService --> DAO : 使用 +MerchantDeployInfoService --> DAO : 使用 +SysAuthRuleService --> Cache : 使用 +CardAppleAccountService --> Cache : 使用 +CardRedeemOrderService --> Cache : 使用 +CardTMallOrderService --> Cache : 使用 +SysUserService --> Cache : 使用 +MerchantDeployInfoService --> Cache : 使用 +CardRedeemOrderService --> Integration : 调用 +CardTMallOrderService --> Integration : 调用 +``` + +**图示来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go) + +**本节来源** +- [sys_auth_rule.go](file://internal/service/sys_auth_rule.go) +- [card_apple_account.go](file://internal/service/card_apple_account.go) +- [card_redeem_order.go](file://internal/service/card_redeem_order.go) +- [card_t_mall_order.go](file://internal/service/card_t_mall_order.go) +- [sys_user.go](file://internal/service/sys_user.go) +- [merchant_deploy_info.go](file://internal/service/merchant_deploy_info.go) + +### 数据访问层分析 + +数据访问层通过DAO(Data Access Object)模式封装了数据库操作,提供了对MySQL数据库的访问能力。每个DAO类对应一个数据库表,提供了基本的CRUD操作。DAO层使用GoFrame框架的gdb模块进行数据库操作,支持事务管理、连接池、SQL构建等功能。DAO类通过静态实例暴露给上层调用,如`V1SecondMenuInfoDao`类提供了对`second_menu_info`表的访问。DAO层还支持自定义查询方法,可以在DAO类中添加特定的查询逻辑。 + +```mermaid +classDiagram +class V1SecondMenuInfoDao { +-group : string +-table : string +-columns : V1SecondMenuInfoColumns +-handlers : []gdb.ModelHandler ++DB() gdb.DB ++Table() string ++Columns() V1SecondMenuInfoColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error ++NewV1SecondMenuInfoDao(handlers ...gdb.ModelHandler) *V1SecondMenuInfoDao +} +class V1CardAppleAccountInfoDao { +-group : string +-table : string +-columns : V1CardAppleAccountInfoColumns +-handlers : []gdb.ModelHandler ++DB() gdb.DB ++Table() string ++Columns() V1CardAppleAccountInfoColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error ++NewV1CardAppleAccountInfoDao(handlers ...gdb.ModelHandler) *V1CardAppleAccountInfoDao +} +class V1CardRedeemOrderInfoDao { +-group : string +-table : string +-columns : V1CardRedeemOrderInfoColumns +-handlers : []gdb.ModelHandler ++DB() gdb.DB ++Table() string ++Columns() V1CardRedeemOrderInfoColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error ++NewV1CardRedeemOrderInfoDao(handlers ...gdb.ModelHandler) *V1CardRedeemOrderInfoDao +} +class V1RechargeTMallOrderDao { +-group : string +-table : string +-columns : V1RechargeTMallOrderColumns +-handlers : []gdb.ModelHandler ++DB() gdb.DB ++Table() string ++Columns() V1RechargeTMallOrderColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error ++NewV1RechargeTMallOrderDao(handlers ...gdb.ModelHandler) *V1RechargeTMallOrderDao +} +class V1SysUserDao { +-group : string +-table : string +-columns : V1SysUserColumns +-handlers : []gdb.ModelHandler ++DB() gdb.DB ++Table() string ++Columns() V1SysUserColumns ++Group() string ++Ctx(ctx context.Context) *gdb.Model ++Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) error ++NewV1SysUserDao(handlers ...gdb.ModelHandler) *V1SysUserDao +} +V1SecondMenuInfoDao --> DB : 访问 +V1CardAppleAccountInfoDao --> DB : 访问 +V1CardRedeemOrderInfoDao --> DB : 访问 +V1RechargeTMallOrderDao --> DB : 访问 +V1SysUserDao --> DB : 访问 +``` + +**图示来源** +- [v_1_second_menu_info.go](file://internal/dao/internal/v_1_second_menu_info.go) + +**本节来源** +- [v_1_second_menu_info.go](file://internal/dao/internal/v_1_second_menu_info.go) + +## 依赖分析 + +```mermaid +graph TD +A[kami_backend] --> B[GoFrame框架] +A --> C[MySQL数据库] +A --> D[Redis缓存] +A --> E[OpenTelemetry] +A --> F[京东API] +A --> G[天猫API] +A --> H[沃尔玛API] +I[Ctrip API] --> A +J[Agiso集成] --> A +B --> K[goframe/gf/v2] +B --> L[gogf/gf/contrib/drivers/mysql/v2] +B --> M[gogf/gf/contrib/nosql/redis/v2] +C --> N[MySQL 8.0+] +D --> O[Redis 6.0+] +E --> P[OpenTelemetry Collector] +F --> Q[京东开放平台] +G --> R[天猫开放平台] +H --> S[沃尔玛开发者中心] +I --> T[Ctrip开发者平台] +J --> U[Agiso内部系统] +style A fill:#f9f,stroke:#333 +style B fill:#bbf,stroke:#333 +style C fill:#9f6,stroke:#333 +style D fill:#f69,stroke:#333 +style E fill:#6ff,stroke:#333 +style F fill:#f66,stroke:#333 +style G fill:#66f,stroke:#333 +style H fill:#96f,stroke:#333 +style I fill:#69f,stroke:#333 +style J fill:#c99,stroke:#333 +``` + +**图示来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [boot_enums.go](file://internal/boot/boot_enums.go) +- [utility/integration/tmall/topsdk/ability648/domain/TaobaoTradeGetTrade.go](file://utility/integration/tmall/topsdk/ability648/domain/TaobaoTradeGetTrade.go) +- [utility/integration/walmart/api.go](file://utility/integration/redeem/walmart/api.go) +- [utility/integration/ctrip/api.go](file://utility/integration/redeem/ctrip/api.go) +- [utility/integration/agiso/api.go](file://utility/integration/agiso/api.go) + +**本节来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [boot_enums.go](file://internal/boot/boot_enums.go) + +## 性能考虑 +kami_backend项目在设计时充分考虑了性能因素,采用了多种优化策略确保系统的高效运行。首先,系统利用Go语言的并发特性,通过goroutine和channel实现高并发处理能力,能够同时处理大量API请求。其次,系统集成了Redis缓存,将频繁访问的数据存储在内存中,减少数据库查询压力,提高响应速度。数据库层面,系统使用了连接池技术,复用数据库连接,避免频繁创建和销毁连接的开销。ORM框架GoFrame的gdb模块提供了高效的SQL构建和执行能力,支持预编译语句和批量操作,进一步提升了数据库操作性能。此外,系统还实现了请求级别的缓存和结果缓存,避免重复计算和查询。对于耗时较长的操作,如数据同步、报表生成等,系统采用异步处理和定时任务机制,避免阻塞主线程。OpenTelemetry的集成使得系统能够实时监控性能指标,及时发现和解决性能瓶颈。 + +## 故障排除指南 +当kami_backend系统出现故障时,可以按照以下步骤进行排查和解决。首先,检查系统日志,通过`glog`模块输出的日志信息定位问题发生的位置和原因。日志级别包括Info、Debug、Warning和Error,可以根据需要调整日志级别获取更详细的信息。其次,检查OpenTelemetry监控数据,查看系统性能指标、请求延迟、错误率等,判断是否存在性能瓶颈或异常流量。对于数据库相关问题,可以检查数据库连接状态、查询性能、锁等待等情况,优化SQL语句或调整数据库配置。对于第三方API调用失败,需要检查网络连接、API密钥、请求频率限制等,确保与第三方系统的正常通信。系统还提供了健康检查接口,可以通过`/api/monitor/healthcheck`端点检查系统各组件的运行状态。对于复杂的业务逻辑问题,可以启用调试模式,逐步跟踪代码执行流程,定位问题根源。最后,确保系统配置文件正确,包括数据库连接字符串、Redis地址、第三方API密钥等,避免因配置错误导致系统异常。 + +**本节来源** +- [main.go](file://main.go) +- [cmd.go](file://internal/cmd/cmd.go) +- [monitor.go](file://internal/controller/monitor/monitor.go) +- [monitor_new.go](file://internal/controller/monitor/monitor_new.go) + +## 结论 +kami_backend项目是一个功能完善、架构清晰的电商平台卡密管理后端系统,基于GoFrame框架构建,采用了MVC架构模式,实现了模块化、可扩展的设计。系统通过API层、控制器层、服务层、业务逻辑层和数据访问层的分层设计,确保了代码的可维护性和可测试性。项目支持多个主流电商平台的集成,包括京东、天猫、沃尔玛、Ctrip等,提供了统一的卡密充值与兑换、订单处理和账户管理API服务。系统利用Go语言的高性能特性,结合Redis缓存、数据库连接池、异步处理等技术,确保了高并发场景下的稳定运行。OpenTelemetry的集成提供了全面的可观测性支持,便于系统监控和问题排查。未来,系统可以进一步优化性能,增加更多的电商平台支持,完善安全机制,提升用户体验。总体而言,kami_backend项目是一个高质量的后端解决方案,能够满足电商平台卡密管理的复杂需求。 \ No newline at end of file diff --git a/.qoder/repowiki/zh/meta/repowiki-metadata.json b/.qoder/repowiki/zh/meta/repowiki-metadata.json new file mode 100644 index 00000000..7ed53d10 --- /dev/null +++ b/.qoder/repowiki/zh/meta/repowiki-metadata.json @@ -0,0 +1 @@ +{"knowledge_relations":[{"id":1,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"2ad8c87e-fc50-4b1e-a30b-80f4412ab361","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e 2ad8c87e-fc50-4b1e-a30b-80f4412ab361","gmt_create":"2025-10-08T19:06:55.3221392+08:00","gmt_modified":"2025-10-08T19:06:55.3221392+08:00"},{"id":2,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e e430fbbe-6369-43d2-91f0-806ad7bd9eb8","gmt_create":"2025-10-08T19:06:55.3348368+08:00","gmt_modified":"2025-10-08T19:06:55.3348368+08:00"},{"id":3,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"aa28412e-070f-4b61-80cd-dce192e20222","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e aa28412e-070f-4b61-80cd-dce192e20222","gmt_create":"2025-10-08T19:06:55.3450297+08:00","gmt_modified":"2025-10-08T19:06:55.3450297+08:00"},{"id":4,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"7b9b8434-cebf-4493-9f0c-5f637ed76c88","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e 7b9b8434-cebf-4493-9f0c-5f637ed76c88","gmt_create":"2025-10-08T19:06:55.355558+08:00","gmt_modified":"2025-10-08T19:06:55.355558+08:00"},{"id":5,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"5634b703-c76b-4ff5-a118-094768c7647c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e 5634b703-c76b-4ff5-a118-094768c7647c","gmt_create":"2025-10-08T19:06:55.3647031+08:00","gmt_modified":"2025-10-08T19:06:55.3647031+08:00"},{"id":6,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"d23cc27b-1f00-4a1c-b380-ecf970b24500","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e d23cc27b-1f00-4a1c-b380-ecf970b24500","gmt_create":"2025-10-08T19:06:55.3751581+08:00","gmt_modified":"2025-10-08T19:06:55.3751581+08:00"},{"id":7,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"cccc8700-b0e6-4056-afd4-f013bc40f805","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e cccc8700-b0e6-4056-afd4-f013bc40f805","gmt_create":"2025-10-08T19:06:55.3856081+08:00","gmt_modified":"2025-10-08T19:06:55.3856081+08:00"},{"id":8,"source_id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","target_id":"fed3b59c-0a3f-410d-b9b3-46b694361e86","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: efe5f5ab-5617-4174-a512-fe883ed4d5d3 -\u003e fed3b59c-0a3f-410d-b9b3-46b694361e86","gmt_create":"2025-10-08T19:06:55.3956415+08:00","gmt_modified":"2025-10-08T19:06:55.3956415+08:00"},{"id":9,"source_id":"2cca8166-9978-4afd-bc29-12d24f30511b","target_id":"1b282661-aef7-449c-bd9a-a8eaf6f14441","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2cca8166-9978-4afd-bc29-12d24f30511b -\u003e 1b282661-aef7-449c-bd9a-a8eaf6f14441","gmt_create":"2025-10-08T19:06:55.4055402+08:00","gmt_modified":"2025-10-08T19:06:55.4055402+08:00"},{"id":10,"source_id":"2cca8166-9978-4afd-bc29-12d24f30511b","target_id":"8a68e396-b4eb-49d5-9cc8-d6769cc9d293","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2cca8166-9978-4afd-bc29-12d24f30511b -\u003e 8a68e396-b4eb-49d5-9cc8-d6769cc9d293","gmt_create":"2025-10-08T19:06:55.4158703+08:00","gmt_modified":"2025-10-08T19:06:55.4158703+08:00"},{"id":11,"source_id":"2cca8166-9978-4afd-bc29-12d24f30511b","target_id":"d22c2dac-c15a-4fe9-8ecd-c9fb99de06c1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2cca8166-9978-4afd-bc29-12d24f30511b -\u003e d22c2dac-c15a-4fe9-8ecd-c9fb99de06c1","gmt_create":"2025-10-08T19:06:55.4268431+08:00","gmt_modified":"2025-10-08T19:06:55.4268431+08:00"},{"id":12,"source_id":"2cca8166-9978-4afd-bc29-12d24f30511b","target_id":"cc3d65ef-7d45-4f41-92d4-543c54d6976f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2cca8166-9978-4afd-bc29-12d24f30511b -\u003e cc3d65ef-7d45-4f41-92d4-543c54d6976f","gmt_create":"2025-10-08T19:06:55.4367806+08:00","gmt_modified":"2025-10-08T19:06:55.4367806+08:00"},{"id":13,"source_id":"2cca8166-9978-4afd-bc29-12d24f30511b","target_id":"86be688d-c6c8-478a-a186-c4b69e3a5389","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2cca8166-9978-4afd-bc29-12d24f30511b -\u003e 86be688d-c6c8-478a-a186-c4b69e3a5389","gmt_create":"2025-10-08T19:06:55.4471759+08:00","gmt_modified":"2025-10-08T19:06:55.4471759+08:00"},{"id":14,"source_id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","target_id":"1c2ff1ac-8239-428c-a7e4-588909d7b8a9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 72ce2c2b-8a00-4d8f-95e0-d0db70b17151 -\u003e 1c2ff1ac-8239-428c-a7e4-588909d7b8a9","gmt_create":"2025-10-08T19:06:55.4576905+08:00","gmt_modified":"2025-10-08T19:06:55.4576905+08:00"},{"id":15,"source_id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","target_id":"f3a5aa78-1844-44d4-8c02-90fa1c4a617a","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 72ce2c2b-8a00-4d8f-95e0-d0db70b17151 -\u003e f3a5aa78-1844-44d4-8c02-90fa1c4a617a","gmt_create":"2025-10-08T19:06:55.4681061+08:00","gmt_modified":"2025-10-08T19:06:55.4681061+08:00"},{"id":16,"source_id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","target_id":"26ded6ee-4f47-4b84-959d-4b880ce5feaf","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 72ce2c2b-8a00-4d8f-95e0-d0db70b17151 -\u003e 26ded6ee-4f47-4b84-959d-4b880ce5feaf","gmt_create":"2025-10-08T19:06:55.4790881+08:00","gmt_modified":"2025-10-08T19:06:55.4790881+08:00"},{"id":17,"source_id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","target_id":"e022f533-9479-4d7b-ac30-98df4f993dae","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 72ce2c2b-8a00-4d8f-95e0-d0db70b17151 -\u003e e022f533-9479-4d7b-ac30-98df4f993dae","gmt_create":"2025-10-08T19:06:55.4892041+08:00","gmt_modified":"2025-10-08T19:06:55.4892041+08:00"},{"id":18,"source_id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","target_id":"b72d2b05-3702-497e-9920-c16753190c30","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 72ce2c2b-8a00-4d8f-95e0-d0db70b17151 -\u003e b72d2b05-3702-497e-9920-c16753190c30","gmt_create":"2025-10-08T19:06:55.4991649+08:00","gmt_modified":"2025-10-08T19:06:55.4991649+08:00"},{"id":19,"source_id":"d1f058b7-b773-4a52-a247-ca202179a38a","target_id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d1f058b7-b773-4a52-a247-ca202179a38a -\u003e b154cecf-5b26-4ce2-a877-4bf26722c8fa","gmt_create":"2025-10-08T19:06:55.5083893+08:00","gmt_modified":"2025-10-08T19:06:55.5083893+08:00"},{"id":20,"source_id":"d1f058b7-b773-4a52-a247-ca202179a38a","target_id":"eb9554e2-6b58-4299-ba8e-014d67b58d27","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d1f058b7-b773-4a52-a247-ca202179a38a -\u003e eb9554e2-6b58-4299-ba8e-014d67b58d27","gmt_create":"2025-10-08T19:06:55.5187773+08:00","gmt_modified":"2025-10-08T19:06:55.5187773+08:00"},{"id":21,"source_id":"d1f058b7-b773-4a52-a247-ca202179a38a","target_id":"e0c77bdf-d688-4314-a114-f9c68f33f989","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d1f058b7-b773-4a52-a247-ca202179a38a -\u003e e0c77bdf-d688-4314-a114-f9c68f33f989","gmt_create":"2025-10-08T19:06:55.5287019+08:00","gmt_modified":"2025-10-08T19:06:55.5287019+08:00"},{"id":22,"source_id":"1d1fe734-c124-45bd-8e0e-7e257637147c","target_id":"0d50c325-08fc-4fc2-9975-8900a05e1f79","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1d1fe734-c124-45bd-8e0e-7e257637147c -\u003e 0d50c325-08fc-4fc2-9975-8900a05e1f79","gmt_create":"2025-10-08T19:06:55.5385896+08:00","gmt_modified":"2025-10-08T19:06:55.5385896+08:00"},{"id":23,"source_id":"1d1fe734-c124-45bd-8e0e-7e257637147c","target_id":"0b98c6a7-2c63-4de8-b96e-5c9438553444","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1d1fe734-c124-45bd-8e0e-7e257637147c -\u003e 0b98c6a7-2c63-4de8-b96e-5c9438553444","gmt_create":"2025-10-08T19:06:55.5485916+08:00","gmt_modified":"2025-10-08T19:06:55.5485916+08:00"},{"id":24,"source_id":"1d1fe734-c124-45bd-8e0e-7e257637147c","target_id":"4084eb3d-9044-4535-b095-d22e7043730d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1d1fe734-c124-45bd-8e0e-7e257637147c -\u003e 4084eb3d-9044-4535-b095-d22e7043730d","gmt_create":"2025-10-08T19:06:55.5589262+08:00","gmt_modified":"2025-10-08T19:06:55.5589262+08:00"},{"id":25,"source_id":"1d1fe734-c124-45bd-8e0e-7e257637147c","target_id":"f34f25dc-7c0c-4261-a3a6-951d7146367e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1d1fe734-c124-45bd-8e0e-7e257637147c -\u003e f34f25dc-7c0c-4261-a3a6-951d7146367e","gmt_create":"2025-10-08T19:06:55.5688385+08:00","gmt_modified":"2025-10-08T19:06:55.5688385+08:00"},{"id":26,"source_id":"2596be88-c8af-4fb3-92c6-b20acc278dd4","target_id":"92827d43-4b07-4062-a8d2-10f86e815288","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2596be88-c8af-4fb3-92c6-b20acc278dd4 -\u003e 92827d43-4b07-4062-a8d2-10f86e815288","gmt_create":"2025-10-08T19:06:55.5782904+08:00","gmt_modified":"2025-10-08T19:06:55.5782904+08:00"},{"id":27,"source_id":"2596be88-c8af-4fb3-92c6-b20acc278dd4","target_id":"d1a1035e-72f5-4027-82c3-d1d30d2ddcf0","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2596be88-c8af-4fb3-92c6-b20acc278dd4 -\u003e d1a1035e-72f5-4027-82c3-d1d30d2ddcf0","gmt_create":"2025-10-08T19:06:55.5882649+08:00","gmt_modified":"2025-10-08T19:06:55.5882649+08:00"},{"id":28,"source_id":"2596be88-c8af-4fb3-92c6-b20acc278dd4","target_id":"9698be30-efe1-4f48-8e31-4eb41942794b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2596be88-c8af-4fb3-92c6-b20acc278dd4 -\u003e 9698be30-efe1-4f48-8e31-4eb41942794b","gmt_create":"2025-10-08T19:06:55.5976184+08:00","gmt_modified":"2025-10-08T19:06:55.5976184+08:00"},{"id":29,"source_id":"2596be88-c8af-4fb3-92c6-b20acc278dd4","target_id":"b0ac5f4c-4638-4b5b-bdaf-65aa7255d0bd","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2596be88-c8af-4fb3-92c6-b20acc278dd4 -\u003e b0ac5f4c-4638-4b5b-bdaf-65aa7255d0bd","gmt_create":"2025-10-08T19:06:55.607657+08:00","gmt_modified":"2025-10-08T19:06:55.607657+08:00"},{"id":30,"source_id":"1c2ff1ac-8239-428c-a7e4-588909d7b8a9","target_id":"43b20c2e-ec0e-421f-b164-49961f882c41","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c2ff1ac-8239-428c-a7e4-588909d7b8a9 -\u003e 43b20c2e-ec0e-421f-b164-49961f882c41","gmt_create":"2025-10-08T19:06:55.6198684+08:00","gmt_modified":"2025-10-08T19:06:55.6198684+08:00"},{"id":31,"source_id":"1c2ff1ac-8239-428c-a7e4-588909d7b8a9","target_id":"1c9611c6-fe35-416b-9f4f-0a461e074d45","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c2ff1ac-8239-428c-a7e4-588909d7b8a9 -\u003e 1c9611c6-fe35-416b-9f4f-0a461e074d45","gmt_create":"2025-10-08T19:06:55.6297596+08:00","gmt_modified":"2025-10-08T19:06:55.6297596+08:00"},{"id":32,"source_id":"1c2ff1ac-8239-428c-a7e4-588909d7b8a9","target_id":"2a27401a-612a-49d9-a7f4-28fad5a152e5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c2ff1ac-8239-428c-a7e4-588909d7b8a9 -\u003e 2a27401a-612a-49d9-a7f4-28fad5a152e5","gmt_create":"2025-10-08T19:06:55.6397336+08:00","gmt_modified":"2025-10-08T19:06:55.6397336+08:00"},{"id":33,"source_id":"2ad8c87e-fc50-4b1e-a30b-80f4412ab361","target_id":"08f602b3-4b0b-48b1-90d8-e9ad4c3a8e8e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ad8c87e-fc50-4b1e-a30b-80f4412ab361 -\u003e 08f602b3-4b0b-48b1-90d8-e9ad4c3a8e8e","gmt_create":"2025-10-08T19:06:55.6499113+08:00","gmt_modified":"2025-10-08T19:06:55.6499113+08:00"},{"id":34,"source_id":"2ad8c87e-fc50-4b1e-a30b-80f4412ab361","target_id":"8259d8cb-a84f-4158-bc5d-61dfae91ef1b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ad8c87e-fc50-4b1e-a30b-80f4412ab361 -\u003e 8259d8cb-a84f-4158-bc5d-61dfae91ef1b","gmt_create":"2025-10-08T19:06:55.6604433+08:00","gmt_modified":"2025-10-08T19:06:55.6604433+08:00"},{"id":35,"source_id":"2ad8c87e-fc50-4b1e-a30b-80f4412ab361","target_id":"c6704fce-fd88-4486-b13f-75c0c8e41d3e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2ad8c87e-fc50-4b1e-a30b-80f4412ab361 -\u003e c6704fce-fd88-4486-b13f-75c0c8e41d3e","gmt_create":"2025-10-08T19:06:55.671357+08:00","gmt_modified":"2025-10-08T19:06:55.671357+08:00"},{"id":36,"source_id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","target_id":"f6124145-1fee-4e5d-a268-3114e12f5d58","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b154cecf-5b26-4ce2-a877-4bf26722c8fa -\u003e f6124145-1fee-4e5d-a268-3114e12f5d58","gmt_create":"2025-10-08T19:06:55.6810918+08:00","gmt_modified":"2025-10-08T19:06:55.6810918+08:00"},{"id":37,"source_id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","target_id":"56fd88b9-812b-4271-ab3c-ea429f4aa7f2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b154cecf-5b26-4ce2-a877-4bf26722c8fa -\u003e 56fd88b9-812b-4271-ab3c-ea429f4aa7f2","gmt_create":"2025-10-08T19:06:55.6915051+08:00","gmt_modified":"2025-10-08T19:06:55.6915051+08:00"},{"id":38,"source_id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","target_id":"5ee266a2-157f-46a5-b501-7be3e57b4fa5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b154cecf-5b26-4ce2-a877-4bf26722c8fa -\u003e 5ee266a2-157f-46a5-b501-7be3e57b4fa5","gmt_create":"2025-10-08T19:06:55.7030066+08:00","gmt_modified":"2025-10-08T19:06:55.7030066+08:00"},{"id":39,"source_id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","target_id":"51d7f832-6c1f-4084-9e39-b2ab80211a4f","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b154cecf-5b26-4ce2-a877-4bf26722c8fa -\u003e 51d7f832-6c1f-4084-9e39-b2ab80211a4f","gmt_create":"2025-10-08T19:06:55.7128247+08:00","gmt_modified":"2025-10-08T19:06:55.7128247+08:00"},{"id":40,"source_id":"f3a5aa78-1844-44d4-8c02-90fa1c4a617a","target_id":"5d2b1aff-1b72-4b4d-81ef-292b6fb141ea","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f3a5aa78-1844-44d4-8c02-90fa1c4a617a -\u003e 5d2b1aff-1b72-4b4d-81ef-292b6fb141ea","gmt_create":"2025-10-08T19:06:55.725495+08:00","gmt_modified":"2025-10-08T19:06:55.725495+08:00"},{"id":41,"source_id":"f3a5aa78-1844-44d4-8c02-90fa1c4a617a","target_id":"82a92b25-0996-44c1-b938-ad2fd9c3ee20","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f3a5aa78-1844-44d4-8c02-90fa1c4a617a -\u003e 82a92b25-0996-44c1-b938-ad2fd9c3ee20","gmt_create":"2025-10-08T19:06:55.7378213+08:00","gmt_modified":"2025-10-08T19:06:55.7378213+08:00"},{"id":42,"source_id":"f3a5aa78-1844-44d4-8c02-90fa1c4a617a","target_id":"ddcac11a-602a-44c4-89ee-1bbc9832b51b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: f3a5aa78-1844-44d4-8c02-90fa1c4a617a -\u003e ddcac11a-602a-44c4-89ee-1bbc9832b51b","gmt_create":"2025-10-08T19:06:55.7477932+08:00","gmt_modified":"2025-10-08T19:06:55.7477932+08:00"},{"id":43,"source_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","target_id":"57522f63-5c80-42f4-a421-d7e20cf4a13e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e430fbbe-6369-43d2-91f0-806ad7bd9eb8 -\u003e 57522f63-5c80-42f4-a421-d7e20cf4a13e","gmt_create":"2025-10-08T19:06:55.7595223+08:00","gmt_modified":"2025-10-08T19:06:55.7595223+08:00"},{"id":44,"source_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","target_id":"dc85413e-c17d-490c-b208-8fbdfa1e2780","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e430fbbe-6369-43d2-91f0-806ad7bd9eb8 -\u003e dc85413e-c17d-490c-b208-8fbdfa1e2780","gmt_create":"2025-10-08T19:06:55.768705+08:00","gmt_modified":"2025-10-08T19:06:55.768705+08:00"},{"id":45,"source_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","target_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e430fbbe-6369-43d2-91f0-806ad7bd9eb8 -\u003e e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","gmt_create":"2025-10-08T19:06:55.7799297+08:00","gmt_modified":"2025-10-08T19:06:55.7799297+08:00"},{"id":46,"source_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","target_id":"e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e430fbbe-6369-43d2-91f0-806ad7bd9eb8 -\u003e e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","gmt_create":"2025-10-08T19:06:55.7901975+08:00","gmt_modified":"2025-10-08T19:06:55.7901975+08:00"},{"id":47,"source_id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","target_id":"74369849-81b3-448a-8fe3-b57ee480b416","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e430fbbe-6369-43d2-91f0-806ad7bd9eb8 -\u003e 74369849-81b3-448a-8fe3-b57ee480b416","gmt_create":"2025-10-08T19:06:55.8050912+08:00","gmt_modified":"2025-10-08T19:06:55.8050912+08:00"},{"id":48,"source_id":"d1a1035e-72f5-4027-82c3-d1d30d2ddcf0","target_id":"0e508eb5-9f7d-423f-a16a-a4a26053ffaf","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d1a1035e-72f5-4027-82c3-d1d30d2ddcf0 -\u003e 0e508eb5-9f7d-423f-a16a-a4a26053ffaf","gmt_create":"2025-10-08T19:06:55.8170054+08:00","gmt_modified":"2025-10-08T19:06:55.8170054+08:00"},{"id":49,"source_id":"d1a1035e-72f5-4027-82c3-d1d30d2ddcf0","target_id":"73a3645d-f956-4478-b19a-e9990153124c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: d1a1035e-72f5-4027-82c3-d1d30d2ddcf0 -\u003e 73a3645d-f956-4478-b19a-e9990153124c","gmt_create":"2025-10-08T19:06:55.8281373+08:00","gmt_modified":"2025-10-08T19:06:55.8281373+08:00"},{"id":50,"source_id":"aa28412e-070f-4b61-80cd-dce192e20222","target_id":"71c2fbe4-8d26-42ec-ac1b-e333bb0b52f5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: aa28412e-070f-4b61-80cd-dce192e20222 -\u003e 71c2fbe4-8d26-42ec-ac1b-e333bb0b52f5","gmt_create":"2025-10-08T19:06:55.840086+08:00","gmt_modified":"2025-10-08T19:06:55.840086+08:00"},{"id":51,"source_id":"aa28412e-070f-4b61-80cd-dce192e20222","target_id":"67f412e0-35f6-4d48-966b-e1abef971655","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: aa28412e-070f-4b61-80cd-dce192e20222 -\u003e 67f412e0-35f6-4d48-966b-e1abef971655","gmt_create":"2025-10-08T19:06:55.8509364+08:00","gmt_modified":"2025-10-08T19:06:55.8509364+08:00"},{"id":52,"source_id":"aa28412e-070f-4b61-80cd-dce192e20222","target_id":"f07dc9f3-5408-49ae-a194-0a6b13fc34e9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: aa28412e-070f-4b61-80cd-dce192e20222 -\u003e f07dc9f3-5408-49ae-a194-0a6b13fc34e9","gmt_create":"2025-10-08T19:06:55.8619895+08:00","gmt_modified":"2025-10-08T19:06:55.8619895+08:00"},{"id":53,"source_id":"9698be30-efe1-4f48-8e31-4eb41942794b","target_id":"50d491e8-49c2-473e-8f38-7a0bb1fd8643","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9698be30-efe1-4f48-8e31-4eb41942794b -\u003e 50d491e8-49c2-473e-8f38-7a0bb1fd8643","gmt_create":"2025-10-08T19:06:55.8797105+08:00","gmt_modified":"2025-10-08T19:06:55.8797105+08:00"},{"id":54,"source_id":"9698be30-efe1-4f48-8e31-4eb41942794b","target_id":"9fda64f5-7e1b-4207-922f-6e4867db2697","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 9698be30-efe1-4f48-8e31-4eb41942794b -\u003e 9fda64f5-7e1b-4207-922f-6e4867db2697","gmt_create":"2025-10-08T19:06:55.8919155+08:00","gmt_modified":"2025-10-08T19:06:55.8919155+08:00"},{"id":55,"source_id":"e022f533-9479-4d7b-ac30-98df4f993dae","target_id":"220a20d1-b59f-4e95-9c74-45f184bbf4df","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e022f533-9479-4d7b-ac30-98df4f993dae -\u003e 220a20d1-b59f-4e95-9c74-45f184bbf4df","gmt_create":"2025-10-08T19:06:55.9038655+08:00","gmt_modified":"2025-10-08T19:06:55.9038655+08:00"},{"id":56,"source_id":"e022f533-9479-4d7b-ac30-98df4f993dae","target_id":"86dccb84-a13d-4ba9-be89-c9c2946c9431","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e022f533-9479-4d7b-ac30-98df4f993dae -\u003e 86dccb84-a13d-4ba9-be89-c9c2946c9431","gmt_create":"2025-10-08T19:06:55.9147903+08:00","gmt_modified":"2025-10-08T19:06:55.9147903+08:00"},{"id":57,"source_id":"e022f533-9479-4d7b-ac30-98df4f993dae","target_id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e022f533-9479-4d7b-ac30-98df4f993dae -\u003e ab45eb7b-b989-4899-9db6-c05eb5f30ee5","gmt_create":"2025-10-08T19:06:55.9258745+08:00","gmt_modified":"2025-10-08T19:06:55.9258745+08:00"},{"id":58,"source_id":"7b9b8434-cebf-4493-9f0c-5f637ed76c88","target_id":"d3a5326a-d41d-44bd-864a-be52370e93ca","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7b9b8434-cebf-4493-9f0c-5f637ed76c88 -\u003e d3a5326a-d41d-44bd-864a-be52370e93ca","gmt_create":"2025-10-08T19:06:55.9379454+08:00","gmt_modified":"2025-10-08T19:06:55.9379454+08:00"},{"id":59,"source_id":"7b9b8434-cebf-4493-9f0c-5f637ed76c88","target_id":"c96be713-c58c-421e-b799-82d9ec0cc0d2","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7b9b8434-cebf-4493-9f0c-5f637ed76c88 -\u003e c96be713-c58c-421e-b799-82d9ec0cc0d2","gmt_create":"2025-10-08T19:06:55.9462624+08:00","gmt_modified":"2025-10-08T19:06:55.9462624+08:00"},{"id":60,"source_id":"7b9b8434-cebf-4493-9f0c-5f637ed76c88","target_id":"ed05c428-dc06-4526-9069-2b20beda4eeb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 7b9b8434-cebf-4493-9f0c-5f637ed76c88 -\u003e ed05c428-dc06-4526-9069-2b20beda4eeb","gmt_create":"2025-10-08T19:06:55.9578176+08:00","gmt_modified":"2025-10-08T19:06:55.9578176+08:00"},{"id":61,"source_id":"5634b703-c76b-4ff5-a118-094768c7647c","target_id":"324d8b07-6e56-45cb-a1c3-780fd8b0da61","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 5634b703-c76b-4ff5-a118-094768c7647c -\u003e 324d8b07-6e56-45cb-a1c3-780fd8b0da61","gmt_create":"2025-10-08T19:06:55.970534+08:00","gmt_modified":"2025-10-08T19:06:55.970534+08:00"},{"id":62,"source_id":"5634b703-c76b-4ff5-a118-094768c7647c","target_id":"d28b3978-cdfa-4cf5-b724-cc74dc75c731","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 5634b703-c76b-4ff5-a118-094768c7647c -\u003e d28b3978-cdfa-4cf5-b724-cc74dc75c731","gmt_create":"2025-10-08T19:06:55.9799806+08:00","gmt_modified":"2025-10-08T19:06:55.9799806+08:00"},{"id":63,"source_id":"5634b703-c76b-4ff5-a118-094768c7647c","target_id":"5ecad5db-db6e-4f70-beb9-a28a22bf9d81","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 5634b703-c76b-4ff5-a118-094768c7647c -\u003e 5ecad5db-db6e-4f70-beb9-a28a22bf9d81","gmt_create":"2025-10-08T19:06:55.9899742+08:00","gmt_modified":"2025-10-08T19:06:55.9899742+08:00"},{"id":64,"source_id":"b72d2b05-3702-497e-9920-c16753190c30","target_id":"e0093b95-1254-42ed-9a30-0b016a93c8f6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b72d2b05-3702-497e-9920-c16753190c30 -\u003e e0093b95-1254-42ed-9a30-0b016a93c8f6","gmt_create":"2025-10-08T19:06:56.0016108+08:00","gmt_modified":"2025-10-08T19:06:56.0016108+08:00"},{"id":65,"source_id":"b72d2b05-3702-497e-9920-c16753190c30","target_id":"78e368dd-811e-4c4a-acfe-5f6c0d16e355","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: b72d2b05-3702-497e-9920-c16753190c30 -\u003e 78e368dd-811e-4c4a-acfe-5f6c0d16e355","gmt_create":"2025-10-08T19:06:56.012103+08:00","gmt_modified":"2025-10-08T19:06:56.012103+08:00"},{"id":66,"source_id":"fed3b59c-0a3f-410d-b9b3-46b694361e86","target_id":"727c48c6-ef3a-4f42-971b-900965e76ba9","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: fed3b59c-0a3f-410d-b9b3-46b694361e86 -\u003e 727c48c6-ef3a-4f42-971b-900965e76ba9","gmt_create":"2025-10-08T19:06:56.0231272+08:00","gmt_modified":"2025-10-08T19:06:56.0231272+08:00"},{"id":67,"source_id":"fed3b59c-0a3f-410d-b9b3-46b694361e86","target_id":"cb181915-8603-4944-a9c5-2a133ccc8a12","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: fed3b59c-0a3f-410d-b9b3-46b694361e86 -\u003e cb181915-8603-4944-a9c5-2a133ccc8a12","gmt_create":"2025-10-08T19:06:56.0345075+08:00","gmt_modified":"2025-10-08T19:06:56.0345075+08:00"},{"id":68,"source_id":"43b20c2e-ec0e-421f-b164-49961f882c41","target_id":"bd5a823d-40ed-4ef5-ad90-bafb81cddb19","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 43b20c2e-ec0e-421f-b164-49961f882c41 -\u003e bd5a823d-40ed-4ef5-ad90-bafb81cddb19","gmt_create":"2025-10-08T19:06:56.0444325+08:00","gmt_modified":"2025-10-08T19:06:56.0444325+08:00"},{"id":69,"source_id":"43b20c2e-ec0e-421f-b164-49961f882c41","target_id":"028246ef-47f3-4a39-8262-fa63dfa5caf6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 43b20c2e-ec0e-421f-b164-49961f882c41 -\u003e 028246ef-47f3-4a39-8262-fa63dfa5caf6","gmt_create":"2025-10-08T19:06:56.0538175+08:00","gmt_modified":"2025-10-08T19:06:56.0538175+08:00"},{"id":70,"source_id":"43b20c2e-ec0e-421f-b164-49961f882c41","target_id":"c9d60572-f243-4964-95f7-efa505e7bb31","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 43b20c2e-ec0e-421f-b164-49961f882c41 -\u003e c9d60572-f243-4964-95f7-efa505e7bb31","gmt_create":"2025-10-08T19:06:56.0638611+08:00","gmt_modified":"2025-10-08T19:06:56.0638611+08:00"},{"id":71,"source_id":"220a20d1-b59f-4e95-9c74-45f184bbf4df","target_id":"cb53e578-93a2-4fe9-8def-acd908afc197","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 220a20d1-b59f-4e95-9c74-45f184bbf4df -\u003e cb53e578-93a2-4fe9-8def-acd908afc197","gmt_create":"2025-10-08T19:06:56.075643+08:00","gmt_modified":"2025-10-08T19:06:56.075643+08:00"},{"id":72,"source_id":"220a20d1-b59f-4e95-9c74-45f184bbf4df","target_id":"29b0dd57-4de7-4ea6-8513-a026f067b820","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 220a20d1-b59f-4e95-9c74-45f184bbf4df -\u003e 29b0dd57-4de7-4ea6-8513-a026f067b820","gmt_create":"2025-10-08T19:06:56.086079+08:00","gmt_modified":"2025-10-08T19:06:56.086079+08:00"},{"id":73,"source_id":"220a20d1-b59f-4e95-9c74-45f184bbf4df","target_id":"3c96a768-7ae1-4411-97b1-50951a28ac63","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 220a20d1-b59f-4e95-9c74-45f184bbf4df -\u003e 3c96a768-7ae1-4411-97b1-50951a28ac63","gmt_create":"2025-10-08T19:06:56.095495+08:00","gmt_modified":"2025-10-08T19:06:56.095495+08:00"},{"id":74,"source_id":"e0093b95-1254-42ed-9a30-0b016a93c8f6","target_id":"d5b26724-d4de-4b99-9db4-e83146ab60aa","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e0093b95-1254-42ed-9a30-0b016a93c8f6 -\u003e d5b26724-d4de-4b99-9db4-e83146ab60aa","gmt_create":"2025-10-08T19:06:56.1054394+08:00","gmt_modified":"2025-10-08T19:06:56.1054394+08:00"},{"id":75,"source_id":"e0093b95-1254-42ed-9a30-0b016a93c8f6","target_id":"5f8274ff-cf15-4a30-9645-e489fb69cfcb","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e0093b95-1254-42ed-9a30-0b016a93c8f6 -\u003e 5f8274ff-cf15-4a30-9645-e489fb69cfcb","gmt_create":"2025-10-08T19:06:56.1166231+08:00","gmt_modified":"2025-10-08T19:06:56.1166231+08:00"},{"id":76,"source_id":"e0093b95-1254-42ed-9a30-0b016a93c8f6","target_id":"031c7abd-fbe6-4ded-a6eb-56d0bad54895","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e0093b95-1254-42ed-9a30-0b016a93c8f6 -\u003e 031c7abd-fbe6-4ded-a6eb-56d0bad54895","gmt_create":"2025-10-08T19:06:56.1282496+08:00","gmt_modified":"2025-10-08T19:06:56.1282496+08:00"},{"id":77,"source_id":"57522f63-5c80-42f4-a421-d7e20cf4a13e","target_id":"14b71da5-f58c-432e-8084-cdc37a6d204c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 57522f63-5c80-42f4-a421-d7e20cf4a13e -\u003e 14b71da5-f58c-432e-8084-cdc37a6d204c","gmt_create":"2025-10-08T19:06:56.1420389+08:00","gmt_modified":"2025-10-08T19:06:56.1420389+08:00"},{"id":78,"source_id":"57522f63-5c80-42f4-a421-d7e20cf4a13e","target_id":"6c525aab-4200-4fdd-8976-cf866e968a47","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 57522f63-5c80-42f4-a421-d7e20cf4a13e -\u003e 6c525aab-4200-4fdd-8976-cf866e968a47","gmt_create":"2025-10-08T19:06:56.1519908+08:00","gmt_modified":"2025-10-08T19:06:56.1519908+08:00"},{"id":79,"source_id":"57522f63-5c80-42f4-a421-d7e20cf4a13e","target_id":"19b8637a-0527-479d-bf29-6eb5777b2b58","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 57522f63-5c80-42f4-a421-d7e20cf4a13e -\u003e 19b8637a-0527-479d-bf29-6eb5777b2b58","gmt_create":"2025-10-08T19:06:56.1624923+08:00","gmt_modified":"2025-10-08T19:06:56.1624923+08:00"},{"id":80,"source_id":"0e508eb5-9f7d-423f-a16a-a4a26053ffaf","target_id":"04ac29a3-f306-48cb-8cab-ce2a216779f1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0e508eb5-9f7d-423f-a16a-a4a26053ffaf -\u003e 04ac29a3-f306-48cb-8cab-ce2a216779f1","gmt_create":"2025-10-08T19:06:56.1731061+08:00","gmt_modified":"2025-10-08T19:06:56.1731061+08:00"},{"id":81,"source_id":"0e508eb5-9f7d-423f-a16a-a4a26053ffaf","target_id":"d1c1ad36-7933-46f3-ae09-06a4e79f1a4d","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 0e508eb5-9f7d-423f-a16a-a4a26053ffaf -\u003e d1c1ad36-7933-46f3-ae09-06a4e79f1a4d","gmt_create":"2025-10-08T19:06:56.1835395+08:00","gmt_modified":"2025-10-08T19:06:56.1835395+08:00"},{"id":82,"source_id":"1c9611c6-fe35-416b-9f4f-0a461e074d45","target_id":"ff9a17ef-5ac6-48b2-b208-d088cc299042","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c9611c6-fe35-416b-9f4f-0a461e074d45 -\u003e ff9a17ef-5ac6-48b2-b208-d088cc299042","gmt_create":"2025-10-08T19:06:56.1951625+08:00","gmt_modified":"2025-10-08T19:06:56.1951625+08:00"},{"id":83,"source_id":"1c9611c6-fe35-416b-9f4f-0a461e074d45","target_id":"6d6a59af-ea7b-4720-902f-3f79439dbf33","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c9611c6-fe35-416b-9f4f-0a461e074d45 -\u003e 6d6a59af-ea7b-4720-902f-3f79439dbf33","gmt_create":"2025-10-08T19:06:56.204735+08:00","gmt_modified":"2025-10-08T19:06:56.204735+08:00"},{"id":84,"source_id":"1c9611c6-fe35-416b-9f4f-0a461e074d45","target_id":"7d670ebe-98f9-40cc-bb0e-921698f0561e","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 1c9611c6-fe35-416b-9f4f-0a461e074d45 -\u003e 7d670ebe-98f9-40cc-bb0e-921698f0561e","gmt_create":"2025-10-08T19:06:56.2145206+08:00","gmt_modified":"2025-10-08T19:06:56.2145206+08:00"},{"id":85,"source_id":"78e368dd-811e-4c4a-acfe-5f6c0d16e355","target_id":"67dbeefe-b60c-42a5-9865-64149451ffc4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 78e368dd-811e-4c4a-acfe-5f6c0d16e355 -\u003e 67dbeefe-b60c-42a5-9865-64149451ffc4","gmt_create":"2025-10-08T19:06:56.2272637+08:00","gmt_modified":"2025-10-08T19:06:56.2272637+08:00"},{"id":86,"source_id":"78e368dd-811e-4c4a-acfe-5f6c0d16e355","target_id":"1e25b93c-fc58-4a36-9339-2c2aa5b013dd","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 78e368dd-811e-4c4a-acfe-5f6c0d16e355 -\u003e 1e25b93c-fc58-4a36-9339-2c2aa5b013dd","gmt_create":"2025-10-08T19:06:56.2379569+08:00","gmt_modified":"2025-10-08T19:06:56.2379569+08:00"},{"id":87,"source_id":"78e368dd-811e-4c4a-acfe-5f6c0d16e355","target_id":"7b44d369-49b4-41b9-9eb7-b26478950b45","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 78e368dd-811e-4c4a-acfe-5f6c0d16e355 -\u003e 7b44d369-49b4-41b9-9eb7-b26478950b45","gmt_create":"2025-10-08T19:06:56.2479619+08:00","gmt_modified":"2025-10-08T19:06:56.2479619+08:00"},{"id":88,"source_id":"dc85413e-c17d-490c-b208-8fbdfa1e2780","target_id":"21d63ef6-cfb6-465c-b70a-a413c877326b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: dc85413e-c17d-490c-b208-8fbdfa1e2780 -\u003e 21d63ef6-cfb6-465c-b70a-a413c877326b","gmt_create":"2025-10-08T19:06:56.2598683+08:00","gmt_modified":"2025-10-08T19:06:56.2598683+08:00"},{"id":89,"source_id":"dc85413e-c17d-490c-b208-8fbdfa1e2780","target_id":"3339042b-57f6-4a7a-971f-e3cbd070c5cf","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: dc85413e-c17d-490c-b208-8fbdfa1e2780 -\u003e 3339042b-57f6-4a7a-971f-e3cbd070c5cf","gmt_create":"2025-10-08T19:06:56.2701315+08:00","gmt_modified":"2025-10-08T19:06:56.2701315+08:00"},{"id":90,"source_id":"dc85413e-c17d-490c-b208-8fbdfa1e2780","target_id":"a1f93da8-6441-4a0a-b369-fd65c5c712ef","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: dc85413e-c17d-490c-b208-8fbdfa1e2780 -\u003e a1f93da8-6441-4a0a-b369-fd65c5c712ef","gmt_create":"2025-10-08T19:06:56.2822233+08:00","gmt_modified":"2025-10-08T19:06:56.2822233+08:00"},{"id":91,"source_id":"73a3645d-f956-4478-b19a-e9990153124c","target_id":"80ae69ea-9c8f-4c51-9e72-5e4f302dfd1c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 73a3645d-f956-4478-b19a-e9990153124c -\u003e 80ae69ea-9c8f-4c51-9e72-5e4f302dfd1c","gmt_create":"2025-10-08T19:06:56.2932619+08:00","gmt_modified":"2025-10-08T19:06:56.2932619+08:00"},{"id":92,"source_id":"73a3645d-f956-4478-b19a-e9990153124c","target_id":"7678e9a4-d73f-495d-b32e-a86307833ee8","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 73a3645d-f956-4478-b19a-e9990153124c -\u003e 7678e9a4-d73f-495d-b32e-a86307833ee8","gmt_create":"2025-10-08T19:06:56.302716+08:00","gmt_modified":"2025-10-08T19:06:56.302716+08:00"},{"id":93,"source_id":"73a3645d-f956-4478-b19a-e9990153124c","target_id":"2c2926e0-a642-4888-b0c3-eb7c48401ff0","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 73a3645d-f956-4478-b19a-e9990153124c -\u003e 2c2926e0-a642-4888-b0c3-eb7c48401ff0","gmt_create":"2025-10-08T19:06:56.3126188+08:00","gmt_modified":"2025-10-08T19:06:56.3126188+08:00"},{"id":94,"source_id":"73a3645d-f956-4478-b19a-e9990153124c","target_id":"ea1073d7-eccc-43a4-a440-76f0e6916135","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 73a3645d-f956-4478-b19a-e9990153124c -\u003e ea1073d7-eccc-43a4-a440-76f0e6916135","gmt_create":"2025-10-08T19:06:56.3244436+08:00","gmt_modified":"2025-10-08T19:06:56.3244436+08:00"},{"id":95,"source_id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","target_id":"9ffafc14-b194-4c24-894f-8ba35c39cbf7","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab45eb7b-b989-4899-9db6-c05eb5f30ee5 -\u003e 9ffafc14-b194-4c24-894f-8ba35c39cbf7","gmt_create":"2025-10-08T19:06:56.3363678+08:00","gmt_modified":"2025-10-08T19:06:56.3363678+08:00"},{"id":96,"source_id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","target_id":"765145c9-6519-4ce1-80b5-f396967850fd","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab45eb7b-b989-4899-9db6-c05eb5f30ee5 -\u003e 765145c9-6519-4ce1-80b5-f396967850fd","gmt_create":"2025-10-08T19:06:56.3462761+08:00","gmt_modified":"2025-10-08T19:06:56.3462761+08:00"},{"id":97,"source_id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","target_id":"edee9202-bf63-41ad-92c8-1b73809b0e31","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab45eb7b-b989-4899-9db6-c05eb5f30ee5 -\u003e edee9202-bf63-41ad-92c8-1b73809b0e31","gmt_create":"2025-10-08T19:06:56.3631328+08:00","gmt_modified":"2025-10-08T19:06:56.3631328+08:00"},{"id":98,"source_id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","target_id":"e48388db-e632-47f4-a236-cef53eef42d5","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: ab45eb7b-b989-4899-9db6-c05eb5f30ee5 -\u003e e48388db-e632-47f4-a236-cef53eef42d5","gmt_create":"2025-10-08T19:06:56.3749553+08:00","gmt_modified":"2025-10-08T19:06:56.3749553+08:00"},{"id":99,"source_id":"2a27401a-612a-49d9-a7f4-28fad5a152e5","target_id":"2a1f717d-62c1-40cf-a5cd-392328d4875c","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2a27401a-612a-49d9-a7f4-28fad5a152e5 -\u003e 2a1f717d-62c1-40cf-a5cd-392328d4875c","gmt_create":"2025-10-08T19:06:56.3865382+08:00","gmt_modified":"2025-10-08T19:06:56.3865382+08:00"},{"id":100,"source_id":"2a27401a-612a-49d9-a7f4-28fad5a152e5","target_id":"1eccd7b2-5b45-46a5-9498-6653aab45d18","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2a27401a-612a-49d9-a7f4-28fad5a152e5 -\u003e 1eccd7b2-5b45-46a5-9498-6653aab45d18","gmt_create":"2025-10-08T19:06:56.3951249+08:00","gmt_modified":"2025-10-08T19:06:56.3951249+08:00"},{"id":101,"source_id":"2a27401a-612a-49d9-a7f4-28fad5a152e5","target_id":"a15b8582-b849-4427-830d-01a762a6f0e6","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: 2a27401a-612a-49d9-a7f4-28fad5a152e5 -\u003e a15b8582-b849-4427-830d-01a762a6f0e6","gmt_create":"2025-10-08T19:06:56.4047421+08:00","gmt_modified":"2025-10-08T19:06:56.4047421+08:00"},{"id":102,"source_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","target_id":"2268be0a-a7ff-44d5-9c72-6d260efd2706","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e6d21da9-f1b6-4efb-a193-2bab4b63dbd1 -\u003e 2268be0a-a7ff-44d5-9c72-6d260efd2706","gmt_create":"2025-10-08T19:06:56.4142344+08:00","gmt_modified":"2025-10-08T19:06:56.4142344+08:00"},{"id":103,"source_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","target_id":"a37be5ef-ba38-4e77-a086-49eb0571bbd1","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e6d21da9-f1b6-4efb-a193-2bab4b63dbd1 -\u003e a37be5ef-ba38-4e77-a086-49eb0571bbd1","gmt_create":"2025-10-08T19:06:56.4235625+08:00","gmt_modified":"2025-10-08T19:06:56.4235625+08:00"},{"id":104,"source_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","target_id":"93ab5ab1-a810-4072-a928-97923aaabd60","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e6d21da9-f1b6-4efb-a193-2bab4b63dbd1 -\u003e 93ab5ab1-a810-4072-a928-97923aaabd60","gmt_create":"2025-10-08T19:06:56.4334032+08:00","gmt_modified":"2025-10-08T19:06:56.4334032+08:00"},{"id":105,"source_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","target_id":"876f2cd6-86d9-48d2-8e15-8c10900f4b49","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e6d21da9-f1b6-4efb-a193-2bab4b63dbd1 -\u003e 876f2cd6-86d9-48d2-8e15-8c10900f4b49","gmt_create":"2025-10-08T19:06:56.4422698+08:00","gmt_modified":"2025-10-08T19:06:56.4422698+08:00"},{"id":106,"source_id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","target_id":"7037cc41-dcfa-4382-b12c-95ccecde3632","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e6d21da9-f1b6-4efb-a193-2bab4b63dbd1 -\u003e 7037cc41-dcfa-4382-b12c-95ccecde3632","gmt_create":"2025-10-08T19:06:56.4517469+08:00","gmt_modified":"2025-10-08T19:06:56.4517469+08:00"},{"id":107,"source_id":"e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","target_id":"46ae613b-aadd-426f-815f-8aa644a84a75","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e5e619ba-ee65-4d68-a5cb-a5565fc06ef4 -\u003e 46ae613b-aadd-426f-815f-8aa644a84a75","gmt_create":"2025-10-08T19:06:56.4633741+08:00","gmt_modified":"2025-10-08T19:06:56.4633741+08:00"},{"id":108,"source_id":"e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","target_id":"95c72ca0-fe20-4f55-aa8b-da7fe1e35bf4","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e5e619ba-ee65-4d68-a5cb-a5565fc06ef4 -\u003e 95c72ca0-fe20-4f55-aa8b-da7fe1e35bf4","gmt_create":"2025-10-08T19:06:56.4737565+08:00","gmt_modified":"2025-10-08T19:06:56.4737565+08:00"},{"id":109,"source_id":"e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","target_id":"41ac4f9c-0de5-41a2-aff8-952df832e54b","source_type":"WIKI_ITEM","target_type":"WIKI_ITEM","relationship_type":"PARENT_CHILD","extra":"Wiki parent-child relationship: e5e619ba-ee65-4d68-a5cb-a5565fc06ef4 -\u003e 41ac4f9c-0de5-41a2-aff8-952df832e54b","gmt_create":"2025-10-08T19:06:56.4825653+08:00","gmt_modified":"2025-10-08T19:06:56.4825653+08:00"}],"wiki_catalogs":[{"id":"30a87f86-8316-4aaa-9710-55a73536f8a0","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"项目概述","description":"project-overview","prompt":"创建关于kami_backend项目的全面概述内容。解释该项目作为电商平台卡密管理后端系统的核心目的和架构设计。详细描述其基于GoFrame框架的MVC架构,以及如何为京东、天猫、沃尔玛、Ctrip等多个电商平台提供统一的卡密充值与兑换、订单处理和账户管理API服务。阐述系统的主要组件及其相互关系,包括API层、控制器层、服务层、业务逻辑层和数据访问层。为初学者提供概念性介绍,同时为经验丰富的开发者提供技术细节,包括系统的工作流程、关键设计决策和整体技术愿景。使用代码库中的实际示例来说明核心功能,并保持与代码库一致的术语。","progress_status":"completed","dependent_files":"main.go,CLAUDE.md,README.md,Makefile","gmt_create":"2025-10-08T18:17:58.0859787+08:00","gmt_modified":"2025-10-08T18:22:33.6261027+08:00","raw_data":"WikiEncrypted:0MI1/XkBoMl0lTbK6t0Cn/+8FdvqrJ62ianMLvZj02elJtBUgH0Ns0veIx1WPtM9wwkxI+/XAqHLxJLlHB8wV5ZPaqnpZD68qW6viSXvNxPEwZQOyt9nbtdfUWCMarbTgmIushNu4J5RPguVc9JC+KjKWBJP2K2k0dMyiFIM1LNRg0L4JwSi0jojAQ3WhyIboOqfY/DVBgMOmJcqMlfegwvZrPWGRL4SzulymvNwlBKhpBjFdkOwae+0Luldz4f3FJgKEvaBF/yXIIEP306Vc4gko1a8JxEgl2h4yzd4FKlZonSXR6zQ1dUGQzOvKCZR36Nh4YDIxoqDOj+3BaqAYI+LW7ILrDyDi5Mb0PRWJLamEJ99ZI7o48W5vPr0GKxCM7CFhirvdnbb6w1dxKHH6j2uz2wnz9oG3PnA4+vKqOMKmx4buCYqtkEjJ7SegnJt85ilBBrYMEOGXIulXglXQT5W4sl8r2DyHY8t/wHuYS1V91vnuhYnlHVozMIpRVfkwARdrqfSDMREv75DzhMHGzjXtILoZzFz+ZIq/kCAeHawR5w9KUUBbRQ65Txpl8p1rsjYhpp63ItiHANivaJcJNvA3xOC0Mnhb1IDucrRB9JzGTwMMOnXzstRcwvdfPaL4//W0eZeVSBRldVOKjxJKyYkTfvoTNBiQ9avgznXLDGNNaln7C1MuPUF1xQOBqYh/1IXq79W0/gMhESyMZcqAZbSHAa72JhU9Tio3IcgF8vBPbEIOBsTZoXbvVT2dtEf7hNIXrZNS5WENbRMMUI+e25NTOclCOPcPABhJhPmVl0HnOvkIkRhNw1F/bflysTZvMpYOYC7S6e5CkwWqfaSJ6TqhaixM/5RqJs9CmLCj8btLxJ7PXiuvk+ao5J9IKRPqIW8AxmvXA+5n7fz8VQzTdrAxOdySKSbty3ZvIVoyqFwN9c9iTPhi90Gd6MqHHaN/TgFO2k1Nsvk0VW9mPdu65aoRUab/oTrM/UlK87rQYaU/FGMCR4Yb08wI8Nv8eL+ynJa3rsFe1Ge4oeCDRJ7fDGiqsePo1A1bcCNPS+kI8qJGQS3cK6yjo+kf7btjlUVXqNqIopDmayuHBa1N/PpFajqsHjVt5rFh8oPISq63okSxfJ2X6kPSzDNFGtnKpphYTXy4TPgFReXEjU5znGV2A8kHnLoHVHUWJvMGkKmoSJqxdvaorvNs9W4GKghA78uwvUQQ/XGmpSHu36Jtr0yN3HWw4iDJ0bhFzI/zbpF/1Kjyh1zDP9sE2Z6qBITBg9LcwAsbFKpdSA/8+9hx3el5g=="},{"id":"e408f911-d11a-43b9-a15a-d55aafbd4257","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"卡密管理逻辑","description":"card-management-logic","prompt":"创建kami_backend卡密管理业务逻辑的详细文档。深入阐述Apple、京东、天猫等各平台卡密账户的创建、更新、删除和状态管理流程。详细说明卡密充值逻辑,包括充值历史记录、重复卡密处理、充值状态同步等核心功能。解释卡密账户与订单系统、支付系统的集成模式。提供具体的代码示例,展示关键业务方法的实现细节。记录卡密管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","progress_status":"completed","dependent_files":"internal/logic/card_apple_account/,internal/logic/card_redeem_account/,internal/logic/card_t_mall_account/,internal/service/card_apple_account.go,internal/service/card_redeem_account.go,internal/service/card_t_mall_account.go","gmt_create":"2025-10-08T18:18:19.4642488+08:00","gmt_modified":"2025-10-08T18:26:44.4550603+08:00","raw_data":"WikiEncrypted:kn7Ct+JfrcIimOh9dbHZD8z9sVFXFlw+VowlG4RdkgRiO5PhUZUUR9F/92VQe6/0J84NbYm+zazVIZMP+YkBFE0RZtWubRsgAz8BWjPUtXm2B04dFxVPAt1NIu+3RilzEmU1MR1N7PuxuaIImLt/bu6gQFKA3Bf2MWl0Q61W4ONaIc4V/Ui2hYPvvFDkO+IdljMqxRjRuJmG26kio69x2aFtk6VFwU/V69hDjfymhxbNNKJWT1wgjQARNT1nEy5i/su1X6mIWQSM28YGyPjXB6z9jDFOYmUV6GSJfQ5UBJ5VCQYoGEBZYkcwVn/KqJHkEhHCwDWss36knb4+oRzFcOjfw9Ar7ZVZmZiqPSnto+r5Rp5h1jxSc43jD+7FS5jLTf1Q0Dj7klEVLZpD3lVP2KLOdWz/ekmasAflrPJVMdNKpUh3XIaAUP3nua5TpE+q6OJIrnjLBk17KmAQsE1RBM4z8z5Zvn9XM5sMBDa9u7AoL7spVwcfwJiyg/Apl3eAGjBDjQV7cyRvsfJWs9BMCQRhxgezXNkZi+63bUyJ4OQt+DhLmPD39tL8BWSZkXr3CCrrZ5Xc6nE7w1MlR5SEVykcgzG2dYBYCZW6HtEwx7CHvxKqFZVU7qkueY/8ang60ulQTMY/DcIyMCvGSBb5aVOwIZ228z2G+3k/YacUjDFAYBU1up1I4zkCe2e6cDDuY5qSfyE2eQsaYMaXv6gB45vnQ2w14diy/bR5Mpxe7oT0fWDv3QVx1Oy3Z+JKyx1ehumNJa7zESZWmEai4F7P4d1cY5q5VP+rpdLQilXEOEpP8M0369o+bMLlTKDmZPOqVK/jRVozMnMvyJ/DRXqc3tgo+ng0uT2/ZmuEcpfprBiF0IvtobVjphqZqhGlDDsqazVUdKbPSXxGcbawGOBn+cw8VTXD0BGJgeXIa1HbBZrcZGgyzilCHQjexQSWOBHS9ggSFFHlj22TsLvh78O1avMDXXuFYEXSmltDEzI4tlbJ5K31p0eBCIsUOOCOigJJGIbshguTgw3/ZXE9Kb5LmwfohID/3R2wd+aDgEKAXhP80/XMh1MLF5TKeEGqcXcax+IBT5dfxWSLi6GoEvGYCbKP/CUvvI+DYeNp2XMlGWr6yClsp3WD/pG34pb5Mz1eKbyTRhA+8K62VcJ/4x6j+xqW01PJrKLYXfJOTJIhyHp+uSa3YNvO5OnHj38hl/h5FqYsnZ+cuhs0y2vpa1I5j6ABYMKcu8HMp1wS7jMdZA6ezRBGnl9mSRZ7ELNFCfKEakpT5QBowaBYxviHgYZYHfzjBFc4ViYY/V6u/qtm0i2niSj2bAewlZyWtAVuK7NXFExjovKKnIVvmVHzJraXtJriVnHNOO4ZiaEZk4P9Kil2NZ7vlYo/z+S+pQxjg0H3XDgwhr+/jK+RIDCIp6H7Ng==","layer_level":1},{"id":"1047f41a-bd32-4847-b8fd-30a602c62426","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"用户数据模型","description":"user-data-model","prompt":"创建kami_backend用户数据模型的全面文档。详细说明v_1_user_info实体的所有字段定义、数据类型和业务含义,包括用户基本信息、状态、权限等属性。解释主键id、唯一索引username的定义,以及与其他表的外键关系。阐述用户数据的验证规则和业务规则,如用户名格式、密码加密策略等。提供用户数据表的模式图和示例数据。记录用户数据的访问模式、缓存策略(如Redis缓存)和性能考虑因素。说明数据生命周期、保留策略和归档规则。详细描述GoFrame ORM框架如何将用户数据模型映射到Go结构体,以及DAO层如何实现用户数据的增删改查操作。包括用户与角色、权限等关联实体的关系映射。","parent_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","progress_status":"completed","dependent_files":"internal/model/entity/v_1_user_info.go,internal/model/do/v_1_user_info.go,internal/dao/v_1_user_info.go,internal/model/sys_user.go,internal/model/user_info.go","gmt_create":"2025-10-08T18:18:21.3599425+08:00","gmt_modified":"2025-10-08T18:26:32.4460361+08:00","raw_data":"WikiEncrypted:b2BGJgTIatkHozAd0Nudm/SuvVVYZvaYCYJT//0Xr2YLspulsfZ15EoSMz1BS2Qu+eT/Pia7Bp+rVzGEs5oZfqEhrvkZJtq9PBXvvEoPE0zXdUP4cFX6U6mN1aUOy0Wzdrk4F0Ho1YhY0DNv8UdU+9bn1hHkP/mx5mK9TxjwmMYR7vS8MdbT920j/f9IegBRCliSfMXWqg31OAUcsikZZRl+R0/Zl4jRZ/HbPVB3fakRwaqfvSWAnDURFmoVY6+xCAC/rRtpV7CAnkNrEGNO6yAtqeba/bYPFMlAqlsatVImQavsRJWHPK9fCHhJPPSQAPYoyKliiMdgTzaxceybxTLtNNShGuSvXtR8DLHwFrhUpC+LTyzXI0JROTjR9ndhVDTt/IELxhmYFITb+4aejLlhHN+J4pMcoRYXEh8Z769iRqfiI0DbR+evFug/AFVvxOq32AeaFc1zQnzAJF7s0as2mKEbjRFFI1CHdQ3kfH087Ov2HdugqBWZw5TWPBAgVk7fItFEoKsryzEiRmhWhsNaqhWF0heraMk8eDZGJw0LXDF/8qYeoV0ybASIgxLCeHl4Ckfush86I0zBcpRh4COc5Swi+LdiWGDvbRKTnbQsTgjdl3uT5/PPVw6OwbN/wqNp6tVyZvzazGUiAb/iJVE+XFbjk7JKib26plORd6O4Bjye4HPj5ohndCPDdmAY9+rbrgf7v8UxNxvMrBP5p3MT6I9rCs8Gcg/Lej0OObK6lxCILhHCarkR09+/WIa0PeeHqfQTurlZgd/VKaXK4wOC1UUX51ffo6pzI3SJTEAym4u1KI3TuN+58x12ORQHPCX2SDvh/l4F82L2yWMDyj6MIaDy/e/+2j1j0FcH2NjsHEIetNey1a29fDnrYIV4ZkCkUC/z77TWo+YhucgMUPuA2i7Y6n0PE/AzD6aUdYA+L7G1UUzh8lguXIDPwDDw91JSPi0J7YXEYwv0oqguL3uxLdjY1dx9b2zFWVWxVDw9FofS+q5/hSzw1OIWsZ+QTUtV/apoyHvdSwDX5I49c7NMgAB5H3rEhcKrezwZDu0AU7PQENOzEzvQzGw+ggNrtUYBtjj83biXEpN3V4p9f7kXl92YJRPTygs+noXNkh28gMS80iBdgNdA/KHfuAW4uEHAsE6GxEQsWoYavMxops8UhIz1or3znDivgK7qXuRj07ySoBm4IE4mhnqKGRFzKSEp5JVb7ihkqX2L84XU4FKatiu6wFGWTgm6kaemG3xHmqGaxJdniYvmDX3U43b1uv7iF24ti/BLG/QUQ4O3kzn3EFstT4QdtQJjxVexc7PJwH0s2McUqe8jwOJvLsEu4/iB/zJLzVPuFIUzyxEE/DHApT7Dwea0xgcDdDwOWN+ePYmDENZFLF8ySIiY1wla/L1b4FZayc1IJ1LOv+BWhXzgm7UoNHzsrllsNhtu3xa99+OBshAu7+gKsIJy3FVFBzzKR5w7SHWoYQ2fABUYNLepDMJA+XdzTd283ycqKbyfe8Xcwbt9bmqrNJFfbJfeQ+KVTmm82fpvHF1He83EHzLlM84vE5qh/gfXCnFzDT3FdNNaRDemUH7VnJWUx3KugsmEsWnvfamrX1VoiMSHSMDT5F5OH8DQCMYPZAqf/IQ=","layer_level":1},{"id":"bac7f19e-b5b4-4f8b-b3df-60a9d5c50b58","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限管理API","description":"api-auth","prompt":"创建权限管理API的详细文档,涵盖用户、角色和租户管理功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括菜单管理、角色管理、租户管理等接口,提供实际使用示例、错误处理策略和安全考虑。解释RBAC权限控制模型的实现细节,包括权限规则、角色继承和访问控制策略。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","progress_status":"completed","dependent_files":"api/authority/,internal/controller/authority/","gmt_create":"2025-10-08T18:18:22.8314611+08:00","gmt_modified":"2025-10-08T18:27:26.5885313+08:00","raw_data":"WikiEncrypted:7ZB9yjzZwc/JkOb5fG5L62h4S7p46pJDygi2mv/I0XaEve9lYczBQSg9mSd5aOOh0poTp2DPKTMapy+4nMq7a037hv9Ush/mogb3Ipd/zY6F/7avn9o6k/F5fymHI3kmpJnb3Cch7lFHClRfGjy+Se/jm6hd5BP7wEVj0xeXaf2SNp+lLPIswTQky3nnRJ64SMVqGlPzMuw8slMCOic41UPWHSc79cUa7HywqwPkdqOtjMcNfL2oq0seuUd9uTnHTYmgQaW9ZGtro3eF+eO5JavVONGPJdDkZqjpv45FdnYSPFCxW3XDrIpT9zWVVPvYj2894UxAg7567zq9uv4n3Rwgk24a6sd2wZhOOGN/M/08rGq4AGs1inTW/jYL/FuOjHFx3HFSDrC8tetfeKhZ4pfFthpjUwkm+rp5dktITYBTL3FJYDE3JMf0BwdWEqWzHxvC5QtfYO3Gm+dmH7mVDtVzeXwfWiW9wqKe/mb7G3avYaNEPswqlbjUoA+wJHR6VxvOOBYakgaJ4Aetel2S0TjBpMxkrJcNoAxAkOtQnqvWZq4VZGeClnvqVNwHvzwvQIOeaEfCiJ1CFQiy5blGYaoCJobLWtZ6tX/vFxuAgNb10VJ1Jg2BAex2DPUG3lZOvWiTLNvEwLKeJKzQCt0nhrGTu0mCSEtOTcvJ2fEUbxqY/YHWpXrNVMmOADPzor6iM2M4ZDv47zV3Kre7/fDE141wJpHnrX6jNTUUcIBGpkGK7v5FrpjxV7cSce+ynBkQj1YVU2S4Ff7lKjZkU+Bdto6roSxfe8X91BU8lyXvO9RZaJ+08pexUfqvvhwGH41v+kg1ua1NxV6tpTj9izddT5Gjm/4Ytmf3wciHRCFvp9sxryPIZte4luZYGmyrmBCDvfBD2qnCPT1Ealw1PxZuENLD9I+aZTIACT40t+/zT7KDMYoPaegds4uDtr9Cxj/hFUUkBCpOibaQ+BmLU4zx3H7SO+GeIQ/tLKTdGjkMJ0KL8JBAdRrcfPq0pLRY7ax8nyaxk0F3HBiIOoO5Z94a62+uLnIi7tRxktQlaKdOOuKwzColXQea1nPflWTj0sYX","layer_level":1},{"id":"06703965-884b-43ab-8766-69692f23192e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"认证机制","description":"authentication","prompt":"创建kami_backend认证机制的详细文档。深入解释基于JWT的用户认证流程,包括令牌的生成、验证和刷新机制。描述登录接口的实现细节,分析auth.go中间件如何拦截请求并验证用户身份。说明用户凭证的处理方式、会话管理策略和令牌过期处理。提供认证流程的序列图,展示从用户登录到令牌验证的完整过程。记录认证相关的安全配置选项,如令牌有效期、加密算法和黑名单机制。为开发者提供认证集成指南和常见问题解决方案。","parent_id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","progress_status":"completed","dependent_files":"internal/middleware/auth.go,utility/token/user_token.go,internal/controller/sys_user_login/sys_user_login_v1_user_login.go","gmt_create":"2025-10-08T18:18:35.8868321+08:00","gmt_modified":"2025-10-08T18:27:44.9979603+08:00","raw_data":"WikiEncrypted:uxAckj1IXK2TQH//kEdeBEJk8OQlcivzGG3AR0HSFOo2ht3uRAHL8kInzlA+/LrT0yu/xcGyMMZDf6et32Zc35BW+5OWmSgFHiH3LFscU1wP+DwAH5n49Jy+7BmMwoZqTIxQqKngL0ubWEPVHEOa/2sdpoDYIKxaODRnZW1UQLeZCZw7PZBwRaBTsBF0wCwFd3pQ4sjeKp/gShXpg4nAmtCC/wmqHon1w4l7w3HhG5v3KEzsQfiYoUnjWAPo4otxkFypLPlJsIu7UtzpWYjliKqvJLuBnHY234gVrbqsq1CVHMkxNz+/xzJW1K+F4EGMB239Eg9Ua0R8c7IbOVKrh5h/cdlnwyikDYkBMvn34YMb8lXx+pSgxRO8QNGeuxyy2/Mn6lNZNt3BIl7BRo++j+f7LiPtEgl4dk5mFSeKqsxhXOCvvm8M8iwvFagjRJRuGUDjFoqL5txB7/lomd+GhqEK9Hu/rHoHKiZnx1FKGUk502ZuRI7IThAn/2Maxrd83T1wWkmXL/TTHxPJZEt1K5qxm2oRVGBTbUhqR9w9OxAZdhbGRW6ZEiLjYPBo8kGncrDBzLDT2K0X2avY/l9KX5SlwoDT1Lknt77WWromrjYeHYYm/Q9JMF1FM0f2l3bMtg1fhjKsKDOdFCHqKkLxEoY+kDHrINbuYY62gZoAyuxf/c1yC9r1mUCA3oUVCPEgzP1NmkrfPfYEM+VsKMoPkeB++F0crkF/tC73lIuV7drxAxM59kACqIC0QZXlbMcJyJRndirD7H9sd16sscpwqPw9c2mPM/+FLTx2PyRQExSHLWEyAdMZVrpDC4/r5GmsCOeNByvcwWIaAmvlbijoC1DFkztQI7x73+Pvutzv4jJ/TVE9RmF+B06DM5pTew3OJE5sRmxbM3DCiUUwt2SrzEk/qgqpyWdUs6PyAJ+62P8cMPv3WjlVOryAHjfsrBkAA8K1NKe4bAGwh1tEfWPVMMQHkMK2MOdwUQwKpCKy94PmvkNfgfkrwoz7kw8+/Csppg/0NuacaYkO95aWg9oyphJFE7yBQ3hpsMvIAZeMYCQIZrRX3NjgNSGOEW8tn+lxpUbiAJxSP7KwOpPLcjCKJN9CgEMBXUyem+f0c+bttlZ2UA4ugoKS4Lhbf+IhxTiqQRuSRhNssZoGl6JccTsbcHLyGfA2GEwWpGlNHuvmkNuwSoHBtAdcJcGs0UiDpZimnTloM/mZEhmj93cQ+TGRTw==","layer_level":1},{"id":"246ad670-c405-4630-be1d-c8b8f141bd4d","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"电商平台集成","description":"e-commerce-integration","prompt":"创建kami_backend电商平台集成的详细文档。重点说明如何通过integration包集成京东、天猫、Ctrip和沃尔玛等第三方电商平台的API。详细解释各电商平台客户端的实现机制,包括认证方式、API调用模式、错误处理策略和重试机制。提供具体的代码示例,展示如何调用各平台的充值、兑换、账户查询等核心功能。文档应包含各电商平台API的配置参数说明、请求/响应数据结构、状态码含义和性能优化建议。解释集成过程中的技术决策,如为何选择特定的HTTP客户端配置、超时设置和连接池大小。提供常见集成问题的故障排除指南,如认证失败、接口限流、数据格式不匹配等解决方案。","parent_id":"cb5122de-2da4-4368-8957-6b7d9cab3982","progress_status":"completed","dependent_files":"utility/integration/redeem/,utility/integration/originalJd/,utility/integration/tmall/,utility/integration/ctrip/,utility/integration/walmart/","gmt_create":"2025-10-08T18:18:35.9004996+08:00","gmt_modified":"2025-10-08T18:27:39.7988577+08:00","raw_data":"WikiEncrypted:xxSzb+WGZ2KiWVRvqEEeuOX/qidwYD0PS7jI5Oth8sgQnJWs+O8v4sO+Q/ahcZuvk4pY5VXl6QQyn9H1PtAoZBF8q5O550DM1mM9MA5FMko4lMH7f1faFOAxWAIlE0rsj/kHvHqdx699PimvDvLjLR00O1Vf0HRJrT5yuHhDNQlh+IfxFMqry7uC2jI03/55ShP9etjLVcDIBO4+Thf6FAngqwTKJX6FffBHVVNTNauARzl7uPeYB3lNfuWhxA0uyyGDenT2mGFrVhF1Ufuu0L57u4mCdHypAcwUP79cW4lS1g/20NYJIVnKCZ5HJ41hjYpoyRkooLv5Qly6dKNqdtMFQbgKfa9XLd3Do7Yb/Uk8tIuiHNdiVOcZGGZahzzXTySyclroM2c3f2SeUq8mjEvekQVSgbdGfUZxBhJA3Nzo8mFdknb/2jpnfjk4GRl+UVtaF4eCgR31LStknV1E95tDGorGr01ZNK2yJpTEzk/Vl9ItilGLLfhrauDrJcn51tmi0maEg7cGNglMbpvJ8KuBbmHDm42p6h7qSg7rw1LC7RjYTO7eHYfmKArJwhBNhYR89RDZsyz0whFO2sy1RvXJEMV8mvNlGMNiOqcA1piIBX85U5PzfqPgSV3TnsbqHSLomAxBfTtHieJwnvBbS4ZxL4AvQ2AiXzae4X7o3qSPNCYag5a5APOPVIxQ4lRkw42CWG1jVXZ60W6s5yETCRSp8Ova9wAsp0z8v2DDsdgPAYiqya83TFRaAjsnBLYsFFUKBE1GmzrrjrFXmF+rbNrbXYHcdqlYshe4fSlHSuQsWNSE8c3ereunS3PZaQ98Os4XKAhXYH/ybDhe2geVscy2cuKjNXt0G/KWVcUF4FwOYn4NlVt0ZQQ2eU7IG8PUIQ7kKcP4ixzZDu2Hdrf+sHmWuitjtrafZ/H/kqoN8Vc1JkL4Bm5atQJgoUWpkxoet8a9Qw0O/ZPnbargDR0eevkAS8/S6ndYv/vLA6VtCV96B2+6CFn8e+41UHuqE8eSjwqOKFzL71O+Kl6AnBDCZLi5z1hiO/3em0leYtf1b9R6eNkaVTnfriCukNFbdf+Qs5gtfR6uaiYPOou08jyIlOfhhXwn2wkv6iOkowXphQqxT1toMqXfwWmYGQwKXf4Sz3Pc4/UVGMECPzi70mSErEhTlWYapq4aXnxPJRk6mqsMaMKHsfgnW3+WjnxM9mCVAYC8UsK2jyiehRdIKqMkHJUHZtr4aBiwcSlvqEMTIxTG/kjzsHsYTztViOVWpDhyBDF4+xqWQwFD3ClBuGR0viaSJ2UnjxWicDyl/PWCazOqKyXiZWlRBvDL88iMTY5YoY1dWDPjKAuPqF8nPVPYK+Qj08dw41rrJDPHesXueS/1LqYdceY/iXkQ8F3g8FiKJzYqP6jKgPeiMzpVkycj1oG+Ucrmv10gHDrTkVqo2B0U7BXktvE3nZAVWWCD9nA4abg76pjvOlToY4/miOL2AZO0gfcCO2VollZnrecue4FMaSKU3RHNXjwp+XNh19zCKUlrVZXG/es6NEvX8SkbD/9ak2/3EFHJxi4FiGCg/XIb28SkcFqpdS1/gY9ypG1pvTuhaViWu+tACDphqKsrHA==","layer_level":1},{"id":"a9774984-bf32-4c6e-b5cc-51ed0755486a","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"配置管理","description":"config_management","prompt":"创建kami_backend配置管理的详细文档。深入分析manifest/config/config.yaml文件中的各项配置参数,包括数据库连接、Redis缓存、OpenTelemetry监控、第三方服务集成等配置项的具体含义和取值范围。解释不同环境(开发、测试、生产)下的配置差异和最佳实践。描述配置文件的加载机制和优先级。提供配置参数的验证方法和常见配置错误的排查指南。包含实际的配置示例和安全配置建议。","parent_id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","progress_status":"completed","dependent_files":"manifest/config/config.yaml,hack/config.yaml","gmt_create":"2025-10-08T18:18:36.1445383+08:00","gmt_modified":"2025-10-08T18:28:10.187446+08:00","raw_data":"WikiEncrypted:aC5ZtUyEKPSxjzg//aVllBdOkNxBMxnGnLp2RLAVJ7xmBnEGgBX+Mwrm1aKR9Yfw9YgupCqzpiJ1vOAMLIumDoo0hEmndSovwR9ewFhwUm2+jy33bebRLGTcBVfCT0hl6K8y4mrs2DbU7BLgJ5bYsbaZ7u/W1k7Z3hUMv6Ap+addjOylxie0Wd/h9MAuuJ5DhaZCv91V4vUGh3QwBl0tY/uBMHgY+4DesQO1vIXHpEKsl4L6nKtG/oRnMzleCie5X4bCAugaQoOwEkJa7OeSWiseQb9x9UtaFxIWtRcMzwT8ZTHhIswx5dFQejKZ8MGUPpR69In1IYKUEgxxxg8VnFzNJtKZqWnHEyMIA0+AwJSEg33E3SPBbYYUuiaWYd69nnHjCWS9oKItfci8fuUM0H8LwgqD0oXJuavM8jxXZmYx4QhUqpI9P9L8FYxtnlhNrrR7YhvoPfPicE/YF21ZmdFJv8XyWGB/zQGVH7+PXPRHlWTy8pyMBtHlojwlnLTLzJeER7cWApDYyZF++eA/RUm0UK9ajKhqsz8DG9CeFtAG7SJb8oHHjJKEHmHH0FbwSQelN9g6e29mrJUlYoGs+hDeGdAq9VTC9vxaJRXTP+OwbA9Dk8bxlslPIO9LEDuofrw0jpthtTJOiJA76VUU+69Es4ezrj2SJRCt19lzub80YZ2q6aqPQ4/rdZNdvZZpwF/HSOONmB4B0y01Js7k4TgJzAt4IWFsPex3xRKVCEd+gBVBEsJMGcXYyL6NyJoCnn4YRYf6s3rlXZGWiw6Z5YV2x4th4UQkyk5DXk/A6gFCA4hzZLqDbiN1/LFMDTrvpvd3E0wMc5w5ZS0+Sw7UhouoBc7NGOQulWLLN2yMHHkvcNAooOxVdkG+pU+3nEtjlh+tZph0xwx3ZJpPrIm0wNDPRi8erpiMPsnXqpzRSakwEaxUqpuCV4lzjnNLTSBgxLkvQEedYYb/vpbn2+MsERe7VSvy91QoRvuDbrL9ZcZ2JMhQTuZoZtmunnFLWuJlUTddZCsY1jgyj5ZTY40Z4Q==","layer_level":1},{"id":"1a62d745-3b65-4062-8a9e-207c4435c8de","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密管理逻辑","description":"apple-card-logic","prompt":"创建Apple卡密管理业务逻辑的详细文档。深入阐述Apple卡密账户的创建、更新、删除和状态管理流程,包括账户信息、钱包余额、历史记录的管理。详细说明Apple卡密充值逻辑,涵盖充值提交、iTunes回调处理、充值历史记录、重复卡密处理、充值状态同步等核心功能。解释Apple卡密账户与订单系统、支付系统的集成模式。提供具体的代码示例,展示关键业务方法如账户创建、充值处理的实现细节。记录Apple卡密管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"e408f911-d11a-43b9-a15a-d55aafbd4257","progress_status":"completed","dependent_files":"internal/logic/card_apple_account/account.go,internal/logic/card_apple_account/history.go,internal/logic/card_apple_account/status.go,internal/logic/card_apple_account/wallet.go,internal/service/card_apple_account.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go","gmt_create":"2025-10-08T18:18:47.765224+08:00","gmt_modified":"2025-10-08T18:37:52.9803415+08:00","raw_data":"WikiEncrypted:ngLqLViTt5zzUmJHZ62DoNzwaMeVTHTu/rGJRszUYK4GblvZyvqVED6wYf1zYH+sjjgavfkzdDpZX/iLMRhlT1XpbU08T5DcNZVvkdoFvwJ6/tteal0zHDJCrSCMrAbPsxqMSW3hCc7alG2OcMhRpTczsl2qchYBK+AtYkv2QeZ65irR51l47RDtevSCnPJkDMWPgHbHnGiKCliBonQJcBME992aQspXUAM0YNH5pw2s15QF+wFfzVDycltGbYenpmbf8UtSlvTidTZ5GexkYZudc3GzMlaW6466mg79Xe4csqslSGY+0LhjQJ+iehgfFI7KsrbESR0NyUGu47BSAdWVTUzFJdceVpbb4uXDq09vbineTVgRewLIp9mm/leT8+byfJ3+VLtk0Pnkzx8RqfLfPb05fMPfyanR75qcDpE+LGpoS3BOpBaOW3k1Qzu3RLIOc07VPABJSj5dMT9erlMryvH0X4Dw80UcFu+mpQf04ifL5dCitAkHBT8sKE5z6/v6tpLUnM+7OwAkMkur672cn9+aARy834jrdoklL/hXqel6EGEIRRcCwzvpT9DaxNECyf7l5y9FkZO+tX5ORO7eAt0KBS6YknKQj0qkDFhOu7nQzm4o1iSzHLDCLO8wgT23CsuKzpjD/w5jCwL/UZKV6V577luwhMCh729g6pMilL3w054dypJuU0/InDyPk0SMzOVRHjFSDWB4gIkP77t4J95AdU1yxAT2CX0SBkoaqXNBc92PgjZGOvU/DmDkmMgj36frOk3ZVoJ2yjrIeTOGKp0152OFJw6rtzTbm99NgSJIbnINxCFqs434RzLj6rwLqvzTnmvHHpdlj0slCfnJAz7jXbQH8+dJ/4OchkvJK2YOQQJAXoPFhixVBeuVlbydhfrCBbDQnBa5A1CYIN8VQTmtdHL56suCkxFC1EwxrRhyeYNdurFysRim7TchES/UKgKhDbIhA3WvfGL5izZ0VwJe+xFcelmLFw/wnk45UD6v+IMj6budI+dSOkHW053gM7HJy5MmoDWk/tMje92upS50Namhu6vmi+/xBZ2GZONGDqppMDcjtZXR8s5Am3Qb8Gp/hLJqvM+1vfzL1NYZlw6DrV5JzdTIpwLoZQYZGaCecjwXUeQUoEamSQoGKcSHtlPBY8+5cp3GhPQzUYDwu7Yn9IzU/y4j8uaXYe0w8nykbFmMrLdDJN0V2Wk/1PgXzHffqsUk7xGu17sSPPCNoa7aXDnapKF/Ko0SNuZT9TUc4Mtq6IFaDvxYHELbfqIBkTewQ+GpVRFoaOeJfrwQAUlH42ZIJzkKNVOPBHZmuEydcGCp4s8xGmyxRf63j7hjmHf+6i0vEaRAxDK3Ac4pcwHgN5ITRDeAxR0v1HTnGd9E23SmOCIWNms5UFCAq9emiqrAW20X5H90eOpg6v0YFyR3Wju1Nlg1BVcG3ipTzCrht+ZNszH+CPNqA6b/NiN/CaidQw8eWfx9FmOLq8h+cVxUVlps0rVHghs3y9LnzqIB8Ylvqe0ZY1pzH2/3CReDGvmULm9jEINUte5i5akwy9CGNt43RPieHwPS7a6xlO39Hg+Rwk3gzNG7eNZ3SozT65lxOkmYJP+85KOQFW9R6MZoJdE6+VMpBZTpcMtlEs4rrkYb5DVDPKxBIt8cCnYWYXAYvxhOIhIE29RV9DSgRkCVcyuLktesXDXRuoMf6xnE91EcmjeHg9mZduNU9HF4jGmiKoBh2MVO+85QFycflsoAFQnJgxiGYLSln34Kx8QeigkYKBjgZhGWdgWM","layer_level":2},{"id":"abc2e583-1d2a-4ee7-b376-101d505c3e2b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"IP限制机制","description":"ip-restriction","prompt":"创建kami_backend IP限制机制的详细文档。深入阐述IP访问限制的实现原理,包括IP记录的存储结构、黑白名单管理机制和访问控制策略。详细说明IP限制规则的配置方法、查询接口和生效流程。解释IP记录的缓存机制和快速查询算法,以及如何优化大规模IP数据的查询性能。提供IP限制配置的最佳实践和常见使用场景示例,如防止恶意爬虫、限制异常登录等。包含IP限制与其他安全机制(如登录频率限制)的集成方式。","parent_id":"6d13ba87-5f1e-460b-85b5-9106d41abbce","progress_status":"completed","dependent_files":"internal/logic/restriction/ip_record.go,internal/consts/restriction.go,internal/controller/restriction/restriction_v1_check_ip_allowed.go","gmt_create":"2025-10-08T18:18:52.3385355+08:00","gmt_modified":"2025-10-08T18:38:32.9743231+08:00","raw_data":"WikiEncrypted:6hVxnL7axMQmHgJLo0JNgWqWpJf6Px2W79mWMsxJ9TGAvR3rE3JrdX51+6StzcOfTkIVdbtImBko043YZPW2NpQGSrhOvIBZ27Yj1kGXfDgKwzSiZgD7IgUSEukesfljr6YXe1Q2MQmb4gz6SbybNWCkscoeZqQxw+/F5u7/ZqD+of8mjvclrK2HdQ0f7qpOqL6gTI4360e6ogzBd+A4GTk9+iM4/87yyUTRsPY5266M9J+7lCbw7h39nIMIrG3+vw3Qhwzfp7vBd0RN8vKyiYM6wTYnrlWjImpk6UBHVNT2EApndrmgKuy8PAvVdmxy2U5c+OwjKzRT6mFutG2qUBiDz7jnmVCz0RlG6ShEfxqMtOwDgTWnYHedxfbiSYb6HRA82NfphG42/U31qwKqWzObwwmMtaRX2HSMkUHDS0BPpycfGon8TXEg00M3I9MKsfRKCsGpHvT83YE1099/x3elNaqplDImzOvrspp1Ww3wwyy8by0mbsPJZWGdzekPsyt13nQBc7Vp8UaIGZBCqOGgDgBYBP75d1+2FCbN5u7Vomxc7rpbbL8EO1WPKhyWnj8v9zXDFYnbwAfCzJsG77bpTc/35U4TLTMVIKHyndtCnKFczkt3+3F+baIz82Rve8Y9SN1Pa6QT7/MvYMdf9yc1Yn2LwCr4mi1VLm6Y2xHkHuqmT3Lhpsv66jX+CUNH8OoyaIA6rdD/WaFaCXAGwq14E8+23QebCH7eIs95XPJpn/iY4E5uC15ksm40bpLVrkBfJKYwjpjqXBSRehPUkBhIra/vf0CE9JgWf5bjqVL5jDpIxN+7nv37IDi/IDo8C8ILpLkU1Q/EicEO3edXr/3sfH1RpSRX4GLKVUYSNFZDCHcKedYsdSxF+8yMxsHw/FmtnMpCkmFuZONUqjahCIUVMPR8GE8MvJ4UUF6u8nx6OSpniwGuOWSp7n2yR2k+n5D0vwb4dlQaVT+kyO5Fn774pNyseCf04jPpL+7Xj8ypbaG+QuX/wBnkZcGxMd82I3ROQ7LVV182CFYGiIla1Khzf+8jqmOM3VG0n/5W90+3ZsMEZws3NjYjeQ8my2PUYvXxgONF4K/jj+rn8F6oqYvLAs5EOwgajo3kq7DekF8QjvctYQ42G9S7HpYiCpd2DvkEwWHuX+QvE8xaCOklT9uhbJnKWIB5vkAIZS4JwdfTXzCN/y+6rRLPKlSgJTvdUw9j2jbYN73r9OYkgJnDvshWdFEMmuTeO6/CxAcAz8cpu87IzVJRhuWVacGl1p7tTUTO/t5JrfPYaR8QT5qzQg==","layer_level":2},{"id":"75fdbf05-77f9-41d9-ae7e-43c541799856","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple订单处理","description":"apple-order-processing","prompt":"创建Apple卡密订单处理的详细文档。深入解析Apple卡密充值订单的创建、状态管理、回调处理和历史记录功能。详细说明订单与Apple账户的关联机制、充值金额验证流程以及iTunes回调处理逻辑。阐述订单状态机的转换规则,包括待处理、处理中、成功、失败等状态的触发条件。解释订单幂等性保证机制和事务管理策略。提供订单处理性能优化建议和常见问题解决方案,包括重复订单处理、回调验证失败等场景。","parent_id":"41fc8a89-8530-4842-9880-7b6fed4e4fc0","progress_status":"completed","dependent_files":"internal/logic/card_apple_order/callback.go,internal/logic/card_apple_order/order.go,internal/logic/card_apple_order/status.go,internal/service/card_apple_order.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_handler.go","gmt_create":"2025-10-08T18:18:55.3185202+08:00","gmt_modified":"2025-10-08T18:38:12.9736406+08:00","raw_data":"WikiEncrypted:ngLqLViTt5zzUmJHZ62DoL9fTXxfO9Um+u6vywbuqNlVAJBbx45l1XJxh5AkoaMelVjKwL/Tj+bOrJfzH0FvH7yiW6YplByZy7TzEt6ow9CYvbYT90NuRLJkRjSCugg6/dx9+rLZH4VKOao3RXIucOtBz7EEcNYIwVNFOS1GHEfs0ENNKNwr8pOYRxwxRyv/LZi0/nOwttovh7UJtj1aAoNbxGzLdk4o1Obw1qv0xiRbdPf4tmEMs+6in1MbhK20W6G5iG9KS+K82ZmhTOvQbR6yepLzGCxTNuRnL9QHUF4QjqpdQNDaDB8mruCNRHJIjeEoEqg+dd+c3Q5j3F5UmI8FTiV5DlaAG1HtSljleUgzo6I2zLaT2VNqWpoRki7b3U8mKqqdOUBodU72l0jUUDngrpYRcT5nzOV6E/7lkDlGCS+DVCqHTz7GB0tKmxi7TAEX2c2XB4T5i4pKe2QgRmEYNkZ0aschiY+kJMxr0/BdNuf059DTFuINcsvhV/06GfXnSa7xklhb48u2U1nBJ+9pQz70XKoA2kEsBB6/lHay5FWj/n+85QTtGQN+jIyBC3H+3ov0qj3dlU2HRucRhWGP2rLi3R10uwIdfOHIcIQqs8qSzTq2+nsQ18r0ku0YMh4vc0lu6IUHgzo/tNAhxgVxZ61M2MZixEtQA9Yg6b6YzRsnDM/E+LHrfcGl0cfn0PqMqR7mcFceNiSrkAa1D8yAry4GYZwKsvvqsamgswj51TbYXsMARaVOYlxndMVjpDIE0R/TWXh3Pv3nGygHbvoP1xDsOuuzEjJ3E/sILuEt2hxs9nO+5RLaweL9K6EVVDdI+PofLell3Zxfc2mjhHBJFLgJhaoI2G+h1u96pR3e3f6NlMrq7G/sLb9AVmODF3Ys/OPBj1Tk1DuwjkRhYqTsmp6I1t76xgggXWykt9Pu571SHlU4Jr3K2f4JD35/bG2UEin9h26K3zVkdUJEQgZCyrJ7CKXiUH+5LaoZ8q0JtTcBrS9HrWwqD2NVrcV80cjQqZ7PrmVzYYU6ft1YrVpcA+fae6YM23PQinDmGUQOG+8/vOqe+Ejozo/QecvLkXBb6J1KzI9x6ycG+PQL/21DaSugH0BRwh/S1pQxiETPLm7dSg8iL5NTU0Y/A0f1+tZU3N677N0TgaHCL9LvDn3wU+CMnvH83k5MyDjIK1KGjn03ywuWIFmcEG3yevlXVvlOkFmOV8QPfc2yPL9ffds6eQ3d7kQ/XrScyX7Px5kL8Y2b1YxqjTVpKPGwDPIRqHEAuSj/C0WNNjCy/bSpoC4426OwW9FhyXbKOl8Ig5QZF0uUPLaFCC5k9xM0Be7fOzhh1dCFwyiqpPEmmSgIrEFOp37tQbtOf5U6FlPjQtduifVeLTBkhQCoqHZSJ9l9I+vBxhEnk8AfNH9L1B4ekpTRpg/rGu8tLjj1fPpCAS2MkpkiPDAUvmsGuvNfSTyI","layer_level":2},{"id":"19fa9669-f28a-4a88-b0f6-b6039eba9dde","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限规则管理","description":"permission-management","prompt":"创建kami_backend权限规则管理的详细文档。深入阐述基于Casbin的RBAC权限控制系统的实现机制,包括角色、权限规则和菜单权限的管理流程。详细说明权限策略的定义、存储和查询方式,以及权限验证中间件的工作原理。提供权限配置的最佳实践,包括角色创建、权限分配和策略更新的具体实现。解释权限继承、权限检查和权限缓存的实现细节。包含安全审计建议和常见权限问题的解决方案。","parent_id":"3ec3b755-bc47-4e79-857c-911ef11fcf2b","progress_status":"completed","dependent_files":"internal/logic/sys_auth/sysAuth.go,internal/service/sys_auth.go,internal/service/sys_casbin.go,internal/controller/sys_auth_rule/,internal/logic/sys_auth_rule/","gmt_create":"2025-10-08T18:19:01.563479+08:00","gmt_modified":"2025-10-08T18:39:14.8450762+08:00","raw_data":"WikiEncrypted:arCjhUL6OOP3tq0tMlrtoPZUVARRVnTw525aYFrCIqbEG6QBOjm5e3du5Qm/SOW7RO+umAfB9TSxOT9xkUJQdGFxAzVCFKV/dT+oxnPEIxudZIt7DFP/TqJj390wLSA3TU2jx56lHjMkFbxTB3b+YK2bsUYaxXxgyUYsg0aL1elmmAc05EfOHqD1LjDiv13jT+xsx4f9XrUL+TR6CsMPuCNe3QcVr5JgPY44b59kqygg/oDcazxYTXYcd1fDW1grWYSfWQkLco+lGdxj9phlDjgdV20doL4YrYRQFa2G5te/KDzwIbj7q3oIkGXE1kGQtGuZBMigB6q9X9XZ7RkrZQ8eu73QLCJ3QmHLqxuKGFjQd+/jFHdJ3UBPXhoQNxoLN4ZbS4mmZ3Y27p7n6dKJSJsiJs9ldkimugCR57btqjTDl2LgOQfyimee1zAkEWL7DQt739PUBao/q60R56DC+CFFnpz0YNyMQGoCirk6Ldt5A2ciMtpjGnnAUpfBU4TJd5q5u7Kjw5Feyc9KJvUrJmVNaYX3Ri9BfKEFww59fX9z0V517QOQlX3Ejk1ENOIKIJfp85SAN5orKGmHPhCsG96FgTckuXKW1w+z2ec4H5P5XQ5aR24pC2OGEJVEx7KdQO/Et9qwNo5+cQwLsKfgPgOccuSZZrJVwB5OsTAKmyzkamBgYkOxPxPJvhk4t4knW12lEbYdH98p10a5fiS60NuW+9XH2cw1psC2W5wmFKEXk8j+sHuDcC8FYoR/COQh+COy7rycQMmFWhV+sls04kut4EjUgjEciFqTE0I++4nmaqnqOJydK+FtdNQA+d5v0Y6867bjo06EJ3urA4nkmu5acphb81F4LldYqZIc7UogJerTmW7eN5sAC9jPFef+vs6OW9CmlCueUyNsFUy+lMIvKOIFFBUPSmHYTx9+cPGCBmUCpPMeS6/oF2CCnrbWlKh5NlSjVQILLtN25oqUUrdNrYuvXSPyCjtL420Sw/qQDiLAMvVskbgfv0Ntj7TuZEJ/7YYZt384EyDG4fuI3rdwwnnFQF1yoM8GNBiIUNIx9ohlrWW485KoP9GQL4UmudRw115B3ivAT024y0njHuYfIm9e9wXCq2AxLqge0ThrUeIu2ywFZ1kfogcSe4VtOwBYBXJY2hvGZ7osk39uhBziC7u/OeFFhIE5xy71Qe5Iyx0g1DW/hsgkmrGcMXmSAWhj2lfDxSEu+1InuZsoU5locomPjLn7k5KZyY0oIIb41X/A4XstXmP3zV7Y5gw/QrLpqqIaDcieSsC/8+KSdo8KjrcxT9AryccbHznB4MfzLBQFfQ5xIFXUUAu+unDW","layer_level":2},{"id":"c880e7cd-8a8a-4fcc-9cec-e8143d3c9af5","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"菜单管理API","description":"api-auth-menu","prompt":"创建菜单管理API的详细文档,涵盖菜单的增删改查操作。详细说明创建菜单、更新菜单、删除菜单和获取菜单列表等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括请求参数、请求体结构和响应数据格式。解释菜单权限在RBAC模型中的作用,以及如何通过菜单控制用户界面访问权限。文档应包含错误处理策略、安全考虑和性能优化建议,确保与代码库中的实际实现完全一致。","parent_id":"bac7f19e-b5b4-4f8b-b3df-60a9d5c50b58","progress_status":"completed","dependent_files":"api/authority/v1/menu.go,internal/controller/authority/authority_v1_menu_create.go,internal/controller/authority/authority_v1_menu_update.go,internal/controller/authority/authority_v1_menu_delete.go,internal/controller/authority/authority_v1_menu_list.go","gmt_create":"2025-10-08T18:19:07.5228469+08:00","gmt_modified":"2025-10-08T18:39:22.8738426+08:00","raw_data":"WikiEncrypted:7ZB9yjzZwc/JkOb5fG5L608NUXTqXtsly/V+7mrgNl4fXCVjsk9UflvLgGY7iZccAEBf/aM1MapiSKTXNs/zbzpx9CVSpDtL4kRyFP/nB0eNSxL+5bcbTM2i5VPD7Scw4QcOQ+DBsAcp2x8iVBNdbrPqHKZSPj0k9Zm7unBJR93y24WMhZXw6Foh9dJT3F6boHwV1r7mRIVCWk/OmfPLAm8RogxmVlERIpk4K4ryYbQH2zY1b5BpwKQGGJfTOsRzhwHLDZBQ3x1yFrFuDaWYh4XcU70HlgKB6rCbainrA4NI1Nu/AsBeLo4yrvUg++xR/z42ATRrt7hOc5XCo7ItIxWLXk5qX4w0o8i5zVUduNgI/mov9HkvFA0pQfEJITFxRnikDzvlfxqSs51OenVMe1LOT4w5vu5sSQavinT02sHlojgrtLQJaV9TH70JJIedo92erwFuQGWpbb3lUiNMlD3KddW2mEBuE4V1HL4+4LK1LwSIcMdfRWskGyLEiLa4FpdKpUDOx542or+Hnn5hQFat1UgD5iry3xuc5zyBxNF5IfNToDMormpHTcOtJS0+xb0E7R8kq/AOSGwMYqzMy5/OTLBS9OM/4ajQjDw37CdyC+RaIrV9i4qPudBA+6/y+C2igHgjJq7DSPZV0Ne6Mjfhmn3MYfwREBffLwgWO2UjRAlRp3+AxndaIiSp926ALrj2jT+CI3ruhXVAFeRXgIFSTM8R1DqzHbjmEJun/Wdkl1H7g/DPMUYJZZkCwJ8T3EjVZKmwpnw/dGc1E37pCnRe4sUPASdAvpzld5qzArnNgN0kg3BKgrzPCy5OXc6/WGnOKmey4/KqpQ5XlzdaMWOGmGgnHLSk/RUYtC1SP1hxphvb5yWu08wYUJ6HcfkeU7bFW8tauF5XeJvfCEW8TWYQzn+badk1AYqDl5se69K696bKzt8CMrRzlPGo/4k4XDDItQuzNMN1ORffURgjY+zzFNaWsc740n2KxmDPnMx7lZz4fgMgT4VEFr8I3TrbKyspdnRS/Ua0nOeqQYkPqYX4cflqgTp2kRcT31GO3GVsQtjIBGtyngYq9r4J83pWUgBjyKmAxPYreAv7QpylmIfl1JS+eLtNQ5Y7rSoX08osbb+2lLxiF9DuMOmJ4J6db9bZE74ODUfD+km4SO2lTb0dK4lNALbsoB7Ak0nLbv3t0cSUIOV8GoPcCF+ccK007O5iVRWdR1sVJqega2Wm/P8v3ATgBIezWvlcgCuuigRzF07Hglbp4gWbXoJUWe8J18olmRvBE61PQbmXGl4d1P2hz+sdtcVZDVSOOHlzToNVsDZ+wYQ5MRZlsxowtpQBPNxp2KZ/JqAbOXZqBFjZV1ilFGxIceEX65E/dBAQCR8=","layer_level":2},{"id":"4fcdd635-a7b8-437d-a7fa-e884bf805980","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单表单管理","description":"api-order-form","prompt":"创建订单表单管理API的详细文档,涵盖订单创建、更新、查询和删除等操作。详细说明POST /api/v1/order/form/create、PUT /api/v1/order/form/update、GET /api/v1/order/form/list和DELETE /api/v1/order/form/delete等端点的HTTP方法、请求参数、响应格式和认证机制。文档应包括订单表单的数据结构定义、字段验证规则、业务逻辑约束和状态转换规则。提供实际使用示例,展示如何通过API创建和管理订单表单,包括成功和失败场景的处理。解释订单表单与订单日志、订单汇总之间的关系,以及在订单生命周期中的作用。提供错误处理策略、安全考虑和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"e70da257-5cec-4667-9471-82f4f2d36085","progress_status":"completed","dependent_files":"api/order/v1/form.go,internal/controller/order/order_v1_order_form_create.go,internal/controller/order/order_v1_order_form_update.go,internal/controller/order/order_v1_order_form_list.go,internal/controller/order/order_v1_order_form_delete.go","gmt_create":"2025-10-08T18:19:17.9041558+08:00","gmt_modified":"2025-10-08T18:39:17.2616132+08:00","raw_data":"WikiEncrypted:9qHpiFX/XrbQzm4K3sHnDKeQ1ofxi7BpK4t1qblkOmeHP5ICQmtKx25CPhfRyI6JBsxUD0cDPTYePaevb5jRJ4N5UfH52R/A0sCoeHgOffI/Z2bCUnX8HfPni76+JvZ/5KiEMF1BtsucVmvnNrZKG/vXeChD7yIQ/Hynx08nWaix6LoUNDGCNtoC7Rvcq5pwBvmvijbB/9dvXWAZCeFb8Zgsh4yS7eXAvzcCJ5kO9KlEIK1mhTS1QbKrJSnnGF07DnKNP9o44QFrJabu6m7z20nwoBIDlsOYN5bnOIonGMyvnhu4o7c6GaQ9SXfZl02ppfoNmPkB5cSaFVL/gT4uF3P3XgrBxqQCng5uzkw9XsWiQgcyHG7uTOnIojcNVTxrEvt9TPvYxEh6F1vSsPpcyiJrfUBKObZ+zdhrA0TTTmd2dtYbNiZ9eg9eNkQbMpa3XgW7WJ2NeBn8xfwpYJnMpByua+fvAFz5wFGUr2+ppDZMWfo7K/+rf7Eb4vDWzdRM2C905l9WJcyVUCkBDRPvNLt//IJf1k1+IjoFeep3o0OH1ElX4hPdp1i8ioU9H4KpWV24bkd6yUFrPGtFZ0b23WjrmH5fA+FVZVzBaV144BT25wE5k4Jfz0nEHDq5GhHw7uT5brs7J70OV+v3fwspfsS/Zn4nB78JFGQOWSi2oDYb6DYJ1X8PRg6nY98WDaXSBTBrk9hUdEn+2KovS0bWZ+HAB0zEK4A3etAUTqne6EGvhXvFiXydju3sCL3OWPTP5udHh6/+DoQxZRtmmbKrPOtfYLLr0kWB+3UD98nG1gi+wu2wMcZPTbafai8kRxOOdMr6zucXJ84ZmHOjecLFMQB1WVRbM1B3jqP3lIcbVYEUpKCVXORnxy4Z0QV6/CeVV3NN5Vk8/TVtXtU/34Z8fLJ8qBu28N/14F/fyGhNV3BSWCXnquZ1IbrRG0fjWzt+02vsa5kN+HI/a9PPqmccUWAfNrJwKdLw1IQrVCIShp/nU/VGFMZQ3yn9yYioS3W+2Nvl3VT06cfIFBEtotJNDZ7ZUZXyr8RATD97frEqc4Y3kxYXLgunvq3o07n2n1OAOb/SIJrdVOdDoP1aFbDb2F/62u0bDND+KP0Ck+T5utpVO6bafk1XckldVoWH3cn9/mXEe2huF4bk+HxPhAdawxi9xH6oLO1EI0gFoLqnLi37c4a6pUs68fciZtR71WPU/dlwhLOd3ix589lgp9vk+tMoijKY8QiAdFLArqL2queZabhWTfmz0FaDJaoReG/RwKphYYsYV1JopUf+LM/Zp8p7DqptZ+Rz/tt6LCV9DQi33goXexrkNjFpAP3XQlgdozNaqWiFvLcf+7ulDXaXa8n7kH0gZrBNCBVJ3sw2C/0ACuvN9ZARnGEJqrpkYD5egpAPB6t+Em5yekNgxAnU2O9e6UT4loHNgE804ky4vA22ysES5j8aqp4BrAh/6u6/x8lE525ri0j3A91C5mwWkYd81t/pOF4o+0YAoBKN0LG5y+/Hi3dIqa0L/erx254GlfIckX3kcIHw3x2mpqvSiGQfghtS4Jgi09lIhF9heuUa01Esc0oxypx1SvuJa/9UZaCflaxLJhrHefnDrzln4Dklv/WOYxn9kCcvpGu+OhHstudVrTU3EnZZrtGfHso3TN10ucyBC1zHgyo121lQjg==","layer_level":2},{"id":"65e19eda-b904-453d-858a-07d58ddf98d6","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密管理API","description":"api-card-info-apple","prompt":"创建Apple卡密管理API的详细文档,涵盖账户管理、充值处理、订单回调等接口。详细说明账户创建、状态管理、充值提交、历史查询等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括批量导入卡密、充值状态查询、重复卡密处理等场景。解释Apple卡密特有的iTunes回调机制和防刷单规则,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注Apple平台的特殊要求和限制。","parent_id":"667164c7-51a3-42fd-968f-e3d167096e33","progress_status":"completed","dependent_files":"api/card_info_apple/v1/account_info.go,api/card_info_apple/v1/order.go,api/card_info_apple/v1/config.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_callback.go,internal/logic/card_apple_account/account.go,internal/logic/card_apple_order/order.go","gmt_create":"2025-10-08T18:19:17.956762+08:00","gmt_modified":"2025-10-08T18:41:41.6822755+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBn7TEZqfgCsLA703mVGMZArD3ybeGVU9mamcCr0oAS6JoQI7AUsc5kkDVupPir3EyB0ASCWYKnCf1ywH8t5TiWXMOBEd2IXYke6xZIuMmkfI4vQ8pmtl6ZGzsEW+v8ATGdgc/gC3dxkOgZfYL6i3bx5NnZFHluGgQQq+VPTVQLx/gNtmTw8QGU3n/7XhmqQtUhi4VDDzZwONwskeuDx7RVD1h5iepp0jdpixdWIwY/lXlDCPaH0x1lRdgUIk9ujJuZXn9N61WiU0ivAduNinSq8AqHNQ0DrV1Fggqy2kJ543LiR3eU9ditGTLgtpUd2WnA+SMPDbtGFXA7plzUkubPHUayfbLtiF9SaLCjeeQzLLxXaCZFDjbhJP3rEKfUvSfveLTP8MZbpXUiaOwo0iBBAunWuR67P4xi3HyGaj6Wc7Rbpjo5r80O4u4OyiEZ4l9JRg1TBGkLaaSDr/C7TOndwfVJUE8KK2WgQTY6HpJR1RjQas+5wJ6MSkXgBW6xLVoYx/NcBQpDjW7cl8eAlmjThgTVP5RbmLb5HduIypeeuzocGiH4QqnegPVM1giGUeGy58Cb7ODGKt3PTp1wYeiL0SQtwU/JYbXD/S6cUgIhmHxr2kS2FrG1uvfJBjNXcHpCTSknFdohWl/an9YEyvLFgTQVAnFyqcrRVB0lr3kWnyMy2vCNEsY0pGa/Gu009rPvzfEeQbo4m0Hm4ekIL1gjxe/mkewU5ZJXWuDLGiNFlD3I6ouGP4HaSy149sY5nvQFx7J2V2eQ1tV1JxK8gyshzOmvH8Ip9wtihX7hUWzIvF0kaEZ0n3xn55iRl89Vd/Z1kH15/3fgrTtqp4BF4xxly1/pYOQvurwZCRYsQq7Piupu/LXEM5kCzUmnccmTgF5Lnho/8rmOW1yZxvUsftjUd09bZY+MYqkEXmFOybIKyhkzB1vY02SVb3/3aF2kADPdqeVT6MbzSI9TX64uA+obPM0ERfdnXHOzw7lrRirpf0LqxnFGo7NLUx4y+iNe+g0In3o+teUHrkwmPnHfI2iwWJaqL+btH9vtcoiJWbN2oGBK1Ykf6h/cMumzlt6PYMf0LO/PNTm5DN8QwloR4FVz2qKHpBQPDu71WA3+8pjnuUcQEcDyCcWfK4z/OEC5ma1t3IE5oseRPRZhwdawXv+NMniOpXnTs2XOPjCrHiGzQ4PSlZTnKnpU0DOnAGPq95KbuoxdtrQKN7Ba+NcdmGcsmbRo99VpueYJ3lKEi3RhvnFksot6i4ysbd1l4lGJiuM48OCXuTChlxsOT7o/hXc+KIvfqwmEORUZrG0SWAOg+ayZ51XbYJgRHGxQK4ccueaog5sku+qfoJ+79mEeRIEzhu+bqmBpEm+SdnYlS8i1snB5K66BnrTTkxQsbnzJ8MkRrQW/VrMGN4f9PrtRsUvXacr374SH8Rx031NkQ3V0fj8cpfed0Iz6BtwsDkLfEUNUtgnKLw7FMQ89wJuK8CMq2sp4hGMNTf74OEae+4Hw3BfIbWNXwtxpAsoTZ/iOtstJPqEC2jvsjDSUm7tc3qp5qoZki4dqnVm4XhW9HzQ2uUd9sgf9x/5wRA+QwWAVu4CbxLtI88+J3tf7PSfJLaEZ6ydbvJfyVwgd9vWt9gEmXMeJG3CIwOtIQBoKIHS6cLMw==","layer_level":2},{"id":"bf4dad59-5b01-41c5-a32f-2997c514506b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"商户配置管理","description":"api-merchant-config","prompt":"创建商户配置管理API的详细文档。详细说明商户配置的增删改查接口,包括HTTP方法、URL路径、请求参数和响应格式。文档应涵盖商户配置的创建(merchant_v1_merchant_config_add)、查询列表(merchant_v1_merchant_config_list)、更新(merchant_v1_merchant_config_update)、状态管理(merchant_v1_merchant_config_status)和详情获取(merchant_v1_merchant_config_detail)等端点。提供实际使用示例,展示如何通过API进行商户配置操作。解释配置数据的结构和字段含义,包括商户名称、支付方式、费率等关键配置项。说明权限控制机制,确保只有授权用户可以修改商户配置。包含错误处理策略,如配置冲突、参数验证失败等情况的响应码和错误信息。","parent_id":"a2cf591c-c32b-481d-b282-9aa974785e4f","progress_status":"completed","dependent_files":"api/merchant/v1/config.go,internal/controller/merchant/merchant_v1_merchant_config_add.go,internal/controller/merchant/merchant_v1_merchant_config_list.go,internal/controller/merchant/merchant_v1_merchant_config_update.go,internal/controller/merchant/merchant_v1_merchant_config_status.go,internal/controller/merchant/merchant_v1_merchant_config_detail.go","gmt_create":"2025-10-08T18:19:28.3296389+08:00","gmt_modified":"2025-10-08T18:40:25.9745072+08:00","raw_data":"WikiEncrypted:BG3lFnKLVTvBR2vGYwCPyUjsvllLhwi+whN+Y9/3c+n/MVnEm0gAKHUg16cqvzionAovu8HBvB65t8ZUZvp9GL6L6zCIgNolbfADOkYlFi0gLvCLW5GthKYW2OyFJkv+Wiy7IiIM5FBogfrnd8MPC3qDKEc9BRAwUrXXQ4eg1xLyTqeZAjcseBpq5uxnn2YnSKlLmr/9TYRbRLpfhCVmx2v3bsvpmzS3l88cNrXihzeGgZAe0u0XMjJg23lUNRQUAPGQpmFzpr8YNcCmmwQXEegXQa5wn7x+1fqAaOCWNv6QR8KK7YqeaJiH+4ZFQSJUSRQKLHI4+f2fywPi1r9vL+zbfXVGb+JmeOYkYPMpk3JWw53qKeDKJu9BcFspV5hdyjO/RKu/pxkh98zrCD17B0yDQ/8nTkrY7MLN6/uTk9WTegMCcYSzUTAMB54bITpM4PEPkHuGqH5+zi/3DuNETFmz92DlGFLDTa9yb7d9ygFUdnwO4fxsxCFX3RTRv2WCGmeu1cKMPbP9Z3C16Tnds/NEMqOcQJ5+uNcMoAqUFM37FJxbKS56qe+HdN41oTCVMPDe/koxk93uew2qTfbhMQcrbB22hbLuhZiZL/Nz/JGozyLuJFVgazwKbyS9tegQtAdeAAiH6YRqBzRGq12UGPKk/wA7XRe6NArMYtQndqbs3e9utAzpj06PYElnikFszLfsPv+6S8TDavLjizN0MG8kAv8DXbmq0lW8aVpaFOMDwwIak3/SNffLEjn2aHURX8fkWDAQYr9GL2IQhgcR5xIqajU/6TRHu0HMQXHyufxJDIV8KNXziRgb4mOM4oKoOuo6rYg82rziDkeuLkZpOUAae3n+UOyMEAxJxAb7hUcddACeoukrdVCs52zciHdLr2KOCzF5PrVTTbJ2JDqYi9CZPcpA5yiBLOf0nqTU06YPZRv0G3UPLNiPcG4fEMhRlXjKSbLwXpiqcwGwaEH+lwST8np1svFMozhb6kfLqrQs3JsP08vqL6396nqX/+UFLg5J18pGPa3n5RbTmDLLzHrA5gNAhKzgJvjVCCC5z+uzOZTraeJi8Ya/toYfXIoKBKk0tAtx6UObQLivccbjURb+Mb7HpUVsxXrVw8+wbRwbSXudsT9jkak1wV1p5sAtiGhwT8qmMwNWrDAlp9Q8Deyl5cFpDl3+VwUGP+q2hnetVvVV4l5wPQVkew6qaLYIiq5+jHZ9wP3Ew6VfNIgXpTNbZkaRF2jwXkq9lBrp+u1Wx81GKLGVHe1ZMutCqRNoNEQePJOMWKYJwH5AaLJ1DfcZK+ODkaAACpGGGSOrG5tnLhahBZ94j+xZ7Ozp81lpw/7giOl6dXVjNuFBXb0GKEa0rhK8dV5bYa6h9pqNe626ZbtT0JR6XBPMYDTNOnHZC7qJwZ0q3Tyexl8uCCRgqFpmkI24FPT8ZMBoO4Uo/EXuzWkOCulRgQVQmDJT3UByD0YG2N71EX3kWCB6aTa9CArXptCKvrzECHqM9vKq1kpiulPz26R009tvbu/pyigkeU9T/h2lZJbH6wrdzI1umscSVrgehz4nXP+6UwSCHWPg/b2T/GtznN3JaRqcekDMb1AnnOWzcTqHOSkGiaS/fRyrTcZxaZsMhlnvVmiwlYv+Jx65gvRdpmd+rMAun6AVE8b6fnwu6FHtjEuJ6J/9vhGrxnhGieWSehYq61C7kjT6Ld5BKHNNVU36Oc68Bm8sNfWCSpVfq4jvEpEsPMUtkEkK5DUC39Ncdi7mGAReSEbJGLScqHDn81+03RdC7BgqYBJ1QLV6HB0oqonigLRLtTMZIlgIhateavfY1ZB9hDQji3mD2BcbDfAHUNte8iMkOPPt58lODAeor2Nuku3tXw==","layer_level":2},{"id":"a57b71e5-1d71-451b-b859-003e624668a2","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"钱包管理","description":"api-fund-wallet","prompt":"创建钱包管理API的详细文档,涵盖钱包的创建、更新、查询和删除等操作。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括钱包余额管理、状态控制和权限验证等接口,提供实际使用示例、错误处理策略和安全考虑。解释钱包管理的实现细节,包括余额计算逻辑、事务处理机制和并发控制。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"8204e495-d056-4c0d-aff8-fa8cd1e804af","progress_status":"completed","dependent_files":"api/fund/v1/wallet.go,internal/controller/fund/fund_v1_wallet_create.go,internal/controller/fund/fund_v1_wallet_update.go,internal/controller/fund/fund_v1_wallet_list.go,internal/controller/fund/fund_v1_wallet_delete.go","gmt_create":"2025-10-08T18:19:28.8511415+08:00","gmt_modified":"2025-10-08T18:40:13.6249537+08:00","raw_data":"WikiEncrypted:gLdwQ0KTVfy2nZNoG+5bdanSkYpF//vxeQ9sn3ZD2PSyqLrfcO12FxqvLFH7clPHKW5YbGibCYaowMn6lbHZzM2+D/+NQ8EbPTwbM2ItDeyWUppEH7xgv3AiH9Krc9f1tqqg/yEF2noAjpujnYGl/yc39DfocKeu4byCrycqWZtsKn7z8BfZWXm3BD5g+RuIDLJ7BrdFO3Lz0d4Qhb2UkZL2yJUgQQm+HpJBhHU4Bmcbg6XT7s6tR3ET0S79uQO79Eq+SseXl02Wjd5m4p++/UduQxW+uK+z90QWkNkcFX9+8cePFOiyvGnukbAut/1ISM30v/p/lHnF/fIsFm5+ZUCgwcnq6sUv/yZlN9vCPkhwP1v2gy2BhiVMLGyrMQj3KsbOGKJCuZuz9JvheVxe69JXkYwMpRWHy8ffEvlGLRyUmflEPC36DEc2rHEFh1ROikU98jAMdCcJuoWGB5pm8IIWKHpLJpqGbo7S6BcK3DFk9e7onzo41kTNHIWwuBeKs8Rj+dCteOq+qceIxmpeFxpJD5EBwPZAy0eMsh7VVXW6OKHkzsvp0xNzC9pXZS3T81NxuB0ltRpTB/PoJz9lutQ+jcoVHAVnRMNihCMf8drxVHu52P9371cIB7Wgj74vzYuthQxTQhZmEquJx+tv4qj+AUz2RdORnaTbixlnW/1B8783+OdO+dK3NTDjIC/NvN2iSh3tk5Ti7enHir2YmUDZLkpDGMAkEtCnlawu1IOej8Py4J/2iK2WSVraS8OGJzGrqye4GN+6veQo/wHHC0ls5H4dlBnFtQXkJReTDtQWyohRywpYK+nIDNtor3AS4ApdK92Nvud/ZeZ6ketkMnxbB6NEFQo/cwE2uk2OYUOw06tjYaq/5v7/hYJk6KcUqvbpjGE1xvCvans71HuUtWQEdCmNHOYfapQ3L3Zw+i7jp5FS4/2d0CUhKYxE45RYDXn76YmXAT3TWFq/vVB3H0PTmGTPzSdbZgTnpmkE8zlJgiaa28zUEve8vSj4LIlGRB5HqxAnURcdAL07y8JDXJkVU4+Ii0w3VRO9nR3G8fpBDRKLbtUR/wJVumFHBKPsIrMATgUK/0umDVUJhWA4A/y1Ks3Bi8rbfU1x5aQB/3mkqp3ZEIb7OAUvA6D5JksuqsTwNp/TDXAOV2h3aaQABECpmAMxmqSsVRsBZFL9xzR5J0W1zmlSDm3X9+9dYckFsOrKMC181gx1iGjKSninZZjLEbgIciVnmdcOPH1j+e41YfRLXnkGc7v8lRoUsNbZCp1SueQKES4eEXRc3Z7ByBGWSDIY49n5W7ASOensJsE=","layer_level":2},{"id":"c3bafd09-0a3b-4367-aa8b-205d67e4c3a8","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"IP限制API","description":"api-restriction-ip","prompt":"创建IP限制API的详细文档,重点描述IP访问控制功能。详细说明restraint_v1_check_ip_allowed端点的HTTP方法、URL模式、请求参数和响应结构,包括认证机制和权限控制。提供实际代码示例展示如何检查IP是否被允许访问系统,解释IP黑名单/白名单的实现机制。文档应涵盖IP匹配算法、缓存策略(如Redis缓存IP状态)、性能优化方案和错误处理策略。说明该功能与其他风控组件的集成关系,提供客户端调用示例和常见问题解决方案。","parent_id":"1213eaa6-98ce-4b50-b9ac-280f7bcd9725","progress_status":"completed","dependent_files":"api/restriction/v1/collection.go,internal/controller/restriction/restriction_v1_check_ip_allowed.go","gmt_create":"2025-10-08T18:19:31.4162544+08:00","gmt_modified":"2025-10-08T18:41:29.8811493+08:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg9UgvWUQwsNKohKsInf5hSs0QQfDn2veT4X+kRCmlL8V7Pq4z7dhmmPz1VcC+RU2Qf7Fnc9kRUMA5sZH2EG69D6PojpUGyAFozLrrMGPL4e7QVaF+PBD1M5l0d7XTmfQnOiPxZyOiSH/wKOSfnTn1RtDReXqbnwGJZWe8EKWbTrMWS7cwn11oOcdQPBrjFO4aveFCFRDyklv80p/CDPEsUtQUocJ8WY6AIqmB8RkosQemHvb6jmoDYTQV6VYYiXtbw486CzKDfatNuMU/Woe2sp78Bhdi+40HqSeohFwnEaTpOmByLU78A89tk/zqDyLN3kVt5AmUX2hGwri6AzzbRbj2DQXG9SNcjpra2J8QQgp8lp+4KJqjQiKeifKyRO1VzaszauCuZQW2Gbq/o/Jw0/7tdDCRpOSbUsaKgNEFKz9MrmhuwIu0hYM5JZIHZ8RzXyOStuolXALCpxMKwfT+OG3QA1OjzrD7pN1K5RtBfyHP+L43u6j4oi0CSv2lwnAtntFYrunnZr5B4l59wIBfLoN0swodz+gpArcDimzwrGT7SxLxA83Ijn8577jyI+VvSMplyH2+X/pGUYfK/jrYAuRDpuFEshvwlEAatbMm3hFmcdA1KLVg99qPEmzBGxGfzK1HWiGhanPJy8LAfqab5m/m5tk2JidZQIC7LXJegWDhatyzlxXmbzmWQ43U+TMpWsw5ul9sN8hEizZnvEZwxZTBFbRhlvIT5WUNILc80Y1XLcq29DmmQMtiuL/pbI1VP92gPW24t8zwuBmx8SV8ohNv4xrdYWkxreJ4hHa9VrCS5l2c67bPkuUocN/HtWEQtN5RFaQVITEps9MKJwQxclSl3LobGjmC46snYtG5sfFiglxxdNuLjgVz2MByxzX/OWXTZryfkJlJLA6kCvsrbLoIiq6gC4ajqsjBL8j8UCWGzzOjkkpdeXmfA3nLfMUhym8Uz60JfjHAc/y0apBiN9iUqIZCopKb823J9GeDx+YSnwZquVQhUVaxV0MJrBCE5/dNNgT+Yl5QI6AcJQi4ZKiu+Cvx8mInSdnZJvbChNYe04+73yQIMw7x0iqFMEqxKQSuXxfslbn/cNYoGfAUpv4xAvw6BbUOoqtWe2CrXg6nYp36yXVG3aFtfIazxPDGQ==","layer_level":2},{"id":"59443325-27d2-48ec-b0b1-babd3b4b0fdd","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Dockerfile详解","description":"dockerfile","prompt":"创建kami_backend的Dockerfile详细文档。逐层解析Dockerfile中的构建指令,包括多阶段构建策略、基础镜像选择(golang:alpine)、依赖安装、代码编译、最终镜像构建等。详细说明每个指令的作用和最佳实践,如WORKDIR设置、环境变量配置、端口暴露等。解释如何通过.dockerignore文件优化构建过程。提供Dockerfile安全加固建议,包括最小化镜像、非root用户运行、漏洞扫描等。包含性能优化技巧,如层缓存利用、依赖预下载等。","parent_id":"4ca438ce-5592-45a7-bcdd-830f65e0048d","progress_status":"completed","dependent_files":"manifest/docker/Dockerfile","gmt_create":"2025-10-08T18:19:36.0389265+08:00","gmt_modified":"2025-10-08T18:41:44.1801132+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kCSkV9pkP4w42aezSpM8tSnz9DM8PXCI3plj22r54nyHKillw//OdJftbMVj1iHO7i3EACtEoQsA71iwCJ5DlnOvTxQjZAf4O7v713BlkcrCcnWhGA+8tG/wMGITGEvZUu6BRwqZhUXr9xxPIbRR3jEc5tarJ4sMs86NWoRvprRsZhmvuAmFTGimqQ7Na/92ZYiHHNAkQGH886Q+g6gmd5o00jhdtxSGHkOMb2NYcrDYYaoREGCEeyMD9y8wqQVgR4FXlLFSSQuCnNePrDkxqTFT2Mu1NaAmZI+ruDl4TBJBZdcd+jKMaAZt/44HA0t1/8if902Z+o4jMReQfwh0jYxpkJJJi+44WtAVk/xX/Ou6dfzD1O/CC7zgfrJH4eQHVnLNMy6PHSg07dueN5p9KQeG27NEWOTFua4VeWM85/I/n13D4iFgzR0Wra08nfNSpks+F5Vl6gBVUjmxqLbdhHI6Jn/LkX1PD6NbvTakGv0KIqdtqy7uhgJIG1bUIc9q9g6v/nzeh0/j6iI18pSOji3l2W+8XfiF5hcdbG36JaNdfSWreg0ucQn37Dwj6ykOvvxvo982hkKcsIHcRDIYaukC+SGHbChag4WlrTmFEdqliI4bUzqlx4v/uhMDSvrB1pQ92u9Wh2ecvq1BePVHNTT0SN15dwCaHY4XDmsLk4fytUw0Ff4A312ofSMlKEIDVXqdzOTeB3jENRRi9uXPBrQKtGbN2N2O+rqtBxVrM4F5zcIn4e+WZP6Pmbhshgg9xygQjQf2mvxNRDX9KOfIfoTgqONts+uVJykYo+npT0tL6Ih2lFbadsNVjMVDYHfufrSlTPIV0eBMD1UfEeUBCX9+N0wusLPcyUdSwgEBRATtvyeMoAr421D+XqSccif3R6FvgWiFpJrGcGql6SDxeI1wf76ZdFeKSEDEV0/mGJY06DohEo+6NhCZtghVhp2U/IqYtszt4KAFddk8dFtxjx3zAFuaOY1rRz387jPu5wnr0S8mZbuxRxKwh3cFJ1H6VNlO2FWbbZ7UYOv7mmU7Bv4=","layer_level":2},{"id":"fc08f303-bc77-43ab-a283-6dd9b2e73b10","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Makefile自动化构建","description":"makefile","prompt":"创建kami_backend的Makefile自动化构建文档。详细解析Makefile中定义的各个目标(target),包括build、run、deploy、test等命令的实现逻辑和使用方法。解释每个目标的依赖关系和执行流程,说明环境变量的配置方式。提供常用命令的使用示例,如make build进行编译,make run启动服务等。分析Makefile与项目目录结构的集成方式,说明如何通过Makefile简化开发和部署流程。包含自定义Makefile目标的开发指南和最佳实践。","parent_id":"9e74acd3-671e-4b63-b045-115b89d5bf61","progress_status":"completed","dependent_files":"Makefile","gmt_create":"2025-10-08T18:19:37.8788509+08:00","gmt_modified":"2025-10-08T18:42:23.0518151+08:00","raw_data":"WikiEncrypted:Xz6OVSa8P8xcLcBGQtqZT+Dxn1zjJpWxEV24N6Fu+jinDqPyZqB3u0Luse3ArC1hNmGPMdGO8PFnUOI4dBiXnRprrnrFLNHKqkXdqFAjH6egtx19TUYt9uswGPNuEndVx2EB+iEjV8LbEPzVXN8rNtI4vCMRjbc0Kz6u/M2ZPdFq5RkhkqIAXABX3TXjsGKi7FAEdJYJukF1yxjLLxmRA4fbfh+KLotOtlU1immC1ELsE3u1ihg0K0ss8PDw3gQgmSNE9e6eU6f9DYLRj9W7CBqpQG0eNqJQoLNH5jk47SG22f7kwsvHVOdJMxQyhIsTA6fd6yWAx4fBIaE5XkRoymRNhhwFWPM1aNTCKitdXh67VS3bovSmZamRIIvOFk4NYx8yY650VNEwaQL8/6agTN4uqs3YRFSX4raNv5gy0jLwASjC4oYTbDbCyBPTc98w43OxYz9k5ovTEY3P33P5W85oNfFnvFdr433BCY/jhHJF0mdYulXe6uqR7UIqlVwo6qZgeBVUjuSR2Cr3dP/ta3qv0kv+uPYChbs0KuoldD3+YUJkgtfS4hn72+3Hn0Z8qQFMu9ggbh/7kmUM8Vt2qOVbQxJGgfjpXxFMlFKzyDSGBxSSby/EfKBTm/QIV96E9ItWWGO5taPQnHfedvNFPHEQHGLRRhaiX0r/Sr65eLmku3+pcC3R3X4OzUqh+UvWGQ8EpGc7yf6eaMmW5H4ys5tOpDWFkZLzvhLmtsmk+NKDebuNejLXjsgR9AaC4KV6kKzWiXncWjn+34Ds1m5/Dzq8n8dl8nmP2M3eW4UmpzoPQcjXgup5LTVMLW3WYwfjaTHv0DZipmA5PiZ/67oKJAkCWZtikN2eH8aqazUJZw5xmOn8kDvMUeffjTQKVtoZXgLJJOJ65a3DAptO1kurzv5QOOgY3FGjgqpwJLURtxudQgR+58qc3fXJHs1wETY9M1nKBoNDT0Zik/L5sc4aas4pAdnOAyfcQOWQ6YcRQQesZMeVIwkrITWh/fqX+e0u","layer_level":2},{"id":"e264b815-c6f8-453a-8aa4-d6f2332a759c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东平台集成","description":"jd-integration","prompt":"创建京东平台集成的详细文档。重点说明kami_backend如何通过redeem/jd包集成京东API,包括京东卡密兑换、账户管理、订单查询等功能的实现机制。详细解释京东客户端的认证方式(如Cookie认证)、API调用模式、错误处理策略和重试机制。提供具体的代码示例,展示如何调用京东的充值、兑换、账户查询等核心功能。文档应包含京东API的配置参数说明、请求/响应数据结构、状态码含义和性能优化建议。解释集成过程中的技术决策,如为何选择特定的HTTP客户端配置、超时设置和连接池大小。提供常见集成问题的故障排除指南,如认证失败、接口限流、数据格式不匹配等解决方案。","parent_id":"246ad670-c405-4630-be1d-c8b8f141bd4d","progress_status":"completed","dependent_files":"utility/integration/redeem/jd/api.go,utility/integration/redeem/jd/service.go,utility/integration/redeem/jd/models.go,utility/integration/redeem/client/client.go,internal/logic/card_redeem_account/operation.go","gmt_create":"2025-10-08T18:19:44.4616075+08:00","gmt_modified":"2025-10-08T18:42:53.1785049+08:00","raw_data":"WikiEncrypted:NMfJRsDF22mk6ffAXnKquiZVBfZxAWIZ0ZQYk82IuKcnPSLbQd7/SJxA48L+S/QXk4P0/6Orjl2XelNsafgtTpwS8TFvxgqGXZK8kEnx+u/OXlZlkQc+NCWLcAHZUiPw/5TRvV+oXYICAqiw5QOOoXz4Co4kCjoqkaCuuiR+Njb7022YEE/Zjkcz0Z26dPccJ0niq9x/nRwu280uD1SewH/J3VsdN/DLnxH49G1hRon89iHx8FNnI3HKOr8p33opiO3Qb6rGt7mOx8clZkFaWMioED/B03A9X3u/kF+McxugigJb0N6cYkVjUBAOFbWwd95NGAAJBiNLOTgSl4Q8Imowt2Os6rpU27tkbgqwPvQA+mRZKxBMz/kKZxcxcLs0srHDwid0elYAKKxXredPl6/UrdIU4ZO5zJ8o+1EKab+5Z2YmbHN6UDm6gc3uC9MmORbaPTfeP9jOzodwKZcZrp9l62iCTjBboZlNP7fQ/a/dS7e+bFbEIgRuIlyggn1I1//8NFzpYb/un/cl4gvGnfGASX13rO7L1zWp7Wt/11nt1S7yE+DuVcykkKO1VzwaJ0fYxI8F8qTg5/HkoW/9mA6+/nC4AMyQnF0DLhF53iyEwo2iRNnQkGoxwFjnFkt64tPsl+ciNgvtDAd+1vEMpKdF0qgeHI8V0GDEPBA/gw1wg1Hjm49LE8QLGQQQ1wGrPzoyFrska6/7jY2DRE3UmsrQwTNWUnWz1lXY0MoqQVE3wVmZdPGYbsM+rdCf3dZgaCqaTflvHH1HXhSdt6YKonQRiNAnhAjN+JhfYTMyw8tvTMzge0KqEiQR9i0sJJDCUOCtkPAcBaA24nobsmHX0aELWfOuIs7IVbpJqffxMKyDIHQW7XVNAREcYzYemnHCt0s0FDfiaXlwOVd0hpNEWa8EwOqlj9oheDfyo9mP+g8fJ5vhnIunhUPHtX7pI8SNqp2w86cxppCWDTuxztC5Y6mVD5xkzZ6PpF6l7PPR/4L97l3036J9ZzirhNv9WgIPPuZBSEERfMLEc64MMgV9/X8zcgMk72fXw98LOqrbH9WGzYCZLcEcDZ1LskWy095JxnmAzUsC86JdhD+eukETXjEDGkZilyHtm0s2I8LolX1rWiT/q9HG4ISRdbwV2NyMMZ+d0cp3SODqK/LZ3LdtLzhPWhwBQhjQByycgoWCPCN80G77gLmCu1NPiFVmfIwQJegTbh04Ws2hNGvRw2z3dY/oRA50+hLeQseq+MRxLvgboMdvm5KC7zvgXgnwXnjtFcP3C69efoMn2xCQbrZEUIwj4LU7uKPvc1fB9jSWrlyHAUUBYtRwQg9uEXUhU53HreK3H0670XHlFOnEhfqU0dfmoy+3D9///2GtNA6AyHWbHBW6/MGsEl9KYsYq0DXZvUKhNHpjAbABVHIBefMwOR2dTgmbI9DCfq1gMMbwQ4nYJLIlL60Mo/d1ykWtDhnXwv6sI/F/rF09WKoEI8Yj4dXpavn2J3VV50Fz0CYM6bb/iNHhvb6Z+kDI6Xj/VQkDeoygk49evqHd0vp7vrYp92a+Kjzlqce9SNGNHSlbc/aa7B68ljmPzKvir9tDGtq1Jp8Etkb0SLZUgrwFVH4RvNoHZ/YugB9aujUoWEo0+wU=","layer_level":2},{"id":"c9aeb23b-71bf-4ba3-b7e9-6e06f1b1074b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密账户管理","description":"apple-account-management","prompt":"创建Apple卡密账户管理的详细文档。深入阐述Apple卡密账户的创建、更新、删除和状态管理流程,包括账户信息、钱包余额、状态同步的实现细节。详细说明账户生命周期管理,涵盖账户激活、暂停、恢复等状态转换逻辑。解释账户与商户、订单系统的集成关系。提供具体的代码示例,展示关键业务方法如账户创建、状态更新的实现细节。记录账户管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"1a62d745-3b65-4062-8a9e-207c4435c8de","progress_status":"completed","dependent_files":"internal/logic/card_apple_account/account.go,internal/logic/card_apple_account/status.go,internal/service/card_apple_account.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go","gmt_create":"2025-10-08T18:19:46.5459837+08:00","gmt_modified":"2025-10-08T18:53:45.0669892+08:00","raw_data":"WikiEncrypted:ngLqLViTt5zzUmJHZ62DoBWmlVTe9rZaX5hosPNAApW0T1uT6n4zjorEkdqGh56+GZE8RPLSrxCBo7Kg1h12kViRt58Aj3n8+FzdDFp7bvwEBscr6hd0N2fuTcwkJL/ex9qIUrnqZYabutinVv60QecvClj2U9jtJxZpAIgdWaLYvnx4JLGxZ1PaIXSJjxhYeffI+Kt6CpElT/s2ToVoJGivcoigObBr0HJ6d097ae2TV63ruyGno7Xko2G6uivsCIGmeDtR0XpdXNxf1hEoY0YbiUk5inhvQlOAofkrUtJHVgJwiAr78gvhUxe/KBv3jt5AkQAwkxyewfayfAjclkxbeMw+qvW3fuX8pHO657HYTRXporhQJLtrYLVBTAK0lj0AfcPcWsj6ZOHWNcdF9QWJnSHe0fKcBYkL/IJJ1LQRt6Dc23++VcquH1UWlRbjyWi0Tj7FXwoPEXjYNnrNh32Y6Q4aZRmvqO6O4dObEOt92p2LNInowxSFhBIJJN37zsTlOrZ0r4tGkxNLZa3YuFWxohcNzKsWkEQ4j9KJJrqTS2AElZlozyZnCJGDdJEyfFF3fNih1FjGGnWHdyiuEAiTm1ufl1pWp0t/J9rL7OhDgWJjQlPLnUmXR9dE/paLqsw46h9KN2dEuFCuZrqfHFcaNtcE1z8XySTT10aNAUVmN8dgmhNrsWBQ8hTFODlWyEnhwjx0MW8WxkeKH5fMheaastOl6UyOnUXirhnItmocSOejN1XMRc6teTYo+cYMQM88aOz0x/Y+6l+SSx1uYEeBUK3dLQC0iPepSXmtMfR/Z0fSWrX5xVtSyKDCsbCjtVeJshAmlY48DfmpRHKz05xkFNDtwbUI+NXQvIEfAOZoGlG13w9aW5vot3TtODeWAPEvz9NR61orto0a5NwrAv284Nb8ZClaChbu3xAIpVJeBrIFAZ753X8DIZ7XfSat69myvxi8yo6Nhlsx17XWf/I2ZmMFMFLHvdwBJK+Iw/IFGLrwoQq1idTC3J2exp5DFuhql1iYPVvRD5rCpz4VPjnrHiqWvMlhzUk4SP0sNyWmoNsRuQOL6jnUZdu5GfLGLk5vqYqjeZyDlUZey4Rw71OqsfL5l+61osSWlrIBnvumRk0sDwNCSIQXwo+1ekK1pua1sLGDIxDSLBMw0ddS9onSVCafMFiM5buKXGRYfrl9UccI65ZgqkLvK+a3fe9BK9X5sJDxkHQk8hpOWEdr61SZBOZdiEL/HZwT8uCvfbLlbuX8RMhkL479RpjSvJFcHatHHrpxDMRQqUB0AHYw187wmavHy7MfYzFFfxwm34pTRvyn2XF843RR4v0Bz35dYLhxuHgiW3olg8Fjw6oDGUaNri894hp29rdsiMCOqF+EbAbfKIKlxHJXYvyCQaplyJ40lBaKxgWlvP9mPspmz3IrzW9hg5DAZFDA9g5cIqXzcTSE8rxyHh7QD2/iOzjfPT6VvXFlDgfolfHimzmSnbJ2bD6znvOpONP+k1A5Q4PRlzNieGHn5eF/GPbOcpoaJe+NGlmhSUvLxLjpHG5AVuJ5PW8rpObrPHpi18GSZJqRmN2SqbB6hyL91mLDfw+o","layer_level":3},{"id":"d2f96216-9ef5-42b4-b912-c8de7846df36","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密账户管理","description":"jd-card-account-management","prompt":"创建京东卡密账户管理的详细文档。深入阐述账户的创建、更新、删除和状态管理流程,包括账户信息的数据结构、验证规则和持久化机制。详细说明账户状态机设计,涵盖正常、暂停、禁用等状态的转换逻辑。解释账户与商户、支付渠道的关联关系。提供具体的代码示例,展示关键业务方法如账户创建、状态更新的实现细节。记录账户管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"4b047e2f-4d42-4e10-a12d-f5dda665ecc6","progress_status":"completed","dependent_files":"internal/logic/card_redeem_account/query.go,internal/logic/card_redeem_account/operation.go,internal/service/card_redeem_account.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_delete.go","gmt_create":"2025-10-08T18:19:49.1106933+08:00","gmt_modified":"2025-10-08T18:53:38.717696+08:00","raw_data":"WikiEncrypted:2Tw4z8NsJjOlKl4tOUQ4rTBhpacpL3B3JqOjeV0quJhHeY4JvPnciyP+by1YUNeRemQYuM9NFpdXQryPPslPNYiO7OHybuYaJ6BeXEVnWJNP0Hc6AjitH4ckNyCULFHcp+wSQDZz3ViqsdkiH37hAt/G2U9cMSN10npfdksX3t1kqoeyoCjWC8sUn2y/fOrRhgnJ6d1t+w98D9NFg2l3cfEHSCXaXgrFriUYu7M+nrGAPmV/OXa85AyUQ31H6gAFdZ8QapoUP1Byhy4E9sncB8Av7VOX2TPrCwbB4mzEvOj90ggRC828l865qy6LiH6/HiDDlMBl0F5+VmCgYxW0aQRsdBIrAhkA0+6UFDN31Q0fqBAcE+hvxEZnRYipyhEsK5bBdZ2nLgpA0ALmhMJjNWfoDM0aWOozPSY4IVWi5TIMYPxishFPlguSqANCgmyBWG3I1YabrAQzocipsrdleiIa6O8HvuzA0ZfWf/7uLmSkChlMZ6FfaRYmceZDERpoTEFPinHyZfk07tccxdgO/hUPq1oPzoeVQsbp+QGcDu6CQc7IQY9YFXuaOG+1TZwyMteoCtTK4xccjt7cXiaoqNDbFL40nPJH7fuyO/J3Raqbuzci4SzR1qCy4yH9bbiWibo/iMcF1YqWu23Qw5ArcNuBMeozKrGbrckDeXNB7QF9JqJq+EyTTUv4IKBMa1HYXOtSiAJ0FMzeJi6MbohECkSQf8r9D7L47E7HzDIiI365SVV8nzIPJb6ykmMBSW7zQlCpXPD06wp8vzxg1IozlrJaqqSLeA9NjLgvlEQkbvEoFDmGMKyohLar5g8i3JLTUNwCX5TOaBsM9Hq1O7/gEHgdleefbNDK/7gpWiTIn9CZSUguGxIGI3Wc9OSZG9X8ZIYb7bP+cCZTSc0OV2QqXGnMX2wf9mPu+0IDffVayfJ4OI/sB07G3ci0wCPf3wWtARBjTwvjOslIBNhWKZXlPb+UGnPp8kT860OmcSXIUI1JfDVgvmc9+D9uboS7zY+H1ELmZdbllSSxlV4wfX8m7X28vSU81NfA97rP5019U1pAVmjMDJ8Kx4DR9GNXpSzzPJfFQcg3Chkc2G+uQBuQscayCwlD9Vm7QVirmJO1M6MjjszA4gN8T47CtZxV+KP+S+n7iGRnfkmmDt/7EQPr0Q7rtsGiWQUzf3AVzdECSSAfN4t34WUDTFH35rmIQ43R3l3g8pxVaVCKgHXCPhijxJKNnJPpRdYXhHtJL3yQn5K/OXDTCC0bSk8nsIKVxM4bdZizcgdI91YwDir88H3gVJ+sjFf0QB2K3r+v1pvNvd8C/m+FGVi+C/wRi08R7rqHqYzLf9eNnovxDHg1o5nwO0Glxf94Xp8qP+ds1jMO2GQz0el/tpnFC2KQJ75bQ2qR5YuLAw4NIN6OU2HFBHFPdmsoUrskT6RQ+A00Yig8aZGrJY7JWnC/SAX8scf+RVqo8NiuOWfBmhtX8hO3ZNKQR22wtZZCoV2SNBxXhAkYzITd6ZV+0EDDriu1m3yEzEQntxYZOUmlOl9wXta6bz2UuSV4yDHyqaZhbOPF3vfcfTE=","layer_level":3},{"id":"bd2234dc-1f7d-4e18-8134-e119637e36ea","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密账户管理","description":"tmall-account-management","prompt":"创建天猫卡密账户管理的详细文档。深入阐述账户的创建、更新、删除和查询流程,包括账户授权、状态切换、认证状态检测等核心功能。详细说明账户与工作空间、订单系统的集成关系。提供具体的代码示例,展示关键业务方法如账户创建、授权回调处理的实现细节。记录账户管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案,如账户授权失败、状态同步异常等。","parent_id":"1940f0a7-1737-4f55-af09-6d228b09bc14","progress_status":"completed","dependent_files":"internal/logic/card_t_mall_account/account.go,internal/service/card_t_mall_account.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_update.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_delete.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_list.go","gmt_create":"2025-10-08T18:19:56.1003955+08:00","gmt_modified":"2025-10-08T18:54:12.2497452+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwRUnUfuYU1Ccs6mvDPLPEkeDmJDEzqB+bbxCn9nEKGkJ+ngcQ18ukCSPcWXZUH42B8jgpl4li2lM2GNQoVVNwDi4YlZbrIo4XPZlxyuqNSDhmbbBTv1ynEvzJYd/R2NElCmE25B+pY0lx89xG/fuOSBmrDiwXIyurbfrkKNIX4AlZcVOuBCVCAHKCQKlIKkZILWzUMa67oSxBs9GHdxiQv2QwEYo2X0jeitURbHY15W7uucFvRv4IJjm0SB6xlHOvkJ+HeEXh/txt4PR5gq0EexNxOmVHZ42SJoItonwbQvI+mgSFQeafd4MG9GEYwSwR7aOC8SxbRrWeMGJIpAWjXw0CXiYHmvsxomZ+vMeLOfFGHKLxhI0r6Ly71ZkL/LxWb3Nsm+cdPcANDgnA+vChTAjV+VjsjPVNjzwgEh2HxejBVOb/wJHMdPhM2TDRLBP40uh6QVX1XDYe7TI2cCkecUcda9gquJVLa91TAdNJNQ18zxiiFPdIG0wy3SjhwRvHiGJwDVLO74gxzh2uEWdQ07b3hW5QEZTuF/Ifpi/s6QyLdK2+GSUD58yy7K4Gvtgap3JNBtN7l+GYd6hkuPb+OqYWBcGPt7zQvXKrR+GmKf4j2FnVVWuOQrvyvtT5xlxm8dW1lPqyFM3V6f6nQItxL4VTN3P39hfKuO5QjC2tDXDxngUxHow4LA+Y7Q57RXR/liAToZiNZdy3HoFusvNFjwRYtG4D1+qFr7nGnTKm/pckOGgTC4LsugHBPweDv+5rjBB4IU6hbgyWTzj0HEVdPZDmTJNJqrYHR3Tk7qHSx5y8J7/tnyLmscLH7Z19CxLBL5Dy8xv9ZDzhtKIESbuuTtwvODZ7v02zCfQnzsCDUJBVZWiP7KpcUmziCLYaKmDdW/KKxlQz2UMf0x2FHau0H4Pje5JYHEO1nIrqjSD10W66aUHXAbZzIgJFetCFDSSWidErGEGRQ/XZdhpLC5NDppfST7FkSlbjZOX4yZ7qAiaewMPlXaQM19x1LSAX9p1oT9CSA+LcMUEhrnG0p7KkAnQ4XZY1zE2QCYSNUKOSugZnlflfJdQ/dxKEkYblIFCAC2C029FP2kP1VbqlwFk/mzy3E+YZNHt6GW7RCNU1VsplMW4iXdJr8Lt1TKqK3fOL2UnegurKuUTJWXJffluzXMYH+C1R9UH6ebXluAjEolk71pgux92vB7xj1LeyY9uCFDuCPDT2SS1C19IEIiJ+VwZCWFNt4BJ+fWwUmRJE2YmYIPDzd+FwEF1chxEyYAnm27ls6O/L9DHmbbrNc4gjRlRvSHFhhyUwVClc7a3WQQr4GTjOomLo6c91N7r44ugrSArlkTDz4c4xV4WrIedPsmgAVQqBZy/NHxSK7uUXiOoL91RDCxbCoNCisgkbSOfR7hDoQc9FCBcPa7nuLODnBa06Yj/LtFfB9px5X9kkBpBYMRsg4aF5Ztvld5slD/ZdrCtECopJ0QQFtnh+DfxpZKxIDs5muAcHLwLzQRmj3BTxRidg9IwQvQJNyyt/pJ3EgK/aLgV54jfGrcKCPzytribUgu6HvWM0ZMC4WKEZzTdRsqdRdsQvwUpWo1dwaUAlESHSTahkPl3I4I8AEZTMw/rYMsajYlspOKm+oY75ZkdD65k4XRAdToahanZWubFhuB0PniX1tyhx5mivAkv6X+M=","layer_level":3},{"id":"9c492856-0b6c-47e4-9980-2ba5606e14db","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"IP记录管理","description":"ip-record-management","prompt":"创建kami_backend IP记录管理的详细文档。深入阐述IP记录的数据结构设计,包括IP地址、访问次数、最后访问时间、封禁状态等字段的定义和用途。详细说明IP记录的创建、更新、查询和删除操作的实现逻辑,以及如何通过Redis缓存提高读写性能。解释IP记录与用户行为的关联机制,如何通过IP记录追踪异常访问模式。提供IP记录管理的最佳实践,包括数据清理策略、存储优化和性能监控方法。","parent_id":"abc2e583-1d2a-4ee7-b376-101d505c3e2b","progress_status":"completed","dependent_files":"internal/logic/restriction/ip_record.go,internal/dao/v_1_restrict_ip_record.go,internal/model/entity/v_1_restrict_ip_record.go","gmt_create":"2025-10-08T18:19:56.2970514+08:00","gmt_modified":"2025-10-08T18:54:37.7976371+08:00","raw_data":"WikiEncrypted:B0ODZirtzWbsF3w9bcSOlHc1dv0P5n03vALNC28DzA/g/OMiv/MAU4WTtzGe+VPqGMG8BJoBvLTAf9atqzKx7iO7sAtYjJzKyHysTAjh6GlN9xrWaHjlXsZfgHEv+81WvJZb5pYsVC8QWPqJVnNT8ZibsnLhkYB7ItAExxnC/n9eJSChUPIuUTXph/2RBUm4TmQ2rlWqFBgHwTBasnwLhHA9JA2rBmoWCSr/mleYr85AvGyKj1Nwj9LmM7seg884PUu6ssOdfBhhstMzCkFYvEZCwGb2hfNGMOXHWYIEdGnmXU+I0e1s5FsLDR7PBwweX9pBVibAZ19zNP6rL/gerTzeXHI18lue++YWXgPyDDJ2hRZ/MPBnW9i/HkpDh4mpc5mWUqmW0zT18UuMaQzNIiP/k2hhcfrrjUZtVFahLteOLFzxA77owqtwGtqziWMDCCx+zQZWO0NcJDlPfX1yXeKuWCjCp9axM8SmGkSuSq0F1Cg40Xurvg6ACvweBhdwkf7+K+nb7hHj4BfH/C4L5Ph614a7EtOIliYURO+uwYp5PNYhsyuXef5OqLMd6ShcgmIdFu3VDhjMZYbDz3yCh5v6/D1Obpanvvok361KfEwGyIqRbz3a0n5jmaVklS4xmje6DyE+tgy2K0Dt+q2mQzMnDZwriFhC5rkNgl0SMdme6DQ3N1cDq9GxUayJWudley42v1V4IKOOQSVLBjKuk5WF0py21M1dFeT5B9zqWVZBNgTdI3Hx+ZbdKzatVUs/9IFagZvvmIdpXqculjOjP57wIMGASkQfp+XpXnd1WxlvVewQADTlC+lSykhlxstBO0CTd6rO6PnBDii2MGVEvDIZ13aoG7+MSqJfRl/71mj4nGifA2wzACoCY7DMV/FJiKNgHSu5pPzhmpaerh/esoC6pRkMYcbC69OW/5grJtVcxYVYFee4WFstY+agTZdGTcGWgYkkI10JrjJYU31Bfgd1/n+Q/ib8prOIaaxUzWu1vZB7jnLnvZT4zp1guLIfbI+DFBkPob9sZUAXTFG2DmYZ9ynkqiYgzTM6aeBfX+tlQKmFBZp9a5oWUiMjr+Bca8UmrhPYfnm5f/6dNqx+Tn2WK4CUg+HY439kyeKlQm8lJjIYpPi+tXROL9uTMfN9AiJft8OIlsH4rhfV9Ujfew==","layer_level":3},{"id":"dd127daa-7cee-470c-a9e3-67619cbb690a","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"设备ID采集机制","description":"device-id-collection","prompt":"创建kami_backend设备ID采集机制的详细文档。深入阐述客户端设备信息的采集方式,包括HTTP请求头、设备指纹、浏览器特征等数据的收集方法。详细说明采集接口的实现原理、数据传输格式和安全保护措施。解释采集到的设备信息如何进行标准化处理和特征提取。提供采集过程中的隐私合规考虑和数据最小化原则的实现方式。包含异常情况处理和采集失败的降级策略。","parent_id":"53fae74c-0146-44f9-94bd-d53fa011a96e","progress_status":"completed","dependent_files":"internal/controller/restriction/restriction_v1_user_info_collection.go,internal/logic/restriction/device_id_record.go","gmt_create":"2025-10-08T18:20:00.8403612+08:00","gmt_modified":"2025-10-08T18:54:43.9812554+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvGKD8gVb9Hj3G7coH2L3SktvZYebOv8vkgpgSinmPuMCQSSDTEyxoWVWnS3XVxi0V1aDgH75tdCCQdkWCOilOBlur/tpdCGLmSg6Cthot0SIXRwj5zLvF/P4pmwc1GnREbivew89a+d6cB5njXEYLYUADqYDwzY/Ou6iFNaGPLY8XiRbuSbHg2890pkV0H6/Ed1QVe/b0Hm4Hyq6pLG7Fma9/xEn0GsXHIoSZ5MOnPkEM+vDPu53i1GeDtM57mMs4oTZ6k/K2hK+GJc55OT3sBC4wSFG1HCf0h5Kea9EAac/g//SNmqLTzBGxf9N61bfIQlAUB1+y4PEuzyo5XUzhaIODKYUXgboosnmMogvqeAB37Qg6dLbM1Y+eS4Smcerl7nJOTRT8OE5BrDvckmSJ4Rk6ROJMVj7CQolYyjdqZryZhsH5M1XhfvcwQzSLgWIDfAP00oG+H7Ss/zQPO2hxA1ndtfBOpAQXuX1DcBugX+tDztR7+xAbzLkFXW7m0T3yDLSqTbEHRrh3QHg8XOyofIWqJp71gnr4o+rhhj3v0TfMgxhfa0T8GCJe0nT9I/332nEOaacni1oDZ3id/eqonMwiO6yNGb9w56rACC2YEWmbjUOSZJ0FespuJa2wpOyjWUPjjuT2fe3f+DKhFncqnEehTQyTEc2eN4CAEMMc0/AerzjZjYew7rQCVCbZcHbruNwTTdVgn+ay/sjnG8kMd7J88PojEF0sPTeur622fNz8+ANGme7CuqBLvIkDdYEu45gQfZo//zDfco4SxkUWzjyIt9oQ68tOYVogVS4oQW3El5gDaZzMqxcj9cdx4rd8WMPN3j4/eYAT8z1Oh/D3ZKzVkYo3paB8QueZ8YKZ6JafYOQxOSGnFy5/KPoawuo50CZ/S14eN2PNilYroHnGB53OcA25V5pvYAhwikXMzOhmntG1dVwjjfL6i1quWiUH1pW3lHH5A/5KhnEsew3oOwpKkUfzYRxCoeaY24Q+ZtoPp8j+WsEqwl6+WOhOA841qPw15A3tdKAAaa+nVOXzAVZ07Fy334ScRwaiwK1R+29eIn6GQeh2TIPmSReE9FfWu+850DM5Qe6ellMIzoKnnA=","layer_level":3},{"id":"774c38e1-e0c9-4f09-8929-ed9c569de7a9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"登录认证","description":"login-authentication","prompt":"创建kami_backend登录认证的详细文档。深入解析用户登录接口的实现流程,包括用户名密码验证、密码加密存储机制(AES-ECB、MD5)和认证失败处理策略。说明登录请求的参数验证、安全校验和错误响应码设计。阐述认证过程中使用的加密算法和安全防护措施,包括防止暴力破解的限流机制。提供登录接口的使用示例和集成指南,以及常见登录问题的诊断方法。","parent_id":"100a2b02-1888-4c57-9cd1-b2492db9671f","progress_status":"completed","dependent_files":"internal/controller/sys_user_login/sys_user_login_v1_user_login.go,internal/service/sys_user.go,internal/logic/sys_user/sys_user.go,utility/verify/aes_ecb.go,utility/verify/md5.go","gmt_create":"2025-10-08T18:20:06.1774543+08:00","gmt_modified":"2025-10-08T18:55:08.0171459+08:00","raw_data":"WikiEncrypted:gVtFIob7WtU/DhLIhhPauKCJymbo4SzVIw0dvv8aC91DNIWhYiwoZmiSp4c2j67hTleejgcuK0+CSov54UgtfevCah8zEa72kD707FT+ocaKIb10nnDfMiUQUGRO8xrC+Q5IXfwDlTtZ1hFf7OdjNFipFuV/SWniGGnHvFnrpgd2jrlgRhnjDEiI3ZvaT4VaczqEfXHod3jH6Iw6tDgt+ybjFShDQlsOQcYJlXBzfedK3qJMYS/c5klQtwPKE9RjNLVjkzZd8n+JU1H1jE7t4esDxJbGwNSRuZLPHX6hwYiov0aQrJlKvkx2O6wRZ/tLkumz1z0G675Xd8fhVg/BKxMucUkGxXvh3i0CZBVZUlgRS9US2DyreXpodaZOnZycnH9Nf0sYq6LppUacl+vgm8v4GtZFX9yFBqGkx0qHpD9m8yt7POIePPUeTNFn2bGixwcm17xF8kibibU/h1OY8KSA1Syout1lVMG+3sZc/O7gyfNEUMWNIVWtunvH3Gz3O/f+T608ya8cf/4ElpoWkrK1IAFQNWVeqEZbIqKvWolN3UWTXhTa0c57LRQOgFXlo6X1E8kZGvOahqKk9FZcmgfXkFWAaOYAWMMax7Lkf3VRgAmcy2W699mf8z75UdANIMSfww+BIM46EwAwkB5oi03EJimkiKwrvhOk6jMD9ZH50OVC+NrYoKN7yK3smK7NyRCqdnPpdQY/AKAweFsf7NOcL2OwuoE6MBRsG3TYBSGEU8AkGOJ8xeDZbiNOqw7KOxpJk7XJgP/dwsBy5bfmkAsJvHQ/VflOI1KtQjRTfZPhNQjPvnVDRNnifIjsXpeXQEK5NpBLh8V74+UZnCgbbj0/s0q+sEB/vH9HZ5/YIkjcAs9/WtUGfNE1Fgy73Q3806nH/pa3O64odg24s83QhudpiMFC3RoDl/zjRNJmiF/BoS26rntv7fA3DV7/1yw3SJ7ZR8AXRd7MEnMzwymFLRaF5NUfKf1VWyBPMUUXkjWK2uVI6qi6RprUhVFZZ4/wewWlQOe1WlQwtWRg5mcMZMTB8+AODgUWyqYxJ92NymII8QUCFHSA0YRfqMeIPGK25zlo3fHNcnAmF66rXYfLL4VQg6G6uTLdvhCtIiyFAHkNtaIo8SMFBZ0prTyersI4ypvk0FTVEfCOUOZL5s6cmooEb6dtaQxabxKhChlawsw=","layer_level":3},{"id":"8fea5696-078e-4e39-854d-7ee67e9a5ea5","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限规则定义","description":"permission-definition","prompt":"创建kami_backend权限规则定义的详细文档。深入阐述权限规则的数据模型设计,包括规则ID、规则类型、规则值等字段的含义和约束。详细说明权限规则的创建、更新和删除接口实现,包括请求参数验证、数据持久化和缓存更新机制。解释权限规则与角色、菜单的关联关系,以及多层级权限继承的实现方式。提供权限规则配置的最佳实践,包括权限编码规范、权限分类和权限粒度控制。包含权限规则冲突检测和解决策略,以及权限规则版本管理建议。","parent_id":"19fa9669-f28a-4a88-b0f6-b6039eba9dde","progress_status":"completed","dependent_files":"internal/model/sys_auth_rule.go,internal/dao/v_1_sys_auth_rule.go,internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go,internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_update.go,internal/logic/sys_auth_rule/sysAuthRule.go","gmt_create":"2025-10-08T18:20:07.21846+08:00","gmt_modified":"2025-10-08T18:55:45.571949+08:00","raw_data":"WikiEncrypted:arCjhUL6OOP3tq0tMlrtoOwAbbQLRVPzcd1k2dHh6xPvO1CNIfigRke0ryDobBaSaoichs64p/z82TtWhKzqnfRtn7zC+YhNzCLUaL0A8JDFeUnDrWvFTxw3yuhcszbDwuzk6BRxe0gs4kFOhYEsPA1/Y04lfi8YegVHolvgHLKvZ17SLaOS9bYJHWMoCZP/kJKsxOLnZ93rvkHuIdm2WtiK1iK81bJHe7F23huXgOc7upPu5i3nNZGnaDM7hEKQ/cB7MI5QoDzHuYcqDHqt08ohmzryRB5mJMQqu8CAyUV9/tVRMN1G1BE9CaETWpePEVcW49WXO5v7uFv5o3y2jRbtlgE60ZooiLyUeZ60VHLn6j65ihl5jqjtzHB7qcpCXaVoHZLSotaBSSFs7pAllss6TsBzc6KCDVomzHoQf+PqfKcSv8n/2dwqquYg6HQCEbZYvLCeChJgFbNoovY5zY/BY9jxgXrml3zqVFBKPIkFeBE6uVHZRMpeJTkpbst/AcgaHeDFmFWefIv5Xn1MgKoVgCSbClhDpGbwXJH1rUnNzDax/BkYCyFGmqxFKsNCP32oro+e1BpIiPMdmtiXy2jHJC0PEzlnS4pWf4p4OWZl+mdDIK6iRnyKAINgvfuTT4UsdAu0vxqRAlgd91oo3ABq8ucgniM/oaBKagxXEVv+qYbaeERcv3UTVL6J5MYrIeu0TJXQyDfXJif7Cb0d9tjPohxCZfYCvrQuF/JgsaKV/2OuKffcTQjEXF94v5xcbYVzroBwMsExqvXFtzDHXDUcKmmWL1onKTlDa5nFeHCEwhZDoXVxkWLFI+8+ZaWqKFLDXQ2LQ1Z5aURTBybZlPMQmdjIqszTv0JAAu4uz8yTcW+65emFBT+4SDQ4GaIbp52eQAyFATg6uQQ71IoEFejxBAOcuOnWzagWT/skQVj7x2nXlvyk7g/BrObLtKf8zLaXFB2y4A/OZ2//7oMvEBgtuuNymm/EKEOlKhkNQ5ETZ2o4x7VWwpuj+USDjl/u9uGdszpNTGiE6FZp0k2taXInlD8gg6CR6ddA1QRGiDs8R/GpRoDPFKxbE5J/bZHZP8+7z/PuLcrU5xhyQFN2YdINzxPPXdRS/6vVIfsjXuSsr8q5cG7USJJwm+1NmJxoEX90zJq4wCEDV1TAPupW5nPGpBlm8OnBwh/VQDgk3kS8lga0md5rVm6fbMHzXSH/aJj7JzZ+Q6Di3qFN6VDP965doUC2ELSJO0wDwPs2joO8xBelicPq8EBjbN4EvH2/jLznrdmOoM2eN0ST9uti88fJEpJE4l06+cYAFj6gq5alSOxos+JJfvskuQc6Kq616nxSzwDrgSzwo/qb3FqWiZ02TsWW/GkjHTvzetTd8JVfaojrsVOQajT22gaz491mWxOhtNkhzgKvXeoTLcqI9kJ+UKQ90eII5zAT16DLpFESFp96xfx2BoRzb0vVgS3LwfsXFmpLF7Tl+neDBmgLvYACwCCIlajnZFDnm9PH8pM=","layer_level":3},{"id":"c61cfce9-9c60-408a-96af-aa04fe5ef4e3","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密账户管理","description":"api-card-info-apple-account","prompt":"创建Apple卡密账户管理API的详细文档。详细说明账户创建、查询、更新、删除等端点的HTTP方法、URL模式、请求/响应模式和认证机制。涵盖账户状态管理(启用/暂停)、批量导入模板下载、账户信息批量添加等接口。提供实际使用示例,包括从xlsx文件批量导入卡密账户、查询账户列表及详细信息、更新账户状态等场景。解释账户信息的数据模型和验证规则,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注大规模账户管理时的性能考量。","parent_id":"65e19eda-b904-453d-858a-07d58ddf98d6","progress_status":"completed","dependent_files":"api/card_info_apple/v1/account_info.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_create.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_list.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_update.go,internal/controller/card_info_apple/card_info_apple_v1_card_info_delete.go,internal/logic/card_apple_account/account.go,internal/model/entity/v_1_card_apple_account_info.go","gmt_create":"2025-10-08T18:20:13.0505364+08:00","gmt_modified":"2025-10-08T18:55:43.407869+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBkqinpLacl6fnfehKCwaw8pRy3qKwc6VXfk2vqy+NLa0lTwYJdBlXq8e5vF75MfWxXT29fu2HyUk6opUbjF2W2ADBD29AvaFIeX8frTdSVTfs5URJaHPfXsFQvvLJ3Rg8oZjBSUpqXPio9c3Ip9gtm+KdfHWts4AubnWlvECu5q0fwdcbvrPr5W8ZbVxwPjN2waGFJ9n1Xo2pDgwgKxLWA+VTiMVZ6txaIzQakEIC4/T6Bf+XF6+OTKqRF9kjUeT0tl3gSaJypvozT0cAjxEdYKhcTzwkZFQPSDY5zxgap0epbmOmRmg3VyKwf0MxfTo9DbeQ6XakT7KUm9U7rKxaKSMgDri/6DFmQkzd3Dv1KFK3xYlrD4B8LvshcpIlFZR0tdXF7L+h7vUcuu5qnTeiji2cNkwDpRSpbchRtEHfn2PL8cxdJkb++Li+o33XuI8HueScdK7hb4nMtT24utEQ+r3gZ4srVcZ77JPWWIAkfdo051LXGr5fujnXpbcizZP61qh3YRPKMWKxEQ7o+mwqCvQQzR9+mrc6PxNYz5eDMjfun825w5xTUNiedy6JntfmvTKRO+z+cxEcTJjsy4uT7bB4rBM2TXlKvVHPpzMsXKMgjd/Oa7idl8vBFlxNtD+4LBPRnvLxdafLIS3u4wnQc3bophhVaqHm+hXLUzzuP4jm8EnaQqzjo/BfuNsiNi+wm7gCZhLPJX8hDUrjmb3ToPk+El4qSq9OYDP+OozLq9Lqves6v8r3lAut5Ii2EPL2Vi0KbzgGhb8vk2HgVfMZ3qifEuaipcaNwlxwr7+wSrDuEtfZsZWJdIr/XlNK1d+2VcQ7QKYJ6izbgB/Zu/zFl+YfBcIrTaMF4/e0O3Y7hpMNOxDqi8KQDSoZk+bQyU1ezKM1HU+KtLHiVO+IO6QshTgYUaTG0gIQCpbDRWdf6PIJ1WQgpq5SwD7Zj182JC1lj4H3/DUkpmymWLJOospbguIbIXlzB+k6WGw9g+wXA84a5M6xZzdjFaSwVGxTC55j0kYwpiCaco2vfpcw7jjSUCVRUVnlHWznxAaXl6E13rZFN1wBI0Ik9Sn6rdnD+CS2aLjvahLJGpb7jaUbq7L/ZLI9BA8fRDCwoGIfwFRPdAYGlqYdJoqBL/cnqeFeN9ga87M46Kyz0puLquoQ2Ew0MAXIuc9fxbYACVx9RMiH1Vhi1lDhZOJAvI37u/G0JEXtPJopiSUMYsFY+RUA3A/Qku8kQQwax2XUYTgCR2AQiGnDCdkI+6LMtPPlmSx/QlITlWkkQCy/1ItMjEw1o/PPSftkUZ1JKqn9Jh6mGud8uAgPqxecS9Vamw5jbv6TYMNXzcek9YJJudtf7iHdpX9xRKf7lnwmouqdLT2UM/VGvOhSeDkpDYPpADoBsTjMHE0SbraXDUthLt++TF0E2eHFiPgPoIjgUCGCaA/yY9v4THxQNIZqUjHKD4diMLvaB2giWr3OiFkajHbLz9oGsc3SxrKuCUeQrH6jUtEaCz+BiLMUDkqRvnUvVqHoK/LQrLiYtXJSRvB+yOmQhj69kcR3oBrLBjnSMHKZcITOeAhn7zHSIHxOpfehSXwCJZf00ZWrb35OoqyXGo9DBOARSQ7BnLHiSzObDeoXHrZ7TQQBy+NwX+LyXZRMrgdmjDy0EIChgOQqhxAb5KemwNomIuu709tXJRhytOOiKfPJY/ws9vZ3eIVfgTsar6nXoY0HAQlRmit3zcnQLlA/xCwAxgLx6mv/itLgom07Us0IZv/BOLu","layer_level":3},{"id":"9a5f228a-3f55-4627-a45e-9eb1b3832ab9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密账户管理","description":"api-card-info-jd-account","prompt":"创建京东卡密账户管理API的详细文档。详细说明账户创建、更新、删除和查询接口的HTTP方法、URL模式、请求/响应模式和认证机制。重点描述批量添加京东账户Cookie的实现方式,包括Cookie验证机制、状态检测和刷新策略。提供实际使用示例,如批量导入账户、账户状态监控、Cookie有效性验证等场景。解释账户与京东平台的交互机制,包括登录状态管理、反爬虫策略应对和请求频率控制。文档应包含错误处理策略、安全考虑和性能优化建议。","parent_id":"cf4d1833-47d3-41dd-a87c-e005c6bb3246","progress_status":"completed","dependent_files":"api/card_info_jd/v1/account.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_list.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_update.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_delete.go,internal/logic/card_redeem_account/query.go,internal/model/entity/v_1_card_redeem_account_info.go","gmt_create":"2025-10-08T18:20:18.0056927+08:00","gmt_modified":"2025-10-08T18:56:14.6330793+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBgUl2d6Scta4RQBMUlv4P6FBG2to7BFRHZXhg9BHwNCBD381RHw8dSROjY0CP5l2V+vaH2abBiwvnIbxE31IKQRVIdO4Ewz8JwWbtt5tmL8f9cJo6ahniikYwoT8OeUbMRpDl8DxdG2s35ojn5Pkz4O4fSeqtH8+hJ6Xr0rIZlEh8/8f46c+F1LGoWRtLxfdiyKp8oOyO4Is1/w7sEFWzmO9twKFnkqW3HkTjlSQrWAnN6fUR5GuyOSRYijYJ/gyTzY/wl4XKJastvxcCcsA474y8VkOy90tdpJIQznu5Ben1hu0/p3ZpOXPYd+bhjyI9/krzqdGVVWifczIEhoZCu7/XfP4tO2yASiJImRuOR+CO/zjsUDy5+KRNJLBq5HSzEmQ9GfgwNCPc809XcZzrk6IuwtZjLPMperxN1uZKxRCjmAcRaETzkhLDAHCJEDnmwqIO2UEe0ehJr/xSTPfabX0L0c90e78TfEvMdTvI35MS+rQyOO6drdfP7sxQX7pI7i4wWJpfZKsKZVSy8YG5AbSSgdMkWeizoGdLf6dJE/Xjq0NS958wC7/1QHFe4VwtfXX3rqcPRhg2LoX9SPcvmRIGkLtxYws8a/KRMRf146tiCLscWjNMFTNQC+Zw1Y6QzodUwxGpLnafM7L+I3dmnuPv6cu972lxTYVmNlpc/u8h/+WLeodNhWaEzMn2mkZO+zYqIvJwSNYDSEKapP1cM4mjRa1KhV2FdAWcSIa62p6muCsoT+Bj7AVCIUdJF4+s/4Rhc38zcceMRTyOcwK9wWZYajHgdaqZnxNoWFIRYkpRBs7Mq2fCdHMK8vnUAskW0pWnNxJpOwaNA7OlBugvIYZz8PjeHAKIYEYFSul1oVwVprSmg4le5igOxkugrYcLTfOsMnirLxhyI0dzZ95fJSPt2yyQbUDUxb4p8XDiTNSPHwoR1FFtHUGrY6zjZJK0W4n3tw0G+0x+exh1pjVO+oDKcaOtgUOolzOvngO5tfGocxnDVNnj2Dylx+zxkltJVZ67wf9cj+qPLcEDPnN/0bVQD/aHPjbUzdVtCDvBHsGU2KqOvOQRo5lhoBj4biXkQCgARq6rgc8rTMW/7a6Um93POR01838YeN2EE5ameiQV+PjkLrcr/MfY2yche9hwHpEgEtYzi+J7nmOnQKPW2/KR5oXhVL5SLh9xTYFzs+yDcpB5FFd3cZ3oKwJ00X8FXbFWdbanzH5JZDyJsz0uiYkXAdXvU7HYDSeY0kJY6Zh4D7KzYnMLEo+FYkM1UM2WA6sAtPbs0NseDRjhuklugEvOSBsLdXaJY/2ZIIQvy1G8Jy5C++r97NdT5tli77firZyLt+tpnnNj5D/kFmAxI6mLVx2LLTPhvloz4dHP7zHuB9ADxwonQQJxrJ2yL8u9Bya0C29eRCNRpYC5WCPNdjXkR/JVbdjF+Eex0DkjpnMUgwoboTAKNCCt/LsDPsHnfxo6m8X9t5CvOqsU/n1XOplLXPhFlJNOt0w3GuvscLiyFP7I7Vojk0CZ5YfYxTVzdjSrPv0huwDag6PMes8+oU8A2+pBDki3YPnKURMTwxlfjF7oSZjierV3JnlqBQjwAICUDFqCnYvgTbjj3sJGH+ikMk9VFatoxbpZpZN8SzKhZ8kA0IXMBVed4vAuNZetQ==","layer_level":3},{"id":"ecaf08e9-5ec3-45a6-ad5a-3a5e542fbe7b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密账户管理","description":"api-card-info-tmall-account","prompt":"创建天猫卡密账户管理API的详细文档,涵盖账户创建、OAuth授权、状态管理等接口。详细说明账户创建、授权回调、状态查询等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括天猫游戏账户创建、OAuth2.0授权流程、账户状态检测等场景。解释天猫平台特有的OAuth授权流程和access token管理,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注天猫平台的OAuth2.0认证流程和API调用配额限制。","parent_id":"4075b270-ff90-4654-b074-ef377e9015fe","progress_status":"completed","dependent_files":"api/card_info_t_mall_game/v1/account.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go,internal/logic/card_t_mall_account/account.go","gmt_create":"2025-10-08T18:20:23.0971225+08:00","gmt_modified":"2025-10-08T18:56:38.5939358+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBoR0UyAkbkceqMyhpWku8RVMxI14JrT0WuZAKIquaumc/fyWO7e6sPSexwLceo6/MRNBnGOl41j7jMKXHDp2IJIYtqDgbDCxUwOhOQ8OIuqHJLuTFiEYbTEv9b6wcKKc8EAUOn0Mq8/AHAI14ujJMZ4NX5giXQ1UYTmQPJBU74L+ax7JIOqoeJSCJzn+FNpqHnPZfjB29On4hQ3wkOJvMbEuzSQ+r+Gru2HnMF3kaogVcbE+IytKZo4iVifeIEzWZup7nmaYSY5JPaZtHfY8dLwFZBNsNkKfQO+EFSfoqA8csAJhIyoi2JkXmJgskA2IwVlc7ATUE+4hMEK2SjDNM190H1+u0MFNBrjbwN/nn4rW9P7RynuaB4g36TWvUa6jZFBFwgACpm9x0rUwQJMVL6audS5N0KytY4HsnTtcC0OtHf1Jyr8xeK9Chg3ROKePyBHvA/xmz6AOAZ5E/EDfyZrrPQ8ctqP08gcW0FVVtMK/nQantyuXSlF2prvPTpbRUvukHLA2/M1ZncThXExGhO0PxBSqV/CbOKaSMHZNG6ij3Vr/YN0hlrXtx7tM13kN4u+eudBT5HkmEO2f4gRhmurkgUikBdoqamLraJQUKr+TwS1qSKTYyv6+FzDg0WPvBMVRN00zU4slmhMGSA3VgFKNL7L7y62KwNVqsED+7p9MXnudASGPDkFOuYbtil+LJFDuUiFiIv4PfhL5jmrUApuQAe3EB0AzQujJIrRh2sVrQeSGZMH4vAtvPL2qypV9F9lo9/XYybT+F7i/3Qt5dslxHl3y4xS5M8DKi4qdKHLzWXTHhX/pLeiRiaS/nDIHBu97n5HSUQEtLuY585nkaoMVfgmyg+6ULtg0tU6MdWqkr4b4ANKqvMkZHVrmfXqvIe94uefgBR9xYl10GJS+kFAPy53hJ/rPlIv/8ERnBSm1jSCCgo/bgU+ELVwq8R6blJdx3AxQI5BS65muiIBl09wf5MrrbYoVTl42wXImijcLuEU97bGyUH06LRBHDjkMtClfAzQSUAjHQRmdPTHMuVBhOQhmCjSTtH3Fkj+/4ODYAVa6Begbs/GUe3s2TzX/GE2XkHZCzUpIiiuq+08HgN6x7+Dl9RwoI/vf1IsfKnuhPrI0tkMINyS7v2XW6TgOL2RhNFE/VE6el85W4R7lldv+b9XekZX9s0g+WzI16nFSczoA60cIKhnWcGN77Tuyokf8dLEGr7mSrGwuXJW1iXGk6J5BfaotNOd3Peib6RgN+cGjK8X+K1FpzJ80yoy5U03Tkm42yLi38jXb9tMwu3bn5A9zTQgbvzeTwBhSqU9b2HiCITl0jMEseWoqRPz5p4PLomOL4eatGjoTOYt0i7ndNdRXQvlOknlHER4JJF2TYnFosnqu/pI4V3sEH7jljQRlw8nuyWxoJGh+662U1BS6wKEvY33aQFXQTnIap10xeDGh53y83Im1qI9NfhuqVPqC3iLrnnoH+g/ujcZvV6Zbcbu61QNwo9P5OPk3YDMl","layer_level":3},{"id":"f750eecf-4d76-432c-a1d0-c58ec1f20638","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"构建阶段详解","description":"dockerfile-build","prompt":"详细解析Dockerfile中的构建阶段,包括基础镜像golang:alpine的选择理由、依赖安装过程、代码编译步骤。说明多阶段构建中构建阶段的具体指令,如go mod download预下载依赖、代码编译命令、编译参数优化等。解释如何利用构建缓存提高效率,以及构建阶段的最佳实践,如使用.dockerignore避免不必要的文件传输、设置合适的环境变量GO111MODULE=on等。提供构建过程中常见问题的解决方案。","parent_id":"59443325-27d2-48ec-b0b1-babd3b4b0fdd","progress_status":"completed","dependent_files":"manifest/docker/Dockerfile","gmt_create":"2025-10-08T18:20:23.577555+08:00","gmt_modified":"2025-10-08T18:56:29.4723984+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kAC4I1igMIbmJdop4VG0ZbJjFypRxn4xUly2HIQaD6E7Ulk8/xSnFXX+kBsK+YCiAFpBZQaJXx1K6xD8fgHOhJlmWyvZ/fW+LtZKayd0FV0jlHO2AcIFL1eWHd/6OafkRW0RQ3lAEZ3RRU0iA7UKykKoL2lHBTNrjnDDxz4sLu6jLgCdadAE7a1NJYx8QQjdEaCcrMMyW4INTvYDbVmBGbjUfeYUMV8qhxpfBbCR/tGRxLtGS2TyPsJGGPPDNDhbPpwJ0yJPkaNCFT9eMLfbVXwMNLEEHZ36uelrbeySFxF3laONoF3Ina+ld1a1rCYzeBOBrisG3LOcDOgAu84dsk3bqzePE61QcMUimqePrk0tV/VYhMyphCghL+28J/zngBOlSqkLapTPn02rzSuLBtwuWDsm7IdjT0g7vWZR9cQnR6vmGanUjlgOtzEPCxZniXz6wkdcKMs/oSI8NTK4hN0cPQ0XppJQsFzBrlOiE9Fgc+zz/XgEM1isY7Dk7z++54qnPnGLZyatfZnozoDnYQ2xwsF35q9a5kfjP3EkT1RxyPWaqS/sy2HWH77doAWKcDkMiO9iiYPVmUu4SexyxGTnn0W6JUTDqEr6EiDfR/4CwAy0bvzdLNqff9xqVwhukHFvh+EGtngOJKx4iEREqkW8TGhMHdQq8T4UFKDCbBMt20a7wyhGKuDFcdTxOphnRIdgGNXng50y/dMm8RpaQW+kZ4teEXmlsP9HmqtCdqh73KgHhKA5m6k3TGbcusQX8RpxS5xkNYxKSRwKjH/XRgx9kPmPjZjHWS4eWzdmDb92hKVy/lGAJ0qG73t+Y4Vqrvj/g2TN5aGhhyKd/H5QXz/Fz7p9xsHidqQ3uWc/dkTOfSb8BEeINpHlU2KCiK4hTKElQwpYs7burcNRRdw7WiSp8IrMFex61TrKTAZIioHCeOGKRfWNoYHCpQ4eCQEFmw==","layer_level":3},{"id":"6ebc345b-84fa-4d86-bcd2-305f5b50facb","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"沃尔玛卡密账户管理","description":"api-card-info-walmart-account","prompt":"创建沃尔玛卡密账户管理API的详细文档,涵盖账户创建、Cookie批量验证、状态检测、信息更新等接口。详细说明各端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括批量添加账户Cookie、检测账户状态、更新账户信息等场景。解释沃尔玛卡密特有的账户状态检测机制,包括状态检测频率、异常状态处理流程和账户负载均衡策略。文档应包含客户端实现指南和性能优化建议,特别关注批量操作的并发控制和状态检测的轮询间隔设置。","parent_id":"3e149bfb-74a0-4709-ba69-06bd7c5990b0","progress_status":"completed","dependent_files":"api/card_info_walmart/v1/account.go,internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go,internal/controller/card_info_walmart/card_info_walmart_v1_account_cookie_batch_check.go,internal/controller/card_info_walmart/card_info_walmart_v1_account_status_detect.go,internal/logic/card_redeem_account/query.go,internal/logic/card_redeem_account/status.go","gmt_create":"2025-10-08T18:20:24.5113729+08:00","gmt_modified":"2025-10-08T18:57:15.559876+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBl7AFS+0V9EBoppO4IsIlgknjA9Zzn+5hUWkkdnMISC5CYpQ3ick0SR5Mn60NwWCjSgyn9tJBmohQBrkR7351QihXLt4C3w7EHveHmwZ+0uOjcajq8e2trIg/7vL2Cme4X2Hb6qG1dBHe+QewzwbrR+s2ivL2ZBUVHbNTYqOVu/LtKXASVn8WzizsJy8M3YALdi9aGYPVxe3tG0uR6SypskX10rHVKv6iqyP9PqKLMrWLgbgNLidMynnIfiYaJkjwFVWDArm+GRfL9iSztYoDG4zmt01VMPYfJ4U+YAbeI67jlZkH++gOaL0jeABDZUNYnSSh2362J418uUm+NX3U8yQkYuEksmbZ3PjdFtpI6gA88wbWuMTr9NGz6NAw7Y14rcuHcbTWKBcKlkCMLdQk1OCRYSLQK2hgYvzRvoSOyoO54u8EB50zw1p0hZB2ziVMFXXBWMnk6DiBcu09+vJcEBlefqkHYCOGQ9u8GnDPIGE+h8C6mwZXSUbzHspfZBFmwo2rx1jG+GUhuE9Nv2SpsUBbNGCZ1N60lr/D+4tiJ9Bm4TfBLoKnWszoMAOYSmiqG5xFfVrgjVNX1gHz5Fvz1OKyIPfeC7STYl78rHHydJldofyMXxmM6RmJpm9SAf1UBxBPPeDk2u8IxyBX/M3t8Ani8Vr/Br737nCo7r4t3hUuEVe+hV6PTmC9aeTWvT47WbYT4q0T5Td/zg83FeLZXeHo0v7qDJIEu/U1AFstcvhF1cYnrqfdRaQPLC+NvwBVCg61aQaJfyM0akp/oUh2pl2bXudoa5pIPlxiaM4gDpMv6iURLOr7Gors1oSPojgBM5fNUwjbvvmgJztf8PUnnMcHxBgO0EyUfy7dmLxkJDaMNRR8YDGYHK8XHqsiCJtlFDZCknu847jNfR3RE7ND9JehCRm5zReFaIw5d2jd6rtFp9Lgt1kj1+7sK+eHx7U+pXZjlu9q0Bk7DXhc5YZy0R1xu+Z2yMgeb67CVtosr5abLqsIyubLzBTt5gRJd8zm5iNz5U2NDq8QUprf5k4DXMoMSmj3gOwW/yIoVhgQgHPMjGtVelXb7RSYNV7nBJJ2rbyg6eCwxag7sV3584VAbJq2tx1wmkyjLFefQlBayViTVvYDngeZLFo6TM118hTXZCg3V/kVBesEixvchCkdoAjDQcpeNlFNimtfN/j30H/yC9aV/84QqCSzu4XOzK3toJvQ8NHW2Pha4Uepet/xAGYVbM5VY14haqlRwmNCbXmYthr/FewzGxoaZ4ZLdIRHRI9HrN/2dfK8N4cI5wLvZboQMNIKByVy2LfrH5YBgI9F86RllWtvEeWx5gVeV1sLOxB2ljfTHX5co0CG4zoLe+9AU8Bqu+kBtF1m6BaKKkqTV9kLPLMZNmWTMAfVxnfMaj9xjeXLPh8hTT12/qFhJ+pv0/XhCPl0V289QdlchT2ySBXL4i1KrY7iNonoSAyXenxsE5Cf+9d8+UDdMk1whs5qlT9kAkNwrFEuqb0tXhAh19cBqSLOBy90MTvZ3rzZnCVJ4RcABvwgo0m0IzV1PcVynixzVh6/WilxuJ/t2w5UXlw0xDPfv6Oc2QT6g5TP8vmGn0kC+fvw3M+3pNKZnvkH/kXHiZR6ZoOYDFY3/0sslzc5+MG0ppPasXSkTbMgljd2rhy18zfdmin/UDAHeg=","layer_level":3},{"id":"56f0721d-ae5c-4ef6-a7bd-be1c864406d7","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"主服务配置","description":"docker_compose_main_service","prompt":"创建kami_backend主服务的Docker Compose配置文档。详细分析docker-compose.yml中kami_backend服务的image、container_name、ports、environment、volumes、depends_on等配置项。解释不同环境下的配置差异,包括开发环境使用的本地构建镜像与生产环境使用的预构建镜像。说明健康检查配置、重启策略、日志驱动等运维相关设置。提供环境变量注入的最佳实践,包括数据库连接、Redis配置、OpenTelemetry设置等。展示如何通过Docker Compose扩展配置来定制化部署。","parent_id":"e198e011-e613-4a72-8920-6d411d5a8a55","progress_status":"completed","dependent_files":"manifest/docker/docker-compose.yml,manifest/docker/docker-compose-local.yaml","gmt_create":"2025-10-08T18:20:37.3334621+08:00","gmt_modified":"2025-10-08T18:57:12.4610081+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kFDscd1aC5KxtjHTjiiSU1zE7PzaGOYJ+Yho6nUmFlncjDqgU9yqAJXFLLWnMcFSFK8U5OwApMqyMqONb3fv45XCiLTzIfBgkcLgFzQ0y4EDdwKWpKprWy1eNnWMb/m2QMKgCPpqHbSqreXniX/AZXrW6HlWRG2TNMz7NyP2IpJraWJHLgyIvbm2z4pNhVvr6Ysj0rsW0R0l7TgkNgMcdDXwNDP135bsvlW0+lcDDQfzIzm9Se5SVnrZ3kvNyrjTxohlXcHT0Ee5t50msXzCmzd9vRkgosb5s/JjS8W1C4KS7fPVWMKJtBj+SJ4qkA/GWprywN3UVx926ASw9p3qweqHyMPrHtT2qcclvbbBYPMVHur4ZV5C4e79F3Llv/1dbpOeaRcRU8zKUWRQfCtEHhYCBqSZQA4SlWIIuXWWK1LkG9KdjiOhuG55EwE7ackhRP909avT9YUaIlA7OWePgUtKquVu8ebZEe5PCcd0CejuDRe+mWjXZijZvzJv9kX0QY+B+WHA41bMELlafHdiYHa1xBVHWf53LBDVVLVSGbUbCl98dWA7QLSVQ/iTxI8yVxOzJpMjaJ58jM8DXTTKb51XFVeyxTNu2T69KFbcV8Z5J79/rMnF0TCDXjB34H7SAKMb8PpNrYkj3vA52bZ4z3U810dt/tXDdsMGTAPdoNrr6pOsdSEKdZcSDfH5wstFaa63KfgXL9CkRoO2Mi3OmTSzKzhMiyOHynZAa0E/H0RoEGk2zT/70+WbcMa0PpsIybvh+2dYANMQAMo/tqstywpcVcMt3nq3k6dxgdbS3HMluNx97m2eqJVvbiJaoUpnONIBK/bMbVjSwca8ccwYH+u7YdVXWGbfAv8iMhLv+y/lVquNH6u0rG0oXjZDPHp3ibfOaUiGjJM0lqvh3Z+iov6WtnLb7NJL4V1DkXa5Oy8NskWxr44tcsnJdgrGjRx1hQx6FYgUdCKdzNyAmQbmilpgi5f5Z55fReLK5Xy2knIQngXGcJjgfcdMZmz72Z1/6I5D61elD4qNhGxWqL+Phq9JmnBpbdxnrP6W2RRdJQa66FDJQqRLKxq2Vwgc6m/4KdNpbCYRO0BpEnJn8mzVlVcj4rNJxhqWLN1qsi7imv+mUoFzDC0/5o1SQqz1/+RXbp0oXPJig+1ci26QKjkvcLg=","layer_level":3},{"id":"ce40f505-b68c-4af1-a528-07209610681c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"技术栈与依赖","description":"technology-stack","prompt":"创建关于kami_backend技术栈的全面内容。详细说明项目使用的核心技术,包括Go语言、GoFrame框架、MySQL数据库和Redis缓存。解释OpenTelemetry在系统可观测性中的集成和作用,以及Casbin在RBAC权限控制中的实现。描述RESTful API的设计原则和实现方式。为每个技术组件提供实施细节、配置选项和使用模式。包括实际代码示例,展示这些技术如何在项目中协同工作。解释技术选型的决策原因、权衡取舍和约束条件。为初学者提供概念性概述,同时为经验丰富的开发者提供足够的技术深度。","order":1,"progress_status":"completed","dependent_files":"main.go,go.mod,internal/middleware/auth.go,utility/otel/config.go,manifest/docker/Dockerfile","gmt_create":"2025-10-08T18:17:58.0923563+08:00","gmt_modified":"2025-10-08T18:21:57.8821699+08:00","raw_data":"WikiEncrypted:w0CkdCdnXCcvlN5xOpiEhEX3U68GI0Ngj6azFMJo9xQD0Nwsj9XajeArLn33w436LuYJWl4xP0dT9zLNODhOpJWtrSnsTOFdbU6xnVdYH2WhlC46KME7gjNRiRMPuUpA7dVEI+NP5zwBpvDMRHvIrAb68HCkCmtSyGQKZSrTNYL2NxP6WPImEyXoT9RMGl6UVv4yJYYr2tmXUjqrJgnZFvSGQtZm2LCPWlIAAFHHC4Q7BPX22tszuLBPhoiVxcSCqHIJiooavJWuc9VeQvWXs2fCKn1YDu2U2lNO5216USYVnr3Ut7tqWoVNIJ1CpoCkZS4SeZ0CLrx5YeUFItmKKJq7XiPSfKRFGs1zfEOKcvdyL+RkR9+1SKIWpGzGcTLwP6CtuQ2Y71Lwv2eE2+xopuoSOmPUTGRVBglkPMwm3/EJuszEoTr0cKi57UrMxc1NcOcd5mXvE/AzIQBMbRyOCWtrzO/qpYlJATnhh1i5L3NpdMDU1vvxj3LFPSHPylc5OvLVkiNtifBGe0YzzJMgyhtKNTjc+BRy/nugT+hlJtBU8+sAxmddiQv2tRcUALDh27u9r/VslWIqKZBy4imfsEo4Hg39v/uoP1SVMfbXOa/A42Ogvfe98jByFSvFdw5Q7mJwq49USkBzCKL8ax2Oe3f5FWNRwkGPWr5eVK84Ho4igv3W/eA+2IytxBe60Zdl/w71ClZaknfiSLFsncBZrdNHC02tPvqStcReEZKC0fwXKU2+zIR+gN35Dae/0/QSY59okC53Yoy0/7pXvl/UJNajz4gJlBvI8m1eC1yLFB6FDzvCPnNR3tlb1IN9JPYf3aI4yc0QddV+sRB/h5jcS1wpB5EwJhrwmmf7E83hHD8zxcy1YAC9LgvSjW9ib+JxZniOiwBRdKPE7mt69R2mqktSW4IQKnoYx4KJpsoltWC7XGPanW9wUXCkEYyhMDwEnSBGtwlYEg7lWpsl9b/CBzw/9z5cnbQBei4HDy/DDmqVxAit1VDg8oIAnAw+fReuWS5W+teFhuCkPvq4pRdb7NiWyV2LuCH7ixYAlIBm3YI4/2Td0Hd0GCZdpoepj4SCzQSUr8RKrse1IlTyID2icWpeks4xJ/cQnH1xw7sL5u52nipyQ+T82gQ+hbkM2i5iC899sK23Rdb7Ug+hKDlaxVoxcsaoIfPvqnmnLRXHxsSMsJcAEuzAd8adU9H0AFTMftLv+1oNmYj2ZhWDZZqohcUOT01qCqx1pr5WkYbE2VXp6Pqpa08OeoyK4z8XPOX0"},{"id":"41fc8a89-8530-4842-9880-7b6fed4e4fc0","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单处理逻辑","description":"order-processing-logic","prompt":"创建kami_backend订单处理业务逻辑的详细文档。全面描述卡密充值订单、兑换订单的创建、查询、回调处理和状态变更流程。详细说明订单与卡密账户、支付渠道的关联机制。解释订单历史记录、订单统计和订单汇总的实现方式。阐述订单处理中的幂等性保证、事务管理策略和错误重试机制。提供订单状态机的完整描述,包括各状态的转换条件和触发事件。包含实际代码示例和性能优化建议。","parent_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_apple_order/,internal/logic/card_redeem_order/,internal/logic/card_t_mall_order/,internal/service/card_apple_order.go,internal/service/card_redeem_order.go,internal/service/card_t_mall_order.go","gmt_create":"2025-10-08T18:18:19.4734508+08:00","gmt_modified":"2025-10-08T18:28:45.1571067+08:00","raw_data":"WikiEncrypted:1TcXmWRnDAgI41cGfWTUk0Yive3RzuhgLOVISOuGhIV579IJtlZOMphVO1f/kqESqjunFCGHY4KtKdpVkQt9HOvhaJox6tSATLns4eTLmYjca52N4nMTMEKVJ7j4TVEmAvALKy1zyu88RF8Iu4XmP5UyRN/HjY/yIvfE6yNUznXJ/YR278Rhrfz0cIx2Gb3OypT+d1bqre7T0yvGpfBsvpXcoadJUWffs6n2AFFatEbUzIiTgP5USEDv+kWch1XSSH32iwjTVwFtVPnECpqkF2SVF2Y8y1awjlYN0hpLwZdd5DMk0/BZ/+ipKbC8UbIfOxSvut++/drS0fhC4wQTN/k7VymKkmk896cWAKuIsRFQmZ2F9AO2nq0evwjAjMd1fdwhiUGRFKp/8L2MK9pFlGPCzY++vILalUt0yTXUngFTWzEaYAt6kAlwonmCPaXTPPVxX/ijyC1N9gSi5Ul7Gu+JsdOQjw6W5mzE8wErLF7g5EVmYj6Iob9rzEetk1vk7Nir1bLwYSBvJ0eNZN8RAvz4wcr//1mkvIDA/MTQFhM1pjAZGejfIqwW0guctYbN5uMf9gEQ9jRuOqpL0GjyFgtBq3rdC50s2hnSELrZBtb88KYfNc1P/QB33ocphJF4k735MSuiCjs6tuaVBZiZ+o0Ic86Ix2T6XbJlMmlMypJMwV+JV4RCmFS2NgSA+zIAoRA/N3Rn+zpZgH8ERAwd0xz6XFlwjGRUpP6jkw7nkk6Kmfpve+v/S5VLpze9HncZM3kuqbBfcHyvr6DgDLwbbrep48sACgbP47Cw7x+wvV1v7MCIH5P3SVzHXjGaVfkAoksUlMjdLH4+8/mFA0gvyXq1t+K6fWO4bmplH4d7ecwLPPo33s7F128ANmfeyWvT2kZ/Hl85N8vOj//QRJmguEJDdgT2inOLHOfLI6DEqZa9vY37Utau1L+PYAeVuvpTT+Ovu7n145bU5qNUOqpchMxrkVF0+XF+ZX4NL3m5DFEq2v+5vEFqKj/C3iRs4hAHiiNj0jkybXmOKCZaaDHtTfUuSgIYxbOH+wRKs/PJyYh8UwGbbJs+8VPDWhc/ohwpw7B2gL9wisJ5YE3HFLZ+plYtTRW15dJuiNfOZ1l6bWFHp65sleSjrtl1+zQJ3ROhztlDPcl883Y6Wzi6XyyZhnn3wxzM1Bsl85vaeAt/TEmvToT6cBKbZy/wyjACUKqk1VQ3s1cyCAI6uEXFos0/H0/K1xixY9OoQXC+tsQqbK+k719VtFHtr8DgY+caX6oCUqm9fUS6QT50V3yo5o3upwHetiOmZOB7SLmAZvxj6kanpGVfdTo7ci16nRoWtz03Ha0uiLwwryZtqBNy+Fo5L4A4ELqsfK11aTeXBsrBYck=","layer_level":1},{"id":"07543b8f-2f20-41a2-a409-abc1181a1000","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单数据模型","description":"order-data-model","prompt":"创建kami_backend订单数据模型的全面文档。详细说明v_1_order_info实体的所有字段定义、数据类型和业务含义,包括订单号、金额、状态、时间戳等关键属性。解释主键id、唯一索引order_no的定义,以及与用户、商品、支付等实体的外键关系。阐述订单数据的验证规则和业务规则,如状态流转、金额校验等。提供订单数据表的模式图和典型订单数据示例。记录订单数据的访问模式(如按用户查询、按时间范围查询)、缓存策略和性能考虑因素(如分库分表策略)。说明订单数据生命周期、保留策略和归档规则。详细描述GoFrame ORM框架如何将订单数据模型映射到Go结构体,以及DAO层如何实现订单数据的复杂查询操作。","parent_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","order":1,"progress_status":"completed","dependent_files":"internal/model/entity/v_1_order_info.go,internal/model/do/v_1_order_info.go,internal/dao/v_1_order_info.go,internal/model/order_info.go,internal/model/entity/v_1_order_profit_info.go,internal/model/entity/v_1_order_settle_info.go","gmt_create":"2025-10-08T18:18:21.3789405+08:00","gmt_modified":"2025-10-08T18:28:50.3049034+08:00","raw_data":"WikiEncrypted:1TcXmWRnDAgI41cGfWTUk1R7Ob0dlO4iS5md97HGy1IUcNsLG/EGmFW+BE7FWuw6SWfHaCr+3MFY0MgqSzOl1OL2ZM9TRbeL8AfQEc0ln3MMKbJQCyDbnjZyYdY/LJJEcsEHhprJAw8tIkRHq/yYKI/FQE4+YkVB7Cxhfi+vNWM8okozNI1ndjoiweeS+IlD3Yfyxq+htkYw/Fyfy5PwyH8qf1tY9ToWSgBkaGm0nl1J7yTZobw3ISf4Dr6L+VaMy5i9Wt1e4xnz1cKzeamnSMuW/ntuDaTXGzqypeuvRNCLYSWE3IzNMuJlr9KIZbOWsrhy+YY045ObSUF67N/A6BUP+0iSk38A1T/E5+pI5JhlkIld8iyW411EvFzoVzyciwB7Oc6uFqVG6VPv1UNit7STXIBiGJjGQSE8aUoqOUP2f5RqWcUjidoH7+Gjj1TlBryTcdmu27PLhhzofQYQqR3KKsKQg/fTkpRlzObdnqTkINMqBINpscAMsO68JlXBQ87nMRHflBa+KzfPIo9+M+agfc/jCH3//VzBWsObHCqSQDK7L70o0bIVQSrdVd+Hcr2jRepyyVTEbh5JlyXjSjad75lkuTZPIO+JSToIqj7FspqO4XxAN6syEKlOxVJgXDkwys+2F+avcGxsj4eCMnlBzckPEWQh4JFOY7D7Br9rINJtG5LMVZbbbIxKAVbgYUFH6PnVTGtkZBxyoI6tRX7SLvBJRLztV0lVk0JTcnUM2z4poezd3nmEHAWf9OMGY4nImos2OuYgEXFJh4eg9hbcZfUcJzY7tjgfkaX0moVwltRVq8E+Nx4+aHaPlP7k3Zsfk5uNA3Hy0f1Nd0Zl7bdqfpymAG0krtNjxarmim3QtliP6m+TdinGDRRk5qWRUlvl6rzFALN8H5IVMvYU7Kx/X3nTO9Q/VWg96lS/O4OKkO7ZILzgR4og8ulXKnlyT2DSistUkyBi5oHlhvzX1AxQvFcB7tbuiJEcnbDITKxOZbEiZhn+Hn3RHNo7p317l2W3jSbBUB8CsITZxd9AVDmEAkqGyljFIeDeahooiZ4TexZR/g5OcHWhj9oPkevPKLubVVYLNOFsTYyhW/JqjRBQUvdBhXchp3dGk+J7ShGwPd8QpYEyya0Qp+oEwSKHatFjL7CCd9XVcISq/eGmQPGzIIFQUzatZKGZMhHWrfD+8ZiaXsXdxKmL6n0ch83LPdUXeLKvH8xH+TFsRTx6tnNoLT5srj96a/fvEoiULLNhwd/XklSwmBC6E10Y+H+ypV+pBstWfpyChTgc9jSiJ69+jPs4vs49ypcBttV6yQtBjmQrlN+pk5pfjuaW0MBmkoE0MAoyLn+NLEPlMdU8NudCbRyh1lpIUyPOYdTVFzzdkPENvQY7KrzMhlP2vMvDS0VjDFFxLYP+CKh3KnvYVfn/AbDOXKYyPnK+ReyMlw8sjOlW6FCeVmd3C/6mosV+fOfQSy/jUiFHe+7WaTs5TCyPZWPnx05rHh+qTi6A4JQcWUyc1CXLWHc+1r2Uujt/3JMOGBxu3qSFz3ZQuU+34En5cNwe2W1lvJCdHcErhmhYPIXOzEPJYem6PmeNC3Yu6jjLiAVqN1ymNC72laPCeVZIq0h4BRRQh0Yl5XefaCvS2gTeuFS3wcNJAjGam9X/mEAU4ZJ59+7IcdoCS0V/W+QYTcDCpAQ0Yg78TnDcDlBquQyfldjKTpjv8ThpZN1RKcB17BDr8xAwX1FBjuNUZ6EW1Rr8ip9RLZHUp7fylWm2TVFy3nXmxuWxre7PALO6","layer_level":1},{"id":"667164c7-51a3-42fd-968f-e3d167096e33","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"卡密信息管理API","description":"api-card-info","prompt":"创建卡密信息管理API的详细文档,涵盖Apple、京东、天猫、沃尔玛和Ctrip等平台的卡密管理功能。详细说明每个平台的账户管理、充值处理、订单回调等接口的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括账户创建、状态管理、充值提交、历史查询等端点,提供实际使用示例、错误处理策略和安全考虑。解释不同平台卡密管理的共性和差异,提供客户端实现指南和性能优化建议。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":1,"progress_status":"completed","dependent_files":"api/card_info_apple/,api/card_info_jd/,api/card_info_t_mall_game/,api/card_info_walmart/,api/card_info_c_trip/,internal/controller/card_info_apple/,internal/controller/card_info_jd/,internal/controller/card_info_t_mall_game/,internal/controller/card_info_walmart/,internal/controller/card_info_c_trip/","gmt_create":"2025-10-08T18:18:22.8372285+08:00","gmt_modified":"2025-10-08T18:29:49.5215972+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBrqg52XK6vHYC1aa5HfD+fAysLGU+IrSsWWtiuVNkoLjsZ8BLYXoTHsHgDp4ZhLjIz/3N5CdXRE+IH0zYYn06ykQJkkOedfzhQgy2SMEEIvCGAdlePy1qy8sXpq2kBSsUvsoI+XuBoDKgyiJSmOSDYPTCIP9Sr6rVKXQkLwWLGBC9qK8oSqy9tuw8MOQgJJenreZsXCV0X/BNGYv4n+OdfFjPBNxwyN2vT+IZ5+vGovRm+lv0eNAVc9sL1vUH0MaGDLTsvJshZDOjISU402581twzZ/pq5cT/Q5e4+YodqeW6EaKbG2G/tGcxzsmGtGtQ57bvEShpRTQZ1NzQu/sIFrKbTgNJJJpOl59ZHEgsgdBuu9uFco9O1tbEaLDzFX4Lhbkb3jNNSS/ffI7BOS55nrgZlBtCLxhuYAt909pJTvj7/mLlTV2czHgXlbZYrQU4K0DvuwHmqyLnE6M4/oNJuVxsIMxP79M4uvuDCL9Evoyiu0tRrXtsgCafossDHMAwGBJ6j1e3nr/QdJf3SDeRrM4kT5StN6uBxzcV+Md02le2pKdIRlIjLZI8gsx2V70HDulyRUvQguPEPfY4gLeL9N+gWd2lD3VJ+CXbD1tH52b9NvzHiqsBdac3E68Hg4w03gNrE1mv6ENtliboDv5RXue1u+MwFgtX/DIzgS6xvx871fuS9Wo8cKql3D2C6ryALgnOwYNQ4zsAG+WKm1BoAKS9qGA4hAalbidgj1Jk3g1+k/ENx8FK6uw6e3hnW7/UJZU+qoFfhaWYST1MJSgpKF4svLqToUk0P1Y294Plx67GEw0UwaTzddQ3ozSkPJtXBG4li4Fo+ubCHnqIIz/6CuQx9Hfq61WLppn0hrTXsGstta0MkypvLeVFUFdnX9/aM3RCehlSMsCiFAeVj7WOiUFoShoq4jhcBJVhm94SltiFu7pIuC9N0Ojwj0Qx2sg48k0ivZczJvzlbh55l1/JBBUHuGaZnzKpWvejZh4hRfOiU0LUXFBN1GATGkv+MmEuHBVDxJont867QBcyekr3IUVhNOr1pa3Pd0hxSlziQ0d9kzodP8q84xLGzBOh/SNVPkGgJ5MHxyX16rhDC5SY/PqgnKmnitMg4GG9oX0DNfek+reu8t7sCUN34wNBHtHpNCG503NELbTmw+mcjpgRtRK9oseLcyXBanD/hWIsnF7NEbFFiG0enbeyYcEhP8asgBMsqVA+0P0dEoBjuwNo6hi/PKrwZIKsKXU2r3Irz1VpQOn/q+rLhOL9D7aU5MlRpaaXI30u8Lgt28cwVRHKf9Z0KxDKfGSgERnoPB7V1aHAvuD2g0T1epGB7Ol+booPMpG8obzM4+W87LYTNP7RH+zU++OUFPHwbqgph4TzAYkRsZ8qGOiDynR9+MmFbPDJG83b0X2HDqRMh5f5YOngAqNW8fWZSmJbajUCpahf13N","layer_level":1},{"id":"0af73ef3-77d5-452c-acf5-4be5ed66a80e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"授权机制","description":"authorization","prompt":"创建kami_backend基于Casbin的RBAC授权系统的详细文档。全面解释角色-权限-资源的访问控制模型,分析rbac_model.conf中的策略规则定义。描述权限检查的实现机制,包括如何在控制器和服务层进行权限验证。说明角色和权限的管理接口,如创建、更新和删除权限规则。提供权限策略的配置示例和最佳实践。解释权限缓存机制和性能优化策略。为开发者提供自定义权限策略的指导和调试技巧。","parent_id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","order":1,"progress_status":"completed","dependent_files":"resource/casbin/rbac_model.conf,internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_add.go,internal/service/sys_casbin.go,internal/logic/sys_casbin/sysCasbin.go","gmt_create":"2025-10-08T18:18:35.8961029+08:00","gmt_modified":"2025-10-08T18:29:44.6947329+08:00","raw_data":"WikiEncrypted:Jgq9fCpm/NkqSNIWYhs+n3LeaG07NGCrNcYdQEJMIJmIZ1iPjkNZvT2RpQnX8LDCXRavNA0RTry59fMEhV2iRgG0UidHVojrlOr9wca5f5TTnM0+7u2hJkLOvCJh02e4OasOcajoQDCJYRPEvGMwroqJeEBFOqPeNbEFr8YSlHBQ4kQac5MP3ErY7i2RdzXjaISKkyQnXsz6CHZLCe6Jc9k/Bc35KEHacgylbsyoaIq+IjchEulTpgxDXhJ9hyzb2PtqtWrpOi8q4lEI5zSD7keA0XHr1fkHeO9Wqp2WxVJu3GV+9i1p4F4UOKC5oigUZpN5oC89zXMMJycG+KWpDBLV1uVnFM0QvCe+Sods2wcyBwh4u9Os0xCsB+LnuOvsHvJ/nlbg1SP4r+lNcFgH9aHkcDuglfuq/uqbP953Dwciyb31t/GI0MDEZ4oa6QRxRuhEd4wqwXiaEhtZWf8OCnYwhff/Jep1puFl4BCxqPFZEEpeMlC2m926O/zUP0rQC9Ufhl/N46tVJ16zr0hwRoSETnCsyudAIqE0no789R/p2ySv5Oy/JXDGVORLTWdh1hWxJmnn3FGmIBoG8qaO99VPNz9f19v+cIGrBliOGIj0NkMQRs4vri24/lOx20ZfTwi4zYK0M9zC2I5iGUUxh0dR0AKrwzEw7la1qprAEVtuxf/q0GL7+oMH6cz+jXitSlWAdLRdQXHcjTwodPKh3Lx0favJ8wr7Em4q6/BOGw7RRrpajvmwvwBJQ9Df6j2T+BWCILgA+HjG+iHy7z0CPQI45ZnqzsAvkvVc3SLpGbuMDaRkk66OYbpJOgUB0/Vwer5o8ujRZuJbN93gOm/FfHAL2hNPil/xW5IPXii50A8rAeRSW5lopgO+AoBNtoAIbEahpFUdQwE0Goq1KE6VNwFYbMDd0RJh9zx3hWvfHC5ZWxdNw1d6XvEDdDoXQ4y0YtnTRKUQ815+gd6i8hDS54YTp9p9Y1Z9ivaIOYljCZuQFAs7WYiXGWYeg8OudG7GRsOlTk9annGxH1Ag/n/g638OMH/Ky8R6f2ZsyQADvPNcJuOX9iMWAYs5b/RtyY/WPtzSNTSB8bBZKM4cz/pYxQlmQTR28p+cSnX7IfeEYAgLk+8pCEirf+woRHrYGxC/YviB14bPrDSrv+v5TARuzFxKS8KQ2hKVdF0/ajde7J87lNs+7BsY7rUbb6UMsliP","layer_level":1},{"id":"efbd0135-a20f-4d24-a080-3249ecccfdfe","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"监控系统集成","description":"monitoring-integration","prompt":"创建kami_backend监控系统集成的全面文档。详细说明OpenTelemetry的集成实现,包括追踪(Tracing)、指标(Metrics)和日志(Logging)的收集与导出机制。解释otel包的配置结构,如何设置采样率、导出器(Exporter)、资源属性和传播格式。提供代码示例,展示如何在控制器、服务层和业务逻辑中创建和使用Span。文档应包含监控数据的上下文传递、错误追踪、性能瓶颈分析等高级功能的使用方法。解释监控集成的技术决策,如为何选择特定的后端存储(如Jaeger、Prometheus)、数据采样策略和性能开销控制。提供监控系统常见问题的故障排除指南,如数据丢失、延迟高、资源消耗过大等问题的解决方案。","parent_id":"cb5122de-2da4-4368-8957-6b7d9cab3982","order":1,"progress_status":"completed","dependent_files":"utility/otel/,internal/cmd/cmd.go,utility/monitor/","gmt_create":"2025-10-08T18:18:35.9622127+08:00","gmt_modified":"2025-10-08T18:29:59.7579742+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPrAH/UrhOB11piGSWoyOV2dHVr0n3Bn0Swd0H0gYOAdbVNKbTmRhvw1HJM5/Q01+URHbU/Y2+Djgj9uGcxhMk5cHiAB2TiFj5tg4C/UkYPXIrWDwTdHLdRRcp2V6mOpIyQ1VYlBfNYtuG2wRp42Z+/3bBEIcC+3qsYn8OaFjpKSIAb7FdpUFBciL6M/Cz3oKEQ1x+wRDtToegQWuLK+PutUEfU4fTY5RmVLo6obONP7Z86RTzzERt1QaKURZmZz+C3dlis7l7IYwuic0fiH0WlYGqP3ZHUwurg0vj2eoYkhGSDg2PGUyjOgvO5hIkFEmRWgntr/LrMW5xU17+bnpZAlHWqRP12yvw4Unhvv6C7hw8bk4RWkI4WxEtEMeGEfOAgqIFnXYX/kXT7aanjvdFBbdj61A3GcyOVE9+ELXUY2XHAN4dh1k4NNzNS+z7uX7w8npZUVIzJMb9O0pZPVSJ5ynjrZX8w1k8CpU8c6M2orol/fUttKuMCEh3K/7YZwnuqssxlrM1Em1LqeaImn8QKWwUvv0ymyQc8HzlXCVqkyYKt5lkr9LSTQ4P9BeXrqXGW0AqC3ZUT6GFmG7IL4dNpjZVbbdZ63c+bVqJFrc3VDYaHNR71iLMhckXKIqy1DGe4c9rQ7A1ohCi+U8v3sV9PaXPKI4EOXyPI9tw2OooH0DBXzUMUB4Q4ZnXv4IedHG130GqLFaL66h5kI3ytLXWeDFEX3IJGUaZXPLHb2FnnNyOqJam8OyIbKwxKZnC/9DZTLG67MZ3x0h3Bql5sTCKKDd6s31eRagURn8oamaCZhRGiXfNVE+syT8rpCXCvRUS+ZG3PLPexlIO2vsW4svMqFbHRE8JAMx+CAo2ijQsNfSk+8T8yS51i1ZrADladfIEkm6Sle2Q7O/UiQU1T144p0x9B/j2gmzyFUhi2AQqc2sJBc8RPEOIiUZIzmG4A/OxYLboQ4d0dNWsBVIgryijVdKMsdhu7r9EY5Y04rOE0oGPhpQbRRxgn3lqp/ar3dVNJEwsGvJkTOXYB+YdN279sC8BMPv2FIpOG6eo9aS0S35wZifJMcsUxdAwMF0+6zfRRhtmZbIO4jaev9day1xzb7z+riYh7PGZmEBIlcAVAZijgCXDRaGAfl3UozNebRaMPpkgSNoC1PAsLZ9iI2bH6O7LjO78LGzXh2CxdITkkbN7tWe1d4FArATCWLjMeJ2YdRpWhVS7CGwFOY9h77wSLiIzp5AxuHQvzQQib0YOpn+pF4x6n6JuvUO2OfEX4p0JEi0bqVC4QC375wgrU3+1SjgBgNk9PGdm6a5Ya2vEFTmlXFdHkAsB8bmXE15lm4E0sT18xxsQMJpyizPwXOPCfqbbyKhdiawTzJUl9aA7j+SeEZY2sT/Q44UXLmZm1uqB3wjwH/qcmPv9my8fFKC00IQpNmmskyEPcp8qBrrPOAe","layer_level":1},{"id":"4ca438ce-5592-45a7-bcdd-830f65e0048d","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"容器化部署","description":"containerization","prompt":"创建kami_backend容器化部署的完整文档。详细解析Dockerfile的每一层构建指令,包括基础镜像选择、依赖安装、代码复制、环境变量设置等。深入分析docker-compose.yml文件中的服务编排配置,包括kami_backend服务、数据库、Redis等组件的定义和网络配置。解释不同docker-compose文件(如docker-compose-local.yaml)的用途差异。提供容器化部署的完整流程,包括镜像构建、服务启动、日志查看和容器管理。包含性能优化建议和安全加固措施。","parent_id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","order":1,"progress_status":"completed","dependent_files":"manifest/docker/Dockerfile,manifest/docker/docker-compose.yml,manifest/docker/docker-compose-local.yaml,manifest/docker/install.sh,manifest/docker/install-test.sh","gmt_create":"2025-10-08T18:18:36.1496811+08:00","gmt_modified":"2025-10-08T18:30:37.7001408+08:00","raw_data":"WikiEncrypted:OYVOcFWO8QG2KTNzD99v4xxMusUyWhQxf3J/07wObNtFIyC4CbcNIuFY4V1ewVc8ZQcA3boon6xnUDfRpiaK2BRUAhlH1+fbuKhTMeIFLZYAHWpeiuXeHFl6FjFS/Cz8hv30Yi+prZq5Jfywa+60mlYxpaLuPZRvQ9V2zJsOxq1B15dUxEuRufn+MrL0Neq+z5sRR1Li6Gbk2vOpCMwAS4vt5etXp8EZqcZVW7KSxQ3bgZ1Pb990BioH3X/Tz0KQrflb+UBdIuknD2HkRxU5RnOoGPbu2nkZ0C0hTPDypRuyqKytb+l2q0Dkn8T7Qo6ynR+rsTuCWaGZkc6VZ1GRE7tqWLwW9OaS41EEsLeWYYpxpKvxrHirUd+44TdZdrQ9oUJK2nb0N0NiUkw32CvxFFbPc5W4QyrL7iXhaG6Gj6061EFeHrICyE5KcKpAf9B1eRQYVz9iiPfJURNgeZ+A1xXjACHfHcxHGOybBmMNqd6tzwXUuSnr7aZLcIWgX8Kh7nqL6JYFEg4xUjGLwqR5xCb8oJoQW88R6ziIRJX3RBOgw1cDcItN3SWIf8LXr/ZEheooWu0UecaT5Tt+OarwjqrvR+VKCn9LybaKKxZ/UVF0CB6q69JqoS8T8j6arNZY1b2rh79QCFJzZCBBRgRXmyOZ0cVZMUjEh1ZLGyRccqettD01YdFu08Mmtoo4dbvPVQ5mvzf8pPL78wGjmH/+KH0HIUU099OhBPMJVIwnTlJpGnck+z4RgezxjodsRlMsKqNbB/Xy0oLHreagPvqmPY/jcsorcTDDSTALmdq6waozV2NC+WpiFT/4qtF0fy5PlWRq/3KjHXPdCikpQhfAeZWdNO42wtMH+Qaj1/WI+hU3iXHQwhTDIHySs4Dj1/2TXRiSvvWiFSKNrR6LmE/n5lF0f9aRKlL6xFpbXgehEN7k87Sm8UsEHEB81vAn/2grydMlOYXMvKZBk1djbqUTsexUoAo4hrL6jD7hQDX+TX5UVamMcz76YDh6+nSw+3++gOtJ7x5OgqmzxSaGtgM5I6xiQ6mDrHzeYx6JxJp4C75j/C60IpN3S5/rOUcPQUNXVzK6SgprGfIESnUQLqnvyJ/C1GSIjeMgnRJsJ6NW3wQ5w3yDIBQIBxTAcL1a3h6HARnuuWjmTh20uv9ySipFsJpA1MXbCiUUMO7J0Oo9N+lIGB2Jn1z3oBrgqUDA6uVIFMwtLdhGRvcdGEtx/RPV8Z+cJCV2iezxt2xj2rfx4T7LVYqsI9sU88RdNwT6Kc9S","layer_level":1},{"id":"4b047e2f-4d42-4e10-a12d-f5dda665ecc6","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密管理逻辑","description":"jd-card-logic","prompt":"创建京东卡密管理业务逻辑的详细文档。深入阐述京东卡密账户的创建、更新、删除和状态管理流程,包括账户分组、扣款规则、历史记录的管理。详细说明京东卡密兑换逻辑,涵盖兑换订单创建、状态管理、历史查询等核心功能。解释京东卡密账户与订单系统、支付系统的集成模式。提供具体的代码示例,展示关键业务方法如账户创建、兑换处理的实现细节。记录京东卡密管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"e408f911-d11a-43b9-a15a-d55aafbd4257","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_redeem_account/,internal/service/card_redeem_account.go,internal/controller/card_info_jd/,internal/controller/card_redeem_jd/","gmt_create":"2025-10-08T18:18:47.7718328+08:00","gmt_modified":"2025-10-08T18:43:18.2474185+08:00","raw_data":"WikiEncrypted:2Tw4z8NsJjOlKl4tOUQ4rUaSoXsxiGw9O3wpAWVX5Hw9Zn+t5brSy6DKjiADvUn5zD80pLs7e6Rkb+ZAlcoR/eE9ccXFudltqMag2wVsQePcUFo+mDT2nXjsqLT5mA40/IJ49Ru5LCBQbhNci8QbxMRFvluUXdUvuenc+LVNm3AQOYOQb89aMmsZsVDljYVNe+DYDHhn1OdSnbB1AKBs++zJFjWL+nFebpJ9CY+McwdmT3zg3RknR0qEqbWPo4s6NUSNZPhPF+SlzrdZ3j4cu77xkyDstaH9mreAGyhHuXVsdFzJmURaJUlHUm8hYUdE4O7w4bBKxgWZFJbLgMVTl6UZUWPwrNr4CcSCZgiY3Y72c2iEwwNk9aqysdXjbO+p7Ec8ZYpv6rEkhDmF3uuk24EZEjwXvp5I8djNFI5LRvdtG3Ai10AO86bBZMAi7onQQatHdN+CiLQ+Ur4i0gEAexVwE0OZiX4RzpbmVoT36NSPmddO3GgUxsjod1vqalZqy3gIt1Hs8V7HawKDtH7IzhQEvYgJrG23vzUi4V2QXeHD3fF4vkPByfMCRbNyGcv6o6/hW4eb4yPWX1LwPg8iEX9imx3TxqA/8qsHTMfJrmtP70NNzXeuMnQ7MvIjlq55Nx8wejsRWuEFaen8j2bbwCN4WaQHXEaMigx+saSsuifW9y3CpctQdISZv6ap1+3urMk/me1OIuSuaI0EJQAWsx3J7j6ecoA70728mZR6G6nih5Ggl96zSMJ1jN6r1WOXuJtMff+thBaktZMtVZfeMrxkSFR8TDMkRk51Lr9sWx3h70qF3rtMHB7rlV/brkmCohMKLNZW64EldtqyXQJI4tIrzKSMtXGp60yMJXulcx6L/jmYF9VK71omKqV2EP1N714L9AxSKjz6iNubOjoHgA4Px9MPP+1YqNczN+33A+DCiqaXK3Vm5REcp8Qx9nXK6tY7rJ5/Fs8/2sdX6zOZ6AeMkD/MPatdnA0yFdNeOZSOC8xbUq1b6YKXG4bVHx9lEsR5O0o0tjqONmSgxLUVWjluuHRdwACQNFlDW9U7SoAr6veu4VYcUSmsrhzx8KQeozPeBcsnqqU2ydBXJzZHYQBc3J+YWJSYH14RGEMaFrv6/Nr6VHLMBw+f8RjY05OnCeLDNe5B65tFrMVSCYcV9rWfdRQd6wsvz8GDwm9S25YgjhWvZ8VsDMa51+d7I9sg9vzz/zDQoS9HhBLYVfkX39aSxM0fxN7tkMUyCmaihme6RTMwIQaCAd4wGYLxckiUS35HK6qEUGKKUQNloHn9b1hbVmMMrsNNoCaswodPc73C9xNhGEp+j3oduB0O4cF5cOKqcivuxvAbgm/gTTig4wjmXa5BtANQsXfwfOs9b8cxzitekmHWMcpSlMFrSW/6Ku+53nGXPrRe9SXxaowk7Q==","layer_level":2},{"id":"5cd26818-f1c0-403e-b35a-4383474124a9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"地域限制机制","description":"geographical-restriction","prompt":"创建kami_backend地域限制机制的详细文档。深入阐述基于地理位置的访问控制实现原理,包括省份限制规则的配置与管理。详细说明地域限制的查询接口、数据结构和生效流程。解释如何通过IP地址解析获取地理位置信息,并与限制规则进行匹配。提供地域限制配置的最佳实践和典型应用场景,如区域化服务控制、合规性要求满足等。包含地域限制与其他风控措施的协同工作机制。","parent_id":"6d13ba87-5f1e-460b-85b5-9106d41abbce","order":1,"progress_status":"completed","dependent_files":"internal/logic/restriction/restriction.go,internal/controller/restriction/restriction_v1_query_all_province.go,internal/consts/restriction.go","gmt_create":"2025-10-08T18:18:52.356514+08:00","gmt_modified":"2025-10-08T18:43:32.5278321+08:00","raw_data":"WikiEncrypted:P3NkKI9iTG8m0x1wQHusvRv9W28aLZc7fU8yLGlEjox9OneM+QWZz8mD/lxQGkCXhSKurHn9FyuzwAEvgDByqBZ7wI7cF4nt3mVvixHgQ68puv7ji8/e+4o3WVDe4+8vsAtEyK9fl7kY2GmlYHgX0y8CvGKG6niBx5OhF5+v8XLH5YnRx9SxDy4oOvJlowOdBp03CrXgMsnH0VMGn2e4/QNq3zorUijFq6hhThfi8h8K478JvG4nI1rPm9vMqxW+hL6U7RkzvqGkz9JOueW0yldQCsHXDBvL+C5xJEze5E7wVO3Ii37LfN2vZHs8Cqc0hzx5hSWDbwjyqH50a9fr+JtvqeNiM0KaHYkBcDULqYe6L2L/o2nIPOEYnkp6iJEAcjpYE9Uil3xkjX9KLwpxAl942K6hi0dsmT04Y4g5ZEFA/sVUuCDQweNW4jNCnt6tYNFaNmX9Cl0DvquC6gdsdTY175dRS5x+0mJHayZQeLg8CY2C/Rrztu4qJL5gQjgMwN8ecUts0GQfqTBCxI0VNfEkQEy3MGNQTABdpNS9m0jiCnfRitMZoG8ap6PV0AmhyH6VQlPd8pJa7KCdN9lkv1rqGdx5G6zaF/MZPfaPJFpdJiWhukBzzxdCNzmccBJO8ylIedjYCNdh+rN30rCGcg3gf3szYxyxxodXhMcXDflzinnHCi2kZpQvpZX7u5c/7MlSVjj6tqjWsOjaZZPomhTaaLW2R6K0oCYyAyy4XxIUUTpRo2Vpeq3YROKE4BsXmz9v8sH9g6FWvAP7Bwn/AuYT0wh4JsGAgA+NBe/PdIf7zm6nADsvilJy42+JjIQTsnlFqclbGQs3yLqQApYF1FENA4b7GX+G8Gduf/8IVRXywollxZevSM+WHtGM9LtCGcUjAJdQNPBQs/ql6UwlgkK5yjLQqDWnFyHm3VI9LWUUIQmzNtqqtYBlLuxxfpQQygRbNIg+Ys+aHYHCVG7z6UDeJaNJur9jH6MVvUUbooHkZq8h90d3ogGd4tLH3ybQxWv5e2eW8CASlRvdCBfiztC6UKnv7akCXv1yBspBgGcpoKYxsW4OIn3+3ZqgS7KpQ/eB0oNS0QVFPXu8Jh11AcLQSuMJQrNqXMQRDKxVl61YCpSVl2XH872xJkI3upUWdrpkcfTy5QD16RHGL/Q55fVpHpTf4FPJIxxf5vbC4u0=","layer_level":2},{"id":"7f916288-d706-4266-b42b-402c6a9efb46","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东兑换订单处理","description":"jd-redeem-order-processing","prompt":"创建京东卡密兑换订单处理的详细文档。全面描述京东兑换订单的创建、消费处理、回调验证和状态更新流程。详细说明订单与京东账户的关联机制、兑换码消费逻辑以及订单处理中的幂等性保证。解释订单消费过程中的异常处理策略和重试机制。阐述订单历史记录和汇总统计的实现方式。提供订单处理性能优化建议和常见问题解决方案,包括兑换失败、状态不一致等场景。","parent_id":"41fc8a89-8530-4842-9880-7b6fed4e4fc0","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_redeem_order/callback.go,internal/logic/card_redeem_order/consume.go,internal/logic/card_redeem_order/order.go,internal/logic/card_redeem_order/process.go,internal/service/card_redeem_order.go,internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go,internal/controller/card_redeem_jd/card_redeem_jd_v1_order_list.go","gmt_create":"2025-10-08T18:18:55.3252912+08:00","gmt_modified":"2025-10-08T18:44:50.7469388+08:00","raw_data":"WikiEncrypted:1is+LRprKVER20tt87NmqZvzocBLuqa/fQRN81Mu5dr6eCc193VqUADAMmW8ldIQPIVDcDblV6jd0c5/C0xXswlnJI6AWmxIyYunDCSR7Ih4korTfRnqIfyFUi1DlVuwvVsHw7a+I72/tAzQUbPWTHEBQ5lvwp//RScrCBEiSjpFc9s/e+qgi7x8lqXkb4iZCvMirom4xGumuNtUKYNc6jFhCopvKmJ3O2jYI33Es1szOevpvO+wM0KyVn0NchcnROuw1Ehb4+4uyVxNMXtr+xezoD1oHaM8x0dRDu6KovIo5MePFxRmrkrbXgh5AVDUw57RCHcJNf4JvcRPHiUrnMXUHyn3Wo1GACmSnN6iNZ3NBuQJRVNcahsk/yYsFl81aZW1RCzL9IpnnefkSN+FB2wLmoUFAxcLNdgER3mPCUcXwabzs8L+72owifGNdhggWIZ8xolNBlnYpOwpqDVbn/AQaxksK9301cuW2quJrZFgEEXeit94IsgiumZwsAaAozHTJ02H06A6u0cMDMJi/NXlTrYq/Iz4yCdDrX7554S4ZdHn1Cd32N/hhzunTDCD1yg7HgwRQFxmZo6G61+TuTIBStOYEYIal6ip45GMktgySrYmibXSdVuSbs8QqtdC4mBYadZudmdL6XIFAOu3ic0mZXTwS3DO+ZLYtA7CB6dhL60dzQaF/9wEkarNWEnHnNV/cjrQG1aAZVDCxG4vGrehIYFmcZpeqAohgcsLJCh6tGVBpPg9ntCtkzBx7aDRgLaIgK3Ho4h+9GJnTYmzqWWx9erT/g3h2cQWD4y5qHYPFsHz3URgp7zkmHw1HJtuE8tRf6DutDMl64zVQlMA1uIkbBnl+xasvhg6Z8C4gmGcYvEl54DTVUapVduv2QAtuejFVe0Ou2qQN3a9X4EvqT5vWufQipjgwlqwqphCwQ9JBge53mbm59nQ91aK6DG/2vM6/HXamMD6zY4+nld0hyczZf+DCiZCFehyyqQkkfr6+WMGYbCGgYhe0PmhgSwQPPhbUNTQmO7+B1Dwr6dPKBCSpkksEo5Br2OcPu+7zNJpW5CTGXqWT2112L9POaf/EV7q7OvgdddbBVf9bNA294laP12DU+GO5RZ9/0n6eGgYeBrGLP0wiaP8Xh8cmDsp2HrZYOdltbVBXt/AajEVba1Lqe8KCFFzIXJi1DsLfI0ZSjxV3udqzOYsvVBnz83NrB+QXOO+j/4MzyG/8+5TJzn7Vi8ZIKD6afiEdcnVJwaY5GI1B/v3jJer3I+RzjLWHMDmzkbABqYsrC8id5QRm4iTmLZavMa3j3K8YpCbYoCCU9oWcW9plpGJy0DDlc1Au3qjvNBUU2VKDZbDMKwbESCE+AAkMDiqrjANjnlA2JCPYEBF/LxJSdny3uDZQmeNOLqg/CfCuov4sXrNpvAjKVzNk0LGyC0dqlwk+g40RTa2Od5e8BJMZWGgGSod4Ubz5xW0MPnOvxg+1hs+f1jv2A==","layer_level":2},{"id":"100a2b02-1888-4c57-9cd1-b2492db9671f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"用户认证管理","description":"user-authentication","prompt":"创建kami_backend用户认证管理的详细文档。全面描述用户登录、登出和会话管理的实现机制。详细说明TOTP双因素认证的集成方式、安全机制和用户配置流程。解释用户身份验证令牌的生成、验证和刷新过程。阐述用户登录日志记录和安全审计的实现细节。提供用户认证最佳实践,包括密码策略、会话超时设置和安全防护措施。包含常见认证问题的排查方法和解决方案。","parent_id":"3ec3b755-bc47-4e79-857c-911ef11fcf2b","order":1,"progress_status":"completed","dependent_files":"internal/logic/sys_user/sys_user.go,internal/logic/sys_user/totp.go,internal/service/sys_user.go,internal/controller/sysUser/,internal/controller/sys_user_login/,utility/mfa/mfa.go,utility/token/user_token.go","gmt_create":"2025-10-08T18:19:01.5725085+08:00","gmt_modified":"2025-10-08T18:44:56.9787337+08:00","raw_data":"WikiEncrypted:SmmNTSq96N8aZksVSKE+83PC+cNK/DfBO+OUzl7+L2l2e/CIGqmnuvQf7qkuacMmnoLkipFhcdM+cLbUip31pYXUt+XyL88CjpCGtcV6WgiA3HqAdxPgiOexv3ElMAo/PDxaz+XbGSJxoPBZtHoB6NNUkOCuJ5XBXj0Hr1xrVx8wlNClVHsfL4T+uVK3j2jS0QhXXuyonPfAcspk5vveTDxeOyjeihNnTC1MJFgsMMw3+Jti190Cck3TrSyDb3h6qh/PZb0gRGz6yWJTQ6zKuk4lc9rCqAA7hMx6cwfzrOQeYbg0Wzho8paOlKE98Xb2vm5la+D4bEKvc77rc664fi3jCE4zVr6swviQ3BnlML0N7UWXhrLdZSkj3jGWtYLsbFvpPkOPcpvDF6vrU5F85Bhn5oHjYsy1jzwn2DFnnj+vLu0FYGhT4aQO2iSMJwoYrw1PdPNiIELqGSJVUBci7KJjmxgarnzumXVxGySE/Rs9TWGfzC/tqF0JY9GzD2MoA47uKrT7ly2om4B9eb0Aw9/qA1DR4GTdLMMCVieDKH/H4FXJbUzHK5Vhw7/GR6LEbAgPENPEoDpQwYt1WxhqwfT0pMsf9raNag9Ba6R6Ye/M6cBwFT+ctK55NH70iSAiWcfv/WAVthOatk1Ej3qtlzVdQJbKvK6IGsF80wrW1B1QRbGCnnBQXgKEx/sOF/Xhd92NBToz/uyjvtJpFyiNDR6KFRVPs4z7iRX1FnfdqlkwtNJsr7y2hlIJ2feB69kesP3qPXVR3YxgO8G4jFYVRQ9ij2jjvdEJa7jytAJ36PtgxFxZDW2Tbi/U5ZIpUX/Y7hl9P6o+slKpObwP1amRzF4dabn1EbpDkwg90yU5AoC4112sIEG5+mmJG6l3g/mAfVPRDRzWI0zPScgvH4Ha3wmdXidew2+BuF6gyMXwwl+v3nsOJBkLfqWMKaT7/OaKBmz3QlY0c0QmlG7SOwc1Zz9VRyOhho+85vphYELa/gNUecRlWEO2c8JPDeLyFqsOklUKP1e0RYUjyvfypAJPLyUyQBZVr22zeU+ueeTMHLYPp3auXRYqCD4P7v3fw1UGPsEpQyBPq07IXGwUPfBp2vO6YaYc7k4yzt0417aLPUkrZJbJ/W+EW5T1EaxrNllcpSmgMYd3LwO+rEoUUokYfErQgeCtv7ycv7HbJF1IbFIa+uJvGJanYHRAE6VjAfb0qscRKWPws0eM+3OgiU4nvKX0v+yTCOR9LKbd8VAwBTnqM6EofjNR71Hsy+p4dYbW/fldN+bH9YlMrNnIDk31gXIxHLPCTNRBcl73r/i++9Q=","layer_level":2},{"id":"0fd7eabc-705d-4b45-9497-9b3e2641c0f8","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"角色管理API","description":"api-auth-role","prompt":"创建角色管理API的详细文档,涵盖角色的增删改查操作。详细说明创建角色、更新角色、删除角色和获取角色列表等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括角色权限分配、角色继承配置和角色状态管理。解释角色在RBAC权限控制模型中的核心作用,以及如何通过角色实现细粒度的访问控制。文档应包含错误处理策略、安全考虑和性能优化建议,确保与代码库中的实际实现完全一致。","parent_id":"bac7f19e-b5b4-4f8b-b3df-60a9d5c50b58","order":1,"progress_status":"completed","dependent_files":"api/authority/v1/role.go,internal/controller/authority/authority_v1_role_create.go,internal/controller/authority/authority_v1_role_update.go,internal/controller/authority/authority_v1_role_delete.go,internal/controller/authority/authority_v1_role_list.go","gmt_create":"2025-10-08T18:19:07.530266+08:00","gmt_modified":"2025-10-08T18:44:25.9990436+08:00","raw_data":"WikiEncrypted:7ZB9yjzZwc/JkOb5fG5L6+rRbE7IygCTc7CtI4cT8O+zD59F1CL4IfdomTUY+ERjrw/C1sgRZPKjMd/qJd0JK1XynjC5j+ttuY7rxQ3NcMYL4gDLmIj60E0t7iT9EEmLacTiGIEqbqD75xu2P0W8HqTa+6+qc0rXfaxxNXqRIidThrwEfqDd+8GuJWX3FDwbUQ4E6veSUnxgr2Z4FGGHUaKakZAA8tw1Jhr+KHZKSE6MRz9Ent00d2XRIl+nNuUHSwyIayOE+31pjmtBYrUGvgZRJQ89Qd91L/06KO/Vy5OLU4e+YNvpxr7IohsR038eD8jjw1ThQWu6RaUCbDDuFe31sXtXisnhtQIomlucN6fjfrCF+Mw/k65a3JkM/cN94wotQh4vyUz0nKhjF5z0YVta+xU2veibFLulf1veHajhsfJEu3boSmNsh65tx2mblFbm7aw91yNO6saoexuqpDG/7tNWtDTtC5z4oGGlvkBJ67JDoptTwX+i35PtNzPa1mDBl6ab70c0CfShx3q/vk96XMdYjcP5W7HGJ3P3O6YXDEggum7/XyhGg+xT7SSemnnmsoJxLhzVAZCYOkdstHPdP0Ad6Lv799KPUznczFzSEfmcGikpjBEQGXd28vffmGl8euio5vBybeVmfvYB06JMt+CgXslLBnKUJstgJlJYuNHLyRdvmzmtmhhCtmfsNl+DNJvsGvDt11mFWSc8+kKE4wWZW84sB4J8N6EUg4jSm1AN32SRiQLsW0hLRogJ++RBcT91MH3Be4iTYPn7aJC61taQjeJVzSUCJHezetuWA4juKiMlMcvtdAaucOnpfUn1t6CWhb8uQVPXLkWFGmQ1l1RZwHUrXKka5FW7ZbJeOTllkZZDqsiOoPkQssL7UlrdCzI0EhPD4NDeHvSeYeH1jQ0qHQXufPTq9Mzz5PSfNMLm91nr5raDKA8nufucxAilGRbrc2PDR4zAeIRj+Yp320b8o3mLzkgQU8j1locC21AUeGd240sfyo0QGF3trS3wYEAY3/CmWtFAqU6vQR+15tvVSKbbqc5sb85nTKtHIjMszWB5pIlPCqPWJ+CdOKPbWhAIYxKk5r03JCuskliHuZjtwe7pItkgOOUJciW/oqY7dHknLDZfkJhC7lD1OW2KZ6RVwr0vBNrGExBTVocTT63hR6goEi1xYxhrbhDzzZzWZDTgLOY4RGPmo36vL4QGdRldZQJi2Hr1BdbLepk3eE1FbzM6AYlxss5sIaDPslwaLPuNFVNy/SJkKmEh95cIvJrveeAlEBNcTWtWD9jbxK6tWzeZBd6UgSuRoAlaKwMXCsvtXK3kSzc/zdKoHZYdc1nO13T/yWyV6Z25x7lqc9+3a1n5+kNrSn0pJI91rOTde7eIvfegV872hXtu","layer_level":2},{"id":"0d2e9821-fbd5-4482-89b5-00c6af8b0922","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单日志管理","description":"api-order-log","prompt":"创建订单日志管理API的详细文档,涵盖订单日志的查询和删除功能。详细说明GET /api/v1/order/log/list和DELETE /api/v1/order/log/delete端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括订单日志的数据结构、查询过滤条件、分页机制和删除策略。提供实际使用示例,展示如何通过API获取特定订单的日志记录,以及如何清理过期或无效的日志数据。解释订单日志在系统审计、问题排查和业务分析中的作用,以及与其他订单组件的集成方式。提供性能优化建议,如合理设置查询时间范围和分页大小,避免对数据库造成过大压力。同时说明日志保留策略和安全访问控制机制。","parent_id":"e70da257-5cec-4667-9471-82f4f2d36085","order":1,"progress_status":"completed","dependent_files":"api/order/v1/log.go,internal/controller/order/order_v1_order_log_list.go,internal/controller/order/order_v1_order_log_delete.go","gmt_create":"2025-10-08T18:19:17.9132062+08:00","gmt_modified":"2025-10-08T18:45:08.2066765+08:00","raw_data":"WikiEncrypted:9qHpiFX/XrbQzm4K3sHnDMz1KoRQEV75M4mACux9a19OV4ctaPk31IV5hcbtR/46QuarpgfjVEZ8jQDp8PT83SSZ5sjIba6R38nAWF81guWsZFOr8miHF8AOBbRBKlXQMX9qA9/8xyHTHhcnCOVaxCxPYMfBxEefEJifj/adPFe/8wtcWawGJPTZpd7DNy9QpIaS5iU/ARujr8LnXiTEKGnjlunB578POzKxX4UXdmbcVTNSytHSri9S9J6BggfcrJGkVPKDDcot5vaHhUcEVKq0pEmS4yex98PunfcUWXuwsdZIrKalMB5OrO8GRvSrlWdZxCJj/k++ohzpqHN192cAG1pU/wyNroxArGW5X0gwOQcaElNeGnogN2TFFJGvqyqWBwO19YUgDpesqT6gDuJ2pkgvqS8RZUblyJHq//vtWwPAcIm2Q+qLtyLn+M5/z92+wkU6qRgQ4H6/MR6/g+HKKHZUJKPqQEakWetb/LtskzLRkc4dae4st9/vZaLVBveBisOMNeAuIHLFbYQ6G/Jc3pzpCF3yr/Mn4q5lkmvBfZBPKPml75e3dh6NHfTHwrkoGAtQjvOyOr7RGjYWKFIsEz/ydqbgqDLy3CTZKlINfdDmK7gSLJnutOGLiTitJkIm6m67+97hgwaAXgS1odKB9OjQrBlW9LiZmw5fPcoQ+X9vPR+6qIe1Z5b6qofLe8VEizZR00qjZvjE+nT8osWYNzgb45vnED0BpC5WU5ESzSu0HgxuY710ywYZX3dRsrFkqlqGE0DzjhtFUOi81RUh0QfjmhjL5RRxKpJgRZXsiz4uW2DFhaADL3xSvrwM9I+nKE5ZBauh0UZGpEVcaUHVwnC2QzngOgpZxgv6I3Er2QYJ/N6h6c588dN80jkaCKN7GvS7AV6KGOL6YVQkH7R64CExcOYPStomFg0iVEguaJRqdlzupGlaZMx4JsIVGHWPZLSV1n67sEpUPpQeFllrZ7xBHS9dOud5Vg+odh3kErONG+sVTRKqpnn00/QiCP3yqa/7mckxadgTpgRwbKQgTG6T1csQcJ/smy055YozHVVOgCC9OOF4HHhXmYkBTqkjcXHpOFolJYc4FZaiZ4NVOItx1/wIEpSRQCreHriDMIVS4GgDLr+dQ4sHsXDzD6vT2SfE6xV+fvIygSbbl4Cw78zQTiMbMn6E/DtK+pd5fFvXf2JZBwoGxwWk0G2y5XO1DiSsOEb6SdJ6V6zQBh9xha5QfaqVBLpZcVeYeCupe5REbYW2O/DLiIzSaClUEnwjK6hc04LtFKm7g7WWoxibweIrzo6w9+VGUN6G4aRNZYrzv6Q8gb/IFwPz6xIj9mvW7LKQxi52eWK6u6oKbMjIT7Nn9rdvvVLVE7zOwVmJIgen6MBiY4tMXm7aBgHg4n/BGWlcru47by8GF5bs8U3+SN1wApsyDWRGW+SiIx0ErkWSaWIbSbkEF5CdMZBVn8PM6nnjsfglN9Y1ObDoHU8MUzJ6zi83cnmLi4qyQk0=","layer_level":2},{"id":"cf4d1833-47d3-41dd-a87c-e005c6bb3246","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密管理API","description":"api-card-info-jd","prompt":"创建京东卡密管理API的详细文档,涵盖账户管理、充值处理、订单回调等接口。详细说明账户创建、Cookie管理、充值提交、订单历史查询等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括批量添加京东账户Cookie、充值订单提交、订单状态同步等场景。解释京东卡密特有的账户Cookie验证机制和风控策略,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注京东平台的反爬虫机制和请求频率限制。","parent_id":"667164c7-51a3-42fd-968f-e3d167096e33","order":1,"progress_status":"completed","dependent_files":"api/card_info_jd/v1/account.go,api/card_info_jd/v1/order.go,api/card_info_jd/v1/order_summary.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_create.go,internal/controller/card_info_jd/card_info_jd_v1_submit.go,internal/controller/card_info_jd/card_info_jd_v1_order_callback.go,internal/logic/card_redeem_account/query.go,internal/logic/card_redeem_order/order.go","gmt_create":"2025-10-08T18:19:17.9656376+08:00","gmt_modified":"2025-10-08T18:46:02.204189+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBkzZCXcBOHF+FU6wKtFwu90n8FV1byN/6qXgm2Qb9b2hMmA3oufYwccgA02hX880Lv8YtqGVaSdnY3kqkQ7D0lncxopWCP3yTvZllrVraULiC4X6Vv8n39VgoeEkDashdygPT6mPEo5kbP1lV6d2ucc1hVv67KUZugwcSrLRK3B+PQZ9VYvsJpwDZewlCbQsFhobt+eW2yuWVd9RIvYzVbBXpTSEjNXMu9gG317OVvQXaCp/EaNkim3txSiiIMVcr0VYiLlzUjMUknrCRbZ88LPCSkCYdN6vwgd3KU24W2zVIqRm1UTgj7l/GazbLHOElYIL5QLNFJNT2qq5ALN+bUE6Uw/ZCDwDrMjGTpP0xh1/oOtQazPknXxqng7eafCWnLouo5JTYZ7avPjEfhgi2mV08rJ5YK1TA2ecTkN7jIHJzWIyqgGzFQn9dHh2Y4KdBA8s2dr+2yPtYLOYj9XJ3BDwXZNT0J3C5TxL3t9gpTeUbsvyEjDP66j2zMZF3ctVz9a/GTgzXkUST0XMuf9Qj60lGAkNIAbJ16+z26hjV30EBAMnp9iKOlOYpGo2lFApxDLfIXOvdLqn+TL0u8epsrExG+wEAKpmyy3NggvYd3yOEzgYVrgTzOt1TliP2s/rG3mev56dhYLbkGcKybuAbATwu/htr0Wazr2gtRyG3qCC4L/yGEZ4OfdjSvvhYSQBD2m7fDhr1u7X6F+Io5BL7mzGmeGAvzCJL8UViQsa2WSRw7F56Kc0e1BZUt5hTruQ/Hr2pnrC/EpdP8IaXYmNETmxupt+44gv+9uuEjWj4Z3zC7WojZzHuVRTDwhzwiXoP7usTBkpZRwM4WtMXqI7xNaKv+AAFqU51fdVhaDayzzd+EjSAqEInjs7ukZ3qjGIU9JLDhA3Nv32zLOwJ6hPeKt1zZVroaKbf22NEDrG/NCgj8ftLm7F3UtvWBKCRNWycvwuI7ZvZq1KfiMOlcPSBlrHN93XJhL0Z/dulb2rdFPIBkOOuAxEcOKG3SOT5LPOArj23wKaeyHtuRXlW5grO8PLN8BR0qmIhing4Tl/YCQezgOz1+8WPzV9z8xKj5DdxYMJ/cSETmgVlrAuIFZkUPHWIAm0ody17ZyQewLxidzeRYufOa1jceRU3DrqMAl6xseIt/b6jHCbWbnUCE+kE15BfJywZa/yA/O68dVryDjd+LUeRl61IvA1TpataICWFyQUspx5gb1xIUfmIg5dUYONhtRCfIMWSDNREDCnDYbmZlGSa9CLT6l7Nf9N2LBRODpTvQYxRppD+P1cfgFQKilRQeN2OXASBs13pYImwDrUF7EVP0TaMqO/qXSJ/+Fflv44kjXjtIMI4Q61JH1tI6a5apoZsoR9dV6oO+QHulXm2rWGzupXfAHDkur6Sxap6VECVqOGv0qGDMqzBKpek8aX5CfQTleRHuByIeSf4HgYucRpzMQyIejcQ70yUT6kNCl5YQM3h4l/ePO6VfOzj7wkiREzWtfOJv99rfjLWA68t9qfkHgfNZlBrPNLwlhZSgoZQbcY3SSofJKOEJjMMDWAmz6K5bV0NxYGXCluIAXfJgeyd2RfUvzGKiIJ3W8+R6EZp7zU/HzgtioQlbbH7GaZiYeCToNIhY9F/zZt9X+KA5i8+WJ1P7VFX5/zUp/oKA==","layer_level":2},{"id":"a9218ecb-5b88-4361-ac86-1111c07f10ff","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"商户部署管理","description":"api-merchant-deploy","prompt":"创建商户部署管理API的详细文档。详细说明商户部署信息的管理接口,包括HTTP方法、URL路径、请求参数和响应格式。文档应涵盖商户部署的创建(merchant_v1_merchant_deploy_add)、查询列表(merchant_v1_merchant_deploy_list)、更新(merchant_v1_merchant_deploy_update)、删除(merchant_v1_merchant_deploy_delete)和详情获取(merchant_v1_merchant_deploy_get_detail)等端点。提供实际使用示例,展示如何通过API进行商户部署操作。解释部署数据的结构和字段含义,包括部署环境、服务器配置、API密钥等关键信息。说明部署信息与商户配置的关系和继承机制。包含权限验证和安全考虑,确保部署信息的安全性。提供错误处理策略,如部署冲突、参数验证失败等情况的响应码和错误信息。","parent_id":"a2cf591c-c32b-481d-b282-9aa974785e4f","order":1,"progress_status":"completed","dependent_files":"api/merchant/v1/deploy.go,internal/controller/merchant/merchant_v1_merchant_deploy_add.go,internal/controller/merchant/merchant_v1_merchant_deploy_list.go,internal/controller/merchant/merchant_v1_merchant_deploy_update.go,internal/controller/merchant/merchant_v1_merchant_deploy_delete.go,internal/controller/merchant/merchant_v1_merchant_deploy_get_detail.go","gmt_create":"2025-10-08T18:19:28.3374951+08:00","gmt_modified":"2025-10-08T18:45:48.958285+08:00","raw_data":"WikiEncrypted:BG3lFnKLVTvBR2vGYwCPyS1oEBfi2AVR56kbRNYu7vwIO+DHFV69S00Cn9VWMkMaxe1C9oIY3Fq7/E2iPGjEOWLuHnpH/Y3i5x5MeS7pdEua/Xmsn3jSgq97JVn4WmFs+i0qFORtaoDVDhsfdANByM3haKpjsykMQbzBjz/AGlh6GFpbuJFVgb8PakAlvFVMMrnfLDVe781PBTGKjZX5cNj9NyCDvYFqpvf8dGl4Eyrme4koWNiLXCaFHzJmzQuJaMryaqUP1GZCqe2hNocsirvz7vpOLLy+C9/tvNacelJ/PPvVaySV5PvfufSSnWflVxy5lYoOguix9DOaCQlCspj6knTDHJTUKkzXNRgu7kE1uNo6hA9C6bZupPxWXqh/WtXoHtoxH4lr1oCT6O1y11QsWsnJ/7fzFR22ixnyeOY94dUztPBFYF23vFw9NWRAwnFGJuWWnffxzjtNaTxcWu4fMwxrdMtddeVJ8I9rYgQbtNCk1A+gl3qSS23N6M/oLZiOJSBLXHEHJ9KOpPi+THSSBjm3vNiDNAe9nQlzY6w3qgi45586Wm+s+OjJ3pKiIFWCPVdYlBDfEp5x+E/rli6xtXrg4H05DlZMMfEaet6Ylh4xcKYzFHXSSAzgP9P02lfxauvCKRSBlKk4ghhEWe4SgnFDc6/Dp2zVdc9zaBhRrMGPgp+kWS6D58e1Ho7BRAgNQ0eI0FuequP7NvUPxXrgef/k+yf6YYV+MtQEEKlG7kSkoNEIUp5jadkG/OEgfpTLT2vPPK3mZcWPYKJAM/tZhzpBWgKL3JUIh6eLEEEwDVb2X3Lu9IJD6gB8HA+C7gsVW16AJTsjjtLAGVCdQsj+lud1Ppg6g9GJNJeEJx4Djdj9cZCnOwNRprRhXy2CkduLwhjTK2oVU93+XcLTH3CLz5Cx5g7umi3cPadEB26x5+F3G4GLhdSHHOb1dxTlI2kNwc2oN4RhCfwXGOKRmSfVZA4YOihgvwUUGUisWTnap3HiweNrJabbS7EzoQqEjyO5q0EY8sXN7oG7lYZRDCffvkLPe1jWWQwRo5vDjsyCZs/Gb1gywv6M17Xlul4LewLk75OyGzh0M70SjvLzJ9Bx8Bv+utnKT3til4k1br3jXch2Gl8wdB4E38Yv4LKW4EEwZg+auRxbDKbek+aYei9UeiNxUguTyXaPvxlI+7MymT0VYf+P4vYS+45qewtlJdmrtZD3AOXpP4+2V08cdJcxFmOKlziCHqhAb7T4aFEDQu660P/1JR/xCSJYtVcF0fvaH/6zEkzwyPXOblsyboTRnmJ44qqpi71Ue+pLszEoBqH9B9Dz6fiGUmw9fAdArnsa1QMK5I5MAWXHf5TuDl8voTH5BBMNyAu3eCFAENlyxqclkhsa4lEY+daBdYn7d69JRiTN0s2pWKfMdsPHLdFOExvi3DX1n5rTvVOPkFR96ULg+Lz1rMcllNEp96RSOFYsApdCMxSWLI6/weKsE0F7HptwTC/A7Ed9uHtl89JAtxmnNoZ8v7RHeYm3Rgl9CpJa2kIcJ0dHDr54cFdZ8lj8Y0xml3QqRWSiZKESxpGH6/DyTiF89SVYFBhsoE+FOZ5jYAkSiFN+pSTT6uGXK1S24qnF404TeJi0oC7QLG2ignQ3a5/X82JqNoMGgU54GCvm4t/sA/0V+fIE7M48InVffczgysFmxej41P4GJtHiVCv8o7to1G2czXP/xj9B/lvRjKdUE1RF66lcEEl5vjwYnqSqHOm0DxpIoTQO0grYuW+/ZpJ8ZslSJByyvB0HGEhgnknkqZBCCCOjWtt9DaJZy29EaruPeoedC2oeZ7ZfD4mKAqt5zjpU3ylWJtYNR7zOpAp3sADXBD4anBD96Hhfij33UuDUH7Kvsnwy1HMhpsflXZIrIB6auN13Ly+jtDu+vizRqlv7BxQVojuYeA==","layer_level":2},{"id":"cfe83884-986b-47f6-9b55-a77ac17a23ac","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"资金流水","description":"api-fund-wallet-log","prompt":"创建资金流水API的详细文档,涵盖资金流水记录的创建、查询、更新和删除等操作。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括流水记录的类型、金额、时间戳和关联交易等字段,提供实际使用示例、错误处理策略和安全考虑。解释资金流水的实现细节,包括流水号生成规则、对账机制和数据一致性保障。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"8204e495-d056-4c0d-aff8-fa8cd1e804af","order":1,"progress_status":"completed","dependent_files":"api/fund/v1/wallet_log.go,internal/controller/fund/fund_v1_menu_log_create.go,internal/controller/fund/fund_v1_menu_log_update.go,internal/controller/fund/fund_v1_menu_log_list.go,internal/controller/fund/fund_v1_menu_log_delete.go","gmt_create":"2025-10-08T18:19:28.857469+08:00","gmt_modified":"2025-10-08T18:46:06.2313621+08:00","raw_data":"WikiEncrypted:gLdwQ0KTVfy2nZNoG+5bdVeNIsI7Rn4dw5X6ZL0mhD1BBBIaJJZW2YjOW+ugimYSG9xA3ZUS6OH8+spiwyeUa2dff3Wg3ZoM3OcF6w1SfIUfWmDL1hLvqFGU/n3l0n5WI5Vsx37b9ZMGqW8T5L9fgTo78EUg4QNL4PRhdW9rf+S2C647GMaU++K2tAlKnr/6Uj8FHsdx17K4KU9iZcNTz44B5lqAjKpw7804zOfD3xTGwiANwhF6eXUn8DHvxHXqTiIdqQiZMNtFg+QWjwQXDukWbfTj3YdRw8vUeR5450/GxUZ82p/6u7YWmBZhukwnZ1quMwModlIJ/tZwDc0eWXVm2y7Y8RVn4g3f1MCJLpLKeqhO64H9s6zBz+t/TDaiD4OwJBnW3MTJoaxbkrllk3myZFBshVPORjS8llqHemg2nyaw4Fs1B03mpXDA+s9ZHfGqOSbgWCCVQ6c1xoBTxx+hBUIpLWOannuTOjWs9AZI8eeEMMDH+39eDKYBx6DlFXmXE2Pw6i+VtroNV0EeEmjWQzH2n9LYui/MFZHAyVmGkzpNGwK6N3hjcoRrxZ0CfyyEPsXWMouwJnXgWwo9ZKQRR8aOabqnkrqm5uF/hWiQL+OVK792xeEZQJf3nwr2C9leCdvZteDTfVdNgWw3Ni5+5tQbURM66mYvX67DWI1CI1vcoJkGfd1cE/9li3sd/+Z5Bt0zfotW5Lg7X6U6ADHq8Hw30xt70n9+AQw68Un2azk4p6Xre1GeFNpawuqltGB3v9Cmh0Yx3oBXD2epYLpBIGf1hZ+m2H/mA8ygEtI/HrRLV+thguWDEsnMsdbtn9OH+lQK3fDH3Vq0aPSwMNdzzZGe/dArFtwDUGUXy2lhRW2H/kKo2XqQtKhzFaY9/XWJ0FqLCmVGqLld6vwXqPqyeaCJ1FtoMbmSKZh8uAw6dbiMayiI12Cv3A5QDeM1gpOFHtm7OxfDoGHqt99yz0TLs8lAh/ci5nkyAr3ZIwE5tFw8tM9usoBFqYcMSW++ta2agBL+dAPLww+z78U9sUVZ8RES+DpgCfm+jImJrxnVYeZJYYD8HNDxEwkpfdPjkKX6uGq47cbaCVZAZnMHx80FIkFVRhojXSWAureFgdRzvaPYvLk3CCMTeKsqITOZoSvwYyTUMr1h/EEo9TrPkgsSgyZwRPGG6142LhfusshjuKyjHNt65vK0eiZL225idaiePPwRd3TxoOzM1B226MG/KvMMGS5I7JKYSG1h/5lwvScTo/FJNCNgo1p3dprug2xLb0NQP2rd06Z+ZNo34iwpVIY0CbQ1mnprmUmlr5zEQVwLzcyMBrcd/Uv6c1VCIq5uKMbypvwrgVS/4BzBMvej7bQW0RELbmm9g/mckKI=","layer_level":2},{"id":"e0f50ea3-201c-4da2-8be9-4b3c9b715e95","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"地域限制API","description":"api-restriction-region","prompt":"开发地域限制API的详细文档,重点介绍省份查询和地域控制功能。详细说明restriction_v1_query_all_province端点的实现细节,包括HTTP方法、请求响应模式和数据格式。解释如何通过省份信息实施地域限制策略,提供获取所有支持省份列表的使用示例。文档应包含地域数据模型、查询性能优化(如缓存机制)、与IP地理位置服务的集成方式。说明该功能在订单拦截和访问控制中的应用场景,提供实际代码片段和错误处理指南。","parent_id":"1213eaa6-98ce-4b50-b9ac-280f7bcd9725","order":1,"progress_status":"completed","dependent_files":"api/restriction/v1/province.go,internal/controller/restriction/restriction_v1_query_all_province.go","gmt_create":"2025-10-08T18:19:31.4224976+08:00","gmt_modified":"2025-10-08T18:46:54.7631488+08:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg6REtxJOhfHapmWv4MsZLlMnVHv8m19RbsDccvca7VOfBHC1jyhvaYbgCJtCr8OFnOXgJd1hgEp8tXWWmNRgzcoiWSPnrtMLbKSNeE/EO5Hsi07kCCTP+q+z0DCEdHjRUoEfVRDUia29axnKySIKf2jdx5h0sg7eXKNqleoXzcRdslyd/E/l2ATKUKwlpRc3Mwi90+KzXlHyVhbun/g5+WDzzDn6j5xICgb772TnbCLFVhJMVG2NK3Nv2T3ld3ONvk+2Ki1GULEIOE3KleevYffTucrxKqfligT01pptyaUOwccqtGqgaKJie1hSM3JrpMnEr3ufNGb1Vir8ePLosnWkuMuMR0xaqbsT/bzFDYdOYfJz3a9gj1sA2NxYBZ32S0oZd7bf+F2DQHMNDuA5PfzcU4NxOra2bK+8uwUe8tFgti0TD4d5IWd4TrYIPH4wqekOJ/ESKj/5Finl8ay2xrjc4gUULV0VUS8o7PSdiGExRCtKTd37sEuYVHxnnrTi4dQefnTa+FmgvBhIJol+i9Eb/iDVchVtSSnNRWzW2KTj2srCgsLRIrvIUAcfJpcoskQgnMYu+IhYpAsbuOqIDdKOxbknqImvsmKUmnYtPpV8l8LJJnIOOxp9/Oa4lMfcOEqGHs+nF1KvuSqVrQ+zJ7+mXSJP9jy99PvTiCoGiWW9QYDBE1mMtKVyoY8IMm0TSHj5lk4XukB1iM5zLUz9K7XWTaWUB3OMrLTT1CT04K4fCvQg4Y/iLv2a5SN2kRlU6rA/2rj4hHujJmkPlAYCEoxfnsRXJAf7nUsPF7a9XQHUOi7NFmYPsdFOelJ+hHjcijXHZf2qT3qY44S/GCGk1pajnWu1k9LhqNO72a8587Qa80ZJzHUjg9HgB9x4tFQB+vJSxQIfNijHYhck7Xb4FuXKyJ1b3kr1N/S2l48Ui35vosb/1OTj6mZKVU2bhIITGIqx9jaEc4TdC0wxzDvx/AM0OLwUtlm6KP45PX+foZ8/9a3tNHVZxOkd5pkXnH/FiGwswP5hgRtHn8BaH1dRA/u/89v9nnK3OF3AasvZbVWVjqoumStKJ4DTye55BGI08akuwQfxtbMSMawQDWLBhxI6UaOa4OdZEUiyTB9X9ieCD/+dcSIkCI3TRMs50o/vBqut5haFnGkCKvHN2pL9Jas=","layer_level":2},{"id":"e198e011-e613-4a72-8920-6d411d5a8a55","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Docker Compose编排","description":"docker_compose","prompt":"创建kami_backend的Docker Compose编排文档。深入分析docker-compose.yml文件中的服务定义,包括kami_backend主服务、MySQL数据库、Redis缓存等组件的配置。详细说明服务间的依赖关系、网络配置、卷挂载、环境变量注入等。对比docker-compose.yml和docker-compose-local.yaml的差异及其适用场景。解释install.sh和install-test.sh脚本如何自动化部署流程。提供多环境部署策略,包括开发、测试和生产环境的配置管理。","parent_id":"4ca438ce-5592-45a7-bcdd-830f65e0048d","order":1,"progress_status":"completed","dependent_files":"manifest/docker/docker-compose.yml,manifest/docker/docker-compose-local.yaml,manifest/docker/install.sh,manifest/docker/install-test.sh","gmt_create":"2025-10-08T18:19:36.0529456+08:00","gmt_modified":"2025-10-08T18:46:51.7654637+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kJ8Pt9hFXqPwDEYqTB7J4Z1DpkLMhPMThA20z3p55TN/dbOQvkYqmvPeeZcdT9k8AGiciG93m8eaAYTkXuIB/l4DAim0NYlZ6X87KxK+sMjwpnxmr6pP7RLOBo6UxRplPh70Fbp+ZCyPNE79wMWIsvkF1xqcQIlTyyFRlpmj3TkENxirLFnxTb7D0dGKaC+L4w/Qv2xsaUjLvDxtuk8oqZ71V4Qwcrv2vF2g+FcC4W1y03/EsII4j8QwbYtAmcJgT2klbExZya7oBnsaCapLj7rXm/66r/or1p/c3CBpnRExtlMeW9HJ1N6rJuH9KXgMMUPadAST4plZVIbYOxu2ntmvBhxzre/Cn6cwL8J7x2GZmTOKdvWnemjYF0cHDSy9S/UVwjisOK0dC8TsMQBsg1Vtd4huntjKgTfo8Rv+pyZU5xELyZirMaIL8nw/QLCJyjR2j1DHcq5RpSOpG/2SrKNVU4RFxwv1KbUpPSWZihT5z0JZ+h+R85XbIQ6c8cPrIUNiF9rPJ+LbMgD+GEZf44CSdKVymvGJyLv2aFAnapp6ZnuUPIUw9wmFW0sE//ZPhfGimLyQPXiLLLOx4si9S202RsCHAlNGZXnIkFWQYwlm6Myenb17d4x5DQNtAvL1w3YQA17Z51sicIC8UdcvGSzJL9x4Wm9crIB1WFa9yTbcliqBVqUibPD6sPRZvWYkKlSOM/WeGeZLCOgRBK0ziTl0YSjPlcgHTvyxJQYl3lltxnZ7EpjHVOOYQho6g3Own6kONLcRabI4vN4a1lnuMRb/0jGXo+sbRIR89a480+XJolbxc5+Lt8YJcqkViLNTL2HfcKyaK0u2McIyj9T7cRlNpLFJzIoPLrn/gmzG857hSVZndqZ2S0pOvCsnGjC8KoAz3JYfKGpsSwwjgpcVVda/5cB6X09jBp5PpHGtkWv0M73vV4dhGu/AVMIFcm0oy5iBQ1IoYpYILbmr3eZ3nsK6y/gaOEoYfmQ9guCiGEv1k5mwCsDL2N4GMd4NrphuAZFqa+u2iMGiNkSIGUHaTP7hfEWmFPz3Uypup4T8PtEB2Z1DM4PZMvWRSjab4e97uHlJND2QvS9B7Z5aB7HePoY3Sbz3pqd0MzMYYmBSsP5bdKIr9pzDIm+bo7eHcApmAq2dqSRHg4wr872D6+dpqYmQh2bdUNxT2jnhNJJWdENk","layer_level":2},{"id":"94f0ca67-84eb-4321-905e-b222f1aa705c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Shell脚本自动化","description":"shell_scripts","prompt":"创建kami_backend的Shell脚本自动化文档。深入分析install-one.sh和install-simple.sh等自动化安装脚本的工作流程、参数配置和执行逻辑,说明它们在不同部署场景下的使用方法。详细解释wait-for-it.sh脚本在服务依赖等待中的作用机制和实现原理。提供这些脚本的调用示例和常见问题解决方案。包含基于这些Shell脚本的CI/CD集成方案和自定义自动化脚本的开发指南。","parent_id":"9e74acd3-671e-4b63-b045-115b89d5bf61","order":1,"progress_status":"completed","dependent_files":"manifest/docker/install-one.sh,manifest/docker/install-simple.sh,manifest/docker/wait-for-it.sh","gmt_create":"2025-10-08T18:19:37.8872597+08:00","gmt_modified":"2025-10-08T18:47:04.4093212+08:00","raw_data":"WikiEncrypted:mglmhPyPH3dtFcYRgfroE6r5iIRURsCQLCsCRil02AKAdkWTWXqM5uSIN+acuboTL9lryyEx+kLcd9u/TwuNVTMqaBnEh6CfwrIc77h929CPwdDlT2sE/wWdeWpMkgXVKaGFpTqZtXX//6qhmPDLsHmlnX9gniSevlGs1btfNRHUTRd+FXSh6upD4A4csE8U/XkCo3Vs/o6jjV9gl8fR5IzGI3jONT+pZtXQhSnyg1Oab5dEMJjss9NoZibHZACN4VrCM0o8EioaFPpzibdymj9B9Z4jlW47U0vFFP4b7Vd55YM1jGCF+DjKkIgFPn7i2Wu6L8zPQZjttr7x1ncnG88x1Y5QCVTaxwGUuk8stW7GZiXJVYo+3WALOzz3WwkLISr1DpR+fT7u+Ye9hR+6FquP/p6wgT2qAflGBJ3Ut+PZHUEbE4ejlChLvL20NViWPFY7lixxQjEPrGuJn6VU+TTuPh+4qcPotgMftVXQZCJ25EEOWx8E/5d3cb0RuzmdUSEfr12aqkhv9KwzReY0oDrby6MzpC6MyNkvbtMLY1DJv7M1iFOSJ/IRNleuU1KKBjccItC0xjEDBJXdTlrE4osyiamLCi9WBsTh6T/WYuVYMuE/heHPbq9PAlBPRHl+pjbFVlwO3iBtlQw1ovk6Ef1fSWk5O1L2BYaVN+0wEpslestMrEgxlb0JOZUrvBn+zKzLTJnjx7XCG2frKaDh3VlUYRXX1bQcZu1S+COiIMh0pDFRxlWgWmlz1d40lr3dWgvByBwPY8gWT0rsFXDnoUYzV0F57eXG+G1KrUoZLmST5KDcfjMaK+jQMYlC3oZr6uKfPFT2B8h8IL/ejXjQ2Cvrr0ffSZ4UN4DejfMIcDU8aug7wV9pWi6xgTu25yq8ZXxSNVvsVT+Qn8deffoWvHEcd3XYRAsDP3ck1Qs24QbqvEjBs/kPn3+3kaHIdN5RFq6IosXbzGgFJEdyo2U3tPBYl4il9k5Atd8cfmJlcuVzx37L8EsGAb+8bkHQI2Ck6/3JlyBdaJ6ow7Z4+jS0fgN1dUioC0dfA5Emceck1YIEimTsDBiBjnOFi/1hUmuzn+zRW5ch87jRmVhrp5+TAVS5eN5cLsH77X3Ka9w0IIg=","layer_level":2},{"id":"81cf8346-7e27-48d4-ac7d-cb32a05da591","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫平台集成","description":"tmall-integration","prompt":"创建天猫平台集成的详细文档。重点说明kami_backend如何通过tmall包集成天猫API,包括天猫游戏卡密充值、账户授权、订单处理等功能的实现机制。详细解释天猫客户端的OAuth认证流程、TOP API调用模式、消息队列处理和错误恢复机制。提供具体的代码示例,展示如何调用天猫的账户授权、订单创建、状态同步等核心功能。文档应包含天猫API的配置参数说明(如AppKey、AppSecret)、请求/响应数据结构、状态码含义和性能优化建议。解释集成过程中的技术决策,如为何采用TOP SDK、消息确认机制和数据同步策略。提供常见集成问题的故障排除指南,如OAuth令牌过期、消息重复消费、订单状态不一致等解决方案。","parent_id":"246ad670-c405-4630-be1d-c8b8f141bd4d","order":1,"progress_status":"completed","dependent_files":"utility/integration/tmall/api/api.go,utility/integration/tmall/api/oauth.go,utility/integration/tmall/api/trade.go,utility/integration/tmall/models/models.go,utility/integration/tmall/topsdk/,internal/logic/card_t_mall_order/order.go","gmt_create":"2025-10-08T18:19:44.4705066+08:00","gmt_modified":"2025-10-08T18:47:59.2039669+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwRUKDbNdP/de0lI/DTackQjt1dXPuSXceIWbMl+vvXLEu1sxXD8WKbhjK3n2/UhdphhaFjQmpEob6TVfcLAEh+k9/ktbVlygCt2t+GwBc3MuUV855x485AalJt0qEkSZAh/ijrFM6JjhTyO0u4jE+gxHIW7BJBRu191WyfTaM9rLj5jdJ7/ATwDjEj6YrggjBlpGVa5HdOID6Z1Ow5f2HWriYkRwBzOiz57SPk+bEWzk+1jtGGbDJrDlsCw5t6dwgu5iC8Gz9fwV6nIkfT3SV2xKmn13dOZmhkh8Psq0dNVRhzi/vb8v8kGuSt/TqcDAZBZIlD4TLJXaHZlqhBSiXZjGYYJogonk1XJtIauXfyDvnZnIcxzFyB153pduPjANIcZwLhf6W3mLm3WZS0gAAZJHcb7mup8Fv6zDUsbTSeQ4pCUCZHBGavulqwK2QgCjJ+UYZDCc4p11qGL0mEqSNYweHwY1gGnEFok0Qywzmq1lSev4814qgIHEdXbjAVq+JlhrprmItEfKQfD0aGhTQv7cfy2f1ku5zPMxcEiqiLS6OR7xgf/wovpJUdLovk4/7GrhnmBOEeJGY0dtPbzoVpDfYoOf0RB6duGZnvknwhR0U96f/uwJJKuqiEGK5hKQd3Qd6fndnXpthkMVClEMw1kd9qvEXCBi3WPETboeXxwXtyPIBySwEi2nWLytULmaHZjY4RKScOjiJH2f/yQDql5d3MmvsLLPZzPvbmjZndmImsFm0PYq+d+3K/sD7Qgl8DHRFd/3Owo7lNJiafzF2oDS8ElVpFYdoLt1Zr1kyaWfkhPuRdO8P/sjJYqdzyenB7V3HTsPrDrpQjIgKbJGCLuXY+7ppltFI5d2BOuQWOVE12zqBmQ7fAIDohuUaE/RemA3/AXDLrUgIK6jv+3ELcuWdFXIcGsA/7EB2qstDoXlUmfQ9/Vohf+ICPfSI/BJN7MNWamVbZwU0E6xd/Ps4TbJlzhokLaNQM4AcLDTF2DJKHscozedlDZvq39T9mOuUl1IQeYrzUpeU/iPW8QrLS/TRmZlyGyD75c4Iz6RB+xp6FY7X2dkToZ9AJWN6uxeOE/aI8dVJYduVmGVqWEQoUUKFMutIP7XgbRYUwBVzVlGrA2qVeh7N+rENqCzTGfjWCSi8MbxKgu4hK3EkiUvvfD06vBI/pZD4a7UeqBsOeXCnAAWpRMJbpGTtlh3WaKk9jp9BEALl4YwtAj3zajfthxfInITjYSfE4p0ZiOsCUAAAagfxaXxcm3wO1jMojEgsLiuZd45YY2dmgLKUSG6cWZvhW/V1Cii/QAokiEduwUHAUbMsla4gK6ntp1viTaha4xkOqXEEP4B+pe2bf0+/GtXc1VHTLHlzzzZVHYIzr+kmk0MawuPIOzVl/pA5HTmzGU3pdyR0/2Ir5sVu1943OaEWhoe8TB9yU+6lSqzUZK+dze1nglXy5q32yYQwNHC6fvgpf7fFnqKsKJeYFPW+B2NFEtOb8Rejh6j+frPjuf9EEumVtZfe0A3TuSDPqRml2PdhEezeDG/CAaUi9X+5va5FHf8AJ6QdJEy2shfCgFd3q+GvdBXHQNxnGzYtjgXYihGtQpDtkVVjBhA+JOsbmlUqCXcYYjFB/ZRC32YxQznIDa2B+ToI+QNUWt7ojUx2xVUsbyJF64FY3noOwm6c615SQUmCpLXI7IPjea8mJ5+/","layer_level":2},{"id":"5fe27666-091a-4cb4-b6dc-c3679de8b4c3","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密充值处理","description":"apple-recharge-processing","prompt":"创建Apple卡密充值处理的详细文档。深入阐述Apple卡密充值的完整流程,包括充值订单提交、iTunes回调处理、充值状态同步、重复卡密检测与处理等核心功能。详细说明充值订单的状态机管理、异步处理机制和错误重试策略。解释充值处理与支付系统、风控系统的集成模式。提供具体的代码示例,展示关键业务方法如充值提交、回调处理的实现细节。记录充值处理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"1a62d745-3b65-4062-8a9e-207c4435c8de","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_apple_order/order.go,internal/logic/card_apple_order/callback.go,internal/service/card_apple_order.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_itunes_callback.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_order_reset_status.go","gmt_create":"2025-10-08T18:19:46.5522489+08:00","gmt_modified":"2025-10-08T18:57:37.3403909+08:00","raw_data":"WikiEncrypted:ngLqLViTt5zzUmJHZ62DoJjLFzanDnCUEKH88S7Dvv1X32wPzyDcbjDs6v94J5yROMxgiwKYF1A8NRbu9hnKYFd9aVfkxEfnFwMuDDLlEty7cKSzzMoRz1UzygV8UVvWVW2+IKCBpUW7rWmlmShhwmfprYHt8x6A1O5e7zUArn56dPNYVFegZk+uMVhOmNE6BCX3GjnAD9Bdepxi38Zg3amPwrd5qz9YlDIlZ+JLZjO0DCGiPzkc53UOe749lpTDYnXcbOmjL/B4/19XJNglt7bPpof8OPyqPkjobNzOhVi2DH16GYb9jeyTvBGEquy4zdw1Id+hEx+E8ZKvMAnN0cmKRO+cUF5qqHTRAEJIP1CcyWTMt/p93p+2Z2WXCqJWCUyaWa7PvttrVrMvWWCDoB1TabwTslRtLBBomgUHCdUeoBVZuFyKiWf1v/Eyo/p3w9gyaFDOLXfhy4lcaDGHGmxGyRTBhPaVm3ne10bHji0kVz5VDCYXDzb09tusRHuZXnTPg7o2nintITuqnqCz3cO0rAgo6Qng7F3AfhU9+GjrZpOCnNDjGe6WDeuSmdA0MBs9DLVhcOnKE9HkZHUG+la5VO163Yxbyt0llDofyW61fc6yZYNjKD/ruQxr8aNAEQxs5jnuv+i68P1yLp3rfh8GH/XXcS0nWxrGkP3hafjBNFfATe9UeaR/kJSxcJj3r5ASmUf8Ishf1O9F708uiYh0RV6FJUfkaOXdC7JiOFUOOO2ctzJV3KX8nE9n4Erjg7bCtQ60hX/iR+4Jx9hjtHyKTvXuRpAlMGqXny+q3j0Le1LqcvYuwAykSDOuEPzb7Bpj2mX2aOV/q3GAsA4tHvb67PvBeG/F0wEOR+m9z9RU1F6PLCaj8kPBT54MInl5DxB3WnsfQttQzNmPkccznjfBnus+yYiA9ppvEtkmT/Nq+MVcc3i+yI0jACs+KZwrxp2SaLes/0xJClCjIDBcjMXu9/mJUAiOJg09jQOXzWWeURrtqckus6fMlxecMnp7D71Rli9ELDvDzDeIyE3foA+tlSKW44UdTG0vanco5guTAvX/wwp73jmg2Ypvun0l4wGhpR0+Hbs+J2uVFzwC/CPuiaeygsukFtbXtPs8FCdPKeq8GvyUOEJJzB2dShtjkwHKfNUPbyNd7UzTmsIkvssK19oGYsUMFqrlE1kHe2mzUtSnS2dRWoPQR+ORrOyi0iuR+++7JY0mkKbD0MIxSNny2f3316CKlZwKdkouOqM4tTeqIj8YyLn/Qr6Pbi9q2h3IlETzwZS+aHrUFKNp0x8oPJ35iZQujDc36ez6Z/Aq/E/72JMTOiEHLl22DQ2Onh1osqSleTnR5s182CPNLuTEB05p9g2u0OaKaFjHkEFFqFd3ouYznfA4XFpg3+bzZU62ATY6c+U/GRXWjBPufmMbVaboCEXU6O5E7mwuGm1XfP1lj7+L8TExV5keV8MqxDFBtsQgGn+9t8WQrKmNPFo1eA2GRzQWURAPytBlaiktWpvPU+IMkNEKg52ZrOBaa4sgtomzjP5N+IwBiwMMxK5i+fDu1A2HuGxen4HRE/CWTADfotXqp20oIiJHYDdDX2DOcXnrRyOEVkO5t5zwmmlDWZvyfN9lUM6f2slRNX8=","layer_level":3},{"id":"95c5d3f8-74e3-4947-88a3-7bedc419119b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密兑换处理","description":"jd-card-redeem-processing","prompt":"创建京东卡密兑换处理的详细文档。深入阐述兑换订单的创建、状态管理、历史查询等核心功能,包括订单生命周期、状态转换规则和持久化机制。详细说明兑换请求的处理流程,涵盖参数验证、库存检查、交易执行等环节。解释订单与账户、支付系统的集成模式。提供具体的代码示例,展示关键业务方法如兑换下单、状态更新的实现细节。记录兑换处理中的异常处理策略、幂等性保障和数据一致性机制。包括性能优化建议和常见问题解决方案。","parent_id":"4b047e2f-4d42-4e10-a12d-f5dda665ecc6","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_redeem_order/order.go,internal/logic/card_redeem_order/process.go,internal/service/card_redeem_order.go,internal/controller/card_redeem_jd/card_redeem_jd_v1_place_order.go,internal/controller/card_redeem_jd/card_redeem_jd_v1_order_list.go","gmt_create":"2025-10-08T18:19:49.1175438+08:00","gmt_modified":"2025-10-08T18:58:15.1288283+08:00","raw_data":"WikiEncrypted:2Tw4z8NsJjOlKl4tOUQ4rRBWcbr4pdze3j1+4HY3S26IQAEz137MI5Yq00cndqaSFSHvFpKgMtWBeU2MocuooTtw+/vbdByTDIm2m6QMlj0YgBjJy7FRIg1NzkZOZo2dBnr4+843dekwRNc4rXV1/WyzTZ0P2PJ6D48QSP3sVRTCYimL8zahcpjhhu5wJ1DCpzXMKRS0S6yE9zk1KbVmaWvcLpDRF5pNuSGch9VhkhRuTvbl3lv3Aa1eGagTfmrN/9ffgkBo8tkME/0k02T1D656W0Ey7cRJDduSIJoBeaM6mA3yT3j9hlXmvG2pJeCfTduDONk24NThZwtsCcaveg+0Svklv73B8N2ZPTlaUuCFlYgBqK9a8qJxVkZpte9lpaZk8G1+8aHCmztrC91WE7QW8jspEMPh5MiQKtzO8H54B9hM7gQ2HLEBWpyoExPTckpsZThAHCwBfdU3astLS3HriwtJRJOmcKSw3aATZ1THHYlUNPwq8jZVBgb04vkosL9/XvlcswEFYBOE06eTvTkWFXiFHvM8cqUTy9fQRorp8OEZgZ+wn2FHM5j+8P9a24346+ldVPhrCwoY2DU+2W0MTdj084H/vRELAsIUVreoAvkRlpj9kxvUjxuhgH45vY6nNk0eU6dfokSMEdFCvTGNvn9WUw7EtE3h2YFWTMMaFcIF0e6AwmgJpPegB6708mBCiJPB+N3DqGM+V7AjS35iT75lpIiBhrNfqRbUehN2vjksWooLFwCKeIzqUpRIG959i85z85YiPBiF1O3LaV93FxMHyB7pVjf955m6am1ebASO3H4uQt55/R1QAgr3wvNxka44+C3DoJQG41xxJzOUi2ixmhUEksYQY9ksSiYxei43GN8bYaqVRC2jTNj0JdHKdjFl2fv4vw6TCLWDQFttUu/sQwvXL87uvnQCaODbvv9pyc0PGQyTjxX3RYIOM4KZWT6MO6EOPPRB0YLtMlXgIkgFguCDMvuTqaPeZKVM0zamwLGMwC/sa/+DixtY3eXPCtzT+J+J7UgQsey9VuF+j8qATagSRTUC2MOUG8Be6N7YHvFzlMSZCgu9OnEkpsZQbCw0HggfkretmqElYXaLWBui210TeE7wM7yrw0FIV1qEiENbbv5N3QZjYve/YAzuufUscM9Mvmg2IA/FvVN8/XMQ1p/WuXPOs1gkqDClgxkPcf4Uac8QieEVlBjotTPYR/RCOtF0edLj5PMOpgj0TF40CorM/HImZcHpCKIHfrTVBYdYJlHTAYmIEzD8Qhoa8VYSaikimVZ1siU+vSUOWK6Vep+GpKvIogddbdc/9xXxkdUtbzxGHQPJ2DDUwhr2Xm1sv3Oh+u70TQfuhhfp4tKWjMmEwqaZtqX9LFM0C4dGaAxI1JlZg2knCT07wjY/e+UzMJrNfJZ7vTj5l3lU1PVHSWgLEZ4gIYRUoOVVl6z9s3/GMH5oM5GGIBC4Nj5QuY/aLZRIMhPbZUa+sQ==","layer_level":3},{"id":"5f9de6fe-f8b4-4b02-8b35-60dc30d0c28f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密订单处理","description":"tmall-order-processing","prompt":"创建天猫卡密订单处理的详细文档。深入阐述订单的提交、查询、状态修改和回调处理流程,包括订单分类查询、状态同步、成功状态修改等核心功能。详细说明订单与支付系统、AGISO系统的集成模式。提供具体的代码示例,展示关键业务方法如订单提交、回调处理的实现细节。记录订单处理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案,如订单状态不一致、回调处理失败等。","parent_id":"1940f0a7-1737-4f55-af09-6d228b09bc14","order":1,"progress_status":"completed","dependent_files":"internal/logic/card_t_mall_order/order.go,internal/service/card_t_mall_order.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_modify_status_succeed.go,internal/logic/card_t_mall_order/callback.go","gmt_create":"2025-10-08T18:19:56.1147088+08:00","gmt_modified":"2025-10-08T18:58:16.9335571+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwRa3WSApkXAR5Fc40tYehasW3oRRWjQgzTzde7LY3UZtxAiPwPZh6umD0hIu1ZxyamO/jzuB0ChImt4fwd/3TrlMI6CTgIwqXZdyi2uZcXeOqr+cxbAih167U94oPG7vP0ynlhZnr9bMec0kuqh/WRLpLnF4vcuws0pDRdrGjPIWvns865FMXNTmBRkZwBD12AI9v5HeuFC/mBSB7bwujiigRKcsIYWzISVjTI9xMTb+wXQOEoH7u5DiAEzaXINxIoGXKPjS1HYunIfG9J+tX/3zCnRIlSG/ZgYGoFEf/KqAWxXGTTDidEywoAaEtsoyEkH/p+fvz49MlshRjhJh82Am0zOO06lkbnHx3CXtY/AmOBkalN40SQNVLLrVhC+nnZOxAQjfbcsLzVpn0k0fBRHw1D7Rgl47TL9Nip8ZGr9tt7vEb6kxG3mGscOumxo5DDzcPHciw2oZmjLLoVfH1wm6WcXKvd5TF/+YePJazkJ/fYq7cseFLu+q0Mrf+5Szk0Img02WDiiJv3/USpD3fIC5SCv9l1fFfzh6haJH+YVntv6VHQzdSfVO8w19NNy9REF5skh6wZLnkuAb35GthbyTT+RrzE+0gfqsnmTO2RlcsGo4M/SNtnF7tyuzSI1Ikc4dbzHRfvBbTuL77Mes48EsZNzKFDP2z6B1SL2WRa03heiT/OwKzZbdJg2v4WQyF9KJUgAjXkxpd21w+XOOeQVnZXBy6iX72BdqeDUHRxOMW8Rft3KoD2rAx4VMSEYlm8yZf05HwnJfgIeQ7FPhDFFtjAyXj206M6cvbKLs8ucEafTjsGGMPcNNposqicSxfBaYJO2LIos4WDfJ8a6ch3fofGBRJYoOlPfMm/E7KdGY11PnkVEYveJsSGG96OY3FZ+skie2zb5Y2GrwfJF5WpDb7Zv4GRWDYj0d8K53mi3k+cg0XmlFnOmLPD1qKIAQg1mwRR4KSO+KVX7aJstFweV5e/0Um5q4VqYLMxQmbVdxe2aseE/XJZY7EZUAEDUh42qi2xQ4/Czer572EPp9ov2yc8RKWtDViOVM7V8mt1E1s2D0abzLj1P2cW3iI1n8zFG47vrU7mddUMpkzCNpAgUtpanjN26fgJuYxkV1Rnoc+A97qS97rBsY5Mw/ijcDep7DSKcn4oE5GNTCekRawF8nmbwXAeEqNZxESHg6HnPDG2TRAa0mU82CUvP8PfHLGFg6+zPW4n3ravMQ9k7JlGW8L+dUBhcLuryFG05xTa6XoW3nUncn4OoYxG+SRzUrSKeunw5OsHzov/HjCDev2WSPerrC5bkCz5m9K+M0ts9Pzl12+9TZimZx0YHqBrlCDaxPdoIB9AecRZkLy3Pj/EKWn5Vua0HBll5c/AXxCj40GCA9q7Axa7wo1DDYzbPs47lwr6Zqfv/cvP91kOFmt/Zsp8D5XtbY/Sy+zFiGnw5WXZp8RwhWdjn87K00yYzlSoX2QkL9rl8PCoJhnEehnRMP3UfhRZufDeXU6lnSHwENNHcARGFOLwKVayg7nvgYOiCRO1XdeX60yUGNNnf8byqMYZhLQBWG+B9ksEfEgBbT3XKQTMv9pm+66dxKzfFssS5kJRXynKAx4Z1ZLChf2TXj2p6fvGgUKiIHk0Qivsc+q","layer_level":3},{"id":"87830e67-055a-4ec9-9d84-3524417849ea","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"IP查询优化","description":"ip-query-optimization","prompt":"创建kami_backend IP查询优化机制的详细文档。深入阐述IP查询的性能优化策略,包括Redis缓存的使用、布隆过滤器的应用以及索引优化技术。详细说明IP检查接口的实现流程,如何快速判断IP是否在黑名单中,以及如何处理缓存穿透和缓存雪崩问题。解释查询性能的监控指标和优化方法,提供在高并发场景下的查询性能调优建议和实际案例。","parent_id":"abc2e583-1d2a-4ee7-b376-101d505c3e2b","order":1,"progress_status":"completed","dependent_files":"internal/logic/restriction/ip_record.go,internal/controller/restriction/restriction_v1_check_ip_allowed.go,utility/cache/cache.go","gmt_create":"2025-10-08T18:19:56.303787+08:00","gmt_modified":"2025-10-08T18:58:38.2535858+08:00","raw_data":"WikiEncrypted:HDzk6pDBQ9qxx18eHV4+ms+O2E4ojmm00kWAnKbnb/AMRZB70jeLhKW0WT2jX3fFE0/z7i/lrUCoyD02Qok5lj27e+0TrLp1DnybseY20m2kdsNivDERjyOZh+dwK+03eYbVnW2mgK85IDoNg/stwG/jio1goT9EpZceMcP6kLCBHj6lJvkGJPsl3X3BxGzqrf7U411Gl/8beFyrNtNNbzQcG6MYI5yxfJ6O4giFhnDV4DRaO+9HeZFouNqCnt/MMtPpIRYj5PceoqK2PISi1/BZ3l5wacazP43IMC2XIlaRim0Xy33sGhYw3ggrstwNyc4a2hil3MZeROD4DpV1pcQN5d2qWP+IYERqgfXMNkb5F8cxf1u95Vwwk+DNWLuhWz9zQY4xuiGR9/Uchn45pMRNGEO6Y0FrkfhxyC36f2DL7zAUy+YGw5DzQr8na4naH4ETSD1t+9GIZ2TwCWwbGRU084daz7FFkZNrfGFOmZVmNWmxhab/s4pAqWhP3kjG2uX4Kdv5mxuKTCaUtPtOFZIMK0njiqH4FihPMsX/T+630oVnDA6Kqu/51IyudKWdHaHQhufXjy1WBxMe2Zjc29pd9XGvrONQNP2ER1s50vZSC96ja/S+swTAQu8To1kg84aWGohPl6vMVePDmsrmee7+/zWLen14DcRbvmgp7lDn1yMb5pi/o/uEp1nZrzmAImKHZHfOfc7QSm1k3R1lgYKM60ZSBnTUD3aXc9q752eLLbJ3WUcHPEe3gqA8P+W4+TuUC/MQ5ViyYmDCc8QP4IOWkrn3IJIPUMY5PFS9DISELmYgVsHgatalwV8vdTqOKPSHsd3QzBX0zePRYfi9+0OHLgvEJHxl8H6z3iTI4C6uWP/l7kyfn9weaLbP/2dZLEhWWEjjs6/wFjxsxjzVBP4kuLVRzMu8n70NFPaY6fXdoco/JeRvY8vKs+Vf69EZS6uyWx+tuK0852DXpLZyEtPcltnSx0g94yM0hvBHd6J/gZNaWWkcMHA9u3CFgfIjI5/R756QqfRcn9ThLtOXea6Q4dtoZoRSao4i69ZV/rOO2vJns+9tMTgfJRekfGHMI2b/m3uigX3F/hMBrhvBNQ==","layer_level":3},{"id":"e6867dec-a326-41c9-9f3e-0372e1e6602d","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"设备ID存储策略","description":"device-id-storage","prompt":"创建kami_backend设备ID存储策略的详细文档。深入阐述设备ID记录的数据库表结构设计,包括字段定义、索引策略和存储周期。详细说明设备ID与用户、IP地址等其他限制条件的关联关系。解释数据存储的性能优化措施,如分表策略、缓存机制和数据归档方案。提供存储容量规划和数据清理策略。包含数据安全性和访问控制的实现方式。","parent_id":"53fae74c-0146-44f9-94bd-d53fa011a96e","order":1,"progress_status":"completed","dependent_files":"internal/logic/restriction/device_id_record.go,internal/dao/v_1_restrict_client_access_record.go,internal/model/entity/v_1_restrict_client_access_record.go","gmt_create":"2025-10-08T18:20:00.8578825+08:00","gmt_modified":"2025-10-08T18:59:13.3618984+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvLbiAthlqnrmydQ6GyJMt94jIqmJP/dizOgivC+50j5F77ll+XT0xbiFFnwmAAdXa5XvJRzqEwFtbYSi4IM7h+azyRc3StUlklnZwVbQ77701gi4uGbBtEtg/gwIuuWVoJ/Ql6uDqLfY8Vf+scSGf7xoM5+A0A0qrQGyf0N5X6CXcw6qPAb3aD9GL5li97zQy91r5bcdBA6OgWxbLohUbk6fzHA+KBsJYJLi5nq1NoDl4rYr8yem47bNIHTQCenlywS2bPPI20HJHWtv+XzDTy5qSXbkTUW+xdnJrkE9QGss3xQD6Vz0Kf7bAReh+9IWnYlbSqrv/Z5Blw6Yb/z8Z9v3ENw8gNqqPyxVwaX/6RMFwZspFbHSFIpdwdr7lRp27btPj5zbd00TdC8eDm4I7Jt+3ptA4eKdPvDUe2MBDtZxy5H19EubCwPk+uw1Yzt7Qb7vJPFrny6Z9r/mQLftGThKr5nNGEtB5EFwVD1I17ZUtYUgOBsL8dQ0fksaOQWuzVK/tUBdiY9BbY6JpcM2wVwhWknYGQhYww/8dYZS79NtnzJcGdK1j5We324ymLwiaipOT2vopHzYlyJQD/0SRL+ly6bevCllY0M/hIqaJazHTjZTRfxwPQAateLjZveU+KBAenloB0u/zTrIHRVoZtGEm1tYZWnd1qzE83mjUqdyBu5OEyhZ06C7sSxpo6NHaZc4uaAM2Maizf3q6YaT//XaqRD4YcBKcgiRqAIOKqdyTR0iNUHgDjSTytTvE3NFN0cdr3xewzbrbSy4IKYkrhYy4twaz+qi3+j5UvlS9czprctGPSXn92s7g9Anu9JfzkYdgWktkLzQ0bfr38cS0raw8TbM1CXN2CMs0ShCm5DP/8kbh5Pl2LjCJ7iPGr3kr40FN83D+1N4rOqQe/385wyJ3Oo/XI79QZfYFXqPiEviwI2jQmaOhV5NzuUfN5D6cupyMPBJZYMOte49njoqpTXlZ6cS9CcKSqbKEx3UZIsaYJgRPPr0AfPeA4OSP8fbWpZIfs5Nxy5N7mJqEHvD+OKr9hEpcIW82eFNT/ovIzu7/HxbtF1ZSXvLKBIkxvIaAAJIWh1boy9iNT8+4bmfiuM=","layer_level":3},{"id":"1e97e1a4-a919-4958-bf3c-428447bcb9b3","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"双因素认证","description":"two-factor-auth","prompt":"创建kami_backend双因素认证的详细文档。全面描述TOTP(基于时间的一次性密码)认证的实现机制,包括TOTP密钥生成、二维码展示、验证码验证流程。说明用户启用和禁用双因素认证的接口实现和安全考虑。解释MFA工具类的功能和集成方式,以及TOTP验证过程中的时间同步和容错处理。提供双因素认证的安全最佳实践和用户操作指南。","parent_id":"100a2b02-1888-4c57-9cd1-b2492db9671f","order":1,"progress_status":"completed","dependent_files":"internal/controller/sysUser/sysUser_v1_totp_set.go,internal/controller/sysUser/sysUser_v1_totp_image_get.go,internal/logic/sys_user/totp.go,utility/mfa/mfa.go","gmt_create":"2025-10-08T18:20:06.1943094+08:00","gmt_modified":"2025-10-08T18:59:05.7002181+08:00","raw_data":"WikiEncrypted:vY6Su0EQyZ4UawjR6GSslrl8TerMMRiC2vAH1D9LsXlgGlhSVt6X4lc0ZcGM0XjdwUyEG7Z65qRzodxrMLLnPnQdajFR5qdWB7OnHuwnK4nxF5WDbrYVWRgzofrWcIPnTm/3ITBkBoKIcdEEGsY9hB+Nof8DN9JZkRzJJfJbfma96VCDDGRtCeS1yEhWA8GYgQgJAkAspt3/dBRiFREKOruVTI+4YpbiGQbcefs2j2qQZauMp2PZDvYE2My0v9fpY6iZa+cNzD2Y4SVyFRAzChxQBfL4WdUAp3vuq1o+AtQRIF0VKf9Pn14H6j+fXSXXpl779AEYyMBSJ8FBrARnQLn0vcBAdZPICQlMYP05F+LBaYH+qdPxUexSkF5+BhnHbOUDhuKeUXx/1AQXxaDhBgQl0r91Kcat9Fo5GnKmMxkz3jTDyX0eZa0wDQearidX2HEfS6yLhNNlJ/g1IMZ9UyqjsQI/nJNuCMN5hyHZe8A18hef3KSAUcZSN1zxM7o/42dwzBZyszq7sYbh4fAWpCoNVlGI6dUwVMKFZYuwOdd7wY2zp85IqJyYL6zGVyZlcA870+SniyzCc8XjHAdESUR5tC7zcDoN9pdvmX+kShg6eLaB8ogC877RbyElNpqTigH8jBuscxW+ZNhKZ1nbSxhmrSp+R/HZUIja+E3bX4c+aS9+Lzch2Cy1whBO5sBZ4tBOdTG3Dj7fBgQElnp3R05nZGc+8bK2Gabr/E8aMr8Wtg3gUbbuWjXUWUoIpxNjLY0SwMVRmwq5eT+0a+spmaxaiibH0siDFrh1lE4OVfvAz7GHkz1XtBShCRIZJJwD5ul5Su6sEcVRjcKOfee9bAzW0W/wJa2NA3cttTl3YlsYgmjVGItM/7qifqDJmTEHX442NXZFo3tIy0BKzbzrTeizDbhg4K3i+2WlvsxFduyfdbBQffsvRuHuhMIyT3SSM2+HbWwtv0K97jq5GeEsIlw9BoT9VLKSB4PE0AXcQ7k+qRkYCi/bSGN4Vd1Oil53HvXe/oGlWyJsMKj+kfsbVDnC9v/h3G11nHF9ZnztCHwHIL7LI3T9vV3wuvZn3Ryn8e3I+a60Hw5X4LRr64YpJ3YaCy/9g2yyY+VoFh18p24=","layer_level":3},{"id":"72eb76fb-9b41-4622-87a3-c7d9ec2473ab","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限验证机制","description":"permission-validation","prompt":"创建kami_backend权限验证机制的详细文档。深入阐述基于Casbin的权限验证中间件实现,包括请求拦截、用户身份识别和权限检查流程。详细说明RBAC模型配置文件的结构和策略规则定义,以及权限检查的执行过程和性能优化策略。解释权限缓存机制的实现,包括缓存更新策略和缓存失效处理。提供权限验证的调试方法和日志记录建议,以及在高并发场景下的性能调优方案。包含自定义权限验证逻辑的扩展方法和安全加固措施。","parent_id":"19fa9669-f28a-4a88-b0f6-b6039eba9dde","order":1,"progress_status":"completed","dependent_files":"internal/middleware/auth.go,internal/logic/sys_auth/sysAuth.go,internal/service/sys_auth.go,internal/controller/sysUser/sysUser_v1_user_menus.go,resource/casbin/rbac_model.conf","gmt_create":"2025-10-08T18:20:07.2253518+08:00","gmt_modified":"2025-10-08T18:59:43.4846042+08:00","raw_data":"WikiEncrypted:arCjhUL6OOP3tq0tMlrtoFf/RGWFtEoRnhdJx6YcaSt2yvz7R2ny27ALK5reW+2v6HBYXkYVp42DaRmQlw6wk5BpsbZJASnN66QvlIxTtX1GJ9/oYF/PBg2wVhmXSI4E4863QHWaMcIRmAVuem99t+HgIXr/Sj/hAls5rJnzaFEWpGVJiEhXzsspWqm/Ek6IyM+UKLwHHfdJ6YRuB3pVTAMrOjKad8gYWgfp0Q60qez80Z6KPcdV9hSUQHs/NNICNd7XzK7msiKl8l6T0U0osNiFKzIa9RdcE+IEr2E3AdSUJIwTrPsXB/eEOjW4OFIDPmMUekW1Nm6Qd5IQrQwvurEGevh7WiWIB3+Zx+e/kwhAR2w1woh2BkKP7zGZYjslYlVBCipomiH0A0qQJP6riQbewrd7b0l8BG6a+/GETYz+XZvViXDCKr4I9iEPSQK9WeOiOlBQJzkvpQjTJzfotSvl6XgazWIuXiyZioPJ5rHqFg/X3PbNBt+N34h+qOmu/4aOJIm0eKJzMVtA3tzOTUCpcKpr7Y3bWvcEXLU/eCW+bKfgwF6I1I3xLJ+fcHhZWuxY8S7Qlk2bfrAyvYU0NhteTi/cOJN0xKilr0yVDDC3Xc+zff5nNN8qBTG8oDj6fNNkQPQcVFf96skiAvJthx/JEn4t0nzjhzRsBhWvJQOZX5dBCyPaqV0kQFlM6m+fQWUwxgAEPly0awuh1di07X4l+BpYEevW8tF2BEIxQIYcLvyuIQ9neH9yNG22mT5w7/ZrwbMxtbUQq2cL8+sYFU4fvda8QGA/C9OJnG6yakaSO0b1CjCyA//By2BZI37d+0laL8Q5epqq32Tqyzg4P/QAQSRdE9g9RZJLfHw4JS/9jCntJruBscq9BVeVifX+yCE/e/LDByJ/BFEJzenEin8wG+/cL1mWQWPHGDolqCnQMfnJQNj8TRaT0F06CPsLK7cbzqYdUxR62plYNbL62Thd1buqu/C7XyVJWdyY424+uPDQSbEo1EMnhSYIUWfCeDrxRNBPcdF3v8RY2Wzrpk+e7TI7dqWVD+23ONlthzIXaYs+njKH6PrggA859ITkjojfKe6AWL3ThoYfmJ9rtpTWBhxfqUVQqhpuIZXdv3jXUiiUnIfAyRYkpClCGrPsvz4AsHPnuuSpGouQzOfACbgdJvGOg6wG4lwH6uhmnxzyiZGOZ2aNpWaZlBTOnbjdHW/rIyB7MbFTqMMRl5qFhO3gZVnS+R+dEwn4dWKVL2VzZP5S/nYKG1o7moc8cbcG4f9rqsNmidFBTCPRzrm1SDdCxZ25mdVF4MMjMCRaq1wEJgRvF7uG1s3lK3uUCOep1q2IRAa79NfyJfLCk2BwQlee+NemPHNHAL50qhGbqt8=","layer_level":3},{"id":"716b40d8-2fb3-4120-a10b-ef4c35278628","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密充值处理","description":"api-card-info-apple-recharge","prompt":"创建Apple卡密充值处理API的详细文档。详细说明充值提交、回调处理、历史查询等端点的HTTP方法、URL模式、请求/响应模式和认证机制。重点描述iTunes充值回调机制的工作流程、数据验证和状态同步。提供实际使用示例,包括提交充值订单、处理Apple服务器回调、查询充值历史记录等场景。解释充值订单的状态机和生命周期,提供重复卡密处理策略和防刷单机制的实现细节。文档应包含错误处理策略、安全考虑和性能优化建议,特别关注高并发充值场景下的系统稳定性。","parent_id":"65e19eda-b904-453d-858a-07d58ddf98d6","order":1,"progress_status":"completed","dependent_files":"api/card_info_apple/v1/order.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_submit.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_callback.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go,internal/logic/card_apple_order/order.go,internal/logic/card_apple_order/callback.go,internal/model/entity/v_1_card_apple_recharge_info.go","gmt_create":"2025-10-08T18:20:13.0639481+08:00","gmt_modified":"2025-10-08T19:00:01.1337922+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBuQ8gXhRT0hzB3h0Nbh1xIc8vbGqXNlySwlsHA687otrBmRJVS6BPY7gJac8PZeXAsAUuL36qjwvumcmqfC0mO4vzJPpld0yLwP9nKUzByZeABboPKxsN72AHYuimc2vbj6BjRkMxey2MWjbd7zKWCmcBhGvX7aGJZgvRitjV0NbfinDarbhhJnXy2JG8fWQMPVL5MT6As93QDKtWRspAh7McoJm4482mM5530X0q2+/5pquJsvX5TVtIhdaZ9YQ0NVMUw9rRtpicvoJekjYlNOxWZuLmWwLUsj2FGo0lWqQQN0I2qCrLsueyHWEsTrUIE1tcNEGP1SesE9z2GVA2RQzh6Bk5fA+FHSE4yhsvMI/RDblLcl2APujp9eWneAvKuZYvDAULZ8W3jbtM43qVgX8X59wSHDnxfe/iLTGHxobpo2ZY3emYDBUtPdz4aw6Y6djarI1Tug04e0myHz/gBAUvWFuXuzSxrnnWVro4dXM9G93q7dgZjxDgBMUIlBt+0pK3FNWTKt8ypLZ7hcyOZ7qZXEk0SFm6DCxzSadEmnB1/cHvPxgeGky8QtSpttAVJ7QfzJHd1NWP+A85H8VwzZZ1buhNjamJ0FOSidOrszQ9x4j2xPOLXqYpOuF17xM9K3o+F4DxQ7ScG1u2vAmaGOzNgDIdKMVUtGuaVeyOTQmLTObX8XrV6lOE+uEWLHBALC9jMYu9m5mPN4M3HoJtJ4uz0Sth4gVJYSzdXMJgIxDQGRP4vcseqIBD5Vzx/i1Omho2/PT3t46P58JUF1ei3ACBNMgMueW4vpvsIken9QSyshW8MkozNRNpSHaGNgLsZ+Hv0mxz4HZkqm49Iw1BHpKC51pgk3Uks0BUjt6xsKnxDEbbAoh+IFl3Tx5SQfPLU9MdmfgAEUNVUydcdV4RBta8VKRmhQlEpd7u4L2YLOdC3pAz9XvQceBvxc6a9JpFCPbzl7invyujj7Z9Ujz5A4GcukIVtaMKSCBlt53l2LJHofYx2OHrdr/AP+7uZjkZFLBmelj2LX0G7dTMcLILju4QdmFQawqmYJ9HJO15WdO2uz9C/nyK1sN9LbjgMOgVc8eFmO/A4kTYd6D2bIF9TdfzKIhLRdHiiy6ZvlmAMzpcczRB4xN1Hq4Nyw0EAC9Nkf9Hi8AAfxGvABIiNBwWDyXahE9tGdXpB4eMKHZn/5Qt1Z6veg/JG96rpMs35nn4/qtuT5eXQRy+UZdcDC9qyWnyXNKH3N/DnxL2NDRHTcCUtBJhgopB4kQz0fzTh1bZWtylP46ilFo7HswGp1xQScG8DpABULiI3Q50m9CTfBvf42TmKO03cTOn7IxkCEQLmqyOKwNsI4THODt5J5H8ENehAgRz3GhacvV7tATmIbcNLo82ROYYQRADUqdnbB0YbPOZdglgpaoIBJhCym6cpUV3sjLeq+UFO39JT+JDUXVfVmOE8isa7tj+vb3PKn7c/utuSJLcyIGNQ/+Pm4r+w/KjNATozPcmc/buYl0Y4XiHU2xWY6Lptym/XT/1iO2Juge1mI/Il//TytNRDLz1Bs/yqMYiT860ERThWkBlRaRmIVNf5R63uU86tmNaSFV9JXW1nwzRwZJvwPk/lVFlmek7UPPp2dfj6DCmxrtoPqOWCLupaLjEzzAIUhB/fZSGqDo3n6gVa/6Q0kfRoLGGD4NLRVCFj9R6nA54crtmC/F","layer_level":3},{"id":"cbea6597-6985-4b7d-a626-c7ee2573e1c5","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密订单处理","description":"api-card-info-jd-order","prompt":"创建京东卡密订单处理API的详细文档。详细说明充值订单提交、订单状态回调、订单历史查询等接口的HTTP方法、URL模式、请求/响应模式和认证机制。重点描述订单提交流程,包括订单创建、支付处理、状态同步等环节。提供实际使用示例,如充值订单提交、订单状态同步、异常订单处理等场景。解释订单回调机制的实现方式,包括数据验证、状态更新和错误重试策略。文档应包含客户端实现指南、错误处理策略和性能优化建议,特别关注订单状态一致性保障机制。","parent_id":"cf4d1833-47d3-41dd-a87c-e005c6bb3246","order":1,"progress_status":"completed","dependent_files":"api/card_info_jd/v1/order.go,internal/controller/card_info_jd/card_info_jd_v1_submit.go,internal/controller/card_info_jd/card_info_jd_v1_order_callback.go,internal/logic/card_redeem_order/order.go,internal/logic/card_redeem_order/process.go,internal/model/entity/v_1_card_redeem_order_info.go,internal/model/entity/v_1_card_redeem_order_history.go","gmt_create":"2025-10-08T18:20:18.0167065+08:00","gmt_modified":"2025-10-08T19:00:03.7246349+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBnAun8ymWT50xr+zQMrdfh+JzQlOWLJm4o1ZqCukrC50DHCusAN/0zL1uDXc/vrzQH6s+pvprxcKT/XPElwdmz6dQ8Qjdb+NTvCbf0d60ZSVdNZn1cZCzjaTkxXDwkUwKfBZAaty3DDkJ97arJJM2XeNGKWOSpcw29gbMfkx2sBWTqtT5Jjotdmd2tVIDWkonvnJ1vA8RzTeDXpB7Mk8YjkTFg+waI+PfPGf/y98gHCNEO/fF1qpBN8vkz+MAs4xkbYJBl92K411F/oX54qyaDCDGt+RDEIYE0GV+kNJ/xmVu9eFvwp/Fkylf4S2X4rMKixtRzRwuyUgcBZjFx+scr0QzVdTWHxpb+4VdAlnyNe8YCn1R35zcM7apkH1DzgEwVPqpz/PUoFISxYyEEPM2ryaCwOAoNe/M8XeXHSIk68dlpJ15NNaMBOuFCVHgCCBweWGWF2Tw38NclAQKtEGfiuvQeetCLRff+NDEEc/XziANOey/NI4PnkQDjMLsDtS5y1pEFGlkzevaULxwOv4Pu62/IFuRRCES4+MjPas6eGbwTm2ahAq7MOwNvUxl1E+oYl9GyVYcqXH2UnD9dWQZYJnbiiIfXAoxhJf8vUQJFV8YpzF7LxPE0zUffUNeX2RjJwq6DOBlH8uBKEnbg/r7MDIJs2IM9MZnpMWulUa2tmbK4aWl2uUpJcyjK/gDjn17XoHysheQllRQalXEkwAbufDf0kDNFzx/K7aMwRd/nKjVOyaKQ2OjwfY/cC6NxPDCvOpuPeglR2C74aHUjHsDkAga817aSC/9ETfHC3IjWSHlcH1ap82au/gJs41NsbO20aGZ6+qarkWDKW0sdmEFqAlJdd0XsS8N1fzyj1unkjosiHLoaV8yzQnLx2oCMX9Yi0TqDAwxq0ZHWcGDgaIDXFb7SxrWW0brOCV3k3ubVAObIM7XAz+pwrcfX/TiXoTbLg6kKMCaw3d+LiAo/Fs1jqVB7L1bdNQsfBbrKPNQMFh/2DdScuVrAAf33hR1rL+DRfddlbIztmuxqyllhL/V1bwR7kD4EakY1sDLkM4aaohE7HaWaGENwI14Ar1oMcjYpBkl2r9iEJFH6e69N6O6Q2IxN2JVXHdDMxCOYytu3uwdmEDwuMVmsKYoLFaEptwJi/v9s88n7rr0LXZaIyYE+FU4/EgMXtVwudLi1aV7e3IU+JKatpMjbLhRpaNLkfNUs5zHCLJx96/VTjaZqogjbqyAdcyaXgw2UWbhpu8AhtS+hk52pXvCwMAUDRyshNvlH1TkgYVttNZN9u+pDO0IEF5kPTA6riGhmt5v0qMfrMETY8Jk0EE3q5mU25xqGe0Dm2M5HIgBFYCzcV0dvCJCZsgZ2dcM7lrHKB5u8wjUN3ceH7aAA7XhZMr6fmA0Cp62hAXM2JvAm7hjxO8XGH6VlduHCeUZODN3M0wVwjqI74BCmeMvxWFpqQBe/uvAnq+TWGM9fRJuqEpwgjZ5OXuBd2HDVRd7OoD44cEFCNykckz0OzFP4UhsTqZZno9bK1TM6Kz93JnP8ZqJtiNF7ArUFxAJQ62924u2nrUOev0NpOqoyUsp5lHb7zh3oiQiLmMy/0jj6/ZbtktpyeOFbHKcth/nPhAuZyD+oKr4m9443SH","layer_level":3},{"id":"ae69e860-0ad6-41a6-93d1-04f4986bf21e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密订单处理","description":"api-card-info-tmall-order","prompt":"创建天猫卡密订单处理API的详细文档,涵盖订单提交、状态查询、历史记录等接口。详细说明订单创建、状态查询、历史获取等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括卡密订单提交、订单状态轮询、订单历史查询等场景。解释天猫卡密订单的特殊处理流程和状态机,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注订单幂等性处理和状态同步机制。","parent_id":"4075b270-ff90-4654-b074-ef377e9015fe","order":1,"progress_status":"completed","dependent_files":"api/card_info_t_mall_game/v1/order.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go,internal/logic/card_t_mall_order/order.go","gmt_create":"2025-10-08T18:20:23.1161541+08:00","gmt_modified":"2025-10-08T19:00:59.8344463+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBpwp7PBBej0a/DwKAcLvKuicf6vl49763nJQ4T7oW1SwmmHr2nQhTOzIckcABWKSlUJgeuYKu9aMTw/ksiYmKpWoOVkcuA29AjNMeJLCYrxELEHX/RtDnCSymIrpWrpYBEVNL2JhzkgxKtjJv2P3PIQhoddo5srmVnjOAfj6WX8abAtLQIuib2C3CUsO3Jy0caMGiAhbuPgcILgCNYwKb2LoWo1aDROBNXLQiv0h/5rlxBDhiHp6yHTLcozUcyr+nmvqv0xlQJCRm7PF+qS74uQESL0xA70oGIsY7BGSPSPnggle7XjqUQU++v8gvqoIXLYynp8DzRWxUQBEYDmCgIWSWlWALARmKONm3zkvburdzD7ijliod8N1i6eyqo078f1TofTk5QYiq74NexQNcpLTc/SlKN3x9Sj/ZbYEady2ObHD++RpsV+H94r2br1FWPuZZrQUHafAz5nP/3TIwMEVQ04PQUGYbDbi67wBchEuqQLOBk0hyVb5rt/APRH2aMiGColxHHYv2QIQnfsBOJX1IoQLYg1FJkhFuL75dAg27UIigniKpZrgcL8tB6WU8XvTmX6VRxhoE7zzIsuRWp7tLHqnYVb4K0qfRltEj8Wk+Onp3ReryA9nsxefJwSxa8PpMiEQ4ZmPTda1SyM9MR9ylD3gLtk4rJAjKLmBfCcYoBNgByN6s4iUPY3UlojvhzNM/rvQpxaeuqwykhAj3UTYEiTlQP62+tf/XNvc/4xHAL3h29WOWsPwRYXqYDUrMUkm50C8Rsi0jPVYjKHN6b86sEvCaJtwhRF6MjWaML852XBJv4ccMrBtlKmYfTl0L5+cUZKiv+QNN9mNdBH98POVpcStwSEfUMv7A6w71JdToOKRutsTS/b0U581GtgzvMGd6cwWMRghrk0XbBF0xP85DoMxbzfiL9AFigDz3gkWtIUIHlZ/24+dJKVKSP109IGmzIpMNP6te2vMkbeyv/Oeocdu0hsq4muGsW1UD8vdU9P8UDgiNui04pNnKilDvotpgPvE2nyGzlRIX1fKmO/Jtl1L4YShMr3JuNv8kYu+1tLQ9xiJ9yU/OYalmvBsr20bW6MbKmkE1xSqDpo5D+N8O6/cN82D3AmrmUw3tRxadOxo0dPmrk7lpot813u6vAhi5zNSdK7keFZHGJrULsqvepmKT+ImO6D4Fc/zeNLd/Cx7gc9nU23VRea3HspNOj/is0O4OzIiShq/de4xRBFldanayA34KGEQppWM/6JK4jNiRYjk0o1yI+uoY70npaC/BfcVLxtNs1kyLs20fnJ3JdABUqlTffbNbD8YdkxTAk8jtaLHvJpRjY6q3uqCjf4Z2n7Z+bCt+46Fa+8TegVOr9ulqNoqGprIh59PGkpQ1XvZNSXgGyeplvS1Eo5+HBUosyFzDi6uA5NPwKaH56mBsj6IAdlArnOaLbzM7jPM","layer_level":3},{"id":"62d51a8e-063f-4d27-9ac7-e9007c4aa205","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"运行阶段详解","description":"dockerfile-runtime","prompt":"详细解析Dockerfile中的运行阶段,包括最终镜像的基础镜像选择(如alpine)、二进制文件复制、运行用户配置、端口暴露、工作目录设置等。说明如何实现最小化镜像,包括只包含运行时必需的文件和库。解释安全最佳实践,如使用非root用户运行应用、设置适当的文件权限、减少攻击面等。提供运行时性能优化建议,如资源限制配置、健康检查设置等。","parent_id":"59443325-27d2-48ec-b0b1-babd3b4b0fdd","order":1,"progress_status":"completed","dependent_files":"manifest/docker/Dockerfile","gmt_create":"2025-10-08T18:20:23.5932191+08:00","gmt_modified":"2025-10-08T19:01:19.0792416+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kCJ8o09p2tGI8awkVmrWyL2InK1RBcwm2+B6aKZI15nZpgKrnqicGdFRDxe41FImLhKK2ZOgsu721pHM3qhtLp+lD9TBo3B8GW4CdNXlVCXttj52FagEQnWjR7Ok8z2qIK7CUp951G7NrzOiF4BuUSyA232hodj/ra0uTSWpWoKgWjEyiZU/YVzEwJHVhlsCBJ76yhX8TTK64mT7WFwWu7azM7pUoD0M1C7mjaxj7mPfUq2iRCCrYACWhaH+T5zrbk2Gbd4O+M4PEs/ywQdHgjvyZMuFF862ueWawUZiDA8Fy2QFwzQ6LHFk4GXX+Qb35PvW6Hl54tucEP1Rw/o7HTnmoONOXu3go6/dL9+WRA0/RoRyUC/+ak1iXB+N5gZ5zlcLfxPIuOf2i3ptDWkDCCS42di4p7JFiJNjzMaiVwpHefr7fPReZmLQJdjI/O0g5WjDycruA2NO/IYw+vJJR0GyaIcF9E8UCtUx95EB8WRcjwwIHGfTMhRbSi9QSHq6409vNdPU9D+wT6kgmYR5HNCkzdc+8Hvgog2HQlg6Rtb3nQ8imzt8pVXlGQl7T3uDyT0Q4JSqfxwO8Q5QtpBXFkwpNoW6W2APxPoaWn8DDEJB0KXRILGnl+hW9I1uCDVCYA59OdsXnYx9D0Osjl6ixMzT/j7EF/kWmwaya+Mazf+wHMHguXqY8Md7TgEFz2Plqd1BX89eRzcKjzNFywC7AXOw0o34TuNLexpxm5AH56vBRwxt4aEj9ZkU0N1kDkqkyxwAIw2uqGevmMFS6EVrx2anEMh7jlzhUxYY+J0hfbl4/FlW5BSppLyk9HZbImH6ooAeAoIZKrgpmBRSivNGx3vzCRjICr6SbMJV35BXkdzhW8NB9AJjRWevAS6q2Rofw2P/mi1byfyZErtt4gYypYM=","layer_level":3},{"id":"079abbb5-6333-4afd-8290-144e6b7c9e4c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"沃尔玛卡密订单处理","description":"api-card-info-walmart-order","prompt":"创建沃尔玛卡密订单处理API的详细文档,涵盖订单提交、回调处理、状态重置等接口。详细说明各端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括订单提交流程、第三方回调处理、订单状态异常恢复等场景。解释沃尔玛卡密订单特有的处理流程,包括订单状态机转换规则、回调验证机制和状态重置的安全限制。文档应包含客户端实现指南和性能优化建议,特别关注高并发订单提交的限流策略和回调接口的安全验证。","parent_id":"3e149bfb-74a0-4709-ba69-06bd7c5990b0","order":1,"progress_status":"completed","dependent_files":"api/card_info_walmart/v1/order.go,internal/controller/card_info_walmart/card_info_walmart_v1_submit.go,internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go,internal/controller/card_info_walmart/card_info_walmart_v1_order_status_reset.go,internal/logic/card_redeem_order/process.go,internal/logic/card_redeem_order/status.go","gmt_create":"2025-10-08T18:20:24.5216789+08:00","gmt_modified":"2025-10-08T19:01:13.7966437+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBl7AFS+0V9EBoppO4IsIlgmiZp2o9E+nyWzfq4lRGV5l/tcyFnfkBw9B2/mAMxcM35H6yqYgB3970FKC4oT7YPUYYXIhgNKAWkEUnOk1wxl1biDCVdJzQe2eGwQ9rvmvJLFNNIjY9hB0yA6l9NQkvO/eHqs8iynDUlTpqQxm8nwJfpqDwtjgx0bVz7s/AyOVlPg/pBbtDoClx6HKqM0Q74Rp6MKklmdTj3fVSjBx46aTV10dC8GUmk5SWn3kHKLi0ITX1W/1Yra+NNYNaX5g6HPkQxEXX0SsmtLSIBgPYrK0RDXHDvEeziKFi6k0k+zADnz7V7rd+HY90sOadfVfycJuU0b3CcwqHfT0BYGLUbeRt37Cyk4Af9+mwZqcPsx/yEs7VqF0r8rI68qZpTZFRmlgXwMH6qXci+7CzYs/B6yADK+tQ///GPG15XMO714UDfFgzCjnyreeQ4mwpFW7/IDYlrw2nFO49TfwnRoSmcDGNn2o3o1uAoxRa4HwxqtaXHhK2ke1SCZYjONhha7b94kF+u96x4V75vff6GUqdz2t19Qqsn3KHGGo5WNDt06J/ASkZxTxfBCidTP02xEHgsTMDeOrecgJHS/HHPkdLHQZx0wFJTvSSZXM7J2qKwUzJvmHpgp/84E7UQGffMrIpyp0hdt5CDbGdadVCkTJpRqNOKClurVmSH6LDgySUCmaPogMpXr4wdzo0tJRvPRe0wult0AoHd+4zBHVMO5jJ52YfsRZlO3ZxCeafrFPPOYqpLVvRhExaSR8ckTGL+9sYBPo4Gcjqj1Nng/Rg6dWx5O8pIguOgqRJEC1tDxx0ANIZ81A0lx+YJRLA96evM8m+RR7uh17E8l6fGyX94wr77DU4XSpms3GShy1wsXg4Bm3cjLCQJA2Xck4E1Na0j/Yjz3QOLLPeFz0OXqXF2KCNoGgLWOOQFGdrhtxPqncvCNTlsBxDZoMsbXAJ3KH8aJwx/v2PcDDpoQQjh8zInOUpA2lrwzBXM8P6hnE0yyjaRKjLQ97PhTXOq2gDXKHOdD9Ax5jQc6q/jkYb4W9klpQDXJrNaGCOJz3gf0S90niEy/epd1wfolAArqiCh78gA7FftUAcGgKKKPB/gipbw1OJbP+WvEdvKgtJPbu7bbZq2POT7CcjrMYeiRXOeSgBQs5kPkQt9ErYwHTl7weK4RHm3v2IIIso8wKEXnAWZP1J5RJDyiRL5CQWtUjc9+WAxt7P1y3NXLxZKh4a9S3341YEXjKKNrPaSp3pMBDNHtzYlsn3KvWPDXyF7i6fJkadXtc6aCmX/Fy5pMdua0TFCJLL1z38QkEns4+F1sucDGZ3Ir/917cVVys3GHyVdXaZX3EDm5FDaCbBMjqwn0F/IjYZ5MdojWwrbLrZS1HOm4g/Q8WOHCCv17831vexItO8+xhMnwxOlst49F4LQOl+Eod8VXxy85Wy2T5M8skMw4Sm4altwFeVskh3EiHQPkcB1ATyXv397DP3D2AUJCaGxmPJ/AyQ4sxk9FeIYXsKOW3zSlD4J1uE3TF2GQwbSlBPeuHd7ufO3jI2FvuBiWpgxxWhkRj/CEfSdwdP9R1Yo2JCOYbmPX0vomc5VI4DRgO5ZtOyHU=","layer_level":3},{"id":"c785e799-81a6-4c75-bba4-a8ca273bc304","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"数据库配置","description":"docker_compose_database","prompt":"创建MySQL数据库服务的Docker Compose配置文档。深入分析docker-compose.yml中mysql服务的image版本选择、root密码、数据库名称、端口映射、数据卷持久化配置。说明数据库初始化脚本的执行机制,包括字符集和排序规则的设置。解释数据库与kami_backend应用服务之间的连接配置,以及如何通过环境变量传递数据库连接信息。提供数据库备份和恢复的Docker Compose集成方案,以及性能调优建议。","parent_id":"e198e011-e613-4a72-8920-6d411d5a8a55","order":1,"progress_status":"completed","dependent_files":"manifest/docker/docker-compose.yml,manifest/config/config.yaml","gmt_create":"2025-10-08T18:20:37.3408351+08:00","gmt_modified":"2025-10-08T19:01:54.6195911+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kDbH6uJdYYCT2pc08C2KEwMf5Wl8AN8aSXt7ibeyk8vJfbJakXE0fYaiRSmXHov8N6HxKWIlNdIrovG28EnpX4lr0UA6D4aN/Jr1Dw76RdHebznqhp3C8/j+LlS6Kd6rR9GwW/vWIiXiRsELkjk+KMU3pP9ndmdEuLGFQ4uAWPTqevVaLNpxh/cPBeylyu1hIyRorIghw3DHdQgQbx8D4bUmDCf2AZm+xRJxmakYugRwU1t9VT/TTelfjldfNZrjBMWWKaLWFBoAu1UP68mIeriPuYhVhUp7TbCwFH9dfq731iRttNcit6/wULnty89Wqv23LCCh1GxGYgvFscEAI/a5pQW+4FC8OrqRnF0t8aeh11XU4FyDHA4lavLB3g9FdMh3wSkPTIMs5QC6M9YNlOeROdjd4+yHrEWD4kGWMebzgOrb9CJfohrmExlyyxSmnM/6CXtjTFMZOXW6uQZ6E4ZjbWkMeSt9JXGg4DGAulvTRg2IXMjb0ajkRwH7fbt6YQ4P6kr3Xy2Suft9bjfNTEJu5bzOn8eMK4iFSzJ8j5DhciebwLZPNHwJs9DP/OEFq6vl9oWKWZjxP4qfAACJmVn7+CJmevXfcqc+A9D1GfOSNWASKo/EudAN2/T0FD3CzWHDq7qdkhjrS4m4SvzxPS4+VO1zBYO3gRH4lJez77fsMVpCt1CmlWlzv63AG6H1wsn+mrSZb3Yv/4OPHi4XNckxlkhlhqlmeJO1Vvy2EG2D0zs+/OWIt95lxuKksLver02gy6PAEFN3EK6LzE9qRcDjVsKmqtzEvC4ju6cnmqAA7DhP5+T6mhnh5R3zUuypkJ+sAcffjT+Ns5tkH662R8pXpyZmARzeDVsLkrtE+lRYtgxYF2m+vkRW2NNLesQXuGqKY+8v8N1+5LaxFvcwrAMTcby9wDcKaehfSrYCTgWhBymjwMrboclLoRFkQwYMOTxdH6hF73USe9gHMYlZjcxTczTkUeREQvL8EoYdzcOYTt50qUpwQwSkFBeMjs1DExIPTh3dPbh17g8fRGQ7gxewkAXgw0yhrisFa0KsCrpHswWBkuydMB0YUycjioFxUBvq0WQ8wlHkI/xYDSUUAsCWc6Ud7z2i0llFzpxl4o7G","layer_level":3},{"id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"API端点参考","description":"api-reference","prompt":"创建kami_backend所有API端点的完整文档。针对每个API组(如card_info_apple, card_info_jd, order等),详细记录HTTP方法、URL模式、请求/响应模式、认证方法和参数说明。文档应覆盖所有公共接口,包括权限管理、卡密信息管理、订单处理、商户管理和系统监控等模块。为每个端点提供实际使用示例、错误处理策略、安全考虑、速率限制和版本控制信息。包括客户端实现指南和性能优化建议。确保文档与代码库中的实际实现完全一致,使用代码库中的真实数据结构和接口定义。","order":2,"progress_status":"completed","dependent_files":"api/,internal/controller/","gmt_create":"2025-10-08T18:17:58.098557+08:00","gmt_modified":"2025-10-08T18:22:15.3262658+08:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg+WPNa2UHH7yP2PPjE4/OPm+x71kOW2715qQ3r+HA/nUOgulUPr54CTyi4xH+SmG3M//Jj2MCrHsjHdOwcKVcbc/KZ/BRfoyJz9p4xcSGvq71SHCvPzO+upTBdcTB8uoyej4zYJRzSaPPLUxZKfsJvXlKXBviWKj9S/ad+XYLEQ3qhkRZR0xUIo4ouiLo0v1sNRg9oX8MPu5BfI00EZSzvSejabCHr0di/TrFmy6/6xbiXPPszst/Dgo6MLIxxW+sKpTTbWGYo29Fn2kOMP4v+NVvrK4X6zsU+pFkEl/WLrRLhXbRd9cX6LG/4YtV+HM7EubRRRO+8s+qbvse8SjV0v7H6dIidhdKN6FPAVQsYc0djRYWBcpLRludBsT9F7CpMVmkfypGsvVrdhpo+GoFFYoWCQz/HKemJzegTET6wFL6JrhVUY3TI5lodRkB+/mpz72yMnjcDrxuRHkh1PIst7idtvhSsmjYhVeEEBdu/w2rpduKm6+5zMrxHLwnCJs+6dfW4z5xcKrsHTj3dxtg/5nCoUeANhieOuLMNGXkZpMcbD1nsjmhLmlcuAURgm9jka8aFhy7DLJEWNpPl2E8cK46zfWMOSzt/nUvHSLxlZh6hB6GPdj52HFJWoARwZhSTemBeDH/irEq5jxkhwd6LgtiXj4ICNS7vwqfdA7CReaIWDm/TTgaq/69h6CDcHR4u8EWTscwqapozi8bK0hfMvT2BJbcwmqDtapx5LbKdXJsi9CJxi35K7rptbPefPfydCo6hETaNnxQll+kWy/lHY1VzxshmTG6HSHu6p/e2/yLMpGt/V0ccX7lmM29QU/DB02Wc8EctSu1Adoe7ag+p39L9nGdZgn5y/FUPoqUEB7K3ElfcpSUAd3uWPyKZt7J6lrDwqESHQD8BVVZLufMtTCzBfbJZc2hkRRVZnMTvvMkoA5xQINwLRzYKUnYDsMUZwMNEZd1r1wYRKTUNUt3ag+m6e7KRUu+HcJaCLb+gf1VRZngS6skgL5VlBz+OYKN//qCSuajJG7tiRAIKDTjvEddIZ2ArdR7XP7XkS0hvcBEKWJqDk3lNeO3vrEFwcew0fehsWc9132p1ukv6p2fJnFNPIyefBHGBh8YCgF/cI2slAmag40jytocommOirB+fayMl8mwgPXvF4kuE8AUTkJurpmwf76jBqnXfeOUtFHYVveLm6/HsbVyYgMxgnIow=="},{"id":"d9cf54a2-ba26-41a5-bbb9-4d5403784548","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"商户管理逻辑","description":"merchant-management-logic","prompt":"创建kami_backend商户管理业务逻辑的详细文档。详细说明商户配置管理、商户部署信息维护和商户样本管理的功能实现。阐述商户与卡密通道、支付方式的关联关系。解释商户配置的增删改查操作流程和权限控制机制。描述商户部署信息的同步策略和状态管理。提供商户管理API的使用示例和最佳实践。包括商户数据隔离策略和多租户支持的实现细节。","parent_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","order":2,"progress_status":"completed","dependent_files":"internal/logic/merchant/,internal/logic/merchant_deploy_info/,internal/service/merchant.go,internal/service/merchant_deploy_info.go","gmt_create":"2025-10-08T18:18:19.4823987+08:00","gmt_modified":"2025-10-08T18:31:02.739493+08:00","raw_data":"WikiEncrypted:3KjeyWIVLPDcIZ9hw3jQxyih1hcV0MJ4WqB9XePVqO5uSk87HoZVMGLCJS/ddafnUeIJQvZXh8CiqeZCsOzZ7WWApgQWliHRHf7qJtC8WdA8vY8+vPG1IchuNQxYCmY726D+QWa21h41Q3fVwQ/EbkZ5I5PeqL7fxALsHkjR7bBIGQOIdSoi28zn6pIjvYcJtnoUtCuvAIjXx4lggeR3EdyOcuTum8hNpHtQIHe94pnVGtGcsTmo4ctQw1pIrWvLoU7Mau/SNz9G1PPgih7WOyVW8Ikgmj0cg0hr8q+tzGSk1f0XuA90bYVJoHuVlzYOxgYv2gYUY3QapeKCICUn1agTLEmg7N5M7J5gxYS5Fcvn0PeeH4pP/EVszrTglRxS3bCNec9qgXJGdu2lNpJysa1pHLO02WqstgyamSPXp3McUvZ2iAukpl37D7J8xXX9ObEoHE6BqctgfhJilK5+D9CeM37NMY2xHIv1AvIz7eJgssb4j1tw46j2zytfPPuHjkbhVD9MAgReDPJi6nDlnYLy4TMisNA6AMWQvZ+QgSa8Vcs6rSg1wYsymZ3Jb+Sp0gRTQJ4w+LqN9lQSEZaZAfaN/UY0vagzo/nN9u8qsucFikMgtnrOn0chKR4cdJM5abvOonr7yFX9n2LVA+tLio3/LOOx+lbSMHV6s55bwhoqRLznUUg82dibsXpDMLfa9Z/VNObrrZDhQdrKtRBhhpSWhAiW+wgqMwVxIfoG663sQVvSSn7InNOHftnlVRJNL3PtprkW/ShZqbUoKbMa2CwBC6eYqRQ5GW/XRcObjsjdZ5iC+0/MsNFpt+WhMSWBxEiX+2WDT0VKjxoO4UxDct5AfSeG6orDnF5nYNe5AmUVRtwRzCSqriHvZI+6zcni/Zi9e4iZatOYfyn0dWqCNgh/tp1h1ijz4fjWm5JD0r2iDnLgsdK1vHpeCi8Vek/TmPythReG4WqRW3Hj0WxgJIBsDppKaoGu6DkbCLa20FyVOxMfxPi+X+bYZoHAuwWDw123uRUGPqUw2NsCDDuVLfnAyuaO/angWaDh+r+Boi1QdjLgELbognD8lGncTpHASDOQL0RrGx7E3zuXU05pvtTv/pJXtxz/S5StHSs8DCw=","layer_level":1},{"id":"f789fe9e-fa47-4625-95bb-bfd66cbb240e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"卡密数据模型","description":"card-data-model","prompt":"创建kami_backend卡密数据模型的全面文档。详细说明v_1_card_apple_recharge_info等卡密相关实体的所有字段定义、数据类型和业务含义,包括卡号、密码、面值、状态等关键属性。解释主键id、唯一索引card_no的定义,以及与订单、账户等实体的外键关系。阐述卡密数据的验证规则和业务规则,如卡密格式校验、状态流转规则等。提供卡密数据表的模式图和示例数据。记录卡密数据的访问模式、缓存策略和性能考虑因素(如高频查询优化)。说明卡密数据生命周期、从生成到核销的完整流程、保留策略和归档规则。详细描述GoFrame ORM框架如何将卡密数据模型映射到Go结构体,以及DAO层如何实现卡密数据的批量操作和状态更新。","parent_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","order":2,"progress_status":"completed","dependent_files":"internal/model/entity/v_1_card_apple_recharge_info.go,internal/model/do/v_1_card_apple_recharge_info.go,internal/dao/v_1_card_apple_recharge_info.go,internal/model/card_apple_order.go,internal/model/entity/v_1_card_redeem_order_info.go,internal/model/entity/v_1_card_redeem_account_info.go","gmt_create":"2025-10-08T18:18:21.3903837+08:00","gmt_modified":"2025-10-08T18:31:25.8259862+08:00","raw_data":"WikiEncrypted:UimKryUcsn+gf9HzsspIt0TIkSnTFPxTB2lIcaUYUvTTahsE+f36dmyiYIpjkYfey8DDMQ+BmZ0SzhbP+eCmQhymH25gVp+YgCt1JureApmE5TkiTk2RbLINgqw81oYuaqjVHxuOFT/LJWr7ImO//6hBzRf6kT5rwrtfnbMhZpcgnzdnhvYrshMgYQLG7GmInjya61EcyoSK2g8xCVgq/es4rCHLSk26D0FRMNCM/aTu6Q3HkZhiSsFiNSpsDO93NxTXrDwiqxYZzO8fmCK2WscZ5yz+LCT63AalI2AORs17e5T1px/vEgCNthvL2qcPurZA6nR//CvFRQKkqrDs6Ny8uhNezNQ2muQ366rNdjUkb6Mck+pqB1BihHrYaLbdiNCSdtvmlkQ4o7Jc2YtEQeQp2SB0JqCpI0BapgVIrbHa/ap3At+XPgvjOrM0DkjaBYY1BbaZm/Yo2xaVSipEvZwsJ6Nu1gLeZ/94zGFYd9myhj7tfTOhyDumOITEIVuhb4x4EgjjZNwjrodAm+zNVjYMeJsZl3yDiAwhcqIaqSg0bOBUAb8EZsvjpy0LlWs3lLma6BG7nJl9Ua9mLk89NF4sMmVMwbH2tMv0d2vIYNMdFjiFO1lsXgCM+tDKPwKi27KIN51Yogw1HV+R2LF4uKhdROhEtgQuo0nk7oRAFQ/ebNcn9qFxFbKcmWvj5mPu1yScF0VycTjOs96BwIX5Fb5uEkg9bINW5wxy+Z4yti7erx7Z+GKy5BsrohlZVVudfWC+/EMAGFvoup0d4tXEIA+NliyxBBXa3wLVPX03VyF6ocX3U2xm6R61Jp1oRHUL1QxDFlFyCfDIGr6dQAynjLEmAQfOMqjMj5FZFK99lem8ReSO00U+Jo7neI4Ick0TPlzfxVyVe7Jf9C0GuMlv1tFTa1iygAfB7k0rMYMTqw9ocWd8ZHy1j4CS5wnCJeBfLF4ikXQUG7NY+PbAa/iljAsABhdK9C0DOu7VLa7TC0oAFQBVATzj+4t6DePtbstSXbWzULRqoNA7xplI8vGKRlpySO90g6eEOhvCL03mZCkgEtljL8+NaqrC1zHqsX5RGUr7ecb6V6aTT5wMW5IwgyFlVRgQA66J3hyiayQIUE4Swenep9r7rTady0HC8KKCT8wqYfp3L8WW0Uy8adLSVwKmcQTN98eGDNFyOdDhlPTMslwOldgJwy5XUPKPfzQQaf78PG4780necxhMz/RGNnE2VPyEFdT7FSZOesi+6wjJ0MufPgY2OAVOsadys1egKHEh7N10G37T+ZlBGQSZGclJpwfJjUeTLDwYUrNTPMUKeWYwKF/smI+L4/qIVAUoxOAicOh9NZ04H8RC6zUqnnZQF5sG+LPyx6JwBcpmp0wSmt9umA/Jo3bHMUQkFkjvcIOD2qAkf5+xSUY7rsIY2K4qDZyGPKd0iDHaUGN2XEOkz+gfUmIccB5pQ8y7GEPEoTxl123ZIYHUCPTNnv9IZJ06iJ0UTnw9eWBcuhSS0QPiR5XNrDWa8R7YdXOwSQ2put9iSem2kYb/LJhH1WmdyTUgwzr3A59bH3Yd9j8l3EbofRK/20pz3s8ULT3GxL/JdC0+xhY61uZLj0oas8y1IPHuCbJV6Prqz5MZuDXVYwcD18Duh1HM4sc33SddGmKVEGehJrh+T8l6XuRocVYVr9blG/xIvssdZrx2z0SBclryXwYwIK6NR4X6TAuXiKsldFwNTx91+s7yPlV17QOkWkBkmOrXrORn8puHWpLHabtqPY9IeRaxx05d6b2H6L9WbszqYQqWkFe/6FTXqIJ1o2BNzeNvrmGQA8hej3Nc5OcqsJWsSw+Pj2LOBNsd/1zxr/AipDuF14x05COYbFhqrlO4gth0CYzK+eU4Q/18Lnk=","layer_level":1},{"id":"e70da257-5cec-4667-9471-82f4f2d36085","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单管理API","description":"api-order","prompt":"创建订单管理API的详细文档,涵盖订单创建、查询、历史记录和汇总统计等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括订单表单管理、订单日志、订单汇总等接口,提供实际使用示例、错误处理策略和安全考虑。解释订单状态机的实现细节,包括订单生命周期、状态转换规则和异常处理流程。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":2,"progress_status":"completed","dependent_files":"api/order/,internal/controller/order/","gmt_create":"2025-10-08T18:18:22.8452396+08:00","gmt_modified":"2025-10-08T18:31:48.7232272+08:00","raw_data":"WikiEncrypted:9qHpiFX/XrbQzm4K3sHnDCnqaSYiGrN53N0hqcxxm+GXepGWAc25qGtGu2PrwDcruZ6PRlXyLXGy2BARsYE2glnbW3UR3u1M1o4o0P2ekOsCjFx2FLIeHh0ht8+5VaZRRnVp+/Nx3yDvi6X3Hh4ImoZU3xwjmiU38ZRuwvRWTjph7nns0YlyjVt9u+fFqqrO1c+DADMQ3vTa8KnwAlaO2mDBiVEVNdbkXpZlJu6EhkeltvQIoZMu7rJUMpSJpB1h4kys2uDiTzslQz/XZZ7fjU2qi4b2rq0U/5BqYhzRFdUkNZkrU+Og28J+4jNRtoROweELDTCFWY4OjzhyvoIIRaHWfgkUwCmazOGAem1Tm28+nziwF5HocCxsPMmxmycV9PHvfN9N1DQhk8J7L44s268p0viZCn6Ie5s/ePmpnPpQ5Q3SekuxvBXWygAzms0pd66v+pN9/Us3EUPQTW4Ft44kmcbLTrrhMgBMMeV/zL3LYN9CQjzPkWGO9a3VixHaFZ44ZuPzUgVZneg5raxwsNHpD1LM3mmlUM8HEDUTbcLmztO0BPNn2CPePByUsmp9TkxYEtXCMQo/iy2S2UnMctCcce5FG+lP0HXCXCHx/VGk3jZ7f2e/pdTDjT8ygJYKw0SzeGeg7UJZ1VQzdieLr20+CFLldxJ0tr0nyK16nkxieB87wLPQ1ku4lA1y5z9IbOLJ9V1FWGTXiA6yz5Hemoki2rocwWUlL3QyU5a/qxpwZKbQr7BJ5+t6Mgeqov6evn0R8OvzqURM9SByWy0rMk5dRYyIGyoP4njtS3cgUuoT7zKLci57bM8KC32SYDGXX+M6QfnG3i9gSued27oW4I7dHVxtBi6FjlzBznmmieLtASFr3XWV+eImePnrPUkKRCQOczCROll2JNn68Cs3BAHPfgXNRhoPQ10JCrd/DzL+rNigaCz7wTKPB17VkP47FEbwsHuZs9r2OYmNaOVt7n5MqeSvsOx+3rIFDxu4ulbQALMP8BI7kuyEvC5BwdkKlaflKzZe85X1oxYZQabhgAwoqH0vD2CYvHNwl0x2Cy/nRUaC988h07pMYUL1T/EtzVyGmYa3ju0G8oMIvffQMWvcW8lWt5LhjyreiNfthCU=","layer_level":1},{"id":"1d615d31-fbd4-4788-9190-9fed9c087918","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"数据安全","description":"data_security","prompt":"创建kami_backend数据安全机制的详细文档。深入解释数据加密和哈希处理的实现,包括AES ECB模式加密和MD5哈希算法的应用场景。描述敏感数据(如用户密码)的存储策略和保护机制。分析加密模块的API接口、使用方法和安全限制。说明数据完整性验证的实现方式和防篡改措施。提供加密配置的最佳实践,包括密钥管理、算法选择和性能考量。为开发者提供数据安全编码指南和潜在风险的防范措施。","parent_id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","order":2,"progress_status":"completed","dependent_files":"utility/verify/aes_ecb.go,utility/verify/md5.go,internal/model/do/v_1_sys_user.go,internal/dao/v_1_sys_user.go","gmt_create":"2025-10-08T18:18:35.9132863+08:00","gmt_modified":"2025-10-08T18:32:10.5829615+08:00","raw_data":"WikiEncrypted:2zPHV6joIeheF4r732B1v+TwDJugNsuaWa4+aD3okLirY/QzF9BVon1Yf6245B45HSkbnX0fqmMXoiNE4UbwejTBL+dKxq6NuZOuvk1gmSP9n/yvwGvgtmhuRu1QPF8rhIE2y7ZTAex6mSjOMgHalpyu8vGUgEoxPBP/4b7P+mkJkiDwc4IPi4TsFwGp5JE/6CSgMvCsSaYf4EEc6pb/YFx901KF57vWLPkbTToYvhizVWfJgps8qAE8IlBkhDFsOg3fBE8kib/o/jQvaQ8be42/J0Q8p1JqkSMAO5jhnJoUf721KNQ66z6rz3b/FXYHI0pKLgylY1+9ngwlEtWTfgTCjQ8jMEy85St6DlGa8u80xpapSoSHMQXSqQPGUYCB6k7GmvUBX4uPRsoWdKmwiKJmVF0nshtLpLWF/VED1zO9M5fLEWl5X+gMkGaIFwTbgcoAyP0kVIU+V3/TD+vlpqB3x/9ZIsiT8qZkaBoXweXdCNLGbnxlcztQ+Sgjz1r9HhRtHyZt2QOd1s88ddDNzT61X43kLky8CnVReg7nLCtAbH6krGKtZcaUjdfA8MSkzm6Q79CF2io7E91jwoPnIH9o1TbxqISLZA9J3qxJn8qcUVSbUjAh3hf0NioSQoyb03axXf+m32nhW1EGjpRljh78kfEYEMkJ0Rc+E8osvoATjT/aX4m/rKVfEKGdctyyAb0cTTlJE/hES1FydyaSowzyzUYOQ1a+zd/LBWsM63b3tsUXTFcyvZJXZ+2Hz/1WtZJ315ZZg1KhgMZtdCUvbqtf64OVAreWNG04xfMZOeRNGwcKMCwkuCvw9o0x5BA/1c4fhKOR1qTwqIQJUO9KSvVgpawYgRZ7zkxQqR/7c5BSswxGvZtfcQolOKAiQDuFNwSOg3TZhuW/lCaT3+BuD2QcvcQpe0bSqWiOUhOu1ONmpaUkmBGRFh4LP3K47LbShxJK8zL753qjlRQcgRIMGX/wR/wmnQVzYchRzwZn9pQJtQcc5wlLTsc5Gr7T2h/VHOgvpRzhPMFWEMCauz+FfKGMHHi3Bl3ZqzHhePq7kD0tngmqCnebc0KKUYNSzbgw75GWaQn5kU690IUEE1rATUs5zOzaixt7VRAb/EHsjOaXDqXt/pMLXAe5CC9DSIrF","layer_level":1},{"id":"bc2a2077-5917-475d-8239-ea5d96be2603","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限系统集成","description":"permission-integration","prompt":"创建kami_backend权限系统集成的详细文档。重点说明基于Casbin的RBAC(基于角色的访问控制)模型的实现和配置。详细解释rbac_model.conf文件的结构和语法规则,包括[request_definition]、[policy_definition]、[role_definition]、[policy_effect]和[matchers]各部分的作用。提供实际示例,展示如何定义用户、角色、权限规则和资源访问策略。文档应包含权限验证的实现机制,如何在API请求中进行权限检查,以及动态更新权限策略的方法。解释权限系统的技术决策,如为何选择Casbin而非其他权限框架、性能优化策略和安全性考虑。提供权限配置常见问题的故障排除指南,如权限不生效、角色继承错误、策略冲突等问题的解决方案。","parent_id":"cb5122de-2da4-4368-8957-6b7d9cab3982","order":2,"progress_status":"completed","dependent_files":"resource/casbin/rbac_model.conf,internal/controller/sys_auth_rule.go,internal/logic/sys_casbin/sysCasbin.go,internal/model/sys_auth_rule.go","gmt_create":"2025-10-08T18:18:35.969156+08:00","gmt_modified":"2025-10-08T18:32:32.393218+08:00","raw_data":"WikiEncrypted:arCjhUL6OOP3tq0tMlrtoOi+YxZ4wb4fbUs7AyKQkZTfv8mRogDaYSFnyXY1kIyaElUfcfdUV9J0wBG/P2Ehs2OyadwRiht4khd2EsVa63C+MnyAVI7YW8jvLO3v3yE+fhVnyBpR/iyNON5eMBSephXFulXENFk0jgIADmhaOBPZXWUgx1LwKHP+payrBVQL/u4CBFeLuzPWSLwZ99ChGf1b26H4avhLUUrXklEWuQ/I2MlcxALqQ91VYa6i9PgzA5A3yllSOB33AlMEKosbjHeb8t+mG88biL6xtusYRFz8mc5QUUUEVyhQxwXC6Ov+EWJPswoPe/iMp7ktb35Ao8TLjxFECClVRorfUdJKEjsSdmeM5Xz67w75bH3C3vjmEZMjy5yw0iFMm0IuU3CTKUBFsK8BM2CpFSHlP1w3EeJUQghY0ta0cfQNKZmcmR2Uj8+P0TAsPwPs7IXfQOMOXsyc0wtZCTxafeOzFt1DPAud7N2bMpcOMhuG470bKCRlPP9YeA/FYdynNY3VZTp57hwKVE8PIrL0W0x/uSrF3o2FHDAyygDIVoupDbwpwZlFV+niyGek3RIsP9zJ1wDhxjS1fmBugWR5hCi43OrrSzhaTBHOadF/oIcf9W6aqfEx0obSFNLQ06bc5FGQO7F218i211bWCsi+WAl8wSxxc63RT3NmBTYT/DFpBVuhkHKB3OTf/bxn65be8H+uLtdOXZNMg1nsFVhwqBH/g6vYy/gCOx7D2bDciAe+xDImRkryiSWKnnMzKOsTNUL04LYwrYXSxSwVUeZdI9dHH9wNFZD7o/Is1PovEvaqpGaI0xfloNr7lhJePlu9msKkv6KJiw0tWIOWg/2LojMv2lXx6wWsDH+0bLFmHV23uw8OxnawdO1lPX6vsM5FIbqUd8tjtowZOjYi37Ol14RMicd1oxm8I0CNAae0Ipg7vtEK4D+hvMoVIVG5oTjS6GCxBomrPUa8YhNrc2FqFd/65QbxOKgYMEtpawK/rrJSRL9adxUHecNKWUKeiAELdITDeCvgZqfybBlLmdkv/m3hOEn/FLhJiZfABYaGKBYk2QdoGyPuN2WvUyv0NA7eYCjrjbw8RCdRyohv7lltFfQFe6SZFgiKLRAMD1i7RAsxQXqLpfrHjB3O3kbOEkS8O4y9ZqmUoDv7CRCiYwhZ70PdX0vUJDpmEpB4aQpevmh5qdm1Gqb2ybxvpCPuepoQnEilBjtLk3TV39FTFXVDsWx74f4SKvJ5nT0AxuOgyoS25l5HYPK27KyUrIv+xPp8ok7VwIcfmcNOPhrIJ1G28YycZgC4ybvDYW+Biw5qw20wRekJt/7fB0k+ic1k0kyaoAXk/nEUkcSoPCwzTh74LG63uAOEH3oe5n6wl7gSJznpIA6R/wmJJQAYxfrD/nCG3vEuHWvkspZzZdd6fTjp74FMStyZWdn5LrgN+UrrgaGiP4QTJjRwXfITXpEofiNhJBEHOcLoF1GfWSz6Ri4azdyiw8pZRhddUfTXWIctgjHwWiOEUdEDkWUBMOv9a/fBAWjO81e+51yRKQ1w5mpiZmsRVgZz2J2O9V22PtYzw8uughfSOTzm","layer_level":1},{"id":"9e74acd3-671e-4b63-b045-115b89d5bf61","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"自动化部署","description":"automation","prompt":"创建kami_backend自动化部署的详细文档。全面解析Makefile中的各个目标(target),包括build、run、deploy等命令的实现逻辑和使用方法。分析install-one.sh和install-simple.sh等自动化安装脚本的工作流程和参数配置。解释wait-for-it.sh脚本在服务依赖等待中的作用机制。提供基于这些自动化工具的CI/CD集成方案。包含自定义自动化脚本的开发指南和最佳实践。","parent_id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","order":2,"progress_status":"completed","dependent_files":"Makefile,manifest/docker/install-one.sh,manifest/docker/install-simple.sh,manifest/docker/wait-for-it.sh","gmt_create":"2025-10-08T18:18:36.159378+08:00","gmt_modified":"2025-10-08T18:32:49.0815293+08:00","raw_data":"WikiEncrypted:ZCORAne7l5wn5JMRd1ey/o7bkWmPStXjff5imJQAXqphxnBeBXJmPZwisJmizM8eIz7HNdoMBW49/rBkf4pKo2wfKYjANvYUoy1RHJoMcvkl+T7a9UY2qj91JzD+P6W/sfk59RExJfaIeqfZgZ+rQMaLxSQtUuIhyt4mzgGsQPVmLF4IdAyCS/kkIRC78yEzoqoLgwDjrOVxaFsGFSf7guGOTNbeW5qj3HRXzfsOrMBXdHOWUcUTrzZIRl++C3/w0f90Zohr5H3LUM3FkB6I1o36YQji3P6+2m0Y5QYDHgr03cgDVX80/bDeIc+fOZbtm7bWqYWwx5pWiteMMRJS3nQ76LLrfGALYkb1EN1a4sdf6CUQm2zUztLdc85KE6aIdVaq8EbJKv/QBpMkoYe1JR4uu1eA64eotBXkHU4VYwx0SXapkbV8jtT3HkMgMIBXEAT6arg1WSQtm5yHtud9Cs6JE92XEUSUsoLc008qqHqjMXXiClyFKZ5osDVgZw1/8+yK/1z2t7P+lDkkFV3hBFiUhEKvArFdRSqb7/w9pEM6ukPkJZrHTibtKpPd+CSJTzMX00Eh6xjcx4IW0zwNi1M+k09Q2cuwejMkxbMgrBhBMYxxRpSIipS/RfkMVO+6EmpZiYf2i0nDGahSxa+Defz2Xne9m8Ir2tHn5IFauNwMbCjxCoC8PF2pA8yaT74wSHjUpnWPmfm8rxH26mqJoPJyabanEvaSTF6cvil/bczeSjH1c5Jf8K2sPWSbFzE0vwdsPB16RmufM24QhLouxabstQEFXIue4VE4KLXD6V5+ygIL+g06agNyVu9KE/gBs1ynlyxZjKdS0rnNNSF00GwDi8BJjAnNabziMhbftQLSGwEgxkeXLJm/JkjLhVtfSKMaCgryekc9mhDaBaiqRRGgWlsbBmBTldJc3zN0eIzM8jVM4aXYpod/X2oguQnp8nynv37iVKuNG7KgEPWDSAM9Dy3Z9bEHFf0BPHdIbCGl7H6D/i76r097eaXCZFmJah1GoZ/NTkW+WZqQlV5PX1Ot7FhP7m0ag5WO5+SqeHc=","layer_level":1},{"id":"1940f0a7-1737-4f55-af09-6d228b09bc14","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密管理逻辑","description":"tmall-card-logic","prompt":"创建天猫卡密管理业务逻辑的详细文档。深入阐述天猫卡密账户的创建、更新、删除和状态管理流程,包括账户授权、工作空间管理、店铺订单管理。详细说明天猫卡密订单逻辑,涵盖订单提交、AGISO回调处理、订单状态同步、日常汇总等核心功能。解释天猫卡密账户与订单系统、支付系统的集成模式。提供具体的代码示例,展示关键业务方法如账户授权、订单处理的实现细节。记录天猫卡密管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"e408f911-d11a-43b9-a15a-d55aafbd4257","order":2,"progress_status":"completed","dependent_files":"internal/logic/card_t_mall_account/,internal/logic/card_t_mall_order/,internal/service/card_t_mall_account.go,internal/service/card_t_mall_order.go,internal/controller/card_info_t_mall_game/","gmt_create":"2025-10-08T18:18:47.7816767+08:00","gmt_modified":"2025-10-08T18:49:06.5775562+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwRYQ6tdackApaOqk+2UiPey5Uympesdb3pMU/7s+Qp6tO6oPzMXaUwJg4minT6Xnk6sePRl2JWkJUs+0eVIxY0BG9pcqjbf7cWuLX8od0+v34lp0Zxn9XDzSh8RTI15SkYOSghIua2OYZxaRm/Mu4hX5l6kQTTVTfSSKyPKClM4KvavuPVwUtPmj3jmzkp6+OxGfvyOHHxi45tlQ7sJSA+9hPXVBJv0Bs5vgyXxnNgX79q6xkLTpWKwHh3G9HbmAbT+aM/YMoDKTlpBQatIoveO7Fj4b5lrfF4mq//5hqz7inZBGo9qXDxTG+bHBvV8Gy2QtMZlsNHM+P93RPmaRnLfbs1sgKR/Owrqd3c5hAfU3Gdn/V6HhVnIBe+PUsSaBZO3dOQyqHd0vGnaweozy2yNfkf+KTky4lg0pCrlrz2Dxn+qqOiiLRPGGSHcfUtctCi1L3cd9njdgA45LEi25H+KhWw9n8da4OvHAQxlH5HQKjIUnRZshILDmupCmj4ugHgAqew99Lswzv5acdEtL73iUh7AUvGNXLMbpj5SCo8meYSA9PblqFZ6h1nexkoA4LLO5BlZpHP8aKjFkIa50INM7W7ULapiqxAsnV/qkR29Z5Nuc/zpa5WAaDESeKwbZzWoPc3wJ5wPlFwvjfSehVeLAMwxVGy9W6uMXoL73LOUb3kYjjrycjhDxwDA70gdBAZ3qJvU955H6z9f0/QWRrs7ihikQdHyQNj6ForyX7LpUYS7yieOoPNSNtECIWQZFyeLEQ6ZgP05r1cO9gPDVxR+LyuNGoCdtBTlo/MQScFbyuCjrRoDENX2MXyU5vC/+VhOM1PE5EJMjt75Sd4AEqDgM9w092/WXwdzvR01LAHBXQvPqQrK/E2cj6fXzxOATYgKkQvtYGT4WXSVPfGE37oaMmCQpARSRiPViVe308ZV9avQPCm4WX+RmrXITc9ABnvpRAXtlCyHKEvVENtFfEdJl7we04YVsFP2xnZPc0ewH5p5qkB0247fnAXiYzp3Uakf5FfnJYrJ0192eDLmFxY7WxmYlw3s3X3ZcRFSN7NQOKLEf5cTZpBGiZ74vcH/IAJxjsbqiYQ/Bgrflft4ARYAFHJxbe1XOiGSbManH1eo3ti1puLFxSJ+JtNQEgyR+uwTdaEplerXLbkft/HM6BbUCi/D5PQjeuF8V+PjvoyM1WmRpHAPwArIQl7v0r4P+DI1ncJAo55u7CpPXQgG6AprMnaT8eF18vn9QqQpM4AeUEZAMA3iFMnvnehJD1EvkSdEGUTtiiRIzyM43FK65ZZ2R6Q2hDVoi9Awv79id1D9RtBYT/gthzgG8N89GhEVJif8iojiJclglG7j7zh3AxyOr+uBr+itr5ferH2t9LJgzDq8XfBkqScWuzotO2AfXPAA6aXLT1n2qvWNrgQEAbTokiHNZ3FV2UiG0aclDHvK3RA3uTnWnM+Cn/z6kngnpasYO/Be3ah+v1QIV/ucnyEuzCe/1jnHjL9+fOFe59HMdN","layer_level":2},{"id":"53fae74c-0146-44f9-94bd-d53fa011a96e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"设备ID限制机制","description":"device-id-restriction","prompt":"创建kami_backend设备ID限制机制的详细文档。深入阐述基于设备标识的访问控制实现原理,包括设备ID记录的采集、存储和匹配机制。详细说明设备限制规则的配置方法、查询接口和生效流程。解释设备ID的生成策略、隐私保护措施以及如何防止设备伪装。提供设备ID限制的最佳实践和典型应用场景,如防止多开、设备级访问控制等。包含设备ID限制与用户认证系统的集成方式。","parent_id":"6d13ba87-5f1e-460b-85b5-9106d41abbce","order":2,"progress_status":"completed","dependent_files":"internal/logic/restriction/device_id_record.go,internal/controller/restriction/restriction_v1_user_info_collection.go,internal/consts/restriction.go","gmt_create":"2025-10-08T18:18:52.3636278+08:00","gmt_modified":"2025-10-08T18:48:47.3830014+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvN6YBAqoBx6vmhNXnYNUbJ7vAEccQfsRXUvrcsUd5Ica1hLwUQWXp/Pckc1X4JzDNoA66D2onB6YIWzByv/B4nSRfbjaSB7sM5WkmHD/fJHdteFTnfZ1b2QAGESqdRvnKyy28PscM42NmgyL9aY8cmYTSe4nohnfq0HoW7tpvppy3BF4ebSEgq5qwXh3mJGqFINPrVHftbrjrPgAd0+c2XTCEyqkld8j5v+0XPQ0dOQ4Mb7yJQvZEAY52bW8BuCR/kWAdOxtP1hJrMmyy2WU97hyLm3Irg5YI85Qy/lDkTxotVPWosAoA9yaV8tIyv8EaMg335NRDnF2rtrX5P446NAbwzZCcmjCJ/t1UYVtCQDt+CrDK105I29wT9bhylEcqnM0u+H+STpsOG6tTb09D+JiGAlDrhGWXzJiPr5ZE8qt0i5NiuCynzQW5r9lC2BGBCQ8mwKUsVXSA4k5B0fVgJtsxAJJ3ocg30aelFEq1ZlXlC7E5tufuh0PNI0CfXakfDay8V6UAGZwZGyKo8Bz8p+zP0qoUCIr120fndCuiZpmbCJagp1x1Pv02SPxoPv8XC3F36isbCU03ygDPhF52wuPtfA8n9l7jvTOpLF2giltwoZLWYD1MPEKjXIZpaAXtrDMxLCr20ycqoM9jG5agOvfVU5lgaPDXpm7p3+xt4XfPj48zWHh2pn4IyeYeYN5HcDzyjOBhf7mJDG+Mn4fh5w2r8fwvtZfEzKA2PXfAIRFmD1e38y1ArMbS5+bmG0cuh5xaFsogjA6T8HLopwiAqfDct8ZyBw/lOUacbWqasTEWh4ACx85OfTJD1hBDJkfN/14QrqHojfgE1azQMRgUnNX3DM8ww2IMfRybwOrwq6+y4wvgQNmKwq8aSsNHiUePPtyTSS/jArDa4aGK+AiOpNYmGSHmH4C+95/Tn4Rrwjl6xt7o69UNsNEUlQBD6ESNR5ckzlMhfbKzf+GNWd8R6PmCfy5btoM93AAP/c+l1QJR3Lda5DNt8PqRC8Z//dIYxhdR7BxxXnXVWnKPJ4nqJoOn1D5j0O6c2PBae44z3wu1c3UhOTGiAatqctKYk1ivn5TU0tOWY6i4YIbCN9xe/klx+RTqPdqjCS2ZFepErm5ECBfxEP4jMo2I+5veVsOVQCJzd7OkOehSPJ7clSquxotKDzc+PDyIqnIM02mLj9J93ZjgPjzTffw6zaHsCSVbVEaqB30+YiJ9Huj23cERqg=","layer_level":2},{"id":"23f60e22-9123-4448-adee-d2abc29f18ec","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫订单处理","description":"tmall-order-processing","prompt":"创建天猫卡密订单处理的详细文档。深入解析天猫游戏卡密订单的创建、店铺订单处理、工作区管理、回调处理和状态变更流程。详细说明订单与天猫店铺的关联机制、订单同步逻辑以及Agiso回调处理。阐述订单状态机的转换规则和订单处理中的事务管理策略。解释订单工作区的概念和使用场景。提供订单处理性能优化建议和常见问题解决方案,包括订单同步延迟、回调验证失败等场景。","parent_id":"41fc8a89-8530-4842-9880-7b6fed4e4fc0","order":2,"progress_status":"completed","dependent_files":"internal/logic/card_t_mall_order/callback.go,internal/logic/card_t_mall_order/order.go,internal/logic/card_t_mall_order/shop.go,internal/logic/card_t_mall_order/workspace.go,internal/service/card_t_mall_order.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_query_order.go","gmt_create":"2025-10-08T18:18:55.3325545+08:00","gmt_modified":"2025-10-08T18:49:02.9290537+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwRa3WSApkXAR5Fc40tYehasW3oRRWjQgzTzde7LY3UZtxxDt9YCxNFsXtULH5ojzuVd9vnuTQsUsGlwPeby53UoJRaMP+2TVlBnpawHqqLyQZmsIaCEBa0KDS6Vqvn+W5/fkhVXVX9ZWv35eZ2nDZVxRX9N06OvWXNmnlgFwDtZrtnykRQYxEsdH87S0WS6nkRGy88H5gvafKUFjtLpWMOF6taMNbNenHgJfYss3RB7DnTw5MIT6wHuS+ZaU4JjMkQrG+5wFdEAdZUD1PSue0jzfaEh15NxpLX1QVkytkWFWRjQT1rS2FovSJu01DE0SX11tKcURB5NvNm4ZGvmOg7fehl8mrIhDcaoIXabkCxF4QnAodr8aJRQgsU3+D0pGKgDs2bNBK0cfAIZkrodMbBqU6PFOGHE50ld4+ikmQr5KmGbQHsuKVUOtfUwt9mk8rJB7IhJyZYhAtWHZ8xk3SRyTzG1S1h8bNcK8J3Utm1HQthqzBOvkipvWIkP4YeVA708Di7n0XMyI7DG6OXY1KkL//Af6gFaLG4/m57mx9WpCFPnRMEKsYbLQ3VeI0H+Elm6Pc4XG58wC+p+Vl3AwSZNm9XmPvgXDd9/I6nt97XKMk4QrQrguiSDFxawF1kWGkf+9Fq110k31gZVuJuJH1LBg3qac1ymngVP1P3Jb92QJz2KbUMgJFFn4CetxV8jxUPO5HHW3G+VhTynwYKx4otPsZQMUlQ6ZengsKFQp0zjnBWF6/+P/WtjkyD655aF4YYaKYBKZQayVIzFTsElEckA9VMM4P0g1dJaMUNfTzM8uw9h+ovl7gYigVnxgmEsrppjOG0GOuWraQJ89qKWGj4jWP7th5aHRtjLYU/lwo2yeGpIlhtQLy4Az7RisMFacI08umgWXM/NSZYjkd9kbUtA43t/ZiUHSUgCIPQ7x2w5ECTQHShtOWKhjBtifMTmudS1EvQHRfw/dHf+892fVxOWAXMlZnneciAcEEEWVmHC/0j96byVrqztM/MjygFKB8+ziEAMTgCGG7GH3GyoLYY0qeB0Q61VzaRPJbzbFPP0wemK3vPaiISKryQx6THbGQ+mFRq/yuUZ6ikHx80C5rj75zXIUOVDjzljDedQmmMucRlgPFyFIfyqFfLk2eD+Leo4z0T7bwSAWOE6jMe5XxvbFFpjQL1MXj4G2nA8WOBMNsjkXE6ExDG62CSDBmNTkPlLSUKYhIbDAl5+Kp42/e5auXARWcD1XZELs43fbGxn2FREszMT9n+Cx9UxEAiP5FdJ+P2Amoaa055YfhtdY7oTThxWYbqE4e1zwx/WQeSXEiNyUS+giHH4RCxyNGDb8BMRvEmjCTBJCBYsZ17AcitHKWsDmiB2ryVyOXYQBw0zda8RiMtG1c9VPyOHjJWS4CPUSSoETLnSzrMmeeB4o0q00xAxuwr2NtlrjOuoYTYhTvLTHdXahJS1yWobZNrOzFC+PoibaT0m55GndT/ry9xDczzuws8NwZZywyAGrouKanzoFiGbLPdBXSt8KGcS+/X10E+U981sSx867gYDQ+foo=","layer_level":2},{"id":"79943a13-4a9b-474a-acbe-d8e223554bb6","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"租户管理API","description":"api-auth-tenant","prompt":"创建租户管理API的详细文档,涵盖租户的增删改查操作。详细说明创建租户、更新租户、删除租户和获取租户列表等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括租户配置、租户状态管理和租户权限设置。解释租户隔离机制在多租户架构中的实现方式,以及如何通过租户管理实现不同客户或组织的资源隔离。文档应包含错误处理策略、安全考虑和性能优化建议,确保与代码库中的实际实现完全一致。","parent_id":"bac7f19e-b5b4-4f8b-b3df-60a9d5c50b58","order":2,"progress_status":"completed","dependent_files":"api/authority/v1/tenant.go,internal/controller/authority/authority_v1_tenant_create.go,internal/controller/authority/authority_v1_tenant_update.go,internal/controller/authority/authority_v1_tenant_delete.go,internal/controller/authority/authority_v1_tenant_list.go","gmt_create":"2025-10-08T18:19:07.5365759+08:00","gmt_modified":"2025-10-08T18:49:45.7355874+08:00","raw_data":"WikiEncrypted:7ZB9yjzZwc/JkOb5fG5L68aHWPaH9F5LGpC42+E2cka9EswWMfNQznGCsOCwDohduHxVlwwNiPebu27Gv+tzlD2DJk2+e2CXbX4dfJxKGN6iUbX3rXiwgFJEI3tC+P9BDa6tkVW6SDvFBRodPlpM5SfO9sa2tIGmYdoiIQaCCSyrzuMZ3cVpNcUA30mpGuwh0hcBAyezdqNf+XF6K5W2OBNNssVE0ZWipueAut2AP3gQ5pargmXYfZIrw7bxHPayUU/63u9oOqj164zIv9snb3CtKhR+5XTNVjKB3XKD3sYGBWt0Fsf/RNB0iKQHCOuMcvKFNJ8GMg1QXel8Weay2egAt0rFmmvy3H5Xh4AwjRI8Qpbj/voCcmRv+oQiMvc7z9aUOWlU0TEQooi6X7kClFfXBaSD8/rzGXK7nDDrt244bvSAV2nA3DMYPTsSpFk3VFK4KmyQBwrsAkK0rv14GdrZf0wbcT/4gpqfXdUI/1p2BP+qG4Ozb981mOeaRNKSglZAqVqtHjrwvbUEgNRm2OkKKyjzzi1Zy3YacNPZp7w2FDDvGtnMzGaDCVep6iGIIzGbvuJl4hDkp26j2XQgzDbGnoywuxfaKD5CMEx2jRS94b5pT0RJXPBKbKcfRJR23SWk95iuXVyL0Aa0rTjWOA2pqtWbna/sep84jJcYr+0HUsLErLraLR6XakY07pPga+qdyVRckjsyT20Bp7lFmDQ9AF2ptKF3ZIj6powFEPpm2RDmh2PRoUtOG2katpZspF7kypixlrNTRVu+xUQ8KbaI094k0j9A47l2ejku9ih7Tr/F71Ro2HvQGYR3WWE+Q4jjoin2j02mkT4ekHmA8iQ4JTt4G2ovfm6FnJiVQ3xpdayjZm74nE/7Vp36luCg0ufDKLWrfzn16uX8iNbTDcUYbLSxKcPIYCZnq8/xV3msRVkPB8Wx98Ex/uOBqkcWSLYUGN8h2FFXzZrID0OpYrEXXw4s2ctIKTPG1W8O+t4k6WmZNz8/OoPRIRt08L3+XJICLTyu8/yYO37lMxNdK+TPNzHxfxk8D/8DBGaK6g4wKAVaujejzovOMx8N+pLQDh/i/AAgjuZUejUE923/FR6sQAHBxnXdRhE/ckdUPbFc5zFKSy3Wuf2nepPcCkDNYrW7pH8x/wKhaN1hbOI6j4A8tA3ByFN0/KCrCmSkcb0QRqouTNt9VYuEGpia3uAx9l7cZEZKo4nCUTVidhSE8o01GX63uFoWubwxz8vrIeDSDuif29gImVfOxDXRaMCmeUP7Ex2ZjvU/LX+ocYkP88H39YM5YlXhIeroyuo/HE5XUT9DpKEMeRXK7l6dTiYeA+9oQ/KDnGslDc3C0f+ujJFOmr5HCWofJ5haZzePeM6oBR9vh9LcSlHI1Zjl79pkvhYq1a4ZoPMuhxAg1Bvb857PlDJLE6F0D3lp9LdjIK4=","layer_level":2},{"id":"247a9b67-68c8-4b02-bfdd-b60eebd4aa43","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"订单汇总统计","description":"api-order-summary","prompt":"创建订单汇总统计API的详细文档,涵盖订单汇总数据的查询功能。详细说明GET /api/v1/order/summary/get/list和GET /api/v1/order/summary/daily/get/list端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括订单汇总的数据结构、统计维度(如按日、按状态等)、查询条件和返回格式。提供实际使用示例,展示如何通过API获取订单的总体统计信息和每日统计趋势,用于业务分析和报表生成。解释汇总数据的计算逻辑、更新频率和数据一致性保证机制。提供性能优化建议,如合理使用缓存、避免高频查询等。同时说明该接口在监控系统健康状况和业务运营情况中的重要作用。","parent_id":"e70da257-5cec-4667-9471-82f4f2d36085","order":2,"progress_status":"completed","dependent_files":"api/order/v1/order_summary.go,internal/controller/order/order_v1_order_summary_get_list.go,internal/controller/order/order_v1_order_summary_daily_get_list.go","gmt_create":"2025-10-08T18:19:17.9232305+08:00","gmt_modified":"2025-10-08T18:51:11.2685231+08:00","raw_data":"WikiEncrypted:9qHpiFX/XrbQzm4K3sHnDG2/5vEWeLFokdGXmwHMfnNK62dfNT/UxNqYsUKg4IQXr9Ziy+qK6wcqxCPYSkXSBZ0Cu4Zbo3RmnZoSYolWzgof99Xi3JgdE7ix8h4MkQ781jRhI+eruRoMp257F/SEC7HsTSYYhA7lKgnr48YMoeXisC8c5v16L12us0oUm0RmANUS5LKkMUc1hWm3Ig3y/TJsLtY0m0Etg0vKodqG0jzEzt3hYCwo8lmabkQ1RXOehBSOV4bXZ87/bKnsvWzhq3Mce36iq8EhqPTdUOiDtQD6/UWYi57FkpDqNNtqGQg7iEKgetSw6T8tpKay7FpwMUKjEENFU1aC0aCoeeO+fhicusalJNWwkRCG05SqepMUai5Za+i/EY1pvEUsZ8sUGCazB+077/m4Cy2Suck7wnLWIt7HqcUtBisSZpHQCJa0K9esOcNPCBV7RYrZKFMlstxIgHaEekG9ZOw4q1GdblhjpAtfvknRGVYM4Sm9LoLGwkDpGliMpLHAzyTS/U04L3Rs9gyhHGMN2to30SPbcUYf20HcWE0U2f0yQb2hXCjZb4rTXrGGIzVDn2CLiJGkIV2LL9P7q3CFc34F7nqNpICm5qezQljeUT/ebs5hLcHYfudzI5gx4cf5QFGGj17ozZUxbuMBfPSQ8mnfWxO2BktJj4Z1kvMAeImmPMYb/1h4a27qGGH/UuhkQi/QmQFw99CUkPn0ogsRRx1do6KjhNOF0NGrQV9wo3yqrD/4C6UuHEYkGIjzBMnb/h9BhkeEiIAnbtlBubeBjuyH/BXIOGAhHWR1sAWbxOpctru5MhJ/MO5wBcRPWeAsIuidmRL6NjbHFVucDMxadZc/SoUurRVN2aopGy+F+xtws7AKxcHnuXDJVfVkTNyv00yg5UwELk23xwSe+RTmVSma/Do9ntHx8/r5f6bsrSleb8X6GF47ZdA/ChJjBqJZZFs50dq6kohWG2rqDhoaqILhIhPECc9PZaiUhvr50hwwi63uAWfNmFlZh56WjIZFNIFOLIsT2QSIfd3pnSN9al2Xomrpj7P/GiNdxFbsYMZnPNcRdMMRKNXNFLaBXLQM0RmJE3rRpd+lJr0YoCGuADbH2zGedbowpr9VZsHZ08SMLTXTg5FtkItK5Q5021PBS2uEnv+X3Q5M3SLKvNVJWrYVFB7y91p/v0mIdISQr9e3x8dCl31EFUIZ3MGH1v5WIqC5AZAYAgjaMFFEaPrRrCP7lXUADvh8T6x0VcTg6pHTbw9A1HkvanKGEQlqdkb+rpQctfnMhoNMANZLTnDAPzeqjC58w3H1itGrxqpCfeXGCPePp12vtYWbIt64YArky4APRKa5JOzlDqlofYj+wFOoq52kube7QqnpFuzLqmvS7t6LNbqhxss1+e2s/H0aHFtagsYbPDN+zqhTH+8SxRCBhGQbDEyOAx4lvRWlzdMkeTIK+SyoYxr2AfcTckRZP/Vy68YFo59hzeDRj5uqFzXUozrkn9brVnp+eMXH/sMmxEombcpY","layer_level":2},{"id":"4075b270-ff90-4654-b074-ef377e9015fe","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密管理API","description":"api-card-info-tmall","prompt":"创建天猫卡密管理API的详细文档,涵盖账户授权、订单处理、店铺管理等接口。详细说明账户创建、OAuth授权、订单提交、店铺信息同步等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括天猫游戏账户授权、订单状态查询、店铺商品同步等场景。解释天猫卡密特有的Agiso回调机制和workspace管理,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注天猫平台的OAuth2.0认证流程和API调用配额限制。","parent_id":"667164c7-51a3-42fd-968f-e3d167096e33","order":2,"progress_status":"completed","dependent_files":"api/card_info_t_mall_game/v1/account.go,api/card_info_t_mall_game/v1/order.go,api/card_info_t_mall_game/v1/shop.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_account_create.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_order_submit.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go,internal/logic/card_t_mall_account/account.go,internal/logic/card_t_mall_order/order.go","gmt_create":"2025-10-08T18:19:17.975255+08:00","gmt_modified":"2025-10-08T18:50:18.4117385+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBhDOfi1XULNq8w0FtjpadAUvV+ceSF9+Fz49FHc4BI/wHY1vMagnUmaQBpv8QvE77IhbXlWaabmCE2ntgHj2iMG2xn6ujYVBOVW2WcwN+kfsWyXc7LZw0jyz4gDVPMYNps5QyZVLLCWx9ZXoE5MCdw3yTVPhueAv+StWiFapxus+h78kDi3FaIPsR9Nn6SFMJ5OKTJsTSn5+vf0kwylPNuc/+Kpj4+S4rjyiHkJ6/AkHMKS+z+fyQQ0fjp32p98HtaISDQovw4/NwSSOIBGOOKvGwuLE9TcqkFbnrUP69eyaOju/vnY6PHNO3ceg9Yyn/1HLZ1/I4WGAcmKA4DS4/iTGZc2gs56D3HGebg96AKT8PNFnLMQJiamx5915UQWdh60OOzrVDfJv+QYu1BILz+Owzs68mGQwCajmmc8pFuUoFCwb0/TK/J7fM+53LDucBYx/r89clLpo/qaQw8QMGYsmmnej1ejEOHaAjABPIVLNhdU1hO0oDm93rT9aY3aUpCcz/Vti4anzEkdGsMtsYwcF7r8v3ue4rIHzgny4bDynfCCeog5tMziIesbErutBiY1DfNxO+dE9FusuhVvbSPigcOPcYXpYzqZdhzaqTMExjvXifhIsnSFio/uCxYhMyhwhNVAjVfJqTuSHcsZq4SsMJdenQ9PfoP5Q1ynfDf8oPhJs9SgOqyUC27Cei/bxKvqdqXjyYb1sP2AvuVz2IRvgt52TP8qo3gB+lwZJ4XbIjNSZgTDKUwWcdMzpPHZky+2IIwX+UosDNia64SYUbXA9oYZRrf1o539Pce880X3uv0jL49t7e0QPbrp2LEo7TWXF+qqEQ2qBeZ6TohEr62fapuOoiPBs0bylJaNcp8mg2ueegHm0Y3I044rIew1itqX8NSaRaqlt5fhSrOuGCjX9+HoBCUnOlMuFudHJVF48VibHUycpS03gHGJ94xyqm77K+5+zKPCaVUIrmkx1uju5P/eZS+sO015HYD+2O6h/tF0aJywJ2j/26CQ77i6BZx0kc8j9kEG784h6ghQJNmuLVOBrVIzAgYDx+3IFcZzPayWAWK+y7Zc9MOxkAolM6D7trEmVVbWabNyWFLUUr2ck0tAT5OFGF7ufaJZ7Vhmi2HMvSSWYN7vUwiHODD08eaLEnixCTMpfvgNsloZMsHLRjrjO6dGzl0OAf/NZoT9B16KghJf3jgKSr51FSI1H7j+aw8+U6pdmxWadCTS51urAV7jMnWULfylBcom/XNu9Fpnm4hm/HlGrcIEuD7jN5U95w9n/QWwsE14ddxPlVjLBEa3o1o8Y7GyogxfuHQitt8CLvUNGciIsADU0B9z/WEfmMA32Nz/B2cq+w1uuI9JXRi5WFOEnVrQQGiji/rELtk5/XGvlMH6/QnjYshVbOcaHTIo/Vb/X8nYiQibC4lFYhVW3pa+jrtI72e7MvUCYZ8AbQ2dFGE0KkGOtDjvk8nwMu+OCcqZvBs8W7g4RQmBtHkFxwcUL6lEw0it0RE9V5kLxyIncbh07rZxArIKwsF9SdtPgSqWSd07iRXzJpSpbKWBM6KJ2A/YjmBpj/X+rPp6Y+Jfd85tLwAixDLf5JWHEks9n9zDTD/YEBKg3HUchj5rqyt8TgXus4BbxX7HzKyLhZGtisgeXWKxKTu9wkbWXhSvyP7lrdt2I77Y4JHiZaZaNS5KQdEt336RGvmtv4bLgdu99zuEdp4OERMA6J/2rl8ReXKrbV60uO355I7fadmUGx4XdJFRD8j8onK1P7DhkLE++PPiFP0j9AHSrftMC4T1Hw6rgr9DXJLkabPs=","layer_level":2},{"id":"fcf25088-430f-44f8-868d-13db19b40877","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"盗单处理管理","description":"api-merchant-steal","prompt":"创建盗单处理管理API的详细文档。详细说明盗单规则的管理接口,包括HTTP方法、URL路径、请求参数和响应格式。文档应涵盖盗单规则的创建(merchant_v1_steal_create)、查询列表(merchant_v1_steal_list)、更新(merchant_v1_steal_update)、删除(merchant_v1_steal_delete)、状态查询(merchant_v1_steal_status_get)、状态设置(merchant_v1_steal_status_set)、统计信息(merchant_v1_steal_stats)和记录查询(merchant_v1_steal_record_list)等端点。提供实际使用示例,展示如何通过API进行盗单规则配置和管理。解释盗单规则的数据结构和匹配逻辑,包括触发条件、处理策略等关键配置项。说明盗单处理与订单流程的集成方式和执行时机。包含权限控制机制,确保只有授权用户可以修改盗单规则。提供错误处理策略和监控建议,帮助用户有效管理盗单风险。","parent_id":"a2cf591c-c32b-481d-b282-9aa974785e4f","order":2,"progress_status":"completed","dependent_files":"api/merchant/v1/steal.go,internal/controller/merchant/merchant_v1_steal_create.go,internal/controller/merchant/merchant_v1_steal_list.go,internal/controller/merchant/merchant_v1_steal_update.go,internal/controller/merchant/merchant_v1_steal_delete.go,internal/controller/merchant/merchant_v1_steal_status_get.go,internal/controller/merchant/merchant_v1_steal_status_set.go,internal/controller/merchant/merchant_v1_steal_stats.go,internal/controller/merchant/merchant_v1_steal_record_list.go","gmt_create":"2025-10-08T18:19:28.3445654+08:00","gmt_modified":"2025-10-08T18:50:34.4949921+08:00","raw_data":"WikiEncrypted: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","layer_level":2},{"id":"5a2b81b4-457a-4d29-8d3a-01c0e8d15396","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"用户信息收集API","description":"api-restriction-user-info","prompt":"创建用户信息收集API的详细文档,重点描述用户行为数据采集功能。详细说明restraint_v1_user_info_collection端点的技术实现,包括HTTP方法、请求参数结构、数据验证规则和响应模式。解释该接口如何收集用户设备信息、访问行为等数据用于风控决策,提供实际请求示例和测试用例参考。文档应涵盖数据隐私保护措施、信息加密传输、存储安全策略以及与风控规则引擎的集成方式。说明该功能在反欺诈和异常行为检测中的应用,并提供性能优化建议。","parent_id":"1213eaa6-98ce-4b50-b9ac-280f7bcd9725","order":2,"progress_status":"completed","dependent_files":"api/restriction/v1/collection.go,internal/controller/restriction/restriction_v1_user_info_collection.go,internal/controller/restriction/restriction_v1_user_info_collection_test.go","gmt_create":"2025-10-08T18:19:31.4315815+08:00","gmt_modified":"2025-10-08T18:51:10.9672417+08:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg9Hm0SYOCvN6Palim0MtUus3FRNUjP5X2DCKGq6+ITrvgt+4sqxszJWV8CNot6oQWekgcQS8eVsvLJhdJdSqYK1/4eLLujPOisKkWSSyE0MbrNLnRLCyhUOTiL8xLNUE+kiF3Wn/RyPl6myAP2CJGriWPhItOWgUSC38Gt4OwaYhJnX90WR1tujcn/wfm0biK6DZGNjYY62gbT8J/3/q0KB91C0sGiJcSPpO+s0i40b172wZpabVN6RrvRIdzLaZaA214I46pvfMwW+XyrBZFsBS7A9f+FT87iV026cSHEM/dv2hDmNwqB8x24otSAcPa9TNagF1DXZ8+1yrQ/9wEAU4B10UJtJvlfR2qttVWVI+sI8ofW2cud+igJZpDKZsngjgh0PudRtiMr18IvHigwdTKWumLLlvQJN2B1HS07YSGF28BeBw/J6P7PPhPebxYs+Nh953dxH3QFrV62BuIXEkHaRVqujfh54QZ+e3hl60SSHCNBuagg9V9Sg3fKXC/Gq/stqK7Ux4zMi7NrKQyDGjxacTeuU1XhFz126uL0OQgz9d8b11sZ9HtssERoHAMlccKzPTB63sv+aHrs3/0AOOE2tWwlNGf7PHdUzbM9tBv3Y7uGMVUMNhZVL/hqHNsqShbPGS2MpFTWlaXiAeUw+rUP3/OxhZOmXYnJNL0BWjZGqrpT4KHDQWdbCyA+P3P2F9j63WiE908Ut5YcozUHGpRejdfp3ynbgOw8n25xEOvteYn2m9r/q6fW3TqhvBzB/GsBIgHqR9w18yIVBxJS+3J2XCbVaQQgq3QerI9Eg4EcvkHhU9YwzRymfHWJZ6S8+mnkmv0/75ztt/+oi3P1XYhxJSn4OsQeAzbRUpclq5+VGNITuCW0QxUPOPVYveBzyuS3RhuBwIkJNRgijrUGv+e+hdmftbRl0r/3xfpzbUvyDitwfN5jobAs3znVH3GbOa3N8odfniMbqoy5Cz9V3kTXZtNJCnZdNrY9yWCGPctBl/RpwIA8mQMhf32EE5zi/7bQCF3gALwp+lSxNBsulPvREC3hm9Wxfm6gPygOmwK2JlX/WSbX4bbeN6tabdSKome/uXenGYsklPX/1Q56wW9cqV5IURChlK6JOSQ6yByrDCgbVt17oAEh85Ek88wpSlBqgO101409FnYgaooyKmO2kTogWu86DCBAjsiAlQtv/7QVPsgliddIiIsxxDUtgKRJ3lRpVIaCx6/tX5YXZtfAx7sVSCTvbfpbZjvhA0P4PlGuwjY1NlRrJlDZF9J7X8QhGULeMnEPHVsNXhWVYBBqDkcqxS+V/DxpNznCV2a5PWF/mi1HLmSC+zWJEjAw==","layer_level":2},{"id":"42508ad8-f892-4512-a9e1-91f9315ca0a7","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Ctrip平台集成","description":"ctrip-integration","prompt":"创建Ctrip平台集成的详细文档。重点说明kami_backend如何通过redeem/ctrip包集成Ctrip API,包括Ctrip账户管理、卡密兑换、订单回调等功能的实现机制。详细解释Ctrip客户端的认证方式、API调用模式、异步回调处理和错误处理策略。提供具体的代码示例,展示如何调用Ctrip的账户创建、卡密兑换、订单状态更新等核心功能。文档应包含Ctrip API的配置参数说明、请求/响应数据结构、回调接口设计、状态码含义和性能优化建议。解释集成过程中的技术决策,如为何选择特定的加密方式、回调验证机制和数据一致性保障。提供常见集成问题的故障排除指南,如回调验证失败、账户状态同步延迟、兑换结果不明确等解决方案。","parent_id":"246ad670-c405-4630-be1d-c8b8f141bd4d","order":2,"progress_status":"completed","dependent_files":"utility/integration/redeem/ctrip/api.go,utility/integration/redeem/ctrip/service.go,utility/integration/redeem/ctrip/models.go,internal/logic/card_redeem_account/query.go,internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go","gmt_create":"2025-10-08T18:19:44.4778445+08:00","gmt_modified":"2025-10-08T18:51:44.0612924+08:00","raw_data":"WikiEncrypted:UPowAVLR47I9KpaM27BQNY25Tcm9u6r8CQlUx42Oyv9SIsPI+sjq9zcQuAYq4Aj7ZFcqK4G4tONeGwS9wfInT0HqqrC5TLc9yn2T648Jr2XMAcJAFSztYq2GfpdIKgaqAKZJd7Ibv5l0QHPYxLKWD6b/RiKQOPvl1NWejLjqk6eYCh2BIMNn1EAmLMQSRH5NK+lXqUuafTH4mz1+5o1R1cj2GrZrKn4m0UsHuEwOfAbwpMwegFDBf5NxtokIPoJEm04TDmVh81ZS1kv2O4EFdN2SWkS0vMGwv8qd41IRIbkXCagkrPCaVcyRdrDlt9RK44kx3quJbVEYFs7JkwG4ebNg5WVU8H+Uld7emgNxHnfP911t1cv+hdyj2+3LcQe6vENgxrjqjzDUfn5uVH7ewZWuYu689uCA16PorSm2rUgdK3K6dDCwz/gEgYO2P6EErI3QPU3YCbMvCsAb2M2l/mpnCsFXwYJlsdRqbZuOT3sH56M8+aCZ2bpij4hIvGfBpmhBGBwNnsfkDwdCg2g3Zw7HYj++Zoh0/H/0K2y5LSWkpx5quqS45yl+nItz3OOIxxtjHXEDjsYGce+XkStLOHO88p2BDo0BeW1FDEQdtH8pKsfG2lwVFfWlpHEz0uAs8xS4qh8+zKOBbaQvgdxrzoTlcOsSGGlOGZXH6wOkzGUNKBLgenHRrbUC+z00BvJztlFAQaS/qnWgoMudHgz41eHD+3UsuiEB6vvXv/OcBD063rR0DQFjWQwluwtgxDnhf12uEolZoCw5cICUELwvGdqGUc1H3DlRx6YfoBdWDOHCh8zmhb+o5jLh0iduFYGhPXGiu1axWTM6dUQ6KMCTwFw3ej9KyK6amObtogSWVceSBkUHgL8VfsxbbxO113RlhcNQ8yDpJ8dPIzHz1U7+iFGugpjAHnFonBMmvyIrEzHtAOR9DNJL9Cf9lMuZL/GjU6u+rq4bMfTSEyqvOPlKH62kJ7piM/Q7id3t5J531i1IyhM7SkAJ52vm0OyfEOt1DW7R5LmaQgH1k6PALdm0ol6Bk5rRhuEdkid3Q+luOpFlMLHz/dNphKl2HaUazUiVFo9e49hjQB9co77K2v/f+3VW7x8NPNIpMF/3mEVBBV8QtjBzKB3c/rKlhDinvChS++aIzG1n9xBmNpX+QJd2oVxqOCCFx/QmpfKhwtI266i6QO66OkJFRd9zDJuybzmAKsPptIXlKEjXxalWmIAxY8evvpHZ0EnReyuMzjxArkP7gKSWJgc66m9FU+DDR3EPP9R5xJU3ZjYn1kOXPJTgG9SGLaZ8Cp9xnMYmy85oyyi6puprdI7HkLc+/JZs1pyQU4g+0Ho5RWVkXcSS2rDcXGO7LIE0PFRTHxlO22ZyGbWYNGC8xqj1Wy86DnJqzStOLs5ESPa+2qp2VmQ7hCyUvU0vwvtvDCR8sMfftH3WiQB2HbemqRqOvEr6sSLfc+sgGEiu89eDpWBazdQznquG6ZiMAFEtUtilu5CxPwZS1RDkP97rX2DRxOtL+Cw8Lr6yZCSyfp8kZqBQ5KiCeIM4vW344ofIZC4r7T/qTvIsPcThZZuRY421zZ+KKVCP2Ttn/5v9cm2t6HwOTYYzxtq8KVoNaVbMrjkEwG7gED7pw7We/Hm/08jV6xadGySJA0K5XZ+zO7DD79pvYr4VjSRrX4JPsmElCY3/vFRnh99Si31w5MjXHXmN3XEin2Ig7x6Y","layer_level":2},{"id":"3607d5d8-2ffa-4312-8aea-35827f6dc187","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密历史记录管理","description":"apple-history-management","prompt":"创建Apple卡密历史记录管理的详细文档。深入阐述Apple卡密账户历史记录和充值历史记录的管理机制,包括历史数据的存储、查询、导出等功能。详细说明历史记录的数据结构设计、索引优化策略和数据归档方案。解释历史记录与审计、对账系统的集成关系。提供具体的代码示例,展示关键业务方法如历史记录查询、数据导出的实现细节。记录历史记录管理中的性能优化策略和数据一致性保障机制。包括大数据量下的查询优化建议和常见问题解决方案。","parent_id":"1a62d745-3b65-4062-8a9e-207c4435c8de","order":2,"progress_status":"completed","dependent_files":"internal/logic/card_apple_account/history.go,internal/logic/card_apple_order/recharge_history.go,internal/controller/card_info_apple/card_info_apple_v1_card_history_info_list.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_history_list.go,internal/controller/card_info_apple/card_info_apple_v1_recharge_list_download.go","gmt_create":"2025-10-08T18:19:46.5612096+08:00","gmt_modified":"2025-10-08T19:02:08.5658594+08:00","raw_data":"WikiEncrypted:ngLqLViTt5zzUmJHZ62DoB3OA1rtdKXDOkAhm5sOWqzA3/WA09WLFVJkUHDwV4FMWdJdNF197MEgGU6up5YiGZBWV78aiz6bb/GDIkJYs2Pu0ofn68MM1Mqb0uAGEtzLsF3qvS+hvKv0PuTIvCeA0x/JV+fiNz0Giz0mdwV2l3/qNo6PlALMi1OK7rUowVitawMfPVyVvcKnMYzN5jQhSmqnw1AJgZm+UAdHSZmgawysFiQw9+tzIa+qP/5eXEHMNeuqM003rn2XwXHb+mviK57f7p29cVF70XFlRDaj2xWLOHACh49c7k0DUE3U2fan0s8F33ONXFfgbMyAEp0ZZIudDmF25zN/eREW8lksgg02E9qMTrXLAdqiiD3W2QUCfsynROPM1gje61P7tUkNX6XAX8fFKhEGYGlPc1aXAeH+fU699Jf/oPNsvmFddpE8D3OayJrFlah49ygdlq8gcWyzA8whPM55OCtD2re41YEo3MhoSOnPtw366i3OYSVqa7fwGfvhkRp9O4m5tmfakSg/tGgwrav0DRZPVRU4n2YGVpuKnoKuCQIlxicONfb5rC38GH5pBcL7NJmF4qsbV+CKQtUMcUfqY/4e4STvEkim8FBjLGn+khlvp5A9w48MOkg9R1TiqshykBp7PuMtkBBI98J1Gx/oRFAuQ/cZ0MAEYnNBEGDdEDXlgzbHfK1l8WUfuxVn6dcpETYRaQqwSQgxz+mQzh4EAtoFXf0AiJ9aXtSV8sJ+teI9QH6mjOKaxbI5+x0+HL9Hke6YorWpVzaybslQ2C5K3tvn54l5Sg29A2rK7VT9CpoH0wrezZY1qo7XG6K6IhVEdrf9gRIfKKIIPUe5opGayOEqyBoADMI9R2AE0jZ8PvzYi6F7cC4pCyR+HfmfBHRRE1xgHf8Wv/Xq2sNpzSBxsmyUZd85zTbPsd6EsLJXR9n4WqADET9xM3N9BsaPSdd4sE5vi9LutNoKZv+eY5wVodnm+kcV0QXPC3CfUHznHcBGvfpAWsbGYZnQTlAUhNXHjiDVp9J2oqBFK51Orc2NQLa0HwMZaHqwrkwvRqprjQ4WLbwWZEcd4a93FkWC4od1B15lHx09KGQQEhZgyXAtyFmrD9L80bkyMpbCaOKVb/6ZZUSvgAjdZygPvWyyMcD4/ish4NYBKRU+URklOOT83ZlTSxpE2ZQA1HyqP/rw8iwW4xbIWMz0TM7hFcy3Lp2LhLELuzpeAIV1EpP3uH9RU8C7ZplVsqrdE+lPlOxBRjY6BMPM5dAd2nXqlnu6TKvcBQl5tQmCOG+yu6Kf06MsYYVQHq++FoO+7lxcuv3y3sj/wZsif1PNc5uQkzUCT9hJEHHw5uuBB2HRmb5ZK2HaDKxufHfRP4H4Kpnayrfwfna5AB2hYhDzFD1zceyLISggD1R011K1/F8UrJ88TsG8jM2A6aTQCgFdORo+q0z8WR5m7sWWhId7DNIGmL3SK6u18f+ii5W24QQtOY9i/4wHHDmFr/YX0bGM+4VhygDVSVkfpDMf9aZHJa6GlFJmqESruc+VgwUKVj07wKE0Tt47Q+gEkEAZeibwg7zKPGVPxnQjCjE9Gjy0SAbXV706+wE4UUTSuHnmcg==","layer_level":3},{"id":"2b67bae5-b753-4f6c-96a5-c98cff54ed95","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密分组管理","description":"jd-card-group-management","prompt":"创建京东卡密分组管理的详细文档。深入阐述账户分组的创建、更新、删除和统计功能,包括分组的数据结构、成员管理规则和统计计算机制。详细说明分组与账户的关联关系,以及分组级别的操作权限控制。解释分组统计信息的计算逻辑和更新策略。提供具体的代码示例,展示关键业务方法如分组创建、成员添加、统计查询的实现细节。记录分组管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案。","parent_id":"4b047e2f-4d42-4e10-a12d-f5dda665ecc6","order":2,"progress_status":"completed","dependent_files":"internal/logic/card_redeem_account/group.go,internal/logic/card_redeem_account/group_stats.go,internal/service/card_redeem_account.go,internal/controller/card_info_jd/card_info_jd_v1_jd_account_wallet_list.go","gmt_create":"2025-10-08T18:19:49.1243058+08:00","gmt_modified":"2025-10-08T19:02:13.8986751+08:00","raw_data":"WikiEncrypted:2Tw4z8NsJjOlKl4tOUQ4rdLCKJ6he4t2YUuBiX+duHKsu0bSY6j5XtmWtlRDFLesp7B9t2FDeCzDhF4tjVQoWGbvNToSiArfvZgRhQhttoLMtONWLHnMjRQenEBAi3gU3uKMbVAVeFljYBll520xQvoXqZ0NtQx/im3wRUib4Li+8S/od1LJN/Z0mq+kG1GYo+Lu4o27Ap4u3GzHiKooY3As4LhjGAKZhtIJMx3NNFhT+ADz7+kJheEtwsTDIiyoneYQWowtLsktNUwONgXs7hEK1S+UT+Y6mJ+Wp4zENLPLuvm8sFO5/AR5+OzUIPhZQFbfAlIRTx25QByM6Wu/VKsvfiI6pZkx+cRRnle3NwKKP6f4h9rsJYL4mmBU1YAjDPiBnHrhKbMvys8sElQ93S+XvWbYDBHuAo8qJoO4s2540VnNWryZQAPUBejfvdoxXEv4qW1+TaNSw1CgAP1xgnwkJ4pjZF/Dzi9Jp0Lr5h9dtedNzyWAcbg92U5BE3awlNd5SLwapVjVCyAEjhW6BRi5KEbVamWkcv8r1lM7K+FxjpH2JwcjIE12ss08VsgcJY63zbbmkb6nzHyqmJopJA/QRCFqgbdNos7S+wmTEB6iFBQHlB6kUdTjLc9AsewksLuq3mSISM99nyCEwyv67e+KycKuwx2Y5dbPlSKCBXMAoewC4/gRTUu52365kvtXC10uSkaQIxviZ3tIQzU+Lp9ToWWiCDu0PyHzVBiNciBP/eEZol/E8ccCxge+8FLQnSOuS/a04xUSuw+eElgAGwETH7LuRG9W9rbn/GEZqNyjk3bGDqpsHg8qTxXGXYtx22CGktjyQeWM6MuSIbxCx/MltO61rs/Zsw6wLbCdwOtlhDkxTUvYeBVGJONk/7WcC18hYYsqbYoaW0VI8fzwHD9Q/ghhYbrWFLJSIVYLpfj0FuFwtZDD0Eo/qipCouBkT7EuIppujAlRk6htn1EXnjfHPxLPQeAboeM+JXLTkPKREgiWh9au9YXfsIfhHYiDDHnrXGtaFXEnGCjntosgeWJJFO2klzMfb1HLy4Lz8anm1zJhhCXR6tP0QOIhSd1jbprd4/ZPEgOaS3emoPD1wGvg5wwg1SFQR52NkRkSfesQL2p/t5DoqhNARduABqIXJNMK5SzMb3K0+80tADmqpcEkpwlossbWevFqR/me0i1HEJptn5x2TjaJvmgCxj0UHt61ChLkOFUeHbMkYZuxtRvVsXj5Mlh0sr5Dr5OhwxDOwdGY6MiLmWooApabtnqiddw74+cz/1pWQY61rKOprsDDKeGBQlbZWWHJeyUFq5xKVCxfv83FzL6yVJzhSthvpiFuRyvr4trnvFlfUqSd9Z8fThOOHV2mUDU8vLMI4WH0Qnp4JYQf1Vo49qf4+62N","layer_level":3},{"id":"320c1148-77cd-43a7-b2e6-2cda46748ce3","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密工作空间管理","description":"tmall-workspace-management","prompt":"创建天猫卡密工作空间管理的详细文档。深入阐述工作空间的数据同步、统计分析、日常订单汇总等核心功能。详细说明工作空间与账户系统、订单系统的数据流转关系。提供具体的代码示例,展示关键业务方法如数据同步、统计计算的实现细节。记录工作空间管理中的异常处理策略和数据一致性保障机制。包括性能优化建议和常见问题解决方案,如数据同步延迟、统计结果不准确等。","parent_id":"1940f0a7-1737-4f55-af09-6d228b09bc14","order":2,"progress_status":"completed","dependent_files":"internal/logic/card_t_mall_order/workspace.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_stats.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go","gmt_create":"2025-10-08T18:19:56.1204226+08:00","gmt_modified":"2025-10-08T19:03:01.1546908+08:00","raw_data":"WikiEncrypted:pmN7H1JF4+HQF9n9w8KwReDTM6Mx2U4SoX+wR3uMBnmUaLdaRPubDduH+iqcINL2F1uVz5fih8PpiymWyOsPjzO3Qey8yIXLoDGg/WTheetMHYoKhIvyZu6pbbaNAyK61SCxJNNwF/EHyoZFQPylLOta3kgaHFuEH7RGJE835QK8BRaPwrSAAzB+ZiFMTk04e8iWcaKdykmjCtO+9EdIARCuLs+JEVcc/GCxm5irW39IU9Sq9o21tO3Gc9lE8pXm5S7QQmQJlNeHsJUvwKT/rcb36wYlQA4H294Y2fKMcYWPnY19lKjJOlS54A5YpkwIDVrBf2JAnvHy3dKfCmCltaweNs5W1nPhB99CID0yC6RRwKclk599rzEPP9uQcMho+ncsqATPxffkpDN0ZSRz6xYJeoNBkP0i+h027xzaM1LTNShoiL6rjaZKyhmGlwvB+p4NqZthrp4zSR9vzdf9E1Z1lQfJ+1kDHKaBNyk8N7YbphhcsK1T4YGoOZ8kUj7JTTDlhNOK/ulyhDY/6RfKqXyYOKfDyJxDoTFM6PHl27fqCuaQDefSjzVOcK34HOi917aWeTxrLhCKUOHI2o/RiOtcMeSDHLDrrs+FK1ZgABoIR+Ba//CmGoZIuBo3WyrpunFHTDMw5QiMlc1GwbmwFz1bu1ST66DuvuFhnqy6TH97FEW5llBk5OkMjOO7359IKCkqXCchGhXFFVGAhatkBD6If6cXhJnux5uF5xD/yiGt9JdSV9FZkLpF+8OUWxrlE2rdiM/vF18w4PrGqRENA+XZQDyuxTIEXCuHfermrLGleSD2cLNANrx/6IOfIgjSiD7Hgz9uzPYvHeqQDM9TGjPItqR5e63PZKxIXaGfkkIj8hZSOR0IvlljXIdKULszbxi33SVWUMSyqMo0di5toQDQVI9+HKTYkS55Bj4OA9iIerZvVKl9/x2DdJkXksNL5LocFKFeAuGhmigZj1Jqpjaf3OiZSPXi3B/qoor3Ea3woUmI9b7OW3RmJQxYjShTEIy2Gh7KfAXc/afdHm6sD1Mskv1AUWlDwR6pGtzWwY809btuYtkA4XxaU+fDLtLYuUbc7glBGylDcndTjgRXxcS9kNWC4NaxQqK/nXjG7qxLiRyBL/aALnch5eb+TI1tjd48lbUQnWX085G90STcsymVAS9See5WUxEIWawYlgAhbHVBjGaTuVEBTEDXv65DipF9LCzobfTRsu+iyh4YL3xl+NipnjZSKiqCL++PtLK7cTpEg+sGO/sxMoiN3xpnYW+a+d1crOwLBIAIqZSSaJrRra0p4NKxFwKYiYhvl0fxKU4Ms7rElsigkjVy0K2v+iO21FBG2InZvMAPpC449SbG9nBEem7L5U8oKJGEYkNlbRlzZeQRXsedB5eoQlyhjZK0Ugtql/Pf8euHHPa+RkiuBR/YR264eXgsA2C8x5KBdnKv/m5adEZC6AEZ2WdXHXUqs+SVr9BUJ11V2x5gxA==","layer_level":3},{"id":"39c1c160-0b1a-4f65-b1b1-23c5e983e5d9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"IP限制策略","description":"ip-restriction-strategy","prompt":"创建kami_backend IP限制策略的详细文档。深入阐述IP限制策略的配置机制,包括黑白名单的定义、封禁时长设置、例外规则配置等。详细说明策略的生效流程和优先级规则,如何与其他安全策略(如地域限制)协同工作。解释动态策略调整的实现方式,如何根据系统负载或安全事件自动调整IP限制策略。提供不同业务场景下的策略配置示例和最佳实践指南。","parent_id":"abc2e583-1d2a-4ee7-b376-101d505c3e2b","order":2,"progress_status":"completed","dependent_files":"internal/consts/restriction.go,internal/logic/restriction/restriction.go,internal/controller/restriction/restriction_v1_check_ip_allowed.go","gmt_create":"2025-10-08T18:19:56.310576+08:00","gmt_modified":"2025-10-08T19:03:06.9739394+08:00","raw_data":"WikiEncrypted:6hVxnL7axMQmHgJLo0JNgXroZS4XfIcI9txs//qPFg+UgB1QVZpinkI/9oxfW9tPotJf/5BTyF8XCfAyLA7+o10wprGeKJwF1KwCWge7URyS6iBsJc1lQYVLzkprQ1jUE8cO5rpOjgyC1AA20f6UT11yA1zxFozgy/g0LWVZqwOTRcGh+5yXvLGbTIxDRKp8p7pt/JuDSzO5qTu5ypX7rWkkH/Ups0tZBzzh8KCM7WGq88jgY1gbBfHMqDQyCgAqZNcIcUwmlLKjk4PgKB0qkQ9cmZIfkS+fHSj6RMDGc03sD1qanuKGk9ESxwY21oWzpc/3wI+n/p+cdeMFNTalWE8KhkaGlEid4ydyq6Q3KBCtTFLn2chxi6nNbNbhR/oFhb6UBipCLFW0jjQKQ/jUYHiYU3tx2uj7sLliYtY19p18ER6Q0eeBzTY9x6nJ5BHpy/cDqFEPbiO9W5r+DPrP6vYT5cEPKpIowqt4W5NGOjvKSzqfvwE8nIWzMdP4bsrSwJtJwfsSEHBZdExKEtWcW/tbdT2dRxkYWfQmhI7cY/K1wKL764SlWVFpDVN+LSHez15/UO730AgIR2e6oqt2ubbB0A71eBp6Qu1o7smfperkg7P67OyP6tINwOIIAIT/xNd+7CrePcaWmIzDfUWMrQxspxyNaWctU0QgSR/sPFkIhxzsg7LIShBmrEH8tfw15U5yDFSTvuMUgYw31xprPAGUtKSR0uXZhTwuMmfaKTu6u3Frny5Ci+SIa+CQ7eLxurjMgXLzc1ZZkzt0xg4POwjzU9cbPVRqDBYeI51W/Jd60XoQOpn3PaYJH+5URyIzfWw119cEIMboj5KPdyxdd9RbkyB8rcUn8jIb0aiGVpcpbXpFMap7ZvfLCNKd/75/0k1IoUeZ4MQxILjkca8+WBgoq9iAkOcm33IneMzc7ySgTBgxAlw+q0ecVEmBEU2N8pVhCnBwtT/ubPGSftmicQOKOw0Y2f32sVWMOx927CIe8Ia+lc/UDbep8rsQTvc05NQYljd6ImHHvXErpYqND6Rn/VIbHHLmN3pdHLvgfX6BmeTBIAJTuADvXyxsroxWyc9xMTd8URXX7qi32k3LtA==","layer_level":3},{"id":"8211774c-fdeb-48be-9f7b-27287395e2c9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"设备ID匹配算法","description":"device-id-matching","prompt":"创建kami_backend设备ID匹配算法的详细文档。深入阐述设备ID匹配的实现逻辑,包括精确匹配、模糊匹配和相似度计算等算法。详细说明匹配过程中的性能优化策略,如布隆过滤器、哈希索引等技术的应用。解释匹配结果的判定规则和置信度评估机制。提供匹配失败的处理流程和异常情况的应对策略。包含算法准确率和误判率的评估方法。","parent_id":"53fae74c-0146-44f9-94bd-d53fa011a96e","order":2,"progress_status":"completed","dependent_files":"internal/logic/restriction/device_id_record.go,internal/consts/restriction.go","gmt_create":"2025-10-08T18:20:00.8658522+08:00","gmt_modified":"2025-10-08T19:02:59.4136964+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvGbxql1VxGvXj8wXXJoD2jUkzw2IGr4vc8v4wXpMfAxM2i8Pu8fZQDbDACIjUvIa2PVuqqdtSsLu4AJ9u0PM176QBtkhz5xzzYCLIycke55A/EUOP2wz2ZNWE/Bho5s1esCxg86joQ+AEbPAnr9y4UUwrK5FmZpNj+5GIwqmWtRjK35+74RSPESBv1ntHb/v2a2wcfXK251Ny6Dp7MPayMWlDG9yeyKHWz+gvgg83t0mNRySmYr+wYO7EOi5jEUt5xOpBXzx163xE7VSEVoLhMc8lwsJ2znxTW9Ol5h3jHAQHyDf3PAwJHBvY7VTIonMDSRTcTtHoN/ZQ/vHjZcKvGxzN5NWQzci9mKua3WKZxVZrzeXbLs2uP7EjHKBCKdSn+klV6TqxAbX9IupDuZZnlTIG7uOpMmBFxrNYucDVnE3E1DI5K/pgGpCovf9M1KvV1S88adX34wxLsK9cVPO3H5vGBQvx7wI2iH6iQwtkhHGGEQcUC3m4f6M+IH0iqiLhYc+zS3jSdXy+/BGTg0wV+KX9Kygmetric0/m/F7hMm51IjieiNNc1axMYaij3qP3bgmWwj/6ktVEE0PpDUs2GGZo6r8vDnhobdxZRBzSddT7YPfnCF5ddjO/F3cP3fLrAT3Rtd6Mg3tyCdAT/aDqAx3L9DwuVuw1tS0HnsqVvMftCwo802muaLJgn/FC+hiUl0Umk2nwNzL2AWXUYxGof5X1fHBYcg/zwnkUD8dJegR7x9y2el9apjSKOScDn5eIL0qF8eu5XasmUbk2oCnZxefc1BHrCudzZbO3DAZw2HM1/Wo3vXNZS8hnvPAquMJu8ehFcPVakBQEDC9/pM4sdhD15dX1jl1K/KT3Cdr5tF/mYSlJSHSi3Z6i2nLiV03DGx8L5rt6QQjlUEXIHY3jvDFgIwqg09zDDSZUZrucbEpXbmt4t84YgDNLAMSKZBsyVhzkleMWbVLt6K6WSlKDE8CrUFYDQV2wKmy+T0lnUpu","layer_level":3},{"id":"3afa3734-4ba6-44a8-9b51-40f5110dff7e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"会话管理","description":"session-management","prompt":"创建kami_backend会话管理的详细文档。详细说明用户身份验证令牌(JWT或自定义token)的生成、签发、验证和刷新机制。描述用户登出功能的实现,包括令牌失效处理和会话清理。解释认证中间件如何拦截请求、验证令牌有效性并提取用户信息。阐述令牌的安全存储策略、过期时间设置和防止令牌劫持的防护措施。提供会话管理相关的性能优化建议和安全加固方案。","parent_id":"100a2b02-1888-4c57-9cd1-b2492db9671f","order":2,"progress_status":"completed","dependent_files":"internal/controller/sysUser/sysUser_v1_user_login_out.go,utility/token/user_token.go,internal/logic/sys_user/sys_user.go,internal/middleware/auth.go","gmt_create":"2025-10-08T18:20:06.2101349+08:00","gmt_modified":"2025-10-08T19:03:57.4518201+08:00","raw_data":"WikiEncrypted:0Uk4p/ZIoJw1paXZ+Fb51ur9+BiJ0NP0cT7pD4QVBe+7MMhlz5M7a/p3drxSwSHvY8dFGDqDL1NRl4IgWhD1zXBn1GX2bUFf+oTxEhJhkYDUEYNU4nAACLzPI6gYMpw5QuZ1FZd5Bfv9+JPo8JUI4/Wsnw12tivlRmPEWuUj2hS/gIdfFzjw33l92TOweftqv2Or+uu92XSaClg+hTtpkPfRQ63ISdketIPowsTblGDxkEJW9DQoG01H810yoQkh97osF7oShLX7rTAqICvr393BB2UQO9dczlsDlAONcq9XmHogAGNsXSc6ee5PXC4RedEYh2856MODoJZdInm2s/IPVcAxgetGlgi7JwOCSuyGfDoisLCkTrycX7msEXgR6G1Ya/cFKC64K9k7b9c+hZKvWQLqDEm1LtVtUdng7zKto7hDWCexiw7A62sSPiJCMM4AjsTj+d/6qUCNOPIpMJeHiTzUumQGyjuX13AX7KVx8X7jU5gzlLv8OxgyBstD91uvBqMkfrY4LTJrSMdXwObD0CyWGCa5dXWtLx2tWvBd7lbCjZtvKzDOK9UaOg8/xCORlP0hX4sRMwNjUMAH1jFyEUxO12zItHHTYuqU4bJyCsYj0Yxrbh8xg/oKxLH67+JkwTqKnXOG1JXHpavpa9iMp6IM1SM8PMYaYIucJ8+FeJP+I0od6rjxON8kaZ6Nto1dA6oQl3JVHSCUhVPriTHXURowCQsAVK0zHULWLVRzwBjFj2bM2CuunGe8q/wzVflGRZzu6mmD7aW6pB7y1+XVyx31rdwZ0vznb/YlgpS+/eCh55SCgUynS/chV0HlZBfhoISANahRO7FJW0ei9/Jov7tdIIt1K86McWKL0QDBGmMqjLLtRuqYdxK3H5tmyBWuB2k+BR6VVJvTUsfElTXCpzsqWIGrvpPRvutDudUGla9WwmG+hzOe4zFEW+y/6yY6qzurPLhfxcuvt7Q/MAV+wyQ/UPVTlmKJlXxn0N699jJrNZTLNWjqlgOILkpNlBMG3Ic8iKMNCRujrINna7YGVF5yHCPXMy2zZA+Rg2kc9PwDJRSRiOMhp7aHalBcM8w1Jq6fAIx29mUAqkVhrSu43W2H+UF60gQHvVwAb7cSlL9JIhIMm+FLRQ30H9E818+NAlUrdM4h9jOZY9G1Fe075L8z9cVHAzmqSnnrItr/U6ULv3pAMm/cP2oxeCAV","layer_level":3},{"id":"c451bf06-72fa-4bab-8483-af4aa07d4047","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"权限策略管理","description":"permission-policy-management","prompt":"创建kami_backend权限策略管理的详细文档。深入阐述权限策略的动态管理机制,包括策略的加载、更新和同步流程。详细说明权限策略的查询接口实现,包括分页查询、条件过滤和结果排序功能。解释权限策略的持久化存储方案和分布式环境下的策略一致性保障。提供权限策略的备份恢复方案和迁移指南,以及权限策略变更的审计日志记录方法。包含权限策略性能监控指标和异常告警配置建议。","parent_id":"19fa9669-f28a-4a88-b0f6-b6039eba9dde","order":2,"progress_status":"completed","dependent_files":"internal/service/sys_casbin.go,internal/logic/sys_casbin/sysCasbin.go,internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_search.go,internal/controller/sys_auth_rule/sys_auth_rule_v1_rule_info.go","gmt_create":"2025-10-08T18:20:07.2324325+08:00","gmt_modified":"2025-10-08T19:03:58.2856456+08:00","raw_data":"WikiEncrypted:arCjhUL6OOP3tq0tMlrtoLDUXcFN5JXkHFkoIAmNJ1/s1y5qg9P3LBm2T8ID5ZgmWBKUZ3Dbc60bKc98HGzCgFy3CL6WPzz+X5mP2XoNn8E846x/EhAJdQZ02CvSPcKWPjLrj9WB8eoyVAuvgRl8qvRfFLq1eqvUPCEblXl7axcaXWZj0WVsktrtxjeP/8QhdCub63OC8xdv5YBIqFSFE0oLTHE5odO61XXDE3a+d3HsN53R9hJ+10EH/5OdJhONztMy8eQQaZfon0pv1NWLPRZnis8kO+9Z9WH1i6QrY2zlOkpNdkdFeCle0QOSVdh9sGbtL5aL92/dC8NlHB1ObwAUA8FXzrtEoUSOfuDMKZBr9vKSMJKjOtv3BkSDfVryd1MScwzyjMLbWW2LJSOTsFwnUPs6gU5Oi1YWEkIfJw4jNvAtLwjPSYIcy/FLIwjc4HYzUTMo/7SEue6uUy2nDRL6KKcv9ct7EghLzVG0vkdGSZOIHjhw+7+yGiWt+W2nJX5hqcTUhN5+Ts0vQKmgDI722zqHvkU8EugwGYrYtXVx721cK2w4UnJUu4EhaojW4NCIjr2EUsOYHQufzp2o2PH6xB56dIfdT55XaRGx9LkNO4wwDfy+82V+8xZpk/jkuTb3TGmiXJutwYEp9GKfv8iR1GvwGL6gD/GWgCFGmL2QrbD7pUAMye+/xftFOYjEWIA+U4Jsz41MGPcaqDUz5H4R4vMvPmqmNPN4oa+1SgSKTPox4GxqWLVB7zpYFECaTCYa7jDT93G++8fj+ylqpmowUhayRFsamEpavdXx85/5MTQ+rC+BhHRWd/N40oojTXddOFBSKH4Y3V2+jrDTxrzy869oxTgbkOHWzNsCM6ogDa3eFzH1oyVBAG27NWT38UsHvnsTDOO87YgjDXblTftC2lgQrc4JrcG77dHDTDp+symmhHngwOpzmCTwkkcUVCo8aoCNWHSBxxwtEWx6tYhZqR2N5JHuJHuBaLU1ipUc4OhJsxvZ8bRdU/UqA11Yly3oVljYGG5C4fzweb3yB0/Z4RqWP/jeQu3Q8NS5CcYttqraoI956pNJzJPnkk7TGBG6pbhYSfLP+86O3pRo9XIpqTxPYPbxTiBp1B4iCcWbZ5PpPeUurauBX9B0scUjl4Ct3C0W/arnRx5JKF9Lp1l8QajNBGdXXmWMm4V9m4k5qNJxVAv799478EZFGRN6UB/aKkW8rr7emXxhCreCL0HbB/UPg14brYONlQ3CHPhZ3Ix1nPJ+zeKVGWhn2GHxCuk/hGvb4sI0IFpRyQYTbSaE4zRaDYzMR0mxPeT+qOlyX1eGZfjLwsZKtkl6F9WcR8EoepjX6l/vvh2R0Wid7Q==","layer_level":3},{"id":"1ae4d8b7-2b66-48a3-a8a4-07bed57a2696","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Apple卡密配置管理","description":"api-card-info-apple-config","prompt":"创建Apple卡密配置管理API的详细文档。详细说明配置获取、设置等端点的HTTP方法、URL模式、请求/响应模式和认证机制。涵盖Apple卡密服务的各项可配置参数,包括充值超时时间、回调重试策略、防刷单规则阈值等。提供实际使用示例,包括获取当前配置、更新服务参数等场景。解释配置项的数据结构和有效值范围,提供配置变更的生效机制和验证方法。文档应包含最佳实践建议、安全考虑和故障排查指南,特别关注配置变更对现有服务的影响评估。","parent_id":"65e19eda-b904-453d-858a-07d58ddf98d6","order":2,"progress_status":"completed","dependent_files":"api/card_info_apple/v1/config.go,internal/controller/card_info_apple/card_info_apple_v1_config_get.go,internal/controller/card_info_apple/card_info_apple_v1_config_set.go,internal/consts/card_apple.go,utility/config/models.go","gmt_create":"2025-10-08T18:20:13.0698586+08:00","gmt_modified":"2025-10-08T19:04:12.3511503+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBuUbm3n/HylwaNIVUMKnhGi/Hgcopm/oQ4lcWfRCIkkHsiiTeu/ue9QAKwdbXpDBVY/P3Qigua05nKAQFPAwVn3WVT6n8PyrbxbmWxlX/Dr9E8oxhzTn5RaBjXjsaww+IOXyA37lEwC4a5tWnw59MOF2aurMPzaSawPSQ34tIgQmu6Qn8ETjIv1cwEItfDy7Ibtlk/RELXp791EI0CwKOC5X7yQcy/Qgwcm5Nr18sS3bULKQ/1RM1j5/Q6iPNSTKWyEAHUgcC+hnoha/jhBaiiBFLTW31hjoUkzVARhihUKc8bjyzsobI2sDWbda7c+fh3gK6rUfQevMI98h/QP43OZl7Ve8M7Cu+Jlj0vxZgA1WeGa69Rsv4nAcbWfTor8uO1utjzDpJauE5fRbsS4/FlayjbskXg/O+QtyiBEqB9equauoZoQ+ZhoxvaujE1dZOJgB0N7hleHBoPYV3LNI57UtJs7BBHTtdU4F/DgWAYMf6AP86/SGiGRIoaSBAiuXF4D+MuNmfIDZjvIL7N7tboGmG4HN6ngBGx0kfwGOKeKq1ZEoOKgLlZXQ51o0O+K873agX0cfYx6P2sXT55QpyKyv/EoPF30/aM0z7crEtLJrs4tBHLKQIuiKfjA2Z13sChBPIFHKYCsO9M9ly/Eiezx9jmuntNp47cSCZM0f6uRGaaI1/aYeftBkRAV5/hhCAfq5fUiE7aDNHLx0fpwpi+qMkpl6gqwLIcL4ZMPN8yPPL6RL/mdDxq3I72ZsDGUYMOfRlDFZKExEHZDRy7Ic89Wk+mEjZhTnZec/hEsoMan6t+8CIpBHoRk5axvE2mgzY68TEDb+UykPBvKFbNdCAi5+buFYqIR/So7EEbRfJiZY4crBbwR5YmbmWMvK8KIPYsC1cXhhMNKP9LTFDi9kmdvQWq3woH0ZFxMNM/WG+071k2ZKFVVwzTzR/TRNNAFEqwJyA56J0cQ17TwzZp7VKxeGBLI6+esXEhJScPryxNVN8hl79PFX3pj4uD/a1Mze05MVVYU2K+a8qCd4h1ZpaJJR9RomPHIhXxi1XUupB6xur+PugZWExABg91LfdnS2CoCERGkHpDjSlBJMc3o4Fz2J7iyH3O/HjdqBDXhnY7o7GvYBFzBfr1UOLcyH6l9VQ6JHLlI7OA+yAbyB/TtX3LDqesUMzusgP/8tMhcoOrnQ1F5Xc8Z8sDKcs10PNvZeuWCkyxASCirD+bBHG9wWdxod8BKgkWhFwO3I7IOzpuGIFLmOCGOkt2YA8BrJ0KxCi4RQmgR35kPYVQlHIv58VVFFjrhPN4KESeTWyOq+ZgghpDU/ZBW7CVifbND8fzZguEpprUzAognHKAX4uV8z+4We2CYI5M3jfAWm5U4OAgE2hBFAcoNsP+YdC8f7Il8PgulhjJCUtgodbkbJWqEwCG4=","layer_level":3},{"id":"6e7425ca-8c73-4395-860a-f57f16614e70","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"京东卡密数据汇总","description":"api-card-info-jd-summary","prompt":"创建京东卡密数据汇总API的详细文档。详细说明订单汇总、账户统计、交易分析等接口的HTTP方法、URL模式、请求/响应模式和认证机制。重点描述数据汇总的计算逻辑、时间范围选择和数据精度控制。提供实际使用示例,如日/月交易量统计、账户余额汇总、充值成功率分析等场景。解释数据缓存策略、查询性能优化和大数据量处理机制。文档应包含数据一致性保证、错误处理策略和性能优化建议,特别关注高并发查询场景下的响应时间优化。","parent_id":"cf4d1833-47d3-41dd-a87c-e005c6bb3246","order":2,"progress_status":"completed","dependent_files":"api/card_info_jd/v1/order_summary.go,internal/controller/card_info_jd/card_info_jd_v1_order_summary_list.go,internal/logic/card_redeem_order/summary.go,internal/model/entity/v_1_card_redeem_account_summary.go","gmt_create":"2025-10-08T18:20:18.0239718+08:00","gmt_modified":"2025-10-08T19:04:46.901098+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBqF/AgjQv6sM0ab/eWm9Zc2i7CrUWQErn5CVnJDUSAmvbhzvUotPoOifzRMm9owTgiZzFXf8qg/H7WNy+vMKY21byd2lSmn06NgdDtFEAjS3aLRCCk8nGUvX0YWM5O+3y0Jwn9eDcKvfVG1xTNvbumyL67Azpb1QcAI8x8ReYD3s4A205HtSKca8tiqyCsl/ceYDq6Xg4nSvm0ZT21L4vjiYz2RsI6zQf1WkOQtKqEFSoeqKNcNxP/Pmht9nPJkbUtb6OguOmXiRwz8CP7BR7HUjcUKXPUujoT/Fba2zEWZMa/q2Odh/tDg+JUiWSXdZTZPwpURaAjsO4d+yn7JWxeJtGpvl5Y1+oQr3+pxgvYExfD7Pktk/0uLIXbUL29o+h5ui6SzhyNDIfNrvyy+IKj9F8IfYCq9+hJtpzO2tmTz2hS46eqoX66HxcC081e08XNsrjLF09CdmHXEwSUjZZ9gvLocabptJ/DhoKo5vFfAM7tV9T1CgDpD3K2gAusHRUOg5GLVBCjcRVippewoSb6q6JyF0Qr9aV+ktSvuiEhVc8MR27ywdDm92JG00+A4AJItDSFPYfJM2J1knKG+Vj2Jqbhlm1z0IDJ7oEy+b0y1EkpMnG2y3/+DSggZSiZbIQvO/uYG/Cab/zFkbELifNrSVrdOr4Z25EJz55VOhYjcq9fxEC0hFGLowZmWUQZV6q7yGFcj5qQcBPKz/UVyFQFTAhNIpxL0sDR+ClaiHFGwotrSeqUyPF+TtoN8UyXQTSjbdDfA904H/il3JIqltti3+FI4On7WWHgNNuWL4+GrMrqVZuR5ore24S0OcJz8OaZkAnl6ISaC1LZ/0S+Ng3lqTOxvVlzOvs+TMuWK80FBcY6ixKthxI3BzeOx6KuBhdjI6PS0gpqtxEzvXxWff2NUB9YuWymP0o3NMFlXBvJZRR7Lds9P9WfTxe5SK12GEVdWuYoWWX3HxVfOvJRIv4nsl10xQru1mMxf8f8UnT/idBs1cNJ0v4f3eiEUvrwspVYzYjbsDza7h40I9QIItp2EUVVyChbWb+wXkNF1LvS6SdAU5V9UD+sYu/GSjhxNAHNpmAKXmgbEAjDJyEH+4/WBv9KCvpujORaZcdTQoNq0U39t864GLh+4pW9SVMehu5nNNMoOJ0iG9TiwueE+kqJm2Kk9P+A1pOyGlmbPIA1BJoKKhxLe12AnelH9hPoUj5ZzQwR5mYjqsghmq428peD75K78JtJKIXtMN/Y75i1w10UusM5jOQfQ8gc72zC7MC8CmkER8HCT9017AdwDZWnRdl1Pa2g1hgaDZ+pVe1nRwcoZB3ev7N+XmRnJhAlbt2SudhELdmp9mq1/8f2A/JtkEJTMdybogDqanF1yg1S6FHRUvbjjslN/dQXeqw0LeUA==","layer_level":3},{"id":"03f40c3a-31bc-479a-ab13-e0371df2821f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密店铺管理","description":"api-card-info-tmall-shop","prompt":"创建天猫卡密店铺管理API的详细文档,涵盖商品查询、订单同步、库存管理等接口。详细说明商品列表获取、订单详情查询、库存同步等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括店铺商品同步、订单获取、库存状态更新等场景。解释天猫店铺与卡密系统的数据同步机制,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注数据同步的实时性和一致性保证。","parent_id":"4075b270-ff90-4654-b074-ef377e9015fe","order":2,"progress_status":"completed","dependent_files":"api/card_info_t_mall_game/v1/shop.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_list.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_shop_order_get_one.go,internal/logic/card_t_mall_order/shop.go","gmt_create":"2025-10-08T18:20:23.1259+08:00","gmt_modified":"2025-10-08T19:05:04.5849741+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBtDWVCx1PqAct37L9oLDN6sZVjNa9Ch3OShCJn/kzhZeficIBnIrtnenIuXfUtVRu54GfaWNfbXdZe6evvtyGUfLvBB9ZYagGxmI0e7fGNTwVebDYlI3vfj2gZZT+8AlmtTVcgmrN1XVtiBaxzwhpwmuOalDR0NLwHMiyHwbWWetbQf5t6OWMtxhbw8uR5sdShhBQ69i8kMs7gasHO3L9ef8JiQuzmZab4jt2/xrfjl4dZ0a33GiWO3s3sRpWIvHNJRIOrV6hf5IffMdcZ+R7hrSNZZScyPUg65QcCziiCn0h1g+lw9ryli/75CUEtdbQOfsVaDyth80KMQE5da5xEO5cCTXJMWgpOUz2FphlHtIWaRc4KLjTeDDHJEcsT3KcTB+HLPmJ9Bffm6bu9KYEZOiYE54St8xhGgQ5aFx3DuxS47eI5mm2c5dl70QwWPN7feFwV8k699umCHjkpBK9VJyP9Nx9y79++Lfib9iA7DeaelrZrsy5A94TSKWBeyRHyIUy//kyJR0yTxXJMl2PzYCmzhe1y6kVeZBj4CEnsou77ZBf6Wv5QiomP7c3NEtjyWLFhj6DNu0aHK7UT5xwpuTlIrquQkJKImYvh/iwUbhs2+D9R1TjMpMw5YVCJQ5q+rLJfT95TApJ0NtQ/gK23lM2fHt/tolP9xWLnZDlSWYSV6iFsNWRKoAqf9BHDgJ9le3vZ1FPEl9EgjncBN3bbnJDq9mcz5yz68bnS1Jll6eqr93nSxeRfsT2THN+ocDILhi2/m/iQ3eiE64QQD9sdieF20QrUhBPas/aA+9yyaLtKOioBS2R/6QPfXfHzrZxEFiXBgFwsq/bLVcuTePzmiJkWAQNlshCdn08Gpl6ofPGXLcaV3vjJpAzxmysSPJxfN/9ubB7na7J+oZsrX1qknTBfOmSJR5kZVH7IMJ0xvrvvjt1BHLjbLI3AVVCRFLrcA72WPH1h7pwhBLZMk3p2mL1wcOjUJbnEPniayx+ShuePbZ+pPKcF5PNMLRmoi4beEULlRKyfD9izQo73oKV33Lhn1wmk/Cie5kwEUxD3VS6F4iaXoi+GluVFSmgFF2drwnDjMqCLRfzUWAp1pnrJjRiv6TjdEfzWl8hpMkfaRrkKtAcZTN7KylwN39fXVoFc8N6mvNTPmoQSdFV7eXp0ervzriGjtKZI+kuCXrzl2ZizKg7iir7yyK96aM/gVWH9FdYboTNOtqshAL1Huz2zB+NiQn6Rs/haQcNkTjF2wimOwOXKWLFHWUPnv3KMpLZDS5eXL/T3sNHKkkwqj1ZTQN71hh7utbZNZESsx66lxlah5v6nJCuPRXBaFw5Mr7PRN2A/mN/fXNv+K2m8nSvRUZzG32wf46zNfQOM8lMSfhh5fucX+IPUbJgoZ0jy/nLoTCVmbnlI3gfTZawah36s9OLG1zOW8nU1+9wvKzzfpB","layer_level":3},{"id":"e1429049-8758-47bf-8837-ccb20524fba9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"沃尔玛卡密分组管理","description":"api-card-info-walmart-group","prompt":"创建沃尔玛卡密分组管理API的详细文档,涵盖分组创建、列表查询、统计分析等接口。详细说明各端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括创建账户分组、查询分组列表、获取分组统计信息等场景。解释沃尔玛卡密分组特有的统计功能,包括分组内账户状态分布、订单成功率统计和性能指标监控。文档应包含客户端实现指南和性能优化建议,特别关注大规模分组查询的分页策略和统计计算的性能优化。","parent_id":"3e149bfb-74a0-4709-ba69-06bd7c5990b0","order":2,"progress_status":"completed","dependent_files":"api/card_info_walmart/v1/group.go,internal/controller/card_info_walmart/card_info_walmart_v1_group_add.go,internal/controller/card_info_walmart/card_info_walmart_v1_group_list.go,internal/controller/card_info_walmart/card_info_walmart_v1_group_stat.go,internal/logic/card_redeem_account/group.go,internal/logic/card_redeem_account/group_stats.go","gmt_create":"2025-10-08T18:20:24.529012+08:00","gmt_modified":"2025-10-08T19:05:31.6202186+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBl7AFS+0V9EBoppO4IsIlgmsc7A0SALqjbDeilIpHRL6DsPwTdRjUHYClnmKJSuNfACUdp3TkWYbmYMcAGm9QFylogt4mb2yDTK0EN/YLlt/RBQR5SZ5V/KHZILmc/y1KU6XVB6sUYTM82cUmNQnYJGXhawqUhz9I9sjWCuKFxN92r6Ts+uEomIRqNu/nLp1DP/fXR/mOoM/aL/nRdvof1psvVPnHuOq3PwEE0c0Hl0GJz5ZjOE1tuhqSyLAbG5/z2gx3mdUK1vPHi2QuksMlMBPg/06zzpUyFvktulAD2TJpcvz49m6i6FPJti6DITE/BvLQkCwmynKNFHOlZwhdmK7peCkOww6N9EbHudcCRtU/FFyiqSV7pudlOxijj7dyrPR0WaptsYxGjWxXYg70vzVBWXg4baAVjJOv7cO9T5WNxxDhRhnd7/VHAyAcxadzPC/kpSV0f5HZzQbjuiCCG4igGvWZnvD/DXSZDQVz/fXO4DLHglL0OiIqBsp63nrnxLcIl0cTYFEByRa0MWtRBTHqAumz9SkyMtqCZCHtEduLIvSCEKn7tdDNyt0eSpjQjkdflGkrzxmBEQPlZUfmVUJ2leNHBhkTHKOT8yDQzMEdxuFPInwNF+Jl7eLrZjAZPqhfEm/t4WEWxqOsqPa/E1/kiJ5Pk7YrmdqE9+mWG87PWLlh9ex0u0lKQ655K2BOzxxvnrSiMeT8pdZRtI7hK0SxAvC3ARDNt+eFmV9sH5hFs6KNNKmeU21CxBOja+DiP7gkwaFHRJJuTPYBWogRYgUzm180wMZq1N2/UvoPNu3Fu1Kyqpr0vsPi0BdEaclfsJuru6qg6bV16dOiYW41Fy5HO64a+GwP69rp+vdj44Q1TZO7e9JhPhTNH3T6o5fORtAqUlC2Zs4rBQOlhYbhl5fooN+4HfqjQBPYnU4lMQrbR3dbhX+mm2c8pjcOWODEF9nNmovrmY8sLff7qYbdHpgsBkWZ9D7LKlPEANGF0psXr6ouYyHA/+a3HceDZCJ6yXv2XKSgfni5u9x99WpRFCth/GcKvlzJou4D8ukkFuR0lFo5W738+St2i+O3SXhiGn5FagE/jO6SMOy8g8QnxJpxRrku66rc2kbCu4I3RSW1dXWk1L+Bexw2BUqUhsMjWjFkLVIl72YEac2I2n77kuEa+sUa+OscA2Uih6FeWBvnH/CkPR9cMPk1g/EW50Tll683aCYkQEqeyW6XgHf6EW3s/bCLbnFX9Zdzn3wfuRdomyBLf/sNKrWMHW4+KJNeYPvhhlXK4S5Lz8aGlfgGxrsuh2Vhy5bC367+Lvk695IsAYLi1b5PVIk+UTBVEsGflVvZfaNIvLDZns4z+i22NR6V4AXyry57N0EGLATzIKiiIbKUHtr2pwj06mnJoCJ8y+8DtdT2VZN9by5vIfsmkiOF1Z7irKQgVA4Y56qa1nuKZhMlKFY3IEXNhUIzFo83qfMw6w+3dzuELr5iXCHZOB7Hq4y9t1oKmw/UIGOw2qXtxKAJonahaTg40BEdOGB/ghKpe3uvjVtoGtCTjlgYP276fVmezwd7jeAQOHteUPQDcilw51riNjd9VUdCaD01w==","layer_level":3},{"id":"50d76878-7225-4bd3-b576-e901cce2aeb2","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"缓存配置","description":"docker_compose_cache","prompt":"创建Redis缓存服务的Docker Compose配置文档。详细说明docker-compose.yml中redis服务的配置,包括镜像版本、端口映射、数据持久化策略、内存限制等。解释Redis在kami_backend中的使用场景,如会话存储、限流器、缓存数据等。说明Redis配置的优化建议,包括最大内存设置、淘汰策略、持久化模式选择。提供Redis集群模式的Docker Compose部署方案,以及监控和维护的最佳实践。","parent_id":"e198e011-e613-4a72-8920-6d411d5a8a55","order":2,"progress_status":"completed","dependent_files":"manifest/docker/docker-compose.yml,utility/config/database.go","gmt_create":"2025-10-08T18:20:37.3476312+08:00","gmt_modified":"2025-10-08T19:05:35.1456185+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kAZDiR5uyhkNoy9DDL9YABhaEGF21FDK2lTOHOfPDhj7T/FDn1Ku8tga0alrgEkw/RnLRX29SXM2cScpouF3wTSEeO65NpPQ3qqRkvoVmI7/Eeg0bM/cK2Jd8E6G+CfBMqrXmpBoSlfnKbzufPSADPQZvbEn9P/riWA9fe9D7wnl7nDDdOyAETPdiUlfUJm0zdfQTXnm9zI+xF+HDJLOPRbiCrOtd3kCj0kpsHPy1dyDK0LhX53PpQrvYy7mVOznIiAMdEi0sxVdvdoX/hJ2mG8QALG9fBdajYUdDJJofEnYoEn+pBMge8BFflGFtG+8KDidpc+Z5MbIcyZ35zpuG/L6+UnzjQqYYmL0hY8Ii+zFjMDtyqWBW4QQBWME7ad1l2KdOSYL9T39EG/6ETY7nKYnrToEXLMH8diq8/LiZ8wLQ+DzXv6eTXG+kmCbkgICkwSRrJ/bPyeOe79Rz9MUJSUA7VflvcUO8U+LlJxpWGMQGGSSkqTs0yFP1zBHKLLJZQEJLrwPnacqmqi6JipdZRnDub9T/812Wb3XrCrmTaya1QcyE6gxdHBdL3c7it5mfTFia24pNkk6uot8k2m5242PnN4Fqdp0YtnhZResM4sFUc7qlNTfjzfUxafk5AJgP6lzaFJsnJf2I71o7DbODP6h5yhF0V5h5euEKDwfCic9MGwS2uVK251XZrmCLrZveGK6yKr/yZMKPOfF2xj0Ybp2FaLOlFw/ufSP8i/eNEvSs+p1uLteKwhCuM1ka3iRjtq+BboN+u/1EthGBUXo9c96Rh838yBDN9cxDVWypm4OazaaN0+SPOzlW6Fe2+7tOxj3fylS3oyDM0KC2YkRchVp8ouMtW0P3dXAXWNFx+dEel7qOuLgfcRdOdkrQhfAsbwSUcjOuksYygd1j4gPTTxYmV/Coj4nzMfaOKq0seHLa9x4VDssXqM4XspnrDeaUVYziL0OeyBOfdlWTA7T9aR8+aCSAnHbBkQpqj26MU/V4A7qmIX6I8hjA6yAtuZS3GvtdbIM6Pr2+6b9N71D40Y=","layer_level":3},{"id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"数据模型与ORM映射","description":"data-model","prompt":"创建kami_backend数据模型的全面文档。详细说明所有实体关系、字段定义和数据类型,包括v_1_account_info、v_1_order_info、v_1_card_apple_recharge_info等核心数据表。解释主键/外键、索引和约束的定义。阐述数据验证规则和业务规则。提供数据库模式图和示例数据。记录数据访问模式、缓存策略和性能考虑因素。说明数据生命周期、保留策略和归档规则。包括数据迁移路径和版本管理策略。详细描述GoFrame ORM框架如何将这些数据模型映射到Go结构体,以及DAO层如何实现数据访问操作。","order":3,"progress_status":"completed","dependent_files":"internal/model/,internal/dao/","gmt_create":"2025-10-08T18:17:58.1068259+08:00","gmt_modified":"2025-10-08T18:23:37.2012286+08:00","raw_data":"WikiEncrypted:klcgW2PbPxJambbKMzvFtzKMOkAiMygw2jhMWheBgWhHS0ysjoHIU3Uy6S3gbW6J2HYz34aq31fCfllEl5yZosBIZL9sPTAhqe19ahiAHhRgPjI++Ivaq5sc5HNEwwcfMAjFymowm3ZsUEPrYCLWtD5X4F/uH/m3nMhrErBDqjeO68Xb0JZG5jiZXC8y2F7KFZKKM2xp/M+hstmqluZtJ6KG4457THlnY91B1gXX1rk/K8vL663Vfm4CZ+mq43u3JdD/DllUOJxIb5NpRU+McTwvRXc9Fucj95BFU6xVLi9hw9unpfuFMAubLRY2YDgB/iSScxmevE/oGG6erBBMxCoyAb+2nUf0nMcbD4LAGMC1OAUOLRk8/nfQ5Y1SU9f+xLPZLrYEkfnLRzLyElg+9xv6dZWZw4SARzUC8PhHy2v9JvLNGfIeb6F3I8l+F/8wJVC29T4iD+D8mhBrbWkWW2R6HqX+dUaQhbBz6x/eOLi50zx2piHZVTs+2iLpM4U/ZkWeQ+B8vQgPfnOWNrpLZ5FEBV8eB+V+5pO5VMLkYdpJH1okWUH+erBYFoJijVW3LHi14Co4lZo5qAqrSTphTon4Xh2rTL1VaC4dE8dwtDzsPulznMzE3y+typJiGSKqAcN7XETO4CKaci/2EyQMXY9Ql2F9ozwUWYruuFUa/bil366qjzMsV2s9ai250QGoEew0S7mZ/1CvNX6Ncz+Y8CKoJnTme2Ft/gmtXuXvNzMD/98spQ4WY9KhjNFmbSqfpq3hAHdrc4LHq8ZaDiPBm/vqJxmb+0xzb9Vmn74gHrG6CNe6vaGSdfzBgC8UVzZ/pmLPqi832ZHdxDRqUZFQn3BcR44F0EfCBVxZFDyi218y5Ij0rfbPj99sPjAMPLAysXNg4wc2BJe5JuBx1YN6GOnz84PObu9tMF0PdNn1tadYZQ0cnFXhuJvNdXRxAlFpQ8L1pTRQLwEmf+CMb0WTrKLzgwU01CkUWbDjkUyb+5n6C2IVCHMegDVoj2FQ2gZKYAxrct3oLE06q+36eaFMv2R5K0Nwlwz+rraMIxXAt3XhjhsTVfOgXjXuYKBcBUHmp/eXlQKx01ArdszyaEallhtwmW5BqT92x7nNZB2Bl/5Ggwanu8FtgebvXEAoN3q2vdrCfm1sfEWAbSfDgFqaJjGNlYlJDhKqCZhbDRue1Lx7PzqwAVzZ9cj8vyid9P0L4dREovmDrxLuoiRem520zYcvnvj26Sb7eliqRTcDtaDmWCabnm0l93uH3ta7Nii1"},{"id":"6d13ba87-5f1e-460b-85b5-9106d41abbce","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"风控限制逻辑","description":"restriction-logic","prompt":"创建kami_backend风控限制业务逻辑的详细文档。深入阐述IP访问限制、地域限制和设备ID限制的实现机制。详细说明限制规则的配置、查询和生效流程。解释限制记录的存储结构和查询优化策略。描述限制检查的性能优化方案,包括缓存机制和快速查询算法。提供限制规则配置的最佳实践和常见使用场景示例。包含限制逻辑与其他安全机制的集成方式。","parent_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","order":3,"progress_status":"completed","dependent_files":"internal/logic/restriction/,internal/service/restriction.go,internal/consts/restriction.go","gmt_create":"2025-10-08T18:18:19.4913589+08:00","gmt_modified":"2025-10-08T18:33:33.7236149+08:00","raw_data":"WikiEncrypted:rmn9+OO+cFYNLeMVIfracfb63BkhhjJRyqXSuaq50u8NkbHHDfDUH3Ca5Nzi7BICsqkkjM6/JbGxGiDJum6puODFwc0XVrFGf1U+T3ppY+/l7ubsf7Cq0hWzVGfofjO8CwBujarPvK9ExMiTDu025Rwb7jUN83Lb/JtpO102m/RriiKTWdi9aNMMkkp3W1AiSykNwum7Y0nIkZrCVumEqNV/igPyvwAD93jEa4oNpXCarHJ8DcdrJwfPvG1U3r65KvfI6jQostXVwoJJylWNL+CJOyoYXBZqwbZZ4UomSfq0cn02py2oooaRW0XhIus1SDN2j65f333RgJCZjNPkF2JNAMF4diAzD6A3QZHj9M245QSoYy0/jB5M/CWJ/bvbf20OMhNV8ksFDKZqZ8vNXERLVA1Ji6qNFmyoBuojPd+ojKjfbXkFmHvKRYQSEsK1CrJ/o03kvEDiCyCWjWqGg1B5/kSYC+eUhE9akwTemjnQPmiPwDPyBhW9GVqAgZpk7/W3gEJz8sIba4wStaHry9+Wcvq4oZGOcxL3eccP6Cw6xTpstRyPkn7bQuS/B1+CghM9X5qDMhZcsFLAVmXBmkMnUckcRmK6BFd6AZADu3Pn9lqRed2eOoOkjCT87iJCw47E58Rm5AJh9+zo6JSiCHhS/C3C13ZX9LGMgTyrisHtz+73RbcV30J61OtJbpAu4GtbyWNDhSc1k4uanUxHKDQvgligLfogEbLuOB4nJB6ziKC6Ho+xkMdnsk5xDHr5+RWwDLHGQ3NLvIKl3eBRjKOM0zu9DYtTytEQVHLkAwDQUlaRz1w9FZR732JXjtbwR1x7DZGiSUNNiltyTZNlpvBQ2iCPqbTZ2hOAdetVTrlCqYfOBPpeOQ2W62vYDXNzO5dn+RvQU8N4Ullm2QwmoAA+0GnWE2JrnmMXwmjcHCvQCWRFuPtD6FAl05M6Bj4+4HTrCsgpDtULVpdsgilGafLN+ARsqMvPjZRZnEc0fJM5jOhW4w23RWJLz0r84z9x0m4Q/ko1yBSoLphHozReNnKcjztw+ayMsmwD9pUW+AIzVxamjFjXV2B9cGKmIo/h","layer_level":1},{"id":"f04a62bc-4cbd-4707-9c3e-ba4bcc54c7b8","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"账户数据模型","description":"account-data-model","prompt":"创建kami_backend账户数据模型的全面文档。详细说明v_1_account_info实体的所有字段定义、数据类型和业务含义,包括账户标识、平台类型、状态、余额等关键属性。解释主键id、唯一索引account_id+platform_type复合索引的定义,以及与用户、订单等实体的外键关系。阐述账户数据的验证规则和业务规则,如账户状态管理、余额变更规则等。提供账户数据表的模式图和示例数据。记录账户数据的访问模式、缓存策略(如账户余额缓存)和性能考虑因素。说明账户数据生命周期、从创建到注销的完整流程、保留策略和归档规则。详细描述GoFrame ORM框架如何将账户数据模型映射到Go结构体,以及DAO层如何实现账户数据的并发安全操作。","parent_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","order":3,"progress_status":"completed","dependent_files":"internal/model/entity/v_1_account_info.go,internal/model/do/v_1_account_info.go,internal/dao/v_1_account_info.go,internal/model/card_apple_account.go,internal/model/entity/v_1_account_history_info.go","gmt_create":"2025-10-08T18:18:21.4173097+08:00","gmt_modified":"2025-10-08T18:33:34.7186544+08:00","raw_data":"WikiEncrypted:3dIsHCE5EGeVKP2C6D6lOCkvNeCOXjZSxEjRTy1S7+/QWb+uLuqEj23E3Do63zz/VSQitRzz21hs9T6IKnBpbmFXXMfSvZCOf+XeR2xuRYb1wH/WgEYG1zwq6ZO9CTp5cMDe6P1T/h6F0mbTsnvCrSvEKO1R4fPO1j5lneD1/OwacDkV0fCoAoDz+bX0fIwhOjm/TH6hjDIgEJxqPJX+FgDC/cj748gYlAdIVVehBDfiZ2A0qRNeJ7QLMjxkgtpMDnB2iX4uTRow/hXyREEEK/kCS3G95VWuqp71XOAZ1Ez6C63OQ3cIF8KqI5pxvkeO/Xv0KaIrRRsj7AE+MB2EYoh55cH1jek5Iwn7tP6HRyYfnHa/nnO1xK/+17wlcLkf29pTGgu5PLrzj0+uJirjORrc3SJflFtiR4BSzSrSEdT7PNVcMhc3fViku3v3GUuD+56BPacBo7+KZLI6nJV+0qHbPv4ENuxHLu3TxQCqgjwJtscQ0GjsZFx4wm5+jOx20DHHQaOFsUymNgjT03Si9OtMZPnSIJSz5L0ypcgifxGHSh5D4PuO0cxVgWA+xSyOLnx2WRIIHEFgXRdGmwzvx3gE5/4EVh1ezImJ+4JhY0/lOuvWaIWFANAQvxBbcUAPiPnzlwcMWHEk1kPqmQ/LEIJRBQY1N8JxaqtCxaAUK+Bp1a1Ufr4cDO1lMI4Jjk0Q6bP6gpuSkETykx0rxYSvhzQg4ZwdG536wrJqFg0GaMMMfXJlSIeBh0r53JKdO6+6/km6NM1JYA8jFgychcjGcay6DvFDDgNCfSTJClp3sZybNIbWNT692xtrfAL/tLvkmM+WPGdIHIaLLD0OU5jacGmK0GKQwUetfgUG0KHrQkLe5OjN7j71O+VP0EokXMXnF7UkvBFEuXvjFT2ceyGAmuG7NSdtryzFM+oJxhzvS8ybJd8MA/cyDsij0uHnD4dLoQvc4E7Ree3BW5QEAIj0zfp2+dZSpkG1ynDuLVc70jV+eJX3znkvFeTx1nAzEFzeyiKaD3CsU0LZihc2TxaPMKtslWoGKelrGN1cPJsfwpuxRemP2rVcLyldPD8PH0XCT62SmfejaULlVU+zpO2za4huGsByfK8xYeU+tKUJ03leKqFSC0ql/ggakUhbQ+gaID+PI3Smt1AkdzBD/rRQHaNGS1XSAeXLOo4xclv0Bg+6VFm0EStFrMc4K9uSlfje37HPvFh1IOZK6y2vsZE0kr1FgcFl7F1F4WKJeOm6LsfaPWfjvwpcxt+Kd1JoFy+c1ixuqNFpT9K+4fsxp48ww3R7+FSY/7n/vVJFByuMerlKpU0S3Ad3DcoRg8SUs61sHHrIiyCd2LOZjvw4cTQwm00dYZW/M+1BNHluKGWH7bH9tMOmV2EZbRGkdB4kMfRAiZqgR7+E/fa1IWyBA+UROUr2Py4e4ao6WMhqJMwG+s3mMH4FkDfCuckeqje5zrUAlB81rWBIA7rlXui9i2eAIe/jQRlse1kP7mCieLhwFHXD4tGmzjXMdL3TaFP6a/ZlJw3rS70yZnloNcsJx5ABM2vD3qKVomGE6SJ9405a93VNO+tSxIQE0VwP5baf8Vv+9WzExpT4NhHCYs3htDB+2RtiPJXFL8GuS6UhD8Df3D7fzUYcVVU2vjc6avg+ekXV9k15VzJRY4fkOwo16GBMhz18wToI2o4TQ0HMlFOBU/6UBCh2D+2bxy4F9YqYSZvDNE5jhg7gA8yngafc90aA7w==","layer_level":1},{"id":"a2cf591c-c32b-481d-b282-9aa974785e4f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"商户管理API","description":"api-merchant","prompt":"创建商户管理API的详细文档,涵盖商户配置、部署管理和盗单处理等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括商户配置管理、部署信息、盗单规则等接口,提供实际使用示例、错误处理策略和安全考虑。解释商户多租户架构的实现细节,包括商户隔离、配置继承和权限控制策略。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":3,"progress_status":"completed","dependent_files":"api/merchant/,internal/controller/merchant/","gmt_create":"2025-10-08T18:18:22.8530592+08:00","gmt_modified":"2025-10-08T18:34:16.7566714+08:00","raw_data":"WikiEncrypted:BG3lFnKLVTvBR2vGYwCPybGcuuvxRs2CfAl0PFcG7KpCNLgP8WOvFGabZLnsy2GsEox7gQAXhOjRTiMKQFzbYy/K9GotmGX2DI90LPZsAe9sSXhANcWDT9nqO0uGP02OTRTaU91z8NAKkJzcQCy8lC1wHEYEHYcWf2Lx8YWDaX7dmfJr9Py6QmhKrP7IiXXndM58ObteVahcfVS9RkUFhR2ip7tsNTVUDpwvtYtKD1jquWDRzjcmvWx3hCMXwiHOKKnvVJKzJ57Eiv5h6yBL6MA1AVQ8cz4wASjv8ELaAah8GB2VFp7+UuNl0h1Om0WF1CkUQDZ+C1+4LU6Mv5Hj7rRrGCz0Zopyo8fAF+VJBGLijJ+uszi1hpN92Sbtam8Qd5uzNQalK55BPCCDCb281/lA73rAZVZZQbe7RlLv4Zi4xEw+OgQjuu2I1SzSq0+vu5JOZfep9xjXL9ULwBdna1tswOf3w1mpQo19IRcjaROAJHtbKF+hbDSCi7vS038aD100gLwN+uG7ZQfgMRVr1QFURn9cVHuyb26Z9NLxTwGHUHj4tDhqXPa6uUDZBbTMGF9R+Um8Hj5ARPqearUCzBD3vJig5KF1yeLYcrGh+WBpXpyGD2wlqNWsxcppyRjKz88diapNRnTa21zs9oQpSSOsTfAGUTQLpQvsSaV3kLIDV07sCC4k4fKapYgoCCMeJmpNqAPP/6M7D0raWnNf2DOKMQdyWzbfn/upcYP+lX9+X5uEzBZv6YzEBQYfsK1Ah9FjHGValRvXCKHFFSgmxjcfUEHF8vxOHPG4ODKAcjLz0VHQo3Ec/EJE67BXpVP1rEz306Io1vwGLsQc3YF1qdDimMKJCcxgUSnYjJyhtHOHNG17PNQfNwOOf6lLJsEXjn2jR0mO1/3hgpgxXMlv3tQHcv8aFQ5lyjjuXFjies/ZQOnLQ5OWGOYUN2WtrxyMf0OA35tMf9WUgzkIY4uYeqNskZqV7jQcaqB9OTOUmVPO979hfZZemNaew+jBfMu9Ib3NsGds5XeAp+ep4qMyU+NErQiZShZaLfokmfng9Pb/OYBWHCwMOwvb1TVpcoZKxBQKCNSo/8y2YUOQiUrlng==","layer_level":1},{"id":"cc885279-4c8a-49b4-9404-36f4d66b3551","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"双因素认证","description":"mfa","prompt":"创建kami_backend双因素认证(MFA)系统的详细文档。全面解释TOTP(基于时间的一次性密码)的实现机制,包括密钥生成、二维码展示和验证码验证流程。描述MFA的启用、禁用和重置功能的实现细节。说明MFA与用户登录流程的集成方式,以及如何在关键操作中强制要求二次验证。提供MFA配置选项和安全策略,包括时间窗口、尝试次数限制和恢复机制。为开发者提供MFA集成指南和用户体验优化建议。","parent_id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","order":3,"progress_status":"completed","dependent_files":"utility/mfa/mfa.go,internal/controller/sysUser/sysUser_v1_totp_set.go,internal/controller/sysUser/sysUser_v1_totp_image_get.go,internal/logic/sys_user/totp.go","gmt_create":"2025-10-08T18:18:35.9219091+08:00","gmt_modified":"2025-10-08T18:34:59.4337789+08:00","raw_data":"WikiEncrypted:1mQkBhU7zMZB1o4VXQ0tIfCPNGelihAe1OHsrdClRIeqyrooM3s/X6t2e/65cFvRA3wivlmlEYtSHLhr6beRpNTaPYgjZfzEefiNa064drVQuuctg/mfwIsGR35APO/VDcX9ZFkziinBYT5GRdGH5ocOSmcRtk4JQHpWdkRRlQrMDfe7USm4d6Oy1bKF+J5efS6sSNrAkUe893l9uLmJNJNDuX8NQhkyhtfomjEQPi9Tq2PcSrOcevwppvH6NtuSalX5ypD1YIkUl7ZaEU/1zObuuUwph64pUX1VrHBDvkoVgczCFtDgixQzLQFkh/XRJfx8ifGiRBITvz03ll9cPtj4NlDkM/IAiuYfHRgnRQ248qf9Z/zug9sf8V/9kxC5a2c0uDkwN5ZEz9hBXultyzCfA/PLYJioazACT+wyP3ijM01HLzgMCnj7tORPOujRUXAtsibTde5zPgI4Oy3+oHYfDt2DvdaiaYXnnX9yTTFjKiI57aPg/ib/mTwwclY8DJAwdLBeyYDMceMfL8lm+jNCEGmKZ9CIckBZtPvoe6kBU7NwRYKWs7g+u9s8eBXs7AP9tG5j4RzOAWlrCHlKdfGxmluqwa64nimel0aXHugmUxB0Ge7ZclnFH0eP7+8p2tm+kmoMeRTeSJKeipKT2+Hxgjax3jvErOcMx8nV7srzcSx1hEyOVaJdzmiKetumFY7oJmRlw3d7iMbAX5ucyYDBLaKt37QwdApq5oN29uQqZk0j03vcas/2T2gV2G1Ob2jEU+U3MgQhM0ZjcESR6TfqVO5FjNVF10M+EGHnIsbiMD75Vl5inoVYX8CdrQL5r2Tj43GB4IfYDl9xD4dC7AvdBocGwVGsNe/N7DKKbNAiqb2DBsy8fVoqBBR0GfiPID3yImKzC/4ojNba7ZDhr188T7grgn6L0Wq5UF0OWcE3jZliEtTXueK0BaoSomqRtELn4g2fivTK5YW/cJf7OyfQTG5FwHXSIbeUrQlAjkwVcIg3JQ1+kdSylLxeYK6r5TALd0O+JvdCBPqyRIbQ+d6db5NS3SjCVlQJPnqrx5g08XCdGkU4pDyMtxAcCGAXpMG+5zmqMOMTdqJQ3S0myMT9yM3z6eG8PMg9FVk/jA1OcL4EEcHrU+sdjY8TrRM79veEkppNqBl7WquDxxhnybGGchFvshdWwZQjHVlZOvDxCQkBww0RzyvWA5HI/jCd","layer_level":1},{"id":"ce1ff67b-076e-4f30-bc68-a8b00c99ea5c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Kustomize配置管理","description":"kustomize","prompt":"创建kami_backend使用Kustomize进行配置管理的详细文档。深入解析base目录下的基础配置文件,包括kustomization.yaml、deployment.yaml和service.yaml的结构和内容。解释overlays/develop目录下开发环境特定配置的定制化方法。详细说明Kustomize的资源合并、补丁应用和变量替换机制。提供基于Kustomize的多环境(开发、测试、生产)配置管理最佳实践。包含Kustomize与其他部署工具的集成方案。","parent_id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","order":3,"progress_status":"completed","dependent_files":"manifest/deploy\\kustomize/base/kustomization.yaml,manifest/deploy\\kustomize/overlays\\develop/kustomization.yaml,manifest/deploy\\kustomize/base/deployment.yaml,manifest/deploy\\kustomize/base/service.yaml","gmt_create":"2025-10-08T18:18:36.1695136+08:00","gmt_modified":"2025-10-08T18:34:17.4975848+08:00","raw_data":"WikiEncrypted:WN+mr5UPYRkQAIvPkaSGEMgGA/r6qHO++eNCqp1GOm5Famwo2gREIdrRZbFYAcnVfzuhWGEYNkfqjO12Wdtn6OVY8JsLHupd9bhIih9tudckvDpIpZj4Ki88PM2Oi9v72mz4Hdd04K+K1QMYq4IH9xDjfo8RW242uY5KblUHeNf44iajTypg96u4nFfW7x4bKOUcMWVXoDEDC7J3vi6mGwl5XP1ojo5qwTFE+q/LU4euWP/RJuYV3y7VXwgXNWLnS7DyzXbbgmWexxK1a0cO49xAF+IgBzPUSRwJQDm1x/p2IaVPaKkVxEe7bgdLGaLrjO/d2UAmGlQXxJzTZafLJljR72QxsZvQPDpuTDgtPEClhtk55C76kYSlCtBZO04L5ciAnhrlH7Du0N88puX1lGxLJ4THQP5l8sQt4hvEcMQnbnfC9j9kGpCJKdcoyzPlJ+nbHvge1aEXA1UR/kkti8qNaYRau90WS5hn2y/bMqBKoww0+uG81JNWK3QSHXf8nZ9TOtkial1F6sqRgNNa08N4YuUtrf1Ktjyqb7kyQBzi/dQMasCJsb5lYySDv4eXApg/Kwhpal9B1omiTGg2GVo8lhpxGmUl8BnlWZDBVu0OnjjY0Jh6mlpqomtXjDlRfX49va7iImq4tmiZ12r7EWgsV8W6Pd8aLL0nC3jZOS/5hIcZ+vCU9ihoiQor074hyDtzDUFPRmHzXg1Oht8DYmiaWH5MCHj/kmpJDZrFw66nLe4IU3//RdL+HP3+1UUx2AkW24TKb1iPzflOWY9pvdIpA37B6IjcFJE8Gv+90T20Htw1nkFFQlG0QsNClNVbmhK+Ra9EPzOl3giD2IAzvx+S4oHbefenQqz3KSBNsV8IVoRbi6af9sQKjSjXOuqrmMefgdKvg7F9LJGWIvhxre7RilxpYZR5WGAwAKoa2G4qy1DUwj4OzkD8eH0r5TvowvEuCHHcYUC7gc8Vf0rqX8ZbFO6bUy3pjzRsgeX4YboNgQ/83LYdF/+YQ0Kpno6C6od0MbxPWfWz3pswD1Y8cSOuDHGDkx3pTdA02QFKnupx1wUtTzwTjy4n6B+/kpKURZSdaZf3N3YL9vLaiXkJWC21spdhL0UQyo1qnNih+AkOsbQmT0n3VkQtxOekCvPPAUkvmvi0J9ES87PKNzsU0GQKPyjv6SO2Q8Mgr+6KAeoim/7T7OH+x+1qLz9+T99A04ltlDvuEdmlMIABxVmhTPZXvbQOxruqW838L6JrHQZVE6i2iBOd2BXuFiSoSxNN","layer_level":1},{"id":"3e149bfb-74a0-4709-ba69-06bd7c5990b0","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"沃尔玛卡密管理API","description":"api-card-info-walmart","prompt":"创建沃尔玛卡密管理API的详细文档,涵盖账户管理、订单处理、分组管理等接口。详细说明账户创建、状态检测、订单提交、分组管理等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括沃尔玛账户Cookie批量验证、订单状态重置、账户分组管理等场景。解释沃尔玛卡密特有的账户状态检测机制和分组统计功能,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注沃尔玛平台的账户状态同步频率和API调用限制。","parent_id":"667164c7-51a3-42fd-968f-e3d167096e33","order":3,"progress_status":"completed","dependent_files":"api/card_info_walmart/v1/account.go,api/card_info_walmart/v1/order.go,api/card_info_walmart/v1/group.go,internal/controller/card_info_walmart/card_info_walmart_v1_account_create.go,internal/controller/card_info_walmart/card_info_walmart_v1_submit.go,internal/controller/card_info_walmart/card_info_walmart_v1_order_callback.go,internal/logic/card_redeem_account/operation.go,internal/logic/card_redeem_order/process.go","gmt_create":"2025-10-08T18:19:17.9835015+08:00","gmt_modified":"2025-10-08T18:52:33.0626575+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBp9VMQPniJjC7MmBrb6ZdbLGBmfEuxNN9Ju89NloKGS7u9sYWjyr3dXMhm3kDUSOZPZC9/KLRjcFlQhIuYfLO7R3L1hFLamXrba3/G+Nzuj/bA/n0ZCcGJ9Dvu+Nuxym5NVi5sleNwjnsroBcq0g0gN7jqYlqXUpRU78rBE12fWrFZ1r1SGkcQ5G3XsL2baLn0N28+pjVfzwy+BupbPPYcsQJiZ4WhRuSzumI2qBhiQuJwD158bGgEdHMOXShVwCItaG3UMtNncIIQ2xZfu4QBG5haVlAYHLXLodz2eXh2KTAH+LDtNmL+lnjDSC+PcuOs4m0eNaH40XLWCr8wm/2xoHW8syTo8k71o9BL5tjPbkAWBdEqGUX+MSvYAqSImwkr8zV+bwlZB3Nn8u34UNS2r7G9nWjj0PAJDbIFdI75aDMbE7PL4k9rbqrUMnYsE+Zkv3t5kw4SgVl7kpaBujJTYYMAPSDwxci+a5k+bOzCBigKeT6/833XPzDZUhubutA+gAzsbuzfe0Bp717p/RGgii242yhpRT7FP9KBT55tplJfmyjrA36i2xNCzHUhmmJ7YrjcW+8X1Xub8JqcOtwch7kUcBA+lcela+Lp2fvDYA8C5OtkULqkus+CLNSvQiOmPuwb/FoxBv9zNyqoM/1hUAmKArkIGgcApFbz9NXzgpztrL8N3/vqTfZUCBIPXc+xNcKfucg5073b2evauSihZKEYGedMWHOplNMgmA6HU/ft01XhjNFzf/PDpj5rZBlSHF0eLx+QtVif7X0NuMVUpZlBm/Sc7z4eAM6s3LMQHu7plPbUmPvo/32b3UJwYbmE4dbfO1lDrfcHub8DtESVk7Hhcf3faojPEucgecblz3VioJ5WZJUE4qMNmKn3zIDTZ46pg985NGUdnntnViNlkLBz6ygGygmeKaevxHa2Oa4/85hNG913mc4XOv1RdZ2AcmqUy8DXYPv80lSkaYr6BjFW+VBDH5xqmUI77J12dlCHzfHYq0kDDUj/JXk5CKaUg2bvQGs2Dz+26gCfJb/4i7Ypi8lM1MScG0Fwezl99C/DaxBJ4zZ/xxTn5giHLPHJdqqs64z5gnRs1rGd9d8KDE2GYy5Rymp7U6khgtMMdspybPgYuSu9aU3nPBFpk0WFm/V+6UOWdxyBqncJvDQGvJ0SoKZo0FcV6lvtsrMfF/FuiGEYor4goIcRNvFgBiOcW6z4dhjdUYfrOrDWA/GV+uhvca+HPt7kOg4kWyHlgPDfxLqotFw1cImhvx2+yfYg7c8WiQ7UXMA/3zQuTvWgM0su3coR5fVgIQ/nLjbMO1htzBmHY5bB+3qCo7cfXmQeG4VKLx9nS1x6FEn9cd3vF1fYkftJ1yDINMXmFYM6hcXTo3F74IcLBnZ4RSUrYHIus31uTllKogCJuHbm3vBsJqXxYmc9qQSWxgojRPXyY1HOh4vcM2KyvBPM7cIPXxuM+peTUEFxq4kSCDM6fz0s91MLxiRy9O0jnVhHe09SQ6ZA1T0pl0m45y8bx8FHJWBG8XHsi3LgE3aojHYr4yOfFjLUCbogu3SrQwuQB3ec1+2lRtFrjXKZR+KJDHFbtSg8z0ZeMzLY8HIXtvDLETZeN+n7LU6tuRkCoSgVSoaDsWzBxg4cRcsesVzLbUVZ3mOCO6LKk5UHN9VwA4NuPM0GMImGM0JbzDddtEIp5AWn82LWho1gNrTmRb5j4VdNb++5JXh2fs4dHPY4VifkewjiM=","layer_level":2},{"id":"696bcc52-32cf-4207-a05d-604412901408","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"沃尔玛平台集成","description":"walmart-integration","prompt":"创建沃尔玛平台集成的详细文档。重点说明kami_backend如何通过redeem/walmart包集成沃尔玛API,包括沃尔玛账户管理、卡密兑换、订单处理等功能的实现机制。详细解释沃尔玛客户端的认证方式、API调用模式、分组管理策略和错误处理机制。提供具体的代码示例,展示如何调用沃尔玛的账户创建、卡密兑换、订单查询等核心功能。文档应包含沃尔玛API的配置参数说明、请求/响应数据结构、分组管理接口、状态码含义和性能优化建议。解释集成过程中的技术决策,如为何采用分组策略、批量处理机制和状态轮询方案。提供常见集成问题的故障排除指南,如分组管理冲突、账户状态不一致、兑换速率限制等解决方案。","parent_id":"246ad670-c405-4630-be1d-c8b8f141bd4d","order":3,"progress_status":"completed","dependent_files":"utility/integration/redeem/walmart/api.go,utility/integration/redeem/walmart/service.go,utility/integration/redeem/walmart/models.go,internal/logic/card_redeem_account/strategy.go,internal/controller/card_info_walmart/card_info_walmart_v1_submit.go","gmt_create":"2025-10-08T18:19:44.4847594+08:00","gmt_modified":"2025-10-08T18:52:19.3687546+08:00","raw_data":"WikiEncrypted:OzcNx2L0Mri06+ni3EZYPtfJLNsyrYI82HyHl2Uze3V6HVRrHnrR/zAu9X4/MF8+wiRjtDmvfbBQUsMyVrZLoVe07Fw2ndFvLNrct2Aj6eGECUBCYp7R61S3B4Y+hvV9Q4JWZJ9VXmj7S7AzIdGyDwtgTPN12QeXWddNScmrLGJR+i4xUkmJYb0gH1tqkMMgIJOkBgS0kp4W35of8tYiqPg1AEsY7UQtWisafG/Tcf3nKIksjzWfa8IFwbzk7ONbiFYEsuL2DuEdi6Qb8Dj6elJkBs8UohFPMZ6P6GhL/xD6qPXAjKccW5g6PGPbGuAQeDUk/KDWsreIMp517iRJ6KwG9uWo4w9Pv1JQAbXz1VO61jK7xLF1g0yuqwfGKNSXgu7RspOz/GzOJJJyim3elcYnwPxeEalrwg7MHpLI9axAT0Rpw3ucJGe162x49x8UpXh3dMwbv5onPNGZMJGSlkA1r0Zxt0squJVI1DcRvThVo8LqWfb/DpT/cnMS9o5etN2aGljW4pcst8YmHMz26NixB4J1qCcujBX5zq3gO3j4LdVwUft/TY0UUgk8+GWPT7ScRIscW2fQ4ZqkPD7b+8scY3Jyj8zj5cwxsuPj+CoApFOM7E+2vMEqJMgk5FOiR3ifpe1Wi5tUY9Oxi5gO8BZkY2kBDf4Wsi+O0LO8FMwRYX+mRC+vurUDehJS/ZE9oF0D9LN7EbFP1DT3H9meuOfxLgweGLEyEAvl1YOP+Wmx0bI3tS03IG00iub+slBIkaIw/icokP8iscEhH8R7yJIypFs6JABPer7FyFe5ReA+NgjpOMO4i9uU0ikaHPTnrx3hweE9+73c+fEMNYtmAWXQTnVtKoD3GNFIbFbrTEasYnt7LHcUTeQ8+pE3nNcLpnYgtAKF2GPMZxji121Otiuo3NNhn0xuPYl0exIBH0/BHf9SrM/Fl1K1MvjWefGpuG+u+kwYx8Ln4tJGFjlovXNBue04DRpSSSweVDkyRZ09evR1UdPNbw0eUXqMBE6WR1LR+xI7AdjMhQNlEIfsGUQkTAKIl7OdqiXWko+aOzb0NwMXmZWW45HrNvKqKCqAD9vf1rGQCR62IgIlRXHNv8hJvYELm5qMX0dQgNe/QMhPAE9eRF27Vf2rgFRXeF/lrWrU4/uCUQnWCWxot2ByhBqsbzkGDCtU8mbw6ZJafAgaUvTjJO9PlWtRMwmbQvDCrMdu0zfX3Jstvo7M5qQh5szfZHOmWYdhfBLhCgt+ES9SM8KCT+W38tpypaFDsyvVYGb+kW5Chaka+quKwil7m9+U/Vm3hd7IrZ6zSFk36cCDg1h9i1QXf1RVWZoI5ou4Uqc4NJUy9I+EknWCnKtwc/qZonk59yISaTk5RWZx/PMu2RgllCz6dpufR4Wd154rdJiCw0aKbSdvG6o2gpnFaL4RF2YiEZChOg9NLuFgImpiYt0c7ND4vj8MxGflwX09pWKJnVHxNX7eCbdkC9rUX82bD90fgosEcQ+lEYtUY2/QVbGyDpNHAFUPUT2RYVjWysoqM8BKAawuBKw44ADOeZMgQ7SbsUKPzMet0Anyai0PUBDKB0JfXPnAxjIaQN6CDIc8Cg/ZHQySooABrL5cf8O35gqIdYMvBd9q4dgmSBwITyTOxQyrin2MVbfSKYSrerIPUP+PtOBz4uk7ccLtZcwAyhsJPqvMNVW4z0Dpy2t6idwrzuY+4+wKe+iLAaJ4OM3yubgDwvO2CT7+33DAzKqCrRQY8HsA00Qmdu3bM6k=","layer_level":2},{"id":"aefbc4b3-589d-4bb6-aa64-84c44494b933","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"设备ID隐私保护","description":"device-id-privacy","prompt":"创建kami_backend设备ID隐私保护的详细文档。深入阐述设备ID的加密存储方案,包括AES-ECB、MD5等加密算法的应用场景和实现方式。详细说明设备ID的脱敏处理、匿名化技术和数据最小化原则的实施方法。解释隐私数据的访问控制策略和审计日志机制。提供符合GDPR等隐私法规的合规性实现方案。包含数据泄露的应急响应预案。","parent_id":"53fae74c-0146-44f9-94bd-d53fa011a96e","order":3,"progress_status":"completed","dependent_files":"internal/logic/restriction/device_id_record.go,utility/verify/aes_ecb.go,utility/verify/md5.go","gmt_create":"2025-10-08T18:20:00.8727433+08:00","gmt_modified":"2025-10-08T19:05:48.2119513+08:00","raw_data":"WikiEncrypted:W4RZ6LTz4rg+RteR0TdbvI31XMJ25/L+57ZIBwtcM5REl4fdp7GotkDn/eZBYuqu0ocnWyJMPttEZL2wffxtzrGN4Ui+cCTKiBWUAo/YRtlwF0BHrV178pSyDk02tHmtG5z0OE3VwCYiJAdRPQan4N5o+RFMluEyZnSqhiMHlih/kRM+hUbdobEMOB8KEMOuGBsv1+stUGRqQp/R+OuGBcQ6wh0+z+YLolv1UKhmH6UC3FEZhPTSTvLxcpYf6/vCfUJS0zOrHyITk4yG07g/Y3QV6o+STvgQTbZ/4zfY3fQbayuef67C4oGqkMILUajosDtVQmhIM9zAaG5H7BVxzBKU8EVyco3rHWCjrHJhCGAqVuz0eu/PIrTAwib9TMNCzC6WAsIZ83KJancA5x1IL3mpFzYPs14z8bghK+/yXtTc4jVGUTsmUvRgt/Yy49S+PjswW2fOlG9BsQV6ztPfjhifouB3UQkAwx6efk3f425Rv8cntFg6hJ9DyVXcYEbQVixu8LBhSoqvm0DCJPPffQ7ZDVbA9jAtVYbvgUUP3SvX4nVW4KfZeLG9YZ7Zd8IYYGYL1FxlTYFSA6m1377dSYaNf0aQA6fziWmKxi8r3iAAEg61ULS3H1pURSRFOBwyDfEvLG16/ztt3NqiMxJwgBv0POoSVRSQ4M0kUivWxi9Jq0VHWdQ/ZKqwev4OcVPqFnDL6O8i01Phw3IqdbK5q1LnCsi5Qgxm+t9H/wmEi6TcUJcXx7r8lP6KY5LLA7qeq2jb351tTLZ3vdwNOauB0hobuExwq0nlPfrSlZxWwl5rhX4iRD+kFFZK4iYXK+Sdqi2wUxIZDDrtbK1HEau3mmrvVrso1VXwZIe+w0Xj1y1iPqAr1Xq/8v6/WejcGriMp7ciotcoeHcOy3ffTSoV6lnAlTlZQ8EGETczBAGi96ReFFLjbsaxqqvtOmuYR1WV2ohPO6DkUKh3GhGUNNpuIqUpN09dkl32ETskx1sUbTF9VkP0fvDido0h1Me/EgC2","layer_level":3},{"id":"70e09c57-7ff1-4f6a-baec-b2630cd234d4","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密回调机制","description":"api-card-info-tmall-callback","prompt":"创建天猫卡密回调机制的详细文档,涵盖Agiso回调、订单状态回调等接口。详细说明回调接收、验证、处理等端点的HTTP方法、URL模式、请求/响应模式和安全机制。提供实际使用示例,包括Agiso回调处理、订单状态更新、错误重试等场景。解释天猫平台特有的Agiso回调协议和安全验证机制,提供错误处理策略和安全考虑。文档应包含服务端实现指南和性能优化建议,特别关注回调的幂等性处理和安全性验证。","parent_id":"4075b270-ff90-4654-b074-ef377e9015fe","order":3,"progress_status":"completed","dependent_files":"internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_agiso_callback.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_call_back_order_manual.go,internal/logic/card_t_mall_order/callback.go","gmt_create":"2025-10-08T18:20:23.1328692+08:00","gmt_modified":"2025-10-08T19:06:43.3876864+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBoebvwpaHfPwY96ZsYHNOSB7YbW4lEnnUYmwTTOYlPJ4vFdOgmYHRlja5WAsIIMSiChhgejNqh98FydD01AfqU7fcD4S8JSlDh3f2l6XDHMsJkUVy1hXRwgZQCn0Ezt9vkeKjs/e6IC3CYyZvT02aI21wgkPUt83TpGKLP187ArVUlAK/TznGcJjC4y7KFkDTVLOGxzn5fvyuCOQecg8p3kMIUh/K5A/GFm+jA+bb6+jwwUhHWS5JnpXJypGX2mX2+YEhLShHZ+qSgJTL++AkYqlCO7jAqme0get6lTfiYjoGBTpCAF26VECJDm0bdEVpHHk2zaeUoIUKBAWL9r0zq0B3tv9iWLODIzmCL4Ewosw+ZhpaZgDNpXxD5/vlbOTtBMz3d8Cdz26chtvCpU+X4Cl4FPDhiJ/t8zHDKjsoWGQd6yWmTAujUeQT2VHEGO0CLznXRmj6phog/bLztxYbcwoknZzQ7YRe1BXgU977CAMyaLJoyYYniWcI889Ml4GWFIwmPvDPSnSU13PRpHgJ6nYWr6LEbFRMzR4N36PLzyTIEbSOLhLXhB6DTi1f5oC6bWAFp+S7bXi4EzOePVFaa1sF3xwhEDpbl3LCUoXb3eYJrfFEmw9ON8TQrRfO0dD0pMCsJslU4/kymto9cNk3wF1AnlZKVdPhgKjA5nISWn4y3qEd0QYqHlkn9x3Tj9p3gQw1T5eK3cjxz73UkeKzhaA7rm47nu5162jt63UFPieRudaKG6Ru74Slq8kWgiOhZeNlkdbJiMcjXRc2sZmDgzerXou+3Obqykaka2KjnItdiGnhETAK+R7XYjpgNZs4xh8JG4buz4qA3o33fFpkJ4X21y22PfMdINjUWhM7lKlDHNGWGTKN2Fo11R6gBqmNKHuV2dwb29TQvh7rM1MbVaCQfRUx4kCXIagpJuumDlgQJD3Q0Qjrja8QDN37QrwzFObq/UkW2YRIJQvgN0CVJQziPS9kkK1qZ/wKy89VuCrrZ7vOb8Cu9P+vXdXkZHbWCmpEDxNj8/6H5LMKhjjbs6rfF/sI7wQpscsl58UgmG6dNNd0z9JClD/IK7T1tnQYcI0AxI+TiUiA5omRw2OAxAiT9vVATsG/o7mh1tRzHFX+mve+Eaubn12x4txqcvHN8fTp5qf7dUlhox9Fu+9C1d/Y+7ua7/KC8xdSRT1WLy1JCBXEDrCeNt7QcKc/V99jFxEmybhld5sQrweYYjqNBqGNuFW1KMzjLSzkCvs7qunv5akWJgCnq5vRPqVo9YXdPH8Olxatyx3T+IR4SHo2QHov7891HAm9HqPoPQIeCmPJLkaWQAK1LrAHKeV6DrsTccJatqOd479X+bmA3H0lf4=","layer_level":3},{"id":"bb593523-dd7f-4934-a812-63ddcf32457e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"部署自动化","description":"docker_compose_deployment_automation","prompt":"创建Docker Compose部署自动化脚本文档。深入分析install.sh、install-test.sh和install-one.sh脚本的功能和执行流程。解释这些脚本如何自动化执行docker-compose up命令,处理前置条件检查、环境准备、服务启动和状态验证。对比不同安装脚本的适用场景,包括完整部署、测试环境部署和单节点部署。提供脚本参数说明、错误处理机制和日志输出格式。展示如何扩展这些脚本以支持自定义部署需求。","parent_id":"e198e011-e613-4a72-8920-6d411d5a8a55","order":3,"progress_status":"completed","dependent_files":"manifest/docker/install.sh,manifest/docker/install-test.sh,manifest/docker/install-one.sh","gmt_create":"2025-10-08T18:20:37.3543745+08:00","gmt_modified":"2025-10-08T19:06:32.2568614+08:00","raw_data":"WikiEncrypted:h7ADvj4WLJHyulzCl+z7kJNHi1rj8bPlcMDc2oqYiBBB9d9qOfkyH8LrF6EG2Q+eM1G861Cke2aeXMWBKIHmIfk8qnnXIkNGF44BMoK2xo8tqhB2Q3qwmlBoetUgkgwa2T78PgfgYO/dn1F/QxZfSL6FtNPIV3kx00w1lLb8+ZJL7vsA4eLT2ieTW/24xeDu805exuttMjC7Yw6NbHRb/Yj5XmzzXj5utTiAt1HG5pZszLt4xGVf6C6H6T6gXZ/9gpTCrrqOWsc+GsQFZnb1yAb7xXQPbLZf+uGGBOO3NLzB9uhH7uce9XgxyYawq2zqct6U4uNmE1fvKT8a/tvt/mllajWpBJ8Kum3N94MSOq7kNwzorrV+uUC21z4LFx4Dy8KPQPJU70I3IxfnXBX5Z4/0XpDkmU7+GjswBDAb0nDk5mveoEDxbJGWH8A24htH7LnKqRBGuX+0pVWDGQd5kP7TC2dIJ86FgVI6HI2PzrWPSg3OiW7XbV7wCVGxxXr7jgK3i/BSZZCU7B86R+eBemj+GkGqBBirtEslxAchSPxOlLCMmZfKn3xpMyPRGk+qyvqBYuteJKtgsMbn6vISowhit3nU8hRVbpfmBAaaOIewKafx5OOEr450ugNwsizm2IGHshwcf3UDHN8DlBkz4rBjHWifKKKHzwejgZaLIEdWJJMMSWB6FNeorJ1Uc43uwvthBQOiOzAyqdtVs9OJMydzNMDXCyQr2fEtrJttKfXRM4scFCvf4ph78vqqzZ7zsLq+ZSwi9pcudBdRTpJToQRHDOqVq06TBNHJ47wYvo89b1vcWoGSLtwgomkrT3QuYlwpaSRU0mQ//N5E01Lq/AI5MKJMgEhcY4A7mpOaT1Zob60pyt62uYewFQZzmSjptDaOjZplIb37U7FQbHDSzLSqwfV+4PZ0CTq+yzraNK/CBfr4zDdSYxbRUAtOhoHPFRPeZE1qKrPrn/Dn4D+1aAUODb4ov+GlHyHLjnfH5V6Kj0StrTEbu6fIqXO7U8zJvtxpjo5vv7B/IfS3Yy6G46CLLtq5wTCA673BvZNc3fgbs8olWBDFQkWS7TZgjy2gz132pzOB/SpvY1pJq5RMon/iRS7G84tDq7nSwtrSuyFMMjYohF+4CyvFj1AQCwLo1bbore1aDHq51xbJqAG0EX/1ybieglEHKrOho6z9VQo=","layer_level":3},{"id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"业务逻辑层架构","description":"business-logic","prompt":"创建kami_backend业务逻辑层的架构文档。描述高阶设计、架构模式和系统边界。详细说明controller、service和logic各层的职责划分和交互模式。解释核心业务流程,如卡密充值流程、订单处理流程和账户管理流程。记录组件间的交互、数据流和集成模式。阐述关键的技术决策、权衡取舍和约束条件。包括基础设施要求、可扩展性考虑和部署拓扑。提供系统上下文图和组件分解图。解决安全性、监控和灾难恢复等横切关注点。详细说明技术栈、第三方依赖及其版本兼容性。","order":4,"progress_status":"completed","dependent_files":"internal/logic/,internal/service/","gmt_create":"2025-10-08T18:17:58.1162062+08:00","gmt_modified":"2025-10-08T18:24:00.7703973+08:00","raw_data":"WikiEncrypted:mHLzoBKW/ak+KVdbda4A2Zn67KoTeQt1oMP9weY0rUdHp+HSerlVz1TKLxJdy2pFghWDgG+cE1K66vIpcCYonm2fi6mny2B6Y0bcHu4/b9Yn0jQzXGoIOdqUkZqoccNx5WdT8IP42SAfs276GFuB56Spxgk0GcobbeWwgw16TOafk/syrGpsJPD+ExTy1UiaxRjTi27XuFm+f4WfDZmjUCZFDSPPiF8QJ2ef01Nf5EtJyAgEXM2uMXsYVsT/pl6RNPyhpbRFQ6PMdb0tQpFyQIOG9OauQ0cupck/2/09wzvRjzp1GJGbd5H3pQFT1Syhr+a5yIzoInHaryiUsFbYHWn2pA4SGICkPouzCsll69W1+69WUOW5VaB+w6FWPcWnnNs0x+SgBaQgQaqTGtivUcsDThWn9xrzIrSOa6C9Udhcee/2IDVxQyWr/Obdi5JPkSVg9Q0cX3zfq+BCAkqFE25idnK97CxCC/wnBJeP3kD/CrFxdem2pC2j6vN2fOqPDLETyCi2ViDSsGTyqBxzyDJ2WPktgh8IXRoEXc4DpmQzOe5QDEQpSRbvQZcPsA/smH/JgaT/RsJVzxKiIKOlC2x+Ucd01FaKTFbfBsbY0fcr+2iCNFf1te6F9XaZERmbh4glGDNiZGb8JpDKC97GGDWvPpTsgwuxY7YmBLvhccsu3n/JBJ+ttxpAaOItKXcBQir9tW8R+M3zBcc4S18nYNafGjfWfRkluU22TjwzudNo2NutWyckawDXda8LpfbiU4x7fmWzVf7o0iECcOoolR22qj4LCWfV3HS5e6OB3JglIK6L5nK1qLIbm15T69bhoxVtoHiI3Q3N4nQ1G5ejPByk/A0rU+wFn26zzW+Mxf9IAALLxVqOLGV0O5p/nyKuZA01lh3gdHVnWhyqKpoJxI9Gk31+7/3LZVZgNIaeY/gY6GSTwrBA94c3IzA7NW5+yLueHItrxtd8VSYSfgmxLoC79vr/XFrYqNosmWpjWCakZfQR05UwgLUciO5qPvIsJeGiNH+RNoGIa7zHIqrpyce5cixBcdrqOu+O8ktAEoMwuDU6/KCaBiNukM5zqzyIkQ+AH2MF28wmMg1C5VLUI8XeSM2f/qqW56u7xI/6GVpaqfh6hIcfiK0+tz+QwdNizVjj8xZ+Ycjn3wGqC7y2dpOaqLmTYnaTAaVpT6wbvvkJdmEdbF6AlUP5VfaGF3FefYS6UiMhAVz19FPt6QmbwE9itGYXo8S0bX0PAlk0G8c3U6MOELXsdaD5uOD0nEC1"},{"id":"3ec3b755-bc47-4e79-857c-911ef11fcf2b","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"系统认证逻辑","description":"system-auth-logic","prompt":"创建kami_backend系统认证业务逻辑的详细文档。全面描述基于Casbin的RBAC权限控制系统的实现。详细说明用户角色、权限规则和菜单权限的管理流程。阐述TOTP双因素认证的集成方式和安全机制。解释用户登录、登出和会话管理的实现细节。提供权限验证中间件的工作原理和使用方法。包含权限配置的最佳实践和安全审计建议。","parent_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","order":4,"progress_status":"completed","dependent_files":"internal/logic/sys_auth/,internal/logic/sys_user/,internal/service/sys_auth.go,internal/service/sys_user.go","gmt_create":"2025-10-08T18:18:19.4999669+08:00","gmt_modified":"2025-10-08T18:35:57.1823971+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjJxill0Dm7pr1ti6WpojZlBntM5mCZ3svI9SgZ2utFjCFZC5Z+FEI6aOz5Gj4A3aFbuhD2XPZL1bwaqLneqa1L4WLh4KTENL19+xdVNs4RhZjD6ZJ7n1M9pktzRYdEXoPx+WtK62h4BKAZ0CxmcKe+iDWgkzPAQdKVBpjhDesmHLcMHBH7+qeVJ7Z2lQF9Tg9AnP2CTNteWT27HOIOr0I3SaYM6k65n3Z0vySmltobX5INahUuaU18V7hzjdbCpc9e5UHoC79ydglrCuB6262LMQvfH/HvilWFq4jVC5YJbDO8PJk1Gfq54roM0WSjUbhYxrGp/UbDq6+C5hqExt5Y061mJXxmclsJBxX6zoO1P8x1PcEQiNH5J9mCgXblQrg3YrhaFIyyjoVfVVRHz+uT2SeSswzwmEIOZ86/OdiSf5Ng+xT7V/fkPevbgJVr3RkKckk2n5GJwGVJ2uBXK6ZMZor8iMBjD7CDIrTCGT4m/YSesNCfTYm/qJSandEHXkNe5yNg70qSJ2+S5+V4yIIxQPG2D5dIt6cKC0ppsF0YpybkQ3ONoINWaT4cov9e/FZssbGYOztwGx2gb0RNdxoMWQx2d6tt8NEgRvP+bidzO/SDBouGelKXOmdJM1cQ84ofFHTLPNxb4HbzIgPPLAOlNQyG7wXIrR+qRJWn8+b3laIVEpguIhUuWU7jM+tD3vuePgZnnuJV+d/zI4U0Ot3Z6Qa7t8993FQxzdKPU33UYh5JLxnLI7JwzMkncaT8Y4yLk2QLb3GqxdlUfxuk4byEiRjK8QdgorcuF99pGDvJ/VCV7m3Yc51cF87OMVYx3/fpuwfTPdnTOKP7hAdcvghET4DdWsBchrPEE+3FNLBfpemPgvq6xcqnVujyE8zRwP9JFlEuBg7aZggJMXhGx4HI4xlKTKIMStOyBJa3O9u1VsMRFpdsj0ubLd3wJx4cgxon8lCNOZeQ5YTQGBbkl9/AfzC7Y6b4mOf3P7otMfSeyaDLBHqJJGNHZ63/k3NmTSk0YPvPM+bFukpsWqU1417uUFwYSb20epfNpwYYt6O+svxIDRurYoRkjNu9OsbUIP6Q==","layer_level":1},{"id":"943671f2-9767-445c-bfa7-31828091ba9f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"系统配置数据模型","description":"system-data-model","prompt":"创建kami_backend系统配置数据模型的全面文档。详细说明v_1_sys_config_dict实体的所有字段定义、数据类型和业务含义,包括配置键、值、类型、描述等关键属性。解释主键id、唯一索引config_key的定义。阐述系统配置数据的验证规则和业务规则,如配置项分类、权限控制等。提供系统配置数据表的模式图和典型配置示例。记录系统配置数据的访问模式、缓存策略(如全量配置缓存)和性能考虑因素。说明配置数据生命周期、动态更新机制、保留策略和版本管理。详细描述GoFrame ORM框架如何将系统配置数据模型映射到Go结构体,以及DAO层如何实现配置数据的高效读取和原子更新操作。同时涵盖权限规则、角色等系统管理相关数据模型。","parent_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","order":4,"progress_status":"completed","dependent_files":"internal/model/entity/v_1_sys_config_dict.go,internal/model/do/v_1_sys_config_dict.go,internal/dao/v_1_sys_config_dict.go,internal/model/entity/v_1_sys_auth_rule.go,internal/model/entity/v_1_sys_role.go,internal/model/sys_config_dict.go,internal/model/sys_auth_rule.go,internal/model/sys_role.go","gmt_create":"2025-10-08T18:18:21.4266361+08:00","gmt_modified":"2025-10-08T18:35:37.0503211+08:00","raw_data":"WikiEncrypted:gWB8HBj+8+/15rQhXgtMjHo3Cfllvrq9dj+VS2LjLU+XipU5iS8bjftNtXgNkjAUuhoBjsDPl9BjrKUtcrFkS+Ysf07QELqCRkUaE9W1TE2R7c8Pd1omOAa/LrhdmLcUIIP96HDPywGNUVLCkClEpXPVZjr5yV4lRUGn6Vd4AT2Kz1qx9Z60YINVebiHZjal1ZSSIEFUhg9ahC91CkdhbkfPsFPYo7zMmbdYpPuVWMr6ap0pycHPC2HK/qMDmiRrncLGuHUk1wvb1uo+ICF2w4nK1LEbdLGMdBnwT4IJT1/VKtcxo2/pYRnXc03fs9K/Ygz4/XEi/NkXdxC/VqdAyv4d1CfzIzJSvNlEQ7q29GzcswCh1BY0PcFBwO8cpevtwMseZAGbVXoYQm4DvJWiuPzb08JC731Ube7hPRcijJDUEI6FzXVqcu7qngW0DX7qWoZkFKtveIpW9OxNAeMloxr/k1e3Q2+eIsAF5AUw2OGwbpBtaGsu3uOQreqGvzlwo++/8n8bml/QCk5HQT2Y5qhWAOEY2IvCK1OMB1ckrWn32rwWkPhSQn0+oWqtWFkj1D+Y2FNRZcZCijgId6mwgVLXOClH97C7v4Hm/CWvUvxwcreNuYjJKSlQ0GFwWBBvXhrlRSHF5zBKqux7NwYZsipPHjNF08UAhCOLm18HxVfpYB+awS2Axa3d3fK79m/oZfPUfyNc82Y8bPFwNUP5/hMSr/4qU+EqzK6RHaQ8tbdTzzfDXEwUCUK/BwE4Mjl9vdTP1mfkfjvfb3SokJ+zqi63WemXEQnH7NGSRFNxNdGMFRNKzDmmrApwYZXjztqqdDxgssTXGg/rhy1dSGYaS6H+ToTGp8c9/MH6lKhx8ZNdTBMTdbG8CibYcK9suxALPynvOq1UqP6oqOXPpfxfgOce1FzA4Rrzq9nTHIQMnw4QCdV9/126aBKVxCPa3jLY8mBAIOH0B4YZhqyBo83RfL/4vY8G3VkWs5Zo2NJu20B/7M5Qdyw2ZtirWKJHPE8v0rDmPA6/9DKI4Lv3enLKeIhMIAqZebPwwk4Zh2wA6oHlk2esnHqVw2Z/5BadsNJFgBakyMMnkrUxaesU/frMcRJ1jLsN8YHKOATLE4F/RDg0ZwxOSu6zy1LLm2k6wpQWgegMovr8kg0Riq+YHAdz5ge2gTtD2DOGpTfbHWVQlwXDER72hgcmSJSy81lE/TLcsT4ONAPXTLkDAXTTJOv3gVnQeYvISQ8Cvg/eqncCsIKeDVWC0QSg6cUAK0GzhCSXJw5GVzKMgyzelmKtqiI/jX/Q7V3CVMGP5V56R4wC4eVlP4Au2POc5fEZ7FY0l0x6nrL0H80Sk4o2reootBU5tBzcE+u5f7MhAfetwZjOAzh36C9gdNBv/Ifrz4QMZRDaVmNunuMpHmL1QXPGLjflQ3YHGIWlc19NJ+isI17zfse6YSGGbkSmo7ZZjYkvhWzpUIqTxaqRNav/ebsmWVlxtpJZiplO2HMkHY6acUOBnYJY6HbyUv0FGySPMvwY4nPGH07tRkC1AZV3qw8LLsbJn8DVFeJrKAwJctcsn5xqfaET5PF/NPt72tuGx/6k/RrpkxcR4lelfXNeV9htOdisaPesSw4Pr7lvTDzSMpA0ed6iRgFptBW51AhCUXUP+bK9e+gHK+a48LCXouUt4FBb8gMCDgozFYPIcEQto55NRVPlyQg64fORyVH190r4M8KpnxUqe4GDrywDZsH+6MkikYbcwibrb04bdsPHvRd6xSN0OZuGzEo1TA9sL7Se0hxVHB6yvpgFJmFisuwHEqIvZkoKgCgNlAkkYri0hOJVS3DyuQ2PKQV/hIHswEOBdcoCwbrq4wjJqa0LN3BrqrSB/9Yutb/OS2vIuHtpzhQxowpYZTlb9L5YATj9+RTo21L5H/qdRyYYhWd2Zk0WStnU8b1MUKbLHRG8qxd9PMi21Ro=","layer_level":1},{"id":"1213eaa6-98ce-4b50-b9ac-280f7bcd9725","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"风控限制API","description":"api-restriction","prompt":"创建风控限制API的详细文档,涵盖IP限制、地域限制和用户信息收集等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括IP访问控制、省份查询、用户信息收集等接口,提供实际使用示例、错误处理策略和安全考虑。解释风控规则引擎的实现细节,包括规则匹配算法、缓存策略和性能优化方案。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":4,"progress_status":"completed","dependent_files":"api/restriction/,internal/controller/restriction/","gmt_create":"2025-10-08T18:18:22.862416+08:00","gmt_modified":"2025-10-08T18:35:55.7604989+08:00","raw_data":"WikiEncrypted:C34GewOyK1SlumqKiPsSg/Aj/+xQhog6A4luCmyduH9mLQCMR1txLqnqXtH07QvTvFpjblyIOlgLn8a8ai3D7Ewm7QQOAJqH2lPNcwyVaNI0R5AYYnLv/ppJRFtq4rzXS7bs6R9WuJre+34kpQbKpXoIpVWgwRPZYMpoRIFHyVDRhlKppZX2lYuhs5kJJ8K16v1qjWj9EPaec6JuobLvqnJqXTaspOxb6DYL6t/m3ee8njSnivlA5TBb37QHmL++obh/Kk5h+4xIJSe21L4nnMWNpRdMi7z9OddGgJdQ7cqjcP7zr5ABy4IHsnW3EFVdvfC4nm4/R+qMzBqawYOBP36gHMj/TSuwnGCS8ksNGcXZEP8EyUKFQlgl+jB+M3GefG6k7XcYpWqRoluloNsAXEVElsPfuwmTgyYh5u9u8bX3tLoQ34dZsr+GxKBIlEJ+63G0NlMMECxLCro1+wlTlTWYgRk3mTd6Q/IpJs/8ulLW5Wp37GDVOTkmUAOcljgtKaPqx9SaC3n20GBxh4ADqnjaElyzJQDD0fotl50FyTouwJhWwA7R/eIRnGvLV2TcfAzUFza6PHYAf93AqvaZ42N1PVZ8xCqnUrKUMm0nSk1kszj0ZOdIDaTB2K5Oqdft+dEKlNql3mqK5Me3nm2U9LT1LiR0/nYzGTyPc5i0+rAQH8IuTDjCweeT/XzOOos5gzbbNI2cNK5+zPr5FFweiGme/ZpOI5xUrO6GaApl+nLg1RNWcO/9CLtQ5MhinBOcPcs5EtOSUEf7B46NuVQVA0Ng3iG6lgMtZ/iVfcyuMJrScMVv2LLyTdeKGRtlCn5Nh434nWxxoWacpf0Lp/+ohXJzuadHvVjKZWmqJt6TlrP/AlI3qMbKvISLZKY8b3UCdwJmfGCB1eCKS1rQCLNGKIeRuEhYqXm+8ENWPskUauLGtiafNJrxP3/OUVrYJ+ZnpCC/CmxXAjYKn2517/REXJbpMv49iNGGkvnOfo6tN7DcJVykM1JV4vwRALkz/d3c86mJq4sRWuACN/FXwolQ/jzh/NEYtylpIQFu6vihdAyH4nmm78l9BMlWQqqJ7dPRvqlHFA9pmbti/d7oWwTJHcehGaRHk2wcBAQoibim2Zw=","layer_level":1},{"id":"95e6c408-ec87-455b-9a25-6edf69012867","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"Ctrip卡密管理API","description":"api-card-info-ctrip","prompt":"创建Ctrip卡密管理API的详细文档,涵盖账户管理、订单处理等接口。详细说明账户创建、充值配置、订单提交等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括Ctrip账户Cookie管理、充值订单提交、订单历史查询等场景。解释Ctrip卡密特有的兑换配置机制和回调处理,提供错误处理策略和安全考虑。文档应包含客户端实现指南和性能优化建议,特别关注Ctrip平台的API调用频率限制和数据加密要求。","parent_id":"667164c7-51a3-42fd-968f-e3d167096e33","order":4,"progress_status":"completed","dependent_files":"api/card_info_c_trip/v1/account.go,api/card_info_c_trip/v1/order.go,internal/controller/card_info_c_trip/card_info_c_trip_v1_account_create.go,internal/controller/card_info_c_trip/card_info_c_trip_v1_submit.go,internal/controller/card_info_c_trip/card_info_c_trip_v1_order_callback.go,internal/logic/card_redeem_account/query.go,internal/logic/card_redeem_order/order.go","gmt_create":"2025-10-08T18:19:17.9943349+08:00","gmt_modified":"2025-10-08T18:52:54.529192+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBsi+sn5XqP8JBkcaC5gJFHJK50Ht+k6VsfsVf9W/46ar2nyfG9aPfFuj3OqAvsQ2zOP7QpzVJoUCtwLglIP1GqQDfx2qCBmv9YLB3RMP78a9O9+gzXuyc6BxhwnZvmIessag0UDmHRNFDHWh/c+FW5GBTkZyHeFnwgXxp51yK06aXkjMzyn5eA4CvzR4McCvvmNyaoVacg1P7xKnbquq9Ia9uZgXZeU3u/ggK6JRkZkCVh1Zumh1AkkQGrdlfCed38c0P9WvhTtkOtaTUUgqVgV4kPOHQE7eMtvhRDXeWefnUTHsLeLBkhUnsPQh57JVtL9penKtwtZMS3ZdxKC7mBE3nQcCUFLJYE/e35/lJQB9x5nfbWUa7jPIsOajHYZdkiCN21fYL0V/Q6EPksqkB4+mB69hkPbaNChKgjBxEXViBKw0mCVrIPIm6A/3XUaOmVerm9BMmuw3TjuBiNmedKD7KGcoTVWpcKr3JD4Re10b1RuYSXVFtF3QNJf42tGl4STBHVWLQxdDzzUSzZ9a5V6O8L2nlcWzwNo8t5ea8aypotVTvuXGPCGdOfAj0oMWRzyv3UkWfkvVdqjQGiq/Awvpzm1ehEGWAdHK7Ybq2QiH9KFjzZE/zHCQblXhwJIeHrIxd42fJnxmgtzKtKkKKNLwubmC0ACReXOzkEeq5yqyl+k4DFST4612/ohoShJdbmS515Ktd/p872+kvMkvRdFL1nZyX90FSeEW+NHE2msG57PUE35eBr2HDzOeZ0aKZG8hN1kM5bx216br0hSytYUwrBk1+zBfBAxtFpFOwo9mCX5lR9ZIm3wEDL3IXMIThBbX/zEgayD4CyED7uNP7HETLzga7E2YIbK613r7V+Oo54uFxQeMZY59omb87gcgVD24gyqVYjuQdHbkY3PyT7FWdCZJgHNetaXc441gHpJadv/HvApPekkTG1aALw+qVPjAxTw0WkWMAtkqHmzCchMN6pr2UxFzp0CutbgFkzckVkztczx/MtG62+q82XL5gCUx27bTj2k/pXL7ptnIvS09Kvo4u2HGl2yTmwOX/mk3z74LDJrli3RhwLbTLZLt+9oLIyKYFJGSYgUTt4PZPAfbOt31mm2iaC9zx4TivF45d7eBwjwAxXRGJDA/0FabI+UODLt2C6Yq6FMYgT/PiDqyGnByH1VFg2sflHRsjcBjn1bEhQN8BuPrQczskgR7TIVEfyKuvuJ8D5A77vM0jeNN4ItGIwpekB/dEYYCz3ImYgXEpjtckpM8q9eCIXdL+/sNzWUMVwYXZBRYRly/8cs1ikZzbpYJT/174qCZJz/wVZTCXo1WXL+WdLu4wbkwMe0xX5kysB3MglJt2NEXqQ9PDSXap41Br/jR6Qx/2WX2+yXerLvNXS8uz6duY4F6EgJlTzzzJ0MatuhpTNRKWushr7zk55Lhuk0GQ9V+hIoTgnmGHMfVJr3sMv8H1ugeKslOpRJkKU08CEUoi4C91/YLLqEodWJ0uu2U4CG0qf6xofEmBZFmte09BxNSghJqqhCoITeAbctcbJajy4hgq24=","layer_level":2},{"id":"226674b7-aab1-4dc2-86fa-657f442b7fa4","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"天猫卡密工作区管理","description":"api-card-info-tmall-workspace","prompt":"创建天猫卡密工作区管理API的详细文档,涵盖数据同步、配置管理、状态监控等接口。详细说明工作区创建、数据同步、状态查询等端点的HTTP方法、URL模式、请求/响应模式和认证机制。提供实际使用示例,包括工作区数据同步、配置更新、状态监控等场景。解释天猫卡密工作区的架构设计和数据隔离机制,提供错误处理策略和安全考虑。文档应包含管理端实现指南和性能优化建议,特别关注大规模数据同步的效率和可靠性。","parent_id":"4075b270-ff90-4654-b074-ef377e9015fe","order":4,"progress_status":"completed","dependent_files":"api/card_info_t_mall_game/v1/workspace.go,internal/controller/card_info_t_mall_game/card_info_t_mall_game_v1_t_mall_game_data_sync.go,internal/logic/card_t_mall_order/workspace.go","gmt_create":"2025-10-08T18:20:23.1396623+08:00","gmt_modified":"2025-10-08T19:06:55.1962797+08:00","raw_data":"WikiEncrypted:ba9bhCMVYOW3qcsCaDrTBsdm8AkKOxMEeYHksr3yo/imcaxTypW54rkWuc8ok+kKMbSlF2H953r2+WhakNMZcjsjyyB7rKnqmSG2mxBDLCJWe9iaXwfbHFUvq9GbhvS4IjS4kTKCcbQ+sCUikK+7FfwbN1kjwSJYZyajiuvyySsnUbdPIeDE1F3uAgmGyh2uecVNUaDzxxoZQQCTVYlsQu3uXE9x6nf3mJm7bRTUzODojt4smYpecVIV23Xo530zZC4lJoFvu3VihPgS1mBaAyeC0wUq19w2gQv6Yl+IRv0BewRn2X0XuXoQAA/bEQkxyvI/ZnEq7Z3Ht1XjYaVwMYfnrqx3zDJngO9dGCIvutLPeWc26nTjlF9AHVe9CstGMfDsbYz2EYxAgd4TpcoxRbY94++BUXFFXjvkJVwOe4LUP1/dFcNQdJeO4+n04TlG4kCOXbKE9zdsoPSEitnEnB/ZZDfT8EDeJXv76RwkZfFLIPJKLLjbAygECbOMUx388ePp7KJlA9S2mvSAYo3fDT3UMJG4jvW9UObR+sQ0xVOvlYsc1klhStSELVLxScBsf3bT/a4J1aQu+0r7ADJBd0LJF+KDYyddEbPVOq8asO5MCI2xKVFQTSvitDVgEE0j2fUm4VYuzkx+dtP0STq5UsqNoZWJgH9QCcOWMD8OH3e8EZ401QbDJ8DQ4aXuANeMw1FSrJfj1kfo3MSfn+NlO6sq6G2Y25BdnK+4OHQCjGi9l1vEA8sb5coNTeMZMnV255/WW5jxJALdfWfT4cw50URsj1dji1e8B5YKS5tiNF8xsXSMqA1nFFPvaRs853/38eTxl3Bbb2k+wIL0uAegEpzLYl/MIFwWZYD9fv1AaAzvKWLGXoWoiTPlpdvImM5NwgHaGiP8lEt+mTkJ3TRjRInKp22n2TQcx1Mmo5R1ZaD4XEyCJqbQmy0/3Hwa3o1wshqcNGwaeaQVwHZVkij1DzaCIk3gRcxtfka0AJQvPZWEycGiLVBBNQd0ipwSLh/QeQU5Q/GEen5grBuQ9mJzDoPrNqozcgxHSW4NSCeIhkV9ZsykURjNvAnTdgq/4g914hp7dJ3gANT+uBjblNLhqJEhEBT5cmIUSHG9wA9d12q9CUdVLM6KKSs6OCmIr7uJEMtFqt7S/LyYZ3kDmcY70Z1ooUjaXBWPnjpHMMH6jPUl9Rm2ET+HD2jYR2+qCEkZYi+mIkXmagYULy9jBW3toNuMoZu8NCiwo9FwDDom9HYBHWY+WBxPd+c7QCAAHuy1siswdIkMes1uZXen9UsL4ve5wv4IuEY4ExInxqiQCcJ6r9wLjgfv+ZA5D2MqV/rtdKT5gs3J7qSM38Tb1X/s4w==","layer_level":3},{"id":"7adf686e-76ba-486b-9bb2-2a3cec96c9f1","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"中间件与拦截器","description":"middleware","prompt":"创建kami_backend中间件和拦截器的详细文档。描述认证中间件(auth.go)如何实现用户身份验证和授权检查,以及错误处理中间件(error_handler.go)如何统一处理和格式化API响应。解释这些中间件在整个请求处理流程中的位置和作用。详细说明中间件的实现细节、配置选项和使用模式。提供实际代码示例,展示中间件如何与控制器层集成。解释中间件如何影响系统安全性和可靠性。为开发者提供创建自定义中间件的指南和最佳实践。","order":5,"progress_status":"completed","dependent_files":"internal/middleware/auth.go,internal/middleware/error_handler.go,internal/controller/","gmt_create":"2025-10-08T18:17:58.126109+08:00","gmt_modified":"2025-10-08T18:23:25.9515229+08:00","raw_data":"WikiEncrypted:KoBWq/Q7Adld3nvKT6YAXvVRFLrNYt0DDitpYDIY58WLM3DcksqKNw872XjcZv8ZjRWMMF1em0URbelLXQoSbJJxay+6Xx5eY3uzpwn3m6K/xC+zkwU11i9wpekeITZkjLlFeULvIk2piZpr0spoogwCe1obDu1D5ApfF4gjGeApCWHNqQj/jerOnUAXBhZjSfMnK47C3n0Kalm3bxe6F2IpKYOfPBFEcDcJzOg0ksBHpYusJzdE9TDXZAKtUk/sOUSbiO/gzhdJVl5l/uPbkPBo7Iiub18LdFz8nEJVWRGGSNq75ZcoGK/4TX1n3Rcf55E0AEc8ifrUnQnL+OWwo1jsJO50T240TL8ajIs3bk6WkCEopsD5hs+UDLcdOMQA51UW4izTrWWIZVDMvthx1ONLnZg5T69MbnVkdZ54PwJxoFWJgbL/QrowELy4JYPMTsAtGIIZMPBlAUvCMMo8HxuxL4+5lz8f4F/GyvTXbZ9KAlFWcKASjHHF0ZLh6qqZeHCe4C/LYzmWRP5SnswySKiNm1Bst1O7EukaUJRVUXtBEyUbxoahOF0ffUYh5dKCfAlZIFyX6IK4nH2nSleaeqgYMu1kj5KlbpQ6wKnCAKCA+V3AajWwE31yADjnchUtLPiL4eELgoK89VuNIEtnneb+jE1CicDJusElKtdPeOuxf7ZvmxMayxXymmnjYajTERCz8Vz5Mj9b+F5xYZ2IGwzHnG5ue3pyAFSeC4cVorlsjjrPV38M/XQGZvbnOWurp+WlJovnUGS7upQkcxVcJ+WCY/hHco3NKFmCqGYZNRs2UT8GPTJinq22bZBl2Sqr/LEdDKbdH0MMWyT8oKdIC34sTgSzNQCjPDEs5TG174pn8kppETKmd98x9EaKI2bl3/MfA6XLaHBUGdz1/iSNVTmQxUemVKCsPWpwoEC2y0Ein0NfEsk43ENxaFGpYvCmfFEOM0G1BpTgJG2Mx5tpgNkpA2Jr+sJz/KpjhWUgtiJVY677301cHc6gZLgExY0uC7tWTEdcjnDUsG9EhmZZTVGU7Ok3eE8vIcDB2j7A2IeyVRMelqme78uu27H370IovUxK8Ag2MeY/BURY5WFfcC9oCqt0bjMnnbb8m4iGNvVcBgevhnU5DTQ9eplbeEg21tMx2cCXFsZtPFhcYh8wsg=="},{"id":"cd067009-bedd-45b4-aa16-e39dfb14cc1a","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"系统监控API","description":"api-monitor","prompt":"创建系统监控API的详细文档,涵盖健康检查和系统状态监控等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括健康检查接口,提供实际使用示例、错误处理策略和安全考虑。解释系统监控的实现细节,包括健康检查指标、响应时间监控和故障检测机制。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":5,"progress_status":"completed","dependent_files":"api/monitor/,internal/controller/monitor/","gmt_create":"2025-10-08T18:18:22.8704329+08:00","gmt_modified":"2025-10-08T18:36:45.3534397+08:00","raw_data":"WikiEncrypted:/pxnfuZ7db/sgP748CYPEnnajIZ9eAOE7G8r6j42pVkNAjXGu0NMqCu4ydfGAfQ4GCItYufWEEmQ59/IYRNbh4TeLwCIq0wIYZR+tuutkroBmNLFE5voLalJsBHhYaFnQaIIcLYC0slAZsS9oHRLvxN81DhPdygvrXE/yMXvqwipS2laucJTknMAy6yPY72cC2uNaeLCUccXQ3+7TZiCyurymQFvMJUHg8rSJXfJoIQFZYpFpU3y/Wc0h1ncH+gv2NmpFz78Z+3zMmwDouKYevCRVsVcsYKlXyMsfuzm8QPyt6042xhOVfpXWsvcNPXcKAzofi2NhJLVNH4gyXY9dOMCyz0CHeSCdHZVJoHXKQx3r5gcEptf489enTsk3rhQIsv8aNO6Mf7YbqBik7Z+TipJEsfI/66sMRt4PeLANnfc6+A0bdAR3YTSIYXSf+EYmzy0UjkNy8u3X0Wa0z1ySvPq0dHmFhm8ZMM+zYSees1DL3E5EeOOW0tNbwLlf4VLPqsDSYdqhiF1sxUVTknZSQB4ENiBo6tN73myIn6Y5/Uce2xyeMbu7HxqGCXNtmtvGaQgT1JX1C+wE6j9UzZVFxCvtxa//B1R2r8XnccZrYESFrZ+I5/t4NNolLDcBtp+Ti2SpW5KMMbhl5ubN8n9diodZSJNprv1UPJHilQQqFiYvt8zQG0vqN4MWJPF8s4xuMTpyq01/rQ3AKddpKiYTsqG13TxIYLmzGzO14Nl7v1rd0fvJ3e0QCOUyUITbeGEVofJ0AsRKyxs7SzsaMHmnLa+MjOuG9dWlU92ibQsNfTs9pCvHQhcEq7oRkzH9bm1VPCDNUlxxRcPrNeL42ETGlrzl/3gfK6JiyPsYpspcC04xNu+AfT8lPmMKXNIuUKGIS/yd2ghbla/zUIYhEiOmQC2EM6CUv7YCOa5jSVT4/f/HbkHVOwcMz+rrCh72QDmLrMFnejLqMZ3NVp5/3OisLhAp5eEP+79XK2/iRn+H6Y0a1hsoe0p00fiqzmsCLI+","layer_level":1},{"id":"cb5122de-2da4-4368-8957-6b7d9cab3982","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"外部集成","description":"external-integration","prompt":"创建kami_backend外部集成的全面文档。详细说明如何通过integration包集成第三方服务,包括京东、天猫、Ctrip和沃尔玛等电商平台的API集成。解释OpenTelemetry集成的实现方式,包括追踪、指标和日志的收集与导出。描述Casbin权限系统的集成和RBAC模型配置。为每个集成点提供实施细节、配置选项和使用模式。包括实际代码示例,展示集成的实现方式。解释集成的技术决策、权衡取舍和约束条件。提供故障排除指南和常见问题解决方案。","order":6,"progress_status":"completed","dependent_files":"utility/integration/,utility/otel/,resource/casbin/rbac_model.conf","gmt_create":"2025-10-08T18:17:58.1349501+08:00","gmt_modified":"2025-10-08T18:24:17.8528652+08:00","raw_data":"WikiEncrypted:AEnLflvTZ9QfFGHl8t1BHDRA9WRx+k15skZC39f92xz8VCWbW/CAhwVhKRUI3pMshfgpfPlxMambDUgWV5MufCgVE/tBqPjlbWIAwDTNiKq1w4oYbYE5zLTRSfsoypsE+ACA4PO8vdEpKhoYapwPamGsC5qfmaggYJ1bPSBV1qkU+jpBogd08gqeF5Uj6n6ZS1QSoq0E+MsuFxg+PVZENLCel4eXGFxHUJYsX+0XAP0NOQciiGnnziKEP0HDOzAvW3Og08OJP9g52Ze6/+QZthMf07D/2Z1egwb9fOB1k9QBcWS5l1u7QJQJGh6er1cJWzkv+OmImeV0FkPzkXoDFMrs/rwnJgE7rysIJP8eyrAQugnhy8tBHQAKgDgGU3yBEzSGt1yLYzWNfwOGqxKnHtU9G+kI/bBJw4pP8TxqOE3+4sQNPdU+MfOoBxKYeN0wBXp2MXy7Nsn1NDUCaiJEgNiFe7Epv3uWGMX1R10HQgjie/EU9HfNw4sm/nGzmfk1X+sXRos1ZCPmhONcZImMwPxy9f+KJNkh4V9tHhAd7GBkuhsioOztK07OW0v1KPgzHWbDhsbeZH0PxF1BxSIoD0B7saGdDNUvYYJOK4v7iMGxECVaRy8gfJyVuuFq80Sd/9raGPGSrrRpSj+2MNDlNkDe24LPW54jKOYPALnYEC4pImpKa+0MIxsQ5p6DMCLEvuak++khFy5JLdBEDmEO/UcNgGCVTkI5HB5VB1SPnOz4Q8DNZgcVluu69WfTpY5clNLWGapL4e46sUTD0ouUs+Rx/Ladq8cEhH6erL90DfujLY+0du2b75oVDgnyllIU+jcCRfkvTp75TgOJd4cn8HIZUi8cKiRtRRmC/31rrhpZPa0Dgy3sV6E9Ah4sNKZofPIQMZM2zaJf6Qy+s6zO5RomYHWK/Aq4P93ihU7eA39m5982qYLIRtZXAl7io3tNEbZ4i2pvObU+IetIy2c8ihuXD7u6F8aRWAIZMlATW5xRq8rdu6LWEsa3VMG0KuQproIKshNZy08fTr+xty+N8iYK0k+Cm9Vy/nf+wykMrhgJt5GyoguCZ6pYOmYXash9XLRjXG5ADoyotWUOIQDZ0tXnlXnBnMGhzqGrum4X8XSco0KdWzA6Om2fxXt5DJ1zLdc7lcITY82oRPVSAg0DJtS/nxEzJUVSLGfH6Qpjoqqi3Usfzj3407X6exTBvSK0CtN9GkYDykGkkrQ6WPzBrkTF1aFfm39sbDbfaSuX6Un6aUWKhaONJoOG+KDZTdZw"},{"id":"8204e495-d056-4c0d-aff8-fa8cd1e804af","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"资金管理API","description":"api-fund","prompt":"创建资金管理API的详细文档,涵盖钱包管理和资金流水等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括钱包创建、更新、查询和资金流水记录等接口,提供实际使用示例、错误处理策略和安全考虑。解释资金管理的实现细节,包括余额计算、事务处理和对账机制。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":6,"progress_status":"completed","dependent_files":"api/fund/,internal/controller/fund/","gmt_create":"2025-10-08T18:18:22.8791544+08:00","gmt_modified":"2025-10-08T18:37:11.2476936+08:00","raw_data":"WikiEncrypted:gLdwQ0KTVfy2nZNoG+5bdYizgJv16EHz36uF4KpBUPfyYMj4B2ukzPWea1pyWCEUGSSgvWMYpbGE/0eXLXpahXj+nH+hAZ1T5Uqw7u/veqBEMSd4ZN7RlGn3vv+9NmDgmZapIP+6vYH/S8FvnohYJDgPfroVhJsbTNWdc1r+OYfmMZXDkw4Jvi7EcW3p27E8UxGvqCpcW6V29NgKjhDHhujat8O0d/dG3yCMgFrKlXmYD/sAna9JiXICSNZtLhKAzQjQejQFVNebLsV6hDSvj8vWJpev4t3C+5MnzV/vyME3m8vPse/JGNVtfWlZblxEkyHM9EHKkl+y9lSwinSmrwBYqNjMhccJXHxBYeKEhXxsMf7UVNNhTvRyAPCllxzdsrFsI1PSrUJbjkLuBPtIQ5KWGZXO5ZklIoCP/MxvcrujKsi8ynEpCQ71VYFkV79LlyKKiP1Z2NznMXVrjFt2j9WJci28BcKND8fPSzZ1cVOGDBpxa08RAtE5D2qjOJ9L8BpEDo0TFtv9RuupBJDmBuSGWRxYRBa9c+8QbUSg269A1zt5mytOIlHm3CBHza7MKw1rh28mCwGi3B9XOEq+fJBpjqGDI0CaiMRc331/7foVEqTo+gAVYvRdTGzgcN5sVI+qy6GqKdvyFKDlJGmLgeby15Org+vgyff6iO6z7Ympy8xZepxmie7rEJrVoBjJaSCtXM9THYYSuw2CdW2BJbTHDfSdGsNL1+AwmOqVIbU9QLKC/9FF42HwnHgWAtZ6q9+pV8HUmaEmhcrxzlGiKCtoBtu7CMYTcXwvN1ZeH4fwcwuCFoaPzrJabjIurTs05pIKP/tlzP1kG1dD2e73NKcnx5KeHH8zdGTq5csTIUvezoWg0TshToj4yd2Ce6fIuy5dOEDxbc6JQYy/WNVAqnV2oFH4DtDKJGQNSjzMlDqPzs1VIFTw8JHLozliPH6PFqzilC9fLI1bp9d9fpwGnSrPjjZldPtYKbpMwJjW41KYKt4BXZnjpp3XiVZnBh2ACAyRKfdLeznjk6c/YhLEKg==","layer_level":1},{"id":"66873bab-7ce0-429a-a02d-89082ef4336f","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"日志与监控","description":"monitoring","prompt":"创建kami_backend日志与监控系统的详细文档。描述系统如何通过OpenTelemetry实现分布式追踪、指标收集和日志聚合。解释monitor.go中实现的监控功能和cmd.go中的命令行监控选项。详细说明日志级别、格式和存储策略。记录关键性能指标(KPI)和系统健康检查机制。提供监控数据的可视化和告警配置指南。包括系统性能监控、错误率跟踪和请求延迟分析的最佳实践。为运维人员提供系统健康状况评估和问题诊断的实用指南。","order":7,"progress_status":"completed","dependent_files":"utility/monitor/monitor.go,internal/cmd/cmd.go,utility/otel/","gmt_create":"2025-10-08T18:17:58.143242+08:00","gmt_modified":"2025-10-08T18:24:50.8738075+08:00","raw_data":"WikiEncrypted:HL3VqGjXq8A3aGeLxAjVPgSDAMSZYNYTq/CwRAsflMiH4lQyAV8B0kqnnEwLWrPA5JlFxLB75D+AQ2/9pMXtsBGyLagO9O2OiqEpe/bO7HIwvBvH0j/bRH4OA3rcPHQCV4r0sVGwUh/eEdGtLkkkT1qSpdyuVG4bPqgzh/rLDs8x4yFwEeXQvt307fEPxm/lOEWOX2zkXv5GaLjAYyWuTM2eifxxhjAzvfvtIzf+YcEH+JW986c3UU0Eds6bYRczAWA4jOWlKwL1A0ELIzniJrNzXBanG6h1NXU7TD9rgE1SVWyWICD2Nnr+ZhU5FRa9N34XajHqWV0o26UxnsN7+JGJcLEqPvE3Tv0YRzJyTfxqPpj+zbVayi6jWJKCF4vIISgxwNyXTeBqs2Hzotmks7wIRuV7ffT9vrrFnbyjG8KFiP7kY4mIMfo/CL+cPvFpLwMgcR+IQUlP8YMpgerhOtzwTql1/AxppJ+f0pO/a2wqaxPXELLKB/X1FE6cG5hKRvs8xnEvwxFMFbE4sdBgHOc8skQlUG3zlM3I7qk+g1W1ijedPmrKIXODPHaQ8WFaXWQ/ZyvC3vjU8O16H61ITCKcmqMatelsziUyCe/juesbXiTpEa6GNe6pltE7uI8/ilm2EbpgCO4ibMXkkhVBvZUReLKMfg4sZL2Yrtv0ZvXNaJMm1CfEpn13bqvV/HdC2QBXN6TXK13w/uMsMr0D5DwVxOqOiEt80ygf+lN5c7rb4zp/A67x7v2+A5+v1E+iq3MqzEbQlLj4FDXrEqemogyRDwqmw8pIVScXFpgnWr5SCCoHkEzU0cQHfh4Hk3ZAbDS4XZJKRUx1YurIC9iGaeF6nOtfui4EpYsS5YQAiZ/1yYsd/nI5Zx8QrDE/sUiXAI4Tj2MModNmIjvUKNAfUVPGTIxkcB1/H1WS7J5/8Ny29I2HrdbwPfyZC3wyxNzPHI0wmUfhgWn4+xftAXLtwi0ZUzaeN+QzZtjIkXz8QeuX9hX+lJ/DT9k4uVdocEHpGTwIsEOOzFWx/4UzpLqW7m9H9KqUbca9gsXYHYcsktD2cYPKGuQIkHJ3C3Viyrysd2hFFZA4KoW/0+pLnZtcP4ft0JmWDSDqh8XdF7r/fns="},{"id":"c91b462e-8882-440d-90c7-a12f37abc19c","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"渠道管理API","description":"api-channel","prompt":"创建渠道管理API的详细文档,涵盖入口管理和渠道配置等功能。详细说明每个端点的HTTP方法、URL模式、请求/响应模式和认证机制。文档应包括入口创建、更新、删除和查询等接口,提供实际使用示例、错误处理策略和安全考虑。解释渠道管理的实现细节,包括渠道路由、流量分配和性能监控机制。提供客户端实现指南和性能优化建议,确保文档与代码库中的实际实现完全一致。","parent_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","order":7,"progress_status":"completed","dependent_files":"api/channel/,internal/controller/channel/","gmt_create":"2025-10-08T18:18:22.8901492+08:00","gmt_modified":"2025-10-08T18:37:07.7365142+08:00","raw_data":"WikiEncrypted:iIHnz7p+SPRw5X8B3MUgFa3SWR2/Ac9jwMRHn97q5TAg/jMwINtcbL5tYBTv90hQTNAlft0onNagd77WQYgFAUbr/hurYRZ+mt/lb3o1rOqpBK12mmTfxKl2ybT5ohYhbercVyHXiabficTisH8KWoyrZ566Ui1H9pqtQF/GrrtIi+Td4U8o0gtHAdEZCfaPNmO7CrqJgSjnDgjRbziLAtZ0EmCF6fqGQS0izR81eUDwq59erHoiKZ7u7VAVGSBS67EUL2KHYHgcApNpFCWBLPOI5UCp+Iiwnp9iUlxZv/E8E6X73U2BJk4SI9y4vzh3Ttn07qyu8hKusTgTgyXSYyn6L+PrdPwPsnWR+zcRttRRAeKkPzNaZxkTmcR3w2aIb/lbQ9jGcfXPO+C4n6MNW00ROPColagBltNS2+YthHqmXHlzMxDHZKwQ44RXfgyM5SpvkQWRdYLNgqtokMd4LJ3iS11Gbo3Bf68UPu5UBcpJsri++zY1OTRgIM4j0JI4fVLwqMHieHVZ7RInKj3EKm/W4TI1SZbKSUxA7yAqw0nM3z4sLmQXCXzWEDVzFfgZaofr6DzZlfJ8LOBxJ7AGuz7+agPVtR0DMvmeqiS5f/liW+5TninqNXkLBTGZGhdm75y5syHJucfgCS9DsZXMJW0XKL8bPZZS/ji1Rda4BjQZtmJ5Z+aPGt6YkCmo27N1t+wzAE1+t37Euom91RpXDFxtKv83XKgym9d7m0yvAIn3dUp+QM8FV414mAOppnUG+8J1H90QPv24YVIF12YMnhoZR93pUSYidhAZhxSrEcZvLH/d16z+AgVlTdUH3svOmwikAh6cZbqYfOzfG+uwWxlzCZ1CDmq9XYLntOR42UsvOivTwQWg7+sUaFbCO5CAV7mF5XiDmNJ4L8YMTvziX7RrGD3FWX32UKCL0VYEhK8w2YQf800Qw9IK/NSekK678tB/FLKNQXH9KTFL3I5dxPpc43UL4thkeVlcnSAvGVeyh54KklcwIR/SkVNT73El","layer_level":1},{"id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"安全考虑","description":"security","prompt":"创建kami_backend安全架构的全面文档。详细说明系统的多层安全机制,包括基于JWT的认证、基于Casbin的RBAC授权、TOTP双因素认证(MFA)和数据加密(verify包中的AES ECB和MD5)。解释每个安全组件的实现细节、配置选项和使用模式。描述身份验证流程、权限检查机制和会话管理。提供安全最佳实践指南,包括密码策略、令牌管理和安全头配置。记录常见的安全威胁和相应的缓解措施。为开发者提供安全编码实践和漏洞防范指南。","order":8,"progress_status":"completed","dependent_files":"utility/verify/,utility/mfa/,internal/middleware/auth.go,resource/casbin/rbac_model.conf","gmt_create":"2025-10-08T18:17:58.150125+08:00","gmt_modified":"2025-10-08T18:25:14.6735173+08:00","raw_data":"WikiEncrypted:JNhY5K+GVMrcGagKRy9Mk7FDSla9iou+ClFWN6MXlEsbYodNWdiz6ySYmjiIGCkErYW8rEp74Y3ffECzqYfUMgUm4vvbvGH/wNZLeGolBIGCxHz93Iu8N0rH9T/GGy/3VSXTdXh+xwn8wR8JXVZjqGL/jX6KB7HcUAzgP0FTcsl6fofLDjoeWfjFnVUlq3NQ5Hm9Oh4zOwj8ZBWkhlNrfLqaz/10vYVO1yl4H2a8EY5pzMAMy7ddYDR1H0PTrnLtAQEgZ4635awl2ApTEU+CQ7dJd0asauNzRgcdBPN+h+/5ML9aKBQCNxSXYYozXND39UXbXFXy8YNVzJ4uOedazXAiXBXcS7h8m6kPNFIcBVvdRjL7L5orCknTub/ZhMVNN6TWrxPY2dFu0iJws+aBxtE+muG39UBz2nlAci4k4iCSwFxtJNYBddhPT/EdGOjIbZPWsIQm4t0BdqvjQGlGK/T1O7+KjqJGm1W3z5ivjmPJvm79sF77Ooj7yNeCZZq/BUBoblFKGV8v9BCbo76JhjACpJYhbRGtqssPKP8dYf7NTWAa35RELOBV2wurf929ZY5U9xw/tci1vi5YExOaWCEbEMlN5hVsjmjR+DXy3cC5aYy2IwyayqCYCW5C0lHARcRX2R4KsdHjhl01Is5yIqgL1ECcV3Cdt5WK88r89JxxxCWTjM5SRG4Q90t/AkNjjwjZuS/68i2+Q3FcXwH5kD/ERuM6JrwaGdAvoX4uqIzfYa9D/ElecgprEiQkNJLn94NV1cDdMuwAzFP1CkXrNtm9AjOJQYcPMPLf+VJg5i56y2U240QdSBvId7eBkXkBQMHfk2PCZMf52P3D5e8p0L18U6AyR80Vq5RdQRkmD5n/WKDv7joxpYRQ83J3Omvj5Ew3p9A72Y70jsEujEUU41PxeDBL6U0hqv1XYr568bAlqSqnbUs4pZpS8jfdZoPpPiYTEgHX2jM+YgF3Dezji52Xn21dcBlLkyWX8QN4RG7mzyAFzorHa1w0uMdcLjvYAVqA76WOloo1IbTiAWlq0QrDRD9ASMQSA2n+d0a11MsyCzR5Dy3QM1ILGNp9MG0hPqgBaKJQFKVh3VjBxZatt5EVEzqBMX13xm8ONEcZ2BowDMOr1pto0LFUdfK/Lin/392tF8wnEcDbFa6sWVeFXCk6CDqCR7kM/XuJ2SeVa3ti7lE4FbNiUoqERIvEIVWl"},{"id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"部署配置","description":"deployment","prompt":"创建kami_backend部署配置的详细文档。解释如何使用manifest目录下的配置文件进行系统配置,包括config.yaml中的各项参数含义和配置方法。描述Docker容器化部署的实现,包括Dockerfile的构建过程和docker-compose.yml的编排配置。提供基于Makefile的自动化部署脚本使用指南。详细说明不同环境(开发、测试、生产)的配置差异和部署流程。包括Kustomize配置管理的使用方法。为运维人员提供完整的部署检查清单和最佳实践。","order":9,"progress_status":"completed","dependent_files":"manifest/config/config.yaml,manifest/docker/,docker-compose.yml,Makefile","gmt_create":"2025-10-08T18:17:58.1578653+08:00","gmt_modified":"2025-10-08T18:25:27.2563114+08:00","raw_data":"WikiEncrypted:0IKfLNOWe9mZfG1jVts3w0YDXzCWWQgRFe88de5EDrjdrx5FvxhMWrOPqCCjFYDUiVbb5/bIdikTJC49sd0RRkCnBLWWiQ8NCaq4WB6ZQ+3a83ydlr6m6JASndgfW+MNJLsB/AkqgfgF0pnC7r35xywsX3hzMaSG+9fNbxEdHJ6HSbxlN2SmWqe0QVeHYlUmlP32NjH4QOmLyRzC/bnAQYwGmReeV2s1qAyuh97+ECOTAvcZlFioRoAPaKH+JFWTgJ/9HEw736K2t+i9O0E5yb3leIdX3k/wpToNCw0B7YRDBxoNJSAnoXPzY3MQ6iXc3VzjhUIxRjWpV4QMM2auMU3iWaIuBDPBLzvCRlyYH4y6BKLJp/hFHCDHsooVSACWrNFoXGi0jhZ1ZutJSAHor20VBLnfMxVtsg1wgKxtsvM/qrCAF/INXWguXiF+0DiyE7NqJktcCKGBERR6Zq5JhwE4qgrMOHu0+AC29AVLVnWiUWh+UBtpseN9mPngkySGAliCoEFCkkoeDmia0lsxMD6SEqBmUCp77eDYFUHngrj6KRkri25ZLKoXzoz74K0ABP3yauEZogoVmMVepTSUo/ZbSejsQiJFPWsNvw2TsG2cU8mDAU47lsbw3KSeD/tGdPk5dhCAn5QQKK6bi5OZBvSAtARBHlwvytbkAzuNLdE9GwzHlnR17Z2ovh4a1q53xDpU/pMCgatn2oQY0G/Uhp8EMfvpDLne/g2fHAEnoxbYF2la66wS3m2ddH70yTg0GDPVcvJ8Pie6pm9zZYuqoFyP1ILgxhsV/3sxzZ9P1gH7n6YHxstgxD46iIY1mNnyFC+HaqZ+cXwJa5CQHDz6CjD/hhfBIzo+F2mOselApiAzyulZquFZ/TBHs2QnlUxnO14RDmdvZqoSY65/A0C53vDcTJOi5pDNv8CvnHL2O9vkCc87Y7i9kULm54xtMzhm6qCw7e/UDbNqoNZBiN81EZgdxKfd28zLFEBMljqkWPeMpwwh0H6Sg2bGwzEoFYSMppXQ7LnUjjUM6deWlz6jjDLQW5YPloYNs0VCesdFff3Jgl0ukqaL/4VMcwIvYY4MG9gDGOfndJE7w/9lHt1gjgCqWj1oRotUTX/FmgK6mfIZSYL+6H0tNvqBrF22JD2xQPJYMjTeZhqXFpDggQ0Zgg=="},{"id":"d8adcb5d-4add-4fc9-9cd2-44602cd01176","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"测试策略","description":"testing","prompt":"创建kami_backend测试策略的全面文档。描述项目的整体测试方法论,包括单元测试、集成测试和端到端测试的覆盖范围。解释如何为业务逻辑层、服务层和控制器层编写有效的测试用例。提供使用Go测试框架的实际代码示例。说明测试数据的准备和清理策略。记录代码覆盖率目标和测量方法。包括性能测试和压力测试的指南。为开发者提供测试驱动开发(TDD)的最佳实践和常见测试模式。","order":10,"progress_status":"completed","dependent_files":"internal/logic/,internal/service/,internal/controller/","gmt_create":"2025-10-08T18:17:58.1670385+08:00","gmt_modified":"2025-10-08T18:25:41.3112243+08:00","raw_data":"WikiEncrypted:a51tw9+B5Xez88YuZqi4cCl5g5NXQt1V6Pb/QRAF0PSKIjxPFV7AEfF4w+l+7DHrGeS8tfJ/vC4KxD6lXFbPmpRVzqnB6jBTxt+omzKkRXu4zRL+yNwKNmLsZileMwxBWJrBgmmQEaaKMPiOUCfIMM3FtdDr7ZM+j7xcZlupeK81exA7sjy5gfJn0gqzyMDpXXx5+pYxsc+RYpMHYzGruACmN1/YNT37fHHOyxwIkeXw8jCAKDx3U1sXr10u1Pmv/fPUtWL2J8CdDtK0QlKSg6KBhhnTdnaHPAYBwdUoY8cVksmqyW6bSfzk3fhXOtAfo0Gb2PQ0rNMPwOyNs4kor6hecMyrFv+wi/nRw4egrpA+aMkLhxjirf+37hTku0kHmq1NVc3ryaQjOnFdnczzDCDMB43oiX++LC/bdbSEPbLnxHO6AAVAwo+OziyhjmmWpiQRaMOuFQyBNubWKslzTDX5bRG4sGwjGhl+e7d9RVE+yIrA0f4/jCqwH5N0bFwMUPvsDlQjZgGX5wMA2OBVQL3tJ3ssr4DObs7KWFxaIGQ88gez6NRAdqHHC4f8kgwi97J1mAQtptDwWWa8bRgebTgXBRpvOvbK2KmoWIoOPFANZudf+Is0FYBmRGww5j4TuiX8zwzqBaRQKOFMv69F8QxBfIIKfo4hTkZxV3Ns4RNhiC2JZMirXU8CnvTFQhI5Q+WF/guz6rnpFpFvuYnKk2nqEOX55oXYvVAENFBCKZWTAtpYfkfLiKHOf7RwYnXSDWU0Fh5LflCYgha41a+kiOJ/SeCnefjcrI/i83jQtR2Qixfiosh56QZk7Zf38n6CbYxUzw+pW0TbmKcD8m0FzPA5wSRYRmVlDbpJqO8eQAqYAvLxeSyv+QiffYhax6Jg/Bim5xiGZ1w1413rS/W40Vzxf5HES9qy08W+lKb11ajeCZHQuQgimzqEDsoozgBaKc1QjtfluNQOrjDmsRMvpvviBRPhqsqwyCYeQFrsKxKbm8wM/a8MNfnvH5z5md7G"},{"id":"0ff8c734-fe65-4ed9-a4d6-2f74b176ac42","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"快速入门","description":"getting-started","prompt":"创建kami_backend的快速入门指南。为新开发者提供清晰、逐步的设置说明,包括开发环境配置、依赖安装、数据库初始化和项目启动。使用Makefile中的命令作为主要操作入口,解释每个命令的作用。提供'Hello World'级别的简单示例,展示如何调用一个基本API端点。包括常见问题的故障排除指南。确保指南足够简单明了,让开发者能在15分钟内完成环境搭建并运行第一个请求。","order":11,"progress_status":"completed","dependent_files":"CLAUDE.md,Makefile,README.md,main.go","gmt_create":"2025-10-08T18:17:58.1748999+08:00","gmt_modified":"2025-10-08T18:26:09.7668027+08:00","raw_data":"WikiEncrypted:qfgbutC7oyxR6nMxrwk1ODnNMBEQ3/sG78fQT1yXWjuiNN7p/9UiziFtG8VxSN3lDZPQFx0/QJ3DnzLYLtDRB4nGAaU70RZkhO+ON1gRN4x+OHmdrMLZxTrt1rT6pGA304dmEU5OCbFwPbamZhWwUiBN85RO9DSQy2tzy/P/lVYlefkzZMkpfKXb9Hr2X9EYwdxWad8uG+wdSo7mYQ6g2cGIh6DXj5RS83lPDobvMdSy2x/+meDkNsdZVrtgqWSPSfZB7kbAgbAwqL66wuPprOWkltTYURGRfQIKB6OhS+r9VX3YXOm+gQXKVeTKrOzf4NXqlD25+zhbtCJ3+4IzXOpl8s5skN6wQcclYhNU2fZ0+dhVr2zUOJv/Swtb2ppsHzKz/H2CZ9U9jz+M19LpXEq65esOK1cJDloyR0A/LEuZREMHX/itrpygGEXG1NhnJdnffjF9snrEFtX4to8GEHJTSUJ7xAbIWr1Eceb93J0pKYLGy9eNXaKuEU2A9HyZHdkI5409eQvTnIABD7JVK8EZlcp12EI0LtM1fFMI6/cvAOk826mSlFvoy6J2JdN0zN2mhqlQ43bWoyVFPq29j8ZmAVA/rf+wSQoXZS7UKmeuGosnjq6MMZOZ/KILspUla3seZ7O5+Os1gd71bHfOuCkQPJUQWWtPeSbhF08+pwWOkmbEM2+yo9JwnDh5GdRaqRT4BMZgREKFdqIUVvo4XY9GCyXJJGce0AKXrI70YRhapEjIV1rF7jRZ52QQcEBvRl6JsFcZEMkKnGyOHEZCVtmvAW4gI1yJ1XmCM7RzER77Q0l9IzJlSNp6SVCHz3Tqy1gDWAlPNHwCCsEn/7GZikekXguvT5jfZBNNtrpFH78RmRIXRV9qCLNZaBnnZmOQbzPjFNBy9v0ZQHFqYW6HPYyMlMFVZtZibhPe1UDOm22OOmnwEzdlDtUQZpU/ZIeftMXuXgPoP64qn7ytqc6gPu59MXlUVl8D3G4+labxbVg="}],"wiki_items":[{"catalog_id":"ce40f505-b68c-4af1-a528-07209610681c","title":"技术栈与依赖","description":"technology-stack","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"c53f923d-222a-4d7d-a637-4220acf7e419","gmt_create":"2025-10-08T18:21:57.86022+08:00","gmt_modified":"2025-10-08T18:21:57.8842727+08:00"},{"catalog_id":"0b3d123c-d945-490b-9be3-0a0156bd9c75","title":"API端点参考","description":"api-reference","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"efe5f5ab-5617-4174-a512-fe883ed4d5d3","gmt_create":"2025-10-08T18:22:15.2997666+08:00","gmt_modified":"2025-10-08T18:22:15.328987+08:00"},{"catalog_id":"30a87f86-8316-4aaa-9710-55a73536f8a0","title":"项目概述","description":"project-overview","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"449db534-7a3a-42e4-aa53-cb970de26af5","gmt_create":"2025-10-08T18:22:33.6149332+08:00","gmt_modified":"2025-10-08T18:22:33.6271605+08:00"},{"catalog_id":"7adf686e-76ba-486b-9bb2-2a3cec96c9f1","title":"中间件与拦截器","description":"middleware","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"33ff75e1-7d31-447d-836a-9420a8592899","gmt_create":"2025-10-08T18:23:25.9410782+08:00","gmt_modified":"2025-10-08T18:23:25.9530931+08:00"},{"catalog_id":"4c7cdc96-8bfb-49ad-ae8a-c918df9d77df","title":"数据模型与ORM映射","description":"data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2cca8166-9978-4afd-bc29-12d24f30511b","gmt_create":"2025-10-08T18:23:37.1903946+08:00","gmt_modified":"2025-10-08T18:23:37.2022882+08:00"},{"catalog_id":"3ef6f1e5-0825-4296-b467-16584d8e71ee","title":"业务逻辑层架构","description":"business-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"72ce2c2b-8a00-4d8f-95e0-d0db70b17151","gmt_create":"2025-10-08T18:24:00.7572202+08:00","gmt_modified":"2025-10-08T18:24:00.7735726+08:00"},{"catalog_id":"cb5122de-2da4-4368-8957-6b7d9cab3982","title":"外部集成","description":"external-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d1f058b7-b773-4a52-a247-ca202179a38a","gmt_create":"2025-10-08T18:24:17.8422539+08:00","gmt_modified":"2025-10-08T18:24:17.8544372+08:00"},{"catalog_id":"66873bab-7ce0-429a-a02d-89082ef4336f","title":"日志与监控","description":"monitoring","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ec6b67ce-9450-4010-be2e-b79e28064b7a","gmt_create":"2025-10-08T18:24:50.8628819+08:00","gmt_modified":"2025-10-08T18:24:50.8748585+08:00"},{"catalog_id":"41f38d6a-2b67-4851-ac46-cbbe0b64c9f9","title":"安全考虑","description":"security","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1d1fe734-c124-45bd-8e0e-7e257637147c","gmt_create":"2025-10-08T18:25:14.6595106+08:00","gmt_modified":"2025-10-08T18:25:14.6782105+08:00"},{"catalog_id":"c3f44920-7bb0-4c57-8c10-ff9ebad8759e","title":"部署配置","description":"deployment","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2596be88-c8af-4fb3-92c6-b20acc278dd4","gmt_create":"2025-10-08T18:25:27.2457106+08:00","gmt_modified":"2025-10-08T18:25:27.258378+08:00"},{"catalog_id":"d8adcb5d-4add-4fc9-9cd2-44602cd01176","title":"测试策略","description":"testing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5304ead6-cd19-460e-b67d-48b435f22815","gmt_create":"2025-10-08T18:25:41.2948416+08:00","gmt_modified":"2025-10-08T18:25:41.3133721+08:00"},{"catalog_id":"0ff8c734-fe65-4ed9-a4d6-2f74b176ac42","title":"快速入门","description":"getting-started","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"29873300-4527-49dc-b09b-b2762c15fa35","gmt_create":"2025-10-08T18:26:09.710294+08:00","gmt_modified":"2025-10-08T18:26:09.7968836+08:00"},{"catalog_id":"1047f41a-bd32-4847-b8fd-30a602c62426","title":"用户数据模型","description":"user-data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1b282661-aef7-449c-bd9a-a8eaf6f14441","gmt_create":"2025-10-08T18:26:32.4360085+08:00","gmt_modified":"2025-10-08T18:26:32.4470628+08:00"},{"catalog_id":"e408f911-d11a-43b9-a15a-d55aafbd4257","title":"卡密管理逻辑","description":"card-management-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1c2ff1ac-8239-428c-a7e4-588909d7b8a9","gmt_create":"2025-10-08T18:26:44.4316709+08:00","gmt_modified":"2025-10-08T18:26:44.4640466+08:00"},{"catalog_id":"bac7f19e-b5b4-4f8b-b3df-60a9d5c50b58","title":"权限管理API","description":"api-auth","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2ad8c87e-fc50-4b1e-a30b-80f4412ab361","gmt_create":"2025-10-08T18:27:26.5686536+08:00","gmt_modified":"2025-10-08T18:27:26.5895905+08:00"},{"catalog_id":"246ad670-c405-4630-be1d-c8b8f141bd4d","title":"电商平台集成","description":"e-commerce-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"b154cecf-5b26-4ce2-a877-4bf26722c8fa","gmt_create":"2025-10-08T18:27:39.7864028+08:00","gmt_modified":"2025-10-08T18:27:39.799908+08:00"},{"catalog_id":"06703965-884b-43ab-8766-69692f23192e","title":"认证机制","description":"authentication","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"0d50c325-08fc-4fc2-9975-8900a05e1f79","gmt_create":"2025-10-08T18:27:42.1232636+08:00","gmt_modified":"2025-10-08T18:27:44.9990084+08:00"},{"catalog_id":"a9774984-bf32-4c6e-b5cc-51ed0755486a","title":"配置管理","description":"config_management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"92827d43-4b07-4062-a8d2-10f86e815288","gmt_create":"2025-10-08T18:28:10.1773417+08:00","gmt_modified":"2025-10-08T18:28:10.1889099+08:00"},{"catalog_id":"41fc8a89-8530-4842-9880-7b6fed4e4fc0","title":"订单处理逻辑","description":"order-processing-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"f3a5aa78-1844-44d4-8c02-90fa1c4a617a","gmt_create":"2025-10-08T18:28:45.1326361+08:00","gmt_modified":"2025-10-08T18:28:45.1597121+08:00"},{"catalog_id":"07543b8f-2f20-41a2-a409-abc1181a1000","title":"订单数据模型","description":"order-data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"8a68e396-b4eb-49d5-9cc8-d6769cc9d293","gmt_create":"2025-10-08T18:28:50.2894233+08:00","gmt_modified":"2025-10-08T18:28:50.3075508+08:00"},{"catalog_id":"0af73ef3-77d5-452c-acf5-4be5ed66a80e","title":"授权机制","description":"authorization","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"0b98c6a7-2c63-4de8-b96e-5c9438553444","gmt_create":"2025-10-08T18:29:44.6855759+08:00","gmt_modified":"2025-10-08T18:29:44.695825+08:00"},{"catalog_id":"667164c7-51a3-42fd-968f-e3d167096e33","title":"卡密信息管理API","description":"api-card-info","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e430fbbe-6369-43d2-91f0-806ad7bd9eb8","gmt_create":"2025-10-08T18:29:49.5004454+08:00","gmt_modified":"2025-10-08T18:29:49.5245605+08:00"},{"catalog_id":"efbd0135-a20f-4d24-a080-3249ecccfdfe","title":"监控系统集成","description":"monitoring-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"eb9554e2-6b58-4299-ba8e-014d67b58d27","gmt_create":"2025-10-08T18:29:59.7439799+08:00","gmt_modified":"2025-10-08T18:29:59.7590164+08:00"},{"catalog_id":"4ca438ce-5592-45a7-bcdd-830f65e0048d","title":"容器化部署","description":"containerization","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d1a1035e-72f5-4027-82c3-d1d30d2ddcf0","gmt_create":"2025-10-08T18:30:37.6926931+08:00","gmt_modified":"2025-10-08T18:30:37.7017633+08:00"},{"catalog_id":"d9cf54a2-ba26-41a5-bbb9-4d5403784548","title":"商户管理逻辑","description":"merchant-management-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"26ded6ee-4f47-4b84-959d-4b880ce5feaf","gmt_create":"2025-10-08T18:31:02.7280296+08:00","gmt_modified":"2025-10-08T18:31:02.7405469+08:00"},{"catalog_id":"f789fe9e-fa47-4625-95bb-bfd66cbb240e","title":"卡密数据模型","description":"card-data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d22c2dac-c15a-4fe9-8ecd-c9fb99de06c1","gmt_create":"2025-10-08T18:31:25.8152815+08:00","gmt_modified":"2025-10-08T18:31:25.8270381+08:00"},{"catalog_id":"e70da257-5cec-4667-9471-82f4f2d36085","title":"订单管理API","description":"api-order","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"aa28412e-070f-4b61-80cd-dce192e20222","gmt_create":"2025-10-08T18:31:48.7115391+08:00","gmt_modified":"2025-10-08T18:31:48.7253654+08:00"},{"catalog_id":"1d615d31-fbd4-4788-9190-9fed9c087918","title":"数据安全","description":"data_security","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"4084eb3d-9044-4535-b095-d22e7043730d","gmt_create":"2025-10-08T18:32:10.5735193+08:00","gmt_modified":"2025-10-08T18:32:10.5845931+08:00"},{"catalog_id":"bc2a2077-5917-475d-8239-ea5d96be2603","title":"权限系统集成","description":"permission-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e0c77bdf-d688-4314-a114-f9c68f33f989","gmt_create":"2025-10-08T18:32:32.3846513+08:00","gmt_modified":"2025-10-08T18:32:32.3942736+08:00"},{"catalog_id":"9e74acd3-671e-4b63-b045-115b89d5bf61","title":"自动化部署","description":"automation","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"9698be30-efe1-4f48-8e31-4eb41942794b","gmt_create":"2025-10-08T18:32:49.0573596+08:00","gmt_modified":"2025-10-08T18:32:49.0836805+08:00"},{"catalog_id":"6d13ba87-5f1e-460b-85b5-9106d41abbce","title":"风控限制逻辑","description":"restriction-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e022f533-9479-4d7b-ac30-98df4f993dae","gmt_create":"2025-10-08T18:33:33.7071708+08:00","gmt_modified":"2025-10-08T18:33:33.7257394+08:00"},{"catalog_id":"f04a62bc-4cbd-4707-9c3e-ba4bcc54c7b8","title":"账户数据模型","description":"account-data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"cc3d65ef-7d45-4f41-92d4-543c54d6976f","gmt_create":"2025-10-08T18:33:34.7020665+08:00","gmt_modified":"2025-10-08T18:33:34.7214205+08:00"},{"catalog_id":"a2cf591c-c32b-481d-b282-9aa974785e4f","title":"商户管理API","description":"api-merchant","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"7b9b8434-cebf-4493-9f0c-5f637ed76c88","gmt_create":"2025-10-08T18:34:16.736243+08:00","gmt_modified":"2025-10-08T18:34:16.7587694+08:00"},{"catalog_id":"ce1ff67b-076e-4f30-bc68-a8b00c99ea5c","title":"Kustomize配置管理","description":"kustomize","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"b0ac5f4c-4638-4b5b-bdaf-65aa7255d0bd","gmt_create":"2025-10-08T18:34:17.4787437+08:00","gmt_modified":"2025-10-08T18:34:17.4997199+08:00"},{"catalog_id":"cc885279-4c8a-49b4-9404-36f4d66b3551","title":"双因素认证","description":"mfa","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"f34f25dc-7c0c-4261-a3a6-951d7146367e","gmt_create":"2025-10-08T18:34:59.421727+08:00","gmt_modified":"2025-10-08T18:34:59.4344662+08:00"},{"catalog_id":"943671f2-9767-445c-bfa7-31828091ba9f","title":"系统配置数据模型","description":"system-data-model","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"86be688d-c6c8-478a-a186-c4b69e3a5389","gmt_create":"2025-10-08T18:35:37.0282445+08:00","gmt_modified":"2025-10-08T18:35:37.0526354+08:00"},{"catalog_id":"1213eaa6-98ce-4b50-b9ac-280f7bcd9725","title":"风控限制API","description":"api-restriction","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5634b703-c76b-4ff5-a118-094768c7647c","gmt_create":"2025-10-08T18:35:55.5881646+08:00","gmt_modified":"2025-10-08T18:35:55.812882+08:00"},{"catalog_id":"3ec3b755-bc47-4e79-857c-911ef11fcf2b","title":"系统认证逻辑","description":"system-auth-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"b72d2b05-3702-497e-9920-c16753190c30","gmt_create":"2025-10-08T18:35:57.0375837+08:00","gmt_modified":"2025-10-08T18:35:57.1998606+08:00"},{"catalog_id":"cd067009-bedd-45b4-aa16-e39dfb14cc1a","title":"系统监控API","description":"api-monitor","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d23cc27b-1f00-4a1c-b380-ecf970b24500","gmt_create":"2025-10-08T18:36:45.3439484+08:00","gmt_modified":"2025-10-08T18:36:45.3545367+08:00"},{"catalog_id":"c91b462e-8882-440d-90c7-a12f37abc19c","title":"渠道管理API","description":"api-channel","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"cccc8700-b0e6-4056-afd4-f013bc40f805","gmt_create":"2025-10-08T18:37:07.7168095+08:00","gmt_modified":"2025-10-08T18:37:07.7387952+08:00"},{"catalog_id":"8204e495-d056-4c0d-aff8-fa8cd1e804af","title":"资金管理API","description":"api-fund","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"fed3b59c-0a3f-410d-b9b3-46b694361e86","gmt_create":"2025-10-08T18:37:11.2372738+08:00","gmt_modified":"2025-10-08T18:37:11.2487732+08:00"},{"catalog_id":"1a62d745-3b65-4062-8a9e-207c4435c8de","title":"Apple卡密管理逻辑","description":"apple-card-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"43b20c2e-ec0e-421f-b164-49961f882c41","gmt_create":"2025-10-08T18:37:52.9621272+08:00","gmt_modified":"2025-10-08T18:37:52.981408+08:00"},{"catalog_id":"75fdbf05-77f9-41d9-ae7e-43c541799856","title":"Apple订单处理","description":"apple-order-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5d2b1aff-1b72-4b4d-81ef-292b6fb141ea","gmt_create":"2025-10-08T18:38:12.9624265+08:00","gmt_modified":"2025-10-08T18:38:12.9746875+08:00"},{"catalog_id":"abc2e583-1d2a-4ee7-b376-101d505c3e2b","title":"IP限制机制","description":"ip-restriction","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"220a20d1-b59f-4e95-9c74-45f184bbf4df","gmt_create":"2025-10-08T18:38:32.9589851+08:00","gmt_modified":"2025-10-08T18:38:32.9753909+08:00"},{"catalog_id":"19fa9669-f28a-4a88-b0f6-b6039eba9dde","title":"权限规则管理","description":"permission-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e0093b95-1254-42ed-9a30-0b016a93c8f6","gmt_create":"2025-10-08T18:39:14.8238297+08:00","gmt_modified":"2025-10-08T18:39:14.8475145+08:00"},{"catalog_id":"4fcdd635-a7b8-437d-a7fa-e884bf805980","title":"订单表单管理","description":"api-order-form","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"71c2fbe4-8d26-42ec-ac1b-e333bb0b52f5","gmt_create":"2025-10-08T18:39:17.2413486+08:00","gmt_modified":"2025-10-08T18:39:17.2626815+08:00"},{"catalog_id":"c880e7cd-8a8a-4fcc-9cec-e8143d3c9af5","title":"菜单管理API","description":"api-auth-menu","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"08f602b3-4b0b-48b1-90d8-e9ad4c3a8e8e","gmt_create":"2025-10-08T18:39:22.8465729+08:00","gmt_modified":"2025-10-08T18:39:22.8754368+08:00"},{"catalog_id":"a57b71e5-1d71-451b-b859-003e624668a2","title":"钱包管理","description":"api-fund-wallet","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"727c48c6-ef3a-4f42-971b-900965e76ba9","gmt_create":"2025-10-08T18:40:13.6090661+08:00","gmt_modified":"2025-10-08T18:40:13.6270435+08:00"},{"catalog_id":"bf4dad59-5b01-41c5-a32f-2997c514506b","title":"商户配置管理","description":"api-merchant-config","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d3a5326a-d41d-44bd-864a-be52370e93ca","gmt_create":"2025-10-08T18:40:25.9500356+08:00","gmt_modified":"2025-10-08T18:40:25.9769883+08:00"},{"catalog_id":"c3bafd09-0a3b-4367-aa8b-205d67e4c3a8","title":"IP限制API","description":"api-restriction-ip","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"324d8b07-6e56-45cb-a1c3-780fd8b0da61","gmt_create":"2025-10-08T18:41:29.8617989+08:00","gmt_modified":"2025-10-08T18:41:29.8822026+08:00"},{"catalog_id":"65e19eda-b904-453d-858a-07d58ddf98d6","title":"Apple卡密管理API","description":"api-card-info-apple","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"57522f63-5c80-42f4-a421-d7e20cf4a13e","gmt_create":"2025-10-08T18:41:41.6602592+08:00","gmt_modified":"2025-10-08T18:41:41.6833335+08:00"},{"catalog_id":"59443325-27d2-48ec-b0b1-babd3b4b0fdd","title":"Dockerfile详解","description":"dockerfile","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"0e508eb5-9f7d-423f-a16a-a4a26053ffaf","gmt_create":"2025-10-08T18:41:44.1686903+08:00","gmt_modified":"2025-10-08T18:41:44.1811731+08:00"},{"catalog_id":"fc08f303-bc77-43ab-a283-6dd9b2e73b10","title":"Makefile自动化构建","description":"makefile","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"50d491e8-49c2-473e-8f38-7a0bb1fd8643","gmt_create":"2025-10-08T18:42:23.0306518+08:00","gmt_modified":"2025-10-08T18:42:23.0539505+08:00"},{"catalog_id":"e264b815-c6f8-453a-8aa4-d6f2332a759c","title":"京东平台集成","description":"jd-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"f6124145-1fee-4e5d-a268-3114e12f5d58","gmt_create":"2025-10-08T18:42:53.1580653+08:00","gmt_modified":"2025-10-08T18:42:53.1806109+08:00"},{"catalog_id":"4b047e2f-4d42-4e10-a12d-f5dda665ecc6","title":"京东卡密管理逻辑","description":"jd-card-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1c9611c6-fe35-416b-9f4f-0a461e074d45","gmt_create":"2025-10-08T18:43:18.2281831+08:00","gmt_modified":"2025-10-08T18:43:18.2495471+08:00"},{"catalog_id":"5cd26818-f1c0-403e-b35a-4383474124a9","title":"地域限制机制","description":"geographical-restriction","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"86dccb84-a13d-4ba9-be89-c9c2946c9431","gmt_create":"2025-10-08T18:43:32.5166592+08:00","gmt_modified":"2025-10-08T18:43:32.5288871+08:00"},{"catalog_id":"0fd7eabc-705d-4b45-9497-9b3e2641c0f8","title":"角色管理API","description":"api-auth-role","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"8259d8cb-a84f-4158-bc5d-61dfae91ef1b","gmt_create":"2025-10-08T18:44:25.9859325+08:00","gmt_modified":"2025-10-08T18:44:26.0069667+08:00"},{"catalog_id":"7f916288-d706-4266-b42b-402c6a9efb46","title":"京东兑换订单处理","description":"jd-redeem-order-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"82a92b25-0996-44c1-b938-ad2fd9c3ee20","gmt_create":"2025-10-08T18:44:50.7360926+08:00","gmt_modified":"2025-10-08T18:44:50.748014+08:00"},{"catalog_id":"100a2b02-1888-4c57-9cd1-b2492db9671f","title":"用户认证管理","description":"user-authentication","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"78e368dd-811e-4c4a-acfe-5f6c0d16e355","gmt_create":"2025-10-08T18:44:56.9670756+08:00","gmt_modified":"2025-10-08T18:44:56.9798585+08:00"},{"catalog_id":"0d2e9821-fbd5-4482-89b5-00c6af8b0922","title":"订单日志管理","description":"api-order-log","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"67f412e0-35f6-4d48-966b-e1abef971655","gmt_create":"2025-10-08T18:45:08.1800031+08:00","gmt_modified":"2025-10-08T18:45:08.2083452+08:00"},{"catalog_id":"a9218ecb-5b88-4361-ac86-1111c07f10ff","title":"商户部署管理","description":"api-merchant-deploy","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"c96be713-c58c-421e-b799-82d9ec0cc0d2","gmt_create":"2025-10-08T18:45:48.012478+08:00","gmt_modified":"2025-10-08T18:45:48.9909518+08:00"},{"catalog_id":"cf4d1833-47d3-41dd-a87c-e005c6bb3246","title":"京东卡密管理API","description":"api-card-info-jd","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"dc85413e-c17d-490c-b208-8fbdfa1e2780","gmt_create":"2025-10-08T18:46:02.1864711+08:00","gmt_modified":"2025-10-08T18:46:02.2057622+08:00"},{"catalog_id":"cfe83884-986b-47f6-9b55-a77ac17a23ac","title":"资金流水","description":"api-fund-wallet-log","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"cb181915-8603-4944-a9c5-2a133ccc8a12","gmt_create":"2025-10-08T18:46:06.221362+08:00","gmt_modified":"2025-10-08T18:46:06.2325105+08:00"},{"catalog_id":"e198e011-e613-4a72-8920-6d411d5a8a55","title":"Docker Compose编排","description":"docker_compose","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"73a3645d-f956-4478-b19a-e9990153124c","gmt_create":"2025-10-08T18:46:51.7561755+08:00","gmt_modified":"2025-10-08T18:46:51.7666599+08:00"},{"catalog_id":"e0f50ea3-201c-4da2-8be9-4b3c9b715e95","title":"地域限制API","description":"api-restriction-region","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d28b3978-cdfa-4cf5-b724-cc74dc75c731","gmt_create":"2025-10-08T18:46:54.7333861+08:00","gmt_modified":"2025-10-08T18:46:54.7655162+08:00"},{"catalog_id":"94f0ca67-84eb-4321-905e-b222f1aa705c","title":"Shell脚本自动化","description":"shell_scripts","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"9fda64f5-7e1b-4207-922f-6e4867db2697","gmt_create":"2025-10-08T18:47:04.381622+08:00","gmt_modified":"2025-10-08T18:47:04.4114761+08:00"},{"catalog_id":"81cf8346-7e27-48d4-ac7d-cb32a05da591","title":"天猫平台集成","description":"tmall-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"56fd88b9-812b-4271-ab3c-ea429f4aa7f2","gmt_create":"2025-10-08T18:47:59.1768111+08:00","gmt_modified":"2025-10-08T18:47:59.2061782+08:00"},{"catalog_id":"53fae74c-0146-44f9-94bd-d53fa011a96e","title":"设备ID限制机制","description":"device-id-restriction","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ab45eb7b-b989-4899-9db6-c05eb5f30ee5","gmt_create":"2025-10-08T18:48:47.3727843+08:00","gmt_modified":"2025-10-08T18:48:47.3841384+08:00"},{"catalog_id":"23f60e22-9123-4448-adee-d2abc29f18ec","title":"天猫订单处理","description":"tmall-order-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ddcac11a-602a-44c4-89ee-1bbc9832b51b","gmt_create":"2025-10-08T18:49:02.9049825+08:00","gmt_modified":"2025-10-08T18:49:02.9312887+08:00"},{"catalog_id":"1940f0a7-1737-4f55-af09-6d228b09bc14","title":"天猫卡密管理逻辑","description":"tmall-card-logic","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2a27401a-612a-49d9-a7f4-28fad5a152e5","gmt_create":"2025-10-08T18:49:06.5478194+08:00","gmt_modified":"2025-10-08T18:49:06.5797565+08:00"},{"catalog_id":"79943a13-4a9b-474a-acbe-d8e223554bb6","title":"租户管理API","description":"api-auth-tenant","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"c6704fce-fd88-4486-b13f-75c0c8e41d3e","gmt_create":"2025-10-08T18:49:45.7151065+08:00","gmt_modified":"2025-10-08T18:49:45.7367011+08:00"},{"catalog_id":"4075b270-ff90-4654-b074-ef377e9015fe","title":"天猫卡密管理API","description":"api-card-info-tmall","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e6d21da9-f1b6-4efb-a193-2bab4b63dbd1","gmt_create":"2025-10-08T18:50:18.4010018+08:00","gmt_modified":"2025-10-08T18:50:18.4127933+08:00"},{"catalog_id":"fcf25088-430f-44f8-868d-13db19b40877","title":"盗单处理管理","description":"api-merchant-steal","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ed05c428-dc06-4526-9069-2b20beda4eeb","gmt_create":"2025-10-08T18:50:34.4851487+08:00","gmt_modified":"2025-10-08T18:50:34.4960907+08:00"},{"catalog_id":"5a2b81b4-457a-4d29-8d3a-01c0e8d15396","title":"用户信息收集API","description":"api-restriction-user-info","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5ecad5db-db6e-4f70-beb9-a28a22bf9d81","gmt_create":"2025-10-08T18:51:10.9445354+08:00","gmt_modified":"2025-10-08T18:51:10.9693494+08:00"},{"catalog_id":"247a9b67-68c8-4b02-bfdd-b60eebd4aa43","title":"订单汇总统计","description":"api-order-summary","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"f07dc9f3-5408-49ae-a194-0a6b13fc34e9","gmt_create":"2025-10-08T18:51:11.2452297+08:00","gmt_modified":"2025-10-08T18:51:11.2731683+08:00"},{"catalog_id":"42508ad8-f892-4512-a9e1-91f9315ca0a7","title":"Ctrip平台集成","description":"ctrip-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5ee266a2-157f-46a5-b501-7be3e57b4fa5","gmt_create":"2025-10-08T18:51:42.2253615+08:00","gmt_modified":"2025-10-08T18:51:44.0692337+08:00"},{"catalog_id":"696bcc52-32cf-4207-a05d-604412901408","title":"沃尔玛平台集成","description":"walmart-integration","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"51d7f832-6c1f-4084-9e39-b2ab80211a4f","gmt_create":"2025-10-08T18:52:19.3429507+08:00","gmt_modified":"2025-10-08T18:52:19.3709258+08:00"},{"catalog_id":"3e149bfb-74a0-4709-ba69-06bd7c5990b0","title":"沃尔玛卡密管理API","description":"api-card-info-walmart","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e5e619ba-ee65-4d68-a5cb-a5565fc06ef4","gmt_create":"2025-10-08T18:52:33.0344324+08:00","gmt_modified":"2025-10-08T18:52:33.0648958+08:00"},{"catalog_id":"95e6c408-ec87-455b-9a25-6edf69012867","title":"Ctrip卡密管理API","description":"api-card-info-ctrip","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"74369849-81b3-448a-8fe3-b57ee480b416","gmt_create":"2025-10-08T18:52:54.5072793+08:00","gmt_modified":"2025-10-08T18:52:54.531718+08:00"},{"catalog_id":"d2f96216-9ef5-42b4-b912-c8de7846df36","title":"京东卡密账户管理","description":"jd-card-account-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ff9a17ef-5ac6-48b2-b208-d088cc299042","gmt_create":"2025-10-08T18:53:38.7069113+08:00","gmt_modified":"2025-10-08T18:53:38.7187668+08:00"},{"catalog_id":"c9aeb23b-71bf-4ba3-b7e9-6e06f1b1074b","title":"Apple卡密账户管理","description":"apple-account-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"bd5a823d-40ed-4ef5-ad90-bafb81cddb19","gmt_create":"2025-10-08T18:53:45.0553278+08:00","gmt_modified":"2025-10-08T18:53:45.0680669+08:00"},{"catalog_id":"bd2234dc-1f7d-4e18-8134-e119637e36ea","title":"天猫卡密账户管理","description":"tmall-account-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2a1f717d-62c1-40cf-a5cd-392328d4875c","gmt_create":"2025-10-08T18:54:12.2353976+08:00","gmt_modified":"2025-10-08T18:54:12.2513641+08:00"},{"catalog_id":"9c492856-0b6c-47e4-9980-2ba5606e14db","title":"IP记录管理","description":"ip-record-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"cb53e578-93a2-4fe9-8def-acd908afc197","gmt_create":"2025-10-08T18:54:37.7852214+08:00","gmt_modified":"2025-10-08T18:54:37.7992457+08:00"},{"catalog_id":"dd127daa-7cee-470c-a9e3-67619cbb690a","title":"设备ID采集机制","description":"device-id-collection","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"9ffafc14-b194-4c24-894f-8ba35c39cbf7","gmt_create":"2025-10-08T18:54:43.6693575+08:00","gmt_modified":"2025-10-08T18:54:43.983109+08:00"},{"catalog_id":"774c38e1-e0c9-4f09-8929-ed9c569de7a9","title":"登录认证","description":"login-authentication","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"67dbeefe-b60c-42a5-9865-64149451ffc4","gmt_create":"2025-10-08T18:55:08.0039601+08:00","gmt_modified":"2025-10-08T18:55:08.01878+08:00"},{"catalog_id":"c61cfce9-9c60-408a-96af-aa04fe5ef4e3","title":"Apple卡密账户管理","description":"api-card-info-apple-account","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"14b71da5-f58c-432e-8084-cdc37a6d204c","gmt_create":"2025-10-08T18:55:43.3929931+08:00","gmt_modified":"2025-10-08T18:55:43.4089573+08:00"},{"catalog_id":"8fea5696-078e-4e39-854d-7ee67e9a5ea5","title":"权限规则定义","description":"permission-definition","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d5b26724-d4de-4b99-9db4-e83146ab60aa","gmt_create":"2025-10-08T18:55:45.5537098+08:00","gmt_modified":"2025-10-08T18:55:45.5735609+08:00"},{"catalog_id":"9a5f228a-3f55-4627-a45e-9eb1b3832ab9","title":"京东卡密账户管理","description":"api-card-info-jd-account","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"21d63ef6-cfb6-465c-b70a-a413c877326b","gmt_create":"2025-10-08T18:56:14.6204696+08:00","gmt_modified":"2025-10-08T18:56:14.6347349+08:00"},{"catalog_id":"f750eecf-4d76-432c-a1d0-c58ec1f20638","title":"构建阶段详解","description":"dockerfile-build","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"04ac29a3-f306-48cb-8cab-ce2a216779f1","gmt_create":"2025-10-08T18:56:29.4623711+08:00","gmt_modified":"2025-10-08T18:56:29.4746039+08:00"},{"catalog_id":"ecaf08e9-5ec3-45a6-ad5a-3a5e542fbe7b","title":"天猫卡密账户管理","description":"api-card-info-tmall-account","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2268be0a-a7ff-44d5-9c72-6d260efd2706","gmt_create":"2025-10-08T18:56:38.5803324+08:00","gmt_modified":"2025-10-08T18:56:38.595694+08:00"},{"catalog_id":"56f0721d-ae5c-4ef6-a7bd-be1c864406d7","title":"主服务配置","description":"docker_compose_main_service","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"80ae69ea-9c8f-4c51-9e72-5e4f302dfd1c","gmt_create":"2025-10-08T18:57:12.4495174+08:00","gmt_modified":"2025-10-08T18:57:12.4626538+08:00"},{"catalog_id":"6ebc345b-84fa-4d86-bcd2-305f5b50facb","title":"沃尔玛卡密账户管理","description":"api-card-info-walmart-account","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"46ae613b-aadd-426f-815f-8aa644a84a75","gmt_create":"2025-10-08T18:57:15.5478019+08:00","gmt_modified":"2025-10-08T18:57:15.560972+08:00"},{"catalog_id":"5fe27666-091a-4cb4-b6dc-c3679de8b4c3","title":"Apple卡密充值处理","description":"apple-recharge-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"028246ef-47f3-4a39-8262-fa63dfa5caf6","gmt_create":"2025-10-08T18:57:37.32521+08:00","gmt_modified":"2025-10-08T18:57:37.3426049+08:00"},{"catalog_id":"95c5d3f8-74e3-4947-88a3-7bedc419119b","title":"京东卡密兑换处理","description":"jd-card-redeem-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"6d6a59af-ea7b-4720-902f-3f79439dbf33","gmt_create":"2025-10-08T18:58:15.1029797+08:00","gmt_modified":"2025-10-08T18:58:15.1304131+08:00"},{"catalog_id":"5f9de6fe-f8b4-4b02-8b35-60dc30d0c28f","title":"天猫卡密订单处理","description":"tmall-order-processing","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1eccd7b2-5b45-46a5-9498-6653aab45d18","gmt_create":"2025-10-08T18:58:16.923048+08:00","gmt_modified":"2025-10-08T18:58:16.9351231+08:00"},{"catalog_id":"87830e67-055a-4ec9-9d84-3524417849ea","title":"IP查询优化","description":"ip-query-optimization","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"29b0dd57-4de7-4ea6-8513-a026f067b820","gmt_create":"2025-10-08T18:58:38.2405058+08:00","gmt_modified":"2025-10-08T18:58:38.25573+08:00"},{"catalog_id":"1e97e1a4-a919-4958-bf3c-428447bcb9b3","title":"双因素认证","description":"two-factor-auth","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"1e25b93c-fc58-4a36-9339-2c2aa5b013dd","gmt_create":"2025-10-08T18:59:05.6880651+08:00","gmt_modified":"2025-10-08T18:59:05.7018448+08:00"},{"catalog_id":"e6867dec-a326-41c9-9f3e-0372e1e6602d","title":"设备ID存储策略","description":"device-id-storage","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"765145c9-6519-4ce1-80b5-f396967850fd","gmt_create":"2025-10-08T18:59:13.3305164+08:00","gmt_modified":"2025-10-08T18:59:13.3634839+08:00"},{"catalog_id":"72eb76fb-9b41-4622-87a3-c7d9ec2473ab","title":"权限验证机制","description":"permission-validation","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"5f8274ff-cf15-4a30-9645-e489fb69cfcb","gmt_create":"2025-10-08T18:59:43.4735566+08:00","gmt_modified":"2025-10-08T18:59:43.4862365+08:00"},{"catalog_id":"716b40d8-2fb3-4120-a10b-ef4c35278628","title":"Apple卡密充值处理","description":"api-card-info-apple-recharge","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"6c525aab-4200-4fdd-8976-cf866e968a47","gmt_create":"2025-10-08T19:00:01.1033747+08:00","gmt_modified":"2025-10-08T19:00:01.1364563+08:00"},{"catalog_id":"cbea6597-6985-4b7d-a626-c7ee2573e1c5","title":"京东卡密订单处理","description":"api-card-info-jd-order","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"3339042b-57f6-4a7a-971f-e3cbd070c5cf","gmt_create":"2025-10-08T19:00:03.7148331+08:00","gmt_modified":"2025-10-08T19:00:03.7267764+08:00"},{"catalog_id":"ae69e860-0ad6-41a6-93d1-04f4986bf21e","title":"天猫卡密订单处理","description":"api-card-info-tmall-order","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"a37be5ef-ba38-4e77-a086-49eb0571bbd1","gmt_create":"2025-10-08T19:00:59.812553+08:00","gmt_modified":"2025-10-08T19:00:59.8360168+08:00"},{"catalog_id":"079abbb5-6333-4afd-8290-144e6b7c9e4c","title":"沃尔玛卡密订单处理","description":"api-card-info-walmart-order","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"95c72ca0-fe20-4f55-aa8b-da7fe1e35bf4","gmt_create":"2025-10-08T19:01:13.7826852+08:00","gmt_modified":"2025-10-08T19:01:13.7983097+08:00"},{"catalog_id":"62d51a8e-063f-4d27-9ac7-e9007c4aa205","title":"运行阶段详解","description":"dockerfile-runtime","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"d1c1ad36-7933-46f3-ae09-06a4e79f1a4d","gmt_create":"2025-10-08T19:01:19.0678468+08:00","gmt_modified":"2025-10-08T19:01:19.0808704+08:00"},{"catalog_id":"c785e799-81a6-4c75-bba4-a8ca273bc304","title":"数据库配置","description":"docker_compose_database","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"7678e9a4-d73f-495d-b32e-a86307833ee8","gmt_create":"2025-10-08T19:01:54.6075069+08:00","gmt_modified":"2025-10-08T19:01:54.6207298+08:00"},{"catalog_id":"3607d5d8-2ffa-4312-8aea-35827f6dc187","title":"Apple卡密历史记录管理","description":"apple-history-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"c9d60572-f243-4964-95f7-efa505e7bb31","gmt_create":"2025-10-08T19:02:08.5536035+08:00","gmt_modified":"2025-10-08T19:02:08.5674292+08:00"},{"catalog_id":"2b67bae5-b753-4f6c-96a5-c98cff54ed95","title":"京东卡密分组管理","description":"jd-card-group-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"7d670ebe-98f9-40cc-bb0e-921698f0561e","gmt_create":"2025-10-08T19:02:13.8852682+08:00","gmt_modified":"2025-10-08T19:02:13.9003754+08:00"},{"catalog_id":"8211774c-fdeb-48be-9f7b-27287395e2c9","title":"设备ID匹配算法","description":"device-id-matching","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"edee9202-bf63-41ad-92c8-1b73809b0e31","gmt_create":"2025-10-08T19:02:59.3830073+08:00","gmt_modified":"2025-10-08T19:02:59.415863+08:00"},{"catalog_id":"320c1148-77cd-43a7-b2e6-2cda46748ce3","title":"天猫卡密工作空间管理","description":"tmall-workspace-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"a15b8582-b849-4427-830d-01a762a6f0e6","gmt_create":"2025-10-08T19:03:01.1408063+08:00","gmt_modified":"2025-10-08T19:03:01.1564831+08:00"},{"catalog_id":"39c1c160-0b1a-4f65-b1b1-23c5e983e5d9","title":"IP限制策略","description":"ip-restriction-strategy","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"3c96a768-7ae1-4411-97b1-50951a28ac63","gmt_create":"2025-10-08T19:03:06.9579228+08:00","gmt_modified":"2025-10-08T19:03:06.9750944+08:00"},{"catalog_id":"3afa3734-4ba6-44a8-9b51-40f5110dff7e","title":"会话管理","description":"session-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"7b44d369-49b4-41b9-9eb7-b26478950b45","gmt_create":"2025-10-08T19:03:57.4408066+08:00","gmt_modified":"2025-10-08T19:03:57.4534871+08:00"},{"catalog_id":"c451bf06-72fa-4bab-8483-af4aa07d4047","title":"权限策略管理","description":"permission-policy-management","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"031c7abd-fbe6-4ded-a6eb-56d0bad54895","gmt_create":"2025-10-08T19:03:58.2694055+08:00","gmt_modified":"2025-10-08T19:03:58.2884919+08:00"},{"catalog_id":"1ae4d8b7-2b66-48a3-a8a4-07bed57a2696","title":"Apple卡密配置管理","description":"api-card-info-apple-config","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"19b8637a-0527-479d-bf29-6eb5777b2b58","gmt_create":"2025-10-08T19:04:12.3257941+08:00","gmt_modified":"2025-10-08T19:04:12.3533814+08:00"},{"catalog_id":"6e7425ca-8c73-4395-860a-f57f16614e70","title":"京东卡密数据汇总","description":"api-card-info-jd-summary","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"a1f93da8-6441-4a0a-b369-fd65c5c712ef","gmt_create":"2025-10-08T19:04:46.8877453+08:00","gmt_modified":"2025-10-08T19:04:46.9021945+08:00"},{"catalog_id":"03f40c3a-31bc-479a-ab13-e0371df2821f","title":"天猫卡密店铺管理","description":"api-card-info-tmall-shop","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"93ab5ab1-a810-4072-a928-97923aaabd60","gmt_create":"2025-10-08T19:05:04.5719492+08:00","gmt_modified":"2025-10-08T19:05:04.5865898+08:00"},{"catalog_id":"e1429049-8758-47bf-8837-ccb20524fba9","title":"沃尔玛卡密分组管理","description":"api-card-info-walmart-group","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"41ac4f9c-0de5-41a2-aff8-952df832e54b","gmt_create":"2025-10-08T19:05:31.6092099+08:00","gmt_modified":"2025-10-08T19:05:31.6218006+08:00"},{"catalog_id":"50d76878-7225-4bd3-b576-e901cce2aeb2","title":"缓存配置","description":"docker_compose_cache","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"2c2926e0-a642-4888-b0c3-eb7c48401ff0","gmt_create":"2025-10-08T19:05:35.1101189+08:00","gmt_modified":"2025-10-08T19:05:35.1488787+08:00"},{"catalog_id":"aefbc4b3-589d-4bb6-aa64-84c44494b933","title":"设备ID隐私保护","description":"device-id-privacy","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"e48388db-e632-47f4-a236-cef53eef42d5","gmt_create":"2025-10-08T19:05:48.1976048+08:00","gmt_modified":"2025-10-08T19:05:48.2138559+08:00"},{"catalog_id":"bb593523-dd7f-4934-a812-63ddcf32457e","title":"部署自动化","description":"docker_compose_deployment_automation","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"ea1073d7-eccc-43a4-a440-76f0e6916135","gmt_create":"2025-10-08T19:06:32.2267781+08:00","gmt_modified":"2025-10-08T19:06:32.2595575+08:00"},{"catalog_id":"70e09c57-7ff1-4f6a-baec-b2630cd234d4","title":"天猫卡密回调机制","description":"api-card-info-tmall-callback","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"876f2cd6-86d9-48d2-8e15-8c10900f4b49","gmt_create":"2025-10-08T19:06:42.6993854+08:00","gmt_modified":"2025-10-08T19:06:43.3893525+08:00"},{"catalog_id":"226674b7-aab1-4dc2-86fa-657f442b7fa4","title":"天猫卡密工作区管理","description":"api-card-info-tmall-workspace","extend":"{}","progress_status":"completed","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b","id":"7037cc41-dcfa-4382-b12c-95ccecde3632","gmt_create":"2025-10-08T19:06:55.1830774+08:00","gmt_modified":"2025-10-08T19:06:55.1984343+08:00"}],"wiki_overview":{"content":"\u003cblog\u003e\n# kami_backend 项目综合分析报告\n\n## 1. 项目介绍\n\n### 项目目的\nkami_backend 是一个基于 GoFrame 框架构建的后端服务系统,主要功能是为各类电商平台(如京东、天猫、沃尔玛、Ctrip 等)的卡密信息管理、订单处理、账户管理提供统一的 API 接口支持。系统集成了权限控制、支付管理、商户管理、风控限制等模块,形成了完整的后台管理系统。\n\n### 核心目标\n- 提供统一的电商平台卡密充值与兑换接口\n- 实现多平台账户信息集中管理\n- 支持灵活的权限控制与角色管理\n- 构建可扩展的微服务架构基础\n- 集成可观测性系统(OpenTelemetry)\n\n### 目标用户\n- 平台运营管理人员\n- 第三方商户接入方\n- 系统维护与开发人员\n- 安全审计人员\n\n## 2. 技术架构\n\n### 组件分解\n项目采用典型的分层架构设计,包含以下核心组件:\n\n- **API 层**:位于 `api/` 目录,定义了所有对外暴露的 RESTful 接口\n- **Controller 层**:位于 `internal/controller/`,处理请求转发与参数校验\n- **Service 层**:位于 `internal/service/`,实现核心业务逻辑\n- **Logic 层**:位于 `internal/logic/`,封装具体业务规则\n- **DAO 层**:位于 `internal/dao/`,负责数据访问操作\n- **Model 层**:位于 `internal/model/`,定义数据结构与实体\n- **Utility 工具层**:位于 `utility/`,提供通用工具函数\n\n### 设计模式\n系统采用了多种设计模式:\n- **MVC 模式**:清晰分离关注点\n- **依赖注入**:通过 GoFrame 的 DI 机制实现\n- **中间件模式**:用于认证、日志、错误处理\n- **策略模式**:不同电商平台的处理逻辑分离\n\n### 系统关系与数据流\n\n```mermaid\nflowchart TD\n A[客户端] --\u003e B[API Gateway]\n B --\u003e C[Middlewares]\n C --\u003e D[Controller]\n D --\u003e E[Service]\n E --\u003e F[Logic]\n F --\u003e G[DAO]\n G --\u003e H[(MySQL)]\n G --\u003e I[(Redis)]\n J[OpenTelemetry] \u003c--\u003e K[日志/监控/追踪]\n style A fill:#f9f,stroke:#333\n style H fill:#ccf,stroke:#333\n style I fill:#ccf,stroke:#333\n```\n\n## 3. 关键实现\n\n### 主要入口点\n- **main.go**:应用启动入口,负责初始化 OTel 和运行主服务\n- **cmd.go**:命令行处理逻辑\n- **boot_enums.go**:系统启动时自动加载的枚举配置\n\nSources:\n- [main.go](main.go)\n- [cmd.go](internal/cmd/cmd.go)\n- [boot_enums.go](internal/boot/boot_enums.go)\n\n### 核心模块\n- **权限管理模块** (`api/authority`):基于 Casbin 的 RBAC 权限控制\n- **卡密信息管理模块** (`api/card_info_*`):支持多个电商平台\n- **订单管理模块** (`api/order`):统一订单处理流程\n- **商户管理模块** (`api/merchant`):商户接入与配置管理\n- **风控限制模块** (`api/restriction`):IP 限制、访问控制等\n\nSources:\n- [authority.go](api/authority/authority.go)\n- [order.go](api/order/order.go)\n- [merchant.go](api/merchant/merchant.go)\n- [restriction.go](api/restriction/restriction.go)\n\n### 配置方法\n系统使用 YAML 配置文件进行管理,主要配置文件包括:\n\n- `manifest/config/config.yaml`:主配置文件,包含数据库、Redis、服务端口等\n- `hack/config.yaml`:gfcli 工具配置,用于代码生成\n- `resource/casbin/rbac_model.conf`:权限模型配置\n\n配置通过 GoFrame 的 gcfg 组件加载,支持环境变量覆盖。\n\nSources:\n- [config.yaml](manifest/config/config.yaml)\n- [rbac_model.conf](resource/casbin/rbac_model.conf)\n\n### 外部依赖\n```mermaid\ngraph TD\n A[kami_backend] --\u003e B[MySQL]\n A --\u003e C[Redis]\n A --\u003e D[OpenTelemetry Collector]\n A --\u003e E[Taobao API]\n A --\u003e F[Jingdong Service]\n A --\u003e G[Ctrip API]\n A --\u003e H[Walmart API]\n A --\u003e I[Agiso Platform]\n style A fill:#f96,stroke:#333\n```\n\n### 集成点\n- **OAuth2 集成**:天猫游戏平台 OAuth 接入\n- **第三方支付通知**:飞书 Webhook 通知\n- **外部服务调用**:京东卡密服务、Ctrip 接口等\n- **可观测性集成**:OpenTelemetry 全链路追踪\n\nSources:\n- [config.yaml](manifest/config/config.yaml#L80-L95)\n\n## 4. 关键特性\n\n### 功能概览\n- 多平台卡密充值与兑换\n- 完善的权限与角色管理体系\n- 商户接入与配置管理\n- 订单全生命周期管理\n- 风控与访问限制机制\n- 可视化监控与日志系统\n\n### 实现亮点\n- **模块化设计**:每个电商平台独立模块,易于扩展\n- **自动化代码生成**:通过 gfcli 自动生成 DAO、Service 等代码\n- **安全机制完善**:包含 MFA、Token 加密、AES/MD5 验证等\n- **可观测性强**:集成 OpenTelemetry 实现监控、追踪、日志一体化\n\n### 特性架构图\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e 初始化\n 初始化 --\u003e 配置加载: 读取YAML\n 配置加载 --\u003e 数据库连接: MySQL/Redis\n 数据库连接 --\u003e 服务注册: API路由\n 服务注册 --\u003e 权限初始化: Casbin\n 权限初始化 --\u003e 运行中: 接收请求\n 运行中 --\u003e 异常处理: Middleware\n 异常处理 --\u003e 运行中\n 运行中 --\u003e 日志记录: OTel\n```\n\nSources:\n- [main.go](main.go#L1-L49)\n- [config.go](utility/config/config.go)\n- [otel](utility/otel)\n\u003c/blog\u003e","gmt_create":"2025-10-08T18:16:44.6269266+08:00","gmt_modified":"2025-10-08T18:16:44.6269266+08:00","id":"62b32fa7-736d-4d1e-a953-44df35159f00","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b"},"wiki_readme":{"content":"### docker deploy token\r\n\r\n579f3fab0f179949b1b8a509ba4f2dff0c8dcdd5","gmt_create":"2025-10-08T17:56:14.4383042+08:00","gmt_modified":"2025-10-08T17:56:14.4383042+08:00","id":"bac6491a-811f-4ce1-967b-e9dc6497bacb","repo_id":"8b011e00-445f-4f11-820d-64173a200e4b"},"wiki_repo":{"id":"8b011e00-445f-4f11-820d-64173a200e4b","name":"kami_backend","progress_status":"completed","wiki_present_status":"COMPLETED","optimized_catalog":"\".\\n├── api\\n│ ├── authority\\n│ │ ├── v1\\n│ │ │ ├── menu.go\\n│ │ │ ├── model.go\\n│ │ │ ├── role.go\\n│ │ │ └── tenant.go\\n│ │ └── authority.go\\n│ ├── card_info_apple\\n│ │ ├── v1\\n│ │ │ ├── account_history.go\\n│ │ │ ├── account_info.go\\n│ │ │ ├── config.go\\n│ │ │ ├── model.go\\n│ │ │ ├── order.go\\n│ │ │ ├── order_history.go\\n│ │ │ └── order_steal.go\\n│ │ └── card_info_apple.go\\n│ ├── card_info_c_trip\\n│ │ ├── v1\\n│ │ │ ├── account.go\\n│ │ │ ├── config.go\\n│ │ │ └── order.go\\n│ │ └── card_info_c_trip.go\\n│ ├── card_info_jd\\n│ │ ├── v1\\n│ │ │ ├── account.go\\n│ │ │ ├── config.go\\n│ │ │ ├── order.go\\n│ │ │ └── order_summary.go\\n│ │ └── card_info_jd.go\\n│ ├── card_info_original_jd\\n│ │ ├── v1\\n│ │ │ └── account.go\\n│ │ └── card_info_original_jd.go\\n│ ├── card_info_t_mall_game\\n│ │ ├── v1\\n│ │ │ ├── account.go\\n│ │ │ ├── callback.go\\n│ │ │ ├── fake.go\\n│ │ │ ├── order.go\\n│ │ │ ├── shop.go\\n│ │ │ ├── sync.go\\n│ │ │ └── workspace.go\\n│ │ └── card_info_t_mall_game.go\\n│ ├── card_info_walmart\\n│ │ ├── v1\\n│ │ │ ├── account.go\\n│ │ │ ├── config.go\\n│ │ │ ├── group.go\\n│ │ │ ├── order.go\\n│ │ │ ├── order_summary.go\\n│ │ │ └── stats.go\\n│ │ └── card_info_walmart.go\\n│ ├── card_redeem_jd\\n│ │ ├── v1\\n│ │ │ ├── account.go\\n│ │ │ └── order.go\\n│ │ └── card_redeem_jd.go\\n│ ├── channel\\n│ │ ├── v2\\n│ │ │ ├── entrance.go\\n│ │ │ └── model.go\\n│ │ └── channel.go\\n│ ├── commonApi\\n│ │ └── common.go\\n│ ├── fund\\n│ │ ├── v1\\n│ │ │ ├── wallet.go\\n│ │ │ └── wallet_log.go\\n│ │ └── fund.go\\n│ ├── merchant\\n│ │ ├── v1\\n│ │ │ ├── config.go\\n│ │ │ ├── deploy.go\\n│ │ │ ├── model.go\\n│ │ │ ├── order.go\\n│ │ │ └── steal.go\\n│ │ └── merchant.go\\n│ ├── monitor\\n│ │ ├── v1\\n│ │ │ └── heathcheck.go\\n│ │ └── monitor.go\\n│ ├── order\\n│ │ ├── v1\\n│ │ │ ├── form.go\\n│ │ │ ├── log.go\\n│ │ │ └── order_summary.go\\n│ │ └── order.go\\n│ ├── restriction\\n│ │ ├── v1\\n│ │ │ ├── collection.go\\n│ │ │ └── province.go\\n│ │ └── restriction.go\\n│ ├── road\\n│ │ ├── v1\\n│ │ │ └── road.go\\n│ │ └── road.go\\n│ ├── road_pool\\n│ │ ├── v1\\n│ │ │ └── road_pool.go\\n│ │ └── road_pool.go\\n│ ├── sysUser\\n│ │ ├── v1\\n│ │ │ ├── logout.go\\n│ │ │ ├── model.go\\n│ │ │ ├── payment.go\\n│ │ │ ├── sysUser.go\\n│ │ │ └── totp.go\\n│ │ └── sysUser.go\\n│ ├── sys_auth_rule\\n│ │ ├── v1\\n│ │ │ ├── model.go\\n│ │ │ └── sys_auth_rule.go\\n│ │ └── sys_auth_rule.go\\n│ ├── sys_payment\\n│ │ ├── v1\\n│ │ │ ├── statistic.go\\n│ │ │ └── sys_payment.go\\n│ │ └── sys_payment.go\\n│ ├── sys_role\\n│ │ ├── v1\\n│ │ │ ├── model.go\\n│ │ │ └── sys_role.go\\n│ │ └── sys_role.go\\n│ ├── sys_user_login\\n│ │ ├── v1\\n│ │ │ ├── model.go\\n│ │ │ └── sys_user_login.go\\n│ │ └── sys_user_login.go\\n│ ├── user_center\\n│ │ ├── v1\\n│ │ │ └── info.go\\n│ │ └── user_center.go\\n│ └── validation\\n│ ├── v1\\n│ │ └── captcha.go\\n│ └── validation.go\\n├── hack\\n│ └── config.yaml\\n├── internal\\n│ ├── boot\\n│ │ └── boot_enums.go\\n│ ├── cmd\\n│ │ └── cmd.go\\n│ ├── consts\\n│ │ ├── asigo.go\\n│ │ ├── cache.go\\n│ │ ├── card_apple.go\\n│ │ ├── card_excharge.go\\n│ │ ├── card_jd.go\\n│ │ ├── card_recharge_t_mall.go\\n│ │ ├── card_redeem.go\\n│ │ ├── card_redeem_cookie.go\\n│ │ ├── common.go\\n│ │ ├── consts.go\\n│ │ ├── entrance.go\\n│ │ ├── login_status.go\\n│ │ ├── restriction.go\\n│ │ ├── road.go\\n│ │ ├── sysUser.go\\n│ │ ├── sys_config_dict.go\\n│ │ ├── sys_user_channel_config.go\\n│ │ ├── sys_user_deductions.go\\n│ │ └── sys_user_payment_record.go\\n│ ├── controller\\n│ │ ├── authority\\n│ │ │ ├── authority.go\\n│ │ │ ├── authority_new.go\\n│ │ │ ├── authority_v1_menu_create.go\\n│ │ │ ├── authority_v1_menu_delete.go\\n│ │ │ ├── authority_v1_menu_list.go\\n│ │ │ ├── authority_v1_menu_update.go\\n│ │ │ ├── authority_v1_role_create.go\\n│ │ │ ├── authority_v1_role_delete.go\\n│ │ │ ├── authority_v1_role_list.go\\n│ │ │ ├── authority_v1_role_update.go\\n│ │ │ ├── authority_v1_tenant_create.go\\n│ │ │ ├── authority_v1_tenant_delete.go\\n│ │ │ ├── authority_v1_tenant_list.go\\n│ │ │ └── authority_v1_tenant_update.go\\n│ │ ├── card_info_apple\\n│ │ │ ├── apple_card_info_v1_recharge_list_download_test.go\\n│ │ │ ├── card_info_apple.go\\n│ │ │ ├── card_info_apple_new.go\\n│ │ │ ├── card_info_apple_v1_call_back_order_manual.go\\n│ │ │ ├── card_info_apple_v1_card_history_info_list.go\\n│ │ │ ├── card_info_apple_v1_card_info_batch_add_from_xlsx.go\\n│ │ │ ├── card_info_apple_v1_card_info_create.go\\n│ │ │ ├── card_info_apple_v1_card_info_delete.go\\n│ │ │ ├── card_info_apple_v1_card_info_download_template.go\\n│ │ │ ├── card_info_apple_v1_card_info_list.go\\n│ │ │ ├── card_info_apple_v1_card_info_suspend_or_continue.go\\n│ │ │ ├── card_info_apple_v1_card_info_update.go\\n│ │ │ ├── card_info_apple_v1_card_info_update_status.go\\n│ │ │ ├── card_info_apple_v1_config_get.go\\n│ │ │ ├── card_info_apple_v1_config_set.go\\n│ │ │ ├── card_info_apple_v1_recharge_duplicated_card_pass.go\\n│ │ │ ├── card_info_apple_v1_recharge_handler.go\\n│ │ │ ├── card_info_apple_v1_recharge_history_list.go\\n│ │ │ ├── card_info_apple_v1_recharge_itunes_callback.go\\n│ │ │ ├── card_info_apple_v1_recharge_list.go\\n│ │ │ ├── card_info_apple_v1_recharge_list_download.go\\n│ │ │ ├── card_info_apple_v1_recharge_order_modify_actual_amount.go\\n│ │ │ ├── card_info_apple_v1_recharge_order_reset_status.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_rule_add.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_rule_delete.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_rule_list.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_rule_status_update.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_rule_update.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_setting.go\\n│ │ │ ├── card_info_apple_v1_recharge_steal_setting_get.go\\n│ │ │ ├── card_info_apple_v1_recharge_submit.go\\n│ │ │ └── card_info_apple_v1_recharge_submit_query.go\\n│ │ ├── card_info_c_trip\\n│ │ │ ├── card_info_c_trip.go\\n│ │ │ ├── card_info_c_trip_new.go\\n│ │ │ ├── card_info_c_trip_v1_account_cookie_batch_add.go\\n│ │ │ ├── card_info_c_trip_v1_account_cookie_batch_check.go\\n│ │ │ ├── card_info_c_trip_v1_account_cookie_check.go\\n│ │ │ ├── card_info_c_trip_v1_account_create.go\\n│ │ │ ├── card_info_c_trip_v1_account_delete.go\\n│ │ │ ├── card_info_c_trip_v1_account_list.go\\n│ │ │ ├── card_info_c_trip_v1_account_refresh_status.go\\n│ │ │ ├── card_info_c_trip_v1_account_update.go\\n│ │ │ ├── card_info_c_trip_v1_account_update_status.go\\n│ │ │ ├── card_info_c_trip_v1_account_wallet_list.go\\n│ │ │ ├── card_info_c_trip_v1_download.go\\n│ │ │ ├── card_info_c_trip_v1_download_template.go\\n│ │ │ ├── card_info_c_trip_v1_list.go\\n│ │ │ ├── card_info_c_trip_v1_order_callback.go\\n│ │ │ ├── card_info_c_trip_v1_order_history.go\\n│ │ │ ├── card_info_c_trip_v1_redeem_config_get.go\\n│ │ │ ├── card_info_c_trip_v1_redeem_config_set.go\\n│ │ │ └── card_info_c_trip_v1_submit.go\\n│ │ ├── card_info_jd\\n│ │ │ ├── card_info_jd.go\\n│ │ │ ├── card_info_jd_new.go\\n│ │ │ ├── card_info_jd_v1_download.go\\n│ │ │ ├── card_info_jd_v1_download_template.go\\n│ │ │ ├── card_info_jd_v1_jd_account_cookie_batch_add.go\\n│ │ │ ├── card_info_jd_v1_jd_account_cookie_batch_check.go\\n│ │ │ ├── card_info_jd_v1_jd_account_cookie_check.go\\n│ │ │ ├── card_info_jd_v1_jd_account_create.go\\n│ │ │ ├── card_info_jd_v1_jd_account_delete.go\\n│ │ │ ├── card_info_jd_v1_jd_account_list.go\\n│ │ │ ├── card_info_jd_v1_jd_account_refresh_status.go\\n│ │ │ ├── card_info_jd_v1_jd_account_update.go\\n│ │ │ ├── card_info_jd_v1_jd_account_update_status.go\\n│ │ │ ├── card_info_jd_v1_jd_account_wallet_list.go\\n│ │ │ ├── card_info_jd_v1_jd_config_get.go\\n│ │ │ ├── card_info_jd_v1_jd_config_set.go\\n│ │ │ ├── card_info_jd_v1_list.go\\n│ │ │ ├── card_info_jd_v1_order_callback.go\\n│ │ │ ├── card_info_jd_v1_order_history.go\\n│ │ │ ├── card_info_jd_v1_order_summary_list.go\\n│ │ │ └── card_info_jd_v1_submit.go\\n│ │ ├── card_info_original_jd\\n│ │ │ ├── card_info_original_jd.go\\n│ │ │ ├── card_info_original_jd_new.go\\n│ │ │ ├── card_info_original_jd_v1_original_download.go\\n│ │ │ ├── card_info_original_jd_v1_original_download_template.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_cookie_batch_add.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_cookie_batch_check.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_cookie_check.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_create.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_delete.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_list.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_refresh_status.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_update.go\\n│ │ │ ├── card_info_original_jd_v1_original_jd_account_update_status.go\\n│ │ │ └── card_info_original_jd_v1_original_jd_account_wallet_list.go\\n│ │ ├── card_info_t_mall_game\\n│ │ │ ├── card_info_t_mall_game.go\\n│ │ │ ├── card_info_t_mall_game_new.go\\n│ │ │ ├── card_info_t_mall_game_v1_call_back_order_manual.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_authorize_callback.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_authorize_get_key.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_create.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_delete.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_get_one_random.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_list.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_t_mall_auth_status.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_account_toggle.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_agiso_callback.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_agiso_callback_test.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_daily_order_summary.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_data_sync.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_order_list.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_order_modify_status_succeed.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_order_query_category.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_order_query_order.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_order_submit.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_shop_order_get_one.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_shop_order_history.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_shop_order_list.go\\n│ │ │ ├── card_info_t_mall_game_v1_t_mall_game_shop_order_t_mall_history.go\\n│ │ │ └── card_info_t_mall_game_v1_t_mall_game_stats.go\\n│ │ ├── card_info_walmart\\n│ │ │ ├── card_info_walmart.go\\n│ │ │ ├── card_info_walmart_new.go\\n│ │ │ ├── card_info_walmart_v1_account_cookie_batch_add.go\\n│ │ │ ├── card_info_walmart_v1_account_cookie_batch_check.go\\n│ │ │ ├── card_info_walmart_v1_account_cookie_check.go\\n│ │ │ ├── card_info_walmart_v1_account_create.go\\n│ │ │ ├── card_info_walmart_v1_account_daily_summary.go\\n│ │ │ ├── card_info_walmart_v1_account_delete.go\\n│ │ │ ├── card_info_walmart_v1_account_list.go\\n│ │ │ ├── card_info_walmart_v1_account_load.go\\n│ │ │ ├── card_info_walmart_v1_account_refresh_status.go\\n│ │ │ ├── card_info_walmart_v1_account_status_detect.go\\n│ │ │ ├── card_info_walmart_v1_account_summary_download.go\\n│ │ │ ├── card_info_walmart_v1_account_update.go\\n│ │ │ ├── card_info_walmart_v1_account_update_status.go\\n│ │ │ ├── card_info_walmart_v1_account_wallet_list.go\\n│ │ │ ├── card_info_walmart_v1_download.go\\n│ │ │ ├── card_info_walmart_v1_download_template.go\\n│ │ │ ├── card_info_walmart_v1_group_add.go\\n│ │ │ ├── card_info_walmart_v1_group_all_list.go\\n│ │ │ ├── card_info_walmart_v1_group_delete.go\\n│ │ │ ├── card_info_walmart_v1_group_export.go\\n│ │ │ ├── card_info_walmart_v1_group_list.go\\n│ │ │ ├── card_info_walmart_v1_group_stat.go\\n│ │ │ ├── card_info_walmart_v1_group_update.go\\n│ │ │ ├── card_info_walmart_v1_list.go\\n│ │ │ ├── card_info_walmart_v1_order_callback.go\\n│ │ │ ├── card_info_walmart_v1_order_export.go\\n│ │ │ ├── card_info_walmart_v1_order_history.go\\n│ │ │ ├── card_info_walmart_v1_order_status_reset.go\\n│ │ │ ├── card_info_walmart_v1_order_summary_list.go\\n│ │ │ ├── card_info_walmart_v1_redeem_config_get.go\\n│ │ │ ├── card_info_walmart_v1_redeem_config_set.go\\n│ │ │ ├── card_info_walmart_v1_stats_overview.go\\n│ │ │ ├── card_info_walmart_v1_stats_overview_download.go\\n│ │ │ └── card_info_walmart_v1_submit.go\\n│ │ ├── card_redeem_jd\\n│ │ │ ├── card_redeem_jd.go\\n│ │ │ ├── card_redeem_jd_new.go\\n│ │ │ ├── card_redeem_jd_v1_account_add.go\\n│ │ │ ├── card_redeem_jd_v1_account_delete.go\\n│ │ │ ├── card_redeem_jd_v1_account_get.go\\n│ │ │ ├── card_redeem_jd_v1_account_list.go\\n│ │ │ ├── card_redeem_jd_v1_account_status.go\\n│ │ │ ├── card_redeem_jd_v1_account_update.go\\n│ │ │ ├── card_redeem_jd_v1_order_list.go\\n│ │ │ └── card_redeem_jd_v1_place_order.go\\n│ │ ├── channel\\n│ │ │ ├── channel.go\\n│ │ │ ├── channel_new.go\\n│ │ │ ├── channel_v2_entrance_create.go\\n│ │ │ ├── channel_v2_entrance_delete.go\\n│ │ │ ├── channel_v2_entrance_list.go\\n│ │ │ └── channel_v2_entrance_update.go\\n│ │ ├── fund\\n│ │ │ ├── fund.go\\n│ │ │ ├── fund_new.go\\n│ │ │ ├── fund_v1_menu_log_create.go\\n│ │ │ ├── fund_v1_menu_log_delete.go\\n│ │ │ ├── fund_v1_menu_log_list.go\\n│ │ │ ├── fund_v1_menu_log_update.go\\n│ │ │ ├── fund_v1_wallet_create.go\\n│ │ │ ├── fund_v1_wallet_delete.go\\n│ │ │ ├── fund_v1_wallet_list.go\\n│ │ │ └── fund_v1_wallet_update.go\\n│ │ ├── merchant\\n│ │ │ ├── merchant.go\\n│ │ │ ├── merchant_new.go\\n│ │ │ ├── merchant_v1_merchant_all_list.go\\n│ │ │ ├── merchant_v1_merchant_config_add.go\\n│ │ │ ├── merchant_v1_merchant_config_detail.go\\n│ │ │ ├── merchant_v1_merchant_config_list.go\\n│ │ │ ├── merchant_v1_merchant_config_status.go\\n│ │ │ ├── merchant_v1_merchant_config_update.go\\n│ │ │ ├── merchant_v1_merchant_deploy_add.go\\n│ │ │ ├── merchant_v1_merchant_deploy_delete.go\\n│ │ │ ├── merchant_v1_merchant_deploy_get_detail.go\\n│ │ │ ├── merchant_v1_merchant_deploy_list.go\\n│ │ │ ├── merchant_v1_merchant_deploy_update.go\\n│ │ │ ├── merchant_v1_merchant_sample_all_list.go\\n│ │ │ ├── merchant_v1_order_query.go\\n│ │ │ ├── merchant_v1_steal_create.go\\n│ │ │ ├── merchant_v1_steal_delete.go\\n│ │ │ ├── merchant_v1_steal_list.go\\n│ │ │ ├── merchant_v1_steal_record_list.go\\n│ │ │ ├── merchant_v1_steal_stats.go\\n│ │ │ ├── merchant_v1_steal_status_get.go\\n│ │ │ ├── merchant_v1_steal_status_set.go\\n│ │ │ ├── merchant_v1_steal_update.go\\n│ │ │ └── merchant_v1_steal_update_status.go\\n│ │ ├── monitor\\n│ │ │ ├── monitor.go\\n│ │ │ ├── monitor_new.go\\n│ │ │ └── monitor_v1_health_check.go\\n│ │ ├── order\\n│ │ │ ├── order.go\\n│ │ │ ├── order_new.go\\n│ │ │ ├── order_v1_order_form_create.go\\n│ │ │ ├── order_v1_order_form_delete.go\\n│ │ │ ├── order_v1_order_form_list.go\\n│ │ │ ├── order_v1_order_form_update.go\\n│ │ │ ├── order_v1_order_log_delete.go\\n│ │ │ ├── order_v1_order_log_list.go\\n│ │ │ ├── order_v1_order_summary_daily_get_list.go\\n│ │ │ └── order_v1_order_summary_get_list.go\\n│ │ ├── restriction\\n│ │ │ ├── restriction.go\\n│ │ │ ├── restriction_new.go\\n│ │ │ ├── restriction_v1_block_order.go\\n│ │ │ ├── restriction_v1_check_ip_allowed.go\\n│ │ │ ├── restriction_v1_query_all_province.go\\n│ │ │ ├── restriction_v1_user_info_collection.go\\n│ │ │ └── restriction_v1_user_info_collection_test.go\\n│ │ ├── road\\n│ │ │ ├── road.go\\n│ │ │ ├── road_new.go\\n│ │ │ └── road_v1_simple_all_get_road.go\\n│ │ ├── road_pool\\n│ │ │ ├── road_pool.go\\n│ │ │ ├── road_pool_new.go\\n│ │ │ └── road_pool_v1_simple_all_get_road.go\\n│ │ ├── sysUser\\n│ │ │ ├── sysUser.go\\n│ │ │ ├── sysUser_new.go\\n│ │ │ ├── sysUser_v1_totp_image_get.go\\n│ │ │ ├── sysUser_v1_totp_reset.go\\n│ │ │ ├── sysUser_v1_totp_set.go\\n│ │ │ ├── sysUser_v1_totp_status_get.go\\n│ │ │ ├── sysUser_v1_user_add.go\\n│ │ │ ├── sysUser_v1_user_change_pwd.go\\n│ │ │ ├── sysUser_v1_user_delete.go\\n│ │ │ ├── sysUser_v1_user_edit.go\\n│ │ │ ├── sysUser_v1_user_forbidden_by_id.go\\n│ │ │ ├── sysUser_v1_user_get_all_user.go\\n│ │ │ ├── sysUser_v1_user_get_by_ids.go\\n│ │ │ ├── sysUser_v1_user_get_edit.go\\n│ │ │ ├── sysUser_v1_user_get_params.go\\n│ │ │ ├── sysUser_v1_user_login_out.go\\n│ │ │ ├── sysUser_v1_user_menus.go\\n│ │ │ ├── sysUser_v1_user_search.go\\n│ │ │ ├── sysUser_v1_user_status.go\\n│ │ │ └── sysUser_v1_user_suspend_or_continue.go\\n│ │ ├── sys_auth_rule\\n│ │ │ ├── sys_auth_rule.go\\n│ │ │ ├── sys_auth_rule_new.go\\n│ │ │ ├── sys_auth_rule_v1_rule_add.go\\n│ │ │ ├── sys_auth_rule_v1_rule_delete.go\\n│ │ │ ├── sys_auth_rule_v1_rule_get_params.go\\n│ │ │ ├── sys_auth_rule_v1_rule_info.go\\n│ │ │ ├── sys_auth_rule_v1_rule_search.go\\n│ │ │ └── sys_auth_rule_v1_rule_update.go\\n│ │ ├── sys_payment\\n│ │ │ ├── sys_payment.go\\n│ │ │ ├── sys_payment_new.go\\n│ │ │ ├── sys_payment_v1_payment_summary_list.go\\n│ │ │ ├── sys_payment_v1_sys_payment_add.go\\n│ │ │ ├── sys_payment_v1_sys_payment_get.go\\n│ │ │ ├── sys_payment_v1_sys_payment_get_one.go\\n│ │ │ ├── sys_payment_v1_sys_payment_records_get.go\\n│ │ │ └── sys_payment_v1_sys_payment_records_get_statistics.go\\n│ │ ├── sys_role\\n│ │ │ ├── sys_role.go\\n│ │ │ ├── sys_role_new.go\\n│ │ │ ├── sys_role_v1_role_add.go\\n│ │ │ ├── sys_role_v1_role_delete.go\\n│ │ │ ├── sys_role_v1_role_edit.go\\n│ │ │ ├── sys_role_v1_role_get.go\\n│ │ │ ├── sys_role_v1_role_get_params.go\\n│ │ │ └── sys_role_v1_role_list.go\\n│ │ ├── sys_user_login\\n│ │ │ ├── sys_user_login.go\\n│ │ │ ├── sys_user_login_new.go\\n│ │ │ └── sys_user_login_v1_user_login.go\\n│ │ ├── user_center\\n│ │ │ ├── user_center.go\\n│ │ │ ├── user_center_new.go\\n│ │ │ └── user_center_v1_get_user_info.go\\n│ │ └── validation\\n│ │ ├── validation.go\\n│ │ ├── validation_new.go\\n│ │ └── validation_v1_get_captcha.go\\n│ ├── dao\\n│ │ ├── internal\\n│ │ │ ├── v_1_account_history_info.go\\n│ │ │ ├── v_1_account_info.go\\n│ │ │ ├── v_1_agent_info.go\\n│ │ │ ├── v_1_bank_card_info.go\\n│ │ │ ├── v_1_card_apple_account_info.go\\n│ │ │ ├── v_1_card_apple_account_info_history.go\\n│ │ │ ├── v_1_card_apple_hidden_settings.go\\n│ │ │ ├── v_1_card_apple_hidden_settings_recharge_info.go\\n│ │ │ ├── v_1_card_apple_history_info.go\\n│ │ │ ├── v_1_card_apple_recharge_info.go\\n│ │ │ ├── v_1_card_redeem_account_deduction.go\\n│ │ │ ├── v_1_card_redeem_account_group.go\\n│ │ │ ├── v_1_card_redeem_account_history.go\\n│ │ │ ├── v_1_card_redeem_account_info.go\\n│ │ │ ├── v_1_card_redeem_account_summary.go\\n│ │ │ ├── v_1_card_redeem_cookie_info.go\\n│ │ │ ├── v_1_card_redeem_cookie_order.go\\n│ │ │ ├── v_1_card_redeem_cookie_order_history.go\\n│ │ │ ├── v_1_card_redeem_cookie_order_jd.go\\n│ │ │ ├── v_1_card_redeem_cookie_order_jd_history.go\\n│ │ │ ├── v_1_card_redeem_order_history.go\\n│ │ │ ├── v_1_card_redeem_order_info.go\\n│ │ │ ├── v_1_legend_any_money.go\\n│ │ │ ├── v_1_legend_area.go\\n│ │ │ ├── v_1_legend_fix_money.go\\n│ │ │ ├── v_1_legend_fix_present.go\\n│ │ │ ├── v_1_legend_group.go\\n│ │ │ ├── v_1_legend_scale_present.go\\n│ │ │ ├── v_1_legend_scale_template.go\\n│ │ │ ├── v_1_menu_info.go\\n│ │ │ ├── v_1_merchant_deploy_info.go\\n│ │ │ ├── v_1_merchant_hidden_config.go\\n│ │ │ ├── v_1_merchant_hidden_record.go\\n│ │ │ ├── v_1_merchant_info.go\\n│ │ │ ├── v_1_merchant_load_info.go\\n│ │ │ ├── v_1_migrations.go\\n│ │ │ ├── v_1_notify_info.go\\n│ │ │ ├── v_1_order_info.go\\n│ │ │ ├── v_1_order_profit_info.go\\n│ │ │ ├── v_1_order_settle_info.go\\n│ │ │ ├── v_1_payfor_info.go\\n│ │ │ ├── v_1_power_info.go\\n│ │ │ ├── v_1_recharge_t_mall_account.go\\n│ │ │ ├── v_1_recharge_t_mall_order.go\\n│ │ │ ├── v_1_recharge_t_mall_order_fake.go\\n│ │ │ ├── v_1_recharge_t_mall_order_history.go\\n│ │ │ ├── v_1_recharge_t_mall_shop.go\\n│ │ │ ├── v_1_recharge_t_mall_shop_history.go\\n│ │ │ ├── v_1_restrict_client_access_ip_relation.go\\n│ │ │ ├── v_1_restrict_client_access_record.go\\n│ │ │ ├── v_1_restrict_ip_order_access.go\\n│ │ │ ├── v_1_restrict_ip_record.go\\n│ │ │ ├── v_1_road_info.go\\n│ │ │ ├── v_1_road_pool_info.go\\n│ │ │ ├── v_1_role_info.go\\n│ │ │ ├── v_1_schema_migrations.go\\n│ │ │ ├── v_1_second_menu_info.go\\n│ │ │ ├── v_1_sys_auth_rule.go\\n│ │ │ ├── v_1_sys_casbin_rule.go\\n│ │ │ ├── v_1_sys_config_dict.go\\n│ │ │ ├── v_1_sys_role.go\\n│ │ │ ├── v_1_sys_user.go\\n│ │ │ ├── v_1_sys_user_config_channel.go\\n│ │ │ ├── v_1_sys_user_deductions.go\\n│ │ │ ├── v_1_sys_user_login_log.go\\n│ │ │ ├── v_1_sys_user_payment.go\\n│ │ │ ├── v_1_sys_user_payment_records.go\\n│ │ │ ├── v_1_task_order_fake.go\\n│ │ │ └── v_1_user_info.go\\n│ │ ├── v_1_account_history_info.go\\n│ │ ├── v_1_account_info.go\\n│ │ ├── v_1_agent_info.go\\n│ │ ├── v_1_bank_card_info.go\\n│ │ ├── v_1_card_apple_account_info.go\\n│ │ ├── v_1_card_apple_account_info_history.go\\n│ │ ├── v_1_card_apple_hidden_settings.go\\n│ │ ├── v_1_card_apple_hidden_settings_recharge_info.go\\n│ │ ├── v_1_card_apple_history_info.go\\n│ │ ├── v_1_card_apple_recharge_info.go\\n│ │ ├── v_1_card_redeem_account_deduction.go\\n│ │ ├── v_1_card_redeem_account_group.go\\n│ │ ├── v_1_card_redeem_account_history.go\\n│ │ ├── v_1_card_redeem_account_info.go\\n│ │ ├── v_1_card_redeem_account_summary.go\\n│ │ ├── v_1_card_redeem_cookie_info.go\\n│ │ ├── v_1_card_redeem_cookie_order.go\\n│ │ ├── v_1_card_redeem_cookie_order_history.go\\n│ │ ├── v_1_card_redeem_cookie_order_jd.go\\n│ │ ├── v_1_card_redeem_cookie_order_jd_history.go\\n│ │ ├── v_1_card_redeem_order_history.go\\n│ │ ├── v_1_card_redeem_order_info.go\\n│ │ ├── v_1_legend_any_money.go\\n│ │ ├── v_1_legend_area.go\\n│ │ ├── v_1_legend_fix_money.go\\n│ │ ├── v_1_legend_fix_present.go\\n│ │ ├── v_1_legend_group.go\\n│ │ ├── v_1_legend_scale_present.go\\n│ │ ├── v_1_legend_scale_template.go\\n│ │ ├── v_1_menu_info.go\\n│ │ ├── v_1_merchant_deploy_info.go\\n│ │ ├── v_1_merchant_hidden_config.go\\n│ │ ├── v_1_merchant_hidden_record.go\\n│ │ ├── v_1_merchant_info.go\\n│ │ ├── v_1_merchant_load_info.go\\n│ │ ├── v_1_migrations.go\\n│ │ ├── v_1_notify_info.go\\n│ │ ├── v_1_order_info.go\\n│ │ ├── v_1_order_profit_info.go\\n│ │ ├── v_1_order_settle_info.go\\n│ │ ├── v_1_payfor_info.go\\n│ │ ├── v_1_power_info.go\\n│ │ ├── v_1_recharge_t_mall_account.go\\n│ │ ├── v_1_recharge_t_mall_order.go\\n│ │ ├── v_1_recharge_t_mall_order_fake.go\\n│ │ ├── v_1_recharge_t_mall_order_history.go\\n│ │ ├── v_1_recharge_t_mall_shop.go\\n│ │ ├── v_1_recharge_t_mall_shop_history.go\\n│ │ ├── v_1_restrict_client_access_ip_relation.go\\n│ │ ├── v_1_restrict_client_access_record.go\\n│ │ ├── v_1_restrict_ip_order_access.go\\n│ │ ├── v_1_restrict_ip_record.go\\n│ │ ├── v_1_road_info.go\\n│ │ ├── v_1_road_pool_info.go\\n│ │ ├── v_1_role_info.go\\n│ │ ├── v_1_schema_migrations.go\\n│ │ ├── v_1_second_menu_info.go\\n│ │ ├── v_1_sys_auth_rule.go\\n│ │ ├── v_1_sys_casbin_rule.go\\n│ │ ├── v_1_sys_config_dict.go\\n│ │ ├── v_1_sys_role.go\\n│ │ ├── v_1_sys_user.go\\n│ │ ├── v_1_sys_user_config_channel.go\\n│ │ ├── v_1_sys_user_deductions.go\\n│ │ ├── v_1_sys_user_login_log.go\\n│ │ ├── v_1_sys_user_payment.go\\n│ │ ├── v_1_sys_user_payment_records.go\\n│ │ ├── v_1_task_order_fake.go\\n│ │ └── v_1_user_info.go\\n│ ├── errHandler\\n│ │ ├── code.go\\n│ │ └── handler.go\\n│ ├── logic\\n│ │ ├── account\\n│ │ │ └── account.go\\n│ │ ├── base_user_info\\n│ │ │ └── user_info.go\\n│ │ ├── captcha\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── card_apple_account\\n│ │ │ └── ... 9 files, 0 dirs not shown\\n│ │ ├── card_apple_order\\n│ │ │ └── ... 9 files, 0 dirs not shown\\n│ │ ├── card_redeem_account\\n│ │ │ └── ... 15 files, 0 dirs not shown\\n│ │ ├── card_redeem_cookie\\n│ │ │ └── ... 7 files, 0 dirs not shown\\n│ │ ├── card_redeem_order\\n│ │ │ └── ... 9 files, 0 dirs not shown\\n│ │ ├── card_t_mall_account\\n│ │ │ └── ... 2 files, 0 dirs not shown\\n│ │ ├── card_t_mall_order\\n│ │ │ └── ... 9 files, 0 dirs not shown\\n│ │ ├── limiter\\n│ │ │ └── ... 2 files, 0 dirs not shown\\n│ │ ├── merchant\\n│ │ │ └── ... 2 files, 0 dirs not shown\\n│ │ ├── merchant_deploy_info\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── merchant_order\\n│ │ │ └── ... 3 files, 0 dirs not shown\\n│ │ ├── pay_type\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── restriction\\n│ │ │ └── ... 3 files, 0 dirs not shown\\n│ │ ├── steal_rule\\n│ │ │ └── ... 5 files, 0 dirs not shown\\n│ │ ├── sys_auth\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_auth_rule\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_casbin\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_config_dict\\n│ │ │ └── ... 2 files, 0 dirs not shown\\n│ │ ├── sys_login_log\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_role\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_user\\n│ │ │ └── ... 3 files, 0 dirs not shown\\n│ │ ├── sys_user_channel_config\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── sys_user_payment\\n│ │ │ └── ... 6 files, 0 dirs not shown\\n│ │ ├── v1_road\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ ├── v1_road_pool\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ └── logic.go\\n│ ├── middleware\\n│ │ ├── auth.go\\n│ │ └── error_handler.go\\n│ ├── model\\n│ │ ├── do\\n│ │ │ └── ... 69 files, 0 dirs not shown\\n│ │ ├── entity\\n│ │ │ └── ... 69 files, 0 dirs not shown\\n│ │ ├── agiso.go\\n│ │ ├── card_apple_account.go\\n│ │ ├── card_apple_order.go\\n│ │ ├── card_redeem.go\\n│ │ ├── card_redeem_cookie.go\\n│ │ ├── card_t_mall_game_account.go\\n│ │ ├── card_t_mall_game_order.go\\n│ │ ├── card_t_mall_game_work_space.go\\n│ │ ├── entrance.go\\n│ │ ├── merchant.go\\n│ │ ├── merchant_deploy.go\\n│ │ ├── order_info.go\\n│ │ ├── restriction.go\\n│ │ ├── road.go\\n│ │ ├── road_pool.go\\n│ │ ├── steal_rule.go\\n│ │ ├── sys_auth_rule.go\\n│ │ ├── sys_role.go\\n│ │ ├── sys_rule.go\\n│ │ ├── sys_user.go\\n│ │ ├── sys_user_config.go\\n│ │ ├── sys_user_deductions.go\\n│ │ ├── sys_user_login.go\\n│ │ ├── sys_user_payment_record.go\\n│ │ └── user_info.go\\n│ ├── packed\\n│ │ └── packed.go\\n│ ├── service\\n│ │ ├── account.go\\n│ │ ├── base_user_info.go\\n│ │ ├── captcha.go\\n│ │ ├── card_apple_account.go\\n│ │ ├── card_apple_order.go\\n│ │ ├── card_redeem_account.go\\n│ │ ├── card_redeem_cookie.go\\n│ │ ├── card_redeem_order.go\\n│ │ ├── card_t_mall_account.go\\n│ │ ├── card_t_mall_order.go\\n│ │ ├── limiter.go\\n│ │ ├── merchant.go\\n│ │ ├── merchant_deploy_info.go\\n│ │ ├── merchant_order.go\\n│ │ ├── pay_type.go\\n│ │ ├── restriction.go\\n│ │ ├── steal_rule.go\\n│ │ ├── sys_auth.go\\n│ │ ├── sys_auth_rule.go\\n│ │ ├── sys_casbin.go\\n│ │ ├── sys_config_dict.go\\n│ │ ├── sys_login_log.go\\n│ │ ├── sys_role.go\\n│ │ ├── sys_user.go\\n│ │ ├── sys_user_channel_config.go\\n│ │ ├── sys_user_payment.go\\n│ │ ├── v_1_road.go\\n│ │ └── v_1_road_pool.go\\n│ └── systemV2\\n│ ├── dao\\n│ │ └── ... 14 files, 1 dirs not shown\\n│ ├── logic\\n│ │ └── ... 1 files, 3 dirs not shown\\n│ ├── model\\n│ │ └── ... 0 files, 2 dirs not shown\\n│ └── service\\n│ └── ... 3 files, 0 dirs not shown\\n├── manifest\\n│ ├── config\\n│ │ └── config.yaml\\n│ ├── deploy\\\\kustomize\\n│ │ ├── base\\n│ │ │ └── ... 3 files, 0 dirs not shown\\n│ │ └── overlays\\\\develop\\n│ │ └── ... 3 files, 0 dirs not shown\\n│ └── docker\\n│ ├── Dockerfile\\n│ ├── docker-compose-local.yaml\\n│ ├── docker-compose.yml\\n│ ├── install-one.sh\\n│ ├── install-simple.sh\\n│ ├── install-test.sh\\n│ ├── install.sh\\n│ └── wait-for-it.sh\\n├── resource\\\\casbin\\n│ └── rbac_model.conf\\n├── utility\\n│ ├── cache\\n│ │ ├── cache.go\\n│ │ └── consts.go\\n│ ├── config\\n│ │ ├── config.go\\n│ │ ├── database.go\\n│ │ └── models.go\\n│ ├── cron\\n│ │ ├── cron.go\\n│ │ ├── t_mall_game_data_sync.go\\n│ │ └── t_mall_game_data_sync_test.go\\n│ ├── integration\\n│ │ ├── agiso\\n│ │ │ └── ... 4 files, 0 dirs not shown\\n│ │ ├── originalJd\\n│ │ │ └── ... 5 files, 0 dirs not shown\\n│ │ ├── redeem\\n│ │ │ └── ... 2 files, 5 dirs not shown\\n│ │ ├── restriction\\n│ │ │ └── ... 6 files, 0 dirs not shown\\n│ │ └── tmall\\n│ │ └── ... 5 files, 3 dirs not shown\\n│ ├── lib\\n│ │ ├── libErr\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ └── libResponse\\n│ │ └── ... 1 files, 0 dirs not shown\\n│ ├── limiter\\n│ │ ├── rate.go\\n│ │ └── redis.go\\n│ ├── mfa\\n│ │ └── mfa.go\\n│ ├── monitor\\n│ │ └── monitor.go\\n│ ├── notify\\n│ │ ├── impl\\n│ │ │ └── ... 1 files, 0 dirs not shown\\n│ │ └── notify.go\\n│ ├── otel\\n│ │ ├── config.go\\n│ │ ├── errors.go\\n│ │ ├── handler.go\\n│ │ ├── manager.go\\n│ │ └── utils.go\\n│ ├── pool\\n│ │ └── pool.go\\n│ ├── token\\n│ │ ├── user_token.go\\n│ │ ├── user_token_test.go\\n│ │ └── utils.go\\n│ ├── utils\\n│ │ ├── charset.go\\n│ │ ├── orm.go\\n│ │ ├── tools.go\\n│ │ ├── tools_test.go\\n│ │ └── utils.go\\n│ └── verify\\n│ ├── aes_ecb.go\\n│ └── md5.go\\n├── CLAUDE.md\\n├── CODEBUDDY.md\\n├── Makefile\\n├── README.md\\n├── docker-compose.yml\\n└── main.go\\n\"","current_document_structure":"WikiEncrypted:S4m/GOH10zoyRpB4gK1IamwR0+dn8ayUJJ4ykExBAtv4k652T9xgrXKtiMDXmxy4/0feZubO+VIzxraHA2ZSbXIyWsSCKfx6DLkMxuTn3TrQP3ORGdiHQmuEtg9m+ZDJSQMh5EjDJpaw+VF3veps5NtUbirDoYtZ/kfZShSUQmsXY8vcBOquun9+zhZkL/Rx1b6G9DxQmrycC+3qPnEESD8s+uWaSZVUsZj8wrcPhuWfO1jv2qRKKdOE2WeB7py7Y2+ksLhetcjx7tefb4/U6YKtJkCNDv/mSLnWkYJGq/yDAWnrgUDH6mvWKUP0CImd/XwGhMzdt+dU32NObJ5bDDYIud/vqg3TaQPesTIZcg02Kcn1pDQETST/6f2vJ7cJsqTpVhfHgnPMidC8t8qDGbfnRyJDn73mi2LthDgIAH8Y7ztfMQsVNOQ2MsubfU/sZuBY2qMSe0qsBZgV2eXxGjjKNmrRpqO2QiGUjO/3VQIzMWb+MCet0l/nZ3fYnkeWdq1LyUDRe9VI+HR+kkf2v7YoDd37k/U3+igYsm31BSvPKbONIwDVffaAKS+iQc2AFV2cMhYWZNzz+faX+OS/7IrBAeYwI0+PAmWtQ8p2yuEoKLQwKHWmvt8Vlppp/nS3j42ZPc99IzYpwqQ+l93bepqlO3rQPidHD5yy5DRHvsDJRRAH98gM+M1hKHSSsfp7VLGtMn6f4aNKW8XfEdouD9apZkoog40ib3NsQKeuyfSas5V9iKgtXXru0kcAPdUO+j+YvCGzpOd2Hlo1w8WKopsPZkfr5x3W6DymK3QM6gwg5J5jFMa/5N8CqFS/lFgqD21nisKOMnxyVJWL9zHlcTHVJIgTWX+VCwIAcRmA+bAQ8tZXPlSR2ain0tE8hFqbIPVG91tFbb6e7yEjjRiD0/fy5ee9hbJfV6dBnXyj5XwnHigK4LH0+z2NgAaW0oKmI4V+nSRYyn+CdXJMLt1/dSl9mamjXk87wMtyDI9W539u/29qs2cfUsF5FGUcSJMZnkqBN/9z3n057WPpHNbXluBXSA4DvlPvNBfEPzHwJxfYdJaNRTKjdRzs6CBAWeajxTg+k2x/quS1UY9QKOBdVPd4Uw71BHKzo9RfdIQ/kjoUdh/2gmirV8bsE1f5cACl5U/CwDBvGgqzR9L6szjKmS/gWcyvO8GGRio8M/HRWpkxMOW3Pw1SciTcnJHyw+6YW9eLRmQorAEX68IFsf2iviejH+nZdX+puz/aFJNhgZ0PL8K4RyAC7ASpfTMEO8+4E7Q+KmK9IK/hQK8Ui5RSbosOCeI2K1y+c0W4QWFWuelZFeDWpH2It9Ah1JmpUi+hM4xnHLMZWcQBiYBlc+KJ5RQ1M5VIA4FErytFHV1htGGtLBNevQ35NuuVm3cSKYgHoozCoUb/sdyW9P8gi6MmahuDYcprwvZHQpX95KRH7ZBHoxQiGluXxJOyR29T+RK5UTSTBF2wqMLvtU3yGBSFhUAoDIr5cn7kJmm3pkuujrfaNDs/2/7cj0U/VeGjKSCO6vBjZv7V6k89Gm80sSJI5yyu+pg0kyd8smOkxczmejdgmuJOmaCmtldLNTGFGifDWzqZFYJLsuTh+mlpNf/3ywlZf1xZ7GQgeyW4NKLDCp22hPR0hpQ50rqYb0i5R+d5oSlZzWXClQnjF8VD3/BeXrxSuNBe6Vl+xinsMyiID5eUHxSL1guOoWoIPYCnQeAjCRCfkCL/khPsnsgKWI58WoAlzPiEuoS4VCN8czT1vyY8GLV1RAGAvV6RFv1U2vWZVH6lKHk/ANYaimzdOL35hCo6JjccOkuwwDWD+/JCtOJovKOf8RpmMnAvQC/Lkdo5hPF/9tqtpM+fWcjh/voHIalJubEm+w5fNjIZ5bFOjAHE7gXIjOdBLP+Hh/yDp9i+LQnjUclArtGsNQW/mcs/K7LumgjEAQjWD2ukeXEGkx/zNJE4l0YicFfK9NUwqAUO+lS/93RhRJYdczVXQErpnxkntc/q6yE9waR4Y21lP+rPW+1K1SIdch5E93Cw0p1re/hy7DN26I6jUuRBU4yiNiBYKigowbDeyWfUONJojW9JGofRo41dA5yz6tuy/RKJsQ5JtqiZzU2udEtpp1csVgnN0TrpFTb/fa2O83QM6OquwhsrIjA3/gW2So+m9Pq2Skv7cfc81MHUW+4QHxiaa2qEhH2OgzrjV9hsRlWrzfxAjX9W5eUAVnNF0G+pfEmofqBmiRt9+pN39ed1e047Zx2PKUM/h6mTIa1GDeRuXQEG7zCWSwW+ooAWKC42r9YSfOrAcmB3HyKPAEirPCNVX+9RM8Rv6ab4YbulNv2ZxcOw3wPxQQIB6b5dBiOyOdadPwWyj4VECC7HLzeFzePLndXcTGrTx5Nb+hSrI+95tfCgN2bdrxHR0RRDD7bmtwAzDae6P9+RgeNPV4X0rL98Tf1GZde2KwqiJtOlsTRJ1WRjPoPukomSd0E5uwba1FvwOQno7P/wgKjLICXQAgAnBPiiwsDwadDVSWma8Ja/dd3eCT/bfK6IHUxI/MQLbpSNDpkJcJYNzc9rwFDMTipD4KuoDCfvWYY50FGKfVEC9Mdfi7pWXPB3WDAjDoBfv96iDbrEWq+UYYzQ2xDzxRpV40FLQxhUhgcdqDOrJbAOIkAT/bpH/3fEOCgYPOunzh9eS5WxiwnDypJRs8cxSclnWcNOlaWdk4mkS4zj1fbQSqGynN4QK4e0if9l4ZerDASN3pha9rBsbcfrWRIFYCm5pKSHX5Iz8a5qpMDuqIJ0uw+cGvsZ2XYcPrdV1AKs475UeAbkaMnDFE6/W5bPSR9df20RLq8KiK3l039JMY6h0Aicldujpd+y+0bZ6GmJlV6VwPj8UjVa4J9/6cZKeZYKJqOUFIskcUcS/SyzX3OsH0O8J/A4eLmrwXyQNArply516iKIypuI3Vf9cqpaglHaXF3GB6s84JsKsSqDSKBgFoYErZsgjpp2HGUcRlM04/giOb13cVebKlypsQjtvN6YS47cHhvCeNCxT4jqFLqwSHoJeTmF6Ose3iL5pzH4uUllms6r/tHD9fFbqTauesOPNGscS+GOw3Yu58c9afe5nGFl/2MoEctj/zkg01vsunRCYhQq6K2i1/MuGl/nMGigP+z9QuasI1+UX6N21fQJ+uspMig7oTTHUSyGw11sntGCdK4fdlACgni7HosuvWNB4uF+UG9OeRYw9kccIB2fCmSt37CR6xyJ+glN6dK0zIkrZnZUi+wNfxL3JH+OnXqG7hPfuJJ+BlsLAu/jeq9ss8+vEzVfQuOAG3z0nJp3s0zYiUJduCGlDWtYOkLWXfZoFhPw/dIZlc2mpwKoOOWENdPv45Fpglf0jZamFfZY/shHoP42FFR4L6uOoZoFPya80QlZDZ0vC7x7zZQ3H60uLZ+Rq5MH1MS9d5GHHrbhRsRPkWiDFNxrKLGHwIPOPHnnTQoAyan9XF0ov8JFf3V01nnybrI5iTp7u8gR0v48gPJRqBHvmq6gC4Jlof9KSkiif5OUzJTXVaGLfW6uHGvcWq5Y0jgmD6lncl7UkzbgnRpYjRAfXCaNHdJHwxD8Yov/2s78rhuz3e9H1l4aiLC51NVkTIKVuM/ad5j/WwO2EPUFEG1NevoQM6bXgmDQNVM0BrpFL0JhaKJI9e6nDT6bXtgnfTM3j9ZPd9+M+fAI5Xo7gYMHCjc76MVU4VWXPy7geVjsmqnPbsqq1Kef4Eqi5LtDcnhcdYGweIFj102LRchnLsDTyG9jZFYgDmJqB6VWsUwg1IBmaPHZ99ewBQLIPhjwnT77mksuz+WSL4GLdE/q7zzhDZeaPQEwE1gpxeFfCbvk9vR3i/Tz1DijRFpyMbefRpORz0TbMCWUKJPRS4vR9Ysm2n4ipiJA6QG7nQb0aTIJb2PmGeES9HHxOQMZnKfWP6DkHuffORWC9/e7uTPtYsVvOjrKE+TCni6+2vZUF+aM33YFH8AbgN1JH6c6tgFXWc0FQEml2KJkMLc3+YyeaU2uxe1OdEsrO54Ku4DSYn+jgkSKSQ6J/7u8tissU1WYJ1bOV5j5Y59AyYUo58ZK50Y/Xw6eMeTSnxfAUagEvXK48VI66tW4ybPUT5ffx4W+dxKFB36O2dDU956QlcAu9jawYI9PWZRRSpySaEja7zgNumZfribGFRmJkT1rBeU6vGl2bodtk4L+sN4m23O8LajeIhlm6iCFhPzwTuTYd2IC27Iu7nlkCmzajy4iFG3CIEnPXZ7v3rq6Hmn7UOmEr7J78rtXo+oCO7oisTOvbPWdnFIPjAnwXdgvI5S1BjNzxU6HLn8THHs2VQOYWHZ9mPNGjHkyrEQaDM+XkSSdk32ENpDEqoQeLzUG+3fXbI1xc5SFKWKCscmTlil7g/c17ZwjM7i5426yVYkKS56czmvmysw7zZ3VLBRtYzkV+XtDKtrYnLGgzks7p9Gku133i/6LydIwntUyWbDtqU62vTdluKf9VDZhIZBzRS0SIABXOgsX7yvDyGQ6SzFK3r+fSSvXqCh/E/p5odrZ+AgepHBTpr8j3o5CpXTllkMsDl96esVdlPYytqGn0Hmg4mOlUuWQKehjyaORpTFEOecBuX1urrZFAK+T9t/phPA3ESjwxCXQ5jz4EllD7lfFjNGLpl9shqIQm39of/3/EH1Y3bFNyzBSqyVnlxuNwXfAOMrraykgjjnt7MSVTZx/iPvDIgVzOyvlDamCTJMqxbaB6TVEzMq/n+wcio78ErX9ih/BnwNDr678YsH6I/y7k1CICTxIed4MrpAT1Wk/QpLVhazlt3F9z4Jwtn6m5TQjsIBEmxI7sjNrwtqZ9UpqwiKmO5iGdR4hdxkm6ej2vYoyDFJ29gDxjoiVrD2dhmRDvWSQQMACHGKd/l4eDCOJIyVFdQ3eA5GnKd5ymuJu2jljqtmBoNZiFndJItUjF5BUPGSjnomh1mH5X8hQaE/etp7fOMEHaDiW+e2asSWMY0oHbH2VsDVAlGVMkplVW2Juh9T65L62HLsYep4HzYKUpu6ewbzaJ1EjsiASAMTOTolT6KqMMmZfz3SvtyOBn1WUY6i6Kvh2674SYRPARry3n67cm1ejVxPr/+TgQFsLZ7/vcRskQ/qU93j1f4fmBMYh0AZiuQOrdeGEB8yD9woXcDAEHbYKk1SaY401xnwWdPAwZnm7mOiGoH/ymQ1whiBJGowu51KYYUJoDp+61JMxSFJOqQACKxo6SrSlPWsc9hpzRRHJBwijdgUCXylxg+ge5xTVGPoudieUPlNHXpEZxiHbIAzdljhCm91hYePTb/ncwFc72PigiHm+FVmBEtAAYZ7NBYs9EGqPev7O35W2D9Z1rhk0cQi+XxSl7h2utN4AE2NnClIelGsNHbOyjvdlfJb+9/0vMRfeC77SPvgqq3X/31XPazlrUqKdedvGCxFVMEz4Wp2DqrF2E3n/QLSDNWgcaryeU0xvvRwsZLMkpFcqyLmdiR2roFp55mB2l0OZ/f3V+6xjy20R/rI9dZp7xulxE4HNeisCJBxHORatUNMZsxtL+g0Obqlgmjzpp/PSL6cUWchZompR40I/g6PksiQh77xW/GEWY14Rm5tgKUbLOhfGKlS/Ow1KcJLweMpWuo6TfDvKurNbUzoZ1rvz4uzd11K55C3R3+n2/F6BPXzVJIdDNAKIeSCg6V2xl9gvqCR6nDjFPMNyGQCxDyUXHCxEsjaK6g3KuuCZFPpIWwuqlfowWuNSxS5rKS0dVMOPMXmP+LuNAY6Pvrqu6L2lJpZbv2cJWiuQZ5MutlEyqawcNBXvVvzkeOAxxQvvCCt0vj/nDuRjSoAHY3iZVWPp6VfJ32UOUR13LKX20eDnhCcxW6Nse80Of/Y1zjpITf0IaanFdTjTERlAzJBweMM3IF/aFL9iKN4bE1iRscKd6gqBBdwK2Abb3S+SGtiPM3eIGf1IJSa+E4acjLc75eNB1M7eNaRaGfVG0GwTenU911gIybmabEJeXUO0rBhys1wtLZDwM0zGqcc7JaTWr0XSM/Xrwb/CiuCCZ/dLHhLQ7hVTyI0TgDVrSgGgsNaVdDuCfUw/oBC6vHOJ3EKGBUceQdCy+jvM0T+4UIr0KpGanPtqMqvFzOqweBqvPbcXpv8YWrK47qMPpLFqSqX7lI6roMyQtmkcBY7vDx/JAOuMQxOTa5b/M5wUKvAMzxQHs6ZcpUlb/VaHkU3z9LtV246Qwhvqg6XxDntZ6mcWEUYLbBk1paLUkZaI28++w/D7wohBn7c29Tyn1TNOWuwyVHoFQE42ANfSmOOHplk6jBehc7+ulVtRv/yzYnvx74qfisG35+PTbK941UXfnJ3BAHvKttZSSFMRD3qJQrR3TfTj1nV9GDhCU4LDRx3H3WRv6DeGE856MyCUDPXd1MKkDaT5e+QKFfcDEa6nrSSYhEZnOJh3hEHZd07KcUpeZnxBDcsm23FqelioP2n0AFZjSKyLSr3JZYyuVEsgxGxRrvwVdmKbkUQTYI4x66Yf52RlLUaUaNlfJCoqtViH2hsw+Cwiv8RrZYLRR/7ev3cpJqkW9o+VuQ4Zz9B2B50Q1L6kJ45VRyjl/0vw3djx5MPIu3ufF95qHdq5wl6bU+GxRD0jEBpHk0aAq+h6eAxgFblocZdZCBrw2hRqOSDpsWRZejKqrL7zjjVM66HSw1F7NNyO2vv1ZNzS9+tw0QbaZl14sOBT6QV8nfx6Qna7cIYyvlnefVyROtrH0awDLP8Iv5eq8RCFJv34yhq3yZRaneYMSy2ITKXZL6PDBHcIMmdL5k55xAi1l1NQpy/9EELCkOdKa5EnGTN1O5zPv9ZWTFm3BDLmYvs6NOSXHEZoK5rIbwlxunhSKEln8ff3JzPXvGW0NXrmvi6Qv5Lxi5++RrNA7qkM1drPyNtYBhzYThodrIztsmoSzZ8sSNS784bD3tRSfYMI8CWaFTjDSdEIEZzmtf2DOzUhfhZ8tpaoH/JArKHvZOsUWYzE2tfzYxFXjhtDiR0EoYaNJKK9vy8tHaxW67KvjhAHZtQsCG+oBpV4caBT6s4YM7zbfenbwr6V3dfLDjyBvZ7UdlgLvn2h3BF/XgzIvGdOi+RR1tR5kLGSxzsVFOPABu9oO2y3so2SL/Fx0zgMFNf33Ccj+BlcPvf3a3NNks+tJBoqVDy9568AB/nUW5PJERge3jSKkfu+RdyHr9cBHPcsOchmFoJ2xhZUGTVYjmPcxhypMxVzDV/S0LV5YIzJySWZtqnZtJJ5UOiWD92Z3TCWhbxuPFAc2534J9FUqTpBDApfzkVHinGRLOMY1zxNDmSn+lBMAWceOcvwEzMtrgprUx2yHFBU6QddZF/nGO9x9KmKCUsHjM9yuTaPQD5FGGhaOoz0jdIIIZcjjGsWdD9cWyUoP2jjdFi9mqVapSb0+loeVe9agA1URhuObflzH3YIF7l+vvqlEbTWjjwH9sD7BKbM0JhACoYmD6/UIlwumXT45b2+P6yW0p6HC/DooTZnUSkhjOYtTmXEZyBvE6gxOG9nRQlbkikfWYJaSoM9d9MMNfLKXEpIOW44LrflD+GXXZJVPGsXwxCYmLbzrffgbOTuSxZW6ZoAF0qYq0nIpCLQ6i8UQBhNn2L5/nwBmpr1hqU6yPQgGFfViyZYxhWNlj+wa3GGOCvbZLWL1Bfow26k6f1AZEVOSei0T18wLXjgMfe1itivfzK+S/OAhQ+jI4IbOvfwwlNHbJ0GMAXguc5nVDmOR0Gh+tkRWsTt7ONpNsH4Gi7Nar2ihisRz4Cp33Vyf4NCv/QTz9xqZyNX9vWDrVPitXrXDpFzYrac7KioExQwkhmJQg2xdOaS6du5S6ZD0h1CLd6spliQ0imaddBDa9GZA09uSdqABODcBsYbJ+xQZ/l7qNvsbya1YRpJ3g3K/LwsauSxxvf0SDiMbY4QkeI5sZ4XY5/unNpj0YiM+jlh+RHhcx6NRb/b15xpEljmty6g3ZQizTn2WOr1kTjwkpzrLnkt2H8AUqFj0g2PzFBglVNtRcq9a0Eyaco+z3DZK/RTNRBLIJyYj7Z5J2XaUGFVbhNGHnU11KObj+SpTaR5Bj2vWD9oFmVMLGPB5Iam3HlthmJcXtl/VMa/0tjVw8DXz1jJ7UYmqyZSPumt1X5otIEupF2OE3IPa4X73sKyxzAkIyhdTjtjDyv4TuIWt9+QvK4KijLJE69Oel6Mt1AirQmJhCqa363yK81s59OCTbsjm0D6CI4NZWvH08V/Jz+bocUD9C0vTrlVnOTRE6AEKJJAVrEy7kTO6LySRztxFAN0H9W/0KahBbfrEnjr3mBzXoklL91H+4A+ljny0g1bkA7A65GZcTBK5F8TpSpTMGlskukePfr7YobdSpw5GkHW/ZFpqxt7niu3P9o1feQmdp4utOx4E5hgVLXJorqcWF3Kq2DmWLm5FwSqY3LcyEkGcgqOxSVnvog85HSU5ssQFSj8z8jbvRZ7+c/tAHHrP4ml8976DPdyXrYAfHqmOjnVQGxrVTv+a5BU5SDmXnHY15Nj2Mq0sRmkkY6Q9rq1Th85R/rddRkBxQt5xabjXGfYDYz/fP9CEH6FCMrBXxardieuZsBKxlMW3kt3Kt5gO9+YTwqYEIA7rX6Ec9iH+UBTfFsoE/bcKql+EHFNzCbeK8GEVZhH9tZbabO1PX8UvoJyvEHkTpeE8WW/c0nhBPNUXmr8CReDmZ1LG/obJz/B22S8af0fHDsiaV6H7PaclhaSqheFHYcr9+MwOc4mDLxawdUSSj8OjAhO0JIhtFh2NeMGD2DiEk2BzCrpFRdbmTMjngbkDswI46SZWiJEy17B9M0PFLaivpiLGsOWBNb+voam8G/vX+1iyQDnm/8C+t+rOqqnhCUQ6Q8ACqpYyNNxgUS40GUNmI+pmtDnTqV+A580rszrYq2DeKTrZG78Lc/1D9C6gDZbeXjDb9IbuRwBitmMPDpzsRhvQXSg7nvH/Lwb0mnL3yhAYm1bY+Kgf5sCvOhDEDmbbgH5IoPqDSAinjYjXRvLQfBUkvTJc4meAIJH/bdUaPBJfjJD+vdPBg0F/NiPN+apAe5qNuvv9/lVZIAZXm97otTuyBlZnx6JxXI8Mh2roCFj2KAh22n6tJgILe57yhH87AUDZTETKM1iqz5n1LxWFvYbz5agJzD4eHE0NXOeYSCWBfVFbalK2PFKwfLIoC+oqbXQxNvE+qO9nWVxZHB7QUBtCGXeKNl37ArNkTBA6mvFT5IwzS1RyrAbx2hU4lHzhVOe1uxLYwKCvKUj7XbRtZq5vSI7YpFmocMXrLxehlD0GWDxNe/byB+Rvdhys9MoA1r5Fzw2T+LQaXv/pu+zrNtCFmGGXcMWh0vubgMeor62SLGs+hsaowLziXpJkIXJZL3UNB3j7LF2tCLPxO0bdLysbVAD5rDQ7Xsxe4tw4W5gWdOvvvFjvJMPeO1jt463QquOpM9N7/ctXBQ5Lt/b1pLNiqn8J7GF1Ny7FaFZbFzZXnqj9oEvOLi4g+qxdlmvJwyl/5juqnk5K0P2Zy0hVSDoiRLup5VpGFh4r8VyG8puVTbYPQr7CMa0/c2VXma9zIFOfjE9YSCj7iUMRSD+fR9zZh0vvX19e0GgcI2NC3pFhfcffUuYixhItOUQ9W18FCGH0CTb5Bp9inKDuk6J4913tMIXMTp9VfQ3oyrxfxCGLkz0WUBpnjwoR4dU8+7w5cEMB5aUysCHuYt88VxibS/Ddky0iPSTGJh8ZsaVtZOYDbfG+W4wvRlpaos9m2FPPJqDxwuhKZl+VmqCYLUiOoda5tat6m8CCmsTQLajGXn23zx3VvYeI4FdyIIHfNGmI/luhMAV9cMLy6laXkAwEdtgxZMXtv+hIkw1fAFxNfGqyV1zvIsVKZGEVdgcSxfDdoI/oSQ8VSVJ9rGbe+ZvsPQbQNbB3B2vDARgl55sCpCbrjizZAfjut/4Adh6igsRKWa33z/EOOY6X3747uHCIAUA0i+RNXuAtHY72SAp4ImJRaiJjttNO/szyXuo1rzxncCd7zPZyMln755Vb4jujN11kNV2YV+prgdKMgn3ohzqCGOjhroIIWf9Z/JULMq3VQR03R9XjjMfjjswyWsuut8SyIQtzniTMlAYAnRlPgqds7pwp6Iu/iMXYwLsZyFhGUlKNvhQ/0WShiZUhQF+J5GATFF4BsV5h042qUpTYOmuDhz6r1RMX2ioDwGxJqJxemaWljw3YwS0eD9G4gVg+gqE8i1vFuHZhceQ9TIcZ8RmYm0OKbcGyDrztP15cSJSIbo6VPyIr/0p42Sg0ds56ZMXeVE/1PHzd2G8f4TUA3+ACM9Sd9/ViEooi/mphDd1rwTSm8wZ6l0z3OpiWpJ52rQcECvPKoV53z1DirMwzgrvxR1rX7x+lK0DmRFxs+bItbTvnZSJxAUj6NYwNpDSSHfdqMGxchgqjWvoIaicv4Z4Xd8Dc6ElF32YV2VPNR4J24YgFL6baErOLAGvPZ2XdRtpL6SgYUBpTOlNOqIlV55jFNEGLbY6Lg1D5TVgKlgui1PcOPu4hKEH8Y6HCKL5+7YnZrWwF2DnnMvCBrKKFOvVLhSdwLnBRleW63Tr4FGI4yjqJUIQg4D3jAwofegH2fWyGNrlwCerKj9zupfPvizhxku8RD8SKtXr7UIHgGX4qpu8boQyz9MirtMapvRVZX+pHr/MhF9AbFJvzPvyWSUukLUk6RVDA5uBP27d6LotDqjoX13IgcrON6M8cf1eyb/EX4rHdEhT7bp6MdxeJa/HOXvWwW4p9pG81ka33tQJVOC4PiALr9NBT37u6IUR19y+wcOKeXuYPx/x8LzlRsYcu1TPb3SVgUsyw4swiUgeRwVRefUv1QhFh8wQxqctF9H6fZ9FEEhXQ9Z/l2I6MrkzqA+MBB5RT4UB0eNlHDQ7PXb1YBxCX9C51FZ0ArZM8n21cXgwoNTJBGwWI7AMVxjEr8TBwu+lRMQfTGO76pUY7V36ZW6GuPh2E69BKLVgQD3HRQJWTA21/I4GmWviSqeP59q0Y2ZpeXem5T3bycsBRArxomLwv9C7uUFZLVB/AMo8w5TIljYQG4wvAR1jYhrXDnBIot73pCVcAyL/LNjD4PsCu1hzUYIFlRnmIHqY1h6nA6F23w9AUikE53oKDZl51Eze5eIC/UDyBSjKhasfOMa1nOalxFjVNXUXYDyH0EfHaDedBpDn21RqTOHGtcckcDYyevZMrtuKcH8MWAE1b9XNoFGLF8X3oq93muD8o7aXCVwuWYLuTF/B66u0SoVqr6zOYqtTbjmq2D/XqoD3hGMS2Mis+Woy+nXrLi+zL9VTqvD4Iuh7CZp9OcuZejcAh0RhI90Nfg7Sqe2/PkadOLN/vT7iP0r5lyZsgrVQufJ8rGVhvr+4HDu0IciH9oA2IdonHganeVLZlj4fuMAsWjl8zbrv3j7fi7b53goflCrm6q87aVjRBgmtfKGm77fajAXG8ugb2ZKLdLVdw836rmrK5vConURuDvm/5tcbUazUOIeSpq+wE1Tde+oFfhJgFOrhw16h4bDD+1mo9Ay13nxL/1WjgM8yaN4Dy0y6xF6J+/EKro1iSlm9/URDa53qRk9r2CGHL9ZwAX9NG4Gw8axjpUaPvn2evVl4Dylr2su2PguDPCO/jLwLHlXRCuZtQP1SJV0NXwvpH5QUUfOz/lkGoALVwX/nA4qJm4+1sMHShqUYq9v6o70RdYJbHI90UR/QatiS6bQTVZpPSF1WxxUCnQ8d2wc65aJ7yQorJuNNxEXs7HxdCHo1pu2S/m3T3M/IMjYpeeXS9IfC+jov28bH1XXUDIX/9iyEH/THbRI2uyOcWyCAI/m07D0xSuw0lkf4dab6Azyb8htosn2BVZMzc8qJbFUZfb9ckxdDsAoTj6Ua6oLOmrv/ZuNxXHH90+uu+29zo1x8aHeFnbTHTSEwcF02iYhkvSP4EJlV7R9Upjwdhe1IE9O0wSIljGCNm1yV9PVscakXm5M5ScxFw8+51rB/i5LCXW/skpUEoBtLSgBhB2o2qJN6w7HUr1/wd3t80Gz3OVYjQ1Zw806UZK9RHZs2wDy3zxHkhdPMjNvhZ2u4S/TUm9JGR5EYZhtBfac2gbDemMNdEW7okmraub4WStrxiglm6zAD+/AmD538Oi5M2zDm3BV1p21PfDPg4lV5B+7bJ94HYXoMqN76jKCNIlUnuffbz6Rt53xVnuuFHT5stWHhEbicTNuTg5qtdpi8dNubMjDLttuCH97ePdX53IQxV9/nVi582+hVuw03dAvP/8FbVwRvspAI5Z8KAULz32WKbxJb/GwPcj10IlMi4KpI/ayWb+6dBzFfRYtr8biValnqfJHSvSCI3Gor9CFWzzy+K8sT9U+fQxdalM63EOXp6v4a5WVpNGx5IJqJhQust48KrB3ryq1LRYkrhyUHzbgKXH0zxXzJzASYUVFaiXo7FtanyRZfJv/Lq42skYJQl1WPXryhIUyKdaFMTQHqaB1R0nHXbO8it7qn1ngf35IqUb5PHbBQNYYoYesyu+g/iFu7HGgTmyP/ti8bSlbsCneNjbH88LBq76sa4csUkyLxMfcneQBqezmVXZmK95QkMSPQc9fTwV93o+lvqp16gg5jJbLzovoKwhzf3y+pROaGe6VSbjO/3j6rNNUetRT9Lxu+XWXxolhef3zYxIdKhP1G0OFAV/B452ZC+o8KjT5x9fKB/lgJs62CiXcRlsOnvzYCqeSAFm5flhBcJNwleP+AiKxTqvmlzwFSqcStFs67TcMFJF9mCBYdo02iMPhhqjhz9aWmwki3ATY9IhAUEAzzYVyo0ZePN3WarHtRkR3aku82ukhUjCvQpRsbE0XwQBgbxtv+9dctTUeRIxRJUHgkj/qZ0/e9CpiO7A4FiPXvaXFajHW+bqovY+Von9gLxDMqMnvwLL01igOpJ0HKd5o0CVyCSgo6tbjLD14fmtisGfUFclSVAEmurZj2MoLqW5r2xZmDfghezlz1J5nlpk9CsUEIz/uYwofVVKuguHwynknKVb5WJVNzTRs/TJGzHFLR5Yk0tXvBudyKKNyZs9VXOjEluCPX/URpDeGAAgSAMQpsBhrBV+Ksz8xtF//A7h+b2mRWQhkIHg44Kztc9IKc1p+216yDcdNyM94C6dRUunw5iKAyPAHP/jIVPQRMOI9m4+rEK0XfLMQpAU8j4KLczZG5ysVa852LdLhzPIdruvVVxQydisx3bjZUwitymMyB/3gLSIGxKoy20JlFqJcfiJLhsr/dQD5T+V8X/+FN9f5ETLDWRI8Xp0cndcwlr3Uac3VYb8KaOdEvL+UTT4lfSBoNDaQtfUvMDt2Gt901JC+1Y7YuZmZf59RNKpTL/Qa42SFaNpes96InyWTkHhfmPAvTzjJIzbMk//eq8WcRHCiwglJHdjOG5K3rAUV3U9VZlpHXFXOiz7iH+rgCjMRBmSUMchP3x/awJDN4YO0h7KnGRb8cXBlmvRHhK52aW/fVFmZv7snPiLxaqGXGst1mV5adLdnh5T3JzInqCEksDTjuv9d2Z2V4x2Ot3cHX8oc1rLUzPB2+8RuU5uGEoyJ+iU0jf0lkiSN3ZYJ6nurPy1k8sWpHxzMdns7Wb6vArbxXw/eDOSwa/TmR30CUdIKZFNwwLKsUX1P2cXZkMwlDXGXXwWZlhMngpP9/CZcXpr97pmck7io2Q4shJdLid08e1GSAhPrEN4Ze7ExJirJHBnBw8odFTJ/pLI9Wq0OePEtd8c+G4OZpkXVtLSIMa/aMRtEgr+lZaie1pwcwGuzBgMicziaNOih/5ZHgF8wTE4dN7eGh5hPMDnZB+IxD/BHLFtwZzndI15o5HtQA9ME9j/v8+1CJCaFxNw9pMS/yWoh1mPRl812ZX/bc6MaPGGsvDx2XKYxbrvVqz7sTXL2Y9tBVElMINcXMMCq3PaJWL0IXqTn978LcA1F3moO6ADGKEVpv6x1AGDqJOwNW0DPonR2RdurhsOr1P2cojPvWnqL/6F5OURLNQMjDYlOMM5osxbAn6eQKoWHAuht9Wwqxffj+6PT+oVryhiuDqlV3/H3kxsq2NeWcTHWvLHl1FU4Jrx0WNxHFoXDuI8N2C1vdRgYsh6EMFNb5objV8lt4hQjtR5Q+ut2WPNUedIV6Je8+H+tSFmU/O391AH22yHYVZLtKhBpSzFSX+Ynxiqvndb70x2e98U35MqqGv6aZNx7rYnx4vmnlN30cU7SprtjHcOSYvo4wBwiEWulK6peOPb/1daZ7Shcsn14gKp/OkLWVSmL4H9owDIUa5T+wz77HuRD6+zzeOurN7ft4jS7UdNxFvoB3h3cEbAJSLVzzIYtVkbQNNX5IcjVoobSQKdbwwy1tr/OURyFOqQUgg7g9ZnIRyS7Bx5sIQdpxiVogJo21FZjWh1Bs8buoJrrXhLfHw1sBH+qmhegt9yvAiL/ROFFKwInxt7LvVMA+regZvNdAqbHDoPzJ3A0myrHyg/4GEPcvIaxOut1MehvASUzp4jnSN6PEVldP1n7if2gVnp/C1zvekYjkxktDCWr2MRFkKn94ncPGjV9d4Pxt+1RBP+xNO4ILhLFaepM/z6Groe7QM/hSXOy4z+2hR/HTjLWEXz5We458KzAFSDEwxnIuKSFZlcC/JiWmtOxu0eVAT2Ei6KbGhin9BcjVtLnW9D6g9mmGX3/gNPBMFvwot5YoXIlPC786h6l1BrM4lNTsgOsNBdWM7i+AeYGI55BgNcP4ItXCGQdcs8r/KF2TE+6S+9pBaxY0dmzJU4yyr8McR6av+8Oj9U3NNKhZ7bpAe1vehPqJoL52l3KPiz4GH8B+o/27f72S+j1dDlyzsMP3nk8TqRz7NKl0LzNdaWbFARo4GWP0cIVo0lPBW1uWICNVdyhcTx7gSffKq+fGev4Z0wd+P8nrZ1rTpQnWD1OmnNRQK++QZ06RWRYP7cnJZgqMYGXa0nNmgAN8UNqX8/Bybg3zy1cvJqcQWdEFHL2Le2mIaN7jyqHe8wb40ck5P9oV8dHGQDHT1Vt8k+t/4ayMuQkzYJtaVSoAWYmAhkKvATjmUukn4u1B7xYKonqVmK6fx1d8/euWxpHKzKYXHtUzeb89UVWE2NyXrl5Dtmr5hOnaXOLdNFnZsgvK2za/Vos167ex9JbpMAEASWMYlmfLzeLy1sPg4BveefMqeIdpdGfBlzlToR7Bs9nDuSNi9za4ML2RXDWReumkV1Y7YrCIa+FtvBV0WeEhLtPHFdG98BeWKd24QM8XswtHipv3/FLmtStrqtjxnnU92P8tM8I5DQ5vlO8kFMw5EMFI2e7oFjTu6ltP0xXkAS1a+/qqeyhcZz40IxPFUukTO+MJtBavwtLCyKMkdxXxCJgxdwZXNI2XAK1TDwS5wH7k+ajtMAqpI3b+kxkFDtepN8SKoGQU0WCW+mhTeV+kDS8XymY/jH4vQGrJkVLFlSgoZVo45Evq7sDbmgFZj/H5yYLD78+s6sNVtyddwWbOTwbMNAjF8Ak8lGvCfA0Fu2t5HpZkKkgW6fJRCDu982BA7aoVt1AyOrkjuSOzzt1gTXiBejGzUJbxxJAoByzZMQpts0fjckCW/zTZhU/AMbK32vHSrCEsEs91CB1y6MweI0CISTvF2CYkVfYzXG43tM99QxcJAn4OHT24FWCxNPiGzgCzMQGAOUU7xSLQjD4bmj6el7XsR5ugmpWANVNVegX35RmtH5vw7WEH9279dScZJrtaOOEWl7fadyOpx3eejuz4auy8Gr+U3Jc6lWmyEdBVWEUdB+nW4P/EsIrO51RKeJWD11Co0akaN6KejJFjZ9JLtEbTCVxebMHesHNhrqtjdXiosb2Y/jwxpejzxl8Ib+/IjOm1NEMRNLO6KLwDp7F5aww5do9rDMe/F56xfdz0tDmp4Mzw4tcZIDfX5Y2XQbtnsDjX7vY/vhp7Tgm2sFO+mY2Lx6SH//OKnzYaGRBx0dtJl2RpL8RA7xQly2/Mgrr59upQusDDsZBh1JjKRD5ZCN+xfovKuNKPTF1wgLjMWccAj6b82K5TDeKLXkz7uGqy4A6N0qA6NzNjzMvbOgNfxdb1g/tSfWW4gQ3Hjo1KH4jT3ACbjZO3qLICcYMFdvzE0N3k/LFOLXnQL0XLSughPhKAXmGb5GuRquUk+apGs+wjycopgNhdZ6hk9FDR0XdnBKsLzcwi2L69gxwmSyxRacP6DQXKYxQpjWkzbGTw8dQoMiLiVWj108rJ8rNuuw+JAFLit4KPVOPS0oamJ9EUjeuVa/bJihT3mm/4mgmUv6qfMPG8+OfsdoRy6ewVEi+kQWT3Uk98/Qg6EiGKbtHKjPdaHOAsYdWCK95a58uKGwar6m+grTTMjxSZFrA1p9VqfQ6KDWVuHV1CXGf+20Fa/CHHwxChz9AsU9q6kfnVFUrHBP4giLNudvI1MSezWCcnmqO1P8dGQWIa84u3Dmq+xSkkphkrD54jgCsLtJa2A69CUT7AshiqjP6QfOnoT55wexrJ1uXJ5kq5iesVe3be7xiYzQAmPvdgRfREFbhDNhiD50w/SuSmrfJs/7ROkig6f3UAGr5VmzATSCYErTBSaRBFrrQehZmPxRqyPjjKbaqTfZWDGcHe22i2BNY6rdbVnDpn6ByfoEdI83ybvSwKZDrd2qi2/mU/P9Jw220gpSTBbctuPAFL8V+Pfg6O05LZdSTDbJG44E2wxLBC48RPxFKLliDI3AwP7LUsRlDsWpnkCIIlY+GfcT+cFcslSBpX7YUXIzUrRVAWkaADxaLwzmECI+T0ko5mMHH5yxIn6Lz45oOSjphzzKLdgIspK1anfc/L8eqeko2lsWAURdxQetmbevinbzo81JdWeNFOJ7P1vw6WAEnLRNoVbyg5r4shnWvjuqAgsq2fDas2BbOtzk94b5x/iyu04T0fkZGrvUT8AmXPkRJ4LEMfClDv7bzh6pVvDsJn15lZyE2/7uLDPuS6oIJ+8BQJ+ZRJ4vBGQIc1HFPSMrV2JZNhirL6uYJ1D/gvundACjG8s6WlGELeKRr0R0v8c2QgJSksEv7sjO1IOIPwvrqa8CbXb+Tf+0lWCE6JKHjCoC+JQHQIjMy75C1Q2PqvKjM7cwX7ZYGPiNF5rdKO2DWQB1pSJ+vwostxFLYEQ2Ath56p5B/IP9jzaYSMBItiRXM+RcL8xOxj5qqaECrx1h4NJ3L3wYfm45KMwxihMllgpah6Mn6UNw1OhFS4kV+XDwHTmAJjaeua3ZoaXl7UZRR8XuIHefnfvpMv2SVEZN3K7JdyuNbiaz1Gm/D6nIwy7E5Bs8MQG3drbMxNqt0B0UkS+VVmQcCgrnzMY3aVZJ4fLFTdbl97W2pLYffvGnCA9WmSMV8eL1g+UshslWebDoTXK4slOnHXcFoPE44cuMD406nzW/zLavkRIY0NGsuvHdY2USUONWGMWhJKhSe32Az6SOpSf150nnvLaeNX+nWV/q3o8yTO++cioMXEYSJ5JMd8CYCLdVO3DepEaUUVhiF2EKFHLzhhJGWoE7wn/nlWYKjv9yDEIifr1GgXOBj+e7owfYEUwcIdKzDQ0bX5MzXDAsCFPT6trk+AyOL377X+UpofJg9Pf4CwZGcsqnCZ6d6AFGPweC1invBpC6L1s+5n5vRc7cETRT2BPj0E7GbX6g6iC2bTNFMjqo3s9e0t4DxcpNEPVaf1QCX79id+YGrxWS3rAx192G0h9Q+jVmInT/xxFeJDeUfWIxO96Fs1kGXQwOpQoXv5TnfVw416oqs7BVQmdXEoB+3mv5lwWlue2bJKHezZzyXPXtQWbQ/nfWtCr9nEOSwRStth2aLV3PaUCM26gdG6x8mmunNvTYel2ZE4s9uPf5INNcDJuIelGQNL05BJZLnYGb/5hcOptqsqwc2fjDaGeJXgeJNPx5kRemGvM7Kfy2Oj06ZVLnmSQ39XBmke/i3zojhS9/xvUH8zTYPlCf3OP9dfs2RklIDR1UV9F3NjRk6LXjPHmvDsowDSa5pq9NJTSQejpg5U9pyHA4fYkRzeb+/eFASIzMVfG2Cybd2XXDD0Aox+rTlEjjoDtvAsiFgR7U8ky479JmDExi+QI/ZgNNJgAoxRTBG5StSmKwldngD3dQIaHzLwDe/IUve2WJQf336y4NAPG2vqMC9FsUcPmzzdlFCevrNg4/ndXA4Paxcc8Kv2CSM17LmHGqHAtEQdnoJc4kmw0FZrJd14EwoowAMlAG9abjgzaWLwQ+NCMbxAg9KhfGAB2lIZ4bgCUO8O0cD+V/MBRILSglhCTJkOJWCJTxmzMwSQfarshMpQN9271Gqsa8hjqU3TPwUPlppXIWyR5lhGyPq0lAyMchzU7ub98822LpaVM23JDZA/+wXHa108LheYwSOjTNqodjt66/IixGfo82N0wctfyLPe8cqgJJhQAvKREm6kHUP0HkF17GSiOI6m9bIUXe0BectW03o1U9W5uaCl0afpDhHD2hOgDN0a1WPc/vw0ElLGBr0vM9bwrM4sxpG3TH0ILk/KD3eKi+7rNZ7jwskNZ29jmefwMwYppoFEekuVfhuI/nl+Ok7+xI/Pc6mIkeovUmA3yUki/cC+4+M1u82ZfVMdOchBCgk+xxZdfl8pJmiuBIhAm1Ta8Lhw23dsbKUHvIiRBe0AAFo5/xxrhAME/bSHMRCkLT6a9IjkgGkFQqrx4wJ/rwHIii4osyQw+QGZy+ujHt7rhzZ9o68MNJ1R/ZDs0Pm8RoB4fcf9k3xHdA3ykR/3nfJGNVw8ifbiOA3HSgnnI6qBJRVHQbxQZO/hFn3O+LGncym4txAAtgCFT3aWt9sODhmYeAw0NkDU8rDGQN9Urp5NUcp6NI71YixTvFUHZBfMXuXlKEF+yfTNy80J9tOPMUH85NvSOcDK/BVIfHhdAILd3MEPDPxlrgsGeMBxSd5Z8ySaNXO58Kcyumtqh2xTvzZy7WPFRaVVERzgpmjalD2m/f31rNsmn+EleOflkrw8s4hGVJkZbPWv5EfOWkFfOubvLTgNLADIFPKJH1P93ICLCK2+5pT+lOnlWLsr3uw71XnwaBjs9fiS85mjoK8bX/C+dGV1v6IfD1zV2D3PLIrG/VQeroBdW3V+N4SraH9SUeL1mNnUiZ5iKHCH48qvbPZJioGfuZAmcLhXipvmXcW25bVaPRhh/m/V0uEtUIlSA6st3TLtc/YZyPs/jmeQUhk/bIDcOpSmgu0/eWzdo40bHLhGzLbpTQthQGIMoNZmX7hPOHMbYg2/Fb3S1K/FrDcOX25SzS3A5not+6aFY0a/FILfbC7Wu12vjpCbKxaW5aSVVhhPDfyGNuq+yMBdxkgFf1c8s0FQRp6eL4s5nKdOM4h6xS/ApLx1JlfWcnlpG9/F8auPMYMgno78P7N19UfitWh4xNkw3Hp+hYa2erQCMlpiyUMcMZ3s3+7UfndAPJH5meeUdAwQJv7gwjJ4QHO3TroRZmVp8QcnKR0q+4daTZ05C2R20sU5n6If3orzTYN2b9WvzcSwGnwzLSdbc0zNMf3BgS7ILYnvzkiv9l6+2QRURg0QbQgmLr1KjrQHS9D4C/j4g5rDRO+4bxrDNJ6+QiDncD8ofMKA4DHMxO8lFkDPg8PnMG8AXAjYn2/zYDTeyB6KMo1bO0b97NFZA5BF9cHh8eDKrIkr2f6iESffzWX/eZV4YhkwJpWLOE18mPG6BkhZc9/2WxKbzVFDZ7fYWXNgPCzBFvGI78SN3bJ5AT4ekyKhY3/zt9jCkwV7jOLgCWu2b1cftu1ZAMDfoitEkNWj7QrZ7aP9bChEk0hOg5c6IjoXzRI5OQK/XQdor18ULQU4xbNn+4T7KqjvWHtTAZO7/jjQL0QfqbKvGIAC5blLYwk8Ego5OduG4kdoYnrIM5K6NgHoF4OPW+D1ATAOh4rxkqHzlf/DAqGR/VpGejvXReTu9J6s7+X6SpYYTrMeaG8G7YSqhjc96B5eUt/yE9R9drna1mJ1+O4RS7Ffc7H0Y0kX+WKNTmOQ9O3MM4apBkXrkUHDGqqts5e963YSvWE+J5lAk4EwjdZTdXZp0HTkqB1EfDoIRSF6YOsN67WNeZGHlE2vzjP1TpcbuHTFOx8nMp4syxOSsAiM739wgAQ4UOBgdSx5Zvni1g88RJW6K/Z8ttKEDKcHmjzbRFJQf3ieXlFbrhWDYzIygYdVsFirdvQK17og/WlxoqjWpkPM9OQd32rCkEsHzx20Fvb+Dc7d+QynFFP0ikAqN/97T+wyfaDGzuOse829r1WgUZ/Q35dgoFw2JeYDxd/fi8LmC4vhWyvHIoLXkv+kyT5VFMV6CzCIhpqXB7sh4O3RC3yeuTQMkWEeALtYbzqpFVr6H0z+stDbIYf5UVlu6JnslF+Mm0PAYa6BLXXnq+A+gh1g3oYbidFLjCQAw3U6y3XJFVGu13kbEiJ/m1QU7/HXwtTmLNtm/EMvOhhp/3vmp65lcitzEF8vV70J1bXiA9OxzIT+SzqpLRkYpSK9WTuxRCnXQ+3ACVfLBjMTFMMxBMr3LG5M4v1ewyzGQAuEM2+JSrkyJs28upGxFD6svsyIRgticmFMtyAbz9dn/LLvWfnIyBI1DaLTHthqwOrfxrM4+9TQBWHOecYlsbfsbTjnC+8oGuj7T4nikHmjFuqJREGIkYqqxM+cH/8fcWaVNj16DxrSuFsHClbfwA9dwXEUnd7k7LJznL32eckoKFtttMuifuUbDnbJpuemvthe5pJk3g+zrsnuXrPHUK7a+AsomYLyZGeDgB+FFAxzxMCI9ld13RLNtpaI3D8fC/708nVACp+dc37V0J2b7cSV02vS6KCQbHicpAIOl/jf+IDWeT8cHdjDpH+h90+8xJI7VRULgB2HetDSGkzkS3+tJTC0CXFvy7Kcp+9WpWGIRaEojAHfGTrDDenK4jl895M5/ONdXdsoMv4RXdoouYdhsi6XZnUOHldJLimNODGBGkVn6gTxVrtI4fhwE+ywHn5mVmI8GzJJ2oW9zmPkZtdOYuZsHdw60gNz047gXT2MuHSgFPHMsFPUanLya/iKRuU4JoaTIflKOz0aaa6w4bSgmpTZvBFZh53GPSP3q2d9vGAG4LRqk7unTDdDgPJ0AhX5QfzrHH+O/c1X0FUvpYQhvt8kJ/SU20rUGLees+0KUTIz7ISWDzDzrK2JK1iI6yafuEi9nwCU7imvSAiOp6VqHbENL+5NLSaGpqBaQ6K56s122J6t/it+AdN/hKT7cjI4IFTFXf/Uh9Y5SFU5Fkuf4yvSlqeOvgWa9zluF2h/oAkoc70cFlyKKDkaAzmxxQ7e3Rbc8CyO8ds0N+V1jpWuKDkAlz5yAdD7Br1w4Ry55llQ4xnGtM/AMaqxm2C3q1NGVxnd2hvTslh3Xr8K+gHJVMPnkuBDOZJgycO+KVoWvHps5G8eC+/KGCOt3yG4+JmNp5F8a9ryQLuuzGJYfhrYBqnzBiPduiIRLqKUyNhJGpQ+Iw+OjsVOOSjvziiHxvop3NgrXIJfSu2ToFynV1fYADb84R0XOkwPXvl6M8ED8y2IWV3o178yxJ7jYNTmOueERDv0itv1Tp8rMf9oZRK6uUCyQeG+xxRS6zidD1QQk+f5hFdcvV33MDpJUwpSa0yJE9ozTFEZt6toEByTYcolPfaJaaUJ1fq7traZEUR+JCHJVkZ8i444FD1n1QZl2v7pasE09cwMl3vzT5vS0pY1br1wFtTurmXthcebaLFX1iMBRE/1PiqgIehv84HCndHtiLkyFfhq+qSOGut8L0BL0DSk7UlIaQd5q4a9/oJwgJ8FiiTWM44EPok/mRSs1ubs6FBd+RX+Nsf6Q8vnoiFdTV6KAn+x3G3DDn3W/kVMxb92Q8uy8DLXGHlOytUvl2m/mLAOu9su8/SYbWZHkuCocC3L3ErWlg9NS8s70GUKwSaNJKqtJrv8gVjhLASzB7wsr1TNL14wd3yvhdQrYFEa2y+whcAzhiHMi2KyF6K0c4GGD1EUuRw99dCT2zObBiDcIfgXq7LdloZ2dnKMFRNn3nzrIvZXtwKwst99kwU0KXkQWupi67cLwxq94KqiwlOEFKoStyrBWVh2E72Dx3f1GcqHP81A0WzKr2/24+/cWxyuKDbZ5QVP8WRENt5GYWNN5GefM8thl1ctIGp/jPf95z+y9YM1bvNRR+21TIbHH4cbnwZtLFEiplhgjwyaH+V5L3iO5LZxRW21G/lk/a/dDy5LT/U4DdIIELptq7EiBAgpusirTY1Gb52pAG+PHnqcprPVheW7eGJc8tbbg0X49bAF371EXQNbqzkZdw/IMVrw7igD35FJB/m+POhjs29xx0/EujzPGzu6IsI2gCkDwltbGq9o+Yq5Gv7qRpR8Zvm2ZTyBrqX35F+aORsZq/obtShNW6H/6hUMYdlLyfHv+bxDJWS33EO+VZuejqP9kgHpJNucKa/kkLdP2ISzZUDwucK0u2v+MywnvAL8geiNQ4XOKgZj0Ak8V939ssnUISu1NTbfABphBx8y1VAo+/WVRb0sbqw/VtxcffgO30czKuAw/Nj4I5+OEFKj6elHKWSUhRM3+L+5YcDyWZJqHyydM84V8zpxo20cy26o1blES3XmcqacJ67wX+P8KjnMMcfRaN6x8dkg/XtiOKE+/u7ecv06ELgmk0ogNKQzHBPzmt2DUZBv4FNpHU0klCMAqsmoknDAjMpbysr9cLuk44/JhCg92NHLou6tZkrxkVfE5+SK64gMzQxyCiwQdvtXViPG7MzX03irKOyfG2UHDaSvgA3nBC0+x5KvT5C4c+2V4iCe2P63swONMA/Fz847bBMRnsUe07egCf9G9g29S6KcIg85y0k2JTHDn8fJpPdV3O8CtvDzQPj7vmbfWN5JysgHPBUIzRiteMj+N3Ao37oa+pogtZ1FuAv5CHudjMDJlOYp2Q9+7uPUqcusXk9B8rtxrARS4OElRZtB0C/oPJvQ+rHuB2U6Hb4oLtV40aGPKFPI23821owiyRbdzgKOgCgrkgh4rKkEvidbmzBnQdpyUzyMJbRetZpxAJ8hMWYcH8rABVIb6HeVI+N4fxIdD4pJthmoyjRSNZxK3rBP/hkq41osgF4HEVQste7r3EdsMvDeOaq7pQMs6JMPAUmTPe6+HK6C4fDYJS+bffdTyCPhYv7J4AEB+Pb0/8NxcofzpTtPrTxVm15wL+DtvWZXt+CDG0E3pxAsYRqKGpa23d03r6K3Kay/8dIGpsVhJ/ZDdzgilg70t2GJuCqWp431tlUC4YlykiyQav2VSfug3vdJTGqSBt6i2LLma2X/iBjEWARZ9SZUSwLwP2HZS5AR17exTHiUVj60BhGX05Y/omeuuIEkwfqeMJSnFWwdLzMl9F0YDgRTiPreVj/g1hHhuzFlP1biFVRXkvP+Y+Rdm1gDlDngXthcILOW9eesFmTAKUXEkM904P416VHANcxNZM+YGzcmbuSclR3VsI0/BoZSi3MqEQAfAQZ23DVJXZHTmhMO0DTseJVZUdu1zCEIu087Az9qfAN+ZJrvSoXzE5VaSs2H8Vgbno5QkyKQdJHsB0UCARvFHo4qyfuZtJ3nYyrHFvW2jO6Cdbrwik03etf9tyOn5tTq4zqburhymrY6tpua5Nlumakvc6UKAv3mvLeFm2lptVog0dl7sxEzCGFPY7ZtWY8KOBnVLTRgd+t3VcPVjI2ZrApKh9pWd58KvWoWwIgQ7eQWQJHCH7p423PPEKXrgm4x258r7r//CP4VlgRboJw5Vzh4aFc1VGCVINMM+mOW3vzg33A76GwtSgNGgmYw4D283FbmoH2zqEbBGttRTAQx6xrEfcOSqbmJdoEvZ3HtqhK0ruejq5hQIUY4INMrh36tltYajHWFXQWDG9Qfgn0rbfwTwMh9RuNMolpWP3UwgxOmh2tfwim5gFAg7owzxK25OqLSciyy0mozOsgCSi19Ea+STVpU9CR5PuXbrdibyBPW4BOg86K5bOpkhjQSNhzpmEJP6ZWiW9LipsXO76oRUhKXZn0HsjdMTBBxIoMRweDzlM3XYWzNyVc2rJnul/KlPtgCnlbNmu919YEwm/ojCrEDyvQ5kN1bSPvtOulVPuQE+8wSR/MS71QeDRpSApGZX4R0GISzhOrUHm6M60COYovK6yfqRP4QY5YcdWS34Hfh5hI4hRaSVn9JO/4Gw+4darfIAeRY8ToqG321Gwc1neKvft5VyV4qA9bcowsqciBqgfPk7uQegOv0XWBaLiGDbJE+3LHeKltTOw9E9NlcqUGCf4VIdzadNPy7CTTSboAPpz0NpARl9Yw6MEBSijeHbd05nC2ou/CvEh5ePKO4Tao5RyHsYcFWYDvYX8LvM0gCWMz7+bETxJtdqvsg+vCJk7bOYkgpM4f2QQzGyWqa65usEOMdq7ylZo1jC5r5f9xSlRNOv6Axvk3/CgIvD2PXgRKFhG6NrIz1sKB+kUw8hjNk6/XQzuOTrCDoAlHt++s+ilOCH0XHY9RvGI5ChmOj7dvguN0hKFLkSJPHAy3syDPfnYD9BCyEbkmuc4ZF/Rc9KAuNOPEGkd9ZbcRoWZ5Rl5xgFdWpFHgq5FEHyhGspQVBtpBZaoZ2lsL2mVqVCobOTwbbiM0PCT2KAlZDQWPOEKy6AaHEkrdC+e0ZCvQkVYAzFgDl95K9Dfif06G1c7aOw6z6bPFVBw1WDcQVPknklVD/bbPCA64F2v3HUe78XpiVCBILxLJTKzyqhMVueA/A+9LJVzCYeqQip9nYOle+T4PC60x6Vor4FOGtiw8ToOanh6fqaXglWu7BeYi7LMhqAYaj30/kvh7a44NClr27bPRAuppVY2FpHe2e03FRWkngbpoIRXQBYFRj6vubm06MRauBRIS4P7P+GFseLEBEmWJ4ct6qNSdF3wvBEam9WiRvh/FuJBaBY2zaT1l6ZbbAU5+mujQ/iUg5uUtNiHBUFS/YZBMsDpze8Hdf1IleVOErEDRdtdQtNotggfprwOmV6/jPexZHWMgcrQ7iKbnxliIoiHavf/e03cgOd94UfT4KJQ61qAW2+aYsi/kLHrLuTd7k+t/im65z2iyI6v8de1ZGXGEvM6wQmqSZ/KLKoN4gw77bxTsZmE//Vo2e3Ogd1/bUoP4Zqn3M9vBXInAK0nVvbnzDXWXEcmy7qyYrUo+kjKjQ4Q7y61kT2/RPnbn2Bhxsvtz75bh6fQtxGQ8Bh3suXYzBgbzd5AF+hVb4KbD1GA6YLnLonLf+apCJQs0svMotzfCyIfqcJGpIZlOJT013d4Q04p0k/rdcpOVp51viSso76wuDts9BI6BNrfoqNIg0LiH3MTsZ/DxfUSs2gfjG0/4AWW/84QkQkkFb77ZLZrH6+QC88Q220c8/amyvCKHOrOa5N9be2U7iIlHxlA/6fWlXaHFWcWRa7FuMydLbW/NQcnk+QJRnEZJ1kfzDukJHefR8fBJdA1yM50whb7n8s+UnPQHZLKTuMrEPYxEmdUK+UqmPwt5R1OqPgM/v+JyKa0b2afb7j0zyeEqDS6zBrD/fGXMaL5UPT5ApMbxN3wUb2Oq3HQwX5Tk0MaQglb5AOyHbqAGWhRXWOyMcHSfTFUy/TuEG7HZcdf/XVnpmJRrZL1YuG4lKOAmbgAEjhLJXAONjR6DlkmMDE/4ix0BOzzGcBdWhx5wRyKGjwKgufbUxYT9omafw0xKMnI7DtfNg9ph+TwIHIUoU9XN+5wgLvzKe4NrK+HVeAIWi75Qqg1JXAT/+Mu90WJqnLjzwDqsjGEepVJ4Xf8tmIxg/uuKnYXUlrNM1drgz5YBkZ7nNxwcZsuSpu5GDI9k001JZhfNJjr6W9eeAr9I2t0+ZJsVPUzuvGI8WlRTW+ih5CCbyt1zMX1JlYZFMJgSr4bvjRLnqj7KazVyas+nIqdBjaoAv9Vb2I2gLRs3+goJELLNdjA6IswBJD3xQAExM4mjE1eB5aM77hyvIcQVVxzOb6HiUAYxFLn8HRqSzvRmGvmtPOQEjkNUl2S9+XEVZdiv6qFJPYP+ZGT3VOisRoUrpS1+YeyLJOTPL2LWO/lE+Bynmd5rFStu/srisXtdRUB4yyxWAtBG4rvwl4057c5iKofvMKlhW9pgjzEqm3mp8VwszY7Zt16i+qhQ78KoDytpeXCTbAFTwGP2sh/tZelJKeVyGmIRW6XBGRvbiHFKmR522GhU1NxGBOfhYISVEaPpRjfnDt2R4h0IfGr1o6JSjiJkL0wQGlHi6g3BhCKYEwsuWlaoI4RMZvON1NKA+pBHo+HOgyOwl05hLJ0/WRcCNlm5fC2SURIrBhrv2SciDF1LlrGjZlpblKgs+TArITcNx8aHhrdTphVr9/0ptOjGemUT5oa2QHvqAZilSNjl6bcOQurkR+sqHbDMgliYbdBwGspOjpp26y8ANULf9S2ARWGHNVK8MKoI+TYIcCEqe6D8nNZNWPyv0NHRvliVpO6AVqUabNGb17JfJBLfJFEJDr/df8EUWZWprmYYnodvPuH4va3l3oZcEKqvaoR2Jd3iMq5v0BW6hZDOeN+rcQ5YW9O1hVWndZwRYX4HEs/p1dM9/XSx3Ba9J9HHSgJHU7qtJbGtLcwoCpAORF8RUAyEe8S7jQ46cUXTnxlJ6oUYY7lyhvHFv+JJq4x+F9aQ9Oi2hGfcLq0AnuMwscFeakWL3wzahz8tzxDqPO8MbNP9ezxo4xKAMftePCeW6Fvjtdym0Mrq8JVPCU1vLM9kXdkRoj5LiZQmx0DeGUIvgrUw3rTELpDQ4o+3y87fCA3nlvCmPgN7B3TCp2q/tcr/Szcetgg3Vza52ZbuoQAxCH9vBwuB23QrNKu5fqpHllKcimI0xCmPiu9zkJ0ViA3IRgQmWAv/e2H24hYpY53kj5LofmjtxEKgmnShimiYuycb2BeJVzZtJL5Cq0Te6P5XO+bLYMDyVgPgiiyBI/MsNJe8JBTJ7pL660GqS8V/q34nmc+Mvj2UxGEM/lZ0v9AzkTRnIUIZxSHeit7XiVT82/LDDZYNkftLaxlEIllPmwX4uDcfrsCZiOxL+qiq3XBrvam+YVZ6Pwhy2+wy7jzJk1mVR+cuIb5VWAelweEFIpktdXAp9Rp9GJLutt7h4xTanzD4u44Ft7Z7jHKqf8K2QbEbjyv4pipfeyq7sK7NVeojDiyHaHjZ7Eic2oDtbgjjD8ke/3SodZp5Bknvx8JUBxigfHXc65axpRJeJprrALtMwZ3YylJRBIZcmCpghBxFzRK9NQnz2EdUQn7RyDS2PZRwNR/W5Xzjt96W/gnq9RG4zS0dzXY3mzKhP+vK29iX7FaCIHNUsZryFq6Cesrk2m8GUD7EYWWWnRgZhw8vS/0ZN/1wOW5Rg+Jry6HdfJkfZQQQH7WPcqlUvXIKMaNa2JRfyKsTtTKapYXBPWJ+ypmdBZKWBPk9xxoNBILso28uVPCCpTUhjFY6BO3BAyY/X1v3vD4XF3mjferedsSjTt7N0mBEfJsiSiCglwOmSmcZDOpsqBksh9kILtKkH5FsLbz14IpYAr0acBaW7aRX7F04alF1PUk18q5CI3YwbVHKKGd/aGCXMJuoWlt8fWYY+UST8q5jAIRfxt/PbR7LxPzBDqaCjvraQWwz/KFNcJGNjYNRkHf+Y9B40lN4O3pJa5FrQsSGULELID4i++bRNVsfnYNeCU0puEFn5recOigGj2jC2+sG4sospO5mpyis0ErMFZBr0HScInWldbRgkiKr8YdfECyijIQbe7ERxlgF7mX4/nsrg0S1kmso/X737RlOpQoVVyAC1dUQDNcXa5t5uPtUtb5R+uDi61YRhvcNreQ00throgaj/clKSvXAE1p1fyPwrptTx6mD8xi5L9ix3Mk0olmCY/CvSACeN08lsSKBoQJCRL6wycBdkzaaAtMwi5ccmiNrHivxh8GnMK4X8hgBQzJbiYTPsn8fGs/aZ68AXv4Kihb/E3OSxaHo5tin39k/r4JXcukIH5+dzgun4B0QXFt5tN7PUGEzGo3e2aNpMZXbQcWe1fjX5+FZKMsoCv1CXdphaO8DV5QAaQ0y50i6FlZoNFf4gVc6j1jPgNnxBICNbIz7jGQk2nhDagjnKvv7MoH5Hcsg6mvdbCJX1yj7Yyp1NEo2Ibb532BHhdAjrgLzloZMY8RpkF5Zip9wQ5Q+SSylZw+ZLpV/XdNtt4TqJNaj4JBVDYVqxHamSbaIt4F8jXux9hJA1pXmx4XHrK+RZO+xAGqsW7+Ic24hxch1d0YgJOlkiuJSBb+wB49VB6/y7JD+RHY/KBETRWMtkctOnJFn9cGTlRlm+fpFVOGlX1J+NDF4+482NdlwYh8v0n0KxNQtrmXfxsw5DTo++i6k9SdLYa2FKzGT+00s2S9nSs0pEf28m3763ESNTUpOqVG9z9krR0eSaw1SQj0H6d4mUZD4gH2kK/HPdFpoTPvmVwqbBMvjn7Ewd2aaxEO3xIxIPfKIkg+Wb/9ohZ5pkZe85+eSUp6cfyoHDLfbBnodF9howa2wMBNuhpnqU5hdUNzpAegoxr37rb2p7IVjsSuPYR+qPHbZCiQ6w68nVNfIIGj1EdH4QtDqNl5R843pzw7ljBe6kQQo0hol4LI25QeR+x15b7MIVhfDImKLpIDpId9Qp+Ov/1Fv6YnDr9DyPQH+w+feKUrwjX4iBpaOxq9WYIb6zyoMolJcgqT7JTzK91ROuNtcpBEtU0uBZl05SJ6AhTpcoVBo34gKjoobC73fLvoVfN6C2li2LdiWOHNodAMlu70lbVSJXz1nmuMZ3enRa+Rx0139vGq/ev8y+xJ3nN5N9v/Z7sC+1zC+7EJoRnlpkdfNjZ75mAP95CWSgfDssoQPgAbbPsz+ZYl9zkqf16IzhLoLdOgJcNxr6wPa2acget3NZQy2vTZwQBIicSw1W4sa9J3fun9QfsEe1reWgzvyeYaqavG30ulDWs3sf9Hxa+LQCRAbw+e0lQYitgH6gI0JEbQIU6NXQDGX/riZNR8powhLTDK3FNi+REgt6z4zP+TenUOeYzuMK2DISZ6Jv5LjXjN44ycUNCrW/ao4ToPtoS7TtAqnYLrk0TF+wOGIBBgXRAL+Qw/EZMTdqaI/lomd/5FO4Wwy5bgdDqOnjkK/KNJs4MbdzBILiLTGPnsGKFvPYC5szBMaQLgqcEXfKY3M3KzYCMOtreR5+6u/zrMmPcGEuij7SEuPdSkLvOaH76jMYilSBROAXum/fzEO+qQv2Kw2d52rvyodNykM8hruUNZKb+UkA8trZv2bQQuXkNaIWY30+G8Bc54JMwpwPU60ycrLn5OhAbqHuOdkZd6MOrU4NzWkZh+aS0lMvWpocIPg/bTIiSxtpyk1cmnT2EeNes1kGqU1MYulrFqDPF1dYFIPsqoYqI/lh/d1z+7u/CFyTl7VGFT/V1S//x/GxwEYAR1Q8un8fhJkJDNe7T0g+21er0NX8nVV70oBdS5me/rPlAYbo6tvMxDAb6G8uxkQfPDXUNsRMpDysnH7SNShzXii+RPIs+iPRNLPNM2JdUB0mnsdRZqGWTa/+cuqBkdSUcmxO8rpb3fEiu+GuCbas06g1k6AV9agIe0Yvg7OgHVpSXtIk7hqSb0pxMzJ/+5cp+iJfvyqIUUM956VQzroSou3/A8Jmay0PTTfb5JzsktaYkO4UfYPpauZiT/CZwL3YRaPgYv5tBllrMPhyuAjkFdGPomT66/aGt6PPCNR5cJnRqAxKPh9ETI6nTIEsj4CuEb0vPHdFi0nbvln8BKJbKp4WWB+BtdeX/WEjuzqMGG6IyXVv/kmMCBWulIo8/3C5lqEsIQ89J0LeWSRgiVM24kCCAyC7HgS0slP5rvLMWed9g9F9QiuhKnP3Fo2aLcqiEEpAEkIdd400MWFLCFgLuOOOLITpNXlXtS5Sv1jZA2zcGogDRiu9VI6gT7TeO+ZuncAQWhBR+mPlludUUicj4usOZXO0snzZpBLPRdBLWJ3WGp6EzhaKHCZ8NoeY8GR64GIdejeDHjWgAtGy7j+K7gu7AV1VucDuH1vOXwQlbg3f/17YGfP9DUieEZBcFGrsrSf6yZIgF6gJvSCdiEu5FWsQ98Mzc86g4lHfSEN0LnSF3dz3bCMeMs9Nni4wbd0HLkrxsFP0x/QjDohU0g8Z/gziHq5GBdi5bUj043xR83v8KP3gNcXFGvDpLwdqSd4Q0axR2ti788ptUk9MSK/EFGIzB+sDvgxT2+X4SaANlsilIPuI7fdTrqGwC+hY+BxjpJr5qH4jFWqEcKWGHYycqDDBGuyOy1+HXLTtitPmtTbm8LbdcM8O3QCsN9SqJniJo+eTpEPQQJuaPh2FMN3MAX7LIRrYWJ1VBGI4QX8JTfOAUclesG1XkrdEU0R2AciqFLsap1tzLCw3Bt/+Hp7zKCbFU3RSLp7A8wTho9hhAzxsms720DRBPYwkxtJ+jJgZAzqrN5p+DrqkQMFavdcQH6/WQnPQPyXZqpbjuPYnInxRxF4dPAf3hbtsUvmskG/LjaBENiHUNEjFYwGtYTDE/DSpmaUsG9smuE6Cf3NG0UQuEisS2iQW4Sth8vaVbpsBerXdWXc9sjF6iqDwqWujGoWLpgtTSOjCpyb+sN9xbpOOg2FL/hsKPOzITIX1lrNVqDOlGBfn9NZA8Xz6S/qIBl90gBnt2/8UTWsUCQ8kCpKElKs8mBhFM4pn7bm9AzgOFMxs2CKADWw6lcrh8pCzz4a6c99ruVDnpRaUbNrQP7k3b3Hea8S5vM7EAFcNV/qymZAHjfRqCcA+XTq5nNSRBBD6MquGgKwvONFnU79heckv4WnGGMwvnx48zWb4oVRw9T75Xkm4pAXDD5u5a4eejGZ14ZyYQxETUAB8REWkgGe9pWNScgQaqq4HM68XhER8Ed1D+zh1J5mV7WBs7Cz+PkRNJG5VLvhj/CUIiqwcQDf+V423kyA832hsHrh5sZToM5+15VLmbAOSEdkyW6080+wcyFn665mOTTOqbwFLIWUi5A8UX/6EObMw3SbA7j/BugX/Fl3BRtLp5tGKRkUgH1EqvkcHyPrjVDwVntc/161478NamsbgPtIe2wNtqpi0iYE+i79LWh27TQZXla69jKPQoTrvhVYOVxmyIzUUtxEJkTopLGHOz5am8KsBtnq98OXrUe9kPd1s3jogqV0jLK36P/w6Z0ZayV4gDGbqgTDk8BNevjBOtb+5sE3P9lG0qgrC3cupLhs14euBXrNhAvNt09BLggilxR+iv0LvliVCJ33gqJIzf6BPoXhoiKIa5Agjs9fW5n0IGuHrUDmLItrqGvfoTloNO4NfFGXAA65X73HcS3V1B7FatlsVQk4WswTmvzSicjzIzjq1arIlgy68LlRxlzcbFxWPAX0SjsgzGUlpLEvuYWCl5pUJXWaym1NZ+nRUng2T7bAdU97qhuj9jTl8VTFgpRpt5FXS4HyTYXt0fMdc4j2fG2gYBmqZddPCzufUoo1umer/L+/fugOPpxgKf2PpruKHnZN/cyWRAsHRSEi9Xt5ndHNDKhQftspLtVXOQp55pogXSlr2VfVO68cUev2KIhW1BaN7Bek4XmxE6H1nLeotPcbTP8Uxt3fqVt9/upVhmcR6bPoFjofwIodhn0I9BsQYboLDekHjGa4CWdjMBSkltdEVg2FgW8+BaRHvrNhDhQIoUzYC1aLa/Xq0yasMg9o8JQbERYYxAWuj15MCCVS63AjqkNP7PA0rf8JJshJSnX2zD72bQinD8yEI8CbUjqZl4rjiP9bulRZwaiS2g+g/+mZsTh7G/LtAINZLyVr9wQphpB2GOJufbhIXzH3IFFmv/VSfHM+kInQo/MYQLia3N1nibk1eixRqO805S6ZpuKybQBVDYRVyfx47hV0fbYqFNd+FtKjzMJRX0rLdpBpg94+pSi8lLsWBezkS2cx5Q233drr2aZ4ElTuVkw1tUkS3iMa1BOEDiS/mc+MCBnpw/DhW8QhuWyv/xh+PjMh77Xrm4matGBOI0qpDgHZesrNAAilO6RweZtzuMTvsjuCNfUoBgyiA1UvR1KcbIyX4U0Y7LnvlwXGzEn4tXb4yBGPUltd+q7yyHgXVUf0+2Zl3QdIR+V0PQEQ3gNEMmdzdgnZWNHiQy4DU6+VPs/vCgEhOKdF9CIIh/6rjc8QEu8O6KtRh9KxpOVCPAwiSjfa2tLlNYieJMM0Jh9mx0vrWoqfhXgIYp6zAVSTZYG3vb9XnAiPVdxZPQaD+umIJdCBjeuuC8MCJhNzYGCWx7aTnWiCRPYrT9K6Iea0oVeRr2fPBjaEvy1UBv1bW38wVBhmrwB6q95t160/m4dwpe595RrGdjhpIdOarxONhThGFR/YYt1jgWlYJ8viNq6bnKQtvjaruHX6Ld/SjeMSrxBVa/bCENWi8cWVCRdrjxtmJgWD6ma+8Gklh5jx3CKqN5JdNvjaTaMvpQL0Gmtap22l7byeHMmXxSTHhZEG3PKJcGeUw/vrnKFN42AY64dGHQiFPLhdaOSBjAoWbsJge7NJ0Aj3c8Npod5G9XLXPR1UUN8qTYU8kzqiMIqWrTjulpUmhirn5MDklvdJwUi2YX/hkFFs9FYXWiBJTN2i6NCHLw6ISDiUkPf+CW4O5Y2mBLxQZz0g4qA4LhhHRG+6GbjEW0SvnZhoSiQZWW1gW4GqcwGFr4OIT3PQjvBywUBFlscSXADox5P18mrOu8KYIWf3EcWw/eUfYFdM9EPNdfozhtHGc/u0dhqgsVBJg4iklq4nnODKZJGTWPC6np5ijwTt7ro0ms3tTcV7qE+dTXd+FRhUmyq4ROFCGIF1RerLc0+GKhYNZGqv2WXqybSwLrq+YMMey7mQc0QB5WbeurcBMhFXEBAn4zTOtGDi7wHl04MALe7cchdPcbSrsUg+vzf9B/DmJM29IpZ002vzdgs/wGm8FSI2KCD9r5hgS2CzJeXI5hfrQT3q2H093QLzhPGRrwZqswwsOf/1Q6Lz33By4nzHXajSBSzwRN/2aXDAwTKd7VVrzlPfbgk5tBkj2xM8Ul2lSU+9OVeFA5I61Xp13HKj+jxfZOYtDD2LdvzMk5udsYlx3ytZ9f3hbgBHFlCn79ZCZOsGWwOs/tD6TA5DX/2AWFWl926xqaertj35haj/P7Gj+sUCeCSAoxGktCQtGj0BZahjg5FeJ1b4IMFcIn15jgTSRHoNdflQvEVqUAyibPijcFPd75T1S8EWYsLY84Q0UGPMJN+QHBPNPkyyw/N9A6bTRuyUJU0psTJ8xQ/lSHILF+B5Sua/y20csOQ8mw8aMzz6G+nFKD0HTimnUCLOU0aV9bcpkOZfhaR7cn/fnnkU3eTvTnQ5q0299C9njHkG9s6rYfj6re4eBldYCWAJ+lXCfNbYlrC7OzxZV/5tmXHVlV2JnhQTthZu5WYWEypBc3/5JTeGcBsDR+ybIV5f5EEWE5WYzUZ6/GqSAqVJbNAEVXqE0JyKnyEBbQm5q7o24ebcxP1Y7OdTnreuTxL82x66E6/aJSifRzvCjhV7RJW+Qy1SCz48Ep5d+6xF2gTufHm9qmLB3WYYmAtwqfSgk2OuHaQdHTiV9uMybGokhs1x/m3T7qbgruCw/zC9XedyK7zeVPubuv+LhtYfZ/Xk7qtLE4XrfNpl9gOBFbCe4Ak5cRG25K78Vdk3Q2Y9FkUWGJ3t6NoeUyQ/K/HMaBAW30EIe6g9FfGIR4ZACdTLR5+fDtxbjs9T7eA6een1e7mWDmop446srs26YHx3dipbCoGns3E92h0+xyBmEL9mn+suhNkeMLbKK+Tn8x2fpl9W2/uMZPpvgIwYkzQrQKqTc8BsDokJV7HwDyLtYzgNjWJVOqZ4wT2100rc09JBYExXE7ESaLQzDi1/fzX5mJ+7IflwLZUzvYpboGUQOOOIGXHmb1E17hrhxvJ8QVeJB53vdYQzINgoXFAjPber1wl8S8YP46JhTYgfPMgM9nlBlzpdHD4dZKtUgzsz3aRmiFAtmhISJCJWf9amvRiZHasykeuyikNPWnFUrlPFy72+8XISL9KuUdLpDvMQjn46LaGvCTDRxQNDXFKomaPnwv6avbBajcGglSsV9v7gbYTCo1zl4AMSo2AsnEFYpQ27dyNiMmSJdZpPNm3dL9AbzU7eUOyzvq2bcjShk+57NNZvOC/pV2+gIefCCol6PTtnVLdz7aZ6bWpK4sit4Ae6DLvcoLcnp+Aj/g+3MF4qOEtSSUKvPxpHyPkHwbEnZPOIeyXvI9EB8wmkUDfc5wPa10VT2w30xKhCiT4GSpBDmFYull5rcQs6BfhwDIPsiLx+rgpW1aMBYzk8skIV+JvU47HCiKaVtc60sT3RdVylumRMe6FuvST86v4ygmKbPHaUGHqEcz+pqzhE1l3Av4jdevpHiWL7Q+FrQO1hhrZ+h5RzKIH0t/pdCB2/Oc99Z3O6FjRDD5rHtbn4BfoNdinSbmAUC7xdYYUVvpoRNVUThM09oR77PNQ3ELxAbYG7myIyRrhIz3skVg8kSiOBW31jnc1drw4ouIObGpiZr/2TYoj9HRrHDplyPimpMhD3jDJS41hb2oTtqfjZygxoqthCU3fN+RyF8WAkbyRF8KC2f5CxwYlChOXWZbPKfoK7efduRQy3H4qv9DMLCq9yOmlahPGQd40/jLjpuxTZ0UKBpuB+5zm3hbUZ/0ka5lslnGuAfAbV52ZMJiF15FTUzf8Mfi4i54JI9N9i3EfAKjTvih/coZBw3X/1P2PyR0GegekLge86cEZBVHuwqM42gDbc5jMmHhg5+1WGwLfpQz9bMQu40EUN4hR6JAqEF1r512NOJAhSSJIM3Rf9JjUwUMc+wZ9zotQkrR0Vf/nXzYK50ILejRcnhcRVxuk1EcKC3XSBLR7P61zjCTSV5VdUYXoVqLdg5G/u1JIujVRVHZQJ7Dif2MI4t+HpzWhlHzoprU/Hx0E2Ebof7kMTdbOkXS2NPu8BjipUqfNHDxnnos+54U0xxe8tP6sd5xcMIEQcTulYIWF9oDVXymHRF5QPYATHL/+iXr1hwxvST6t4BJk3rKGbtvjfqqCIx9VbYpVeRpxYFse58ztHvYZlwDgfLyve3jwYT8jKcMWbrm87mLb3QlnutirDf2JTCOrFIwgOUV+GxV+er0aBiDBT/AGl9ETNuVWEJSTM/MQfrM2Kvjld3p/dK5oyOmcIve1y+UW+10B7ysgZc0iFRdTKkoRwTeCjkNAJuaQ/0+K8Qia8rJ5SEadY/A0MGMXNr1kp8rs2LWetjJGkfdQVDu7SIlJR3dCIczsrWt2epbHQw6zpDbCQUSrsfiwe68dA5jvVxrWIZLcS0UZFr/XQgpgOSJP0RamWLOXWK8zRpkATdNonT8Rwmk1PnFhYBTAEDgP4Pm+AyClD4tRsGxArLkVTYz56VRXS2fZSXnx4L0pUvqCUus8i22AkAbE+MSdnQJDb2AYl3n4WdocJp3BWGQwHW3EH3GdSMXeGKOAFpUVIzInSXZMAUHKZBEnDvJfUGP+NzlsbzGeCFUteilhW6GK3T3zdxytqKEpVg9g1Xo9glUK4KSu+GN6QNafDKcnFMfLym1aQfKY6NRvpMg/GyTvov88sb3I6EcG77XUxZjehkUNqpP/xq5f9P6jpMuQq5/6QPebsdjt2WpzQuimaRsh5sFO+JHL3xwniRp5bAgeWFqwNVfFgdm+43HR8ZIGQtVJrMCOS6MW2PZcrXGDcEsx3ER7NJifFyFwKICwixvIAL0EfFlKkVlCkRUylbQoPF+AnNtBzdEeQGQaZ1dFi9vfRIjzyTI6qRHmc3uIBm/kBywz+JuJLSqJJp2nxX2ZLKVuknOPVcmLlRcDhRF/vQ0O+kgi+iD5t6E1pV7mBFulc2PJ2nAYJYYER5Yjy8qQeg3KVT21yepP59p7vM2cwdfSbbMuIiKLk73m19xwhA7Qj2bpnYra0ouSBPT2UyQvmbMtzMl2mA7TqmxfPljwzIzDszOxtDHu16utIs/94oWC4bXDsFymnE0a4dHytldRuVqY6FyLPzdlxnW0el5qghpbHCxM3du7rRmoCKyPNtjowWdvFS00tRrr1gqEhkeXu1rJhAdSkzSXHuB94lcGuZ59GLbZ5QJe4mVjlo8R05FmoTrhSDVuCv9cnjivFVo+AN1ZkCgTwnjCMyKgRsGIHNRQ6g2IE77vudo7Huq5u1Djf1lro4o92823x+d0LwMjkVg7UHgYuQQ/Efdyw1CgB8vOYdSDIsfvhCraPDkwv0llwVp/SlrCz6HnE5niE2pQCbYR7tOnV303SD4MJhi+vRvuXllkinVDt3RjRagCrGEaqN4pvQeN++4Cw3cr0+CUya0IHTAMM0mk/pILHjhgQmm2OGeuGbuVPJJdFlaC41CORraaS7AybAuXsfecz+XBj88NRCuNG0BkPW4qOY5LFP76v5qBcbPAuA0DXMbcozpZkGTt4daGlvSbb3zZoLkLh3lmHmNYi6pTykGzUc5elFI2WlJ0H0W5JfEKdx+vMvXcSwTcAX4buT2t3y9F/jC3CGrZj9s+1p2+hAmaE0jRL9w5eraES2BpSN5UXLIngu7gvZ/5ovqAocnJmNTZTYtL2ELfUPV/m1bCLL3Mtm0RX+CnXIP68TXbXfN4aziOzn9k/9orMIIopDWxuUwp/Xqa+HpHHhS5KmzP5Ck0LKGgUCQtmwCe8oiEAYWTyFTUuSM8kLRdGR1tZgeU2vY7bTXMLXP+cFfdKH5q91VH/F6/m80B9iApB0LIoAopUWdNNXR15x77o4jnN4Os1RT8Y/t52S9hOfU9IXpPkFnKBumj+p2HxbTq0OzZjJfjiVkERRF/Lhrv3loc2oY69KZOOPBPOxk8ygmZTlg679eN8BJTYlYHNuB/tmjM5qeB1CzqKmuqY5ws826pYndFz5aceMgXBzc6AAj/GnL+iH3rfLGiL4HgtKKYyJwL8nwl0pc96NOJsL8virtXFNAC94cawxXfAriYOlOa6KqzJFqaKBgA1kPCthaIVDjG1/K0awJjRhFD+eCFtQ7UJOMbw5/nRfvG9Ef+LDzRRGKnOQRgsxw104GD5Yt+DkkExHdaiqG4WevbKXMhkpjJTXqAS+UrivxnOudxZE3d02/9WE39/F2AvDgBfvWuOBpPfEQ7fBt0fUsevr4JeTh8pWDEYmg7SONGqEHPmYWzLTgXq0T9LcVIas6ErWQTodOVeVouYqm8Y3yZ3FSqgWbhw1A53ul4dAGiOgUjBQbsWNAc3yrZ5Tv1HIeIR/D5pjzwYFy+fP2VSx+9dPf13ieHQ6pLy+UGLVf+TQapDch+sC9reOUmYoMUhjQSuaDzpnWGfCdRVjgKTqH5cdmig7XzDQfPJ8zTioqNqYX9GIXrXJzhFz6/mmejRz/cpm+AjhwzaEDU69Z0Jgc4NZYgXkb321e9fl+UYuVyhNMbn3Iz0oQdK6Ml+gRtqXY7xeWn9f13iPhZoXpCjQcfZKT9qtM08MS0hwFUiPSComMZewyQ2UKHyfPJLTlVfSRj0NyNJWlHxX80UgPFoGkIlS4rVUIsQ/hrqdJU9FNfEZ+rJ9s7ldrbK6BdLMkeA+MhWrjuWbOgdPl+X3FWkc6Rc7FVxr4BF9SKe0xBEUXzXUTW7s1wMTJqpLug54xCF3UVzX3ZSnxeCy83NNvJ4O3DBHEoOKDARiB2lyxNsKb4Szpi6Epr68x+PN88W/9YpDGIHI9aJrv5VPtlrJuwhHGaRDTBxW3ms5xL/SV1+V57T3CQXcyXX865JbbJo0/XTNPzgEu4PwTHVDEw+9+rMGwl95QzFVFpa2gWVDdj8Jqdiqfs2ZE5HZo81eLaKNvWGm1Y5jYFUzfQeCUQPkyKLrsKaAEydPLUfW7btiPRZvcRJZcVewYm6CA+DTeZC2DPLCUtXQhE62DxVg9mvJahNWM+jdg2mo+XDvMXvfqI+2Tx5aKNiB5GAkBygTsZpkadQUj5Z77Aoi4deqQRaiJrheBaNSJHAqIr8LKtiJ9HRgPEbbO/YzJ8a2PPzwk8xxzSwSDLRoQwFM1DPoWq0uyzjdlXxNbT6G+1IELZe391qq9mnF7PxJvr+vmoclFKivgMz7u8Qin6HtXat0bDJqUcxeRrAM3obsnEDsr1+P/Hey19Cv7rYUqt+PHOF98Y1D0Yjhmsa1DPaXqSgJd3ABrmMfJjpftz0r6d+zNolfLSh6l7sXSZl8rzV/PQQQKmtS4HA3rjKoA6E5zCYkdnr78yxkWBA86cwlr9Yir5RAdEWXE8lEOu9R+QM6yY3CG+e4zSCyfbkbIOSWeJSGZiRhqyF+jFTi3JC+Alc4KD+nZVOpgBwhFDntIIaFS3KskhqiGaLFX6Oxzl4DiFlskZx3nd84Gym2gLTahDQeGwfeGSBJsM9klLD3lvXoUSpkfrg1hQBzAKYWdmCjwnU0veelnaseaC4GScI3dhG9tGo3FLMHSJTMoGBtIPyVCGuiIYUTdlQ7yvLVfZN1bTR6gdFxIj6eidmA6IcwtfZm4+RgRQ6QCQcswN3DHRlRYKAoGk3wOIvndheiUS7uNCG2ImiejOi8HL4tECTATDZxphcwhUpFNAfUqM93B9XW4yvO8wr3vStQ8sm1VyvmUrGv4EMaKefOmayrLtL0RZEJEZq5eazZZS6Y3anGh77CcD6NVULaXIqw4PTIDklnpmIam27DUqFClNFYZEOHDGOKVdjpaW+agUc95Y8TJYGAa19IoX9J44+IIMMqw2u7qQMAbDowIhl0VY1q8XtqoitnxE5FlwAGcOZCgM0YHNSxVxYO7UuzcyCBILUAyOcuMpnuZKmwGHwONv+iHgPMuNNoF3IVOQtPnms6cDBuGQlkm/IBdGVRO9HD4xMxOgiPemem8AOehlpvcooPh4zeU0kFfrY2o8uqGq9Zxczqd0qFbRcsIhnB90mxS08Z17UJIh+S2X+3Cm1rLaW1AzIOpGNOIM9r17AHR5KzPk4HSECm72oTX+kBVdqlAtuCkVGDRMHfScPmxSdhtIlSslK4is2hrGElSEke4mW40Zzm+MHcVAmbU55C1yxKYSkaX9v/u5AE5ooC4cCIMVYzFO1NdNH6Xe4sX6pQVLZ2RCrYze13PuehWS0viuG+fDxNMZZ4iNb2cgK3GoaEp1X5JVEIGvhgEnONMbat5RyUWC4YsjMVrZVFBQPlSMQTPmCn4j+SzFO4Mvac+E1QO212b111+DZkN9b+lAloQDeasOKLHdjs3Yyk7Wu6Lf4T6WZivQEiLtayWm3oea/FuduN9yPu95GrAx85pBqo8uTnVfHqJf3r9J+e82GbQafTEiz1U21xy8BF9jWx+n9w/zMfQ+0pQvbGpLwME5uFsekPAN/XhQmxLNQbphoQSSnyNf1wxnpDz5ufwL1v1t15QgZyQRJXcjCHjPZxDCk0AuvXxAFguqiSJVdMGrAJALS531TA2497Af16P2rLeHnjx7twkcm5mnDlBSTXZgFVm0cYExlxFoHy5jopxTeZcZaoFaEsuoFAF0/OBMPS9nhmTzfEOHecdXv6y+RJscEaKuagfgBoV6/D81wctDDYBLRekNm90prmOzF+vi09EdcbUgRHUvtWngMwBUjd45dl/hYOadBmjTWtVb50PZ+dHtLMqOqLYinvpjG68yiTKD05xWJdAno76JIzYuqr4rM20u8bMOhX/2iPBq6/Q2AXcz9ihrlx2C5nntbHtyoLW0L4JX61r10ipY3OaU5GFomUjqfAdrn/NN0hVaRBWp5uiBrXAFgKMfauiN3iuJX7tVLPHcxLOw5XIRYlzXpdyQdwmC09A2xTb/Kye8JucS9U6QBU/+p5aywFfZfDP1bVKcUsI6PbS93LToT3CvTLUyy7pKL1/5aHxoaE+kUnHBN0TA5nHjmvhgKdt/p0LT7wD6ckYe12jpQARNFIaxL1mXC7KPZ7w3otFGvebgRRQi9HQ2w9HoLEszwaK/BeCFSJDGUoHpRfzNfhRA4j5DHX+cpVcpKiba8pPIBJSaRGM1K9PnpE5Bctr5y8BzHNmhNNN4+pSFscigtJlItNvKLGCG5pnUMqQLIPFS2un/coKaW6c+Bk7ieDX0uehy6jGJR9dXONPLOqDKwNtU5cuKwdDNi2Icl4zV7gbqhncWMRX5b3EWi79ruhXJXicJtyzFSukhxhpm6jIDP+2I5MBcjzIXFXhHoA2IxUyhfubKnZCb7D8dEKLjS2/AJZYW3LcRfWTwbr7PdmzhhWVgZa9/1F/TuOMUxnN04axyj7QFAxKRBPTTRxcWzHCA1KuoTTKLEZZ0r9VmvlSvTDtrQgodEiHSLFiyZJPHmc8XR1fgmedM5hdutTpIcEWQUkn0Tric6FzcsOQe252mPIpTyeNPbiIVXWFNN/XFMgoqftLaIyUyu8VSfpk++gfRBEn5HS2m/QcKNixHx8+YEyi2V2Z1nKHjDWMUhBXoGRXjWLJ+ssxF6cJPi6hgJ1CWDg3S75qnr7SxPd5CHYfXDJYuXWpNC6B6gQPZon4WxeL7TZ6gQ3h2cbL0eleCHGw6wTg+J026KiT+/5EeP0rKPo2dWrZnNeIq/i07es6VIpvveQ0Mpj6DHtVcu7ulNRTpxivV6JYxMa7jnYe1mFvU071sfj7hFnqZ4tDaEUTsCRPLt/froqU3tzcf22I7SOrVwfYw2oBf5y3eo38wdXCMOXSEBVRct4odgSf4OziCX1IORI3+dofuo4BVCQOc/HKqMXuicWlYIT6gAA5JGQgE2MgXc+zLahEj+rUmm+cxFkMc8JN4k5rJBQCek2Xtb+DVDRjZ8cYqaYYCadGNnz5APDejSLNtRaxWsx3n+PV7mh65F4KPDiKCwCTqWme3gblu3mXoAvmQKCLXJYpI2FQ1GwmP6ou4JED4p8oAc4eVTom3wMZWsW+20SHhPj/nCWgSeeHidMaj+91aTixaAAVDqRYpO+bFKf+Fapq2p/As+y+C6ryd2NzuG+dIfQFeXamjDRKcGeMoJxbWyafamcy2h7X+H2NmovnvPC9vyAh69WY/wvqZfZ30PkiIM6huUrNFxs8BGqohdDXql0wV4anIBl16BO+M4rtvzqNP4XtZmpKRC+9CAFrWRECKbY3mM/s11DMBEGD0BpKD+yviJPnTmcpP4eNVioC0g3j/fJmdxgN/axCpH3P9Nh/8H3JnQMi+4nifowInbkUVNbd6TOijcmjOOM/XQTO96fgSohqW0jrRUAtWCr6VHI/etExysIMkd/gWOpTS8SseMmySh36Ml/RRHH1E6K6g8kIftafmLioPyRhqnaEItDC3lxKIaR5u13ZodI/yRsvsOzc4s9RooXAGyPNKgsgL5NtINMR9RNIhrsr0PjzUQtw+EPUiAYJAuxP8Gp4cou0kUmHol0f85mtu8v3S7LRO0DjHVjNrwvhhorpqZBnF45kbZlIrArRdREcEeTNGUUQvKvGZjeZ6x0DMHUcSKfUA131QVJEGKyHgikY8bgT0mb3XACXhde79JFzYXS9QnP4Ap6oig9qsJJ3hz0n90ui6HfjAYQBeZDMD6qLMIp2ADR7dAadLQ45kT971j02o+ZeyjcPENHsxauztVUPRd9qarO/MZ9eoS49HJxkDkPwGRJMK8ByAz87q415tVEb0irTlZr71kCbqx+mRPCBJyPmqOWA+vAiaNr7uPvAShx77cDR7lGY2lkUgd7XMQEnSBL1mJloByICtYrTPeJI6G9oGugA9Q/P3rZKFfFfFzF/A8/c7+WIDFhRuzk+Ifh151Z0oziOfzpixXx4ELzaj69wjOZ1ly6EMVBfs3gOp9J+YCIO0THqSM0B2NxjkPfmSgOm8JAyVGhvy/1dnDqwAznOjpWt0wfnLG93c3mp4NHEffc3Oq90EyTlx1/2Q0HxSRtkojyjioTVisMhmlzbLTVDpZsMd9SnjszfShXB+G29bpn2RKDbiYwzpl7vpDNx+PVZspQKJwYAIGbn3MI3oQj6hAFykZxIgE2di+iuC1pz14/tElhG7FJIXAwM5ye6I6/3bZ4uW54fbxElIg/jJzO8KjuYE/N3/6Yset7zLY92xV/ETfENAq0DiLkO3IL87Ntw+7SKwTupLZvMYv1vxkv6ZFADJBon4QDkdUKZedVYu9C3iMf7L4yASfOsRh9CTfjsO5JLqkoAjxzM/4EY1mx7JA+t3oC8dkB+qYmGfcXoEPZ+bzfMebdVTUgSWc02o/aYCRS77pD+l/3s5UaqvqB3HjNLYx35JrkAgpMkFSIbWhI/qqzupYHlR0cPKAUNDuS31UgifVnbrGui0KabUq1DgnjaOUEC+M6ZPONCStBuvSEBQfPo1ovHf0hzr+UgNQ37LUCnyj5NvtYq9+CQMEphKn+16IRNmzD/wFZUmw1YrHe1NhCIxKFdbkQ1+ZR4McWxItfvDYy/1zJ15vpoaYPztchZzoKe6kX1igqsb2hMSN81r/GS5Kw15iGlRoqFNmyx726GCA7ZON829vC6Knx4A+HkQL9agQmqQV20AO06T18M3474YW2IVO4Uc8/nlTTGL2c/MmPXDfHvDfkUixvNLGYIbzjykZAPhWl77fdVeHxc3pXdzghZoH7QjTqu7geD4hoeP+XZLjQNR/GGkoElvsWVVgffYc8hd3pbH0w+amCE70Hcg0N0xLaob18VSS3t5UnVUU0YnytuLxsDyGDHMzfhqVNnZPlw50/lF6321o+NrnYSM9876TbadVgTHCWVfr88qfw2eY44NPZE3pQtsclKMKla8HKDGg8Zgkg8cCJs1il4bZqLf2hri5X143tEDnhUqeWzfgbw4MyhuBg/1nNqOLjODbaEuhsUeUnszTba3p2qvTx9LilKrEI4A0AGbHcPfA8X94plw4Gh5p8hiWjslb0zqWwbakkNTjZ/xo7BP1fyeh21oGGLo+AFM2rTvowF60SXo8dYzWWG1PyvS2mX6879+j7WTLipZqpaHA/6eWv/stjrqzedqpEUsyD614Zpx+QkxHOrJqjaXvp/w8nsOtwQxf+5swAeTov5EHkHTlt5Uz5S0rY4uqnvB1AvKA6I+yKHl0GYkw/Jgu8Q/TqjZ1DLipafoKwOJeLnoiE1PpdzYgzHoijRQM4MdtocOkbPlP/W2NFVV/xx5Xi/cWCzc3oGacRI0y5voOFJ3QG138ve7maijQSl0TVu2mDYLoy/KCRetHPbIvYLYc+IGZkpBVd9KOv5vxzivBxjkZC3tU/NH1wCOIkuNMWoIEAjfOmI+8BGXfcxPsVVzA4itsBC6g+9kRXi8taTinstmUPna5WPTg74NOBZ8yE3aJmuje/qMxbVfqn+Wy1r09NQ4zSP06/J74nB3Bg624bLdAKpumtSTRdZym2QX/u5kdD1ZKLAzfaeT6LUTsejbXcywMLLpjCYGgCCqRw9epoUyC9oXcSNvRsvZxSlHzxnl/u5WJ0piDbRT3XyUotk9Puo61aKQUXsoCbBh9Cgva0G8ZSlg23dLhdHF6ktg+2mwnyYlSS1g7Te3MfKBVvd1JWKh90OVi0CnvXYYMe/KgqZB9C0Z7kcq2WXJRgS1MI0zeSTofpZ7GNovgcllZd+qDcbR3/pfXCtQtzDbWA8GP7kqHtqJE0Ef6wByBiN+JwjaR/pyQx1WnTohYfSJBdmPJYHUWpWYXx+jnLZsSq7EXZnMcaYsX63iKg2ZPV1RtZamL7EE036ChcuNPky3FyEbTN8zFxKUP38Vy47McJXX4JXpUiNFxm2Z32T4A/bmAOhzhwCjnwP+T1K/wRfz/s3vyejAx8zqNGB3VaQYNqsuYLmIA48gyiRH3IWJSldcZwkkBGhj6FL8E4ldIEKcKuYB40T4ZxVoyOOBaQegjv9M5hrF/lB0oVtGvBS3GXe8JdWPBD1mJn8jDsGdSeZaUJlrxSpLeYeuFgPFwS8q2ZTiaw4OytxqQf5ZV0/VK3mjLF3smMszxLbiqn9WK8Z24z7PEJ0QrUiFnoTvsvp1L2hHI2gnauvSdBUUzzh90qtRLOtEJyx59nKyRTXWyj2NsmHUfA0+fLZdbCFX9P9fxl+f7YPTR8mpNR41JuunmP1b5QfazdIH0OXT1sIPIBOG3qxhb3uxFoqJHkvU4cWod4In9piLGBOq/iZEmQttiou+Obro32H+5/T3A27bz4fOZOiK1Yb2VmKyC3dm56pEm0l3YUWk/FNKE6DTYQWbVhXhL1H/48SHudzSSl70b8nhHW2O0WGRFEUyspnTs+8jKnHaJDjrqagIvt9H86AimxZTHFblWj4W3NNXplYGluF721LMcXOgFlN+mCOk24m1/u6dnzJZfmAaFurOAqCHtCsk42XElwg1b5JdLmEcevtaSdDuC1sT4qqndRDX5lVkya//0m+/uQfV3YvWNCYqFcsycaYWiHRGBnpp/5WvXmdMauNBGs0EWMDfqWVKyItM1Xh5YQ8W5rUxqLCVAg6cTua5XSYSljFtJWqO/J/AWhXxQYsDDe05t91aZqjIb+nPJVJUS+WU/gIsH2elMakHHjNjA1mgtEtRwudiC9J57kTQ5wnNkQfsT4FQalWXlUHmYczcGJXaj+NG5FctMP3SXlL4gom3mV5iv9EugyM3t/Y9ctEJfJyG9b+8gDfHb2wqHMK7S8gd2hKSIkyMFeaW0lnp3t0WH2bBJsLE/i81kcq83u3RPR8zm68385KAJVXiRBl0KXNYC9ZcpGzVi2hFEda5SHGU+C92k33hBPlhop2P+FL7w+2xwQGNabFpbEjGGP8OmLVJ2mfHs/elBkMBJ2LfioeGSCwCMA6mGa0VeFdDQG6LTyBTXJ1SnPu8sWw7NmYRNYp8YAAnDtljQ6w0zFZbxHiDQLpDi3gOPLQYHVy1BBhCYMum1VYaIROk8jh3b0OXMt6tdkGLmCTsP5bKtt3fYQAw5TYnZeam3+NHD0qzvkiTDS5FxWH2geGsrfsZqOKepPcGgeWwtV/70ZQznhbNai6LcJywbsryK8gpkke2HDPKJ9379UIMbupT5cOafQe0hUfC6KjIA02t3UUEQt+wrAvqleDTvNgZ0cjqeiRfDMrO0JOz2RCIIkemA2cMe/b7fOOsbFAcDm4TCTKYPT5PPpnMrM263oVcxKyV00zBA0lqd+c6UGMnornf0BDv6lCd6QEJPABkCw3m8Ui02A8Ee2a5JfroRtv2NJladqUF95jYKB01szYoI3tbQyMV0OOm9uO6Hrwu+BBjOOlP6Xmc2VLdKf5nKC+bVRqa3RlPl5Qem//HKLPom1dUwUEnQW/HfwHv9A0bbKZb03o7KqFqqz6RYcqcEzEYBVW77Tj8+BvEIz1t+iMgQAxYSOXEg92/SZ7Hwgnp1O82qpzBQPeus5ZM4nRSIoHA7wBcCg6T6cX/BnA06UP+TifBhhynOi2RTSjPK1nyXW7AqLkdjSdup2NNsjDY/CcvvO6i8a3N4b6YpzmM/9PgJorFa1Uz81gtFqALVqv2kZ8k7o3BZBrLtz8l8aMD4+CU62zgEtDeyRsIPkuZOdEiU+Ghe257/1TfX/HFuaVll5QlbbEK9YhKRoJ2tiNAV6wo1L8pQ6cmlHO3q0S9fV6/szbMpPKh3DQgYJ7S1Na0TVqWvVzBXeS5JgyF511HnePFZ7+9c4XAbwXYizz8/WIq1+/qHyKEpFOZFBCdN0ofgbn8pzvtsjzapSDhhnHAGCQfexuGwXemARUf2OItbU/Xs6b8MhbbSmCQ7524tXrT5eMo3eC+kH28y23opM6Kbmqy+TfTTXuwmeGSJrV1Nwv7v3jPaKyAsb97Qh1ufV9fVCayz0y3VfNmetd0Noopyw7WeJzsd9TkIFLNpmh2+Hz3ATaVQv2frgoL+7y3WujKOdy2cuV1qWDnS+hmuZjBk0sRJlyOr/Uw1jBIhhpdd+lNboNpH8EnL0U3tzxB+gzX+EzAaRZ3dkoTWElrGiXwkfZJja1aQT9/UyZg78VTKusf2Xc2fN8dfEfWq1IxXUzPai6IMGSXawuh4wO9RIt0QpM5cPVX2SSVEbiqaQnxg6VSaD4SomY7qHtfhchsLLgOuoVk1qeGE7vGQiPG+OWwhC+vDSg0vTJDRiDDTrat+WfCVEKfZ8Srl/gipTmK3UV+9n2QWlrjeXq2dyHiizJFpYAIrufOvGjGFO/TGaHIZoRuhj5GGJWNhI4yHfWwBVgA2HNMIY9ATIXMdxy+CbhOwIS28mcZy9sZYi8exVlE+bMC3JKIgO2YYBpOJ6m8TQtyX2vMknxxfrzBCJxRlzQTXdwO96vcH3FLxqLiecmt5cBo8QP9LcWNcByBiWAoqKbFbcdV3NY+lI34V0sIrih1MqSi7zU9Fyz05kkbm9IpDkJ1JcENu4j7wwT33HCSss7CxaqzTo7ogQFTlrD01crj6oMNK5e6D7SC/2OGcJ4KU9Ozp4qocandqkgvda2eCRav59TZetwbRoW+5SM8E5g8Pi0z1U+h7RPtrNhPZcElygQ1Z+EP/QZgGSL9nl7gnvsQSIZ+0n4nYTPRHFnXsVWe04xuGgupKDB8pWAyxZyWHNm2+J3bvUAL40VMPKttIgGqkvWnXLxS06W8YjDFSrkvqZdaJRAkTQFd34DgLVkyAYiqtawbBU/h5je8K5OlnnQO1eWYbiYqWSEpramZ6/jyqoCQShqIXEAkyPpxbbgkigj9INwbC+Co3J/cNwjnM2MGJcl2RFZqmINDu46u4zlBAtZKGfZobkNohWydqP62Q2oPKfPNrv3o4O3OzXFSI4h/aJq05nOb9/mq4RlS2TNmUmM6Gt1JV3eMI81xQJmzgm/5DXMWZ7NjghXGbGM3lh/eTdqBF0b0NLf+gszm/JUbvQ98oLuhYdE4+NeaVuGIXlZL7PjFG2/Tlu3LZFn9vOu2TV8wzY0aglCNrPMSXl61ys+ozpCXUoQ+WJHOcyy+YHahqVivwrjj9OQnK6oisjfNDgCsPWf1aQ1thR4JaxVHBAIkTwqbF3k60veFXQTfbjwbTH+SMy6vhfQq1hPQHrZ79dwvZhPqkpU2w2FirKb5SqXKf2adRAcmAqn0C8enlo7jq31bo111448pTVabOQbou0H95tZGztNrG3au2fIHgkNJldHelpv91UMfgP6hHtqEZET0JJGnnrlSjgCZ2Bzc+gKHfLBwO0yfcQ9fD3s+WYAmRrXf5jaqxDme7AgWxB+aCEAILPllbtIFTs/i7mQngw5aUKpNI/j57R9sNJZyCYil7G6esfNm44D94y8W2AzX3fOLZNuxgykZPqyjTHIi5vLnB4znxdUPVnYJGJKGfBSM79yPFr76ak2je6IybUuz3f1VIONmHH50wNePSCexWdf+fDO+qGrua/4QyprHP0eC/AO/zpuENUYxlT1TkMcxObJfxQA/SjOkM+9lMYKHqu0jLe0FzdNGu7MRjJcL0mjrVkyxsDMtxW6YqXQwoIRBKg7uwFGM/Fgkq54a8HcptweLoGJirjFsrFfASCzZA42/iHNd3x47YUixKwbrwtLkwCeJkNqpuzpBU08rs+JNzWgRBZxrytbiOBbVE/XZEifrzc5Oo8R6E9p07bwOfUAAHGXgv4LsPHJz9k1foTT8HH+NUvT3a8634Fj6UpUgXSy8buYtjdW/Rzy9EwmrMmlqpa8BJJRScgYAzguT5GhVfEM71RK67iFmwItkwxD/Bs+nOlMaCEL1C+4RwWRWCbAinsKfP30LUNatQDRbweIJJSvGfnw8LU1Bnt4nYNQSTkZS4XnMcu2r10P+hEhoyMgw8iQGEzgLJRonBVLLz1zsQz3mnv9XTsgpPXJujMOtnGPkD8B5UpfwA9ZCMqAHHgspb/4Cc0gaMgU0huzcgByA6QyVblrmAbVCVUFDplkM63Jtre+xwIwU97AfVr5PSdTfJ/wnK+fQcphP/pwOndZR6p2D1+WlbfRg/jeMAbIITnjesLMVfNsx61ya++sNmxUzqzUsXI54debxA/OR5T7rkUUDmpdTE02GAdKJltKBW8hacEWHrTJerXAbzQYuZlGLP7+f+8e4TIkYjtH0VROl8K0WuopfNJyPigcqw1M8pUIgBKA4u3jfouLtu3crU3nCAyyaX5oJyF6pjSUsbMqaY8eIUfRFI2eBk3DMwLk+ZjuvMdR513GUDOznfo2HzA4vj83m7ZB/XIEtuvJWpteqFxiWlDRe1AKmZ89BFL76/JHDUOAzpQuW8M2xxOWXDnUXFSKIxV5ni2YNmswv0RjPTQeEbbzbwT/urW9MRAfeqez/nuqC1HE7nqWTOf1YVKIAKi4lRLQqRfM0elVcog/RXo5cHz+EnVn3zHcH+VU2AcF8zQnNXMdq8+k2pjwskuIWqPGKjY9c+Ic65KFP4J38p45lbGWx6/iS5ZC63NYDnrJZaoVmp6Z5FkORRIY589Q7R16ib2jqnWUaBRECneGCcFg7WOQfa2Vk3Ndn31yxwLlzb0g68w7Mgry3BzQdmYZ103FippLryJf3ysU9g3XGJQoHIBvGkPA++AGQle8ZaJ8IzwXPUpnn7x5gAxPAI9BCpu29MmCZi6ZI726T52hXK2FQsg5vchkQ5QGMRmkVhxnfbFu3Ko6TgwYQfbflzuj9aiWdlnhLSnuGxIM8DCq0ul/qmmUNf46DxFn5mtxwv2aAHkB/WjyUjLBDmWWuhS2UlBossT8Gwa8yu6ysNOjU1k1+lcMDTW3L6jCGzqvl4iqzdYWhB2AdxWOaOobIRcD3JJlSV5+LTFnxAHS55xxmpELPzPO1c5VW+UcD1QO0pSpmkCTbXpHia1NQ1XucgCcOR2z4DO99xd0qbUvLD6OYHP7uasn/kY3CyLbusP54atVSX68RLHeb7FO5n4xiIBwCirCxLrTNgu3sC+XGNDvA8gktzXsfAH3a1Rd9LOlo8YKFGqooTCvBvRF9/9D/edAN4Ge8aeWdsxU0RiT1KcZSg+LxovJy38/BaRSDo33lwNXRdAUS23VUYNqZSFrWsJY5dpsd2WPstY1g3+M9p6um71FyidU3HN74+zaRrj0nCUrIRUgk6oZXAN6/8YRvGXVk8/KsYML6NVmuFEkUGwjx1LF8FqaxhWeNSzZROatKbDDI1+Rgc+rlDRUaWgFYvWJjmnL63aFS+MerNKhvrnC9pxXmFCKCpbuB9K1M0UxoJGtx7T36DUCw/SYmBK+Z5pMU6gBOMlkFvw589sKazldlK1xqLBNFArUK8bE097IRndd4FXOZVxcGMdoBBu5unKbu5UWqVJrwAe+ghGcD5KraAyNOM2poOxKhYh8Dup2VY7DSaanZZwT46vyFX1Mu9osnlX2+kGdeUfsDB+K8MqFA2keolNJuB98lxe/39+iKdjPTqBiZWrcVNSEEk8VmIuhWPQXg+jr2xDDZ7ZdkgJpwcDrgnXKqRxAGQV+hqB4+1AFoeuP/RvPcXxaBBf58dF6cJg5Qg8QnnCThxwewndPxqZx5Ftw6Kbdhx/AzpXUtWnSsmJ8JjD6r2GIfPpCIl0BWul7RYz+w/Y6bkHISLj+3cHMEnXSREzgho3u/SCkUNLP54u4E21S47VmDahL5KHWrqktYLsKBAQuLAtgZj5hUngHTULWx3s6l7qS0sOCB6SYFsUBI4F+e0MLGBVEbYmL4U44zmwbS33ZY/KAW6vaRNhyrLkNQ1LKZgGh3Yl8VnzZxrbN+4K7x/YV3KJ2cWFV9/QCqXnt4cKiBENzxv83Nq8BKsKBMEH5vhzIxWYrk4EjBiN5/tv/u9+9ri08bSzwwDvgTQMZSSWAU4SN3elbk5xmVRQS3IbcL5lPSgAw4WPokPs/zGFlR8GtNmFNGtB7yI+lPu9Xyg62j/NwTh2KefVNgMn3kRj8EtdwYRXpKnkr8iLIQQfv16seU6z1eEjzRbSHzLxhCnGGglprSU6DUpF03CP+DyBa992USKY79dmaiZcDixiy3azM40p0lu0DDJTRoyCmxCv4GEZMJNBMWMMcTWaodQf7VZ9E+tZXUzJcA2f1xdnPHevpQVxgVFvg3nMC0y8m9kMwb7ceL6E2HYR5+d/Dnuf5AnXWLT20CiIFYtSMC8GO41R/qRLPW5l5gdMzDrXOjY1f7bAzHCfwmttVckvX/LYqOchCH7RwJPs5ioQKZQPlb/vxPWICmlc3s6pAw4FQ3UAe9+/cdIS5h4fHdoR90+LZE2hASSX0VtuaaFAMcJeG8y7ayZGE8Ur/N7E8micdcaeyZ10O7T765gKS7tC4beMLKGSfKCxA8iQlyRpqYQC/dqU8UHbVLiiIhA5o55BedbDl7tcKOfNp+Xth4cbfwNYI57TZqcw09VcojfhAiBXp8nOqcyvK8yA+6EYREdmN8dZ3JchxeuLhs2VORkPe0qVchg+uofSZqxG3aaUgxPbaK/ctni7EWhO/yWNOvF7UiLgZQDmVQLhF8skMcTHyWKzmwYt7PgNMF07W8loFQdPqX6Ococm9pE4HijgEAuR2IxMUuiMmbLm2/GqkP1YdwK7Bc2R4Vd5x7QqphtbCIAbUdRNBLLhFkBLdCYIWAuJupjCil1UGvIHdyXaVXri/mTpGDW0CmBozmXOt2KtBtlADJqSqNFLTR+GJ1NurbugxOb5SId4X/5c8uTNGNYJBwd2y+4Wj367SIYZqd0EWkK0BoFNsBGAEB0t6BCnK2E8rZcraVjwB/x61LY5yKzi89tK3X+0FngkNo416B621SucW68QDCdf/ZYtmp2eC0jKFZez3uPU2jahxfsN8NR86nrCdqtYTZdHyw9He841xdKvu2/7rhL70muDHdbzwygq+t5sBSbmxFx372sZVZ/W2dFFIWZHrwxgr18Mc9jAAcxuzoF54tmN8BAE8+Iuh1qe/KnvhKAVeb60uQYeWQzTni/gFu9r0QeXNaJQE/CFIdfIcgFTNAv9ydX5XuV6Q24I0svz2Xd77JApGzwxze8Hc9jbfTa3H8Ynsa+onUvsPY/p+Wa3vLQ+dEOZQQpXD0AswxMm8wUHkZR/8Plpe0DgS1xCIAfjFyqYGvNsOLWywbp/qoZ/36/2Mx2G2DGDccNbTjfrwMMW5bXZclIPFV0nVtye+sDOKIOZ4Px/JpcbS0qLikhxG7u2USUFQGBd7acSf4rka3wZPUNLz0n2KgZh+SJ9L8xyqf3P7ua9iuUTF8IdjfbStnDKuooLfjlEsxRW0MT88OaYHDfpo/0Qpoa2bMgQz3+o6yoOd/WBdq8KE5KatNQ/fFxczhPm74VQrHgIEW+Cr4w2NVNoeofEVZPtEzT/jCNF9WyAlyfqoqgGv9/pRo9T5S6A5KiZBlG54yvxa4MCquY6DgNQ5ryxcxaUBMT8VDHOPcPR+15R99srxZcpd0cx5UbZgglkv5AX0Fvxnu1ulmH0mI2aVLy8OtDmdn1qU77xGuoYE9S7lxK4D02COnjG30+co4CXec8aBCnpszUxqA2Ctk19csRwRSIlq3IR97i8jJWvNqj4XeBilylbUbFORMcZF3PLS1YzN/TYk/Jb4lXRH8KDQ94Fp8jSMz64SYjHh4w12VSjWr4fPOM2Nabm4iqd2QuUTcHvmdjL7qe9Llo4oMgdDiLvgJpINrxb6Im9W8XeqtIVFFLYh9O8fRPkono5/9n1Hg/DV57S1sh07eIPNZakIVBoEaePKCzT0kPo5RvrajK3dz4jPmI4Rhwyi8XzwfB7Fsl2a9sxWzjkdDlNSlmJrv7KuXZ5/32wdT5pnPoiL2+m7fDEaZLuooZQe9+q/6udIB+F95Prne/tTR/B8Vf/06lo8EcDGfySY5jMz1Yf60/E9YNq2WCS2jigCaXVzjk/rNW7sS8rNa8ZcVavud/MvB0PCpvu63Gz7txnAOrlHDR+F6fTq3p8lDYXDgZGY0k6WcwxMouD7bfh9R14xdXmaZW+AbK+XFkuVq2O1gTORO2vIHwqmcO2JpceIxFlkbeN9f0F0sJeezJXTN9QT9u4kgKcaSbib+/sVS2XGuLpRPvq9rAKcCCGMXT/hoiek0Ck1bbVPdCp0qPpamfJZFMX3oC1mb4PlEc5BRheEjp8NARTHJIXKRb3Sfr3FtXrxBQoCoEadRphHagF83yT16Qgkuy310f3CJskTK49KmsGTMnrfuAUtJbxX1ITTgk/G504g/LpiXAMR4x40KoGs0s1twfh2Zw7FGcPCDqnpGemej3UhJ1cazbIu8nvZcs44cfUJXVmCpX/E1zcROI7KT7vEXkkkdi7fpYiea/0ANf+lPYkrhOlkXnvW2f18nIwHxFOZV9qENkU5nU4j82ivJwCkpxyss5vlWM2959LP3lgD96kppD254RlkQ3pi3ClQR0YyK/mARWjLmHdz8fMhWrTJTxCSeMNmjt/GypxbeNLMAxPthbBceawdRaEjyDsPgfU9Zz4iIPqAfHG5he5HwStH4+La+4CW5wfQwFomc+dF3OEeWQNH1IxNAnEOx4jXxx8zzRNbd9yLRbaqy+vLwJUMgp17MJXzzsymval76HNH+wgcZUoPhHdSz+4J6sTV7iK6nuHG8BUpXKMjPUmykEsqeuux1OG87hsL+SRRxo+WFFOBfKXAkpZBRArRZCq/XZFbdHKzKxyyME+QMKOmGDGuD2uoN22i/edvOLbVDFTPGytf+iZ2AxgP5P74OI5wuF0pP7Nl14X1ULRnOKy3Cucvm8ZkaKPHYRkHJ0/a33xyftXKbD/nTpRaQCftV5r/3RZPxDRweIU35g+p288yNQ9qhffxYCo4LmMKeN/1AirwhG6uTrtgPQJICvD4QH0eoAY54Xd+RGwGCIbK/0SnOUH3vzcudKcx9NrTaM612r4X9fJxqtFWrmBKkUAUl3SQ0MLXNRUzDcyWKCRMzlwsTJ9ZZzV+PcT13rZVh1vdYl/BWTW3KHOp5s3RSyT0dQJ9YGWVttqR1yJIFsr6AIDtTksoCbSl/eRzs7qvHp/tqyTygAhZCm9YE7QFYQyI+S7OwZ8E/jgXAtz5ANFHA1P+kFvSLJ/x6oyslU0rXQv2FGXE8T71l249R03qK3CYUwgLX6q6yiLL0OecYSnI5SAGl39IBp/XvSvnY1FaVCllAFqLtcoseaPS3JhpdrAjDrWIy6Pm5iidHxvLLy3P7ESU1BkeA6SCC1/svugjiriYKLQE/XQWzSTq679e0UulXVntrJsP/ZQE67XFBTC88HT92bjcY8xiL9UfDRGdhMEQrA+dMinGCKVvwYxINlw1uhTQxN0kPFUSCKrCau6bUlkDmgmCWhq4W8IjivE55x0MPSdrTEK5Ky6n5ofm75DSZF+XgS1HypStRe9aHGr/a2s2g092OGZC4fQ2usK1wxM+G6IPkzBLsoh2m+0d/4Wwe4pRy7MkSvnA9JGFL1ibgFbtHT7IfQ+83GtWf4wAyjIHprUQCex4PRDz8rnyp/8cA7Krd0RXqJv8sIbklvFvrFx1IrYut3DXE3tqdTy6fuMy6absVKNndzTK2hExLlm7xJVKyp38ohIe/NloZ2f5CWzfWlZ6FOrK7iE8OlSivv/WVEgHgxABpMzcEKTaWbWLo8vh87ok3qcmQLQ0C5HTaZ3UjJf9PXeZKZonNZI6mbvaQWUvNMlimRaC5UoV0Q2+L9pVsWH3Q+xW8aX9yURsSwSKr3CYIP37T5Zp4uFKB+VuDJiXMmlvbmTy8yMCP7i5x+B99VqSJQ7xQTGvHxlLjPdb+6PS0dVa2hRg/Pav79MLcFE3IsgQCqUjwEBi2DuYE2bwKXBfld5Tfl2iEj351XRLoE02B1kRbNHU4HmKB3FVGDRg7IF1Lvfh7/hulyMcuYWliSpuRacfFY/N494Grh5FI4HIavLaCXoppRAi4RNsl1aRVA0Kife7xzs3N7aMtUrA2SHPceROzlMpERRNVmeGShQFwVUfh9dq2VavoabLxsRKFruSAoE1IPvYhhMdrGHUi+E+sAn7MXBOJeVrME/BEKcI89fjSYOQccD1Z7ctU4EY/PPp3YACFk3XFmRRAhhEWASaYNOdRJlgWzN8wfSFKLrkwCiJ57CXO1Ji+Ber5ldD7C/gXbPsx+yfWAluuMq0beS5CFAWK89e2HGGtgemTuspwtcIkeS7lZbBRdFrvn/hEYbKKYhjQEOKlilZr1ed6QnCgfD7Pe6cQkDhztAvihq+L/UguoWSm+EcHgdiQby8ydcpVk78T3qgBnmMiuMpzzG8o6CGiP6r63uTRAG64uiLE1kpLLqnLAOpsw3klZLE/BYmhP0jTLG/fFC94kSoVtwgwy9r7iGpuMP1h3B8YDlV45Izyo7+/LQiZ78TYL3o9ZDZF90KcuH4V+rWsfJl3XoB0T62BqNP19+xhJrUeNutHtZy+B1HeTNExSnC3KcWkj4PJpfAFtxLkdvxKcUItdUZMpfhevArKOkfBpQ89KrbVXnjJL9kJv9ZV0zUj8fUcw8xZRMPRMzk5i0eXr5aLnz+t6cy4A7HmskU8xmtZrw4LKfVXK7AoNEyXqI7rQXFuUPVOdCkBD4Glp2PSC1hkb+0jttNk4CtFE90upTLWXwHfrMiKDedY9TWOYjvQui1Yl9A3ZxFQmELBDOBXjk7WrJPPVZpqPLY0zxiX+71hs6OmFztzbdsP8UUZhTpqtAAUZNUpk/p8NW27WOqaJ+HU5vpOuxHe80cRs0nc38c7njvnyh6jh51v8x0ULW3xxoaDx0yVqX8mwuIczqvYoCk9XH9vcN+DTUCsRrQ5b1V3fXvgw+1DGSOrka4k7c13ooF/Uu6FtTWgGYMI0e3wlXu3KZQVwE/w3bo6tB4hZXBo4vI7SiC9/63DcKHPUC+IdPefGe5gFN4zG4o9kz0tkp+ZO0DboI6SgxYq+HHdrwbJHT1FFywXqfkjvqrUZ2eL24/PtnxHfkj4rKtp6qgvkrQWLfIINn308ZA1x+OdH+RfPEkVPIWa7vyQb0YIPlZYfZnEfB4LmqsmgWx+QQx95ipMXjNsvSGiBR5DGQNobuSFWakcQh8ueHz8f2ZlTsD0UIatmHGjryqOVAaVTFyLNt2CH8AVrkBrhVWL3BI3JVSmSZS03TshW5mhchzX/NzPYhO+vzcEjNxuOfhaN40qIFCE/Eqtqf9zb52VZKwcw1ooedg4ENO3DT5eMiK4vpWid5iR+0LrAUzAlxdQkripAc11xD3T7Wko3ihLxhVG9gXHJ00HopwGZvsT/srlIGPX7ryhwnShtYZ2OyKOnKHcv0RNgwPDfEs0xYaYVI7S60RvWmZJsTOfqioSLEOndTgM2/Q/wt8zvSuathuOBMfyK3KLomSKiivie8D3D3zZtzoU1m4FcWIOit6gUSpywd/xSMLem2WFvYmpjrb2dB+DVXheGgvUl82gOTGE5v0SgkjCUImm5amrkPPYgdep41tiegHTkTZWpsdtb+oALZqCCbkzobZOGMXUQexmtLQ5szAk4PET6wxlLULTXvffjemhqzXz0mzcAPvhCjAS/+b7N4grsAfYO5h59rxAG9VLesO3KtaDAnqF2vxcpXlJKoY5jmKfqzFS1TZgvAOF4FuWqMVqosxdwvCw0qKCz+Ak/Fllc2Jc85bCzeVotGjJ8YvYxhB36Bv8W1ygXq3Jvly7aoaJPphSIR7ivcltLhufn0p6eGDde1+fdwkS7YQeBIMPRlxfX2g1OlKJw+Z9aWyGpQVj34706ss8D+DYogsR953WqRBoOFSrDWt0Za7xGoL9yNdZFKMJKbkrRLKXZQJTzPRJUuVESNsncXY3Rbz7s4NqkCflnVT/Ln1Kzc3GcbHCQLDyU1viYCvzYi1/i+dSanFpTbTpLeOJ8SJUA/YycbUxRENWaXilMD47McBohd4pAQswT28lGyscnNyKtwMKIsNo9m/MSCRkkGoSCpxigyACWigS0Nkyvi+lVQPbXMdBwZbGL7D3oTTV/d+GnuI90zfSlfEgJ9H3a2hX0Bose6Viyo4iW0lqesXrCiSrboyfu/+dRGmpLIAiRIF9hE46PqhKifXIjmcLBcUliYX21CBbYI8iAipS/7biOsP3XxHqnNHpQl/4pzcGqFsBj4JBjgYUD4ngGwEYQrMCny7NXWNzMI0hVWjs22ti/Z9YsuyNfSI3nDwoF+YozoBZF6HK77Aip7fZcX7wsI/vLVJ81TwQmnhAGA0xerfUNYPLpI5/0So/OWC+wspZ00ABgM87p5Kv1lY/9bxjimEE15rgXZEEn3d/S5u8vpKwDnAP56OytH1xcYvou0jQvz2DB3RlaGhI/Us0/I4xoF/cknLCKial2UdUkxN+Q7ZKbV2dRLo5oqA43jpKgWJBLJnJRiJvG5jvL4dkhEIvuG2cJrlBwD26+WSYp6tsCS6XmhQF8LA9kXchL7TRlZVurr47bo2K2lJhXtpjgEc6GgLVykimyW4KHoy12xkHW76SNSt5hdv72zD5HNw7YYgb3e5Re/IadSOnIMgzFwylXj/c+pA6A9lQ2yh8tFEZZxd7u5ys07KlAm21bOcfR0AjRQOqJZ+sHPHXYkSZsMTAknG2h1Jq7oGjioqkWBIA3woMOmrx67NCxisRkoTsmC2p6760yONuwK5hToZDRUPQGoFlalTQSCse1H44y1O5ORX7c1ti7AKuOIw7wz7oBWGjSDzeSEl6WkSgLdJfNnZTCLHYpVwXlzzceU/MJobgZQ+Swp3FQR+WQX1WkxdV7snEfbrS414JHzSB0WgMyaR7cNG17326b890WNLgMh6LhjmtBdlWVUUziwU+XvLZM9YEOgwzRdtLwveZPPgSh8T977EdknT1id7s9ZpvZdqqXchK0fHxjkf8VfZCy5o56gcwanWaqKpBxloNqS6RuP3v82dS4CPDeejgvWfqPikU0eTnjonzoI3Fv9HR1riuYNUsNHUmNfrzKhNmZaBXBQ/G+GTVEayypF6iU9+pMmXuuLsPXxWB0CFwVrUi4Rw5skMzuIc8dWejirMmgDsZRJiC/8RnOGJ/IutnyxkNGHSLTNLJLhfcfTNfaNIC559/pocP37sLf+gUnZOo8wR0QWXRMC3xRgsEm2Aj8fww1U4ATkKmKW4YIdzx5zXH9duUZEnTGJ266orDgmnucVG6kYSvuPBpUlQuGSZ1chY8b71e6DEH+hVmB8JXw04j5MqOFeCVqd+tdyOWPt22ircrIoZuEUE9SxUKdFHM0nZDxKALsMaphpic2ZQiVMSdiegnBF81jnfXr12MMBaqdzBvESlxfjm/yNduV+VpkOGNrlktxYw1FR/d21l/AI7lge5iWbSxiDWdOoB26uiM5f4V9sEU4PcCYEd0giCfgIs2ftU0KHRszsBCFlUFrMiy3HUABTJZnY0SZnUN0CWh/NS4rzjZt2YbDJ35am+RAzpuY/30mXW5aLqQ5qWQ/Lr+qaf9v2eOZxNS1P/HpEqtLttl1pyzVLKjivTS912K5Owe/JUUe0l8PyeM2rs8msLrGMTKg2mT+mK8bYxiuJbRe34kZqniUkOoRvP6JPs3g9fv2gwBkvsbOCV3ycD55gD52ccD2zUGSeInGnMp70Qdx+d7tW2uOhV2/OBp3p1y94nH6gJW66UGnsNFDrHPC0/E1RWyanv5aXi5ME0PETrIVxJMh6w2Ayy/HZokdBw8buIBytP7OANlU8GsBcMkKYQGDQGa4UxN9IqXhhapPG08Xe20cx2y0FwvXBIB4MmWpsGevUuJLMYbGxxwmo9dqFr60l8jc25yy/IbJcYubJu3ogtRXByk9eDocLPmeecnXPdM0RlGfljJVhKbel6kqsA8sXFs54U3g8qk/QciR4qBIpZSXUfBggEDNKGciWfYHvlqqZ8mKc3TBrmv+JoZWhQrokLgcEd/NFrlkSD0uUte45yPLsRXw3oNJ9b4q4q4xdl6GmD+Vhr9f4F6fqossIpOVKRR2puM8rY39Fcj5kacBjRRVtju1FsgdmRiLzHw+R8nVUVVOoo5ujmM2Y2EqcK9GONwmOaWFuu0u1sDmCJJ99AX/2L5B37EF7sjW0iJZ18pCJumZgxfO+YZv1sZitqA6aQGmWvc4wVXXGIaftiaEEWhjwc92QPRYVKE2/BX8I7Y0Br2m5ioRYjEz3qpokzNH7xPUoT8sQONg0+mdCnCsLHPtZdj3e4WZB8ox0PCXO1bjsVuRQTfddp2Ud2FEqAzsbZ1oANcdesOSO8h/CCQnHNLtD4FKJduXi+gAZp/lXePhL7r9mviYdT4oaThM1pCWcLjD+3jJ/2w9Y/7IEOrcdIDj7yvqZELmeScjQ1gRXCpWnStxlgm73UEoRDDaVaYbMrv2ckGN0bGDPmIbH9iYfQ9NcYXZfF4Ivdbkem/QyLORgOBwTDX5it8+3SXS6O1ogJKOOh85hzRhaLDCBF1ZZYDzcSRxKtzfOkEwwRiBpX5TlV+CoDddW4WNMHFN59xU0UA3XEbj/j9gHLVNxVnvFxKNE/hwwI9tkxa+P7FTrRt9lMg9SC/QW7eZGSCVCshdtwH1NQt4Ml33J/icTx4smxFJ/u0SFhTByQRv2j6b6+Rw3mSyQ2gxqg3BTInWHH7ScMnL4c/yibJ+nHxqtDWCyZJQHpB2P8m22saxgowLMzeFVEtkNpPITcCi1rWT1Tg88RrnxJZ2EsayNuStCBNDuJSL7iekQhHueIhAtiStfC3O1IZqw2nKJ+n6ugGDaS+xAOAvUVbmoHYZdRSZfTJWkW2e8UuP/SLvqDE2blSFN9YERAB0MebS5DCcTFO6MgIH5OWKEl+mnpNwloILXXIT2REqQEZKKcNddJTMDrrCpv7cEOdsKk9/gR5PVRG1kWe+7VOr6F/Bi5ZZOZ8t3kpGIBlXeQTcc+vqSAhWJPAs+ldvAxY8UtAb+6/kEnPWfMf6EEHTy/9i1ITBGEC0eqW+5VgKQqFcbpHr44ZEfWliQbnNgcnD/SmUqywh6bFSEFpj/CfMUeHaMehBufLiMTXVHwi9ZmPLObdp/yg4JHeKjbXyIEnjwm9NUyX8JF4smmnEQcwcgf9BQ5Ml5rU4Xn5IsfQveXaB5ll+pqcGCdnK9NE8mNxvs9gau4G3tXsHaOxYFIY13JMgIwJePRjWcjmTxMAnFpoXJomlrKDAZVWHLcB4hp3+J+y9CjJgM8TMnTS2P/UapRgc1CHilHQKANuUYm/URRE+1puDcUybX4NHW973o1EzlRy5IwpRVNHKErbVZzIhvfnspZkbgpEC5zvXHmygQy3dHsXDhC9/nv7JIh3NEJ/3errM/jprWhOmO7TLFCTL5D7ch2RGsPGZZtfe6DbVKra8NOcIV0gmbGcsFQqKR1tdG5hfvPzOVwjb98CXMntE5zoom1T5d21NWyMqOCYlTJN9/M/nYdOtyCLQSSQL5mjsuEYyTjxMEqCLEpH6q2Iw8dtzAGpHjLJ/OLvbjJUqMK4yRkyiW/VdE5KdI3F8aTxLgi03MenEBhiiptLp2yYrktWAkQQzifwULs+oyNoBzG4BM/98AlZDoFk4N/qu9v+h60DQAgXMz0PK0UEh8C+QSKhmUgxjkW5RL6UMG3xxG2+I24mbFHd+bVaG6tYOSHg9dsXSZEC6hJ2FcpWKiMEux5AfxwXixtzKfINAC2Lq7wuxwEG/DBKvwd8kVjUe/nKXVBvTxd4zkpPcZtM208ojCXYjObq7YcFTccyT8KKmKAXy8bQr2BH704RZ+KCMBbIXyye6nNW2Uk1ebgjcOp3Ww8GcEPOi3qAEvbAa+/WuRVIJqyYEwbZaJHMuHNo89dP94JeItidpzhmeFX7HO68Un9kTH9g6jztKDfDac20sVvndx2LOfl5bGusqhke2GezO9cLhVIk3Rl44LpT02vy48CwswcjVH73kbn4dHz9h1yQiB481neR0+/cAlmH5yqtqQ2JeDxxSFbF60LsfUESabB9r7+Ut+RskdAqpN/+cmDU9eD+/bpie0TDJS2h5I8vT4syhDk0AF6p7KEPgrZLcv1aozFPYARr1XL5BMSQfEPTjsZmmMB1SkIKiL44JxPTx4G2HFH2OrgTBxBVCdrcm1XGNRPB1LJS3fnnrZe3xsYEjg3V5q23OJN8B3Q8y8K3JEPSkIX35djPVByrmqelumvyy+aGsp28JuIlXZDf/AkfArBUta9uVDaSz/jIFkxBUTXLMsRmJtX3HVGOmtAsOVfbPzCUjoJ368eFDw0okX5NYifhquZIUG2ypJF6uv8D9Kzc3lM43qk8ZSrfosh91fQvInBAwITEp47StcjIHBkS/tnX/zrOVq7eKwCvVvdPjEPBB0CrN2dPJ09MJtKfaX6cjMnzZm194onKEUG/fW/DAfmeqDGQc4pT7Ts9Aks5fHjLibpZy5yhHnyMXiKsvyBS5jWrwKjRWYAKnxh6crQplu55TOuFT+3pgZWNk+6rUDQ6GDMuV0J783RJhpH4gNa221GtaDe27ordcydjaRlaKl1FqqXgW9GNixn2Iknqj8IimAcEM3xhgE+ZVVvw6O1cBa89fSvUJ2Qg7rI6ebYnoXR109xR+50/dLGs8lMe2KQq2BOVg/R0e66n58uPWGeu7lR9z82uj7Rgsry67r/U0ObnKkJIt5EqPE+VtEgiVljoQbTHfkutfWxXmom3mZ45R2HBO2bnYb+cnAQSlyW+BAKTiEfwFPrCRkNk7gKa8KVU98b+Ur0eUFQ3sXDhDbejd0yD1hsDEysSg/SHzDscYvJUycYfGqHfbMEd/JtRndYozkB2x413OoZrUPsmhW62M9y7Q/Um33HXoi/+ZCgVYd81rHs8kwUI4L8EPJvl+MalIYBqcpOV2uQLyFKGLt+KJOskN30Hp8kpGl9mKhR/3CuYy8g/fKsqnt+sVSN5LA+044YoEnsnWmzkJW6QmJJEMlJI19jqbRnfqh+9TXuM0pX36Fc1b9Tnoo4ifFFeWMX5q5Oa975VIvK89ixDE9lzQHvMa8V+wyyDnWpVS0MRdwW84YUmkXc8Gl9yiRId1TQZl748I/TK0FEHzD+zMYu2sX818DAJpI+EFWq67A6GORYQGjc/cvJLOeTyeVXtSZ8NsofjHFVd3ny8/2BuJBXd5N9tdseUe9Fu9jatz3//7xqw292i0M45DEtfSEEQW53YeHP8hW38IH7yZkBzcN1ZwHx+kOpbPk/7341cVAc3ZCP6KoUBuQFbbj4c5UG6DIRawh0I0uKKYjsU7iJtxKf5l8Qc0GHnJbsWilSuvpzOvX5oVfhELQd24U5cuhd2CXmcRxzDDDpFhsaI+10cM7SOMuEtzPCxUYtC1rx+bWCkcfM9ug4pPi00RkU59M09t61OqDWlLsW8hrmnYoGT9ReBfSY9SZ4xeUOQgb28CjEaBPR+37J/0rjYHiwLwcrQIuJDroSbhRel+TC6/KSAZGClCkeMZ4EWzPsTGplvKfEkCn7LDmevBMcgxNr4iKLNfPjLx56qSM2cObqA0WY+iwKUtGKX/xVVdDrjtVnhB/3GDOiZ+HDeHUQsPYSxhZTnl0AE4yk6gXc0tQbWcbbGP7f7cRBKYiNpDtlOaoV/nqOo+NP9UcVAYPHUZqOK9hvAcilYy79VmIT4VBv6HGiHWYjiq7UbMOtFyFUtTUi4APfgfEL2D/9Ki76e5rsqRwddqXCn7OSmVV4lUSAZxC2bSxbsvmGlxbFVGd/UWrp8Ip4ezCaVCbHbcmOoBYP9b+kMXPf+Fu+VuZHpVF6ou0HFN5p3ZSEn5UU8wCFOMuiYFoqqAw60jWi7FD0cxfh1QZnOLXsgkmfc1hYRm5dcWYaRlmp4atBxvc6LIC3Cu082SMq4gbYYUxi3sgsuw3VIFwL1KLk/a88GIFHNQvlYnB6MbgCTDX70rPuFSvb/fnft4H30Y26xBYMxxoJrE1qCaiIkFHPu6fI+KrmFLol6Sv2adoLJ+ieQV2Bmd1qKjQ4lVIWXVJM6Z3IV2D6EH3I4BXiJScs4ERn2xs3isNWPCQbqwBlwoX4TkzHD9HPh/VYxoqeBkjRmj18INcPMSEdmWKB0um4kF97fZy4AIXQpesgiOA71uofSiOKFrpnK4HsHuHjZ7/bJJdtofLggphi9qBjVQasbatEZQ+INFogzOGQpEWysgk9jqdw7YPiK8t+es0e0U+1AZiqbhsyIpPT4mXgSNdtTk2ejColQWwdVQjQIDaskHM9nPvLtvwKW9hLpY1YeHBkXEdjXqNiyPOT9D+97nw33wmpQ1DRu58uSZX2gTc6wbg7yVWTtm0w7iJwcoy4HO2Ld0AN+e6tDmt5ydJvJdRvkC0GtVt280XKioqUm9Cg3yAfIBJpZejJYPFm9lZOwpeDqXiKpCvCLvJQGYDo5zjC7Nc+cbVVBkXpnCef+RZVMYHwsAHYQ+UiwwADtDV93HSw3CZ2H1+KMlLYXYcgLpoRrmZEeFQb4BUS2h9e3SwcwsM5WJeJYs1C0erzaHyBhTl4c1spASw52goLYRGvNgsarmim8ncglL/62GkxUZzgfRa7M+eIayO6XeyycgjUPz834ViaMMfkz2C96LykkpLbBfSfA6q3fj5gv6QeqEkjD9sZR+W2V4y5Gw3BvMKioB9qC2icbzJGSm2oimqMqD/V+MPMmHd2amyWwF935zNtcnEwJuipm2vJAhjTV6tA4c5qhMUV7dG9dfXhmt5jNRYAWz2Tm30MrxbNgkzSa82wkSxJa7cWbZXmMt8JeqiQpQN0NMRB+PGNQ0hSVOVDHy3cV77pC2uIYJnqicSMXFBaGGEtAASIdaqNKb74gd9zgAHUQXH62oPF7KvCQOObqr/A748wWHKkGsgykqrklMUVpW+wqEJ9BVKR3dEySDqth2XfQjkCpUiAX3c8RRmfLbwr+mFnDjVrVNHHjvZJ7elH92Q2ZvAJjkOIxHbZAxOfKI0NEI5/y4wUSVe/DkvchjQt+2ZJ97PRbCpXfEAVJ6mUGA/Vh5o5XvoXITX5omEtx4FCfXome/Cduyo4LBG6seWZoVvzaj9UE4MZZpokP9UVAyto2PYDSI0WBD4BlyhVy1YN6LfPoOiNo31mycBVPMajT40yEJiCS4XQWLTg8N+UKdjpDFcJoN+P8x36fxZgEmo0tNE2AVL/PNHBVjlH7WUbj3RqsDTt70y0eN/lQX6ooHX9C4HxU3BZmIarCkQduqqzFai/YRkIjNyFJCvfY8xs/O8sn//tb838Q0xd8ByKFYMK7OPvnwPB+ZR/vhjxeFJNDsSYGA8Deb04vHKCEVFR2ZeRYVSDoSbBNqjQH95AkwfvH71Liv2BCeDBr/fWFUNCUbNefYLKXCtfLypcjNRBixv6/gqqtv++XaoSlp72jZn2hkEw9HTDjwZWWRQE/rR6P8fNkfkZJFNIT6ly9jETZ5ucK8aUU480qdiqUY2M0HaryZoYSmVRzDjUBSgX5Y9xgbHdWstIyzgNdGcx2rbq11wTZQoPK6vHvNIdownWwYkb1nEWFjBgZcYmZOD3GFSXQw69pjU2XPBvZiHs8UqemjHmDkfmqXroJg1I4MP7F82Hcg/zKTylxOZalpRWf4SFvoVfFAueMwJQ0RWuoXb6PyOglsXxmI4lEbkzwuU8QySHynVFvvzMw2RQ77m1YVWHtNEC4OBV3htOTKtH93/8om52FzQYBzI2Bdaast9LX58WALwfjxgSv0JE9XdyJKaslFCz+VxvP+uuclOenFBGksjXBj41zwb7IqIqdLkC3ZNVoXwKmdRX8YJ20ZuIvuG+rhtPrEg1NFtgXic8SR5uHfnAHzr4rauEmeaa0MhutNvdd+R/0NFOTA4xOwbl6hQAho4L9AkgRznviGkwlRxyPeVXiin7LawAxPuBi5vV6Jm8uowOQJDHkuCAEektsWnZsH9L0iPOuLUVeDXf9YHRfBaBBte84wLZ/nRj96xsywGrnwugowjCdr4MoyymcLKG+oTtw+L6DxGdNSJm8gJKbnsMc1qQ58Z0elunzpjnI4w7L414liVrxbz491kOon9PqELyj9BQzRbhROe96eDqzwMGO8CLbFaXbKFBIlSgzGY/eTf44YHqQI3oNM2HoCyMl3wNHU7r2TyU/+uYY3L5uP4motKGIbum2r9Xc+Gr+hHS0wxWO3xNR8O9mhyEQ/Et5q88WLzNvezhng1eno/Nbdz/G+DK/C31a+A3Z5rQBqX5E0gCwhYZDLASYkIm79dh7d9ElJx1Q/u054Sj8ULFSPfVKxbZXyciW/b2ZKxlH0+zcF3S2Zpwoqv5nL2gDrdeoqonbsl9Kg4gxptw4loGFmja084xRAgQBccCyE8JvoS1ELe2mCDjjJMBaMtrsJJN1MOm9SKhmK6XJkL/bqUcqkxZSdSEEtcesSsWQNqp2fIP27JHG9GwZVrlSTOKEAIpBqCrJv6O4tn0N+It8rvg/A2GZS4mIcZDFyZju6ZMnlI5zbmU0GVdy3EJSdbqCvrOxm1NGwC4zSyAQhuduhj+bQTJmRo8ogMzYM+dHZCgPhEcKIU3UH92Qm/2cXpLF5c84X2I8qsmX7HtKmbUGWRUpcFR/jabZLIcpEAAJ3IIoH7Dz9UIAQBs+FpP9aMRyZAGl1A679aAnhmJxeMHj58YahXvR5bnfXApz03AQ24VBv+UqYqZN2PltdAbL5fvcbIIb6j5aVNXIzY/MsfqeuV6wwC34LV5WrjkTWHYHp384SoYijQ4CFSb8Jx6ssrDXpngU5GjsSpZ/I35hiUn9eIWWIC55g+uDn6o4hcPiGfkug5qT0dCmeSfRHE3TF6WJ1nuZ7yznR0E53/X8ds8Ze+TDTA2nvqK3UgpdWAiBwKLlcxOBbQUwuWU1k1qpv5HQB8uR417XYZGyWqPrRxzUFekPatQJxNJM1xYFylNb3YMxkkW8BMYmzp11o1lLrqAUUEOP5iFLcRt5get+qnR4PRo5J7SWmozxZPWr4WbymJVYLVIqrFHXIBcLrFtLOu3LMaVVOtC2YLT/I8lQzcEWgozNun8MDKOxkXz6oe6L1L50eQyPT/X50cExxE1uglErW7EN5zJgELejVMG2xUAZcbvz+x6FfkiGEqh1rV6CQmyLcEF70/zOWCYASStDr3WfzlNL6p/zZGE5aIygQxa82fdKz7KRcv0X7UylViAU97kGCT0pF1IENoqP8tOUz3Hm21/fSV6quutJSn3rWnXGnomN/PnfcPxUH+BkYip9Mt1s5RQ1kLZZhprcVeNZnUS1qWtNy5VkN56uaOdOWz9hqGoay5JQkRo5e4SIQeYLT+aAOHyBhmXzxwS41EdrsAihy4dT/ezYcOqhKDWhBv4a9h89Pw7WnuIkmI0+ISHpe0ndZoguFj1l9JimFapiJrzbpHL9YW2SGZXCtz8Dt0tSMb1AJJBjB0p7aFCYPVapfDfEflrKPy2S3Pxw/aAYADrP4Hxcv6fXi516qdZvb6tzPvh1hk+OZrlWQsqKCRW0OsdXf8vuEKHCUmU/MaWVsyLNFGMVayple2RhUCmSfm2u4+EAxFP4x2P1IT85tiQ5TMUG5uaJjqo6u5LBAGd92B4689i8DqHfT0ZDxPerwIX5wS403HkukGoXrk6YjkcXfWPlKyMjTDeH9DxUuhNlmJkSseakfKfcvmpPqd3//Yf/MNjzqwl5ByHOyf0eCTdn3DU+Sj953dxwMKEf5N09x80Do+KYWtyFklr2SQl2F7Xd+Osd+UnPOWxtOYdSJG0NZzdMYJtfeRXp8esAQMJQAogDSKkqGrL/l+c4PHdVas7qjQ1iTSpqjjPQ8W0bopGD9S5KA6hulVJXMYpLgRCbxX6nMfdij1c3KS+qxL++CFZ8Kodf5LHDNYhmENtWjo7UADNwiYyUwXPG+H9oMRw9mbdK/GF5asdYKJnrEJldhy8vqE6EFM7oYb2GewxJH6fNO23iQtyNVQNIdAjDptNBgITBk40/TMAv+jtDNLqyuECR3xBP+LW3vRE3X53iLUj4N1mzhxifOewYnZC4or4QYDGRxlIgRzw1/TvMW3eGA5DE2XrkTngAID87HbnTMufeb+xqcwCoYl2Vkqw8mKhVsdgjQZDuqFvAeo1kApXI05t8rZ9yvCWwUHCBNs+N9twNpA9hn32KFH2sR76tge7RLhAD+zX2MB74K+8hV/64DPh0fCp91+c8YtGHSfYHIHjuSf8mBwJfob1FkJYhv7NNJeBiF5XNPrU7CUq1RmdvX1MMYTGS4HulFshhOezNqLf7Erog5fU+6xqCkrN615ATfJkG3VKnPdQEELFuM+6TCU5sCZcstBl/nEMfuJy/0OiX0LGPT2ZAM0zj1z8Ravg+pDHyteGCKliC5YPCes9XqiHxJeimoPDdq62WUeq677vGpLbWI6WyGFgHJzzxKCAcb7HbHBOTXaSQODcWaoBI6q/phzToNrF8j+dtQg3nXazoRW9Lv/D0R6UfvXdDpv6xHEHwimHH3s2EEatOjNIF2/BtDDJi18toCEUXPyF5RPbcxQyid5xfv5OyrAT0q5bJBNDQRTIQU7KCtzzdSPAzh9jtahZW2QnG8gKi87oWm5rTUTDy4o0jovz0YFjZHAlXu/2Ua2o0JVnV3VTrgRzgafx/UR+fnScQMSGN9aO5cK+ZfBABLrp7+K8PMImPSctkboCIqu9RpWp+LRbRQzth8bUFsLxNiXdFPFWo8iEZr0c5owrChfrzUuddBCC7p5hTZ5fLfAbA//d/o7+usm/yjsKKvP+Gvi2hii9uLcQmiGWY040c/voLfO2V7xuizCc3eVEp+b7YJhCI88zYWGaqHqcECIJR93xuLyhszS9TcL8wzWH4cnTrHB10GYVmCHZLlTu2LC8DEzhF9iX8Iz/z5uX93Ecnkt+4aY9ZxF/iAEezj0YHqeG5ffde1dzD+WOdCgO/fUJ/31xqd+Pu0qy25YZSTVOxYXhQS8U/flcRhSFmsSrsVN+3fvqrY5oNd96DD6vXwMjZVWvgAQBMz1AzD3d1MrGj+++wsMtkwX+7+E7vQlaPZm0KQ0OK+In9RFWqQp1FEYUyliACscRJnejlxNuvBTzky3eFnhBrrF9R4NBQhsEoopNartArkXKv5dVLKP6G7VFtx7mx8W94CezZ7F14WadZqPkI9zBMQAVpMUdCU5cwJc+JN6WdXwdatrEeDg7ct/UeprZ/kxx8YiUddHPFzf0OLBTjtsG0LQTS78UqyoGD8nEicrNWWtxqxGHvWDHLV4t5U5PDoYQXyBFYbNjkakbcW1NwL2KlSabX2vJfgC64EaeTgsWOoDBwpDYfBQNkMNs2qek3rN+cHD3GQ/+6rDg1dapEpdP00GTNCiIgr+1RrsQ/8XqWiJ2Rl9pm+gEl3p/t12DLUwFABcpgyyZ07SiCxyYv6OOj0RZO3lJPLWZ3Cg6INP55GZqiN3WqtT2x7yrvPjSpOBI0cK9mF4XIfuPFnBr/cZLd0TxNPUVZEgIjaevi5wanTlU3PzCg8WOomJgetVct8+6sXwLo1vVHtdZ2aXt/MYd6weY2YjCCf9dntVkadqU0fXtnv8T1sZ4D9PvFslcgQL6wMhYTyjMSS2lw/5hI2poHFwNnC4JNWRMONurELXvm5x4ttzRMICE6LdhgnQDTCNaqhpcrclxFmNCpU+9y3Vhl9FITiLIGeLW+a0fLdtK24BPhoUWtMAG20Yiz45Hsb5QfZRsBKK1N0E+SARPsEDDxz4DVDng6eggjPaJdR/+lDa57Lf/ovPX3Ti6+ySP2TsWHS/TIlYNfsP7O8JCVkbFRjvIwyDHi3eaGWN8QJEguUVBZgBMOph3kivPkz8FfG2atR/lz8PVtomYaBUTr+NTuTT+uSJysUYfxK4yIAEt8T4EX+RzabzatcaTr+xUk4hC734X/hC5VuTuYujFSWWTN49j3lSfMC+PfAZRCvVvdYTmC4XkjBihiMlT0OUN5kQqiyauSo/ArQwsDS8Ps5SRgNAVWsBI0VdC4H2KdTfW5xvW8ykUXWF5jZIRAfux+Pedes9Wdft9+etAgf+pGnBcRAGQovLSzJvVrXoq5wLNhj2rHwq8fmV/Kv60AhA/vG7GaWgW0NUQpnjAk+HHSEEZjQ3VXRHsLF67I/54FJLl1tOYrHMz+q7LNhmL9eW/GUR9AnRytH+fZO9/OMZT2yNljSRV+TGq9a/rJt2xboSn2OFGPu7/k/755mUa2Wb5Nui/UxomcR4APd3RG4ZqknX297IuexmKXFj8wqNRadhGPKsGHnL0gkaqqFFJilcV0ZA8NJeMaxBkv594sjU0+Iwx+asGwRbMoPA7X9zziaWxU/pbNRttzoDyDC1NhJI6j+rilVXV6YYJFNkkzuGHysS9P2+/iAFRZgSEEyy74hp+JgEv0ZNpy7q+ShU9y1zmdtX8mqC/VQ5QubpEKTM/bwiv8EbJ+K4BtQldtBhPCnzezuMWwyLa1QfSk8vlIc6M7WS6dvrrZAK/yo+jfF3lMqrj+OG9vhNqV4O1INrhTkUoVieyIKe3uCTqMRvO/J1BXLSm2P0gVJD6atftfpvbh7LtKWoO60Mwz27zJZuYvn4KhFAiXN9sEXobeyanfZJxUvsGA3zS91Ki3IRJKqFkPHB0KMJ6aUP2/EGJx4FP2wH1eT6VXOh9IQtxCC2URWBnHe7L5VEY3Mgsc189Uvu0hissIZtHZPQgOdXDeWG879M3mhcxIQhVXNtzKt/7EmFFZCD7UW+2DjByL6u6fStQr9XYV5ekQiFnXO4CahmLcAktew/N71pkrSmuCJKQtIvTRpIgE/J9ZGb61p9DaI6qJlOM7oXehDRr3NCK4dMh+A43oCeIquj8sXBHrM3lp1ze+jxpdhHhwCQb3nXDsOQ6D5jA4lA9Vdz+bn8JxnwdDJH6JkYiYSh9gAeoFFKcwVb8+BvWUTgK+JgCU4SBpQG0F1F8o4VEle/7FL1nW3fjsxE2XM0zWR/IKEc6fZnJGgkKnZwgwJTzum3F5jFbVf+TymrA36FYUXvcs2Zbdl2NkTsp2AHgCRjl89FU/Mz9OMywmpbZd0nI/DTvkOmZzrdCsxDW2PWxS+sm8ALKhlOGu1BE4jwrrgn/bMwSO8czg9bRXV8Z5MnkrsSFaRn6T3F5FmX+ktBvTl1kkfBQ+CJGjJYP9GcI0KFKrdfBSzU8MtOAuBLuca8lJ8VSelD9r3FfAGnEE7ktIn2cg1dL+my32hp0O7neYPyuegAtn+hUD4fJ/dXoAAnY1+sRR+Ody57BO6WD40MV8PZo2nSCyNyeKV2YttLzZ4Msrh3J39E7D+uAzKnuFvIp+rkIzjKZsX1gez1BbzK+P3DAP8QjUfPeBIWXxA1P4wfnA6LlN38Uym2uPkCtogHF6H8fJJXsUffNdNdTI/JXBCu+bEGmET8x1RM3XM/or50CGuIQs3nL3GVn74GLBfFupr4+Z3QxQo6Ida9E8aR0BFR95508J7SunxwQiMOiAWugak2KwdhDC4cHjR8ODCop/pAub4X/di4vMnCu9UF51pTPiGIPF1EDueZXIecD3Einu4urBRrEWYMktBQ/em57bi7pus9HcrspRmnKwC0lcFuGi4nmV3J3cQzN+rDysKpUdWl06M9Ix51vsDPtjUETj2rzEfzrQe/fovlqvFOtDFa1+In5cI13xvwB/BIfq0pt6aWvfhkhDTvQQxARiJouhnAJuMEldGAGKdRuugoPe4tS7Kx6JibU+mjseRhClSASeX5t9VksR5Uy/TJmzsiBzsM9u+trexH7ER6vTkifDeePjJpV1B3/pGKFw/vBL1ey7BuXHlMx26AfJTTroYkGn0qjWZj5ZXmREpGpZlNRtrnDV9BdaYd6PcwTroy00YYqNduIm5wewJXIN9e31mcgmEH6eoAFHMMPJmPCX4cvnO/fQDTgX8PahDP5xl0ERT/70cv1EuWj247Nt1h+cZDC/WAx5cMD4UdgYcCL0SVk9zMlKfrfLZh1KknsyEFIr5FldloJhhjwYloka+LBPXqoDnmTbEj8oURGXTQIpabfopYQ8IcCrhXEEVFW4kPcphVEgq3TbfzgHcb3LeVcixbB/Q9fQS0TmeuMweyZnDloavQlX8NSh7EZLEf6d8ffTVe5L/SgmbWi7jx3g09i6mWr82w45/jPUr/iQYetPk2+z2MvSugznfmldPjyrSHjzR3DHhPi4PVG0hDp/MaagG99WVOLE6uz86KK2hCkrpuraITyPAGdJ+DVXx4qBnKQlxAuNg2+WGB1vAzl+HxIKc70z7g/YBBTYbcO5bVkTJLMAWgY54GITjWLR6NKSiRfdBqmNJrOYWWtuMjzQ0UsZRC5HbSyOFK9iIbuvtnwoORWAQKTRMPXvh5xEOGX9QQcg96+Bh5NrhWYKRRmeFKCGB3/AY+zOoLTf1rqmvNZEpIQbC+iB4XU6sp/1e7tyqswwsDHQScWr5XtM0+QgJNh+d0cypiahopol//lxMIEht1nJLhbjPR8F9MOcLMNJANjq6ZtaPrQLq0E2jO/Oc3KbpS3FL35sBAUxoB9hLW1K9KGavG+Uv7vCUGersWBLDykwPs5Tp/GPmPIKHyXWNDbP+V9rVJ9CbX9VPwKNaIHpSQZkbV+CaHfM/B5mvrpg7PSgoCMGDzjItxbiYtQO+Pd1CXno5RfZmEgwO6gYx5Wu/INiPmlVFXMxggGaAqaY5Hte8jy6w03Y3pR9qkOytiE0Q0hQg8cwWa4pdiHXxc+lGXruHdc6MVOFJVH0o1ut/C+GRCAafdx84f3i5LBc92Bp/fvi4mYj5pa49sHpulcy27j4dcSYh0RRF+kz62N9ZlOFLHQvviMmZN/RJkENDziSjbeXu/GhaMaPUP2dx+ja/rh5i3Quyx0Aqq8ZrfeQSVDPMRBCeeQoRnM7DbZK1tMn627kncYD3qX2lhObPQFS2GI0fH0lunxO1rqoNzuzB18HY49zWWvjm1lOGprsofYxNFnV7Uf2yhLRHypk490/KNy6O5f47GAQGGymtmY6Lo+yCT5nHpzhpR2ldDWiDRBZFxXv9maeO4JVqXqmb/ixdwFEAFewiGJWmYy5xXXpZcmF50aXaWrMy7Bm+FidBt//LiedruSFap8q2pJzVJzh29npsTJ/brOhzN1eQkrI8BOzrCMuKyEf2vGTmucBgTpw2J2YDWlMo8O/GfFsYaOhmw2pNwyWP3luv2D0SFZIPyJwp7J51WM7+OSVc8d8U/ae7qVxCrBVa15M/JMLTYPcJ4UX0erriOrMTVVsANNCQI00yZAB5NZTKHNxLfFV7jtgxv8iOWxPXFTC8iBlAK4MSZq+WIBxBJwm5aB4OSWyzw4Azomov62DZ+oHWcw3uIcfdATYp4de2wwNw/L3ieHfZ1f8hOxnQyU4aOKT2gWzvTH+acm1qsjoM2KfZC8oYLlJDTK8c/3Sa6pNy0bwjYBt46JSuyVPGAYBzld2OaknJY4lt8t8DjSYYmSOYSHISdPvlj5JV8GHfnsKAfkQv+jUWFvcnW3sWOdpGsbicRihFH9lLC7wyqvexu41j1nMI293Y7cmPd+N2jhbfGu19kt8RuWp4X/HzndAjEI1mLYHdNQB+p1lTQIhyz5h9fbsDPUzR4uTJw5asAHYeoE4YPZFVabRpzXBLgzSicsv8MLLq25d16pjJEOC29DRHcDbeqz1yuG5oaG10tlmfQUrb+Cyt76JP+l2n6UxTimVoNUA1RRb/NYOd6Ma0HrrBcpZo0VxIh1akjaX2+yHuDN+3sk45ON/rPNCQ6UUsD+XzZZvR6iMQamhM/fu+CObuUo3pbodrgH0w0tZlkIV4UElj3ydKb3xoD6AvTAgEZ2IyNHnDtmBk+HpaN7bOIC/VkSgJMEk+5INxsQNXG3wpYLQk6UDkr1LyQrgYrY0sueqHbre0sT/ZsN7lgpPQZ7kikPH3xq874gxOCDYv88K1LoqdF0wmqsn1uaQ46HCR8GO8nlqkYaV0gsWIVT6BPMvgoj41xTGaTXgZmb6UZqFVxBTT2ShbhVHL4s3JO/KtkJanruYJy3dDz3lmX326YeOVwTt3h+ZBccRG2wqJ6q9KH9PCP0JNVVlBiEpoOQtERxalNSAOccgjjJN6RVxgH3aJ/kd8GDbvB7OqmYI38uPbHye0oMJM2VnBJveXh+ebwHQhap4lZEOFYvgx6CwsSEs1IqE91ZuMLn/WEEYvncKK8c3JkdquogwPfCLDd6Lugni1G7lCd6dguPzaImx/RrGXI43MJG0GePU9FMKfBiB+mGBzzEchrn1YrD5TroxqeUquGyvQWjK2cesH63e1AtFDYClzynR2SuK2+dxHvVkV6EwyjFmbd8pp3PfeFS7BSDfD/0Rj3JNdXZLfqSKxKXcDfQmQm7gyTZ6GB7DZoplKvK3eA0vbDHVTprwfCxUZOrEnh8W9V2Qv6/dlkaZkbqnhGY/QTWjZiqu32iT2pJ/Lm/SSqs2ZGD08ZfgHChX7vBTCVvdpF545KNKqCd0PaTr1Cih1eRl+dkaDP8jchx+H6dBRq7CIv0yS84+Zj1HS1l4GOGc4f44SWeFr4iXIE2QlhBQ3MgqV9qvs8dPtZWn+TiBdg7ZJVTHaoUPHkJLWfS3yEDsf6nltSlPwqhfiFEL5hMxhfJ6mz4myHOksqjo76NOolM0QeJRr8Z6kcrux8TRO6A7b4/ZP4xL52XbW8SrseXCtPrWlDjmGro9PypwCms15MTWUYWamnzcrCpyVqBwZMf4IEDKu0XZYvyOlY81IuuvqARaNBm9GpUEwscoG1h1d4GLlj2j8yFJSRX5Ptgy16XESoAGEwdQ2w8A8fOQ7kqBWEQrmkVQGhCywtNODMzuGuHnmVIs1vPEWtB3R4D03uexXZVDXJzT/VPCf6xuy6mEeiKnxPpGIJWGQNzZE1xZc9ridU1apwoEz6nynyomXYgNA3Y6GZBHnUlTHGnvcRLZolpXdoQTygZn7lsgBGLPrQkt7WDjZ7aA2h18xUncUl/NIctTMuq5xjq4Yoh0P9Ks4Zd+EpNapaeJotOommQYO/IC8kxDd+T2tViM0Fzf1+yH7hTvYYpZxh5OWO9U3pfOtXWYHnbbSG+AJ9xIMYgM7qrSuVRVYUI2JrcatBel77CVKP5vJEXsW/pimzV3hjuOQD5WORD58M/iBuVQdKXmA5QlE1KhQ/muD8hdQ5Yw6BrbQp8W8YkCyvdJtG1b7hbiPOy5M6ad+sG4nUEr62YW7ovMJdpzScvUGQJc37HjdV5UM4NVhFY0Ps/aSwePYalmqzRvRCPASejZl7FyotwAnLVTWeSaqZbBSHWATMw24rHUHBsALgUPp0mGjPNvmX/bBV1ciLchTX35dYvRamENwNP4vG87BhAMtYQ3n3Ydyq5RgXzGyKabj/1JrycLO4nacEk90J/VUa+YyWzzZ7Z51zDdkahwZL49c2AVWs2HXAg4PADhXz98yLH1AdhTRC3+SoFvaCr8isQv6MAOMTRKF/ZQxBFWD88iT41RFB4/u4ry9Qv0hg7r0LnQ5Dlra732Tgh9gk/wBdOdvYqLIpd7uVq0LU+a5YS2VQPhDhGNQGKbRarKirfq3hRa4kNfmQLLwubQljzKj183E5ke+2zef8aoDjZqCewxFfv1+AQd8HfiedYS5MnmhJQQyUE9O4jcdm/zRI866MzyRsbIEeM4HQhGrkcdEqGTJiiFcDYMLwn16pxmFCE7/YrE+kkWE/r8plj/LGC2u2d3/mJ626w3NP20I9ENFNnsfSbjED9G+bdJGUZ6Gwld6zIzzCgAwtSpZbAJuKF60Az1B4AHxi45cMbXzuYmY9wRliHi0Jnq+cwQ5zBYlbPpktBSQ64tH0Dru4WU7idwPwGKe2hPAAuEzpCIhMC3O13eNVJifOaxFnzbOmkS+sYLi6eRVzKQLuZlB0VPT3vexwIkV5VC9OGC/I8gLJV/AUtKFrRGKTipZfS10PwuqG3z5LgPUCNUcMM5qubqJhdzsROKw59v/HT5EOi6K/PAGFRJKm/GV9Z7GQ2JTXSnvt1gdl5rhKB7df9ae6cUz7JCXP4waq1YxnHyPinMXwTnrarflnYfSMp8cW5x7nIPeHismwkNV4L3CzVXLgek7Y1H8aq4fYpC6vS5eFfkrdz9Ci2sqkuML5o1jlp3Q3bDhUfPDYlV9vvDC3j7Lxs0t6FaykyM2/j9CEabyap3SxNI4Kq4c0nFA22zVyDb6ra4DDTk8JBqXd8pyeNDNJi90+4YCxsfk2qcB+RRr2c0BFlvN6u2QowS63/ZqRO1SB/T+dRX07d0rCTbdOq7rzu7qZhlA2xzM9QnYdJAveFAPMjvQ6vrLGFu4UkVNDieJuTaljtq6EATgh/G9MSrKQ4BZzdIK9Hfb2WOY3eMRyGgm3cdLrcHYGncNWlYt7iLgR56RAvQkefWdI6ogQnzwjFo4ASc5AJioMXjo+DX8Il6c6pz/YPNayGOehAujupg9/sQibn4EmnIKmjt5M7t0o1+ooWro9GG0muZYeA+9LjSgdPso00Qc8V7iu+9AsEZMIs0K8+T3HgzTklO+SLThuL/RyZzGtEC6hvdDO+0/kG2tQfBe8w0YbGODMauaxCvxTtNuZyHgLU9I0u7CxV79DwlVdCTQ0E0tBlduGu3YCnMpvG2MJ+G3U+pd0Lfprunmt/C8VE3ChykFbiI0PKZN+txw89xUZ91WpWefCdouGQrzkfPbqX0JK8L3hOIejmKswM5tm4EfQF1DiaaJ0J6XbXGK8cVCJ2jtNRU6oKbjLDN70vYHNRd/tLH2NgNsLZZNQpV1QvBOTfYb1SC/4FFgj4dWuC6m2Uzo7KjPEdPT/31XNPFxyZMvBMR5o0bGjsxXSh/ZCOLFZl70kkb78yD1eF61h1Gx+jGrYX9Fsl3eP+BhsUlLHa3pos4nCTnhnU3ezP3cMF8IRxgb10Zs7GEHZyYqA7CEKpw1U7LkCuV29xEI3NdvnYefLUGC8ojqb2Ds9vnM9AaprCE1pblurYFDLvifZiju9kHgQnMHfqdhpfalfCPt1KMQk4+WquRnyTcUhr6ql2+8B1nP/VomMX8thYVjYqiPnJd58KfmIQv5OATMEm1jFzk3RdHqdt+gxPEqxmtoSnDwmic3tjhVe6MHTr/7RxFrs4V60m+HF3nUk+LLDouc6Njh2REt/Al6m4wme059fh4008gqV8FpH3iOFn1fJ2Fdq8Vw/1Ez3Ez1In0SQemviURADLU/Vr0Gz0TCZ1g29PDTd3LkP1nLokOzlxUeSUsU6GqJ1Uz5Tt9UQJHC7EktDKLxyWhcdRJMbJl+wCYBIisnR3MHlewTW5+pr8zyhIuXJAAEAaPgyE9p/fnymYulJMgjKoDamNF00az0ke4nMufKM4vyUvYJxk2sUS2BGL68hgbMWgqQ3W31/8LgoiQR+GgiYcXFCv85we5u2dWK63WjEA+/84McpIDiCUIHDIpCOkT1k+y/Yw5cdGYOUqXAZkhKzkxgyEkHYWLQQNY6B7Z3asIuavuYiw+xmsTZUz8Rui+VF3KDVlM4twGJ5tWFEaMr/q/HtwzpZ70roEB+OrLhhtfY6I6N4uAu86opY7Q6/lLDIOnviUFqa773FGUEGSR3lFzwS6RrpY0RyWlf4h+QDK4yaR+h+xtYRijWopmWAVfXfnglqkqA5jycewmEkKADnAd8GEGexqbzX2p6jpYYYoUDLOn0Uw8IdAvucQjAhgMRq84XbrEoSGWqZeZsTUWbWr/0QHKtekeGw6bxMUxDVOqf+y0/IKOLGtQmAiHOn4JI1NPL/c9KRpSt1EkUVx1MkDv9XONd5o6kJGPreOAVM5jfPvCyrrCOdRH9Y6i8lsNLjDd/hj9qxW9j64YT9znb9rklEcczVANI4AQ36cxK17322vMxt7Qu95Q2OWYffRJooFvlMwdqqFq75cN3aqJwFh1BfjHeVb7FlfniSQcXekG86Y93qtEMoCkihYadjb5cTUlfNpnvygJGNObbZBa9MPcI2CvBwSDjAAswk4PdL8DdZmPjkI+BB/l5dRtXgPrwwsBvKvhsJAJ+DXOofsS4wiQ2zXCdkVkZSEPRNNzPSQRBkuxnF0TT2b8yEu1JPGmIG0NE5uUbY3C0mnX8JS+aXu+j8fc1sWBY/rjec5i2euRvWcVpdecAmY4E87DHQhsvp6Mx/dFq+fzPOIoZ95rODMjDDEABnWTA/7oqVBo+EdqmM7bKbadDA8q4futUID4yvTcZ0ra+oeQx3Np3LJp+dqSPQRP3YXQn675strZWrP3Mq7qFnffYWNbVCFYOsmZmelsezWxSgZzUoLGduwepgOARrlbEmaW0xV+p20jcbthKgSoLXFrD3LqZ6sXQSVGYYlSwp8Sz0pU7oRFGg1JfkQ9H5/7GXSkUR+BmvRbUIkS8TC+3y6VKMaNviYgKQK1gJe2DtgSUOhaxtlfWsNd2p5wGgD7J1ylGZWdDfFKtt6J2FAN58qXY+ygnfczxHFwr0ZytMP2BJfIZV6JaT9bhAeJcOmc2uNiZY+GHkVi0rtVcg/Wy0jGT7mkCMhSsNZ1tHA790hTpNnd5SupOl0c1F5sQtMwILBTAmi70Xh3xK/n8nKNj5nH0Z5+d/pamD2tYFHfYiOhcHUkpT62L1Xl6GubiKQyElWc8rDbgKbPoqW0M84cD6kmd+N7vtGZAFZSmQPVx8pbdloaQtUWHjneenH15PEaQPv+lJfukDsy4dy9M2WbOCTCEqz87qsHB9gI4n0p2vMN6ZFi208sMITP5boAxjnR3OUnHcQ36J71j7uwMgaDryeNwWZkQa1M3ZYaBBZuf9xvTPeGmdEfyyqFwRkTg4aambdFQ1Zfi7caGgwlnAKeqkY1qRUV7dIwZZkBMobOOr0alAbBJOaumPklDC7w2mG3YODOuK/AzDPM7s/1i0ZpTVT+4Zcq5olf+CUipRQKVc5Mlkjkg7ynI9mY0k+31CR3pI2MmtKf8hqaZR2vooF3i7T1NO6aNv/rs5HuF1p5JOCyPtmrb56snbrh5mWF25YB2pGOPvbwTlqZMxhv+qo42D+yPSie5bXSsfUA8bc8a58eAbfUdpkvOXzf4gnSDsVqg+uiwxq24ICR6O9pITGfAs3auzEBYaPXM3mlIhKR30ZjZspUZ5GlLI7PCo0jDP92crrqvJWkFuNLj60EHzvHWA42jK7UeZx8SrWQOjFN+W1h/DJ5xmulcUN+tREKCxCpkJQU2rekhtdNuCLPg1ejQL4E1fWQgNYbrKteER5SOfMknBCA/oB8dgQVajkzb8U6pSJrScqFHIn0RMKgyHEr6PKSG6quo9bWLmg6XrSWsR/IKezOi1hHwR9F8a2L4DGEd1h7dWme2rcxyl9OJkY0mnX4+kvuJ/sO3vrA/tkhNcT4/nq994WqrmnQwxZpEwtHwH9bzMo6csB+GIs5rOFOGc4rP+d12pyq2zrnd6cS865yyNL61ObsHrbT4SaCjs5KwBb6SFZ5GSemKPbAC/2r0tYKqhdJbLax7hi0CxItuUo38f6CKRqm2dPxumhSNQsY3mtCX4jQ1k9LaxoLypjaW8hMNjtWzVdBXgg8wck9E4ettj5DQULgut1+h5Xik25o9PmbmE3osZ/s2H0FD4rOQ0xB1WJgE8+jY8mu0bjS2OOaOPJLf0Ig0DEPM8IXiWqJ9Ax5t0SppimXefDnVGIqLuRMk57p00v150ZuzzuGSjx13yG0nqLL3tJWgmKd+PMWYdth8Bmrt+4xl8GqhQXsGDRdr9sFTBXCrsDAX1eIUs9HhePtgFnQTQWiM4Kp/aUYIEFi+dzdDX1XE7I8l1FW9pBQt2lrWqlNB6BDWJVimjTPe3IVHcKaqwhNQziP0qqZx8fXcHXuBHbqmRRHrBx488quOidLFw6dbPdaOjFPX+QZeSeZQTeRqMsYIibnwjaG17A3DW0NYakfPEg5YrKfqzL00nOHPvHGAN9/b17nGVkH5oWWyo8CCKRN22rPN44BQPhrE/fTU7D/dKvmRoUz1QOZ7ckpd1+ER+p7ASW/K0kPh2UTPzSl4ryAjZZcoF2BP0Hj+PmLNrwGX3/E3b0qefYCXO6/rvUYYWUNwlwMSoQnDZOB+yBC3qmiGdAl0EDLr5apUwCPy5xCTxkLfDKHNrr90csYt47tariXnyQJkk0ALy3MJxKVzZVZ1pNIgGkY1BtByb4O1AhojXeiV4m0BMRxIFu9+lhCxiwpkF+HFaF9yGRqLj7aVpyEMRTPVnV21Lba9y3kWmf0un9TYfbtGiCkJaoVkjYEShBnQ5iYW26bFhqA3mAd20W+NdTrlk2uMMTeVU1EUFBwwu7pkH4Qz3yFSh4ekOUdN0Q3K9kUwlUK+jibrycX4C2ZKI13Nq0PiEDN6bT7S4jlxCzDYqadPXeVlSPSA27ncpM2pfdnJswIc/Kmg0YmUqjVrD8eEUSCmEr3kEcvbmBTP+N3BO0mEj9IGLboeFyQnFjyPIAx/l4aIdqSV2a7vh8BO94HHn+tlrag94SYw8xOIF+VRErr1GhwgknKNoW8bnNFESSNzQG1xLSWBInTdEN6DKI6K8a0kfqkynFxJrUuS0TktgYiWLq457ScsnHJ5kkwvIAKIM3fd+L0tsdN2bzEZnskk+JHK+HSqT3bwDwswNRB98dyAZXO7q86NAAlnAiodvgUYxLSLyzzr9+W/hGA7eOLA5SRUs1SVtF/wQ3Epc35xadNlHD1ndVHVOXz5Wc0ob0qPAMr/6MxR+sqH1k93V7wtTGbSEm8/tRs4R5FeDwLwT8Gp2OYDXdOgvKBZm8wlgqR9KD9lO/mlL3wlGP8HFTK6LGYBXw2oliV6cWPlhZ0QDouPs5svjIviOGXlIt8UJRc2LIeYBPaHNT+1Apf1JXNVoxkLksl03C4EAMJ/OrbGBGRdYk0C/hJktaVLfCGtqzDYvKFQBVP5GTCLvlafzt36W4Nx06Ydm9NoFO4ncti6HfD7dvT+68VTNX3b6zjX8DYbC6NomWkIxxh+1FwofowJE5CGlRYdMx2ayjLR0s+PVn0ORGEW0xGRZ9jBiVVsEGPS7rp35xx91mzSFFOHx7fNfsvMbDxW5k5ev0y+jzSHV+XNhCjgutXxuvi/l800vlck7OtH4VKhXWZovX6M792SgjwYE6yiZu0r4+5O7DFZ6GogjajEAiyaRKldagS1pxNmvSGenZZm+IslA/pCkmSNL/KwBd9NP21qjIQ2J0pPUJM8nBOkXv9dRgVXI3XIk28f0q7DzG/vlSwDpNw3Ms2FfTO9MamZpfAfweLXn6c/Xncdv/wV4dCQL6Lvwv9Rj3QisTgpCSdIMu5oVtOXUqRX0P/pIMSTBeKoZqjN4v1vsSkViCcG1py48WSRh9nW1Xf2+pD+gxaDWvxDGt1ckrarJj3B0u2PCCQ6IHjXDOWxaxhvL4uV4hXzzd67LoB4q+Pxhb8mstbHOvErMF74jwF6S4zfE+WeMLlUp8rioF0Gq/l5tBob8jFLCKlYFa6sSvsKu4gKWMhpJNHSrIs1743dppEK4IRnxLqborYXHiwFiQrxWaiufcxHtm8NyNEZzJseTD1vYkoKAF68yN2kte4p/aK2hOzLE+14U8ElzrnvqQnK+1ieNl6E1TIJCrVoXZ0cbhzwcbBnAi+ttqCyaF7F4W/nC+qZfYx4ZG8T9WkiIUdoTDSInGWp/Wv4nV1bOs4yuo4SjNGhDlgjOfsru2eyC7xuZkxbLOp4TQLN9dQDuujGARGCResKaqQ15opLMyIVbXPx4UBjQA72eaAkSkzkytwP7fwNKvkP/Wwdq3i3M4tVOq/VlGE2sT8r//gjuv7GWEiVi9bogKMdLDW1rihVn/HDYvnhapRojm7zE4paysoRHiIVDm0dgzPC3H73jlmoDZOsUPp5xu/BwBwiu0vVi+Dd8tgYoyPUBJvLC5lv5Kg11OCx9sl2jiVeKUfRrZD4ff2h1HFBmcamyI/zTptl/HDUIM4StOD1YALyd+9Lkn6pdEXCrpeRuJMyBUJuBIoI85EPwP3AqvRSMMSBpwNBhTDasVs/t5nBdEkse+xwXB+Ju+/YTr/20vjyq3qQbFXdjJm8PpVYFOFU/2dCev45RdZlcdJDua6P+mkjv+RnA8eylGegupZ4s76mGBXYfgNh7TMBSM3vxwbhLEujCvv06mqe/VocoGSbvCmm3kG/bRHKrcKAuZiGPKVMF22nBbDfAtAXZuwCFS6xGPLnbZzyjgiFbPwFLnyaUKly25i/yCTZ5rqp3zYyu3idU+rC9J6nVYWdEqeMAo2GwY8TudYMwZVcdR0Yl9JVoI7IBUBYW61TQ/i3Qd66N5H5xrEnpYuuskZHNLUaVLU/XhoevlRyrqbw/5fSSH+4c4B1sdH5wycOhXLoqfO4sMwVYHbZPXJJkwnkXoBm17UKJCcFi8IOofYMownynhnnIp7ars74y/55m/QaCXOQ4G0Zt7rAjyXfuAB5skR8DOwf6Ck83fYtgpRbJt1/g100ocMknEf54KB0/Hv4kBh8W4ryTDYbpR6Ei8eIPSIZ8wyAVKH4ZTk+XctGPusNGNw30NjZROXZE/jGGNkdlvjdHFdeIh1q2dBdwH16+a8KtJlW173Cb6MWPsH+JPqvAPYhnXwVq8CHJJxIQz0BdJT5J5x+PGRgTxcR8KSRmvIIr1hCspUAnnRFCr3MQekbJZeRbKyTF8qvzZ1jIux/m3+oAD9NOVs893ufIAML9OfgA+H9pfUSN9wmL5oq7QSa+bLQrZ5RKDw9PTRULXwm8QrcdwfAIgk/QaarraUcIuh6y/2bkLTLiLl/XvINfaJ+iZb/KWSPK1F7ttH5dZJofH/lspqPvM4xEXCjgtPz5W+iKtddkgNMfcBQ4Npglh/tuIdYonS7cUDbLq0um9MsezQ6rU3spgOujhSF2PypA1kO3AtBaS/08DFGDDN8tC9jaRnCG9c4amE39JeXVbRCrEE0liolZJ7WKA9IRU7XzItCf+ttHu64DE/TIW1TGwdqrpOJd/gDLWi48Lhak4oSRGGlS0zIKKFbXVJo/WzxskLIe8NNIeGQGQJCB36KHu/nmTh+5xZ2G2o93OrghZdWY5EtV47eGnmBTy0reSBGYlPMnIJBmlwLirD83gg1j9z+SKRom0WXe1i2aH+VxWdOyRh38R0rgs1CA51AEVmGrfbOZjSnR7iE+ICIQMISkPSgsfoL9wJTIrlXjyx57tqvAmD45OE9trQyceKkRWXPWb2dIo8xxgk5B9TFpK3DM3W6dt2uo2PpVuMNvqBYLEnJXKIgtMUeaQaGe7MOJQhqYJO0hckRgWXcCE3T2wP6ns1d42aYjwVwlzHtwYPn41K0PNYQBKgYXcMwy9GKISrcWeh4e5gAztiDBYLmKzfXO3jExAtBHv9Bm62etLDr6vI+KCTIJfq2NlP6wjOaEGfnuA0XyyNG5WRShw72OkC7+qo7otoTyjd4Qu0d1+7q0t5JuJtmalj7ReEoFKs/ncIrSucvGd2p464FGZQmzSEa063z8iujej/eXoApi/Dc6/i4As8KAZfXFMPHTRj3oBbUf/0SLlhI7/v8Pa+TmB6bzPHFl2500yvYRWNj7DMoyxnEHy5FAKoFmPg2n1rwjuPwZczHc0ovd3gyKNyycREDYDEGYoOqKn79MVzELmcBcno7OhQzU2cBYj2QouRBYDddqXbucxPI9n1gSxyDKcBK40UiUoZri/PNMQJedGQKURDgnuaWc4oE8Jq3D0nHQp1ymlamJ4YQX1VWGdJr7GFCq18gOPYQ0vs5JgKaFeQAhuxkYtute1lrzLVAvdxRujUBS0HdEVltQfarv0u26VhHP1PtRhhgCRvIzQJmXxiECliHqEw9IMV+xgsHM11NAkhsBQCyQPFJPudOOGgQIQsOcLjHaJ85nd4jVfxW6XG8xQ4+mCmMa+XgjBEp7ubjfNtgTcPHkz2ULESqcaTeClC/zdSYjmcIPEzXgiJkHOW9crxfNKTmKrVvD5NBvsFeyL7niSI2WvYys0ZRzSc7Rmw1AAKJDo9ovukXjKrhiaklY8389IWBheeIL5XW8ZhNnt20aZVazTcFFDZQcAxSmEPlD+QpKA8nbK1SYls3yRQ2rWo2OAiFq1/q9rsiebORjvc+9bw1O9lkqbmBAFA9RM6SgMlLZI+EBBHeR2AB1Lm6qPIKDGVKkBxBAC3QrkIxBw0laJAizxHps6XpdgoiHyWzRvB7z9K0IZmsnzNETnWE/psv96LjCtsCBUYQIvKUBVWsZLmU0BP8x1rAb3S0hy9O7OhqKl2USVK9cLTZuuTEYLAP80GUfWJekEpGijLpVT6C0fNDysP4O6P8LpFnVr0FowW96ib0kSoNX1Bu09JVuNoFNC84rJxOxKpv/Ud7ZO4nEp7roeFUyxdMJRMjarPvNMdEtqt228f7EXvs8FTEFLvzEYdEnxyeek8sCzkeO9r97PnVa4BfR5yo8QfnstwJoelJirsTL0Y8IgTO/d7nqJ0VzH2ehKpHn9QQy+gEdRjYy8aCMEq6xBKP1Z/YPS1wXboetksCy0BqXwnviHbCk1jx8pY1ZHHpBG/VTg9JJZPt3HqDv7IakiqnO9zjXaqhqDV5ZPblxxGsi2qaE5xeRIhvKsF35wfXLyWR0ZGXCxPDobMimaIndmADJReSJE4H1Gso2DTSUmWKqZwegOCgykKVXo4TeWDwPYuiOivPL67JyVFMmtcqKeMmkUCt6uzheCI/hI+TtAWOwQEMSv/TGXwu+LyohAD4uqcjxP2dWUGIB77/huz/lk34b5MGFL9Hn/xTRj72DjhK1Z1ACQ8qbQ82A26tODCxf8hhvkOxLGR7iYvYOzmLkQfhbxU/uPsFJwifBBCFzPn6w+HJ8ag/eSZKOs7/fG9HrkmXFxW5dagXNtD5ngonuiBGq0BEaDCH2wgjrm9rHrgHPDgcY5kdPfXcuobZCPESRNufQOsnIJujLkUEb0SkbIiheWp4P1TMgcTS4avj2MewpNu6+AxOBcvKGeaIb/3/Yrwj0Mxd14rWcbJatDHaHjxzmVp35qr/yfBQkReKK2RvNkxISoYYM+sXxTXIpktwR9xYN38TTCOemOFLmczh3qSftrBkJj0nGgwlTZ3hffxs4zQDsPTaVRhEfNosg/UERF5ekULdIYgspfczI9nLpLaDuPxS6alTebLcSVpmm8cmC1mWrmzFxXm+P/6VBoHXrrZ4CHIQJ+iENEvZKLznT9NKEtpQ93kcRAR8h0m3vcsUy9KawkX/zpTMRW23Cm8xf/lnlR1wLAvFLR07f8W9C872tUbVGeVhFn5441gwJp6/iCkLcOtyCMITxI3nNSvhhpaqwHT/eNUGPYLtqpuB85aVEXGlq3XJ+kW5yved2zJWH5YlgpsNM//XZBnCSDl0wVxsunj8/TuLP4JnsPdOq/1ujiwXmHWb2P19OUlApFRNL7v9CBOkbItEoXVPYRafUHdUshbHBJDdNsCPFRLTZGfL78tBIqTnnNyzJMGYAkP066kBFM2Jv1+pQe1goqEw2PTHHhClxwfihEnzZOyDMj5B9LgOBNbDuLCYAeOasxHmRW7Sy+2jTS8qk+TtOdR9ZeP7U1WxFc2i2Nlzz0h3F2dO1X6Ge5pepvlyw1bKtpKy+0Wlpapakaw5Kji7uA5xMVo+5vK12UsV96Z2febIonazNUi/MoLVFqy6mTV57RpqwI1mVDpadrkCcEIz7j/ThmR+u2LIrqH9T3E9ADv/7WkDFR+W7jsR68XTjROyzJ1NV6cmLBJhbYviR8DKaNd8n4Ppm+RsWpDNqceDVoM2+sk/Mw1yOZjI+rt1mfA9LfI+Q/BT1tD/I1dibZuw2dknS7bxKUvJBLq1QtLGfZ2Xqr+oim2T0xJt818uk/HGuyeXbtWptZ469ROHB/437KXEQQ/r6cpKaX6iu7EY6zbRk4c2VDjIskoENIy+Aeu1JschvR2R8K7w/Qfmx+pkWM3Q8jj6aHEVeBIHSXIOitjq4wmQenOpBhncCpssW7KTBxMmZavENym6MoP1FHxL72+09x8WTCYgLqlxgx01HTubqefM9jD4KOpY6OyBigz1D/hQ1EO5kwW1koA0ZrS09k+ia6fYLUHPBUTAU+ivr08Z4jcpCttMnYxjTITX99VoB1E9byY97R962HO+fJCROlEYOV656Mt5bHTVbDAndNUq4OASgFDdgrx+MeDEJFpZWGHokYqpVHl+oXCWiRycZoS4G4OA2j2qQ4o50ivcORSUf/hmHLu1qaJldohS/pSJ/G/smn/T2px+bAJSGeSNnfAiG4Yza1sOGia2GMrLYuLHBdoSxmwTFMVJ7ik6PK/7u/xa94hClqF/DZQr8uNYCMgYn9ZTS/jSPmmFn4LBcXzJmUt7GdNeaqxVTe8EzyUxzuY89ybRt4VOt05fa+ml7G/16fmjX1Kuv13ND6+EoRW5p5XmTGJWL8oRWTDRDPFFOnC1Ww60rNZqcGGS+TuGBWB4W/OW9pHH3HHr6K4lgSEWl0R2zzTWa+MMQIJ6Kt//h0JJH+JEgWE9ONVOkIDpdHR/UU1q2uroYyKXepa4QxQCXFS8gV+YK7Yf4SBIgCQCFYoxz7nARnY1Jq3134uIgXz4kbH97te2gxuYyLPwLbQEkmpJfqQUoEOwrATDrSXhQqKWaP6/+ZoyIh27nuuVvj4kD9yKqJoQRqviYQEvG8XW96rbb91VkE/hiepXquENRkE4N/Krxby7lxhVOIQYpCQvQ5YHSQydUdObUdsc8SG0JmtjuHLE4urNNTIpkqmL6APmVGWirjBDSA0roXQ/58OXxK5qSVY+qtOjWu+V1Xm5B90mpg8j9PCwLJI8BVWVZnWs15ivn/1YzbpmfWv4SPFUvWsHhsf46OUTQirlsRFzbIGAsaqGC8QCEyCxMmKPnE5hjlnGDAJCIryuigy1CS0bFANCLZF2zUxv9zJSaZRpO5OVHK36h9cU+TJlgmmUnnjjKPKZRK62G2WbScWrcLyTmuS3aqmoDE6GbJ499efMVasKR9u7duMVoudWau4Q0hsbnGYqVrxtCIC447ZL08eZRmYi2UOeTvUKAHh5HdUk4444Hs6OrBzI8WNUgW5hqZ+It3HWvCfFoj3gKA5nDLcxZJRUU4fzF3utNNfmwK6vS90xwAaV66bzh8Pwxoiqms1dPSPkWt0lRT+Xg/KvMYOZnEbXZ2VninYE+Z1o9MAXKEhebT/6oFX/iRXN9DcOF4vUoaD4fvEH2I73KE0389bZ4/Sr9Pt9uAik6sbOOHZfLSjlyVwa4e0AYFL1/xr9CiZzSNmhRy3JA9LPnmoyg4O54obWh+0EXK2PLHc4J7uKZIstUocX3A16TM59dMqGke9SLUrKzkGFsVSPCeJwUH/ptHstmrTaMU6midxvit563My5p8NJF6x5vHR9uh+sSMwysLg+9IFyjwY2LBYFiC1p6Kn+yN4dPcvvZYA/KBtN8gHMuFPna+nDn9RVQw2xkEqZ++qdiVCaqs6MDJN3x9MFjKHWcJH+Z0kg8YSZA8HZsmqNwtZ3BLxHnVJqJaKCySICVvx+tLhaZjsPf9lvwF0FkQjQpitTBgzvLsHmvqkB7/dgZ1YbyY8gBRbVWuTS60uVAhEAi8pE8mvd90z0qfiJPrc2HlC1tppKs4iRnj6U+wDJYGDCAgMk0eFAPrR+ozoWBeoxLCOwKzccX884eVKXa3SN2SS9FmJiwKMX52wZgTvQ6ouz/1MgbGPuyAu2CakmUtHLt7sJZaV3nF5Nod5gOIgpmF0+fvHmbhDjqLK/tuAtOTB2gFnBUHR+FxcQcOC1irXn3YD94TaOvFwNsvrm6eyCkoAPphzSqftGCjxfSSis95lFJdh4NDqkIf2gcglIyPkZDzwZfAlfvozdb7Oj+xTfqgS/0PCIZ8Z/6L1qAzJyApggPQZxTQBjkwljpamNHgwB99Hqax2p2ms327KH9+J4ekyNJUXizm70YOQ4YqbkQ64peDA8As0Xr8iMjskUwqDaU4pjq9x+x3Kwpad2hb59R2vXHUxAEtptcwU768yp8LXQWnVs7z6J66FTLsb++drf1PbBvyF8j9D218O62bOvRHL53mr3SKPXczSQ2ytwW7HqX5gmaR281EwDYv7A4BfMkfPG+Qyba9qpFGxlstgxf23O7lwScj80YdymryKkcPGngmkoZhrv4RcS34Y9NWdorNxx9NMLlwB2dqIFUK5oMraqtr0on+igaAvF6Dsl2Figs2auuiN1w6v2hCHZqYb+7PfwvVCqFGfySH6XuS7TFP9nGDNGEqJtT2Y0WWPFc4LBavSkNsddIKlCEos2bRE++Y2Hxa4T7lmUQxrNrWExruSMvTZpTYy2yuRUotWPe1GBO/lN43zKx/Se4W2vEgenegQH+UoHzjop90+x9ZIrXz1u02fUudx/95mLIf/RjSMI6d1nPn/nqmlzuDBHeCIcCxuCudtRfzspuJDbQYbyNEVw4N0oi8s9KLnNeBKydJ19KunnHxbCy770vvs4Ojc6GaPURfHrJ4MAsV02y8nv3r7heS1hl/2RQFatEy6LNl/tECBj/e4EhA3R4ZkSosjS0WgyCP6aKc+P1HZcVl/gwaHZKElHvEufbi/Rxv8mtVMlKv48Tna/Z6jBIUj/CvALW3foBXNcmhiPPiCkbMmXgCkuOFRgxTEskpF94pX7Tbb8BFblT5TN1QILrHBfykltZI14zybq2YWCKSZOzhpeJNCDr8c56VxfzXJGNYFikTtcMjzuBnZ6bPBxTVR//ZDdfTl3pB+d0CbzWzauCyza4t1Tzx5Mv0n5/GCzqPxs76ikQ9qrdyOW1jBvzfGgCfHcUMQYmvyOFmUlAR7Xu5w25T5pjyjK/T7CiR1NKpxS9yVGTHMg4XNmtZ3vy3tvJyeJjmKrb05zdGxs4afPLLlQyNw13yKvfvK+BcVAlPdaFF49GATQYX85VNzISjyLMif2VODulSSVlHtJ+SSZL9LjRuSJtTLny2nBe4EaHUopk8NId7NVLnZ7CoVqBrzEq+qgu/y3kkDXuh7Yc1LsoGo6PNaGWanFRtyQebjYvDdXCUIXd69ur20ya6Eor9ay9iH0Rk1dSoYobbFIkW6nIIi0Du48sMDZUH4d8UZpXJ96sr3wEfeO93mIPADLz2AmRuuPlOPsWdd00HHYpH01i03reuRSQVzkTKiSsV+zF4NRI4PAZsHe1RE7FZZ3dL9iDuKq/3kdL0edW9r805ikwmYdNaLjEd++GFCQjHwp0m49u9K8Yx8Q0W29Hb9L7s5BeUWowEHEj0kspCJ2vKeeK9RoNRa5C5qawAI1TY0AMy8IDRQJ3PAAfBc5WVo+C64COcdfxRkgSesxYwLgInYh0GlZKxkxa2C8UCqyoLXnWeE/WPdzYkgBEG/24qI7rZtAB8ntNI1MgIHgqZu4MWC0iD4ZssAlYsKC2vC4lKJjL69eUpZBSzzO+ezGQRiSyRd0wgqKNBD5keVgNO5xRsphUxOHkhtR77dXeUox7KQ+S1cx8/FZENSW0BWZ3V0dC7HpvqVyftUaIjrDkHm4nONnuKfkDsK7uioPbVaio1F3M/7Uk5XOlrPgWQ4CMktQn4/YrljbULcaITAxavRE7L9GDkpVzmz0mxMV0ENCpqqVE9zhNUZiPZ4/0nyQZ8EDPSwFIqxFnrvQ25xMLPOKfriAaB/JI5Y53/ziyFyj7/vXQbV45WkFb6VMdhXsChJI8XzhQMpBjSVRAbg2q1rSWVEqfnE2v1ZpRQrz7naWEk0TRn5QO500X7t68yDxglTB+o6FTTYmWThjLglhTdUemIpEOA093ZycFRufGAMehV8jnBcDaVlpB8lZTXDrXr7j+pSa7FXFXas/+QS+l453An8QFazV4gsq84vPT8ma0qWXtDUtI1cuJhaeUFxo2ymiCurqO0iOLPZkTyOMR+DozMu5CYTY2sAp7MRTBYHEy6iClABGz6jHqh9lpcHDllgIOmxn/vELnVAgms7o0gXj1kEeIqSbNvBKUZ3H9KVUaG2UdUruZpP6lYrDEzVtFYlkPRUMtZKQAUswdp8JMSGk0cnA5xZYKpNdmruHOmojLwYwf6gn5jolhfSt677O0d1Qqn+QtUMwGvreoTiPUSO9IoAUn3RoLJznCX5tq5rk1vRwaEhdC6SrZ5tSP24UWouj5z3n2ph0jKFOOj/G68HAyjxiedQBSMjn5SjFdkZCEUXoAvcXtQqHyhNUpHO4whYXnt69tUAAgZEP+8heTNfy7nfAGcrOyRnP6SliXCqJlNKFUL8XLSjllZuYaXq+WBjhaUY1mkD4e0Lx5oYJptVVZmrKODGub9qA+qBnrdS8ytcrdNfUOr+/9uAeRmePE4a8f1nnqlLulyjM6jPHi3/Z7nE0BwyN55JFWwLWUcMe0sg9JRZ5bC0zUrmDD63BnTgu62kGmQr5kC5k/xdwCnziLW+KJJ6onb9NZ8HDNBnJLJfBMH2Z+pVHhPPgKQO2FhtrMcCfcy+ca1AR6ilz7w/YcZljtoHoQMGk2owGHgHZFdVkPOCVJ8ot2A40qptujSDU6ZTOIiikUUspD99xOwMI3+4EWBU7xkXhAQ7ABvK/ckdGh4z6ITvjGAD63qInY8iaMwb8t8gfcrFIVSNWfIewyz07Mx0rVpx0YVgPm0K3oZtZCAtaP4Lyu9slweUwPq1qK0SwfikKfSNEga7KKPHJk19qmepbcdYXBpnceM+gKXmGOM6ymUfxSlq2GM5mGOwZqcFaZV/qH9m3TCI9uRqA0+OmS/S3sil4O9y7B6SaP0jcBMNuYrEyJIWH1TquWpBPAEOb2pftGslp1/QFUIEEXqOSZagIlnykjPSbX9LQ7KFquzJHLmWq8uFMecVta9VUos7JnRPBYAqQicE5V9kXeyIIwvrSCOaAsndD92C/6aNQ5A67v6rw+6o/IpWMxTvuXk46U7ZGRWxUXxfegeQKWqQ0HQC1Vxx95NgtHyNkmgVmx8+ThX4fLM93r0w6IquHR/Lz660CTzAAgs+pvb9nliiJ0NrPCgXK26CfIvABXb/X3WklBWO2RjMR7xZhPGn8WyoPlCAZoQ+lAmY1qn9sBa+1E7ef+FHGWEx1nzjfRhxDbNFZJpHMOC06vB2BSaJC9J9OnnWY1+N0fyo9x234n8kd05454CpErJzHigUfKy9Ryux4US7eCj7GJIdWmeqyEDtb+C7oLZX5ILe8cV9rk0VkNjrlcfa/Bh5obfhZP8PRWpm5+YQHD4Vc7SraoE+sKtVCivO4arWU/LxO60X7uQqyriQAsoeYUOzlZM94inLW2PHP8ucfq58GVqu0Q/Ssz0HyZgIWZQVGrQc8SCv215+F5OZWXeORy+S7EM98M855Sn3HrHM93wGnzPkDWMpb6JTK/mEjMgsbERE+Odhux2YE2XWtCXgoDAoS81RNsQrC7FvU9P6UWG9SEZaikopnVjopAYO2vfr7U3v1ofcYw0ppFaEXI2quGt2yo+o2hVVQgg0FRu2TCQ2+4tHqOv8Oo5UsO/+Gl+j/0PVsoOMFGIWsdq9Yt1ozlDpQXPM8fUJT+R4e34kouAB6JKTdxFcjy/iiTuuZycLLwZw3LE0b8F+RYxTyeWUESEFw9fglAw6Scf0yE/kGuwdgFlKVvEO3S/gnieQeMafSJkqhpfRF1NYCdbLbCqJG1lxGVgNgjp9xIhYc66buB7oYwtDXnKjveSnbits6Vc1dyzgLewxPRtfvPJjmmBzBjV9A21tErY/toLdjJFHsSRo+KY0PNzh+2k+qGjHrdxWUMbOV8b9F+dB6yzrzBJWTD8eHt2PxGvOyqJ74gjGIW7GUvxlbo5VrVaRwzDwtWG9WbMXySXx5C6z9JZiPXlMpFdAjSNTz1781AI/D45jC3lxujuSt615LXqC9ufBWLrK1ZBZOcNpNwDXYCopewslJcMkXVC2cX9kVInsd1iT0MSi7RhmIkRuYljHqPAqSDoekLzbTcYkqOyIbzji8gvCUn6Ymg6QSM7y3LZuQVrt/R2SElhcqlCTkH9RPZ6EdXQLax3y6lEDBtzewFsGqcZyoIv7TLXq9ocyIbdMlRKErWUmSmKnZy5TRKuZv8KrOrTPTmi49gz+VKFXjqzuJwVvfytjEYrxoO2TL5v1brO3l013Nw6ieb1GNTyrEnkc+ac5RuYp4Fd5v0siOyxrtWvvuB4/3C/gezCXmmWrgyE0eyvVlZkp5PxbR8NBKj1Orad8cesK4YESqIIFZTEb7zOTSK0uaJ33Hmiuc9Rc2SG7R3SwP2Y4qOg6wyLfq6sFBld1Ky6YlS9y7GojEnIiWw3G6VHW4M/kemQd0mTkoyCFNLVDZEbi7PMoJdqToKmbkFUq9g924q6WL5PanUkIA6w7IqW03Lx+7dU/Wqn0Y2F9xizfnR4BV5j8LtVhitzHLPfrtn2QdjVeAh1E7Rx5tDKUcJTfYhROR2+vG5EeOZSn1v7Sr/cUKQwaoWWKECwrE1MN8MKFHa325ADwcXeaOtWw9BVyGgagHGMRMJdOEkPmNg9OXdd4VJOWmSUDL047adBKm0tmt92UOQoAz67jBc5MNvvapphhcNKrgN0N8FoTFd1Q6ZZnep+UQhiYmryTfSWCip5v/t1JnxL0NRvTO2Alztp3FKOIDedCEehIjpBwwsxMwLl2Z80pcYEs6mfgYe5PxpFWIH+je/+J1MIO67Rs9jdkVy07nD9xgyA/hR9o7vv6/K9YpBRrHt5XE8OstEuZYuZ59lIFnL1GRDih5jaI16m3JoPrFChBIJNzIyE+es5TZVsmapwBadO3Zwq8CKkPdqkiL0j2x5TYnuq6ApSmtOKqhtAzUkUE3hVJtaaWRoXB0pW9v0AY9XOwZwpomA6cm6gznfNmSZeqe4y4DfQXL9MESifRuvd4TNV0AghsCtN2vTPrSzzr9zliKkQ9IZFInxekAmslvqBBp4rK8fdL0goTQA6LTdEpPDBEU3ZoFFELTWHwE5UU6d1t4HufXuP3ss8p9z6kJ53uYu3dr56iMeLWFhu9GnCvsxWgXgpgEPMUZKvPN9GSYyTLPuH8OBc26T2Fqc0TNwxB1bnh5k4qgRjTqcWtkeatSTUbIHwssmC/7VJpmgu4skhzIiDCOBomXP8V+sGH1t4YICzKhPtVrIz2rfWIBPdNVK7Z+P+lgyfMbBngY8SY4ZTEF5F8okcdjZokyCtLjzFx0XlKwSBfCQQA4Dwzt13aOREDyGtgt15c+0ZtLia+O6ool21F++IqReQV8dwhSmoOUZbxrLFBrTyxyajWXz/VDgXbU/Ll7GX0i8AjD9863030ywYegOFhT+3iePgqYnbF0SMHkEpLifQwhyy7Rr9zIAwBusdLc6+GXAGCmOzSfon4vl0+IYs+86pXIeG25BV/NG4ggRkFiwGcxuF/MdrEuo6Fr8CW96oosBBOieSz6ScUs30kdl/IPsBahVB4x3suaBkAODIx6tng2lciQPt/AQLQTCLrs/IN4YwhBvC5Qx3fMDI2/KkTppIuTOsQOyHm9tKI4FQcspYrD/vpGIbTtww2KEsYtjp8gSl0zn9CsugvfX7c5zQmbs7OXjUXRWJxMXTsga0bN7MOXw6VHDz24WZbqczu41V+jmuyEfTBcSZGb3o3hT8+phpc3LbuquogVut1HIQHw4DZhPPREfMyQRYZbPGA0q7DDkkstXEZzo6kf9Bxk+gNaOKzuPfjQn1vmjG2O9fPENa1QZaQO/+O+NUUWiZS0KskDUv9KdxNKff+kUrcqRFOeuwS6/DQmSErkS7EnTKlQ0TYCDeLXAhfGpckRXdIIWuOwaVmOTpjF1xfT2uqPSZ7El7CIl8SQE4nyy5mCA752aTzdw9DUPE2mTlaJjkpWviuzMfNK2tpoOBtdjFg+u+qPcVxVt2nZwOXQ3mqpuA83l0n/N3RVVc1iplnZ+30PCtrAXZEbmE1a700QbK1/kHyy6RuhhjUkST+fEHLWhuqar/qK3KBmJNH7LARytw6iw8LUWlI67HXIzAcbZ7uOwOU13K4oSYYbgNCFGxhkeZk2xj9eAfa1c3BgmdL/zO1iKV6lVR8g9Fn4WFo/G3/o/xyNzkU9zRbPUzc/ETTKf+ZeXNJdVlG/e/m25ELC+bwCf7ixvkgYzp1ktseVf2SyJ6XebObq/d9TRlXAolx7O+twfXK7lM7jkPK01juH9+tQr/ihibQMv9qUNHfcgnPDFRXAnpNIpR7DUQB897Q4LfrOCIosNRyp3WalDW3IHvsaxyVAVwhPobIh44+ncukKdYfT/WVhVuZ2WnxNP1feSCuVFLlsPPibPGXgcs7jzIyiAmgkxAvzgvoDluQMWR8QguRHq9zf/EPFhKPwCTZ6vv7KB4RhSc9I5ZtYAAgUVk+mC6WT2+lZuWXJxyVAqDMTup5iHcX/lszXBaiozVREPSDEnoVyX7/hanBH5+NzTc4CjgwYA1sDkNXM4qGlqvY0GNEQPc4EU1s3SiRjIQm4tHp5VWvxyDikgyTY5mxeQ7UynuekNiqaT4U0Aw7Y+XhvLKQNeujIgBEu09bIntuYYpGSB2LsPhvbey+yRTYuknPpley3ukua0ITrLIS5+SVk9stap7s9NdXB7IUsPniPRrD8Lv7+FkB3jPlDUgoIO9uQvzR7SjVO09GKF7Pn3x0yDuz4UFEJ+58b4tY9AInWk07O9azxKUBr0VRA4Iwoqek9fdgPC/ChVvHMb6xd8YJpqZJEhcZW2opIVI134E7BvnDgG+XfH2zru+4ulAzQ/9Vyh60l1OC8KcoH2bJNDeYKo1I0cXN4JAciwoFIomxhT/7Q//xbjSLflfqrmTO90tW/JxdPZiCp6ak+KUArOuLqKeo8pDadzrmoMKG0bB4hB2D1RhH0Id3dAyrq9nGHbmdePaa0idNPWgtVx+wiwwqeTuoB+D7fSi3Fr1czJvZAIhbB6vpJ6q+40Ow1aXp28Q5rsh9qgzfDpZN9DA8wtrdB1mdSWyYLeIe8b1oyeMFRIyVGEiHI2z8tuhfENLmWt7u7Mcra214Xak/2GzE43jnbOh07zkf69/Kdb8Xnz0CrCr17r8jOJe1ZO1j6S/adYIcrwclJ8sjHgG2L88RysPS+bY4QzNwXZcHNS9a+8iYKLvzfDr+64aFvSFpP3N3QlCwx4P86Gw0OEKNkPD1uvB556nL7zaLrWOKGgS41GiBeYTYKJfO+rVgr2TKEqHPAdL1xPiDBbBR+1pFEVM+MkaguBFvj2mvR7CoPSriKKcXsYhh02ly+c1kV3wxu6xDIuVcY9Pcl8lHJVdvIhIPuJ6eblrIoR85CraPYtaCMoV1HezN2nkMf2BpuFM4u/Zub/FOxfMvGH/8WrG1vejA7YQnkZ1nouuCWU1M4ivDNMnO8iCOD3lv9+KWYakw1qnRiLjlHu7TKM+ecClyog8bYNw17irjjz1nffcfe0mda7vx0OX3bz873LzmPwUKYpCBCOmbxC0ky5sSNVXtT/WoSsn+pJABFg3a+b0nzicPMMepMEFgc3Zb9BtkxoXtwWTkjv0LSgGiyK5ndxg36GN6pUup5STcH3laXhUEtJWEWL5QzcovJ2zlXAlY/jm4R2s2dB+BUrOyiJgfjirtHSt4q0PAD6wOojcGlbu/YGgNycHodxfdiUpNQkAy9ntwE3WgYnPMhdr6fkHzecapFAd6//b/5OcvZu7gy0FTpNzBpUgcKONvH1+l6TzuVShBTyOvnbtM37e4jE/2gBhrFUDYNgExoGTwEmtFB2a5UcNDlLB9WN4MBGyIIG5ENq6HRfDj12TGsu5BCs/uG4+pUtFjDxIHjgwNexf8Ojl1X6L0qWkoCNr5Gt+GvEHyjEoHXTSWhTpJx0JPtNPk4nMAffAqJjmDrNcd98wWRdrmjOBgqh/buxjsFkTbrIadCclGYlDsUkofLVlqzyMS+VkI3EcMMyOyNdUj0kUAaFboA1VjcmBIzwD2iC1MMi6RnYJf71PpufI4ciUrh2m7OcREn9NDEvBOcMTlk/0ZrMhevlQmojU9qyjO1Owzlnh2OL0EuNY7evL6bRaWjWqTyJSwyhtV09h48KXs71pHn/nxqyYs41BzUJtD3OyrYn4ooeddlw1VP41YXKsnccSg7GvoX/AMKwMxKH56PvPjAPSY1VO3rm37jywb+uWVwU9CnFXpEbnsP6Is7gU/cKo7N9EFt4ILtFzmtYtshoexK5L4Z3vrwSz7nJsadWXWKDb4YkYMw+PZwTTMh6HKOeqQ6Q2834kiHbVm/MfbTeDoxMsPfPqgTcIKaXGm4d1xVQblMvyVLaOK7Bb9tMQBHDTpIigqGjGk1kHwyMjMehL7hi0dOIWH9zETAcEdOLomYcFEUjWCHzX6qtW0XlzJH1aigXr3sK1F5MA0dSqVSnU7GJa3qORcFx+apqSwYUouhmGia8xzokRwEiPV6KE0vox7+I3irI5lRXsEzRWPLEVBjGUfbhgm6YetWCeHpVNCvtQ/pVPEj5kdumGxqOiOaL7dasagGvjxZfwv6A9Nv13yL6MoR530D6b56JjEqRdj4OQ374mqOr+XRSf3FcvfZ/FfeqiIPt1JQblkBko9tO4OJZNdSjbrOj07Bb+YDdjIcLU5p/i786K8ODkfyZ3uiJgWQKjgfoyd84wEAJ5ZZI2oJyVBh2zk4gkKxRbOKvRkV6/sqKQjFAoZMDeDA6nJxPrgFhXuEREZlZ++U1mgL2QzEk00qKjPK9fbnizfizzLc490jH7n4zattr+SD9YS1lpaZ4hXDl4icR6sacwZM6VFj41DEFm7QFXHGe2ouxNv2uEu3IC+EihMAiloJvZkeRj5srXcnTdOFYH00t+E2mtnzkInGALfdSyYavyhZhzDzchpBkwl4VIakGBopZN4fjMQflpFhEoiTSh+ShdWPc1uNGtp2+YFM0VadmYerOoHMD0vuUksq9pBivO49Ixqt4JfQS1WCBuy5m+73CKbOLL/nXXWs/+05onOKGSOBrhvgKTIic0mCCo1BrFGw7FHPmMgDMSEoXr69zzTLNGrXBYmN/JFjhd43mzUNt9me8JrOqpkDY4at5WcS0oi+lG4ZIEC22ZcDcKaRAEvsmirkRMWukkqJKBJB5XUMSIIJ9ky3n4uTkXGMkFOz9zlNf1fDYeOOhi9UQixNBKyZMD7rvaq1KAqsRkEbqBnrql4nTyIFqFiRSXANVvGc72kAAIboPygP0JN1IAVMa2anMAMpCiaZRQsHfQESKKLozQteY0Gx5dQFtL+Hhn4UbsPpPrUTTWVUhRTGYgmoLiZQ9Qo2+EdfvAHg6Bp3qf+Kw/1oVsg21mh7WYa4atU++JB5BMg005hWRyOWQhe6x0shQ6eRY9xI4hKw9O7l36A4OkHNUsVKHfICLOyE/WAIyrNAI14ORV4cfxHQSw/M9ioR3DUVnOSyv5ut1H8zlzzE+KY8sYY24KnuBbGNh7yX5jSmbbtRNQ81QCDbYkw/MGFrj+HTBR6nRlmWlxCJKnwEet1zHeJGN006wmchH5lkv+KOuobtGnJWUEgkAtpQCpsw2F73KSl6dwz5jPGJBKOQcy9Ow/fc1KX6ITzSSz/TOYXpTeh+zCKK5coitJ6CHQ+kbddUnKcFaMHsCi5pGxZdjizyrfGeb+gG+VIKNEiy1YfbQk+XaG1QVctIz9Nx6uRIfIYN/3ipRQysZdpU1Re4fDwJxXZ3ZcgipdNLJr1hJAXEqAXq2gdoqjSH7J5oYV/1L2waL42Y15/+CSP3WOHcC+r+HSETOJQjCTPIMw9cdcZTX2YSYYkDEpb4MDiuWXNK+9RENtA/VQAc07vbtrWP93aL/VoW/a/3gq0iG1JCS/gEnl4wcYpV3TY9znNmijo0yllrHGckbkFDtvTL0LT+yQdaLortMkPvUHJYmhIKyR8lJ8BkVmn4PvnYmqg+fFjrHIO2To2X2J8S0B/wy/QqbYggpxhtVrIoqwg16KaiXkKbEGd49Do5bsma9hl5bCI/iryEGu/tQKq2ZB7NsSBvbIcsvlFDcwuablmLB6qW8UT1Uoq2OsNxrYe9kPkF8Lp4GjpISdKSNUh0OHBV6LnpPedW/QDSKfA5UwKLE0dJxQCvsF8REjoGNuYNsPItO6vBn7wMR8xyHK55f+JXqyzMLRAN8cPc6OYbEZgycvsXFrPava2t4dO2h8qqdA0P3wHaQvmw3GeQIaifvWycLY04iJGf1XngUlf/d9zEo+b52m32D8mEiOycH9F0kEeCWqak1JK8sQOlOeA3hoUceJt750dOm6VHaFyh2DSZxCO8BYfPl/f6spipjvrDZJD5NTLSr9HtH5CW8kGkqJvWId2RAxB5XgFrspFxyp3QjwrgXSiIRAsVAut9THgPmUKmGS8vUt/52DlOeSYsMHriw8OP1rfF0Fnkz2QMy2Mh+gYphbT3gur4X1t0Wcrs7SPtqFEuHWAcg/euF8ACiidwp4v732KiAdCb0rLxFnDQ6cec/+/EaqE5DaaE4NHNlpXolvQH5IdVoP3o/L/jX6xAwxOWNMtyz2FBgnWrWAbILjSRAm89SYPttXkwFXkrnS0bf6XYMdZFpy2Q8upXDlQTXWgwwHSZTMxAVR9NnozhmyMGklHWfMh1YMIhogGFQmUi0Yet3tGKVvVrYvMXII4x+uc7kmK2I2AdnRL5l6DEEGX5LQZ93OSnA+XrYKwcQRyrSSuKClQgv1604pSf/VduXoHKNtKFXj/Ntc5Ka4zGdKKRmcpoOXAaz1ZjWvTLKLLsf0QclyTVmDQwZo5GJd4BCvyPev1cf/joP45ZCHefs37YiZwPLXISbDkEzTakX33fTyrvzX23Bmi0YOa05ONCB9fJk4HAQ+9a/jo8OXgv9erQ/1CXz+nR3CANV6zhiNlkPHWH/puUyIwXobZStFINkVD8t8w7F39YBMK8ZJ8CEYINIALHOzFq6C3hroU3AY6UESTvwl44I0YCoLr7hDgj/WN4n+wINqn0wr8a26mnVvf8oVoG8+ra3ZbXHH+vFXgM2gDv98PE0b1tooMKovFR+mSrEzegckEpjhsI5kVQeVaKvy4T6T7lQrH8J1CYNdYsuC5kib1KGbaMVmCdQB9qwufgLpgs11BQzozt+w7SRz4+zO03qhZhnJEfbAHr0ty5rp63bhfo+FRfH79t48P0kUqdojNXslTOueebPEEWnLWIwN+tuvH387pAAiZEzHv024XrSnR+SNVT1DYbiG83Z3vPVDR0mmjdXVBrVEfeLyUqnNyvqM6fYJpNTFKacNtrUCZ0dOvfDybL5m6M28HM8NS44adlBPvoh6dNBywO59M9LOVkGIUOMRL47/1lWBE8+g10MGGxUIJuh98c7+XtaK8lmG238i8WMxRyBT6HGy9/PDfV23wQrl3XK1yJLXEkS2dmq+1cTS5FKmZpVNM20tMovympEF/ftnLDy85j7sichhdsq2ID1tDNvOiAG+THAnXikXAHLVEJmZLk2crCh4W9+6cILR/Y0JX7pkl4tkEm65Mti2OFBBEPzr9SIJaEuQVSnbblybWlzl/L9rX+CTepdojQuUzld4fFmjfhe2oQjeeOlrk8FOwsfdp03pqskMCyvLJOx8J3mUFqcqWK6NT+yY22BrENEWkqfY2syiOGLbFOCmrErc/dHjGIJE5o8ReLe/uSNMeFvqxKFzQIfD2wgBFtb1Ovy0CXAfRLrPSsEFzS7JnOVCEmdzja7yXDinVmei0bTmjdl8T8wmSsMIPiHj3UPShHCa4xoQmVPlPspjWDzspBCie2CEkFnSWn5BBvR9qWSgRoJD/248fR2BQcPxU354NrgTAobXcOJrMjXnUc6kolptfGQ5UCY/WxnBEhP/SDntDUruvxZ62EpKBXl2gC6Sw+ry3GpDPC9SfA7yYfy68ttC+2XEqDP3IF0sUOSyWmswHJMYqa9hv0bxDn8fBzrgSedj7s0eG/Zwp0Hoxnl5RFSlO8nL9/FcUzMlSODC/61uWMCldkjpFCryOuocskYVy3ngbf3DuhWF6wjLjFSzwyFGW8qD6lD0HA/iBDnxUb+0gHGF+QA9JzsUGsmkh9UJOKeG49AxKRDQytNAYZO1Lqrv47xH/uExTAwKDGNT19WzcyzUMUfF3SHCuCaca5ctIuvnKbRAiBk7ij0kRz2ZqcB7qreoE0aUBhSC0pugKc4yRzcv7ZJ4Nw4XiCxAZtjNoGE126D1Y0XSj+gVpHmh11xsfGJW5enx0lejPlbzH4KoR3BdXOF0UACP9Cblrk+GVprRi8ssy4bQfzKamzkyIwtEeej9jKuldibtGNv2KpNCFwHDMO3+WdMTbVVJXWqYM6JZNAENCz+Jk1meTWVGQUT36niMHzg9pXY6y2b9hj7jsvZhUOj6neMmEy3hiZrXZz2dZAVx1ETWYBh3PHcTGpKSQasXpFFJUnUAQNVc1XdqV5k9x9TVrVkTYChZjzWR8TC6mhTqFZZsfIC9VlxT76PFcd7RC8BSe1dY6q9Osiepsj5RYkAigcslg6spn7oAAjfs9e2DKfPUzjdQezkMyyv5d5ODEeiuXQeI3DRxB5dNRvs7Xzib7Y+54reZJ1e50oX4b7d3goikJCTNzS3y7hoT/FcBp9nJiOygeGshsU1KBijKxoYNEJqZFymgCJeLUTS+IJ+xxxf1DVY2tHwln5UHsC5QxGH4t8kACIvQE0+tePqNb2L4Qh1PSy829UhE5KXMA6yCxLgb0ABY74gWHkvAEmbAGUOn19ysdWSwcoe/5qIKM/EQG3Xglpnekp+Zs6lHbHC87hxPfFvE6AvdcAmjpiwaOMaQeJl/8uDVtBLv+WihMLNWqAA1PSB+/xrpswWRjst6gVIm71hUpm7WP+RDgakC0vhnNJRpvJHiHgcTa9Aupwhw7Xx9OoMpeaNyUIz8Cv2QNlKV8hXkr7YKqnjfGbD+GuYcodwoUiGq82sv55siek68aXPMYSq7eLYXN2RASEYIjjT75VxYlIKOWA748uqOIrzAaevGwbqchJr03yITeZYqG4Jlpv7UYv4h9PisU8GYbx70fugmMr4QzyG6KdoPYLX0UGcc+pjNKBtiFy57ZEU9VY9VmBz8xjLApz3NOWDgdDU353nrkiAi6CzDf7IrciM0uzjvSRx77yJYn/0ROcMaYNV0ZcPWbXnthO6/AD6ofylEK+iv2rzPxp1Q+cbLkxEPbXj+L25WAdNd0WMbxw6sruC1Cp4Z3MGC9ZFzRQEh1OoKam+caJkIfwb588LfuTpFG9jbaJvVRKSwusV9NORyumT1q8/suhl/rVmHuhgGqBG7Z2/3dpVhfJ08jWCtq04UJyrCYzJ/GJM8THnhL8hnNoB2AjysE1CA37l2BKIOgZnE9OCDfTKK1fL+p/g2NbuVmr1wnlcNInIVmgBNQEuGZ9m5AXhwpcPF8oX5/fIXaB8vQAAVNO4jHMxhtLOFSERWue5IZnUd4v6BwY02IEL72+nXzZUzR1EfcaEp9KV8KMdAowOnlUQYk/6XbZCDWyBWUDqYV+WcZ9X9KNEA6hGPQ7wNsL9yqlbUxb3gsyABc8p/aoEcE4q4e0c1rUpxyRkvq16gait+9fTEVOG/AkozMBoqcmD3wXG4X3rUPVQg7xYUWQbH4pl+j5jyVviD+Ek2650mmP4bA4vENkUTIYVWOHXJ9yUT80t1HTXLS/shK0RA7yu27fH6aZXSOxahA7B0kuGNCNIwdArN66xrXjYIk+sR/tUsTRyS0CxvZ5sZFc0IcVAxF7qQIPsFJscUYmyd1fJ8HAP2Z0JNQjMgVepw5lM3jinmz5DxbvwRtjaShLIcIHzyVACuj0OQcMDcbfqzdce/SS5wE/2AQ/zeeTFBC6PA8Oq1W5RGLswuHA9Adt5lVyvpLsDgiO+mUTAI8u87g0dP/HGXQAtLHs3j2nlGAsxes64L6Xf4HCoEM/Oq2TXNiSyMAtTCsXmJqraBelCKKpQxrLgbj0B8fOXmgC9awLm4VDJE5ablgEKcs4Kvg0c/h7It0JdI48MifsVhnvDUjejFJOMAZACnspk2znh8CdHSx80ruTx4FnZQiw4JXy79TU0fUgMo3/hbL63VIRErjCB9sQalXO/wZyPhxzCVjvl3ywF1OXY249sacz1lA1nD1jo85jWh4rQ8MBbq/ay+ZHwygTjOYUOjAehrd2x35K2oP8y2iwu8fIQAoOjjNd1lgZcWM5s7jMVH7BT7yJXSD+UAG0ivwl3/cjtXP3DjntCBTO5sg4ttlVgWScz+5kjFxnSgPuKv76DxpLUfUgFiYiKgZt67HXpfbALSRgb5g77+OSAoVGZv0sI2yMerAMuokHCLLJaUvtmJmWT3+p9z5eVuCmAUycOaZPlVeEvoUgFn37NA/uqPjLYGYmD0lWAr6fgi75I+GBAb17iNjbsfWZWlHH9uwtT0TRPZHqe8XEigscK463cqaTPkwsZ2XJFnEto/YLi3OLd2pPLW8GcrGYYEMLiFw/hyWJWRp8JOKQD+CqaMqdEJuLjtGSQKHngwaYg9Nwytl40YcRihRqknXPl7VViajOnIga38DS5bX1EMO3kRzYYDYHMu1OLhoLySwGhO03YxFUqbXtB7cOcNqlM2Zmv49fcq/6bK8x8aLvulBcIKT0AoPWSfTQGXJ3JPBSAVhgDcwxFvBRm73/ma/5ioH/Q6mymQaOgd5pQXXtjOTz695LIog/CP0115BgCKEKhWNAgPfAAgyAjtgjJyB2voe7QCGWnlczK/0nezZWcc8jnITkhmexbpnWSOwII17ozyQX+G3VQhLXnwCM96kT3IgoUFEwHGRweM1CJy/g6znENt9iN4wI5PcsU+93lAiULSqgZdh+H77mHKk2OwkZf7qSJKXeVWdcLdflVlgBM9pPvjDGczcW2CDxC5jfeGUOTtvcmELiaYS6roeRYBxxTHMsXnY6u9I3rg9M1JvqW/NNMpv8tp0dELG/nl0GAHeC1wp1dA8z3vVhynQXCE1C6M5P2WIQl/jHP5q0VlBkOrvMPprFcr4e5pmdcDDyQ0umdmBlrOwlZWg3+qPTMufGC+jZYf0KotkIPDDSYoCHMFMyUml4XVdDtt3hF/KW8nAWOG7+K6JtVOr9xAIAaFIMEtXjM5lRT9YdSJxlhtNFRpRM7cUJB1oUjMeOTjfIHdQ7JB8WRDSnqrrfPC9Bqut7kD50K10ZpNliqb39WNno3mi6Ka7JTCtuCIHtmhL9K+g2peJU3r1ZmIBaNkU0wKuZjZ9I206y4rOoc4LyYEYHj9mBDDp8F+MnopJ5YzjmyTQM+ZzVSk3YhNZrO92B2JJda9phw5GaXyGsgHG+jrE6DTlvMp+j36b03W8twhfEh15ur6QofIHKGnT6hU0u2o7ayfPkGxWeq0ICdBrO0GXwSjSRLTKMa4UipG/L/bWf+7WfYgh/55/0h6SMY0Hn6/K7gVFoK0qwlSjy2oIAW+dNLCru819+phXTAWPsi80L4xPeo3zFOJh+H4sijv42yR2bOOEkxDpd8hYmu8kAgSJ6PQ36lMjbTJOMNT0saqBgZIfE0bK5sw9RGerPr46eFAnop/6mdf9DHDCafN0d30iKpMAAs1mlipn0RQeXJtZ8Pp0m/VHzyjrOZZ7lyEUUcHzugvzr1+2me3i4lyiaxKkzjBmFkBJjvmDmHHAzuCkcmKdV3hq5cQ3dhEyrV8Y3LsxINYslhGAq8hU8zVae1IBERss+VZEsI0Y1cXcdjHZzGTNwnTMtowPGOdDT18asyKRu7JLgOH0Sa6hImkAs2loggyQsDiPy6hZXZVwpGJvf5PO62l9HLT3STEETWp4dsBXpHpp+NWLWpG6lPScOHU+p9xYmzGiB5AiF+KiwHxDirny94r9zt0DAnPgHfZiRUXJma90+eqElxsSTxCFabhbuoY3T1nKS2g0EfSVBBFYqP5neUHeVFoLZ4QBHWXjc9KI8RMb3egel1LKtziOZW7IVrTAY5WrIsuJTt11JYpGg3/a9YZ77FrojBxi5dm4ZsNCFB3AE5w8UXZpEINRVvX9MGA6VqsmxN7Zis8A9xAXu2iCnpspXaTFFwwcp9pdyv5ZUsOXXbDOoPNe/whunFK1EioWCBam66BwGeGuYsIjLDEy2ecB84Q7SrWDfKPb50gdhE2anzC2aXe0BedtFHPQQDd/Gf9oxcMM/H3KM0NnryaTeSHIh7i7Mgdx32DWocNO06AYOmSPWeiYOWFDgs1n3mj3iNu8WlGM+L2mqQntGYNifNPA0ZZGV2l9lH48lFL46meNUSk1pfSZ0jHwCLQc1NjhmeVq1l2jbuKqgK22FvS70JyMuXX6s0tzZ1d2CcW2J0i08pHAcDt0nH0k1Tb1ilnsd50PDG4oWWGYX5ceGda/ZP652Tz7ggoCIiN44V475vinVjcURD8tgZaYLN8uORcRgq43y5Zco8DJPgg6rnouM3oKTJpqaGxX9EGsU474+LMl2MTGxf2a8pGsUjcIom4YFiCENabF/Nh/b1S53A6R0qz1xZXiEVlpt/1j87OzlnBbUzXcVqpJo4f88WIomNzUFUtepHl3Ge8ME27qQPpD2mlFemJAn5jD4+S5dii+A9TwedEmtIcJHQKHT9R0VoegHTlsMQtIWRLDSBOdxHe7bc1yLiZEx/ugLB7L3oMrGMAGbpuORzKCF1JSbatYh46vKcDbhBMSyDxqv67qnloAM1iiZRL13YJuarXeCDg9D8aBN7B5q5fyMU6gdpbl+Z1S9QKFavUOvPxD6F+EAg/K/nCg1NkpxoczO4nydf8T3sTcY78NnyQuCTbVSxrQWrFbqjx5T7+6oeNP7UJP5AfSd4nP02Jdknb+veLdbnXzG7vku2ZwIT1+tjOdAzY3ROGh4gaPpg5nDA/Duy5136aQoWkbpMRksBThbyo4jwmZcvRiNLh9sJHtysULo6EKpfPb4Gqzc3gTdZlYVqXL6MlNsXjC5ZmezIZXHhvWhbeGCAA7XkO5FhE/vucl/64HVy5r/BiWoVQAnh1WUS75NaULD8S5Qu8+ZUYB2JWb+9P3Vyl18yLVdCa6JCp38NgeTZta9fea5lg2L4E8X/G/5tRGQNibHGgKagg0GG5DX8U7jdgt/AYZxkls/pDytMD3hsE6aeeYHmaiJg92IYjH3aFXEl0elVYtgRL4SO5MjpLxEIlSzv5kkgIx3S1380pmtSF/upyial97kTiRntrF4WDZYX4Rn9k2xZ3vn58xAIe5TtQhZElU/Aa8u1bArMovwjS/fJ6KDGJP7RrauBCKesdo/p+4Sph+uL3ocQAxd0oaBoU+KIu/49Fda8vXcm4mBmdmMYaRJx67w5v3PAi0KiMHErQAK7UB/vUju8Eo6PmqCwxhjHloVQfFSdfCSmkL4axXlf6EWb7LaQhT9CeCk7zBlXAJ9tecPMgiugaVqNK/KOWHXDU8gPYiSPThAWCv6AnaD1/WO5WyU/XMtuK7Nt1hO6RWY7BGEdGAB5T/AvfdSzKsaISQ9HqLIHp9QsYy8fwYigCrZBnzVKpbZ82jjqnea0+oFp5UcI3o2VnAxVBqC8NspqLObLJLKBJ5xebhVQzp+cnZ4C0sDWd2sTOs7s6QSo561YUlvOCbstJjKo1r+TpvcGjDzDdGAW5dz1rSyIcsJQ+pQRFVyNqCv+6Zv3tfMwzDD0XOCCQkeOOCCv88BoYnd9B8NMepCks9NB9FOlbtXiKvrJTbsP1mhsMTSafs6fFiGkgB3vdWJEnHLlE0G+si5rLe335k76dyxzFyQPl9jmKfRj79CfzWInxgrhd9rSy7mEFUHk1oUW8FcXm3+XO+ORgeysePIcMSY+9QcOhiyo0gRF02abJyZT1y0XgffTxKz8nzLeueovdYN2tE+b2vejtiH1T0rJRZUNo7G9mFbsDp8Ah+xI5Ku7McqbksrKwK7GxAT86g+OpzG1C76F80ZdnZnirIw6QvE7OXFG8H2Kt0d63Y/Gkib0p9DNxufMKIiGmMzaV5z+6RrsbPcccKKJ1AlX7rUWOxX6ypV+ivfzqTG/9J5TOO6dZA3kMzL8BlHsOUvltIf197GIyzQIAYhawKkJRVaUply40eMu5jnLykq2uouQrGgj1J/i9TD2NMGan11+GINuR9WgFRBbEbzPgostDFhr7uaWHlWy7Q9x8PIs0KQl/smCb9k5+1ZV80KKvBvY9OdWLEn8zdwVzvxYcMwkJPWK53yohdAts76QjH9jxpAPfuFwCFwZvZ0cIGM5IRedh8RIPfxuLFqsqLO6drTxxIN40Ppm4hszIhjopOGM5ujCILxrdG+QZG5S9M8duDoJN2CYOkqCYpgKF7skkGFRSTgVzMJtyKg3opvUKthD/p8q9upHZhjzsifyKo0PgjoQjZhqZMG0HabRziRVDAUylmZGT0jkssB8Ds8rUlXpl+ax/JRfv6XN5s17lSN/nMSJWJ/msN0x+4ZuVhzCDCTD4dMNkv7RfCoohcOeb2bUebpVz3zd0VBKKvFXEgWrAlrFnuOxn3PJCRzitedCtGw1IP/y6gLIsvTOXmQqSSPDCJ80KnYr2L7LyMcLRtnMLcV/sRLQ5ufA6VkXdhew6PEG9TUc7lWDc+BGSinpuvKzCyNBhJ0lTWnpuz/QbKjXrnMeK6m6wpVe9T2Z3SC6IsKnN7QxqqvqDNdIxwSerjbYrn008kjB4bhjwr5eLm94v8cXCfw4Vm3HfyrXTmgVDdwCp4ATkjHqhIWxgnmerHjKsTsJlDcU6Ca6qRFd/Iy1h10ZrHBCwCK9g/F/fVlmeG1fbeVkeazvUnYZ3MFEMGL9SrZXXXjYJYXAfzY6aJVSkAlT2Rl62onc5zgB45+na1P24RqpXNc3qnRutlccGHKQwa5mn5gMLA+XiTNE8aKrLQDwp8W+vPzJ+gCrICgCWoap0GxIAjIga3+OqXxt+kRtifQy3rYPqLYnQUingLt35WE8U0E/bSlxYwRTT9iAzuY/Pa97EXhmKyLSAFvUt6h0kf3tb7bu+hxCWa/408tbZjLioQzThSag/hJnv/LB0N3Hjke8C37DnXtjeNlQcL7pD8LPzWfkjbne6xpALnDOUbe3Eu7dOllRkjsOTWnVYR4gUsnefh3M48O7n/hMvjQUe69CAA6prteW+9lVq/tkQk30KBrEEUfjQ3o6ApspWgNnR1OtFbr0UEmju36e4oucUMOG7rElo0/t5faBMLDp//t5+byIWNp8l5NkOZqHfVEXSHYLzlNRIaPZOS2u5WVJv3LBQFfG0vgKdVgY6aCGkWw1NwEgRD+deaL/k8NA4v9Kt1E8WrPtsUUByCFaPBtlieJM/vvmO8+a6sjb8F6nHnvyak1KrwPAra9dFOBxPsZ8NUcFK/lzeh2Jat5LCqoRJDsopjeUnGSmv0mmIsIxD05GlG3BfNykykGb955+bDuXR6jcqYW2q2zYQvsB00aK66UH3tIxxqFwRu74AluiObp0LNt3B4ZzsJpssbETvDhTv8asulWOu6Wzjxmy5/bZc0Al3TdNlNHvsqWZv6IG1uXxdRaGVvzU7mlyk7Ht3DoGijtYSAvUWGNu3EWgrCQHaAdsc6Y0QBEThnXspBp91BOYXJH8YHrsPTTqkpoz8XOxQtHZtLyU8Vu7sawetULpz8IfcgZGSIe/mLutKytWliqavgEhZQwwsiyaE1v90QXOvnvYw0XxXpmzX4jTPoDGj34Wxbo4G87QspnoVBGlKN5yLeuLK56051E+yioFrzpyKnjR3fTO016K+bhYG3eZYmIWySBYoPGLhy/OjPWDHEfretSX2KA6QxhCmhNn69UNmkXnedD9upC48RA3E6HfKlzqj13etj2XOWtIQHM7SI1V2VbIin6SzX8CQbLBVblYoLh2X1uo+J1yvMGbSEGDgw6GpWxU7hxgN8fgcA/O963GdTfxYro+3MCJp1NThDK6TfWdR998orupPEGMgax4VxBHWePcoZdjO5LArQ3iP7HB07wcVExMxwWyqnT4z8H616VtVB2KL+mZGLXo0uoBSAae88jBcpo4GXcQSUBwprvoKpPh6KN4G4XkqjaxHRYFRem6ksQUHvAucGHmu2NUfd4R6kx3mpjnA/bXU0np19DBDfqSewcDUVZ/wyfnT4x5ExPCfMh4HcWRx7KmB55pouCNqbhNJm40vYgEHe1gWFTVJTIdiifGfLZt5uxfl7u5gkEuzBr7bV1T8FJNNf35egJ1ITEDIaWSxEHGToQoLHfgT3MevJJ8ZVrPxZMV8E4BCLouDk8ENGfUK9zo6/qg6Nk5LCWcNgVGZq0lyNYmLpCLuG4sRt+K5k6inOt3wRt8d7bu9qjw5dKlhpl6VXQRrsSN41Fa6cd8lCgaJS9ShK9Qn77738+SvXJJpruOPZ/QqgHRgim8bwT6FqOeQSzjHY0G30GivJlZxPSVRHrpx9jGiITMsDIFdcRwLoXmSLrcmfE9ixQ52q5dB8BlRSRHjVes8p665HQ28tjI9Pt6/6ygzrPC3LDqmUaWy+MjugzV+oGKOcoR9nJyJgREFYDz7Q/VwLhMaeYrg/a301+xzz1fEuXOghzqT8I+gzPxlGiTHPpeNcqiPyQprnNG7R3TLLzthF0A0mHWy7EI2YPmVitxqc55axpKjnjtD4nlL6UVTIM5O/bL70HiFTB3xKTk2s9A8U2EtifUU4kK6GkqyDbnh2rFb7s/VZZTWTa1n3HZXjzWE/5ed+QLfT7fAkwP6aQiZj4I3p5rov7QURizaH/Afs+Ar194I5P7MNhDwHEFUtpX8UOJISK+QW172yzpL7OYk3hHf3dLmlnFvzyab+GVFkmX0n5LZKAQ909pcHwriEsW1kyNVf8+n3ERKr1b913Ns1h84MYN+62wmu17TJPRv7imQeLd0i1I/YwZaNuwvcYRb7R7bOLBb85WljHA6wW0Dze2x6DrH9M1zoBljMfLVf1DF41vqV6JtEmVvn5F1zUE/QlZ6GHQdScLN9Gp0UsSRftb6Mkv0D59I2YnkGEubtFyI4d9jNycgWDtzeENVcND9rAW8wqCUPlZCSAMPSK5AVP9uEKbnkSZ88X/DDOq+uOMpooKBOyA+1U+Yx8bqTz9yP4N3bj5Wc9NrT7SSe00A7vX+exVFkWO9vf80nlU5w/7q5+gyIKy8sTNftSZ6fuEPPwnPIn800G+pyIdG+9Mi3KovOcgA9uMtTLr5X9W+ZbMnrZryx9s7DkcghFsF9MG5jfpINPRhtM55QwKfPC0gZA5bXVzm9fA3gtlU/1FZuM6xAfrruTd8l60bRWfxZUIPWxLr28JAraBz8j7NIzNjr3f/HYbtctkA4xZcQ6h0Efhj2YDUtLqLqjw0IgwaBB2lEs/yYjtevkSJOY1NIJ2elz6nWeZoOF4KmzNoxV/uMabASh1F0Mw9i+XCew+nbKEiLqK0gb9GY4O5uFwXy4MHL0dTMqKHap/amr25Kb6kDp1A+ZXIntvcacz6rHQEcqv8VHYMCDgF82/9nUAC0GReOEGngVg5lGI71VwxaSA5SSFBmDnd8MqxEQhiKvdkip1+703a4ffr4qxC3hbSnSEedvyf4A58Jf2g0Ho+WNoDad4tHMHVxiM1u91LI30Gz+9AApgQI0Baq0Da4O1IOQaN4nOf2bKlW0qIblXmGqNSsNsF16mADAwHbdWmX9h6h8caatf3hc5pjpwk0uvK4DrEsZljjqSwCPu0aznQKMIcyX9Q22RfYeN6g8p5Fr5tajVcvsrX2d/5JBTpbLjt0513RVVJaGlO9wABgyCAynMjIZlyRHlEITcsvlFAY5T57HN7B2ywoZaUBcctErQT7ojFEpeMb0mxMkeb50Y7upSrjep8XKHuSqbRCTNpa8qdx6mXbyEQWr8foW3uHLwfg+0SFeBc1ESf9qHRIEsWgvzucCEOs1A0Rp+7ZC9LxLkp73D9KxvOAzZKfxCFJ4sn57Pvs71OptQJK4zFi/wAVRxMPzO6KbzgPlRNAR4fY/beqa8mcvgrdyjPPKFvlSSrv/puiYAF41CG20a+IUlUsAFq+naAA0ebS5CFBRavQKJ/FyMDKnmGfjAErwCyAWqmMdlaFJNUBbXUgAJNnb/Zlpyt+hpMSdUHYASwJ589Ny/CJI0fa+cQQI/oDZt3QS+czAj4nydTd6mOmiU1NVKvRPQf/gglUf+GsrotjdIkseW/krdd+lTLSTAIvPYNDIG6I0fAOj4o84VAkc6uAmhzeYarxd2SGP6olkDs3ZfVgiHAsw4AMEa13df8xbyNVjcTvGO20XgyosVhsu5i5XWTqSlpsMMvhoVioRgoOyQNCmZsfFJi+nNUejgGhlGaQBysZKcqQZYDcnAXwNk1A46M4EnVSV+wu5iN4xE7TiY/g8nYAwp7yuFQ6WXzGfjlHh+1O0uvYHQH3/833GKOLNAHCA7iKk8npPmpPIGnOOhYDZ3YY7zkp0SrfIxIBooXrCAVDkQJrE9Sb6H14GeDncKW0ymeJIMgR4T5N9feXn61wOJ39uWW2f+5/8rOLfAfNdkYyg52qMFULmvd5m7b7NGzO7nP3pGUBQBDH2pVP3VPz9JcNUBMgcSLBhUPwzui0EwJ6qwidzE4Zhxyz8EcWX9MyYqp9E6FHNnNul7i9a7hrsWCzWE4PBbIpqXDr4coeNt/IYFIdPhLIFdqtE2VpsbYg7Vuc4yAYdHEI7IxOpC13RVb/zrPZs3ngnTPxvKrzuBKBs84W0/FtsmDK37mnQ5uPpNenXo/N4shmg0uNFK+Ge4WVm8i4MeuJ56jAE9GMB3JKmyBdD7RX4ZefyiqdPjDTXoth9OKjEfzIDSVSXuGmHY70LxDe85Mc9nSWdnsizQBMnRKGhBRuEmmAAX/Mb7eJz7KC/9Pkhe5x82LweTiveMoyH9WWpkXW/GePUr6ZITWIzmpmTVg3l/GnKDK8w1HVM0nIHgCHc/gppPsttLRxxNpvzBCESSLIpMa0aJtG9Cbfo6azyjW2P39yeDsU6b90H0yLu0eOdT7AKrkjn72pFR+o0J8jF0Z2YJ1SnE5xDOMcGG8AK4mBGCzGSFtbQXW6l6w94i8jqYsQMF4B2/LlS7m6oi3zYE8mtOmhllaH/N2ul0KwR2hLmHADfno3gBgeNVocd+Z9Ir6G/eJjQvLu5wwOdmB2PII0eBaBQj1l7arCmiMOPfCQv42YNiBZB++wJTlLmatXjJzGK1ahdiBB3UssDeTN6D1tG0XZ+u2GTGszNZo7JbNKYb7+41t6PyY6GqbsuemMnEwXkwcuQQMGHbWxpBDVL3UB4qWMauZTzEUp9fkZEIjHwDwzWB7pJFxW9ym0KcrysfgX3B1WwvKRZgqBWoO6QVaY5cbKfBjaTHz6mTNt1uhl0etcHVfhcw2Ye8tOAAq4jXBWXWyEhyUB4v/vJMJCHrNtXxAAh7BTvujHlqPZl2pDOqcVlH6sbQO9IoCzPnRcAPuOuUrc9scxxazO9ZL+Nb3gt7WN9lhtNaNmouV0RbuTQuFezORKrXkQNcrZ3d1yhHdILxOEE2K8Kl6oy5jD/mfpSFv+pNrO6Z0z9DJ4tF1QuPwr0Xwb11GBFPSbn0AvQaIpZRn0ri7My5CVONE2RKDk09wi8ODqUYgqn6m1l41ihPBv/9mEZq+mjR9o7GMqKAH5ZYkUCImAGoL4mkQW0P9Rs7TjMC4FcaZgWWJE1AmUK0VIfY9nDRExdopMBDvRR6MFCha6YgDbThwL8Wcqg4ynIqbdEJxtAaPJcDRyosyeJIIQKcypTvBo2qwYOfsg64ltovmlqoR4h9S9V7KjPREh7GNSCLsnNx/faPX2q5v2NiViVnf8xGsgCJOaAgDQxzCef3YKXbU/R/CvirNClCH8w6I6ms/AQFqgQhIZLfTduy9htUi2nf/SBzHxYCFpBICeit0D3b36b3NRCrDAMfoXUKhYhDdFGSYniexLso1cbZF+6C3HthGKENWu5Of8c3yPpUlFg6eWcvQXzUGVBuSRVnfixvUrOUyxaQIb8XkUAeCPLH6RD12qMB1bUm743ZmuXvIiXoJHL33G7zPqE2QVwwfLFpQuBxqBOu0dMbQzGNYYZGSLzm+vsPbECg4xGh0u4CgErBUzkYgzDvvXT+FE7d0fRZqPVMS+zHICDvGVCiwSjNh3Wq5CNVbgXXv2R3W56fRhU8mI08k42y4dgTQ9yqC1z4BQqoxIImSxzxO4iCirKvGKjnDe12xSDdZj/al1qvjm+HOhVY6Kq7s1S8TkhtUba4PsQiYG3SBBUB7xRa8VCNnoLSVprHa94gPbgKShzJUxBhHBl/ggSA1V12tLSZSKRMkF8phJOD5Py9vQyvkn8SBMjB2fLPyhMxBvLK16c6FKI/2wqLADlxrsRTw0l6hHpOJ5YbOEJ1+AFN9Jm2//dkcHrTOPoVPwdEKz81H38C3AtgmjvR0CID+MmdA3VRZiuVoDG70np4UFdLTcdRHItOXfHuso3IVXA80u96PHLDjYqzqiHfokkHzk6EDUIYDuRjJccsABJc3rpbfCt7w+bzL38KwsMYgRNedGZNU6ZgVaDpqLk6ohClqJoWUvVZ2loifbDS8wH7SSBqLFX1HdxUnnm8Z6uDG5PKP3PfcJ0yaE0Aq5OgAd3Q4H+GsvHlCB9vk1sC3z2f2kuzzp5Paj4Yi9cIzoChzy0aoDyxRi2pyayzsOMDuv2hBVH/euqCoi4t/JsLinELm1EKn7sxTA/NFXKNQvXSetNqOydbT5RswaooNBJrI7xVfyDEcMLTBMgRLh8Gh1GgKNihMC/ls/kzvulrjbeUXSLVIB60aUE6+f8mpWbGNmiBTIcCWjzhdVSFy0D4u2Uzl+TiIUqnu0zgb0gqwMIPGuLPSMcyKImg3Kq/1/Wk1xxoKvInK6YjYZn/ziGp92W/JNHDD6PLdu+1k/u+GZkMXBiclxyxro9it50hWJ+PDQq3weu800ASUhfgB0koLjgSWe345eprsOdydB4qkYft800+Yp66TFX0Bmk3pNXuhc20djf1jKIJqEcCPP4qdMjtpXdHOYyP5rMJ6P6P9rMmeDWoaJFUbgd4ZC+buCWdLaZxbBjnr20tWxUKJ+NH0kjj/jIRBENAyxytmPQ4NjLOU1hAk3rhkYj5UQA8RiTDPLVXLfa0D2zf/0SuhWkGE5QTHt9f4hHU9OYDh66BVpDwdt7MFEN3yOOIzBBCmEAAZAbnP+nTyOcq8Q6tHxRWy2mOkM27Ky9BY2adP2dXiO5ekqsWgS6Ot6jB+WWnSjS4AxSYRiQa1cS2rpKFMkTiP5MhySNJCro27w5jaXHmqBmqmaCzs3ZkBontKDyJRZopuD3GNDX0A8YhCfh9ALE0vDjzrkWbVF6bvMsL4qJjuMdnzImH5j7EjuKIKdJd3SwU5vO6n7Hpu3BoR8tUm69rWU44mz4igVbjOqp8/ai+mS6ekjK2LeZBtZfs/OMaFYVG3EMYkbhMu2c5NLGv4zd0unCgrKRfX/1l9XbJ8m7QXjonRrl491CKcL702e3MaCK9i499olOikjlMsa6N3w1Syy5OA+cOcDSjzxxm1NEvRTdgh2WNLshoBPWX6ItiJqJNGC1JMlOueYM+oXqYtp8ubFUjWoEyjYBMDLaa8yq6/DpNk2nrdouzenRAV061P4+tD6YWWAs6LhYhAwqLuIkr3cQ16hFxoLNtSvzZ0fcI3BETWtsEwsCf0can9EjPP0oKGbCosCHRhQ9Bi/M7GOB7/xLsuCNklZ5MwgfKA7QhPxaHxs2mpAfwB8ENkiwNSlM85vM3ug7Ns7AVj93ZYOjO2oCSu1XQ2eLs5Xxt0EsqLPp7Tc5NBdX/jmIWfPWW0Gp0n2/nWNrulszs3nY0cKqnElevzAdFUR1ue91FGPXRfth2H6MHi7bYfpwTd+ZzCBS5xzBycg25T7PVY9wS/6m2bKGTVhAOQGHn89Te+7O4C18oOf/PBGpVXPMRkRForTLF7V45Wqv65JIjPMm1lg+/L8SWhsar6MO9a7M+Lkkft9bho1ngTPK+0KGhUd9KUOfREbkMwY48JHCiqBDS3awbKjlmve+7MEWM7IUlG7/M0eY++/KK4vREG8sGgXg64b7RW+7inN5qLbmiVhQHUVALf2VPSSUVONqd5V6G1WyV3dNCLVtRPr+TxAIfWmm+mzGNtiAqCHJ8TyAcHYkNlN+T+kFhecPWdnDtc1DIouCP3qS7VdfnvjNh7GRnUKjDOusX653GNS2lLbI4ej1LbqX9EPvjR8pQlB0EyCxqrUR4oZRfknTljERqSpqGf14lgPypf46HEmtbnRTuJVv629ZcHrR0WNb3I6tSx0yqiEJ3223Ei9ojgmqMa1H5qWobasC0trEpYZFh4sen1mQrWJCx5CAL9Jtqj+m8l9qMSeepGTyjSBWzdLECOSsCWJv7eN44zGSU4zX6SZ5+av3dMADDHpOGjILaHHUYGh1DfxhSKMcWbfrLuQQH+bxS99D9W259u1WzVLgBZpqr3RME9V9k5SGMfyZClHi4RstA8MIqI13SK5khW6t3LBe/8Hu195Dc3o4PrxkuAlcHLKR+6Oh8aGZB3nScsed5fKZsQ1GF3+94Tv5z2udRwUgWzqHL/UH579ZkKAGn2xspG/uNE7DYlqGmsVatyznjRqBC3VsXIN9QSWBMwcpcrf3/Uwd+hPS+cIBAqGp3XkFU2uBCa/1H5hBu8XGU/AusW5y+8IcorT7/ndT9mBIvuzCp11/2+/3EiwoaO7POK7eBJGN/2dguc73CfR7ZCNLFxLD8dqP7m2sS2q4wu/y/Kj+7GDugYaXxSNw1nX2zMnPbIMf3A7GXH6f58y2dx1snOV60BQQEfvqaObSI6vtMxjS9+fpwx3psuG08JMbDh5DPemQLR7vx7msVt4JArkuBYagb1m6z2jKyTH7wRj3v7TKXJ4lthH5RXTdDT8hHGxygVnDgThw/w2FhCQGPCbZcgvXnCBsHmij/lp2XdDwqISfAU6PBwGnBnMdv2hflABRjL2xxsB++fMSFVZoCWqTeUFDhdsd3eonH0Bm+RrIJZZakjd9KZOOxVDdcz6cvFY3297HyLQsSNxwR/d/2wFFgs42n4jCVy1eGIAw04gZBQYiQNiDG5CrJRwqhdeKyUDn1a6TkSLq8TUlizbF1jQxlJSkQkzTe8GF8NykRL/qSLoNyybd7MyJnrdQJFsP9RhcknAAcpnJ+yDk64kxtngY4b1FsneMUsMxfc03AkcemaLrzF4oRzvfOnqLowzGCjA2ENSBTpkXbQnPs8CR8ZXzyPr5bMXwwA5CneQTWc84ZFQ7YZJ3aoSQTFMbNUs2dTrIVskPovyuPS8gP4lGroGg7OjsJ4k/OQZehwaATJ/4n/bXQsUdKNIZhGhrgYpx+tSkLmmzELl5BhFcmAjFK0IvZ0tZjtgUHDM3Yb7eWsHiawUknTLelSBsE0EDz42rnTNBumqPsZ0QPMQM7qM94HgY75iYLH1XryfCrZLo4HGDHWTBLbTgcAhm5QJtdKAocjLJ9egbFLM5/bKX39XpchM9etYgCF6IWkupSJCf5iIEVS4WPzrxcTCGogqflTE6lZ8Ztb+9dOydKgbcECVrNaAuRQimD/uZ+PIXi56DIprKxHh0h+E5NCloHPK9zjkp4aGPOkQ1QRfdFoCXoumA6cv1PpUWHJSBiy5/3xH+CCoeq+aakMPTaDaWSY1/7QSdcgFyU1lL3l7qvmV9KSd5XwaGGIAGLGxEo6C/NzpEypJ4SANr2KvzMEkLbmUMiXG4thFbsGNb7c8COwG+6vOWJCz2N9cFye2Q59PMy0CmpY/rshxOHSl3Uq4Xp+SCBRY+LmAeuKoiHbE6WkbEyfSE95dyQfsuA91hruyqVahmSGcbUW/Xw4cYrDx/Ynci3JUY+Dr/0jOMrAMXvXFRgq6UNsQYvYOOx4nsTsXI3tCIoy0awMZFaNt7vu7/R9Fg1/FqAFgkSIPRAxox+6w+f/LFRthN22mt/sebk7q6seM06EprdpfLz0+QMJKquBwFkmwKeG1VfNW9aNJid3fH4UIYmdJVzIFUhhFSzMOGILq1yz9ic+lCin4hj++RZawqC8r2AL55YGZc6sewoEQHlkfsuUaJ6PkysZx8VYAEiFN26wNfSPbNwQpaEMxt2q1QX7dr57IrQt7MMFQOChqfxyJxMXUecVZ2ww3VcBT4N/YEBkIZjvJ+hLsKsMDiSy2RQhfkTXsVWZskoIK0qjp44+8/9w4fKPFOXaHsNARWuJrqQXoqqkggmNG1h3hnEfinodmtSAkzGVTw+tnB4EgR4v643vBvH9FfhXnTdOe+HMobcVpr9aOY9mgIydotrxonqtl/n3UyOLczy13RuVIyVdx4INUm9nYccItDI78o/KcjypwZB7QBV+ZlUASREEOz1NawCK3zJlZi2m2djy8zSv/wp7aNqMEX74bDOtc6jqQqAZcqTAq9g+vZqYqkwDUVnLkmRGVrQ/ZdC7BoMtmuDMTXwMDzPFT6ufSSnJuYrCz1cffW+jop+RZuZ3NvXYibFUlnLDKj2BD+U5ujiYS1/I5ltb5GV2Ah7pqWFdOsTO9mFgIc+Vtee9EueIb4R+z20BNi4ia/EKHgMFQ8pcMi/Dtdb69FlgSHnc0J4eG7to3me9ZGQ30G8Lxnc4Y/Po4kDdt/s3/Tl0IcoQyBtaMg3PKWYyoDzHPTHPdIqGVFB8Fk+ynGnN8+D1sSnyKdeZWcupEkul+jVXeBFNRVRRZfuT319TRZ0uVNimtmtUs0tJ1EjCy+tv28tmEjw6KxS56GP0o2iGvxSroULBkODBe7JCdq1mgN45sEmLCnvqASCHF//GtBjMiBGmETQObkPkoIUE2tuBMfBaWhyIaaRTaOgdpqXKI7fz86iltKVSzld9dEw5COpu/5OcTcxnC+iip1h5vBmV4dJ7U2TvqKlGcM5TakoSfNKTkG+cLUefqc9ilXle5xN5COXNsN2lzbzMkn//ESLahdezz+7HBCmXob3EhwQq+GGZNwjGkMed5oFpEO1JRzLi/v4JKZeDBFesmJ0SaNdRJ9oJvFjz2VO5o4mqbDThYS6d8Pl8kX+OVJJ1xy2rWhQl0+FqjhlyoPNYl2bCZ9Ms8CoKDcWo7zqNGVe4LQw2qi3BUX92SyK4EXRMMaFjHdpDgudQB+g+r/G8ii5QeGt/qvpUL4XzvrYLTrEYTBxjcZrdyJph8SyZsaNCt7qgxenosImh9Q6V3l0O/US0pUwGGJhU+tfATU68xNcX7xTHp0aDHdHYraP0wHldnjKKeP5QrNgh/a6GNUUq/1HLI4U3tkMeXY/XiHMIWKEBcBcL+dq+C2eHCXucOUkVq4lh4145eiI08vdL8+jpO3OTf38vnQ47jZ00ZcXb7+KoMVur/ZLhm+VM7Ju/JK/T+PPyCw8AsLdc7TB02Lh6qDe8OUaT4PIJ4ngbWm2hSMIlO1/pan8r0492KoCVAMqhmgCgPdbXuapoZpyLmvY+vKw3GAoquhgnEMqEK2M0fh3/XK2z5//9zxnG6myfvlpVlbjHKRFbeJKHJLTW5U+2mBi74WiZobSCnzPwmohzH34rdES3tJTLbpySoOeD7XCE8oUDXuHYL3EduEHiYPrKGirvWS6k/HEAL8AChJbhe6bULd2VYVey1FAtybJLRKex2CQ0DciUoTJf/R6x9JYfFwAKB/Z9dSjzh75kVNtjPsOKXAvceiXtbUtU50lrMy+jWJRdaXZtIzmqQxOoiGyWvY4eu0NW/GFaaNlsZq2cwr7JUFrefSzNoR5Fs2JgvROw1HnYhEGI3iNS65Ehu106vvGdxkJWCjvqxkUJ+9vraHFJEonhFqZhorT3gLvB8Twqa49zzuXpMjcXqHrtEWZDGVVnb+UM2EHJDjLhIpNDNyGkhSFhYbQz15H9FXKglYbwltPaGHpHD0B3IPAzGImKG1olN2tFsGhunK2H1f0C5eMyO6j4iNUjN1nycWuTREgWDlkCkzKsOUuShE2Tgl5XMwQdii9yDd40/JZ7lfYBXUBXjA6VJd5DxX3SNCaiSU1zpcUEY6AlUeY544C4tQmm25u8zEw45nvxja0prW9PpAGUz0oZAXlfSfNihhOGV9QX09/kYVSHekW3EWLeZodRUNCoZf14ivRFKp7va+DJrs47FSKUHWbTY1K90SO02l6T0/hhWPB6jnqIEZDwz+IkCxrBxM4uWjo+6gagogD9MBfp0yWfGojFJPuA25ujlS0bISPN75rf6UC8mWezhlTy3oVpnoEgLMyuQ0ve8VCJNxEZaGgyvaYOiIDGXK+HliU5phlMRiItGes2Srvku+6O/sHBKngTvNL2N73DPWu8PSls6GkrLJMNCUVKqKgPXcPl86bpmep13DBz0WZuW06Gh+eIyG3UJ6PvkcEZoiBszxpRrD8Js2BTWqauntstSLLEjbXpjkkLffau8g+TmUVJnMxSqXi/ahjg6RfP/1h9EJcMdpR+bAfTJnrGavVuuCTZkKGPye3gNsnbVg38Qwx/qg5BDiQ6LhGzFkG+k9Ibln9KqK7MKO4fre0GC1D4pIRr/5XkT3wYMd+ixeWzuxifvbfeA2/qdH+RO27cqFvsnrVwPos/pxFXILttqcAVUH0FGyrBTJnXYnT3+yHZZj21iTjblB1k9OaKh1pLKO4r2riPzn4/q6BAXwDHWfdyrMW3enatFP0l0xfS7+ODnx59WfcYrEBbEm6WRPSDQ+FaLcWjR53K7xRTAi3n9TC8k8QMyZoaY6WcjzkehCyafGFJLNxi2OQdI10QiN6d4RZGa/GzMX6gCPjj5wSRWy/uegjWN2Mq2XzI7009v0x3i7vdH40TVqItoRQz7LfLhI03YIdvFaC+GJODDnHdgdRvoTj179IjBMvAibP1hC1CaqL32JwIxUQwHOz3StXuDR9YnMrOqRo1Q39cPke2+pSfRKarR3xSQP9nidcWKIqRxne/7nwxjMy8JoN0VtIewJC9hTQ+VjIuX+ZQmbxOkBL1EdjswgVWf4zSIu8cnU3NMdf7ModbsKo3YQYH8QcBAB5r0U+rQTLxokgnvjKpyUuiq8cNg1EeMLrjWwqhLvOHD9rufCWJu3EQAaI1D7JZV/mLwH+nttuK5ZgX+kXMpYnXOcsEHLeaFeEH6dFZXv6wDdvP+ZWDQ53+oq+FCUIuJdfPNlw1asrqO/DN9knEImwcdekvg2HvXODKlCspD5gH3SxlcDHeRMhkq1VlJU1AiiVvDwpjZw/lZb5RQRdTQllQp3oaDsvZpSzjj7kK8Am0XmfFAgQWIfBtkGKn2t+XiFIv6S+MOBH/gz3OamkxglJURCFqRLjTKG/8R0JmXmr76eE/tQGk9huyXXF1+EM6j+fVfi0W6fgfQHpP6bCRJUu5HJVz3Gxz90Dak/el/MWl+cIXPvSQIgkcf8HXmGpL1fXk7BRiFvpyBaJX/8/2fgiRltH0DFYcvBjYeGHb9e5F062hgbmncN/2eC06D8J9Gt0pqfBRyQEvypS5Voe/ybC0jHpPjZhIyB0lLlRH0+iH9JXoVMeoPLxoYBMCQwM7SgJskOHfNlr260zUP8YwKpTpp8XsfKiTkr9XE9NGuARTV96I3PwUGL6SGWU/5ywf3FfpOiiH7xSeMHLPG7TBxsBKs3dyaNYuZzrEUHVZ+Do5w7cBsQo2wPLEhSIl03bkklovL4SOuwEQe/9H3zRM5/iCFdUmh+KrGrJlC9rtPqVcIklDcmonPwXSQlrzPXA/izkaaWsOBpvXqgi2yAHYey/h2/VogPXmGXt6MCwZJKELxVvt/Oly6Zjl4ZN5Jw9xZxQCDA5NLM+OV2IzmCrC0qzwXaWQBEHXUKRfZick314FiCG8ZiVZCEPsXOzTwLiqQRkH/fb8pbgsjltYIXZgmncEMBk7UNncZFtlCELSNdRxy0dI/FWIZpFl+wWla20Ckt2pBt6MDEPnW7sT7KUMSj2eDyvHiG+XGwcmcKYVQYhe4CrcwrJ9pgxv2tC36ykPZAJ60tCvW6zY2NZuFCk1IsORYDLbpE9Jt5MwbKLkDSg6Vqm9iEmAUl6/vdb0SIKny5Y4ec64jSRBgMshRHtMYvTFmvs3+jCnR6hGKrAayOkcaNcWNQVl1MhdjGN9/OGBWAIziNdlqF+RpIKXskytMiBAdtyYKwNkHHt4SD3rSAMFD9AEguko3Ebff8k+OD0yTShSE+aQhRuhpZQZurubvmlJlFOGRgMel460i4enoEU+dIU2fxvHoCNDlsYLHwEmJMsJ7enhoXUtfsQn21/L/HSVZSojpgkYnH0JR9G4dYlA3MQeXd1LdN1+dj8ZvD6yRiZPJpjOw64JxI5CTS72Q2AOZ/prSBxyzGdqNkXhyVbclLD+vuUTvBRqjKSJyGi3PdXQfx170g9zy3fDxlrf9NPvoJ3ea/FoC/XAR5vUyujTqmNoQbTCLW+rOvXnODjShcN1YxUKRnZ1sk/Fh7gHn3RcCHEaYAhQZmaEsBW8LbWfEx2gWCI0/eWEUkI/2V1OLOrwsLRNWwKxgamv183FelfWRhQOCfWTPOWjG9aLsREGndqWr/18U4jnV3VLHGanlqTe2HXYDNR1Hntc+tobpLho+fAoO+7SRRAoZKoPiIAm7/OafZDo3RtSarOEIvE710yhdeMk+EU8aH3fQV7e+MWj9TyiFKaqZIffwwND+Ky7yeqCYbK6EaTFoXnM/rsoIpJhrnffyDkEO5UcUwwtM9OypPTPJFWHkS8Gh2gaCjczDiV2+Wb8bXSUuOy4qFAkv3LT9yavNuwjvwL+pFWgwouI2X9UY5uYtETICPREtfO6PL2nrf7wmHdJXkde27ya7g1eyjObL6R5x5fRdgdN1AHDVdcQoKiOZnM7GYRBx2DsCqnMvDb2imOeMlCV2X2nYpPh0At5Gy8xlbzoJE1N93jCn8VGacPMlQeJqyOxpMqEw3ggy1y7BZyfMnkkiz57A/PnyXwRnE1PJ0v2JRauRRAAYCt7wVyQPsSGqiiha5PtRy2+6lSm5RxhD0/fvEO7o7/oJ3Y1QU/u5Kg2wwUmXj6Ek/jQWT1zZT70+EmX/LTQA64qJkgNaQe2xOLqWfiu9IoSjNuQu6chsTrmqZCq8Do4tJVN/58Pq9Q7gfDmP4OHiz5wpROox8HOnLzO5G7zqD4ejRnHD7n4NOLouMop77EtLvxDUJpw2C5i/Tmfo0K2N8PSBQMwlbG50nAxbUpIEteUaG5V1KJk8tkNCW48c/C0Laz+euyUKTTvcQIiXXMu8z/KRXnGXxu346NUl4I9o9RCmUPcgU8RTuTkMJlXp1NjLljDYK+Y/NQATtDm0qF63xyYoXcA7w9Q+hDFnD8QmNx1ou0pcvQrSD60F011AZs/yTI7xXKecHaKsD3+LioRK6kR2mseIiZHzqhH0QzCRR/bg4UIbPOPQAI2g6YbYsbOIlnNioJu67ybMhDadjhv31SlQpwnuAFzD/W59rhsknKKfheSYnpJ4zMbNsIIzOsa9i8zCCr6PQSsPLaN0o3FALbBnCMM/1ay+up/12PPZfkDS32tyFWhFCNSwT8djALuPQC20h23W9lhfqOmCoZLCXA76JNa7d/p6T758v5NRWT1s7cCsumdrWGJoyaRGUEz+QczHsEoUNY7wvPBP3Jl31sWrWhl2qaXCmUKIsM9Mt1ZuCiBRnx8LAwgzD9x7lj73+rmCC+kD5n8o9UYsEkJxv7/ibz5dueMC2JLsxF0BSpq2BiwH26cliGEFX8o33iwbsVyFcbt2/SuHq/Z8M1AWiI7aWvlDXaaN00klvjElYQQS0l5NVPmfiXBogYPfX5jdr/X9mFEwTrO3GlZuEai//pCat9A4hJpXMfVAVb1X4Aej+OlYNzXjqBhSiMrB3Fzyvc4e2k4wjbvBvayE+KGwStCxTD16A32qQ9sIYy5mi+SDWi4UP7jT2n+agIUXnVVjmWNxFxDNLnskj6wTR8kbjM619FoAYgK0DWz3Yg3VXCu14lREE6D/bcqdJxnTzoiKWtON2b1Ny/o1Qp52109PFeKjqj9B1rlCMow4i530OkGn+q79C317V59MunsPHXtgwJgo8VQxg4E168+w8y0j9WYFWjXPr1jxI8dsYBGMdtJ+rSpSk1S5KlL1U7NIR0FaJWJPYYe4qH7mV8fTSBrykEKOKq5ghSyE75sjdZRPCvZxIw2awZZHSS30K3k6gh9SKyK/keuq3QMwNiioofYU+Jg72Q8t+JtFhhBygwX8s1PUTu9h3uxMcVWlpYDYaaLQuLpowloSmHrv55PRfsH9s/JCRBg4+CaboM9nZYjDVMkYNpFEaP18mnzNOfKXAO7VhWh35hUo7dH2n1BL9sdS1fpC9fu357Iw5adL3fjuid9wj0kEnRG+4mNvtvBh/pvJAalrALk616lu8TXPbLSWEsVmzY6zk97mtyQUEQExwWZ9n5PF/HUVZZqbhfYia+FLglZIBK0+hGl/rxx80K1WKG9POwLKpOQqil1adnIuAgfU0dt18mYRfVbBvCfNEdjGXCpzWFvbYTmVVhmy9fdf2vxKv/TsvgCIaByMeQMnJP56HzkZU2TepN6fm0DNVb5D+6VJq1kfGL+4T3M2qaTnxpiHRkAgEOCRvJw4tR+scALldG7EaF5xcWo74T7NRjdvwgREiTaCHlJcPo9XxgwhvUrPZ6Ozq7VcHBE+MH2Y6B5Zz2HgvLsK3BOKgfLhXihmGvwIAFr3AnDwwifIL+gaSv8Fztlz9QS6SyD5gZi+lNUErIzdc7W4ZzM+J6C9ax77weWfFXZczCR6+WHToZTtZ8BHXroQglWO+bCC90YNjxBXSPPglW3RWNMjOId8FxvycXtuYeVbKVwrrZrcHtbJJFMcJWV8vQz++dhVKxO3jZCOynDwNWfKig9wrBEC6KxHmtmFSJfoohTt4rehh5b92q3zLqs73Ftv3rcdEXD+yX64/5JVcc2VrDEAxUBJ7nBq89276ZL36iFcAwR4mAD/ZQLznwAj5wDzMDpKdh+1XAxwXuhCJFO6iPsGQKJH0dl/mM6JeTA7NByDRzHfOzpUFT5JLR3a3u26aAouMo0BUYfPiw1uUYjimfYMhs9X78dAuTZ8T8Y/a8VkmCH/zs7c8r8co8ojRH12ZHrxZ+WEhBiH1TrYlG5MLzM8m1O9UBWgqWHPfPkrnG+ugiX0Z8zUewDD9pKLY0TDrfCZxhKk+HT6muiWSvtwlpMpmuiaYoBEMIzf8ZfpyaG4Jq4KLe1Fi94evfO+2j/8WJGOwVhegutXmRGCspUoIqk5BFOmfZKGr2EfUFaVCobjR6lP+neGFNwEwRgcd84qjPfG6ku6IzOUmQjxHffQThbmop8Hot9/XMSK1hSaavx16msjX5TWvwKN9CMLs/yOHkwcBXF8MKsG++bUCdOuP/nyaVqQmL7DJ190FJ1AZ+z+4ai00GcPPrfIPQX9xjw1vfmMRMIyaXasOefzgWyYD53AyvE5TxWTBI5bDaOm0qGu/IV2G16xdIPW70lXcnwa+zu45CdMtn9ovwuzCXDZsMY+EoirgblbkudBZtn1R9q7D8xBvGBR0BYkuRDDdDySMKsjIP5IFcCyqyCSyrS2q7XJKyoEi8+T4xRFEPYT64AwJwNusGxvUwotweU9DRyVOjU33ZUxAjmIkLXQ9vey+RChiR1n34wOlcaXJVWIAA4oyZTSndfKKW3YHrZ9DQgXxkHauDlGMqWOUy2X4qEI7PAqS3KioqFp7fzn07M51+V6RIrPfwuPbP8m3XktYFZc3ioyFWeSrGRg3ouVwtxL4otzktTsYgVuqqOvZR+35esSm1ybdw6dTciOccaSTIMwahPqDNyl1ObHiC+RiPIOqd+1Z8ppFrLXsSyHMU9dHwMNJFjyRallBaF1jygyKi3I7AybmZUMljt2RqqdeK1VrGgrq/3FTz1WjxBI+SjN7AE5vu1oE0PMHmvuMytlHAWc1lo7hbLSI9Qx2TS9t6JkdH8XXcU9S2z/BxG7RmT+SUqZr8FxZ6pMMrKUzeEXbPUQvKu6++eUE9co71icQw7j/cUzlcqhUFYHp+K6hOAUfNMQE9LEBukgR4IWT3QMZ/cC00dRNpgA04BSOdEzuYvF7AZ5nUQr6kXgvdpsnIxg8DqHh0nRuVLvZRkbZ8v0tiuCdDYw3rpi/QaJnYIWDo2e1YbLoNWr5A0COG9G34MKuEJWih+Vn3GB45H/lP+mN/KZ+D/vgwMOd4Wrf1G/NKxZCr9aHaFFCl9yTtVg/v+mdfKLUoxGERmUeLpPQ4wWA1upSsSyHsHgAT0k/KmRfn3UI2I1HN/NGL3xod8IhVF9u557ZY/psX8Q/oDx2FgUUYS5fdRnKAM6hywewlVb3TM4g8aC2mmGvJS1uM/8RVVe2DKR6xUnJ+JxCfMZAWYUKbM3oaapIm0QwoMQXV4wVwfhZTA/VBNyg/2W3vC0IH2v5jdkCA4LGoSY58lqkOvys3GTTgrEuObPMnb8dhSZIIbmmGc0kr/8z1cZtxhFJMHwykwR5oZaN0RcGAgOKdD0v5PC8oe5BLuPH1hEbzGgcQp78QCMDpLQ24L2CWjQcNo+I3DKr5CvAy7KKkDkH+fV90JFvU6NTIRMvv3KQ2HaIySooOtNMeujgP8LfQ72lGjjnZVfcPcYRBQjOyuwoBBC0XujQYeWXaf6P+f3hsmaAghjtPkcDL6QzLAQMgtoH/OSTe7N3jDxmi48p6+9nmqFwJbMV2Q1yUUlavGg5A0mA7CN2omQbjukTFPV6J8NS/RpP0tBludefTZQjVnu+WwmnbiTTcJhXF/a+Mvvytt8jv+yO0wO0oTu0TMzMs7TFtZcph97L5rWLa+wB0p6I093Jax30xm3P7ftaTxyDABXNpaeJ3LPCeFtsVFAlxqtzNSxPmYwEqVps1CDvPK4zhclZbaRXf6MOAwXLuVaqj0pld2yfR81i9qm6Be2ZRGlhUsfGvv+cKMEykU3kBmQcAVQ+d0TQYEGLYNzNQD/jtB+xFs2twZSH9GxhGz/1TmnrYUjrq+qbrHCzENPOmGVs6OgBuFF6Ld7eP57al6TE9aZ5ywxQAc7lEGZAgn9ozZ23xmyLOHG9Q9RQ2GepMSP677/GOmuDX0DR8EjctDCuOGaakJQrDKxA8U/eLO8tMqCTxnKl7rRJoVylfErJt8tdzurpFyyOK4ijidzBQExqOxiRWt1+Hi/7tVbK25QXwhlCfEfbevl7axH+iL1cn1YGna4k6JgJ3KdzXDtDZ2RCXJ3shQ/tBKABldL9E1Y4SAcV+3KoACVfhS4JFSdUTUcAok8qYJZMch/3aiN/JzsEpWbVK974KunkQ1XnIJD61saOZ5YLDzUAQT/uTox8p6jody1p4lqYAPAbVV3CZGXS2+Rg9Ch3iaz/gfRXDheK4hDXydXwB9hIQq+gERs6T0w565xghOz004QrNOzG7S+AFWFgNX0flNup4uHDDxDdu/zzp/lxVvkI8KeIr1aIBhQGKEgiyCO7fRB8abCFK8V0Js9yEO7h79xfyJvpKBUGiibFSJ/HfbCh8HUEWjw9mmNWSyFPl7EtHO/93CDnclXFgDFnKD/FTeZznBOyBI183/QwPUQANRrq1Ma4j4M140SNgs7XqH39LYDf7AAMSELUclY0NBWg3RuzeNusuZ21wtQF54gM7/VXMezRQnwOuYw0xceC5EXf5tnx+bkhBCCnmIg+w+mId66aaBP3nhzHHlOicl6rJQMg9flxSf16VAzRV9zYttO7ru7hB8bzouwQJw2XcJIhQzD/+JsF6WNKAaeiV1vb0NewM/j8lz3x1/eNoJxdMoGdcRH7lZVmMb/DOcJhJBNnpq6lwe+GB1aPOOb46M6trMhcw2W3c5SWGZy8vBstkDdx3YdzSNWZzkWqo45+O/9AhgpawsG1szBf7O0d6GuVE3ObJckQMPXs87MPQtrFlkXHXF1GwoOKU1X5IVlwMjF9ny43O95GZmkv4+rsa4fjadjh4a61TPjlWXhx5P+b65t4WpnbUWJ8khASd/0ZM3vxvymhcsluPBPSeG/52Qk/KkPenDz2GQbZF59otPhg5A7k/hfGvMATHVAie7ARvU5s24VDVG7KoChgQmluYyewYfBYfLuQJGwguhe2shGFsVhWB9H6oDXQ2IgH3y9bgdmYqlLTvRFkB7pUFHqmIDd0ZqZEDLAfkDklx1oHVEOuY7aTLaiq0fgPNFLoPpYMNvySX2KNviVlAk6WYbbnVZfvUgKD5rM9vAOCtYZvJTzyJEXVCsJbS5XcG8t0cq2eBZ6TEqRT9Ze0vWTVFpFppmGNqTwR3TGbLQLzST2FKTrW4x86fxfKKhJLRwuMJEOqizaKxOsZeoQ1JFHORSdyxkTtoXkZlVVlYrtQQMzsRUu/gnhl/wR7LOJ5p7azaBkRW8jsXsUHO2mQKxoA0mxyNLcPYZuqda4zGxejEDi/v6ZEVQKdvOXeATe3+wTnI3CXav93Fdd1fwZUJqI+7S8mbzohX91yeXgdoMFLAA4ZjuHauf1yEwUz0ilj0x7+Z5npS/PmyG1/Fa7TQcnaso5PuBC5hrPCJi1oLxcpcwfj8WQLHkWZU3kwgP5JSyPZZEDPW68pUnhcMF3+Ijsg45dNdlLEefcZOjh9lemc8lmK5vNuZzM69e9Y6PLhr1d+1J1Jrm1wAkoP+swEKQum/52dL7z+jE/pYxbMc3UrSyi00AQQ4sK+IS5/UuGXMVTwgewcaoUBtKyshM3Z22fvRMGLzlREmtkCymn/In4VBd+L1nZi4XxeEJFAObRdfeWBbhPwMoipJKoAXXKISvBmebQ4lDD/Kb3M7bdps3ro/175iuD/adm+7Vy7fsPfwvPxIPUGwFUBffCCZnFWsP5/SOQev+rz40F9tIZM/mlYpMSys67Sxt0fGZAeDlkH8zIng6pxb3xDRhMx9bpQsU3pQGAyxf0UArfOG+8033DiJLUxhnp7mjl+2DdRZ94ta+T9QWiiMkI2bRzd8I91SJoyB1FN81yAa16JuUSxMyVu1enMA8R5FrChhJEPBCKty2wD5gnvxe7KX+G7DzVKaJCgwUUMTwM/W28KpaqtN1B/WHQSRBjqetyf6MZS9t7pLQc8sn7aC66T0it82ZOp7h/DpA1E63vYvV7/7VxvLzCy4aaAdQcfi2peBDmPLEeO286ya4rloHB1uXWyJnwOAZc6mKBGNqx5NnywWIj4TjKrupzCIWIEQxKrFnKc2CoN+pCaQ5gwhkbAqlY+KIeSwY/Oh6dYNqSjPgPInzLk5oiEc43Sy9r55bxBk1f98Ih7QWLm+GYviZx5wJseXHa0ZIs+Nd82RZ5oQvza9sjEzCmCog+7mqwxxyblTlFbnydmt+UUN/zXTSXnz+ZrwbVvG53EpaRNIEV1lGk/uOq6YEOGatwgNqoPUO8dVeLw9J7vi3q9ouGHe9jyuT1se3h+piN5xAIQi8kJsxckiVxMC6DsSPepT5V/Jy8CxhQ3Rkr9sIw5FuejH24iI13MYWNj+59kmUwN/BcZEinGFkkJ+Uf4DAYuUvA5cAj+gjznnkA0R2d6vgXv/gG6mBdNEzD6djP43wTKgtJ6GvFFB+uzsHb7hFYmFeSFYVU9JO9is4cNJgl3Uj/XKeipNFTjs+H9SsUJP9G26AEKkAxsoRsm7DbNooAh07SXaEKYGuKUFJGr+OhDUmn4zISdjNMNu91EGirBNGuFJXBO3KFoXnOgk0HQ7FGslg2mMFmLCPb6GJau/8SMruUm33Cz4TB9y8GC36Y2Keh/oC/SXXeYocGp6FbPIW7BXCFYP3jC+MXZvcXUDSfaQZoh3esSrQ0+58/Ze0siN8QPBDbyjio5WwxlQsgAB5GEIA7IsLADmbaxFCFF/rOjngAHVasWwL3OrpjqICCNh5oY3oLIF7Kg552CXY/2t/yAPPPQhcSgK+WqAMRgOs280aUZ9feALBobGKVfl2sKMIJ7jQeFcvZK5sRNc4yWlhMxrGlKoDjXIX4yUk36pl2UGPiWmDzvbqNKr7Bc97bGvvjkCkILLsAtF8F/93FVliGNJtQCdu2MpZy6ZGejFDYUlKUqIxdMQz17MK8/jx614RBMaG9DeSzfNvlplN0t/ChMumF+06mkwItDsOx0P6nKCGogYLuLbrMtZ8KEWnALuOOEOyH0u304NABVD3D7OxwVNlNIXNIci4iBEjM7p/87wtpYNp5Izt6JStvJ9R2LHMkJJ75qg0rYtmD7LsSU83DGQYczuCKaJK6az6vlazsJST9fKcY6aBLgAKoScSXPFQ1zx+7/NPEcfkjLG1+p4S7QUhfxUfd9naGHyeoV/SChE8rEZo6o/pPo8gWHxMK563gwTVitobGiijRmk3GHrL8SDIcbstHSE3eT4/SbptgVXln0xO4O27i2+c/KZrdUw7TrSg3WtFbmDKNPoeeDAOIlgibdiKL+zH26SSeP3yayyacTWOXvSiTxYQU8ZzrDL6CVr/azK5UFgvSR6JQZDcBcovGNY2kZFBytmnNFECWewF/VTD798HJodeSw1em6zkI2AyunwG2WPKLxyyinE1bISexIY8YfQRFC0xNDW/wWU5BGehGoqsR09iCULkFtziQNn6A+sNWv2hcYnxszl07ZkPCs6pHMTy3QUr3hEB/hJK2Ja7RQ+ejqrQZV/mB2SnwjZIzQCDRxyH8rbwPlltnt9hhn1ZjgRkxQ+8pZjUrJbb484bbXkX9szUBfXeJ8X7PwKCXH5wUa+o+jFxX5z9BSU8B8rYvAp6M/m5uPDtrv/7ZhS0Z3ARnaIY0DgFmB0IUWqI68/1iFvscIvDp8hedMv7g8nZEi1rZBig6E6Vdj6xaJb18LKFGAq1C6VFl+mFoIvkHH4ZO0PDmWVKbPlseEVAELjqyExjShZCuFLcVoU0KkYSk4aR751sqwh2CIwKLrxEriSCvAWz57CBA0YizR65YvixZ3PUPtQNy8d5uQL/jO7ohrDuX40Mon4tfa3pjYwNlf/+ix89Z+F2BDj8JlwgN4JJF0Wy7S88Pw61T+VmKAOHM9cYAnKUyPzar++jHAkR7tHurq9MXPJcANLNWGCT76/rtHw1ym4ly+KFIjLFtijjuYr3MlAkqLnizWFcpredPEOgl+17oXz8NYXpiucsBc6vr3PUUH9f8AEfj9cc3l29L2J+CtnlpFQEoMPkXjcyEtC1tUcsJ9/KkU47XjrM9NxjiHROAhXEq9zWTgWB27E04sWhkKWEW8oP/wCYa6sbDNShErsoS3dDy+Sc5m39ISThuQdgv2ty/zFvn3YwoXlC81sMssVK1o7vBvcbiKThINU6tslIolWI5zvhfg+flPxuOoSBhtpKMj6OZNH+gD5IDOyGCm7cl0c9o9UBs0yUaVhEgK9Yfmpu6NimRrmiFKsRuWqpCFQqz6Ss4DVHQnXR9xdcLgHVntF5MMX1IfCXUJaWFZQXjUIRpjavIFSSeeS6zn2dgluN2e4jjeAPYmaUuJfbQLGz84wkusgd4wQAcu3Oswh8Ryy/K5vOh7a+a9dO7UxXpyd4YjlGq8Av/1Hx0sFo0NIyIq8RJxk5TAGFhrG/s28w7iIyXz4wlgVVGOAH+gBWRB3RVbuFkaeWmkLRdHSHfpwn6omlVyjcw9G3zjep87yDudOAldlqIExhJkCmYl1rWePI8X6ddoNdrNRsUQFtpN3o9b/ss/oaW7RhRZx3U53PC4i1P3bjyebYD2h4fPEFDJEH4XTUxTmBH0IJaE3j8z+VhkNjrcg6EhRr0lpRIoH5n8QVD257bScUR0ZJJ1mw1aFfpLGLKUy/iZlmkCvy8T2oR7YRZUvGYHu+eIj80+FBA0CFaD4nPw0HRYtPzPBUQKZ2enhI/7/CbAAOxU8RqxQlukJOjXf02FmgpivV0s0EozE83ko5ChcES2PaTsqQos/biwu2KUCNxEBdxiQH5pd4bOD0fXAVeS5DXHHJIDUhbDtJIHlTd7nXLJfrFVGbHJhaE5pLsqr7cmeRx8tkWH9rpnXjdw/ICzST/WJXnbcea4KEVYzwRHVoc0SkDy0DagpYR+WM7O47e/2T35/njUwg1Sje6OKNQKKFvQ2zcDSxvR4NyN+KkVSKdBm+Y3bTIe/8+m2h+o6VmAuTO68Ay8g9XzMkFyPrmTUMTSA+x180NkOHYTtMZVLum9DhRbCb6Sp8hFmF/Not8KIMQx5qOCNCyoy6sMfXgUHvC1VtYWqE8pL/LMwF8vsjRtAM9eeGO09n86uDrVOtedoOoBPsKKCVZ0zZgsaeVExIb/xTAkxV1LZeeidjWcdsR1oy2/TR+dwcwqsVjZd1vTkwYtbLOci85sT3vhdjrUjPRASsxPA9S1/d0zq4+oTroClhEzfj8Uv/coxiLheS3S+70dK7FunCLAzhc4uVvuavdwrF0XYam9hijWo7POXjvDqnht67trCSY3rF9iNbcUQ9S9Yq02v1lPuFWgkKgqZ3544deyepGx4Mtq7Afs0ShQVEV4uMwyWXiYUGLGE7Fc16k3aSRb7VknQqdXu6cZnPq4RgWTYUFQa8tQ5hza0LxZ+rPWZQrAo8v+W9r8P4fRBipuOZMixxJEzHGCGOgnK2QVREr+iKpt0NctwTtGtxkW7YHnJolpX9jTIatb59mawykN/ACTiJwGG8JvSW+P42GU95kRxr7FA4ClQlN1u9xqlRM2ZrvwxGts7VEglh8Ia6aq1PIh7X37DMmGSf72qPa3V5bOXy+17sEu0/cLZpoDKApJCjDIjTZ7nw3ZwnpRKbIXdgsJ07ZBo9lWPrjiYtLBjsW3RYqVDo6I99t/iUFCYMTrtQKb4I8lEPad/SKoM2zTmSiopxxc5AOJhvAqPLS/VlK6FURQuD8EfwpUUQdHnnxBIqX8L5xKNgaJ2tqdiB6STpCxMbGoSmDZeHbeW7UBmiqFlapad9qeqpkmuhR3Tj1ceTN8U134S/wpqeeTASbzrAlenbB4QJU3ISMjtROWw1yPoevvCdDQB2guKeGFKECwZnaC1KQFqaGOfGtux19FwiIRXMM8AFOKJ1jPcYVjyAoWP49vOAz1bPnbl1w3/o97gJ13NoG8EYDNNvv9yTwb9QqF50AkZEj45ooN8CYVDZp5RISpjtCR8HFm0F/xrXqDt6qwQQovYVZ4NQePWbq9T9I6SBx6rcmhdVpr3vVhZQ9oTi0PaMZIQj84UI/PGU62tJmCyQCRKCc4lhrkxuGKTVjFOe2uDQGHc+R1CxcppZtVGJfSgXlE6PRliblFz1qQ6Kk1RpiT3ElhZqy8Hi+/Ch/rdZOaoPVCcSej1fgA5N8pPbQi8VhvnX7WCAmIhfQlEidRW1rMv23C/tZ4uQ75HrnjxQnpzNxQ134Cy2ZzH/wjq2QuWxC8vT6C6P8TlYS53I7Q3wZ6KVSX9jiDsdxFlI9CXYGwrtFJLLzOEuvDLXTy6QZUWaZksmGm7jBzWxhq0bBlZuNEivPnQVgrjqxs5NoMM+fl0bEQV0GAj4MGycXMipOqSs9mzGBV5peEQBBdJJatWhIDnWN22AjPPCZBvD+dRA3+Ev12j1Ujyn7/Af+34wc6x0cu4u76H9bPlpYEnSOPixqzFgH6LV1uiKpR5DMPcYRsduZ9rFPAPUADAPrMrOnroHEoGNHo0d48mbvYYv59U4lAE76wuIz32SqcpdSE24EYQV7s2gyNvOMzfOuX2+G0JCF1a0y5t05iygx5EyxkBcFbXVPVOy9q0THg3hsCCoNm+BSAK6icmxkBkFSWpKLImxaiDcgVgTXARWAczX7eu+LXSnsQ4AonNqblK0ZzHjyc8rVDG0dLRN5SA1okVICKXs4DHHD8czunU8ibA3h8ij+w9ePY7KN8UaUjwXHWwh8TaziV8fwQD+mBuuaeUSRzL5HyVh6R9V7onmAaiIT5syy+H1DYASWuzy8Bls16uoF920pDh/wxFmoxCqvY/uvfQv33tMgKDBRftJxMifRs72iG7A0fAD64WcWImHl/7DHZUGhewX3RdTCCHr2pLNnfVexTmKO637AXIcWLsUkD4zHjCHwrq8rEPAJAIjTAblWcZqnDYtyRHEpOfttG32wAPTxzMILtu6dBZviZURSRw7bT6Oe4f4QSVt2LPqaiCrsirTjPuj11JtbfgkFMnOuEx7KRddCHRYOfKBHHSWFA9AV2EPBH9TmHgIoRfuAvJOL2u7CU8iWVvzBhHD182CvLPfOAvwvgA4bO/s+0CBOJrIR07C+7RlhDgox+joqiaT9/gdfJeEfMp/EVCFrhANCybTJN8rCQOqVL3OVorMsbzgU1p5xHvyJrasAQQ73j1kQA44KslVUfiTtNYPQHDYUx9lmSuP6Zz3xh5R+5aa1vXqWH5Qdh/bYaMcyjDs8ctJ/5ELdYjOFg0YHxI7DyirHL0ui+ol9WRMOBb4w3t+s9oG+RAEJ9hkdWMgbWGuYoVvo3ufYf/WyWX/avVYtYQli7jLumCdRtZkZLzQC6YMkNMCzz9wBMkhvpUi/ePehTy737GxjLIVM+je6otFTPdLM4MdGugRFj9ir6OF+6ebV1+s2pB1ez3dgwCek5NqBcXgkch9b11MULxS0FQavISpXkaDqGX94KHJkrjLN6qcv8F05Q328ji3a7cKMXjJxWnVp+0vQnPp9hUpeKFhgnLeUZs11ZK5cXVplr5vP+0RLLoSgHbYkrTnmggboK7L9poJbf0uUkRcQMl9/6nV4EwKjYjXll3Rw7ZhV3TPToslf91lCVuX0wyDy/q0k0WPEtS53nvY3doZVJMIT0+pjzAd3aoBTECXnKIDiEARUS/Cgzx2c6ogY41EmRyrb7APubS97bJewIzDDkCgDRPS0khbHh6Pvs6skLzWA5i0hb9wVHubwQcvcP+qtMKrA8Fu0dgSbzjAzrwzHeQf2HvxfAe1gLBIxWlGDg/SjqK1nZAKW/fD+MOZiM2AjoW8CQ8tzYHDMsF4IO76WCbkLsKVExRihUUrT/bzqpK2tgc719dz+x7KoGZMCsmmrXl1L2cFevTJn5jC27wGZNhJG+pD00+NpYo8MpC/ztoI1/3670adDwK4Y8p/Xm8DCshvWQ5L6ehFTi1CRAZXfjb2C6OQWAU29+0i/YoAYr6yC1ozmlnpDq/4aHhBeXvAaGfIyuuxrIZ5fibDhkQ7Vjdhenn2OolIrHi65IFvevpRdB0MgQrgm+fi+hnfiLaX9Kd9lBNlGHNhEowYroH8cqAC+uAwYRpLhvCnFSRQUJl2+A8eKSA8R7kbYhNPCDnVIWY/rF5x8E7csV6Ng3blIgCUs52ntw+kUkRwc7xB/BBBd3tVjfBKCHZgSAVCra9HfxA8sdyW6m+mvBS9y7A3sThcOIOYFRsbTddRIIQBa4RVwfD6utYfchI+H5TxHmFnQBdZaeMfE2VLOJZUHHW68pvvwh8WBfX2qYxDw5+t10G0u4Q3/R1ntuzzoakdDc0tXZgjHM5gh6AJjX3aVbUjZmBAnr9sfqG/QGOayjUWfegG8fIMZ3RyFPL9by4LK4rkaXrPp1V2nGEmtXwUz0gUweJ3nYJp36zlkM63GYYZcCGpBvDdamjjgPfUVZXjaOMZK1oqgrBdhDbfax3+hf59uAJTzQ97NRtoQXgODOA/20wacmKVbbQIIb9V047KjX2piEBtE43A5NjW58Qhw+KnbgLdCJMwt/i4BK3tGucl5VHyzeYlZ69s/GSyhTgUbnQ+9ldwuwkeKT6Wz8kGaUN8zI4U3D4nafsryniqYSXxAbe9/1KqQ1/FAKHwvo7O44MJMYvb0KA+QLAshSKsgLNo1OuTn5vVRTi3rTtSYXULQk7fb+EM0U1lCypAVWXt5Y03no+GtW6WEw0LnPrvuo3Mi+ptUfCucSIBMnUqy4hQQcQACzSZysEv9hYNDilrVHW7rQ340bk0q1foeYPMe4QGrtoqhJLvcA+Q6tV68hwcH2jaeiQuO02912Trc9PUv2oAdYEANbfIhvcT6tAfIeoud2F6JxVKmF252+3WwKaXdwTzOygQ37xIsQhrpwHDnTmYvcZb2KyS1arD5ydiLfeJ9mPlC60wuTv/qjhz8AjvSX+KSLw2qkQpkBiOpgj8VOlVZI5JsPhdpnbIbnhLcLpAz6o+wTKHaJbPN0JS0jlpEyNSQx1IHnxLbT7ch9iuWt07P2JYAmTG2hqns2YMORDxNcg9UhcdiJA4OtOracEDK2l6lnOyydg8WGcS9sNpVYu8HY/0GPjfU6mEommvA/fIoRf/3TmLUognaDfu0m1Bpa7URr431a/SrG4aL4VXt/ckAt1kqwqPO9eKVUKqjydOZplc2REALShJIak388EK8A+EZb+BFYEEkWPDEIXfKPYkfLQCVhW92/2pMiMTVNb1l8Bkl58DmeE/ME2UyaPa0m9zBzdSdoH/IiLG89EGIUQmiJ49GL+MBrk7RAPCTDhdlIy2R3HKMP+sdRUDitSfd2EwRiLKxDS1oOoeIthncxB3CJ+TnhzTbho4b7qacYF4ewYfaXoXAxUl24JIKgcow+J6zq0K0gEMRbLW4b0w7h3D8Jz2Ga7/5oPqiy+cfcVX6si5+CLP64ptxH1MU2Fc63Vn/m7zIxfh9OPQ68PRBpVT23llXMwykIu/RSTClkPfsjP+QR8dY+PQ2bAvfDKRSQ0QxwkrDaXv/lrYxHM2L5qtGoYcfTkVqlXrRx5yqF3jcO0hJmd0JIuSbLxqrqhzBmwT1KDvlzTH2o9QnYRh30mzq+aOjsMO8rQn9EHMvzWzH2crZZVHYkWbu0FkIko+WLjhSzL+9yxrgvWwHoxXguu1gKrBSv81N9UMlFttXjt1k1EY1lLUrVgJCuwN8GFPvbbLc5H/l/98TagTf8Q+97H2L3JABLlKvjkrwMPHc3Qzf8Iw0SjKDtVpYZ54YBsBo00082UKbNJZuTwKUR5d+rB/U8dgTwirCA9Z5MzLffQmOGYgZQFZ1r8NHXWCYbHombZAbh1QuPE7qP22ajXqgV6q80K2OYhLIDoGU49nzVjoUC8XCMqSZh9pJa9bvPwpsOMbFP69YLQz4487EaAUgPC2bMVbaHG5vNqai1LDBKL3e0ZzDGWJbGiZ9iUmCTZeqta2u/PRPZbL4Iovurv0UMSk4QLkY7mhYzqXYpqYT2LeXiqBFjYo0YSWXWWqF0u6JfcLfn+HWxiWLYO2cADRHa2VBP9kFURUfd79Z/bBW/+f3ywaRuypQAQJNPySw5A2paVnqyc6Jsx26L73xYSMgBw5kCCoyeJPbG6rZAyP6Tja8RlH8duprYV436eWcEhsUz8Cee8gFz1knj6VSMl4Wt23mNZxuiEgjNFJ1/552C4VJrwktHMFLBEHIqZY405g6VZeDQsqgagZoMQscmhjbOFLtixVSLc+Td3FgRIbnmfc+/HqlEAmBH3HbjKcfCj7Jamltfadkdhv5l/v09Zt6oILivl34W6PU6UjSgXR2BPTya3R+Zq4yu+78MeG10xWahvXPO2GOk2SBJtcwK3UHPkx5kOHk4ns1GkitwUk+IOvRbnryrZ4GKClK6bVF1jCTXFgpa15IsIAtPba0GMpUfxFnbjjcaAB91nCbeVcK6iQX6FFLazYlKkp2ZpbdNQPZjw1GSSjgOgQJt36l1j27Pxkmou8/5HuO0/9BoZaYTcPTyYOkw37iDdeA/pv+jsQd84uMhxnac046Ukp9MpGZ0lUBL+ueDYAv8mE8eDcXRk0ITCbpM17DWXJpWfg3YeuDj0j6abwVuvH4d/SN9gJToscg7e2FSU9F4GLarHUAz2uJMNgclb8fEws9SNIMirQqJFwR8YkqB7F3cEbzEKf9+jKqGN7tMBQkt9vnHXbK0VAZ8qwzss3zibSloOBpCqa3S0HxoiuAiFud3ERLSfd8xOpV/PeG96rPS0AJ1Fs356Hi2dTWy37DFGlQPXt29gXyUq5DOE0vgrp4LIQit44uP77C+j74zOLD6NvMyuHvBAjNG5D02I66vJTl4pmnVnDxt8vA8R2nTUzJyEjgmJoVYTXB38O4XNhPWh+UBv2pZ3/+eYW5OxW2DfQJMOPvHjmdLwWcAolj72Y5fRhcOOcpz/wCTS7eBFdIaOirTTT29RaXIgtQSeTPljmyzcuNn6bhyeivF+9QcFtez3BB1L8rMwfgZoqrCDUBM1RxgQpO00li8uXCe1k6liCnYGalwrXHjyGEWUksmEYSdM8mpylJHJ4dS32l05y9aL2hRs2vLteDsd3ZrY83qkFhH5VCx165hwuh/FGZYEFqTsx2M/Y6+UqIYX0KGCZO6RmCS+WjhPTnWmF9WlA+aJbYvj9Uk+Haw6YaUDryKTtFWhNUXo6QoqRey067su55c7UuyPr/RjSSkE0WvLasgY5RAW3oOadtsbXnbNj6yW+7I0u4AdT+ub8R3dpiVcF9mBWPsWhWtLW53/+Iasr3z9wAw319zlj30YMk6FaNgJeyHuu/c3crbxynNcaBRlQCZZATfrdVqBAoYOIfRsjNAYWYWzGmTg7EeTfTW2sADPhGh9ssS2cRRmiLyrPtx2RTc6ZEr+WY9Fn8vtTPW1v1PTBp3pT0Ylx+aLKsqylJiYZOSIScxOtJKIXIUQZfqdBtPEJMf5H02DYk6XJ+r5RK5OHr8/B4JHS1yO6IAEBy12fCEeWI3VMp51/IXGHReHyiePb9iPlfyAjU+IF/af57EauXDFM+EZSjdOUandOPeQ4C59/4fxveHZz4PKrlOzzUthEJJ4fJF3pdCJm+pHVcjGaNBIAjASL+TplSogpEZCBudtYxsfn194RL76+vYs9hrtBwosKb9+mbO2WZ9J9MisXMAAmMF1jflLd7yxIJDXN9eeRpxS6aMMXusSV5pZprZKun7q0G5gOrb5JXuIUMsje/WHlvriPP9yuLYkOlrZin4zs/dHDZS5QmgvE8Rk7LOkr1uTbIZbJlnLucAXmM+Liy2cZhlCBIDYt/pmswzhr9cS3137AA3ZRStEW3zoxWfqaL72U44CRLxyVtSHGY3Mqr6DGNhv3mhalSqelVzUd3gHMn2rZRxWfd/WMMNeLs097yvk2qrwJmcFJDCk8ySR6phtvCqWtCjTR2S9h0+JBHU9jHm8CJsIfspuugd5JaUv8bJQF7qiG2r2u555JaZOuMmTq85yccn89eziqmGaZYTfqLBZv8HUT4pXpGboOXAksTUqOFHbsiiOZaNGsTuFJxFf/4lbD1F8cIobI42O/DcXPHEM+pSQyNxOoGDzloV8Qbktaqm/OSMVWVFi7iA/SJTPKk9G6qWzpWlP1GGDC9T0HrxgBw+zirO8BO/he9Gur2iaMOhbYIbVidHGIC2Di9svRQqY19Qg471E5F+VIamrGl8pUeeoqqDFL44V8EMxfPAFSjZ0sGxGKPUbtlmoEi5Cv9/6oTbjh2VK6LTNlBfmcT8KnrHNo5XSWPLOkyiHC1WpWsgfSMHi+aXaUQ2PT4YTIIO/uDorhrdc4p9X3wqzJS+Da9aoyso9/+QlBj9j+Ja3OyrfCBz+DITO5uBq7vMZE7uj9+0BwhGXEqsTGuUBWn5zbAYoGx2S8wm0+Tpth25ufEubRibBl5HWWRjoejEbUoRlGjpzlJFaLWky81cS51EJf+6aviKUGPEg7ZsDTBBhP8SobYgO2dEppX0V2t0vLtFoCxjKePsWoL84sIuqPR+HKZW6A/gvwOASrUPDEnrxjt3pRGWiUf+hgZij0JbGwg095p40XCBFeErGCTPbrexckEpSQHlE7JsCUIjoB8QE3WtiJiHII6IaZUAQo2urySheEVlFRfxSg4ByjpZPY0V1fzMu+k2NeJBO3nv6gP2B/08Q2UFcAGyyHfJ5Si33JI4pGpk5x2Zn2AfzMZTRcviEBKPqFgROQVxL5FvnuTVlCg4qBeZLhF9UJBtytYyHrZsTNoCr+3LmUbNvCaHXDmMLjdn2GEjozZVMgO6G/lQlYzpSfvtOhrvITcVFXfPWeS9WA8tS37SgfPW785sxzOY209XmrUGyMk4IvPzodjnqc5Rsy4mQL7MEPBuqBg8T3t93UhumfxO4d5cm8jqKb1VELV1qEZ8hQwvrk4DS/6pPZsJLe26IbsYHBuOTt97FUIF6swng5Nh+nUAD3b7yYHx3ZBGUeLUdxUsjF1CB2yyQOEt2ha4vsmK20+0wB7tTPTXluE5TKlUvLPZgnp8iuzZZnXK4HVkqUuH4/zG5cvTazwR4pLF9A9u+MhOJPP48Iek1+GYPvchaN+c/WpmKZdKpnB7EHw5LSUFK3J4gYoAqaG190NAJWW6ebDxg59asVp/3x5Yh0aZL86pQn5GqyP5gXsy7unRQFqOrXl8HiyewccuQdL4CtQ4uW5/JeCx1lO6Up2ReW/90+aVA+AxEJtZqJJR1iWiebsSWD68OldVDT+qUGmiSWfwp92H1X37QXl413WlAOuth7ZMi5AsjZfoMYiZUsKk44+d7sAG3c3wIL7ktuVfArgnLHYKtj5WsB6NyBJuAUyKwxvbhNMixCB0jh4L5vP46SW9Kum99wUFnP84lJHB1K29gXYUQphFTarzWNvhXsLL88YekmmxEdUplLVGagLLczyIbzXVisiaDSdprQiBWdrM1nDVTTkpvC6hL7Wcn1ymTPSkJSigMh+NaazmtjKwFYdmKd0EN9sS8gvtCO4otSsgJQlc2yZF/g6dxRa4VJkAif9OhkXFOawEYOZTcI0zJAVzOoAnCvqbLrulM0CnyQo9mDaTefvvqsizEcxmI8LtrO+F1x7v+hSc3+EBjIMIA37EZcWhQSlKP6duyPKeAQP+V10NBRp/XewLyJyMHjncFH5cVbvCFur70TKJjkQhdAITlHNBFcIoimeNNA3NvApeRUXWRt0MCtr5bz2qGydhykzcFiP4uoY6ywP+TFBC1aa5xJifV+mBkGb0uy3O0rTA333WG4VKZn7vH1QQEucdY8fLjK36EdgT1TEJq9w+e3t6W7tI9r2sR4ry/MOCs4Brc+8JY11frNTYnDz7NGRun0ju/dGOteYV6AUWatVG3ks7c+KZnsq5jP7OiubH3rHVib/r3ToD/q4MpHjKX442GnGFfMYP2ZP8rd92J+mPbPIq+73Q50/HyTWy0D1h4EgIqyy+JL+Pk0fZGWufTtiSz2py2re2fTelom3Z/MBRRVHmhHkfjlL8T5UCbEIJ6dq+M4kNWrsPY1FEXPUtvkN5LGt23IbFkkhDmZQj3tbRoThVU6OaiqD79Hx3aLYdFhWf1uwKd4sauxz8He47io4Zmrw3EF2hwKF6FedozHTZRxIuX5RMaF2XeSqoVB6J+bwqFXecn4pBNbShFCYSRQVk+jdiRexOpUxn+zDYnYO51Eq3g2pW4iGDVVEnRCEKwy8xnnH0yD/6QQQwCM+pinhGqV8cyPRnhJUdyE/h7/laSMEw9wQMrhQkehWbk1k7x0LPVUMHjKU27d21v6uWHojMKj3Fn3Rkh5gSdH9dhvsU5svz+ES1Pk6wZ74UmIip0LJP+dOW61oPAXXoYFognxyzcByhbutL/ImsevPjJ4LuP23CoTS1WmCKqqyMRHO/kvvdnx/4BWQCXO/5Trlz+TyNvU2TqJRsSsRF4DsmXQRHLXhcnZhWaU1lpT+1+9qIk0b2TsfejBcAbM4+peLuJpoyt8BBCPNwtSga5Q+7r8J0qGueTjfHIPAXn3J+9IQkQpBM9VVcEIuHtxBBzo9pSpuCOFmrkhn+atqVA/k/A030usHoNdbRY3fJSIZFVI/2GgfriuPSD+1U88MOa2iKMK4jhK/tmcVFbZm8u0YUm0+UjAwmFX4qsVno6nsqZRF9raS8nWOTYWCkxwIwCRf7XqTW1mNg/kvGEHfpVF/ZBBFTzTpqqgG1Pbyq5PN7OIpaUlPPvLzY2KVWjGIxHDdcxk3KlbjjqqTI1Bdl13Wmi9iknHD2ZeiBZCUFvIcxrhZY4a5aU25KxYmC0IJ39YNVhtDE2GW+Fv3RGOOxL0NWJjHQS6z/TYW4oCQ+KKqr6mVitEeQJMckIOx921Fu+0s5e8WP3wHdL5XMCeehhGRbm0luQkr31wm0Qf0Qb97kAPVWwbMyuikOkKVhr2NcW76Ce8lulo8pMHxmcvPgaaqehoYVEULWa9n29di97zAOQX2q64uwhPjiqRAsRktWwY3wDbQrJq+haTdnRUm9REeqwbfQ3Z3qB/TDrVIMwY6/5XDUZmiTiXkVEu0U/ZMQbDanCrCWApGgf6YdA7EdHxAepPGvq4gDayMDXXAXjA/okndIQaT4YmQNjeT1oav6PIY6HaN+y09ATTQzo9ZMeg/yBmL2i14NPQeIavsPRwmgphgLau+I77V1WzVEhdcCtRZsJpnYUofoaHXalJWPundFkQQmNHVurTzZb2uAj9N9YwA75NSQbIEI++4fs4ucgh/LBkf0g2BzJD6iSWY79zY+SPobjWQX1oH9WrFzsqedv3YokOxfvRShp8B46d4oBz59ebC8A6UMpcFU5lQmFdWr1x+oGXyD8w326s4iUY1IfC8iRqf0yzf6PERQ+a7kgv3ARiktlEaPW4FY7dPDV1MvHLxwPNcjeDPpdQJrTAmag8Sme2uOx2+2xd7LgT+UZiz3LpRFhmWpcOCgQztiudwX7U46lPtsT83xnrDKFFqEgwbQydAGDDntYJ1OQAcwwDLg+nD2ZhGQQIgVg2CXd0NERJ1R30tIov6kUxfupkpzZmWI9VNYsfvgotDb9XPPyGhIaxAGSSYOtmWFO9jfNOksphOSrq7f7wUsW4hPW5qx92diNeQ/fLoZiskdB6vAawEcy6lpoXjMXDj+ubLwMbACsLzOTB/yKMr/vR2k+PP3p+2b8ISINRSU8hVddZ9ZC2MDqXcr4pI0OzXPGTzNDgwFX4cbw91GhmMvvFwePr0VwqGCyGQSik9BEguuPxmYGI6tXwAImYk8DNJrf+CKfe4wYnhmMDWZ7K9PnbzZQlBljSFbYSIH9nrzb0PAUHoSSmjnVTUQJ2TXxUYoQUZXP+Dw/gFAiVyJIIlI18lg3NoRTPzreOtq3t3baWormmb77JEpHGHew7FhYhIRwODNyKxqGkY7uf6d0BLOXEYekZyCN/ag94hC2JB0gGV5yUKDvDHXdMOaFDd8rzhk0yJkCcjxERoAsh5MUUD/lyhqpCxVq+PpoaMWcTQ6BmdO9ozKnMw4EmDf0TydAI3grzxYDYn1E9SrXLilsQQrKX4VDJkjiS77Icm6x6qm1coGq6WN1+vHUFPJY7yrqIi6plUh2YdPrkW6RrghOUpwiBf6ND/ynGfUiXGYxV0jMKFpQtD707yZcVpGGrQHQlJvQ1hd2II/1IhIWkxsOHHtkuwVeZN6wfJwv5PyipnqR55T1STDQNdW2R4MiPVwNRw4uVmuRCSNA3rQiENxXzwyBtz/R9trWW35scJyeZbG6MvceyYbI0m5Xp9J02d458Cy6SIPrIC69iBHlfZSvhPulKm4HJnyiOkdsG7m1UQ2Cl4MA/x3AAw5naPQyrZ00NZYxZw77tsVzFqhJrM1pCQeAfoSZ8mGjRNeAVbNI5o1DTL9flJCAQl82TNEU4I79dpu4lenTOvsprf/JNkORzAz52cPBj4mERmT9C8BIY8x9rd2ZFKRM56KVWFQ6RZ8zPqJ66j1nTDYTvmCJE67H6fCqEzbeX6VJhqQIlC5eoJ0FtoQRl/d/vWGcj8rByzHw+iaGdg1gC7kbAOvyjwGRjhG8nVyBeZV+fM9ZFBsn+5SwZ2FTF7hvN6H8d8pQr32LWhfDR6YWKmYxUypki5WYqi4gpKd5BzWg2BfSnIxeSchqpv1vcU4SMg0AW19vzKvz99bypBgvgo9YLyaW1PpiRIP/RLp/hafkVXrHTMj76Vmunnm9f1HpESnTyNDTs02ZJMMQjUUH+O6XqroqVEt2Y1tuk81LfDzA0PyCO2b+9Q6+G4JgpdGe3OywmLJPptKyTq6mUFzqfdLVCMEf1OrSyeuoyvz1oLSyvZlUHdhdZeHp2/wjEgM+K54F+KbEgy6v76HKXBNmrZnvT87PB+8TWVmOs9W0MHQMt33CuI4Aup7L4wwY/VVQRHcYfyn21ZWdb2a+7JQ8cZj7hjPa5N4f+uszNCf3Y2ysDza21KBkro32YDpNH1cZ0JQiDa5m7Wj39PdjIZS/HQ4eR1oYvlZKmyowjoZsKtnTQQqoKuP1FNJsBZ1GFLa3a5atw6Kf9Y1Pfv3MYjFwhwZTUwxV20VoMYbVYo9KhFYB4HQGLiwOXCaaRTboKk52b0uW1ZcFzyvW4AB96YQg///RqA7mjUTxnUm/4vAUiikUu5jGjfz1ybBJYyliuZ50RMwR3NlCOQtadjD9kkvn9x+XtkMxRxlFG/CUJOxHB2QDUBBdIDg06kdZ5mHhJe7dPB9p9IZAtYuTkQJg8dNu+BY2eJ7q3RCGQKAuA2Jh2b1Lcgrn71kR42KdANhg7+plwZG1dmcvyaJJY1gT/Yzgu+evZxX5/79cNrRwM8qM6Jz7kDapP/wLJ/ZsI4t3FBApiK4uajgY0ZLY05sbTba/QZP4MvJDNeJraiOSNN0q3WSsae5E+c+c/GZogoiBg+TLaM9Q5YlJVkb+ExGZ3h4A0n8mQg3pRqIeI/FLCUk5aoelCy7IntM7gMOZ1Pd+DKSy4opFLKUrn3h0DPdY4Xuk1C8KK1IFTTeoUV838zIDrjkFoIrXmbC9c9TpKuGucnM4y1ZBpiP8IrbVOi/woV4TQls3QasPImblXEAR65L8BlipIyzLsnfhHet/XxNUZHlCCOEbEmhwKDwYQfQWt7r1E6JTih03ASMk8f/J8FMD1oJ1TZJ3Q0wzOp2j41F6OhHL8gX1mj0qxCbt/+E6Br1hF/HrQXsZJmdUAiiS7goxHdilsI+/Y9UTjWlZYI6Oia1x9iMr5qthDwKttcko1KUIQc5l0NUtleR+ZwxnISKKfgZgdyBaoax7/NsHd7OvXuzuaad7maCAsI718lqUHXyGUKobCsNdNWdr0gXseQJe5qtU4xzny5CV1eLgN2xShETCW6E9shMJItaf9I/HRTZWkQs6wbr//GJVqBUOg91XDvcA4ujTiu6lJxHF0GNmbRq8h5zklbNAQcXa+BbfwXj1pGvAQ98LJx2bO1mBr8Tg92/cHDty6Gk0Zu6W74wsw6L3OKiKJBDGyQh3U/zUmgh4xdc5kgeBUGb+cmZDgaC0Ps8CkJVYawijOpOxEO/7uGES0SQRAEE9TswaMcF2+qykVjfAsoJZdC4VeqXC0svQRr+CIiLsJpgr2jtjgMDQv73Dwk+Ax6D/SuzwOmPgDWIzpGgammSk9aB+sQrTKvIzAmaptfNigAodpNbcZ8r8eouO6ds5V623ZEXVZfjzVHwFf3oySzLHmwR0tAGkUKbBe1EkZEwVZLk5OZzAZu44DniipLosH9not6ffk8lj86+8VYukXAjI/6bGy5iHtcoqxF+9IwuxwCIIs7DEx26me7x17sJ5am99/ihrZkMwA3CnxkN/93FZUGXDMyIT8761LS0888fx2Oqrzjj7LXnZgqDWH7T2Kynvu57PEdQQ149o3K4RV5eeP9PjSmmcgPAywOIL8BtG3eSnIDnFkkNQsSwvjAyWa5XkA8j+YzRgNb0MWHzzsyJv2fJdy0bTXCk+mv8J2hOqrdTI0+OmgbPa3FKgUDBNv1GgQN7DAc5uQccSX8llfj7cvQQNPvZl2cwkv98UYx0Gjtoe0BWdV9jCjBTsf2TNyC9nGurJ7jPlwCKhhEj+uppsK9XHGeNJfvCIaIgNFPck6COLrlPuNUepyIZRnUQpOH4fRul+U8ZHpYIAKUrkRrNYAbiHsDG08Z8wNdea8keSZCRTAHOkz8xFCsEd5zTOO3aBzMiP9JoMetsTHE0NciVRwJGkxh3mfiIVhPGJyW9GqHSqSxIzKa8RrwbhdDKe9avcgARmW1NELEq6nSsC/HzWTZWeCKUg1IqQ27keSWYv7HKu98w+6fjykrL2hELeC+dIny9jfoUjy8ZLCC3wXSYg4jMKDdDBbKhMsx8Tnmu3PDHEXHcxCxVt4aNEX1+wK72EpKJOBnxjlsHNvNytGJLW8kQ1aRKN5FVi8oF5xTdYYDSNcRuAcZLHyTnB16FdP0h7LYetdATUWCHUNsDDie/MmvHdPnscopwGPxrICd0UPGkijAwYEGx1cSGtMvyVgJgAkq3YKKB8G0W8x+g5gAN+v2ikC8TOlBkWdCqzgBISH/KPNMOnsqgDu96/y1kRerHDTwJr24NCu/elUnFTP1xPnVJYGougA2tG9JljBnYL8Y5I/kyoVxg7IbSx71hLPdpfFAmdRFvRbUGvlwaYcjMyYGRilILO5PQlNis0Qd6UtNvdZ3cgiLm1r86H8Ljj4NwKx9j/FwiVNUB3W4YhLoXXcjbpLa5tovQuSd7qiEo14bXpI0cNH9hofUd+I0jWHidMecmEVdUshN9bSQHixt/FuUBMDnytBO/353nLJQNkRNMOqOJn+1PTDNk5aZW4W00a1z2PBnMdqIFvI8rPiBy4t9Om6CYF3Itj3F7T8cOy7T9dwRt05QaYl2mi0mVZPI/7pqenPrDlvfWU9NdJzU7VcqGn2B+xz7iY6dDS2YI3j19GNY9Fyn5dBv2c4x8YUd3ZoGPx+Yb5W3bq0fymjvqPtEFgJ5rFB/s1sv5RhjPwxBUKzm14uEors/hXhYQkaSQsAHcUM1SSPLb8MF79wRU5QF1Wt0guUCQPuvpOH/K7Ihf0/xmtYCWB+HX/xYI9htvmR2tABoUxpag+atloT4xsqjy8PCpNFXtOIU1+WL7wIm0TRxW5uApMr277x6d/ECQQUIVSkdLY7yz90LdIYBO/FhRKaiLcuS9kTWp+HTgztKDJrN59j6NdiJACCzCM5jr3f4b3rI62oXLiTG9lN2QMJHMc5zVjqw2c3geOV6YubpMSVi0oPL9bDjurfwlCCb0bsWNSh4C2o8h2SzUZgzchfPtfKhQRriQubgVpQEDl66wX9eayaFShlRc2hUIiAPdmr0F6p7sEZ4res+y3Oyi6f6YxR6mFkSeWr3GI2fi5wLbQfjSC2AJcd6d++R4FFJKbb2p0EQnMQiNfOfQj3FGHHJLJPobGhV43A91pfzC0WKSEPYqAuFN5HN2H0RUe8wB6MTwBYMOFmwkEvjlTAQnP2Dr1cAuETX8mC9jIPuRw4Q/+kyCFZ8X8jmlZ3scTgln/6OIHlBAvFJxPLbXInh3Ysr9ImMl8+HPEeyIEorMWEzyg6VtXJA1SijA0KsniHpXhS1TaMebhlt77fHr8VI1NR4MA5W5sFnlHm5jGQLp5TFFnpQeIIH0LqLx6OtpJ66YGcU8BZnv5QY+hFQUu/c3Ixp0u3/T7eVzCRcLieNp2xNXDrOFyVesznKz+4C/k+sZoT4Qux4+M+S2i3OUyROt0VYi2PXOlFL2w3O4QCeGfGzhIEg1Xg/+9PPnwr9FVLf1k2naNBIX8IdhXVRC00kzbEwY/snfI1XnlF2tlZD582is46Yg+76e8P6k2mQqFh5AH6Kuj1Tz7QWkkvAtseZaVia8IcsqBh9/9KGxXTYXT+IjwwoQ8wxVJdLLNsvoWF+BaXxVfxVuxODCb3dMv14/gh0lXSZN0wZJRdZ4qRppxg1Rp+8doKRBVeEgcS9wlkafDeG+l99HOdsWGUrAVOOccw0EjyMxeKozoDFfp6hLR9gSItu+s/qlAlPIzQsJFi+TaiV+MOMqr6PuhID+1So8WkosLxJMN2ifCI9sdRNfp7aKqoYBMKxZilgiaKeKYS9wc6+wkL2Am07/cZm4bxaun2s92DueczWgBK1tX7YnC7Z2Af5ZDCDt2aj2fq8SJ1ecPct+3RpB9uePWzW+8FCyiOyUoofd67w/cZ8g0QO2vC4TGB3J7pGhBjZIeFtreziT95dJ+JG7PTQFc4G5GESmn6f2dO23r8nR0JCosW6/QjpLhpQx+xyEualjwSSLdW8HuGhpWI/UcYVZBtl9AmSIq/xi7DJkJYFrFqc7UeByTRAwMsJohs/Jx7pQ5QxBt+sF/Ax+2sDfUOcU/4YPTKNkYlt4BS/+xKgq4y6H/mo/lU4lvkDMGX/NOzuobDCGdFAbi0A52wz2mVJSXzAJHLBanGMDiU4MP8/F4VQfhoR3S2OzxGun4z9F17l7p6Bhk1vOBcRlFp/d2hqGfRZ9DOoJufzdJaIJmgZoBzMMT+cFPByjIUc7YlVC73CEh0mlPN6aFz+Z6BH8fZT/bNY2p7eqowvq/tW5RvDj9wHGNqMiHWsiwN/wv2g07qZaXpv0xFigkd0L/RguFOWPTAIWdb49k0pk6mu7vgZ7cG7d5G2zDMGaetgJkwcZyzFSm3tKa+FnwetEOA6rlQoBUPqS8iwT3UokEdjf+ZlfoCZKbq14TZFrcvTQiUVVEIrusn0tqB7M22n4ZZPR+G4bWJEP3fsTcgTMi++ZDe5tyLi6gwtMhfgR1ZMYP52e32eedoF7RALUHzf+tJRNNjRUdtRLtsEyjLuRCFaVtViN3vgXv/LuY09c8VbY7uQIIKG383CB0SScO2G/KOj5wyppnsWfAEgXaUmLO1MfhEDnrpx56DdJ3sqBrBa5dz8IDAphCVf/I5PEpzGygZ3M6sjXFJh+bkZXMVubhTDY6oIvZid5v+O1JG1eKvU/3V2mkCddZ8FOwT4t42P3BNsBEQfZdPqcIx/pLOrgY3u0ScQIzf2maCrDR+Lc2rP2wmbfBEAJcpGPixKnb4YQqgOpDwSZVKI91wREb8Ba/avNoW/FqXD4+HYTXcuypRWY+O73Lv5FRCZ+5uBd+zqPh16Dpiqd5/fhQhc8lnGzXD4ZGSRsWzf5OJ0WxklxkqFoynTs6tXauiQZc8GNXTYHknqN+9/olF9b+xu7hiqlHwOlhoUDuMhAACeJJcyVAUkddX2Q2fSzYYbmsu4/PjJQh6ZfLKdofxc4HgJbB/w4nklbKxWMt+LUQhRcTT4QPNinKXUd2Dch6n/8G2XjcXFepzN+/8HV3Vu5h8qcYhcNZwicy2nPHhp0VAx+TyFgb0XLEs2rgHIcnl1d3e7IBvnYG6KMTmX+f3bB8JEMDMm8RV3LzskcYiIrz/5pFRQiGP2gaWNZQ5W+xbeM5IPr7VeJMqv4wPZ5amGcwYk4FTbj8X4PnhKmABbwgNoiK0778bASHVmcbTOducZmVd5qOLu/tL7VDP1EbM66RFv67UCYcVKb54kO1ZMGBX6DYOHyFZtupwrYDf0N8jK59iZZGq41XvEFY/UbkezErQImCRBGSjj2XatslbFjvqvdgwBpNGTRcFf8UKE5MTvCgE6Tu0rBsEkY//HNp1w+ik6f2/DOAqanScQQ72eFdBga/ZUdqwIrd/KqaS4vic5gX1Xvjgl27S71yfqJBaUgtowi0FssVyFxNFcpgA3rPT1HYgo+bdWPaOTSSCLYJcapkC1+r4RDHR/EyUaBHLMRtcw2f9f8aIgml/KU2KAZUcaosgEdiJAdrfrfijCD1dilL2ZiSC0p7RLWA7S8ldvGqCrrWRpYCxYj20a2VS4H7twGVWImUY46j3GDu+OCLmfcfxH40LMrwwu9iyePO+Q/HpsWVo+xVXMhe1NHJ9+o2xXQU4/Ufym20M7MNhIqFeiSVQ6eaMNPYaYWs3CNaRI7hxSolZg71c0fcZiKdc7X6sjyDTU7W3qESHJU+iwG3lw2SbcgKi6RiTWbJ1OpVXquL46d5i3aTQ1IJfATr1dieQA1eTh02UU2Krq9MawZ7jYnSI57o+JQCtL3RwD5lb49PmGyvoE5KR2hPqL9vjijY3u270X7q88kdWWoj3286ygOWDByZXJoZy4ZMDrz9y3RzDiBXBxEbhOyN2dQ6YKBIQq7Sg5Ze6+1hOTm7kBgGBqxMYICaN9omLkaOEHFWN4PVewyMd7qMyLQY62vqcUOMzqI6TzltFyK4xo5WAGFlaLto+AUkXwujdeo/9GfXz03GY08emRDu1gKU4n/ctaxHefKtC/W8zLueesLKjoOyoZSg+HKhPO7hCm0OjDrqn1e2llV0ektjFPwN9gFVucknoqPCJkFenOogTsUIn9FXIAITj+q2j8xxFMW36MxbWUz1GP/9EmOOgy7SDaAEQo0TDj0+UUuN6QCwCXLhdZ088jtRDBy4GaegKXv7iRjpHVTJcE8Z1kK6vhUrqOOrRzBdB7Ip4LFglNQ6sUb7teel6t6NaY17rUnvgoPx0VmUFOHbdGjMAadn7Dzz3cjxVIY6zb+QY+Ol02qys1pJqiaCJIUKf9OKUZahMJpkiAUcKan80zUT6/c4WNyDcqVmOR2VdEznVc0yiTlmATd2KRl9ev2Z4roRjCD/46PpLVB92bc41JcncH1XEu3WDR4otW28EX/MrbjWaKMmYIiuzCB02Gk7nK8tBlsc1E0VjcLD+CNjJp/lkFxNjuAKyWdwV575KU5IMQOvXhyBmqQRgzMOXWXHHX3VgPS2XG887f4jt3ZVvmVX8kdltBNmGFyGcXJA2x8v6lwd/Kzy+MRCf2DoOOUTQRLlzj0WZiYJ7D45ov0a0H8i5JA5t+YrgmCQjtyS9vrIRFtRAPN4SVQGainntRrUMPasWC/lDiYii4Lz4d/8RdItlARda+9+16L8a0GGxXjE4IIGmDdPFNcDGRMipEMb0cZhp6qD7bSe8ucmNL3GhygisEyItF7pt4BJC01Kxvn+9Gf7yQ1L59qCm9RgFOzAlGcSJqs5FMvvOxQ6kPg3guBbX0W3v0CbMP3QWtQGM39B/w7PKbXffx8BQA3kJoq1CPxZmWHbo834VdJDlXBOEnRW6vCnLg2t27UIDD/8389Eu9Z+F2fw0yUPlCHhgGA4eqAte2Bf//i2I8AF1yVdqyNzdZRkuFg+8JWHxPUwgU06AIAW6vZUu+8vdmLP9ORP55OC3QC5Bk/c3zx4WdPHau1nP+87/jPpSmyLc3y0yXphW0LBJtwlgEOndfnycsr2xOY8lCrpHG3B5P6BKfmK0fk5CDzJEIWnL8mktoI0ZH4VhY/UYqDuYoaILr9y+D5A7c8MfyQcn/vfM8qLqhfaRqFoR5O22F2zpjfRuKkDrNm4uvL8qzfyuFJaY7ROegUs5f7XAIngfyK76Gxmn63vX5MGOhPqGwq59OfKeN6+30QrGOaiGSjnCFVJA0j6aUOtFq5TaX90L+CpLS25NLdp+tOOOA+eS/bHWdzfXjqfzznj034m4wfI2lcXFWa5l45sSWYLoYOhsNUxtEFVuQY1bnnuOYLNHg21Aq6oTCDCcsvKZ1+92Rk/9pya83plc3xdgiC6KTIh04W6jNIq5UGYLngP1cPCxUx1KT+nxFXhaFZzE/6xwhdMk4itW4Z0lVJQ9HhpP+6YJr7aqx4uYSW6DRoFXh2mqL9DDE0CRP9PWfdz9k0Qm0QsMb6bLMBden7jGEqiTHvTjwBmywbnpJgb0iS5Y19l7i6MdXrP/bQkRVe92FN/vbKsYQMKK1KSKAMWlOFekTpzbI4eXjFAo+PA77curl+VVQP0CoVg5DH7GsnwE4tWFK2GQCarSf09hTrDCgVneARNPVE2moOrsLnC6NTyjSJ3jdoaRRpdNdd7DHlKimSfzcDULN9JJMDS5vTzE223tYg+7IviwLPdFh0T1Leb45LtTeSORWnA8yP+Vkx1wM0rqjOc0sw+jL28XVdddFPtKuxvus030c7mrbVu7bKIXTF57pxKBvH2/Q7UfDuyt8q0tLLL5ezUCN5ln/l5Q+uNL4oIi5CMIlkYnvBbdMHtbvPyLbJw3917WGKfZexxzk0QHApXirTdWidCWgoIS/O1EYjx1i8MQ4x5Ckpi5C+0Dhx+Bb2/GvN4KJVB6Q6ZdJcRQ1XVq4YpmPloFZojn/9hzLqXg+3qJlBCM9jWMS+3MdleQUw0NDZ+K1VR5cAzj6X7Q3Rns0/Q+NHbUJdKFjU+myFww8RjT/ihWzCirphXCOzVQZixcNu2b5YEMAC6RA3/NJaKjC9XYPeRZ6VeXghdD+6JyvnDgvtaRM6G7Zx6YwkjuE0NzLaOFslMLmHK7yWyL/5YYDw/w1l2RTI5HDJvBJHV203t1vm8UI+s0aduPmE6DYFHbmdY8yd8lDaNf272+4YUTE8uyHM7RXpmWzD+pq+kLfbBGH4sPD4O/1J/Qj6EDj+YHgvngTe4GEhKWUZHLrTN1ZeY6W4sCNVqmYKz3mIGNy5/1PotZCeatfXc6WrKb1ur7uQBmArgo5CeTI8vDpsRPbzIqnO7z1BAqc73Tfdb+rsVG7C5AcV9lsRmV/EEtmWAXzym/WFrO4/ZLB6b/88AGiebIg8Hela1BX3mKn5JPJ88/i9Bex71EPsqp1OTHW3R9rJ3tY9ImsVN0KK0QIwBChWK5rKJiiz8AltF/5fQ/wctRkGDScA2sAtDHYqa6iP//v8sxdal7YIsJkAvzrKQbjUmFN+NQQXO5S5UuB8/WRMJhkFv0MhtxU98ZNqXtGaDWlA4JXMLdUN4r6244NN+TOtTymyrn2sGfyUbts+YA1OnkT5Ao326O2F2Jvtg0xzdmKwmnvioLVLXemf1wISWlaNDnXOPepxGN2DwDwT+WqKvJgMrF4pCuzMF5kIqq1YPvTf5tgLggbQkx1rYZ/H/Wmsvyuk4dybTFBOwtXBb8vf37Y/oLM6ssWZHe31bfvgSONM+r/IVOP/9lz3fSAvpfaDVjOjj6/VR+/3iOu2cA8dwVgGzD4gkWJJTpzGHRiPR98Uwn4/wZOZZzJkwc8Tv6UulkLG9KH+3NkScubmwGSPSB0mOjYC2VfInRxCuwIeFG2KPQX1aA2FDYd5goz2YShja0vQTsfzewHpdul8S/IydJNsPqAGy+73ZES9L+1dHftiDg3vX7n886gSXnbemPUEryCZwmzShb5PxUimmnTfmrFF1ZrlM9a6FSypMvrNvKkxTqEMOEcMYfOipV/yOuit0clP89T+jEdJjEbpGZ05cvIW4/cBNI9lTcE3ut9QrMVfuMIbEnNc/p6Lk6rqfvQ0+5WrVgn41gSHwskT8uK4x9pa24EE+mwQlHhx5DlPkKrCxZ0Ajf2malFxgWmvBrYdsQwg8EoSJhRLYuRBOBcSqiaCZEcRHiJSkJq0l5gl326cbmKME/pxoUGWEBkBzl0u0QWkX+BXNkoYFQ6sIG7nT6JEDnjTQS7kyqX7AcdMC3ta9mY1f4lo4+K0wO5J6K/cLkApSU7zL4DziaA8Iah6OPKqattPtM382sqg5t43UM6wPs3iB+7XhXaMgSmYTJwiufDt+qFuQBjAgEbGorBuo/pNyOSqqeIGxiGnua7zuTb8wgAFYivzJogkxnjInLl/fdrM6/fLUDzOgt62YbBWRZzn7BfZGYO8ZkYgxTMuTr7WbM/Z7hN3R+6oLeYIPlQouvNKP0T/k36OKuqsncVIMvUceg3lgsedyMAj+ayCZpAvKZ8zQ5YcI5ZrrroU8LyiKkLa5oll1+hstbXZ/9w1zk62PGedmhtKUDa/vro1lcTaVue4iAgahz7AsXMuuw3XVSFKGgUmrjRZrHm0+VcZZcf3PyUvnmrdWgvYoLUQwCsq303rZSZhtIKEUZMGo6Ji5dZqkX6OMhWpLu+mvmjyRSAJbidAvHCIhs72QrW/djwShpal3bSkhkqvAliUmfTTLzOhXRcszvKnlr1QybF4YdL+PiQbFZwFmHz2NwHGjkfHP6RMs597rgjOm+3Zo0VE9H28doZNMpL9JpPyG/MWHEG/ApxeeEkEzMR1pr3GJe0VF/hq4IS66+nzrCRyhrE4g1ynUrgGmPzMS/qrPucvGODuRKvcRFupBr4zRDbxfcDpkhOEM/0OCYVJWSZ1OpkEZdMY9Pev9pYU4ug+YyAd7LEUgPoHRFcisXwRkNJKfjYaQ14NDaLBJRXX9WCx3q2xwfHREKFjQjfZp05IZn/YBw5k1yYGR04fQSTQISjmDI0a6FWts6jQe9aydCJyVPzlQK4u1xU+/okO/xqz0LpkhFGS3JsrxPt7CvEK0E6peT18CE/RKt8map0ZTxGzEPjWc45zrN1svA2GtbvcvytMcn2SeA+UfujCNV/0p3N5lB0ES8SNbjDGv/Vy8gm7GahlPh6z95ckQvR4G9W2MtHPlizXzFMgKP3WbU96ZNAYwRTzful94fl1859cLgQ3GWaoZjNbMf50a4siLRK9+5t8OC7Qn0DcLuiW7da91Ht2bYsabWDtdOa5dbfvt2qWLq0qWqee00jHXQeQmEnsCGBRgVxpIPY0DDXj2SK4l6/TW3f9oYYLRJ4uBijZWnFXS4VoGJbVDWBoYvggz0L0Sx+eXmo3wFiJMV+UoWDF9fJu+yH9Q8K5I8YbRTcuXGiiZq9ZSq9gCxHG0MYO0nnNkzmyJ92q+pBLC5883LHdM027XyH/MMvLSs0Jd/6/aDUxw00GEaUioDeIdi7HdhtyacRQWRbhmsGXYeuNRqM/VVbZ/hfm5TwovlnnIPddFTiSb7e2eghPf1EMlf1HpK2yVrNeEozHbtmGBtwY70BQX91rgUfYvacgir5ZpYvbC5QVe1MZlGBVIs17eUlgq6AmRpV2+qr8qF8mMqPTn4VNNAYhKe3wJkXfkNC9i5TElkTcImbPw7TAbDG8CRTHIN5lb2q9JETIb+BaPII/h4UTDTcBo9zrcfR8+QRtLCgpOer9LNxAjhfwLXwo6ffSuXThYNCmD/g+diw6HsOQeFLYzsB54my04Kc4pHeaI5j9y0Hb5Tl9fKwVqbwB747EPvZOa5lrCTVjkn3wgoMqaAO6JZWZgedLshRVNx1GLP5Tb1QWPWCbkh9McaO91jl2pL/tPo4PAB8XVn2nxijfb+QRritKSflqjysSQTihmoESKn35Oc6iyCilSOLaFL1ontwcmfUAj4YVCOlwI+/2ToNal1qdMRtYipScYaCwCu1cO33JKW0BOYIBc/p6mVi4kpzI/wozl6TdJMyebZLr6RiekJRhT+r7x8nEUUKvEXOc7LSlTLWe2I9/T7d9CkXvQjLeJhq/sj4a/MDT/NxSL9ktL/VUWdEn8kQC3kC9oTl3WYNQN9N0Gu61x1bukEZ77TuRRSNIs89GXfXZkeJqQry2+ZwFf9udcMenFPpVon6b5pIgwYW3GzDEGgPTCSldDnK1TuADM6LBaWzmSjMQqv4z+zbKKvyAFh8rO/eZ/eHvSzweL9GAEWX9HdQ+Wqng29EomNTVxZ1WmosRjbkZO094gAc2tr7naQKDW4YzR5Jnp1Ibjxq7I0rpxP/Z1v48x8UqUWYlc+ZRGZoMSd91dSzCr7Rm56vDEw8SAmUb68R7tF1zSQW2OzdDH/tfGuCMviZO7V4Ib8S3atJwkeoYXtlqQY+sBslm1Vml3ImqQL0ZEaFdYvwi5tapCwaplOOIN94r9wrZA+/jQAx930ALVtsA1e93f5emxveaAIaXB/uNRsFn4gFRSTmjBXbQCKmkFoCKMC7PRNfKQLF1FXvmluANqBEBdPufB01QrWdL5t7xrXm2lCSNep3DeMG9/BZaAfsuQ8eGM/wgXloy87cTBbOZmzAbMGx9bGWuAZTypj3kQ6JQZJgTbOlSpLw2ixQwfjgRuEfPvm8H3ck+t2Z/gR9zd0DKmq1ZJXh5K0gbuqOMS+11hmw76orLKObeGxorOw4bzFOBK+evAnrBtAZ3KYKRiSKTZzPfLMY9nJSgg6c1uDWshn8BuCEeDwRdiu7faQK1Cx7CqzmZr16fpGSd3DUh3wdNbnMdYX87pxB8MJ6fubIrzqwSXMT73EF9OhL+oyBPHFUU1dl1ve67jAXh44mL4+m3ci/X8lmzHHMcVUfQEOEe+Q/dodtMeMgDSlwCCrJQF4nF8RCUC/mvx8YkN6Qmw2xa47ReTP4lJGZzL26bDDvc8Pwq8fwQWRuzKcBhUYS3TbcUtq5U0PcE9fvNSb1cLSvLzug32kzPFgSSI+ou5CaolO4eQ0yo4OhQ47iK9gh99N4wzKg9nbq5Fx6+qeKoRctnIMF5oZPtPNsXFIAefz9PkpctCxctIRAIPqc6c/xHsPKJFPqGO9KOtR7HD9Y/Y/QM4HCW0BZurXbfTosU4uwkSQsfcw2ZGtYUGVx7NSIlZEBraxR8jyFwzQhlNwxBpZOARyF+OL2k8YxHfhNatjQ163aylf0R4T0wV2zD/gjEScQYpU5Nyi3N9d3294m7xi9U/iK+zzXUtdrf7avnUz2Sdbh43BtnGnVlJDrGwkN23TM83vRp7LgIpiuQTOAGM1GLdnUAB4z2mFdW9UaZcyZhNp244Rq8xndXHH03F43gUbwKE4jz/11ZeF3wW2jzF9mcYghI1KQpr+blU+6ntcYTIhPHvpiY+dhpFThq7ebeXPFULqK1m4aqCGkw78LD6a+dpnPrtBAYBGu66ClXvejvKbcrjhrvKv9iG8bmOZ8UJl+ISZJQvJas6z9NJ/Rl5PFKkCz78oLMFhAa0ND8/xiVG3r/0vJXwvIdWN3fnbHtu0YVKyorSf/JPMgXFhJ/zYgFjTxErcemC4D4E0mmCPyshEpJ5pauPTSYb6CoKBY8tD9cvQEe7JlDvL2AMD5dZGzyEf+Cedn3T9TRukhWIg7k4yTJ/fBkYyzWlb1oucMQFs0jXaXrgYTJTN/csM2LmaxHiamRY+7Tuyqwwp4w7Nw4klkI83CwOzVupoejSXiEWZ4tMvU+kAofqYYaAoPbyTqVo/5U4XS1n9pZlzS0qGIhg6jrOP0w6S+g16J2+qO5r9JD2QT58hziE6PPDxPcmRl4IMfu+/paArkoIcx+SqNFx/qzcStYCTKBworaHdRzOlZkWtzIklayzunxnVNVPEnRChuLhI6txyJWZlX+G8xKoQwA0CEHyUV/zji0s2r0Vm+evSXNVfJJlbeow0AW3PvjWkMGJk7zrjJ4gHIce3VPOLVqZVlaMX8Xj4CId0ErNiI0JF6NgQ+SGWdZtlaHcml/ADLY+LzaZdbROELayTFAj02kfOB+3Kaka7nZ/obVTHCjfoySCcfQuGXjRhmzhR+MFp2C7xPCa9cWRwVj9rp1A2OUIOy6xF3PsLIdBPq2uSY2jcqdYkzfxisKPzl+cvNTA2VgXl2odn/oCcJJES1pM6mdphBT9P4AnkTqsB9KKfZAV1L+7mClU/W5Xdav/ziJAqOpFhLCC7TueKKT981u4MZcIcIwsQ0FymqSGxKFT2RUquEAlF5Fh1ueacRD2j8peMKPHY5XZl/Pagrxupp8TbmeWehfj1dUYZgZ0h5ZExmBXj9VjfPbjA9XsH7ytJ2b0wYo8YgoLwgHAd2FMU6WAmREzLix2vT41SMa8ACfbLOqIM3KrPJ7o7x9irl92cz0c9Q5pTL45tFlcBugAh7gEl0kE+cnHO4dFv5dWZslpfQfcElkoQTzf4uyOT/aM4otskda/MLr8lId0Hgv/ypW2ISx4NVbaHd6MVWqmNJ8JkOG1TnUXRIbXE8V1gFY/wveBHFAJjU0fpE9+kykqcnmR+QzoFXDUlbqmBm42Y7rYElig7zfHaLO6WjBJr+GFAPh71f0G1pvzIeYZFf7bhfBr4fwoFWujevJ0/21f9Ve3qPZvQJuvRCjAcgAuAHJ5I9tPZi2qStNzNLn7hWWMHzN7J2tpDg1XrRhSvWzGcIklisOvbltYYMu/YubnGX6tPQwem6G8FEhnDaxZPHTX1ZnL+ZfYPrarfZkLKysFuWoCMOv1Jd9KclKk1jjzjyHrYBaGJxDOg1vG7kZI//QpoIrQ3jb55G7/thd8GZWPsJYhOcXG3NAuY0Yzu/M/FZakjFH/T042S0W8QKBtPcUu1NtzIJc/nPzH+9RRjJPUJRH+AZ43Ongbn9egGTCzxaof8kfjjw1PIa1hseIw3vGBwv+vApDt0kxo1C8JwpZ3K72UgT/ny5wqOs56IMRY3GeGb9C6b4sSFIkQTIJUoXlz/8p9IXD3pwMT8u/I5QIDOLbt/SzXDHVDFZRo9+1oDJpi6L9dy0ycryrBy/ffyp/8KtB53ppqu9BfUjKmAWGZycoiIEIMXvKIudcMq4nMtv9QKiAMFV3t4gp6uTuq4peqo79eflctQmAxU3yfCMYWZ5AWDIVPPHIY+kfRe2XQMCBzuedvSN6afb2iPD/gyMcvtvyYuwLPjaUE92MSR3aYWPk2kTqYsA6IxabQKENdCe9IaVOtkL9lET86+wlJF2iZqFwpYCJimXOHlCFB2m+H54gq3OcjTKkTlOLT3Ori1MiVl7bxqnrGpapK+C8WEpo21rShP0hABrRnKpmrx/MFHOD3q7rHNJqMByq5qfUdqXNY0zzmXfy00hMAmMtmx05fiR9FMViIkMZOgkS81Cf2iCS3kfZDFdizkuoS8zoLxavWTHq19O2zxhNVV/6MXk/G5v9NlzuduQnW1Du5+clwXKr4hus9ydZPe7JK5g7GlLbKC9H76hSrtUwXxAyu9Yh8A3RALojjutnHmyJ7f5HVcQQ1iJ9vWv6sz3FVw9EP/KMfzdG9fRNY57Dixmk8cMTX1GOaLHy/H661fa/Tja+Zim/8gT6KrVt74cB0FajzTwfqdPrIsqrH12FhRQAxGvbFZTytGaH/J1+8e4n9KTgkRQnSnGsvuM5VVT42iuCJEcFIdqWBtN9/71GpX5/Jrfude+16lRS7y8NWNbaDpE2ZtHsj1F3DFr3NQUKdkhOmg7LDNg1YItfv9ZdH+E8sp/+N0//J8ENRlvafQz+V9hR2lPNvXEYes3PxWR7piFzETFsFbldbV+Az7G/F3FUfbEPdPeSPWZOrvPkEOtkBjo5/ZIsnQ3GqKGmqQYq3htJl2b1uPG/zPckopwQLeO0dxxO6iW+wowL/Ke6wTnagHwdwmn9bc2EpD4RlqgjwG2ViAAAVIHI8gJ9Z4PGdDhMtJMfMKdzB+MJTb2uhK3rlI2cTOltqQeT1X0a4Jja6fSXg/xLc5A/hRAB6Zs9OeRo2nXBrAhjm7Vl26XOS1QHiz7lq7oOUPNTE5VxMG7q1NhQYHkJ3xKMA7J4ulxH9PfyNnj/5J4lXlAyYY85vwxY524G2a0rAvfOfio9hgmh2CJj0bjPuJRKdzB++05HKlelotWLvGLarBj4g+j1uSEDVqty7s6/JnZCEsdslrshLLSOhQfT3MULH0zAtXN39VlVoR/9I76U+rVCxlXXQbzbAbjsej/S7uPmcYzEPOkaiRPSKY/ZuduWlAJlyYO8j6sx/xw1blfBgYLnipkfJgTqAfik0jbJ4aIACIZBRDk/uJDfTqxdRI5PCopdgBA9RHzWaoK4Ygu/gIHzrJNh3jEhYXRTQuvtclZHQ4or8MP/MAN3b1bNA3/HFPVTuZ9fs4+cjZAmnyVbawTb9hbDVvNT2PhAib7gj+kTVc3SOZmiov2sxS1lDQ43nwWDZl2EGb9ND9PFkYGQ4CkYd4cbhwbrSVYoXt+LpJza/idpLSe4jzjYDqujiij8oWgX+dKWOHQ409GE3qtxOAKjvSRRvEbJvAEOEcRfrATttI2p/8q9djXsfHPt+ViINpGn0ZAu2mJgoiRqbWxZzIhzTEFBr8o4keLui+/GOtjft14E1k2DDBU9hQxgKdNEv2W61KDw8u39udM0jyaEFjd/Ta0ENK0ToFBdiCnon4+pWAE2dQGB9Hf5SCzpYa/SrLu/Cocsut4C81cOaEi2TsZ2g/qnubipJNo6Gt2L6ImgdrTng4Mm3ICyjgCxVzE7V4+JI6KfzLu5n1sq1HFcQ1M51LaJlWDFtVF+5T0s87aGAis8/OeHtBZkTRpy5Dd9w/79NAWYmjBJmU7eUSlwhFj71kKtNGHGRGQQfkLOC3mJeier7WwWlE7n5NjLVP5T0ulsq2MSjxI6qGnjGjteLoVI34wkCW+ZL19yb06/mOTI97ZZqMP0YxbqMnhzJxA4k1bYdHFzjA2tNWMORhpeZgFznYP4iNfcq7lOlxDQXiuHz+W6iPLf5lrWlH3aFTU/0CJF8W4Hy/G6ya0rXMCDSMjfmUJNw9AePeTlVoO0T8HeMMZ+A4fIM5ZjeSktmlNqsrT4Kn2D2wAX5QrP3IE3iLuo6SElZ8GKQhcvpPr/hvL2kmKH6qgeZBoqGLwf5nx6DJWOHJn030U9j/BdC8uVGsFP7op3kH38PeUNhH+ieJHFsw6/qVxdrY5amgGSyuyrriXiVRYH8V6Lfal3Psmm1nnjOFYTxTf7H+LS4ZkYHe3D/3QNNjccc5Rp/am5tjvSCtYMZEPap7cDtF4lv1YOPAeW7V4t+vnnwaXBGrtOaOSnSnFaVGPvgVcZL8Nr4+KPE0CBMDH/9oYQdZoyI8NMJ+rDeM5/HJcO8rlDlRqiU96A/UozjKc9DOGy7Rnh27vYKQ7FcLQmTQsaFp24P6sK17Y9JqH/C+PT8P6oas/dqG78lkO38btKKNBemy2VDBmDJe+QXQISACaKtyptieGpXNHc8Fi33kCliy5r+Mo7svbXMzSn7VNKQ/76vSKl7O85gf44tC5YKHdLjIGnI0BK/R2dDgfLmv+kueThT7hqsWPotRqVlHu0VstOAADE7wDDTyMQybLkyqtcDHM04XpScnzG36Wbh7JMF5BwMzAu0JPFf2jGAuJ85kTZxGGNqnIrLy8fQrvKzU/LDfz4I/P+u9uPcDizLVaHDwxmaL63CvAq7dnfJzAdWEHdT/JwX1D2c5G91AJuO+BkGWAyedjupccx+rhmw0JNPbQALq4fbd7Gi+QvTKxWDLV0L/uVtPUoEU/VJJfeUV8AA3ai7H6LJqXcwJum0PjpJ5UESJ/47QK8JM9+rysb/wurW3Q0YVmPGcNlugCyx9ZDmS5hQddaQ9XiN87dxjXG5DhTdTqRa5CzgSgdgdOfDddV3atTrXVzAXgtBqKT7BXbbVt41ojb166b6rimmoSlfqPjQOxivfrK1gIeA3ydvT/nrGZj6BI2VCbXgjvCsCj3r8gd1dFKREP8y7UPLRpx9Fe7DlPyU8WVAHdM1/2jQPB1/ReEEEiAG5N2VZtfsK3yaMgngfj1JSEaT+Rc2pDlWdnYiCvSUWpxdagdgFn5YBL9G0aMSysLfa1pJYYivFPfwOf1z4MsK7Wv3BDS4Nzju8VE6U+jpoFdCfsraSamngAOs+QNo8gxPBxNswNk56QsYJconeqHORAAfvr903l3ShJtw695EwZPplTZ1/lKtM4ATvNgQaMvAXLy4uJDMLFLzr5NgB58MSHmUHNQ8F5ozDzCb9gUa20w4Ecq0o8tTlMmSM4wrIjHG0AYcCJpHUZ7SARqFjkKt1JthcWkx8OlA3v3KrsJhk1bayHSBWrLsrEaEJgVbC4KhnZPcXKXye3MKoY6o/Jcn4rGt8klV865ZfzgmV2azPjXHLH663h5ATpKTht6fP0JawSHFKiHZRSGhSt8GxWMhNpPVok10LBP6ewpOfge6sTJxXuklVeHe/APit+MHEjq15CwADMsRzGmeVAhUuelWiyeSEAj+Lr6gsJMhWRvsmKt4WjtUn0Z5ddXjZVnWt0rsrRAWzy/NKsIUtsShLnJt7p4eGQeuaUJxxCluiIVd4hwE3PYOOEdCn51GOCVZK3UL5lkgecRXrg/y9IH3JedtNMlPf7Rs+nGf20/0ABErzyz69ls+D4RdvTrhkz4plIbwWEcCh4paywbiM0+GUpcpOHGFVWFHVCRP/ML/GK0r/ep27Hg+VxXZQ1LNqbK7Se6EHrc+owBmt+XyS1Us4x4bMNretvkMpjTT8UJESAoDtIT5tKYWIyDymf9JDPGwucJhS2Vqgg3DSztCAzPDUa2bsxZWTaN54LFEro9j9gcIRcUjKBU65ZlFbzMNjbY6zJ8mrP5KtRXt5PWI8Icyx7xNwJ8CCWujKxVxlcSLnOviU9B/UsbborOnlmK3w8Q6mx87XTyuscifOg0McGevTGQyOrgraCBVVwYlFLzoMtoqFzxx0FGK0Z2/j2fix+Uo1vrHebRW/QOXyAf7a8PV4uaMpZEoh3JDTHJnta2OLeAs4Covc9Z1gEEipd4s72Gz25VUA2obsQY2auRtltCA4sxIgLsfljLUzGIWNiEfkf8kZURtoAYj/CQPJrItprGzcssPXkGmAaeQeSjiPocEpPMGDx6pPdik7YscCnTjWUZK0W1h4jmY0fJHC1ze7wj/zG7a4smqx12CigUaqHGwd3biDc2cJFotrT7jqyO6AeZgQHwcJQvfIKvZlK/sy8oWUJcvRdk6b9rz3Zgfu3hc1SweHk4gr7SzP94P0YZdJ9+vqnw5Ve3vAaU2tp/XrTG7nG9S4toaR4dTMF7/hIJndkyiPbc+WxutKuy+e59Z6zev2VsAY3pjc0X2qPD4OF6vDsCDT0yaTCXSF54/YrE67+MM2h1cZoE+WLzQBtw3eqelP6siVBl52gj+fOdP2sXPzR+PC8caLM6/M1lQz5WO6MDViufnvzl8gKy7iQwlMRbg9Tugr596SDwRzg+7OI+kAZYCMkc1QPfre7Z0mBrIdcSVZ9kJqEnvWeivXh9L3qsqbayvh3AIQOaUSG4GbIGQDkpEZT+vD6BO3BIZyCmpC0Tc3OW2PVKMgBNbl7SEMTayP8fHJaD+zFx08zbHzLX9dU5Eim2zVrAEwqL59iDDwTndDdfi4XIl8gRmaTtoTDsYtSu5GY5zSIJQYP94Z+oyu4dSWyXV+cMesWdSXQU/gyAxctmrBxDrfTYmoIe8QVi9vqThfd7Nbj3Btqfwu0pStj7XFE46tiOguxGyByPr1MoODs7sn7EamQmauJj7nWLdTXH8M+1/q6MUB2sGJJS+CS46ob8b65YS6TgWRJv5B3WhFG4xzt7ednZVIQC+4hvS1QRnsenrtS6RexiMIQQt7og6luO3fDarxcGwRcNSwW4RtdTTaDCOQMWJWasof9S/2CP3A9j9a5u+w+E/wOobC32siGw/2itEG4K4Q3CLcfKxX8P1xbjydivnf8ycn6Gb0ea5MkxSG2U4SzJv7pRpmRwbOcquHF3NP0V7gjqBN+6ENyX/wz8QQ725Zc7tftTzVoSv0vf1cQzZAXgTBLcOdeCNRQVvRarMKLBPolUqA0YoZAgYOYLXsh/L5eWoyjDYhWF3FDuKd7SlRO4IskA0g3kYJOzmddshe0rLroudnXKBha9+bwLhPVUveNp4Un1sB6+rrNlaiknKD5Ze9niWVvvQ11SZkM07UDKTvgQLYHDkTfjI8bKn45z04WcfvLvVsYl47kx+CxiO9VUfuRQV5tcv1e85eTnR3dXeHCglwEfI37dLUyyWJZridkyPharLJSfi9RehpHe/x5M/dC1ZZ57RV+D+iDSIT8gUGp0qfpuPBAb9Hia3XXqrWJRD6m7ZSNQDrPoXL7YH9DyK7uMEuaNb5pblkaA6TOyqSpfA5EiwonOzxKHa4zVmm0FThn+FLKhHnOAAeiYKC1INNAJkVLPWEjzxlvRnxJTW8HE2+GCngntdaKsLNMaRzmoRP6Eg8iKoprOyWcrvGHOvNLM76SKm+9bRrdYZGjvcmaN9V6YmEg97wZdQLcgPPMXGNQdwKYcIIZZtfh5RPahnB+MVFHNjBP71jfGqe6Xh0kCl+CoBtx7bUnxtNXLiUeC575uKEsXzvl5EjTK/TQRBPiraFPNySIXGPVdsVFTsIWGZvr+mxxxi3wPUhcN/PVA/G/+CPzcGCCUqtPuoC4WDPoXTFaxQ1KOSyFc7b+CCk1GCYbIoA4eQGELxVaupyClY3u7sfSkDvdKku/XrYB14ZVaIEqM7fsfMzlddqVOdOaEHw6GoeS3w4CgHg/81CwcyeHvDN4SKc4Pg8E8U3nybpmKhzqSAccVK5N6Twjwm+b3eqxiFCPFEoqrcNjqkxW58UH5Bil2HBxUzGy/GUjrirGlzKYW63RaM0RTNFIIUP+0VyMxTeSpF7u7SbfBR7xj4tWYKX/YE9TsRLigeWiCqRMDosHBDnFAjQCIqyuphRY3YYEqTvs0LkuT6n4qmQwoUBTuS2+S8epcMW4alOoE8fdBvPefpDmnBDI7xCmWfP5SCzk4kNCSBoMVk52l2zhPtFpR7uFBLUcMWM+NCZvZy/uHOFAaavwQwbQxJFgd4sZUxksQgH55pK3hWLO8JReC87EzrOg8X3V5BL6ZOHK/aMJnzvEO2kGv40MVSuSv0u8Ie/zFpEjrtkn6YC0r28j9RfukQC+bsfGUsAPITboR4Kp+DFVgEIlrVkwgOof/YA6lkSFuYiGmcZZ777VQdgNdQLynRbDaAobMk8UNwdazgCsuNzecTsN1Ac1qLz6rEK6fK+y6TWeLDj56CMvOzC/t3/tZ92xyst3jn88D4H/Oyy858SLZEYMSUPmA1cFf1q59pbvx/AXkAPz/UR1yalyGgmh129CFME1ZUQcg1GkYVmUSGwr3agLtLIlUy6l1PCzxlpoHhhN7EiC3lfKzsmD8nPbILFq16U9YjxPGLGic2Df5mGYfuLSdyXodeKik4GExZYhjeHKEss/GRqPoTixsk134JEl1XV27nIuIN7caHoJCXNVjemXu6qNrtn9mx3h3mT4iHRlBAOkWPkgphF7ko7dMvNeEFmNDr32HQnpNuAFjP6ZG1ItIXC4tBC5YAtKRfdfswijBLpm+nVkY0g6Gn6z8IW7nUQ85EQeDBu1mvbWa8jssaxchSgzXPW7ndvtswfp0TUtlznWbUp4IPWST8+XqEwlt86kUrrJQbggJmJBDie2IVawjnyuN3FgWvdF53avqrIPH6GjwkKpFWiaSt3TWBb7bAdICZI3/WwqUxJ+CvZFdxk3PaLBmK/PUtaDac5HQ3e2sH2T69ni9kJcpf4A2klmAdpMriPeWzC5tJwHt/cgfH2nomZzzPBu6W6YmOvLVTN8loJRg3AqroAIQy6LS/1SAUUuQagizkuEgT6c89UAd0Xppp87XDMBrkjJmFoC70+BSReFC4cZPGq7RNYr+M0i65806SNuBSD6iSk8vr2jE844hofyr9tqWqSAUIhlWtmhBQkHtCkwYdeqbDg1jgOaPMKcPWXPMXK4to1qvrZz3C1gi9NwQk2sZW6eICAa60VGvug7AVldRxLxgpdxsIFQr0ez25ZMpAuoxAWqsAN2XVoAQaKClFkV7H+IZo1wGWAKMD3moDBo0gZeLAbrZdNT+XjnIq2fKTYKVazFABkFIYNgeoZw7OPebiX7twZVNRbhLfnnESo6xh9IiVjVr0RzrOFIk7o26BUUDPZo+T7S3++sdDWkriWdABvCMBHP5ZLkiyCse3C2Gy95/GlHEQ3geaszdmG1lQoDf15GDjKfjjSWFkCbD65RYTTPc6yTPLC+QyzL2fuCG+CjVNalSoWgw42Sj/0E9pvoh3z2NTuKKfwAJ5wY7kiHSTefx7CUoLsksBls8aVg7zyHDWUiBYHtGINeUHuV9P4AaYX2HG1uMXeiTisBrj3PebFb50dY+R8Na3qulOdLGQXmiPEJZ9XcNjUudlOVhtU3I5CPHqDYBVQx7HCeI1Z8OKRK66ShRqRpesHmRLyf3vyOXNQFxrbxQhHuxmiq9wQgbQU3FjGwql62wH7P2Y1TFrSDJ+6FLuM8eoRmEUftXCKqJJdMa2vLTHXh8npDJsVqZzyzMOoeFztn8ewATSteOx2r+OHCAJWnS751OtuzX2dKnvWytgZgv4iMD24qRtY9ezzwJ8qMEiLINJiqnHF05WMKaaHgEhQVuNExBUAjjk/jeSz3BmF4vTo13eW9Y4DyRKDmHYXaszEIg0c3RwjplcYGf3Hyec38z/PCsWWXCpV8Abm9CAuJjrFU0yk175euCOzU3woLgxqlbU4l/4akQt1KH/wHlxwpfTpsJzwi6JxrpT/KOSZEfx2gZ63jGPcqWR9al4MahtbbywTQKeaInKbG/GHH2rmONniH5S1KP28X/Pg8FM0POMtm0VwQ/ZZ4jXfC666CdchTmjrAF6PCnTeAXXIke43forlov5GenxYOncCdYjnu9xHRQomDem15UDCpoFR8arYQzNv7g3lYfShpvNoAj/Pwt3TAx8LK5d0tPo2MDMhQFXS14+n3tr5oPgMVpHuXq9RVYt31qhfSnjE5Ub1GBHc0ehudZwTUgzGubofadTpGihQZ5sdvKlCQKDVAKkOEbaluw0OQHGuUw5p15zWB9rOvBq/5ZHOR/tCIuv4a7Du6Apl8Lw6YX60Q2vuFHSiW5uMAgbssrFf6GGvFoaxNBZMTCgJKztaos0u6jhyi3iaHH+vvHuOHBsdXFokpVd6eLE8GY1JplSLe+k31YDt1+MWNXY1x3DPwt7AlXGoWeTJ54hU5Gs1PvIqaSPpMDVOsOXzRiEnr+M+xH5JLaJfytNatMitH4p8vs21hX/CR2HsXlaw1Ic4osqhQfQTvfwIxO0r8bc03KfSk/g4/f2grrEcHSJo7t299EbXOtmrE4ix9ro49VcVHOHIIZibKszW2hyNpqhuLBhPEv/kFK/+igeyCFzttpFxhHfBGBQvzWk/4DGzEB7a//3srVl/3wqF2WwKLFpLNyCTRuoZun80MWf3T3yj3PXr1BA4kxEZJjgjapewRxpXDvFAo8ZdAprv5yWXKvFWup1jM1cHuPNsJKlfXx7l2b679TxA1Jv/wIixjBUc7Oi3ADJgPNPrNO71gjZTve5/42jt9lo62QH1ZXjfjmS5muxP1/HIIi4mwXK0UayFjD/t40IzBKv+R6RvB3JbeG9gmPGPb2zLO0qb4PyUHCt+lDW+iQSc3FmHwFmWPx5bw4hccSK/M8K2K4QJm1YXSW4Q5gwxVh096Og5bPv22qQ+9fe0gqdVkddIRuA7V25aXye7pfUGlurQH6thndR1qRg/ksWQAzWsOVkmMz+hMpLewQAnaYvSUZgCVz7mAAmEWRPUf8GbV3sm3KNinldK8f0VmCGxx5LJSc6dn5C+ZmWIMmwRftLXYENLwGIpX0jzpGyQYkqqsog1A7+9exrgPdZp1MZYVPbt8G35QAXElxs1hMg+py3JxvdVtr6yCSGguqeurh8aZu3/fXLEP4p2TWLx9cKp+34ekT2xO1pEG+HVECA2+VYpeN2aulRVuAn5iYqvjOMqhes+UhlUSVUFeaqma9smp1ID4cSDunSUVvmJp9UgXHjAp75QygUFvK5OhXT/j+CqT8I1hjIUg59c1ddOqWGyGUe69Qxjwj1KJLy1+Vfyc1wcRXUP7mVoC+fjBmDK1/2gYDyuEzp6nn3od/M198iMXnsUxHo5rA3041MjCvp9WQl+SjLU+2V5dKAUgHoVD+6wHxbLf29CFEXZLeSj/+sC2zxA0eEyM0+xFoHZLT4hra1jfo0z0/XiZiKDCrfz52OvR9iIV5Ubtwgu3zR3aLxMszYEWbIvHJ1+ymimCopJy2UHRkAVGUE8k1/8ono6rOGhp/o/w3H+ii3dh8FhKeXTVbatHkpITjK2XVxQtQbtTnhPO+WiC+yKKGx0dn1VN1tkTMHgU4XJEz6DjEA2QDr3T+Yq5wk+lDzCaoUY7A6h5Assm7fzsSRfCS3FgjUuAbtI1UxQgRJmDHPb4+d6cQGg2u+hCZCWasTEVkpPVCtmeiS6Rcke0nWFk4MfgsQF1vmje4JGrUwgACyG58VQvZIBF2qx4eMdrWjXFyL+T9DTavV+JQrQObfSkPDl50zGPFP0C4n8U5cyQMCHh9pW6QESRw/I3DkxuNv53YXQ5cc+8gqmGXseyE9ClC104MxJoeWjkpg/ii5QrSDu0kK2Hr3Yj812TYRB/ICyG7OCymaJlR6FQSFz46mobwNLT0iL/OLRSVqdJXnd8B4QOjWwoRAfJbLPO+hVmWw2ULUucUpwvNZEoAm75Svm8+eGqmXM3Wcl0gb0XHXM3cfBDPo9YYrIjTfYjvN+nwNyecbMryMdfar9f1smuDT2JJf4/b3v3+q7T+xaHvfwW30Vg2qLUxiKBj4oF1tAcsDm1mgqCLJLDhTr93ITQ9wry447gfALX0nwxtEGmTiZxy82BjV7MSP5lntvI8B6EM7XxGoj8cRL2bXsEAI0IBVCSbYuGF1/69dH9jL2Cyp/prJg5488ksyKpSurNGbmxf5FZrvKuRBUugvJqobr7vMwtZqbxu+awlq2PoGqialgnN3j0gedVgQstzxqBKd4Sotuzh8E/3l40+Yo1v4i6lpM2/JqQDXRVfJ6aYzrg1LDZj2Ws9n5GhK18D+01oyOW54iiepxYIbStUpCUCZkIa/ONNAGwrjcW1duFyVyF9X0VRFoIsRHyjB4wUrXQk/VuDpirGQ6NkvYbGiaG09ndYs3ldq8s9KM3JdjyZr1EANIeIthUXscCOYot1PlayOTyFx8EAdkORpNpNRHgKmyVhNm1I78+2JYxadoISPMS3MG7VzMRqPAGEGulZHNWusP5/5fELYX8eo+4xt6e2ulLiSfsXJCfxvt6llctK1aUJ/reVXdQOloKJm9fTkZz8LanCkY4E937c2UkMBfZb4Ma8sAG3dnv950ZF0vKmW0vTWsFz5hYVOuPuP7tapWIvr5H+V8ojuBgZhGO3N8W2lSiJJM8YWNUN5NngzYghegOK6HbBbdsy1YqKyWVA0Jm59QuDO8Iz2q6+B9L8kV32GWCexXWyx0LzJZQFc2DwS6wfxv+SEHIFu/bPAli0y/cWBTmzd41Zzf9HCEmQoK6hkzZGKL+ERB96d9J6uNYpv9nYxLQIERZeJNofRA06l20U6/RCAYN+J3dME1HeZb3pgS2BvfVC0c7ofEw/XFMv8/Iy/7kkRSw/Ukk21RQ/jIrTJH101/tjEF7fFtm3E8Bj4whVIeE8VSvW1AZ0TnhDIAuO38RAePnqPdZuRYlaJGYqCwulwFpDXO4Pl6d3ImSpTSlR/gKIcojEoagxrBYER3wfHyPh/yBT/s8cXOXYxEzVE+c6wkzkeeS14uPfSPc4eFeFdFxi4RGv2hmD1dTK32wuTNfqrlIvv+XWy315ECyovjH7nGqNC35GeEuV11S+C98E4geJjTBXR8hbIgtT3/agK7ofBafTEvtsjTGyJComujKULPS2n0jZ+pfhtF3Tn+0AO7XfbvF0UBtJqA7N27tGIpoEltiaHkMSEuJUZGR3xPjrx2eZ0fS+qOh43T62OxAcsFAMivTPS/cfUZdsXuzpDkCTjqWrciK+ttJUNngj3q9ald0oq2ACQe/sVjYOPRShzwz2K7eqxdnzRSSSsQBD8R0eqLaAVQlsFGKo1WZZccjunxjxtmMGO/5JRuXIK4aZTaZEiIFqHqvgFonCjWvmSI2ryNW+pO76sQ/auq+dxhd0+K0kcrBGL92nBqS2IsPNsc56mOEdRAiIVT8ssK7MJoUWmkZcB6j12PsZpDdJ7Q2tmidw1b3kYjRUuV/IyN7/iFWCzrjX9KqRvpaaEHqc4ePS/cLGp76rGLrwwlqUWDwZESqe9UTR/ydRnSdn9XIg9K6vM8qw9GJv2NEu+qOORBhZFPNtWN1d2IiIQwG/PRYt8oJwLHrSiBx8v+SIhX+uQ98seiga/bYxEkSfN6jP3aM0y9gPi0/e7SXL6X9BODUDUkwHXTc62NStnkRrGHhSEoYQ487chul0G3hspyAfBPUNfqs6pi+ndyWeljd+nJSvdPXg3j6FcUChQPW8Mu3wgO1eXPmmv5YVN3ejFqvV7HeTPrPdo6c+6I011JOGjO7eg63SRKXHeVwTB8eu7K8T4v3fHsE4i4qq2TY0v4yOoSc73j3udSEKwxjbkAv3kuHbI3OyObQ5E37aLbY+M0efkBmqTRN+0xdgIkzVHDJucA2Dx229i4SaMYMSYxv3K3Uk0Q29st11XT35mMwNf6DGDGPDaiuiSO6/IQy2qjComKHwewcV96Y1FUeuDvutKEiFHaRVWo97YCBo6HWQdNDtqNQ4S1GawGF8rJQoGOIrwyMWEay/w1oQ0GQF6pw6BDI2k3QWH7pohmKPaU7jRE0F3HaqcH+iUaM1IHpgNAsHF0NRS/yplXvcSSI1rOh3rQjwcaXxR3brB/Dh+eM2BQOZGPD9n0nO7uUmc6S/fy8vMGl6qNzBvSjoYbu2FnCM9sW4TnrvmjRtVZDMHdYgBEGo54+Duacsz67pFjejfEBGAC/3Jh++bnNPu9yVpU5cpYGjU8BrizHc0YMG+JLtQEdcAPdp/wyc9w4Rz/QrFEIqqIbNgxsKI4KkDGQNiTh374Plprti9y0Eq+VdICBQychr1l5hLXzBllxZdaRDovCGCauI4OKUHx9+6S19YiUahjw+TDTQtOO1SWHIU0yImRy2brZBFMW+65pOt56UAhKK/QqE6ueMNNzTTwjXziB8/7n3oCUnIGgYmRKFZM8vb7xPfQeqiUXsV1yhgUuAYcOoB93R8QDE85Eg87pPh0gDi5gCZck/ichbM7FqSq1m+JCp1Lzrn7r2dnjOutpbZfyOSfaqikrbpmizQIMoHqob8e8zUYLm82GlzatW0re0BEMnBkEtMB2GHKP9KPWUrMmga1EINgkuW6Rk5wliZ8hMIbzEqVh/5d2KI2n9164QLF96/LA8dreKZ7qh1N7O0fbgOsIqWzp85zSYFHisI9IjPqnF0Hrvb5WFRCSiVYiCdkjJZRMF8hVq3hRGtxBy4yWHmENhXm9JwX9hmZark6OJNxEay1ZVGCDAuNM7eJzVjMuAHSJ6fKKlpa3EPxBoxaOsoOy2dwg/L8da1VMDXl1rFypnjjJMKIZqsJbCWQGnEvmC87Y5JczdzJP45oJ2g/aM0dOcBs3KjvqwLEf+v2q8kIFX3OyGYVpYUOTazK4OXuSS1eySGgEJL4R19MNHsEzj04ygUVnBsI8wpsBKN9OOJzP+Ddy7VVH6HCg4QuyY2DWcFL+Rey5qneOLX+zX87LRhmj7nNpcryaDea9uXfyTvX3uEUjbUXm0o9vbeM9ODApyxlQZYLyfgL4k0ernLYkavx9/NxkB4XwKB+3/74XzSVhA3g2JWg9nR7BQYvd/Y1bNG978j8F3WSEv7lTD2V9rcqOpTUTkcehuiO7L/3nsZX1fvrEwM+BmeY4/dVqBZWsl/JSPbeshfKFfgMH+n3QEMabwIW/WupSKU/LX8zB5JaKsOLVxG+J/KgsfSOhktiZq/fmVsqOvj/z1dW1BI+0hrkSgaCLMk9t8Wpn0e3G7Bs5vBnhnOOqcr1riUCmWsa88aK+TW3agkO+JbYtoD/ct9SWxz0KIk3hIm9m/vA/RVVvqKv5gDeklWPgR9hkTd1USkypbVf81hgdprS6ep70pSI+Q1fFq16rQRA2gqBBpUly0AJLfeeHzxttTwUe1VMz3irPGRv1Av09djkzBdvGQ3HGt0bGQMylvApLTbz78NbzTn2GxB+R0SFTXCGYl2CVpepNaFpbjx1t2R/Usosufn8inLCCzRKE4fxzq3hg3JRTYkgoPSc5zeRz0Ps0S7+zn0erJItow5WSceGChC3NLPBWR213wsDcLy72u037XZgn1MOZrJ8v2wQrfF1LcOrK8kUkX7OjNkB2EoLGwD50zvBnhe5jjcCC6w/YzGXERbdFar9DFoBO29SS337lyokhUBPh7XD/c9riQTEHUUKBWNizlrqEAEaNtFoXxX5lUzbqrLIY1NryOFH1x4DMFCsD7w0OwmY5qdfWuVS5ZSq99GhnDOZo3NmYKqmiwkpLufXlSN8cXtqh2e6S9p76kWLowZRvP2DY5xTLKZ8QbqCbPKyhCRu+73Cw7a6XrkUYkkHNUsYJZyP12Xlib0gYprpLF4i7e4SBKb9EMYSNDFnXFuDBHWdqpHM4hVlQjhiRIdNzImSd5Zlnaox/wZJe8BABLdUMbz+HGwVaHyijgJ7FbYi609g6B5yd/iiIMfcpSoI/t9FFfFSC8Ibk1che1YmcFUe7glDwllKnTSQF+2igsWDIARmyV/+CjgONQqk2N/pr+GXmcYECzByoeWeEwBe7Ja1b1uJe6pxcwIJlKwRy8mN1R269KTg6Nj4EJl241N8ZRQSpMf9KzspT3V6keAq2wAs4fVWf2+K9ebZ2y48URaoDQ+YOi5aWlgLSnhTNvQ0soA6AKd8e/H5wEZ+BMu3iAnROD80yw0PCO+Z+k/prREgfO3PuSrwo3Ai3/XvqUByRLrdl+J8TfTDqjf+ASXuJAFqwYgWlu9gulVxiTyQb9QK/34oUoD0oTdx8NDHP3f8tbhhJGbBljfBMReFdwFUrNrWwtjCyT0h+l2v84kI4gLEc7JaBWADbcvwUb+JG3LOTmWE3gHdK+K6kfAEHWc0fZmY/kWDNALvV9sNE6DtEI6euaeZy2SYOZLe/O98Vrl7HT4DUlIYtLWD5v/Ju7aevsgIERL61CCiQ3NqLLgH296RXlv5QTsBxKsbo/kpuzmdl0kyvVbSti/ApQo8hYUSAiGTm2WmcncRzSSP2Wu7bvYzcqJKdPrVtb0FSLCcgbUJECJ0eLI86eHmZTTcwdRgQmQiGGQGkRlnjh+mf8URCgMAzufANMqmHMbKmtX2xpoNu9+fIKCuuCI1f2RSR6d8VwGsmiS7vqvVULHoZFs6Ol2SDRKVczFcZuDu2WQxOfKsvznnzuIgo0s+NRVo0e5zmPsgHhbUoq+ygqfbyWCaOrM8WZDKT1xQPlBApievC6eV2XFLanLspDJujtyvlTjwzIoGYlpj6alUeSP7ZQL3NiWTDGuryMxNdPN1a6Y2opvxqNE6K9iv1K4TVyVH6TvUj0jGEtoaJ6KSk1au4C8iM5YcBzNG2t4Gd7SGhtnn4X6FrqNuKUse7EitfVs8CjZNsQ5Al7l+Le/6oZwCwJrU1COQH9mD3bAts2Hoa/67HF+WquS2E8ATGorsJurVLtiXb7+n90QSrKFDftuHeHSRhFZCT6NQfzag5mQylcXliWKu1pmnkfaNc4QtcnNM01Bc/5B9VU1ndJG2UtEvMojgdXrdKvCbRCgnRnCsHCqiGupFB5XLi39UA33dmyAqSkE2ukNWBRMyU90K8E/O3ABnbMIJsZB3y0Fuhyk34MSPh1Ys5tbUgU/Ae/sGHHt0fZzTDNYW8oojOjE4MiCPQOE3s0rcr1ZcTyQSvQwqNGCWZDtqg6xMtWgyMvn91DeRaykxPkhYpfvc8oCey0Hkh1H1SfUA1T4pDiVgTmUhXgVkICZbw/lVY+4bmKEQrio4VtenFIeMx/A/gorgXt8q1t49ySyAU+Tg/tt9xN/g8WhDyuXmArsClOTcBntNXI+b1fxxarviPmGtapqzfDnjUc2c0yG+NVOJTYRwuBYmnAtmVcklfCmtcG+EZorOYD6cY09oxnCzfVlKg9hKsGJGI+qoObaWYtotj94KgKccHu9PULLnIXYZT6mIwKe+L0R934O7u2f8KHA2RCIwrcScXTx8wVnZCqwXTRJrUOBpYriWmC3i4BUUFzzwtX/OY/ZBp7Vfm5X4sgkmpiz/3Q8ml2Xw2i2FgDIRPTeq5p/XYZzN+MWqPoQMk1b3LsT+HjpGdd+7LFrqgH2ldgaqGhZsY2LIBJDfOX0HU+cTfBRVZe4xYaNCl12upgfBdoDNQie3DlOAykwHLx2mTDW0O4xwBJsHId0y01pCKk3LyhA1iGa1FZQ3fUpdjOMYOLxATYkqqC+axZijC/glC8ssxJsgamRPV03ibhGN72K6KObAEWXDmmpI0uFwb9k5tzTmugRxaCA2W5ZjgnplDJehY1pPZpRkwsShT2ta331CIdPjiWkN8by2HwaaldUNyrKugx+e9PL+nNUuRucXtiwikR64fsX1tNt6RWD4WAo5DK66+CDtI51xMFFJOkDF7BZ8r+eIJ5jVQAZooRFB8y35R3Sq4TBR3yHz2mv2kW5Axi3i6H0o0keBUWwanJyEf7eFmW90Cl9LKeEA9LAzw/UCiy/xXrrM8HhLvk8hrb3TMrqo9JeTsPazUVKlMKufMzS/9yqM13NcuaVwrA4EVnahPHrQ1jWcPIAugPa+5O7ZFk9T9XZYGWBVZjZG4UrixXf8CG5Q1aOFjf6nuGZOFn5hfawKE7kgb7C+3X6CWfzZzlKJYrZJoOmLI9qadbb0OG4zC9aHipG+ieyUSxh3IAGmjAh7ZCFlw/29JVfpU4MFOs6jB4D8y4omhezpVG6xZ/vbqj9Kcwair1D2sVHwy0ZdmUiqqFzenIVGMXxG8q/7Fwatu1+Wo81Sy+CmtoNEcZVdljQJVpxlM0IxDGk8IYfn042HmV1BhLCREt4RR+36gJGHoeZqB4JPFyTfnIjFm8yM6NaZvVl94JTknIUX18DS24+z/TYmZlot21Ht+hGiwW/eDIQCAiuZqYBrEAY7fpYuKR2csRx3ZAJhG3Sb7SsnVgaPje1REyla4eKJEfhEo93bWuN0cimO9N8f1gpalTxoTQz3eXIJPLKKSLqATBYSZmmtZILH3M731+NXKggyNPkMpz9cuJdoRt+B3idyjQRhjJRgdUKI1Pi+Zmn0iSl55tXGj+SZlpLl64qYpWp48XPuIVM6w8Tg1c8lKjWLCRqAMyE2dHX3Yd2/rNIw7M4h8UOJ2GOIY2xh98Jdmsqu+Y8oyGiiX97kRk9e1ptnpyeESMGb2A/Ua24vyPuNbyTQ31B1d5u2Zg3gstHPHrZy3CISkMsVxNW1o0TBmnutdRarL+eDoO0468DLPs4TIA0oyox/LUjMCJG87x0lRVj+70bhuvyXWb7p7yHkVvX9bOs6uf1WJPO/Cm0afhSk8hWEg+dl256zlPO41+IIDNeuIsAWqLO5JK+rEnPKwwx22yQLXHhks/FtQt1fi7Wj/RLFI9cY7r4pp9F/2gZhXp1KyWl+wYaZWnm43BZubdMK38q3zkpXKhT+wTBTwCAtvJZUEEiRn3i78khXo2jXNtDPxOBNxal/STKp/vFkO1Y/YO8ev9xm5/9RKyAHIi2SnL32D1hOz56jFfRmWr5r/iyXmv3PRcGwUsYr9SRP68lxtNkEexz22DXa66myOcjOxWDPF5tj3ZDDFUuCbTQ6BIGOAF3OV8+x5HGW1HzSizePDlF4ZJFmxWltZQDt1qJcGx+bgMnpISEMLaeNKxVHWfTjycWO/LzH1Y75hOaynsABLyLeus3j/CU/2o2EL2VH/A3eQlASfx6D39/arWD2cFlBb8jf8B/VOb4zOejmkuh8YO7SNAlZtZqub/0stBuWTLiMYVwk4mLzFwIunr/4AvDvczuILRvBQDNEdV2+3Qy6E9yObGLM3aLQRgLLonm9CDGNqwhkQQP0TVhVq15zD0kLB5LyRamm67h4vSKWT6OcBeskS/bJIh9qG8DS+olbhfsuMR3dnr77CRxngFr6vWSmcQvnyiZ/yJ3n0HSeIdUQTzjmW1ZzQg9ncTjTHH9ivkvAcn3A/anx+iVbQpiSM1CqsVatADVTW5UmUtUCxk00zxuZJ+g+dB990F5Qbx1GRjijvZRC0hfPlOjyHnrTLoRoDAhKMRNzwVnkCG6CjefoJTLnysg98qYO4gjXcRVxjY2nlfii7urFTwlarMxNafP92tsbcS+8ULz+g5/xklEJD5+MbVlFmjtaI8bFckNSPbJnyPBY9/53/kMngRCDXhTmUnUsugmpFP9AxvW2ymL3XtgDAXD10xGcLOImT4E2x2RolxywHb/QmUOxAFavTsKybe35+IN4Lnx6XH70H7hV4paqCyTDXvERnUa4kGXQHLPrdCYyCLY3YhP81ZsLLZSNVXwGkys0EOvUvTghE+rm3GtbWFyUwGVNkqRodfJPztYz133s05ydXNwxU9kDxEPBS91bem+vxfK2fGk628tO2gpgDe6iaNqXOkwyZw+uAHtZg+xbRZPEh01x+LllOeTc2tqExvzfaeQJtNcAfwXmtbop0hUe7EWPIIoH4lJTJrPPnDEdGpO83rvoCi2RLXyLkLK5lkTrG3Odsg5/cJ48xnbhfkR/VJ6Zs35Nijf/Krk+D1EmHG+aGqr2tDyvzQVl3LPTpTppSAYWuoHSADYsf7vG8jbYo7rhrAyPMBqkLz1o4QFGHSDLBEBq17kdWCnO//e8Xx4WiQr7yRcwpHRS07EOIz0cK6xNM1LTxELbfm0NvOx4cz5IODz11gSJZ+jZpEP9eIuXlOGWRhqQrL/yisoKOUPLQ4/VN1WRcSVBHisOhe3V36KSGfTZD0sFea6MAF6jSVKAHqzw+csmztE2Vqnw5pTwEB5y00WtfeBuvw+EazeLr6+XrPMy05k0B+j0ocZdOM0lXO6rVcZnKdjYeLSjpL/x0dBAou0CQR0xEmMuePLR7nDQdgd0gADAqiJmonOIu8Bx0ElZPDtY2Nl6K+RQv2z5TaLpatsp/tqMXjOeZ0QxfR40h6h6GTT+4KWNOLGIGALkMaokmI1IvvwXagP2QvP5OBHLGoQHii/77XafOyOMyqR5E+EAMWNNuF17D9+c/76i6Fn+Ke2uUbIQxsh/YOiJle0QCS54TPbPGaZ9HlO02nqz8Oq2AKmAPTps6aeAZtH+FgQCcMTXtNML8lUMJgqhpNdEkQVsonFTu1+NhARuJyH71tXI92RQd9zaoN+8oIi6YAYR/+xNBP2GJO/8apCSYiFS09EsOjrm6IX727zm9JGmqRVNU+mX7mmprxnk6O4h+BME4TQeMkDz8TuUjmM+29ViM4pSHnNBtMK5au1ttv+xQM1drZ8wB/pyxxxTagkVp7XwPUACvPR5RwPwkOOdLR10lUdu0eL29m0Do2fKtZdUu/tx6xrLTw3MDQjKXyrcoimr7We3ujQvCfxHqyNPiGI5F8v+l0D8HRd4s5s1Gi0jBvmBrO5h2Ga5cuNbRR0BaMEhCzwGYbv5sMv7GozO/gd6Ud9JFONMWR4Caq2Z2G3YwF8d6P7cOVgeyHqzOK2ULkrhDhL2lCERqIDU28jC1+qesOwEmhPL0io066xA7emfUzDs5MyrSYw3isRberLFSgYzpwRw23wA6YiyFPv2FkWoxECjBEizIh5V6/GzUwU0fVcC+GLaQNa9sI9cGrEZsypYgURauOaWK9hTwQMLf8FDMfHVhQu1zW8ieEw6q31zhV36DLkRphYbum77p+d4J8qiMsvpHfVgIhpxrT/UuFyJKlj/x/Zcme3gCCxWWb/B8jVAJALJd1fK7ZomjOjg6ihMRHzW6hpoO8oVHZG1Q/IHCtcwesjSmVlyUCfQ5a73aMylCqv/3bK2fH/UGqN4whI4D1HMfxb9Hna9ZtGLz5DdXBLMobIjOI8UZm399JmGS9sSqmKtDdVHa9RZgJW1wPCU+tlmKAsePxZr0J0Dwn2zHCv3wQkx7gzKwqZddMy40+YP0FX7UZBK1efSM7/+uuEvWBw8RpLvAqt7Vul3ciqs/ElW/7PZLSeV4d0ir0dO36CmjMMm8yJtQ99lfoHrPJ86Acbvpey6pyUj8PtwZHWJtyyKhMnLTyh5jZlCdCm99aHvFNUZdqQFblx1U45e+7nonySJuwIZ/V5jOnMLKqphPJrAs14M6hnMw9D3kLDhCFEFdNobVts9msT9fba+feDDOLd0FDiHpEITGgpY6+jbxnVsybe1biwCUt/ZeKt0+zIauTmZmdgzNmwpOXFK7B0VFwMBPlhnoCkZlW62Mv86J4ohwB8WgHKuECD4Q3vbpAMJxVJqLIBZRtGQoNhkosr6N55eNGoQrqgLY71qMjhFbG6rrwBZ093Xb5J6a8MRxDCPiHHNSwTXbfGDYe3VpiD1T07nHU+QOw9N1t4AFXjzJ5taApmR/IXE2ndiTqjbZDE/k4fNdp168uYmJV/Fv8FKGmEBZH4Nz8/6N3pVKSXJSv0gGjhzZPzR9boHx3wqvMP5P7dlBWsJl30PbcvvlnsW0Sf1OCBE8rYQ1jUYIiIgGKl+2ffTj0ym/HMdQHTQCH+F8NFyoPZVSTuC9Hw6E0IpEF46e1/Kow62qH25vmLM+ELc51U5WtUDJAGXi1bhrcMbKF5qjdcgIHrnbMb3ofb3Tw/T5iqN+AyGSMCYL/SmNbMrK3uZtaJJY4aXrZGjxgDu224W1bRdV6rDDm1fSAB3LSI4ITAVFXp4/Y/HWwoj3hOiwXXS0fEEJKNrHWWhAkoSKR+e8BhEBOGT4VVbydZYV3nuqyC6Qa3Uju7TDhWp6ZvSqERcmP1JY8Twy34VRjKIGVHudNagPTZVteTrqA6lGmdutjkSBlivOdYDWRoogjUQbI54nVzHotspec9QgEqUesPh0ybBP+6YMluaX3KY07tEf2PNWEnq0C9BZvggzFRppOCMGXpOoaPCbR8F+GWgIVmIVZwJD8TUG24RKjhjZF3StcL5UuM3cn6dURVm4KMPCgYAA0jSMfrSqS0v5ZO9jDbZJgFiNXhmkX3DOdwhIBdU1OsFhwj90l2jLG0hGJxLwl4YXxUGu2KOEWuHwnqMPrjL2PHUDxwVVnedeoncog+xvN+/SXvSaXXCXRuSBikFiIviPR0krK1EkNTbQxHl5wCrVBKc6JHg3FOZVP9IKWSNvzaz54j0Z93i6kzmvAfZMooAaznbTJT28qw8RkvrJf4XNPZBvzYlX6H5mVBbE0OnK6PjDxLhRe2zZlj9U7BlAKtcYR1/+YIx0qT7qCqxfBxJYrR3t3cuYH+unkp8c311L4iJ/H+SVxYHuE/5TEXDEov+3iCmaIIzu+/CGQbRvib1dH8Fq/0vQ9RaoauXjhGR0qNI/whGm0XPwag7OcxOFslawL6wcc2uOiqxf5Z77C1iMBglfiVSF3UXO8J/s4NeFSS69lKTN3ybeu/Ilu5O2mURsonDh4i193+o3HFjktvp58vJ9oicaQGsA48jB67YciXNjokgGWWPXC1OU1t+HBVACyQ5nY2Ndrmb1h7/a8d1vSD4UYdgPUi2QnUWSBBzSeJaBbsciSK9YXexmh50zecOC7CJqxufWeZGhRPR2RZVUPEWTiPNi4TtHKnwf2SjlTAfEL1Mktt/yOGEt2v9gvn0lefAZm6VeP5P+L2JgUxWXjiQbVPUadFj/bcPnpNOA44mge34sgOTCjicl6Ur/qObnq+Jaj+ySWqkyL1mI8atbbGbNBoBTTK+9tRaM56G89f3rFCWpDKsoWd1W+bHwx9y33RlM1rSwf996mQXh29xg/tv5a8xZLS/gGJN5v3cK96ttsVyaEG4JZx3GMUqTDHn6uKq3O8iEtYnkfXOHEuDop38O2hP2y9WdjZkebkVPJusuH44ydCAHXijdl8sAp2LHosnMjF+J28/rheUBQJJQjUacE3cumUGV59N0K9UnKp7jqMbN9sVnQYjKWLJqQxW0GvdUNSHMGlCzEquTFZd1jVN1EMUE1lTlPD1HrIBxJpDWuIia3XfWcH60xMRuFOy8QQ4mq1BVg1uLXXIJGDmbnZjHyWvssuf5WVwLXJ4pEiMMdHowefry5e14N24kYJt2LEJuemsoIyeVwCxOA9XULUEX9StWzqrBLKddFGZazrJRS3YU4k33X45EMGGoqKDpKBREdpp0poRjStlJye9Mk9wYvIA+FiDTKhRFy5ozlqXvYoiML2ODa0kdDTJK0HBJZLnJCIS6zuEvFraf51Ox+EdKZqdEn+OMSs9lK5t3BP2EH+nC0rr9pB1L+EqRpcV6kUQ64Q9fmlNxhUGQT8BJQb4VRiJAWat19leCtvYAVBefwHDiqRKpriIi/J/YelfKM6h7kBWTrdNQ5xjC6strotCWUtW4iIba1p9kDosdKtodZNhoT2FjsS80QurvIWNAUcCY9NJsZQeY+9d5k/3MFJFn2XHGjk7wySiZ8EPyvB72UpXh51NpkKqWp8oqwkhBip72+ntKpRXDVdm0W2rtYP/AIxYXpXphBMW9wIMM96KLDLH/BnYRIRz3A4I5QSRCnb5SsH1YmMW7vWPDHRekbSxeimQrjuMKnATxq2KKCCParPPxoj9e787muuFl4uLErP30Zk5bLa4PvEFYLC0u9TngotKQl3RPJ14bd1GQ//dDihTXLgPtQthgIv/nbvP+AEePCGMIPb3rjH117xqEN7eWnB0gM9KC4+dJgDZf56G85XOunMOHHQjtkUqcGCldhRgVXQW5PfiCCaLQfFIINsspnBECimJLea2+ZOnuWV2xrXQ7kdHyHQ0BuoRyr4+r+AMcMTDNs6yQxtmuhqZaZvID1GpiF/lC8RuVt8EEguqMUtcXpZMIP74N5ssssOeo7nZFWPflXsEA/ACMMeXw5YnWOWQK5H/rOppWLjHEEDvs2uz/ceQ6LEzAGKWftFoJJE6IfeHgVnaDtwXipH9g8Wu/qIEVtifzcdK27R3yC9+rfV9mHKuJJ42kWXox1M9W/2BlFNzR1kTsS/wqfIFm25a+Qa/mPoylL3b2zjUevLmN4Kf4mqIeSBYhynfRhhr1fsoaOT6SCBH0Zt3patnZdHzHvF3pe9R8fDEcoQi69lMiHWYlr70E03pvpunsRLT5kM2zWht7hXo0RBt0GEY1p7wcbrbRoarxbU+pO+InsdKWR4LJ9WdJ4h3vY/MI3hhYjyotkaVOBZIIx6yCDfNZFP4TziYdkT4fBn0bxvLFh3lu6z66plAGZI1H1VwONqkyzKxpN5hdxNv0H+COqFqFdpegIAx91/vfY4ipYBV11/bu64rzIAJIXm82xhXnlWSz8FXuRBU/iFjZOB0l2zYkvpbrkwgRbPQJj5nz//8upXcI5smPde6JWKdwiJzUnavIXI7dpHIyUIms+Y+pwcWfHEH/R+skJoS6kf++GZQDWiY6cyqruejX/hUVzvNx7mV49yI2QdcA407l19r06Ixex64x3CClDmyaumqPdoidFj4cexWVIMYRgkq9423rjpUcyH00MGYQutFn3f/yXPXLZc7IwMcVGj/R5k7G2J1PwBK16tym3orYVB0wlyc2mRQzJKtyeHlDNgGwXSrUiCPjyWunm9eMOjU9AJwfVst3NYsIJSEHLfEs2C4mIgSI91pzIAkqij8G8eMCxoe5+kd1RUnS/+Th+ZaH5PkA1PQj53qO2acx6PPMgnUnq5TizclmzKBOlwgI8A270QrUQ0919KVmDImdkZCOOlsI76ZwxO5jgehpNr5Uf4B+RiscSB48CgbegvCTChcgBcoa2i7t6KJ7VCULEvYkCyQC+pVCUnRAfFcMoQ2mwF9BaCq285Zut8f7GKS1Uh4xiIOuGfU0uLiJb02KYygbPnnasQJjJd2/hSCq61e/9/27pScrQiRrEnfWTwmciAN1dh+GtidIB+qFAsVf3MX12XMx/z9xi+3ZuNR4Q7M9SIbba3O89Kr6nlB0SNDCK6l56+S3ANHmKIhR99HryoJHIvTILEHbKeV+BP2OzrC1AmMYf6Qu3aWVjs0yfSTCXKco/Bz9d7DwG/tSE4+ykIJGHfsv4W/MZDp70DsRYxVVCTNBXFBO4KPV/XBA6e5AzRB7jusDbIKbtoS4AyYLTFpD+U3x/kiJRDcQGQkMukRqCZbl3THrvXTWi3NBILpmP3dULNZNeBD0h1nc6aapOJVEkzkfevx7bjVbY3DysLZFf6ON3qh5WZLlLFUCQkazW8ZygFP99J43zYQ6kSGZpmycpL+/rw1LwMx2rFzEfqujGy8nU8kmrmmzlpzBr6CBiVgoS4Ps+o/W050OZg265MWjeMJ7XTk6gR3JT0uaMEMUlusMIGDluFPkb9dAcueuGB5Fx6dMz+9loTXtiRiFc3YgwbKwCzydV+He46VtaWbmgD1l2ROmJ6pxR80SlIIW3FJqB+vHOBtjTdCIXlS1/6Aga9kOjkEwLIuJ7RFLbGHf4QvgmDUaHEyVOOFYf3OF7LE7bKnybsnzu04xRYCtEcW72lmHumZMYwm8vdmM9TlCeO+1jqi4Rd+Ii9VZdAN+6gbcTeJnUhJRd9X6/xYUpCyXZIikOTm6JrCyAF7VP0jIlrFfuyBuvHIcknO2ofc+Xtfvn5baCGwpPkQIHlMLnJ3LZZs9Ixtwl5627cxpn0kxf1sZ1EwgAcEPqR+6gn1tbDVLzY1m6EcvzsRV+8ucSx0SfefdiY2o65S5e5Vp7WsJjcKjAoafshFJ8jwI4xWKnXfHyO7VCeXAOzO4zLiuDDQ09tQys560ethHpsjn9Cui0t4uoRXd0ZfyvFDCGs+KKhgmJAbr/CbBAVAqhr+A9hX/MzRBFjudbaHU6+Iw4xsLXVbJ7V+srQdEJY95eE8KnSNAxcTLqcgdS9Lwm+EB9EW+4ERZJAe2ar8Qq4ypYIsz4DY4r92XvWe7L0MaQOQ51z2x8n9Qcbv20SZpZsJIbDRLjCs9MBMrziVuApxl8oMT6rnVokCQZXUQurxFQZjk8Ynda+BTbGgA2kQAjFEytr/2FEmzTAqy+f0Ltv712ppQc6A6E+akHIPDx2LwRWbcRK+pblKZ1rJlh0CF4xeBhtc5RN3us+rW34ykPXfSyv5b2isJ/ieMo4xG53wlDOa4/+CQwT8e/8oOkIANlsccmokNQxy7SPIAVDTB5vHsgDA2MHflDeMWIApte/lR5QLal2MhGR69tvPERPRMjMVBfOnAxRgpHTthE89dOBeQMGGPY6IU2kZxweXQq/Fk1D99pqgoQrrXvuo4bkvDPA+fb/BrQtVxjtBIzpM3YQ6SvHYkSeXW5e+Tfqq+XMk0E6HKj2/WqRfGTqMG2Ma9hBpPlxwMuEH0lcbcQ38/Kns/KIG8P5sGc4BhVJC/9vkXzpbO8GaEFSDBoY64cvEuXcOqqVfTNFqIiy8h38SP1ZAUBEP5JQmhJLMWxgim8wzbhYuyzT7uN0Ae/WWb953MsGnhvYs1l9452CRJ6NB3EVtU62Sw5STmHVF7zm1xBkcodz2tEW5WXUeqKARLJqKa92kv31x4nUz9lI7Wn454LqpRunhctR4jKwYnZ4pxR3a8vTvTTBCg180k+lP+QtE2w0GRPuZ/sXMJvVr6eioNoBkN/VTh5ZDmaGPZZhwLSCk7X67EUBQM3YnarB+3AkdYe29vHsYSpv7ev59IkKTm65/hHcdg6r3ONu2LG188/F9rTJMLgaPrbg61YNcoC2ocHwwQydO39pkl+uvM2ig4r7kqWHo9y/aUlBMiMqK33cudwbLmblI+NjrmEl3GsnYm6jJRie4f/hxVfurGdp2M12LuZQHbTHEKVgLJqdqn65RH7sOQtdILN6k7+nJuDSFZocHEs9yImA+wdxLq1TrCwzKUas1LT8/ufWQ/Kg6321LFg+fO7SyAUylrIjBsL2u0HPlNjQfDOy8zS8dw2r5rae7z+ll+ejlpssqpvD7Nro1Bn8IxkueMvjJzxA3Y8Nrjus47IlzRgaF9PKXxp63wRYCLCXXowvVQEO3sw/p7RnahvZBBNIVMJEJKz/yWZlkMl6WtKncg0gPUPCx/t9KnHKAz7usRhCcx3Ka3eCm7vvt70zRM8SAZ5YqHBx5NmkbVv9QbSNbwICx+rDkvTulcVqWS3Zpj7JULsPjKeknWIY+OGSpyIvxvR/4ml4rI1hf0dY6OKut3BSNO12VCJYkU9Xl4fblLFfkl/6VIyw+NL+B+cmi7yIG3jud2vueQVbA4Qgmgx8UhPUpJFDGsNxNAZk+WP/GPs3cTJ63uVZxIZR/kKc3m9+viCxNPxrOG+rOCTszyozyrk0Hw+GEWtMgFfrelK+dMDiHIG3ckeo4y9tr+GFjx+YULi5Ad4szdrhbcM0E4l2wVHLjU7ldhPVCiqzt9nZ8WHptxSnaHv2JAeMUYiPV3IMLWYhAqo9Pz1iruZvsWvwsVbt2+dr+iceUNPKsQ7QbzvDIf43UFOT7DMjhlpjkz8qcB1eHeEgFS1lts9dvxTYBg5T/rBGvc7GzEJY8923wFI+eitksuER5ZyT3NVu/ywfFb1Ad+FSMpy82lm918xUhxcnjqP4P5gfizwIp+5n1Qm2GB5TWeYuhL8CHnJUt4YkyE94gRt181mMUR64cRKnpWxMKUGGjlBqvidQCirnh5yEQNwaW/kp7fLxYz0yzoAOVAmF26E4ax8qzOx4KEyp8IEoiLTpYQ6ZxEeP3pZt6KH9W/MH2pdOcyg5/olr+FsqtdgILly4A7rw1MmJSpp2iPqSqT8wN33ASDHNxQVFRoR6MhCGwXiz9nHBpqnsjv0FyAkRIay0cyij5TqEZIgT23Z0/Z7MptakAxkNBhx2t2zQTv7say3ADBgzNPNkIJghwryvWgwTBCdsmVesQG+hp9w7Dz4tH39x/DswSzYGqeYiOopxbLf2tMTFLh9Ff723Mca1aJR+wioVuNTfFbjdVBxEml0pPa0QDmG7GLlr7Tg2yY++dscWWLNpXWfoE/Jxed5gbB5qN5ZN3AcfjRLEhD0GE3JFlaGCmHxFYcuVJULAnpU6VJqwxuB/4v92TqcBr007ZMF98XLrRh/4AiBYENQGD75EquWfmbeBO5vnmsF4fhLEbXV38meichDuCj1iGnsxgjrCjq+H6EoAtA3T87bVQYqICXTuXFLDtCMiB05y67Smt8BUZNtuwodDYTf8LPyezywlHB7i4ufP0+41lzdEKGOyhX7cklyZPDtGbor69/EwJ7kOIML4F9+H4xMAy/7/OiQLqpmD2pu7On4uAaW2gMTgt3RIJwLPOfk0J9jjzoCqWCHC39Zuvb3nUhGoS5JWA2mZUz6l9BV4Bd41lVVTEI6wTrPKv8wBmWF6tyCUiChqhxbqDmTN/rZ6XckftCu+YjrVg9VrqxmuCtoE7e7iLCGoOGDtfF66+thc7CLd5GB3lLtuwzlan5tMQRH8QH8u8SxPOrBfUhF7tPCYZv6J6q3Wq6ei2MpiUBrYtqrt+8QWQxc2N9XwfSML2kqwJHlWS/y6d8KovxlkzbHiAXb0ZjqhF2u552xFGU4YNjLvRpwSYWqIWu71aflZIx6YumbzOMGEmJqxrBoUr0Wn6KSqIMVRgOomXUtKGNKkDkawONUOSth3bw8Fg2ut7i/u0kUp/nxBK7XuATEDX7jjceShlwVEYZfsbpnoySJudhnSnJJe8iGGxUQn6fOgJSwqEokUgEmlKnrvYjUE2f3S4yl08SDniWT3MbQswtnVomrU1FpoXVnv+FtZKXC3qAuILVC9RqfPgCbalo+SbsWGsTEewxglC5FoeAvlDDmkZNm2kVAbg7HGX/kNj2vZORs0hNIzAFqUzNXDQfMJuYm11Czt7021ZGHJNK9pElc62/cqCAnU8CxBk+djhrCoL7yy0kQ1j3Nbh21vquaoGP0DTDj+y0doZ6o+MaIynT/mN71+N4W9ZN5GUxdf9dlKD/+bjhTXD6g9jXlqGgklS0g3+WR129HdWVf4A5YBaxoI0l/6G8/2GHeSlfaC5gwF8YkIFZx3q2sli7C963ZKjBRUlK3YrSR8gurOHCAbHbZCG8/3cYUsouO9aKAFdoxZyvnGDb649w+4gvtHnKUaWySEXi2zwoTmCijBGqC3OyXFJSDQNm9fDxaBYexxjoc+9IYu5CXgsC2Nu/ka+RtJsGMwfab2bpTuehJsho8wzrFkEtrZBg0nlVStBydx3I6a79TeKq4KBEKqz6P5t/cPYHDNZo73jf0H/h+qngt0ODb8D7pd1RuQycDxxIh6HEVwRqx2QpgQP4AFr2XlD2q8k1SQXTAFyF/B45RyEjb67U18tbbxtFGvX/14USTgPM5S94SqI9S+UMb5z+/NgKX9Fw3WUQU3r5W5rcSpw2R9KUF/foiVVW5QO7vDq0NgpIDypknuJupqKKyj/KsNePU8ysJwSedq9YWG1ied3pX9Q3J+SXeyjU1W9tkO+FhIgj3JwStfA0AFWMOMUY18GkRHH5CXPSpQcqByLmfLGlPdJ8qnHzIFIGT3FFdh1809pMf0apuJNvTyeP+oeORjVC/n2n0b+3nVEjbgBMFlUSl2s0u9BEP4slpV9zYnAOy7aRXC0S0dhbPax9DSkk/N7nIf67UXBHFcskil55OEQ+icUxkqb7bKbKSbczvOIRicCKc3ti0SgWgmDuYuLh+SuSo7ZmtmNk/FqwlUV77VTVSb9x/3QpRyxqMvPpDn/BKZozUmwmQS2u4o5CovFapV/IDVxcJrMM6WsC2DgrhT7fN+0PljGoLmv63syU8LaNauiFNozZex3Hc1i4HimzRZKlFE9xUH7zz+usX0yKS2WqGL7sGMBM9QwaDTYNXgjFwgFGhy4adOqwXmma+D7lrmOFtzqrrRgMb8s0msNxoqFNkHERQL7QgKpka+yWhg3P4ZGv3DzO/HzvKtCHUMtjx1YkgVsWq+xd8Xpdt3vXz+CEV2dRSkkeQfZtpkVeD/pmulmLvl+m0FHGgRR+uUcf7SbElpTvPuGsCrI15fdwVq6tP6Meh/g/AWt2Xb0GzDaJrk43gEnhipnZC+Jzzwle0M8opf+gSomg0d1iuaBuKgMZyFYTSuJ21RmkgKpckF+o7BGbSXqMg642tWUrJT8YE/8BR81FBZiKvLDuZ/qlwPWOk6P4ifUoph7AqPjqX0T6WcB233QXzJ6YCc6t/IVd6UMtRJuhsmliq4PznPTegqXdxNIqxFVlAu+yY0X7fLnQGvlSLz+3oToyHk3nO37cOVTgScCUkmRbPgKHYlDU4Y3YuEn+BiBobq3xqJ/qLeh6ClNkIZPMhRla+0nnRSBy9HFeOUKZ5lj+O+0bH70+pDIWQoQWeQcjMAlBWU9bIafSfGc53HvPrZi5yZLSqnGION7er4MLtKRkS6spKzG82zUcq0HhKEJnNKyD2MzFsIktgLMuIoWqu78GDCfVRi24f10eJnjAaZfdnE0ucgDsDOovRgqlQo3zdpZK/YKL50hKQDoHmKSEm+X5kjLkfABWAMIIReDOOj4RgHujlRzr62XPMk7fpxjm7RbGF3V8mQMeU/pTeARBikU6yzI8omcm2+DcKtXdYPw9o6SJ7ORVXAiLrYNMCNp72DFnqKD0eUijmK+IT6fHx6fMkJ8bDRqWIzipZblyl7m5AOkh3s0trfQOinUQUFSkBTd6yG+wZffGeaQigeCRI2hFVdYcIxvLhLDu4GENED5g9BZla6Sp3Aaivf0gxJ7bJ7FAnz8z+Ds1g/2wruTOWU/w8A6LPgs0Zfgnc5LN7ygQitZwKE5b0CpsJG1J5IdgbELGObsiR0PLR1l1Po7+2z4K/dmlCKttmCSfGBRjY7eO8a3s2CPbco487rbKBjhgX0bVm8F2qGlWVqAyXLiZROGDBMtb4LMQSacfL9qb8MpxrYnpgJoXC9ItG/9ZrdaBJboeNgc/EWQHEabvDVx+2ZlbvC1OXfHLpW3PCHk89AQYlc773bft+sXYbhEohskEc9s9gkLPl5bL8+9WtkSO4R3Dlzw3eu+frcZvU4QE6HKz8AFGjtNJyaUJ4TwtiIUNM1wd9PL3cfCAITDmoLNT2dnQdXQxPj54lH3acjBEDt9w7YIjn8eXWxKo7rZfm7v2IQ1+lIHNz7K+IN8763zgRZjpxiLZR9y/l5tdAWxjhuC/5Bwief/s3Z2ezyGTcQT2TlipaVxq8F3WXSHa0r8D1O+CoG87TbvurjRG5V9V4x7hjKxLhmmbuLnGhMLSxQF5MjU3XWUrq5ynixUR2yraukjrZdUWUdFe5Mj/D8TysL815/YaikYxuCeBPnXkQvq7uLH9j9pkaHxPG8bpUzYURFd8FrxBWixo4Ga1KpfoTzn0Dpyi6wmMA5/R3arSLl1oEL5yLapKc1itPPMO9mf1KBf79pFVpX9s/tlnqIXnA6w5mDehFo31Hz6KhD+9H8nerwSCZqb0GvRqoIpCSP+yx4W2l3C+ZYEvAWR3yOOqDa9oovKQasAVEWlU9yQR4AouLVVPxtZXroqDZlZuPMW23gBxFnGmbV5Q6jO8yR316+eEQhOQCGJ6Uo5PWKwNP5EBPwC9eqH6ob8TkSz+Q3zc0P93ZA5OIn21oj/UjX2HrHdSU66r+evf8iAXvjlMFARC05cTktC2Zs0zAFA09pZRirZnfN3QRWPoWse2Ck0kPXxfMHFSxhqsl/+8PFDTOrGEuKXIyP5My6PglXtDhswDwB38Yx6ic+QoTW51mraoYoBFUZ3WbVcDzGxvMvmxuHQGowujEF9e0QzNYXIQJnSaOdICjUgxj02UpKOAY6pv7X8HI79hLK8tnXJZphwWP//gni2yQ3Ca1rvJXCPxfCY6i1Z4M4aaIQaRiqn8R3LD+0WnKz0LGMtOtjgr2KolKbpG1T44qrRxAADS3JnTAtkuOn7CjrTVYLzkWpum64P+mV2YIaMypmRoNUZVYKxsFEl2TjhD3u9FK+62aLL3tGOggP9WZmWWYpFLfWDhPx8UG7l8ERzmVvwDhczwPhzHuIZFn1ttpz4cKCvDGfc97qab/moHvQStVKomXHkl9UmwJ1JgFmK8zNPQmv7J59UDKS5OsIbjo8iF4RTKhRMusSGVZJPzUjp4aUFei3hdiysioHgIIwE21e3Jp62kqO/1e/tWJqXgRvpJZ9GvMwtg8vxEG2WTbIRCt5yZWx24+i5UUisF5ZlBOFT8bm6BzGKQIk+m2UmG2smquY/tfXUeVKBlaLaKsBnQk2kPu4ZPKpP8+ReAJlBpGsUaHeNwUfCACL0/gdDS+aQj+HCWhZiBaYI3SDpdRFCol3HetrtdALcJAGwQLCSN/U5npr03fz4+D0L+8l/8vZLNepL7LPrI40TaPsdO/nF7DtLAJtrMrIoyjGR5MmrgB9hyL84ti8UmHr4BEkkKsXDt4gQJZ1f0wkfcECTrMLmnOPgvMpP0h5JCV9XfQ/fCzaqCK6419kZhrPsz5ceX15gPq+/SLQz1OTu//OWpbk6f6wwKsx0UdBEXv5yD+MrrGhrKC+dQ2pMlqSgrXcztPKFwBvY29rQAKyERn9oyalWNoGWCXKfjlPmYS/s/PTYxUW2heF5EqeyJlIXbpnXrQ09RWvJF3rIQsoR3aBizhiB805om/5w8ml95rqPWBxNs2qneCLcSD3XEdChNwyrEkPTXHcoT+xEb1Bm2NItudQMFh71z962PbAZ81QbV4zhw/kvcJuPFLMRLfjbZdXS7RMOykvG2HERhQqe9/8MZvI+6gbqF5dO3ZdtoXyTT091KBtIY/Y3t/n6ovttioynFxbp+iCDEFsVe8FXKErKX58CupOJCvQncn1b5kylk21tPwZmZGmEfqEABI4tlbUH+8H9JZwYeHt+e029s2y5NmxU9bLuWgjFjhf8M6IiWaHDjyBkYc0rvaIs7VOtWPpKUCMsoQyRSyrmrP1y1G24ZVq+7849jvviflittYEnEqbLwnbVDUeVQMBzHrnz12Doz5Ic0Y1jVhrpfTX5QuKSfzhDQidVlQjD3yWz9OwqPhtlCR3se01SiwtUwX1WzmT/bCpl9J9VaFiEkbdjugggvBq6q0azEOJliaExqyFouCfrMeBGvqr/5gORo25pLu1AQ54hacqQJAHA4FglrhLGogQvn5Pz+qIOB/clxG7ec0oEUU/AensbCSpi21xDn80ULe2XK7puyUtjlyta78D9QFvejGRe6V1i0ktLr2wrW/NX6eSU8+vR576JrVFUG013Nwdjt7hFqQ1vDH3QDHjsJngreQRJnwJFWXSZC0R3FNzDIfDiZ8ofRlhLlAzapa7IpK4KEbFGk+BgSSpYz6MUpOiiqma6UTlbL+Cumrm0nM5yCWLc/Q7uFjh85hkdHWYsE8VzbW243bl5VHRD2YUWlB5r/r8xwK+8w8embKeCmNZeYSjiVORXi1IHbS44Botdiuu5aataanOW1bIjgdgCuTLKx6fI9uwwIa0K41+Jw5ErCQrTPswOdkRs4nl3hIAj9sqcVoBp5Muv53J34godDK4j5eIOQwKXRCDh3u7WDwhD78tzRcWi6miTnPygyDrm4GhtsfZFGJDNieJjaNzxwRtYytF6LUSm09+9Ct4wSx8TUfJWhGPJ14hrug05hu+gXCXj3DVkMVr3rmF6WIiecEzo2ddrVsQeDB9/7p3WZFU/LaOnUen2Q9E7SxRmdgOTCvSRLvWKR4VKdSfbcVysVxtR/h7KsGTIcC8+JuoXCpK3GvNDv1SM5lqjfzAB5TPgVirb+D8bvAmsqzBYuu8YNyBiTscJbqhpq8S6E8yMmKWttyCAgkfZHgqfK+8TSHvJiSKfBa/+PiTnJPk6V/HbYb++j4/fCHBvXq3rp9eL5a9TSr8+PihG8iJK9fBDNKb9gag7lKwzQHLGsBQQviaZz1auR0NgJGXZQSO+FfhAdbdG21DGM7LHlo4/cbaa8vFCq8KqPoFZ5GFtq71CI88ruvEoVDiphMO3BscLBnKvbTja6bXSGDyDs3NtpDPBY3R3jH1dbKEohfqzDqC9aSiTE7LuO6R9fnZxSo=","catalogue_think_content":"WikiEncrypted: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","recovery_checkpoint":"wiki_generation_completed","last_commit_id":"f35dfacbc26b8e56af6e91169f40b85bf3d2a837","last_commit_update":"2025-10-08T17:36:48+08:00","gmt_create":"2025-10-08T17:56:14.1730748+08:00","gmt_modified":"2025-10-08T19:06:56.5101861+08:00","extend_info":"{\"language\":\"zh\",\"active\":true,\"branch\":\"develop\",\"shareStatus\":\"\",\"server_error_code\":\"\",\"cosy_version\":\"\"}"}} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 55a1a062..00000000 --- a/Jenkinsfile +++ /dev/null @@ -1,27 +0,0 @@ -pipeline { - agent none - stages { - stage('Build Image With localhost') { - agent { label 'LocalHost' } // 在标签为'linux-build'的节点上执行 - steps { - script { - try { - echo 'Start Build' - sh "docker ps -a --format '{{.ID}} {{.Names}}' | awk '{if (\$2 !~ /^1Panel-jenkins/) print \$1}' | xargs -r docker stop" - sh 'docker compose -f ./manifest/docker/docker-compose.yml up -d --build' - sh 'docker start \$(docker ps -a -q)' - sh "docker restart \$(docker ps -a | grep kami_ | awk '{print \$1}')" - echo 'Build success' - } catch (err) { - echo err.getMessage() - } - } - } - post { // 添加post指令处理阶段完成后的情况 - failure { - echo 'Build failed, but continuing to the next stage...' - } - } - } - } -} \ No newline at end of file diff --git a/internal/dao/internal/v_1_card_redeem_cookie_order_history.go b/internal/dao/internal/v_1_card_redeem_cookie_order_history.go new file mode 100644 index 00000000..b6f5b023 --- /dev/null +++ b/internal/dao/internal/v_1_card_redeem_cookie_order_history.go @@ -0,0 +1,95 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// V1CardRedeemCookieOrderHistoryDao is the data access object for the table card_redeem_cookie_order_history. +type V1CardRedeemCookieOrderHistoryDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of the current DAO. + columns V1CardRedeemCookieOrderHistoryColumns // columns contains all the column names of Table for convenient usage. + handlers []gdb.ModelHandler // handlers for customized model modification. +} + +// V1CardRedeemCookieOrderHistoryColumns defines and stores column names for the table card_redeem_cookie_order_history. +type V1CardRedeemCookieOrderHistoryColumns struct { + Id string // 主键ID + OrderId string // 关联的订单ID + OrderNo string // 订单号 + BankOrderId string // 银行订单号 + Action string // 订单动作 + Status string // 订单状态 + Amount string // 订单金额 + Remark string // 备注信息 + CreatedAt string // 创建时间 +} + +// v1CardRedeemCookieOrderHistoryColumns holds the columns for the table card_redeem_cookie_order_history. +var v1CardRedeemCookieOrderHistoryColumns = V1CardRedeemCookieOrderHistoryColumns{ + Id: "id", + OrderId: "order_id", + OrderNo: "order_no", + BankOrderId: "bank_order_id", + Action: "action", + Status: "status", + Amount: "amount", + Remark: "remark", + CreatedAt: "created_at", +} + +// NewV1CardRedeemCookieOrderHistoryDao creates and returns a new DAO object for table data access. +func NewV1CardRedeemCookieOrderHistoryDao(handlers ...gdb.ModelHandler) *V1CardRedeemCookieOrderHistoryDao { + return &V1CardRedeemCookieOrderHistoryDao{ + group: "default", + table: "card_redeem_cookie_order_history", + columns: v1CardRedeemCookieOrderHistoryColumns, + handlers: handlers, + } +} + +// DB retrieves and returns the underlying raw database management object of the current DAO. +func (dao *V1CardRedeemCookieOrderHistoryDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of the current DAO. +func (dao *V1CardRedeemCookieOrderHistoryDao) Table() string { + return dao.table +} + +// Columns returns all column names of the current DAO. +func (dao *V1CardRedeemCookieOrderHistoryDao) Columns() V1CardRedeemCookieOrderHistoryColumns { + return dao.columns +} + +// Group returns the database configuration group name of the current DAO. +func (dao *V1CardRedeemCookieOrderHistoryDao) Group() string { + return dao.group +} + +// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation. +func (dao *V1CardRedeemCookieOrderHistoryDao) Ctx(ctx context.Context) *gdb.Model { + model := dao.DB().Model(dao.table) + for _, handler := range dao.handlers { + model = handler(model) + } + return model.Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rolls back the transaction and returns the error if function f returns a non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note: Do not commit or roll back the transaction in function f, +// as it is automatically handled by this function. +func (dao *V1CardRedeemCookieOrderHistoryDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/dao/internal/v_1_card_redeem_cookie_order_jd_history.go b/internal/dao/internal/v_1_card_redeem_cookie_order_jd_history.go new file mode 100644 index 00000000..f6cad5b8 --- /dev/null +++ b/internal/dao/internal/v_1_card_redeem_cookie_order_jd_history.go @@ -0,0 +1,93 @@ +// ========================================================================== +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ========================================================================== + +package internal + +import ( + "context" + + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" +) + +// V1CardRedeemCookieOrderJdHistoryDao is the data access object for the table card_redeem_cookie_order_jd_history. +type V1CardRedeemCookieOrderJdHistoryDao struct { + table string // table is the underlying table name of the DAO. + group string // group is the database configuration group name of the current DAO. + columns V1CardRedeemCookieOrderJdHistoryColumns // columns contains all the column names of Table for convenient usage. + handlers []gdb.ModelHandler // handlers for customized model modification. +} + +// V1CardRedeemCookieOrderJdHistoryColumns defines and stores column names for the table card_redeem_cookie_order_jd_history. +type V1CardRedeemCookieOrderJdHistoryColumns struct { + Id string // 主键ID + OrderId string // 关联的订单ID + OrderNo string // 订单号 + Action string // 订单动作 + Status string // 订单状态 + Amount string // 订单金额 + Remark string // 备注信息 + CreatedAt string // 创建时间 +} + +// v1CardRedeemCookieOrderJdHistoryColumns holds the columns for the table card_redeem_cookie_order_jd_history. +var v1CardRedeemCookieOrderJdHistoryColumns = V1CardRedeemCookieOrderJdHistoryColumns{ + Id: "id", + OrderId: "order_id", + OrderNo: "order_no", + Action: "action", + Status: "status", + Amount: "amount", + Remark: "remark", + CreatedAt: "created_at", +} + +// NewV1CardRedeemCookieOrderJdHistoryDao creates and returns a new DAO object for table data access. +func NewV1CardRedeemCookieOrderJdHistoryDao(handlers ...gdb.ModelHandler) *V1CardRedeemCookieOrderJdHistoryDao { + return &V1CardRedeemCookieOrderJdHistoryDao{ + group: "default", + table: "card_redeem_cookie_order_jd_history", + columns: v1CardRedeemCookieOrderJdHistoryColumns, + handlers: handlers, + } +} + +// DB retrieves and returns the underlying raw database management object of the current DAO. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) DB() gdb.DB { + return g.DB(dao.group) +} + +// Table returns the table name of the current DAO. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) Table() string { + return dao.table +} + +// Columns returns all column names of the current DAO. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) Columns() V1CardRedeemCookieOrderJdHistoryColumns { + return dao.columns +} + +// Group returns the database configuration group name of the current DAO. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) Group() string { + return dao.group +} + +// Ctx creates and returns a Model for the current DAO. It automatically sets the context for the current operation. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) Ctx(ctx context.Context) *gdb.Model { + model := dao.DB().Model(dao.table) + for _, handler := range dao.handlers { + model = handler(model) + } + return model.Safe().Ctx(ctx) +} + +// Transaction wraps the transaction logic using function f. +// It rolls back the transaction and returns the error if function f returns a non-nil error. +// It commits the transaction and returns nil if function f returns nil. +// +// Note: Do not commit or roll back the transaction in function f, +// as it is automatically handled by this function. +func (dao *V1CardRedeemCookieOrderJdHistoryDao) Transaction(ctx context.Context, f func(ctx context.Context, tx gdb.TX) error) (err error) { + return dao.Ctx(ctx).Transaction(ctx, f) +} diff --git a/internal/dao/v_1_card_redeem_cookie_order_history.go b/internal/dao/v_1_card_redeem_cookie_order_history.go new file mode 100644 index 00000000..831b2bc8 --- /dev/null +++ b/internal/dao/v_1_card_redeem_cookie_order_history.go @@ -0,0 +1,22 @@ +// ================================================================================= +// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed. +// ================================================================================= + +package dao + +import ( + "kami/internal/dao/internal" +) + +// v1CardRedeemCookieOrderHistoryDao is the data access object for the table card_redeem_cookie_order_history. +// You can define custom methods on it to extend its functionality as needed. +type v1CardRedeemCookieOrderHistoryDao struct { + *internal.V1CardRedeemCookieOrderHistoryDao +} + +var ( + // V1CardRedeemCookieOrderHistory is a globally accessible object for table card_redeem_cookie_order_history operations. + V1CardRedeemCookieOrderHistory = v1CardRedeemCookieOrderHistoryDao{internal.NewV1CardRedeemCookieOrderHistoryDao()} +) + +// Add your custom methods and functionality below. diff --git a/internal/dao/v_1_card_redeem_cookie_order_jd_history.go b/internal/dao/v_1_card_redeem_cookie_order_jd_history.go new file mode 100644 index 00000000..87f366bb --- /dev/null +++ b/internal/dao/v_1_card_redeem_cookie_order_jd_history.go @@ -0,0 +1,22 @@ +// ================================================================================= +// This file is auto-generated by the GoFrame CLI tool. You may modify it as needed. +// ================================================================================= + +package dao + +import ( + "kami/internal/dao/internal" +) + +// v1CardRedeemCookieOrderJdHistoryDao is the data access object for the table card_redeem_cookie_order_jd_history. +// You can define custom methods on it to extend its functionality as needed. +type v1CardRedeemCookieOrderJdHistoryDao struct { + *internal.V1CardRedeemCookieOrderJdHistoryDao +} + +var ( + // V1CardRedeemCookieOrderJdHistory is a globally accessible object for table card_redeem_cookie_order_jd_history operations. + V1CardRedeemCookieOrderJdHistory = v1CardRedeemCookieOrderJdHistoryDao{internal.NewV1CardRedeemCookieOrderJdHistoryDao()} +) + +// Add your custom methods and functionality below. diff --git a/internal/model/do/v_1_card_redeem_cookie_order_history.go b/internal/model/do/v_1_card_redeem_cookie_order_history.go new file mode 100644 index 00000000..3b09c6ef --- /dev/null +++ b/internal/model/do/v_1_card_redeem_cookie_order_history.go @@ -0,0 +1,24 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// V1CardRedeemCookieOrderHistory is the golang structure of table card_redeem_cookie_order_history for DAO operations like Where/Data. +type V1CardRedeemCookieOrderHistory struct { + g.Meta `orm:"table:card_redeem_cookie_order_history, do:true"` + Id any // 主键ID + OrderId any // 关联的订单ID + OrderNo any // 订单号 + BankOrderId any // 银行订单号 + Action any // 订单动作 + Status any // 订单状态 + Amount any // 订单金额 + Remark any // 备注信息 + CreatedAt *gtime.Time // 创建时间 +} diff --git a/internal/model/do/v_1_card_redeem_cookie_order_jd_history.go b/internal/model/do/v_1_card_redeem_cookie_order_jd_history.go new file mode 100644 index 00000000..63fc2eca --- /dev/null +++ b/internal/model/do/v_1_card_redeem_cookie_order_jd_history.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package do + +import ( + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/os/gtime" +) + +// V1CardRedeemCookieOrderJdHistory is the golang structure of table card_redeem_cookie_order_jd_history for DAO operations like Where/Data. +type V1CardRedeemCookieOrderJdHistory struct { + g.Meta `orm:"table:card_redeem_cookie_order_jd_history, do:true"` + Id any // 主键ID + OrderId any // 关联的订单ID + OrderNo any // 订单号 + Action any // 订单动作 + Status any // 订单状态 + Amount any // 订单金额 + Remark any // 备注信息 + CreatedAt *gtime.Time // 创建时间 +} diff --git a/internal/model/entity/v_1_card_redeem_cookie_order_history.go b/internal/model/entity/v_1_card_redeem_cookie_order_history.go new file mode 100644 index 00000000..170d88f6 --- /dev/null +++ b/internal/model/entity/v_1_card_redeem_cookie_order_history.go @@ -0,0 +1,23 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/shopspring/decimal" +) + +// V1CardRedeemCookieOrderHistory is the golang structure for table v1card_redeem_cookie_order_history. +type V1CardRedeemCookieOrderHistory struct { + Id uint64 `json:"id" orm:"id" description:"主键ID"` + OrderId int `json:"orderId" orm:"order_id" description:"关联的订单ID"` + OrderNo string `json:"orderNo" orm:"order_no" description:"订单号"` + BankOrderId string `json:"bankOrderId" orm:"bank_order_id" description:"银行订单号"` + Action string `json:"action" orm:"action" description:"订单动作"` + Status string `json:"status" orm:"status" description:"订单状态"` + Amount decimal.Decimal `json:"amount" orm:"amount" description:"订单金额"` + Remark string `json:"remark" orm:"remark" description:"备注信息"` + CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"` +} diff --git a/internal/model/entity/v_1_card_redeem_cookie_order_jd_history.go b/internal/model/entity/v_1_card_redeem_cookie_order_jd_history.go new file mode 100644 index 00000000..dedee4f3 --- /dev/null +++ b/internal/model/entity/v_1_card_redeem_cookie_order_jd_history.go @@ -0,0 +1,22 @@ +// ================================================================================= +// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT. +// ================================================================================= + +package entity + +import ( + "github.com/gogf/gf/v2/os/gtime" + "github.com/shopspring/decimal" +) + +// V1CardRedeemCookieOrderJdHistory is the golang structure for table v1card_redeem_cookie_order_jd_history. +type V1CardRedeemCookieOrderJdHistory struct { + Id uint64 `json:"id" orm:"id" description:"主键ID"` + OrderId uint `json:"orderId" orm:"order_id" description:"关联的订单ID"` + OrderNo string `json:"orderNo" orm:"order_no" description:"订单号"` + Action string `json:"action" orm:"action" description:"订单动作"` + Status string `json:"status" orm:"status" description:"订单状态"` + Amount decimal.Decimal `json:"amount" orm:"amount" description:"订单金额"` + Remark string `json:"remark" orm:"remark" description:"备注信息"` + CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"` +}