门禁采集器后端 · 纯 JSON 接口 · 已开启跨域 CORS
Base URL:https://access.zhendx.cn | 数据格式:application/json | 令牌管理:/ · 健康检查:GET /api/health
项目简介:本服务是「门禁采集器」后端,接收工厂/园区门禁设备的人脸识别进出记录(姓名、工号、抓拍图、方向、时间),写入 SQLite 并提供统计、设备/人员管理、记录检索等 JSON 接口。
数据链路:门禁设备 → HTTPS 回调 /api/lan/callback(或云端上报)→ 后端落库 → 前端经 派发令牌(或管理员登录会话)调用 /api/* 拉取展示。设备侧无需改造,新增同协议设备只需在设备后台填上报地址即可自动入库。
除 根路径 /(令牌管理页,用管理员账号密码登录)、/api/health、/api/login / /api/logout / /api/me、以及 设备数据上报 3 个接口 外,所有 /api/* 都必须携带有效 派发令牌(给前端 / 第三方跨域调用),或处于管理员登录会话(管理页自身调用)。
调用令牌(仅一种形态 — 派发令牌):
派发令牌三种传递方式任选其一:
Authorization: Bearer <派发令牌> # 推荐(跨域 header)
?token=<派发令牌> # URL 参数
X-API-Token: <派发令牌> # 自定义 header
Token 管理:访问 令牌管理页 /,须用管理员账号密码登录(默认 admin / admin123,登录后请改密)。登录成功后管理面板才会出现,非管理员看不到生成 / 吊销 / 轮换入口;后端接口强制仅管理员登录会话可调用。派发令牌明文仅在生成 / 轮换时显示一次,请立即复制保存。切勿在前端代码硬编码或提交到公开仓库;按人 / 按项目分发并定期更换。
⚠️ 设备上报接口不能要求 token(设备固件发不出 token 字段),其安全性由 HTTPS + 网络隔离保障。Master 令牌已弃用、不再参与鉴权;若既无管理员登录会话、也未生成任何派发令牌,所有业务接口将拒绝访问(不会裸奔)。
由门禁设备主动 POST,云后端落库。前端无需关心,仅作对接说明。
| 方法 | 路径 | 协议 | 说明 |
|---|---|---|---|
| POST | /api/lan/callback | 局域网 HTTP | 门禁设备回调,字段见下 |
| POST | /record/upload/online | RV1109 云端 | 云端上报(同 /api/cloud/upload) |
| POST | /api/cloud/upload | 云端 | 云端上报(同上) |
局域网回调请求体示例:
{
"Mac_addr": "示例MAC地址",
"SN": "示例设备SN",
"employee_number": "1001",
"IdentifyType": "1",
"inout": "1",
"time": "2026-07-27 10:00:00",
"name": "示例姓名",
"face_base64": "<base64 jpg>",
"devicename": "gate-01"
}
# 响应:{"message":"Set access groups success","result":0}
| 方法 | 路径 | 鉴权 | 说明 / 参数 |
|---|---|---|---|
| GET | /api/health | 公开 | 健康检查,返回 status / records / devices / online_devices / offline_devices / offline_devices_list(离线设备 device_sn+alias+last_seen) / offline_threshold_minutes / night_window / mqtt_connected |
| GET | /api/stats | token | 总统计:total / in_out / by_device / by_hour / by_identify_type |
| GET | /api/stats/daily | token | 按日聚合 in/out/unknown/total。参数 from to device;format=csv 导出 |
| GET | /api/devices | token | 设备列表。返回字段:device_sn / name / model / ip / protocol / online(0/1) / status(online|offline,后端按 3h/6h 窗口算好) / last_seen / last_heart / last_record_time(最近一条出入记录) / alias |
| POST | /api/device/<sn>/alias | token | 设设备别名,body {"alias":"前门闸机"},空串清空 |
| GET | /api/records | token | 记录列表(后端分页)。参数:page(默认1) size(默认20,≤200) from to device q(姓名/工号模糊) fields(字段投影白名单,逗号分隔) format=csv(导出)。默认不返回 face_img/face_template 大字段,返回信封 {items,page,size,total} |
| GET | /api/records/<id>/face | token | 按需取单条记录图片,避免列表内联大字段。参数 kind=capture(默认,抓拍 face_img) 或 template(底库照 face_template),返回 data:image/jpeg;base64,... |
| GET | /api/persons | token | 人员花名册(后端分页)。参数 page(默认1) size(默认20,≤200)。返回信封 {items,page,size,total},每项为:person_key(人员唯一键)、name(展示名,alias 优先,其次最近记录姓名)、alias(自定义别名)、face_img(录入照/底库照,base64 data URL,无则 null)、total(总次数)、in(进)、out(出)、last_active(最近活跃时间) |
| GET | /api/persons/<person_key> | token | 单人详情:person_key / name / alias / face_img(录入照 base64) / total / in / out / last_active / by_device |
| GET | /api/persons/<person_key>/face | token | 单人录入照原图(image/jpeg),供 WP 代理 /api/face 带 Authorization: Bearer 服务端取回后转发浏览器,避免前端 <img> 直连被 CORS/鉴权拦截 |
| POST | /api/person/<key>/alias | token | 设人员别名,body {"alias":"张三"},空串清空 |
| GET | /api/person?key= | token | 单人员进出统计 in/out/total/by_device(含 face_img 录入照);format=csv 导出 |
| GET POST | /api/person/map | token (POST) | 人员 key 映射。POST body {"raw_key":"...","canonical_key":"..."} |
| GET POST | /api/users | token | 用户管理。POST body {"username","password","role":"admin|viewer","display_name"} |
| DEL | /api/users/<uid> | token | 删除用户(不能删自己) |
| POST | /api/users/<uid>/password | token | 改密码,body {"password":"新密码"}(≥4位) |
| POST | /api/login | 公开 | 管理员登录(账号密码),body {"username","password"};成功置会话 cookie(7天),管理页凭此进入 |
| POST | /api/logout | 公开 | 登出,清除会话 |
| GET | /api/me | 会话 | 当前登录用户(含 role);管理页用于自动登录判定 |
| POST | /api/me/password | 会话 | 修改当前管理员密码,body {"password":"新密码"}(≥4位) |
| ▾ 令牌管理(仅管理员账号密码登录会话可调用;派发令牌不可进入) | |||
| GET | /api/tokens | admin | 列出已签发令牌(不含明文)。返回 {tokens:[{id,label,role,created_at,last_used,expires_at,revoked}]} |
| POST | /api/tokens | admin | 生成派发令牌。body {"label":"张三-前端","expires_in_days":90}(天数留空=永久);返回 {id,token(仅此一次),expires_at,warning} |
| DEL | /api/tokens/<id> | admin | 吊销令牌,立即失效。返回 {ok,id,revoked} |
| POST | /api/tokens/<id>/rotate | admin | 轮换令牌,旧令牌立即失效、发新令牌。返回 {id,token(仅此一次),warning} |
通用时间参数 from / to 格式:YYYY-MM-DD HH:MM:SS(如 2026-07-19 00:00:00)。
# 1) 健康检查(公开)
curl https://access.zhendx.cn/api/health
# 2) 不带 token 调接口 → 401
curl https://access.zhendx.cn/api/devices
# 3) 带派发令牌 → 200
curl -H "Authorization: Bearer <派发令牌>" https://access.zhendx.cn/api/devices
# 4) 设备别名(写操作)
curl -X POST -H "Authorization: Bearer <派发令牌>" \
-H "Content-Type: application/json" \
-d '{"alias":"前门闸机"}' \
https://access.zhendx.cn/api/device/<DEVICE_SN>/alias
# 5) 导出记录为 CSV
curl -H "Authorization: Bearer <派发令牌>" \
"https://access.zhendx.cn/api/records?from=2026-07-19%2000:00:00&to=2026-07-25%2023:59:59&format=csv"
# 6) 生成派发令牌(需管理员账号密码登录,凭会话 cookie 调用)
curl -c cookies.txt -d '{"username":"admin","password":"<管理员密码>"}' https://access.zhendx.cn/api/login
curl -b cookies.txt -X POST -H "Content-Type: application/json" \
-d '{"label":"张三-前端","expires_in_days":90}' \
https://access.zhendx.cn/api/tokens
/api/* 请求在 header 带 Authorization: Bearer <派发令牌> 即可,无需登录页。Access-Control-Allow-Origin: *),浏览器跨域可直接调用。/api/persons 列表与 /api/persons/<person_key> 详情均直接返回 face_img(底库照 face_template 优先,其次最近抓拍,base64 data URL,无则 null),前端"录入头像/录入照片"列直接消费此字段即可,无需二次查 persons 映射。/api/persons/<person_key>/face 返回原图(image/jpeg),供 WP 代理 /api/face 带 Authorization: Bearer 服务端取回后转发浏览器,避免前端 <img> 直连被 CORS/鉴权拦截。/api/records 默认仍不含大图:抓拍图按需从 /api/records/<id>/face(?kind=capture|template)取,返回 data:image/jpeg;base64,...,前端直接 <img src=...>。alias 由你侧写入;读取时后端已自动把 alias 合并进设备/人员对象,前端优先展示 alias。/api/devices 已直接算好 status 字段下发:online(最近 3h/夜间6h 内有上报且网络通)/ offline(超过窗口无上报,疑似故障/断网)。前端无需自己算时间窗,直接按 status 展示即可。warning(弱电/告警)暂无数据源,保留扩展位。last_seen(最后收到数据时间)、last_heart(最后心跳,仅 MQTT)、last_record_time(最近一条出入记录时间)、online(0/1 原始位,与看门狗一致)。last_seen;看门狗线程按离线阈值(默认白天 180 分钟 / 夜间 360 分钟)置 online=0,status 读取时按同一窗口重算。当前生效阈值可查 /api/health 的 offline_threshold_minutes 与 night_window。/api/devices,online=0 即告警;或用 /api/health 的 offline_devices 计数做总览。阈值可按需调(环境变量 DEVICE_OFFLINE_MINUTES_DAY / DEVICE_OFFLINE_MINUTES_NIGHT,夜间窗口 NIGHT_START_HOUR / NIGHT_END_HOUR)。/api/lan/callback,MQTT 设备已有 heart 报文),使 last_heart 持续刷新。本页由后端 /docs 路由自动提供 · 与接口实现同源维护