核心业务流程
一次访客来访的完整链路,4 步完成从预约到进门的全闭环。
访客预约
姓名/手机/时段/门禁
经办人/事由
员工审批
点通过即自动触发
分配+授权+二维码
闸机通行
专属链接出示二维码
或人脸设备刷脸
回收归档
到期自动回收账户
人脸撤销+记录归因
功能特性
围绕访客进出实际场景打磨的核心能力。
访客预约(免登录)
姓名、手机号(11位格式校验)、来访时段(支持仅选日期)、多选门禁点位、经办人、来访事由,提交即生成待审批记录。预约页默认展示人脸设备,点击展开普通门禁。
员工审批(一键通过)
待审批/已通过/已拒绝/全部分页展示。通过自动触发:分时账户分配 → 按时段授权 → 人脸授权(无卡号自动人脸兜底)→ 生成二维码与访客专属链接。拒绝仅限 pending 状态,拒绝自动回收已分配账户。
分时账户分配(核心机制)
同一账户可在非重叠时段分配给不同访客,实现资源最大化利用。分配算法检测时段冲突,优先使用预约指定账户。池不足时自动创建 V 前缀账户并逐一授权(PutEmpInfo + GenerateEmpAuthorSet1),到期自动回收(后台线程每15分钟扫描)。
二维码通行证
审批通过调用 C3 AccessInterface 获取员工二维码数据,生成专属加密链接 /visit/编号/令牌(SHA-256),二维码与预约时段同效,支持全屏放大与导出 PNG 标签卡片。
远程开门(仅超管)
按门名称(doorName)签名开门(AccessInterface),失败回退无签名版(C3WebApi)。支持单个开门与一键全开(后台并发 + 进度实时回显)。开门按钮仅超管可见。
人脸设备授权
61 台人脸设备按 DevMac 精确定位下发人脸权限(EmpFaceAuthorSet),回收时同步撤销该预约下发的人脸授权,防共享账户残留越权。支持同步 C3 设备列表、访客页显示设置。
通行记录精确归因
访客查询:按手机号/姓名匹配分配记录 → 每条分配记录按时段查 C3 刷卡记录 → 二次校验 cardDay 落在时段内 → 按授权门禁过滤 → 去重 → 附加归因元信息。外部账号查询:直接合并门禁刷卡+人脸通行。分时共享场景也不张冠李戴。
安全加固(09-13)
登录防爆破(IP+用户双维度,5次失败锁15分钟,session轮换);8个敏感API补鉴权(approve/qr/visitor-link/recycle/door-record/search-visitor)+ open-door/open-all-doors 收紧仅超管;审批状态机守卫(仅pending可操作);密码PBKDF2哈希;JSON原子写(RLock+tmp+replace+fsync)。
管理后台
账户池管理(状态/分配记录/二维码日志/一键回收);访客查询(手机号/姓名/外部账号/刷卡明细);门禁控制(单开/全开/同步/显示设置);管理员管理(分层权限/CRUD/可审批开关);站点设置(5套主题/公告/自定义卡片/页脚/分享卡片);开发者模式(批量创建/批量审批/日志回看)。
系统架构
轻量 Flask + JSON 文件存储 + C3 双通道,免数据库、免运维。
分层架构
9 个页面模板(admin 1773 行最大)
预约/审批/二维码/开门/授权/查询
RLock + tmp + replace + fsync
C3WebApi (19002) + AccessInterface (19001)
过期门禁权限同步撤销
审批守卫 · XSS转义 · secret_key随机化
页面模板
| index.html | 首页 · 5 张功能卡片 · 公告 · 自定义卡片 |
| visitor.html | 访客预约表单 · 多选门禁 · 经办人下拉 |
| approve.html | 员工审批 · 4 个标签页 · 分页 |
| qr.html | 二维码展示 · 放大 · 导出 PNG 标签卡 |
| admin.html | 管理后台(最大 1773 行)· 7 个标签页 |
| dev.html | 开发者模式 · 批量操作 · 任务日志 |
| login.html | 登录页 · session 验证 |
| visitor_access.html | 访客通行凭证 · 加密令牌访问 |
| emp_pass.html | 员工通行证 · 账户编号快速查看 |
达实 C3 双通道对接
2026-09-13 已从 5433/5434 迁移至 19002/19001,代码与平台已同步。
主通道 · C3WebApi(19002)
http://119.145.17.34:19002/C3WebApi
GET 无签名 · 用于:获取二维码、查刷卡记录、远程开门(备用)、新建人员、人脸授权
备用通道 · AccessInterface(19001)
http://119.145.17.34:19001/api/AccessInterface
POST MD5 签名 · 用于:查人员、查全部门禁、授权/取消、按时段授权、离职(签名密钥 MD5 大写)
| 开门策略 | 优先签名版按门名称开门(AccessInterface),失败回退无签名版(C3WebApi) |
| 授权策略 | 永久授权用 GenerateEmpAuthorSet(type=A/D);分时用 GenerateEmpAuthorSet1(按起止时段,到期自动失效) |
| 人脸授权 | EmpFaceAuthorSet 按 DevMac 精确定位,防同名设备冲突;无卡号账户自动走人脸兜底 |
| 同步机制 | 管理后台一键拉取门禁(GetAllDoorInfo 分页)+ 人脸设备(GetFaceDevList),本地缓存 data/doors.json + face_devs.json |
| 签名校验 | 参数按 key 排序拼接 + "&key=" + 签名密钥 → MD5 → 大写,AccessInterface 专用 |
| GetDoorRecord | 19002 无签名版必须显式传 EmpNo/DoorId 参数位(空值=查所有),否则报 -6 |
安全体系
2026-09-13 全项目审查加固,覆盖鉴权、防爆破、密码存储、数据安全。
登录防暴力破解
IP+用户双维度失败计数,5 次失败锁 15 分钟;登录成功时 session 轮换防会话固定
8 个敏感 API 鉴权
approve/qr/visitor-link/recycle/door-record/search-visitor 加 @login_required;open-door/open-all-doors 收紧仅超管
审批状态机守卫
仅 pending 状态可批准/拒绝;拒绝时自动回收已分配账户,防重复审批与账户泄漏
密码安全
PBKDF2 哈希(200k 迭代+盐),旧明文登录时自动迁移;管理员密码最低 8 位;create_admin 禁止创建同名超管
JSON 存储安全
进程内 RLock + 原子写(tmp + os.replace + fsync),防并发写入损坏;SECRET_KEY 改为 data/.secret_key 持久随机密钥
审批失败回滚
二维码生成失败时撤销人脸授权 + 回收账户,防账户泄漏与双重占位
技术栈
轻量 Flask + JSON 文件存储,免数据库、免运维,适合单机托管。
部署与访问
服务部署位置与访问方式汇总。
| 业务系统 | http://119.145.17.34:5102/(公网)· http://192.168.11.70:5102/(内网) |
| 使用说明书 | http://119.145.17.34:5070/w/qr-code-gate/(Wiki,别名站 /w/tk-visitor-gate/ 同步更新) |
| 展示站 | http://119.145.17.34:5070/s/qr-code-gate/(本页) |
| 部署设备 | TK-Server · 192.168.11.70 · ~/Desktop/Leon-TK-Station/QR-Code-Gate · Leon-Control 托管自启 |
| 代码仓库 | Gitea LZ-TK-Station/TK-QR-Gate(main) |
| 默认超管 | Leon / wswwsw1234(登录5次失败锁15分钟) |
| C3 端口 | 主通道 19002 · 备用 19001 · 签名密钥已内置 |