login-flow-mermaid.md 4.8 KB

API 登录流程图 (Mermaid)

1. 整体请求处理流程

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() 流程

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() 流程

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 公共处理流程

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 校验机制

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. 数据模型关系

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
    }