# API 登录流程图 (Mermaid) ## 1. 整体请求处理流程 ```mermaid flowchart TD A[客户端请求] --> B[Api._initialize] B --> B1[设备识别] B1 --> B2[AES-128-ECB 解密 body] B2 --> B3{解密成功?} B3 -->|否| B4[尝试明文 input] B3 -->|是| B5[JSON 解析参数] B4 --> B6[签名校验 MD5] B5 --> B6 B6 -->|失败| B7[返回 -124 签名拒绝] B6 -->|成功| C{路由分发} C -->|/login/index| D[普通登录] C -->|/login/third| E[第三方登录] C -->|/login/checkToken| F[Token校验] C -->|/login/logout| G[退出登录] ``` ## 2. 普通登录 index() 流程 ```mermaid flowchart TD A[接收参数] --> B{海外游戏IP限制} B -->|国内IP| B1[返回 -110 禁止登录] B -->|通过| C{参数校验} C -->|缺少| C1[返回 -100] C -->|通过| D{渠道校验} D -->|不存在/禁用| D1[返回 -120] D -->|level≠3| D2[返回 -120 非推广员] D -->|通过| E{游戏校验} E -->|不存在/下架| E1[返回 -120] E -->|登录白名单| E2[检查白名单] E -->|通过| F{渠道封禁判断} F -->|封禁| F1[返回 -120] F -->|通过| G[密码加密验证] G -->|不匹配| G1[返回 -120] G -->|通过| H{账号冻结检查} H -->|主账号冻结| H1[返回 -120] H -->|子账号冻结| H2[返回 -120] H -->|通过| I[风控策略检查] I -->|触发风控| I1[返回 -120 风控冻结] I -->|通过| J[loginProcess] ``` ## 3. 第三方登录 third() 流程 ```mermaid flowchart TD A[接收参数] --> B{参数校验} B -->|缺少| B1[返回错误] B -->|通过| C{渠道/游戏校验} C -->|失败| C1[返回错误] C -->|通过| D{type_id} D -->|1=微信| E[查 wx_uid] D -->|2=QQ| F[查 qq_uid] D -->|3=抖音| G[查 dy_uid] E --> H{用户存在?} F --> H G --> H H -->|是| I[loginProcess] H -->|否| J[自动生成随机用户名] J --> K[创建账号] K --> L[插入历史记录] L --> M[插入实名扩展] M --> N[loginProcess] ``` ## 4. loginProcess 公共处理流程 ```mermaid flowchart TD A[loginProcess 入口] --> B{IP封禁检查} B -->|封禁| B1[钉钉告警 + 拒绝] B -->|通过| C{IMEI封禁检查} C -->|封禁| C1[钉钉告警 + 拒绝] C -->|通过| D{渠道封禁检查} D -->|封禁| D1[拒绝登录] D -->|通过| E{防沉迷检查} E -->|未成年人| F{时间窗口判断} F -->|不在允许时段| F1[返回未成年限制] F -->|在允许时段| G[设置 offline_time] E -->|成年人/未实名| H[继续] G --> H H --> I[开启事务] I --> J{首次登录该游戏?} J -->|是| K[创建 MemberChannelGame 绑定] J -->|否| L[更新最后登录时间] K --> M[子账号处理] L --> M M --> N[更新设备记录] N --> O[写入登录日志] O --> P[生成 Token] P --> P1[Token = auth_code 加密] P1 --> P2[Redis: token→imei 15天] P2 --> P3[Redis: token随机码 15天] P3 --> Q{中宣部防沉迷?} Q -->|是| R[上报登录状态] Q -->|否| S[返回 token + 用户信息] R --> S ``` ## 5. Token 校验机制 ```mermaid flowchart TD A[checkLogin] --> B{是否需要登录校验} B -->|noNeedLogin| C[跳过] B -->|需要| D[获取 token + imeil] D --> E{Redis 获取 token→imei} E -->|不存在| F[返回 -133 登录失效] E -->|存在| G{imei 匹配?} G -->|不匹配| H[返回 -134 异地登录] G -->|匹配| I[解密 token] I --> J[提取 userid/username/gameid/sub_username/随机码] J --> K{Redis 获取随机码} K -->|不存在| L[返回 -137 登录异常] K -->|存在| M{随机码匹配?} M -->|不匹配| N[返回 -138 登录异常] M -->|匹配| O[校验通过 注入用户信息] ``` ## 6. 数据模型关系 ```mermaid erDiagram Members ||--o{ Subaccount : "1:N 子账号" Members ||--o{ MemberChannelGame : "1:N 游戏绑定" Members ||--o{ Logininfo : "1:N 登录日志" Members ||--o| MembersTwo : "1:1 实名信息" Members ||--o| MemberDevice : "1:N 设备记录" Game ||--o{ Subaccount : "1:N" Game ||--o{ GameBanned : "1:N 封禁" Game ||--o{ GameRestrict : "1:N 防沉迷" Channel ||--o{ MemberChannelGame : "1:N" Subaccount { int id PK int member_id FK int game_id FK string sub_username int channel_id int auth_status string real_name string idcard_num } Members { int id PK string username string password string wx_uid string qq_uid string dy_uid int flag int channel_id } MemberChannelGame { int mcgr_id PK int member_id FK int game_id FK int channel_id FK } ```