# 手机号 → 账号ID → 角色ID 检索方法 > ⚠️ 本文为脱敏参考版。凭证已移至 `~/.hermes/.env`,数据库字典见 `data_dict/vala_user.md`。 ## 数据关系 ``` 手机号 (明文) │ XXTEA 加密 ▼ tel_encrypt (密文) account_id │ │ ▼ ▼ vala_app_account ──────────► vala_app_character (账号表) 1:N 关联 (角色表) ``` - **一个账号** (`vala_app_account`) 可以有 **多个角色** (`vala_app_character`) - 关联字段:`vala_app_character.account_id = vala_app_account.id` ## 数据库 | 项目 | 值 | |------|-----| | 数据库 | MySQL 线上环境 | | 库名 | `vala_user` | | 用户 | `read_only` | > 具体连接信息从 `~/.hermes/.env` 读取。 ## 表结构 ### vala_app_account(账号表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | bigint | 账号ID(主键) | | `tel` | varchar(20) | 手机号(脱敏显示,如 `158****7007`) | | `tel_encrypt` | varchar(100) | 手机号密文(用于精确匹配) | ### vala_app_character(角色表) | 字段 | 类型 | 说明 | |------|------|------| | `id` | bigint | 角色ID(主键) | | `account_id` | bigint | 所属账号ID | | `nickname` | varchar(20) | 角色昵称 | | `gender` | tinyint(1) | 性别 | | `birthday` | varchar(50) | 生日 | | `purchase_season_package` | text | 已购赛季包 | ## 手机号加密方式 手机号在数据库中以密文存储,加密算法为 **XXTEA + Base64 URL-safe**。 密钥从 `~/.hermes/.env` → `VALA_PHONE_XXTEA_KEY` 读取。 ## 查询步骤 ### 步骤 1:加密手机号 ```bash python3 business_knowledge/scripts/phone_encrypt.py encrypt 15849377007 ``` ### 步骤 2:用密文查询账号和角色 ```sql SELECT a.id AS account_id, a.tel, c.id AS character_id, c.nickname, c.gender, c.birthday, c.purchase_season_package, c.created_at FROM vala_app_account a LEFT JOIN vala_app_character c ON c.account_id = a.id WHERE a.tel_encrypt = '<密文>'; ``` ### 步骤 3:解读结果 ``` account_id tel character_id nickname gender birthday purchase_season_package 18279 158****7007 23600 Morris 1 2021-09-09 [16,17,18,19,20] 18279 158****7007 23686 Nathan 1 2018-03-13 [16] ``` - **账号ID**: 18279 - **角色**: 23600 (Morris)、23686 (Nathan) - 一个账号下可能有多个角色(一个孩子一个角色) ## 注意事项 1. **tel 字段是脱敏的**(如 `158****7007`),不能直接用于精确匹配 2. **必须用 tel_encrypt 密文匹配**,密文由 XXTEA 加密生成 3. **一个账号可以有多个角色**,查询结果可能返回多行 4. 测试环境和线上环境的 `tel_encrypt` 值相同(加密算法一致)