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
}