# 公司账号服务（account-service）

内部通讯 app 的自研登录体系：替代 OpenIM 样板的注册登录（open-im-chat，GPLv3，不用）。

- 员工账号只能由管理员开通：批量导入 / 单个添加 / 停用 / 启用 / 重置密码
- 员工用 **工号 + 密码** 登录；校验通过后，本服务向 OpenIM 换取 IM token 返回客户端
- 员工数据存在本地 JSON 文件（容器内 `/app/data/employees.json`，已挂卷），密码 scrypt 加盐哈希，不落明文
- 停用 = 本服务拒绝登录 + 调 OpenIM `force_logout` 踢掉各端在线连接
- 零 npm 依赖，Node 20 单文件服务

## 接口约定（供手机端 / PC 端对接）

### 员工登录（客户端调用）

```
POST /api/login
{ "staffNo": "10001", "password": "xxx", "platformID": 2 }
```

`platformID` 按端传：1 iOS、2 Android、3 Windows、4 macOS、5/10 Web（不传默认 10）。

成功：

```json
{ "code": 0, "msg": "", "data": { "userID": "10001", "nickname": "张三", "imToken": "<openim token>", "expireTimeSeconds": 7776000 } }
```

客户端拿到后用 `userID + imToken` 走 OpenIM SDK 登录；OpenIM 的 API 地址为 `http://<服务器IP>:10002`，WebSocket 为 `ws://<服务器IP>:10001`。

失败：`code != 0`，`msg` 为大白话原因（工号或密码错误 / 账号已停用，请联系管理员）。

### 管理接口（请求头带 `admin-token: <ACCOUNT_ADMIN_TOKEN>`）

| 方法 | 路径 | 说明 |
| --- | --- | --- |
| GET | `/api/admin/employees` | 员工列表 |
| POST | `/api/admin/employees` | 添加 `{staffNo, name, password}` |
| POST | `/api/admin/import` | 批量导入 `{csv}`，每行 `工号,姓名,初始密码`（Tab 分隔也行，Excel 直接粘） |
| POST | `/api/admin/disable` | 停用 `{staffNo}`，立即无法登录并被踢下线 |
| POST | `/api/admin/enable` | 启用 `{staffNo}` |
| POST | `/api/admin/reset_password` | 重置密码 `{staffNo, password}` |
| POST | `/api/admin/delete` | 删除 `{staffNo}`，立即无法登录并被踢下线（OpenIM 侧同名用户保留但本服务不再为其签发令牌，等于不可用） |

管理页：浏览器打开 `http://<服务器IP>:10010/`，输入管理口令即可操作，无需写接口。

## 部署

已并入根目录 `docker-compose.yaml`（服务名 `account-server`），随整套环境一起起：

```bash
docker compose up -d --build account-server
```

相关环境变量（见 `.env.example`）：

- `ACCOUNT_PORT`：宿主端口，默认 10010
- `ACCOUNT_ADMIN_TOKEN`：管理口令，**部署时务必改掉默认值**

重启/升级：改代码后 `docker compose up -d --build account-server`；数据在 `./data/account/employees.json`，重建容器不丢。
