附录
项目信息
| 项目 |
内容 |
| 项目名称 |
QR-Code-Gate(访客门禁二维码管理系统) |
| 应用类型 |
Web 应用 |
| 服务端口 |
5102 |
| 部署设备 |
TK-Server · 192.168.11.70 |
| 公网访问 |
http://119.145.17.34:5102 |
| 管理后台 |
http://192.168.11.70:5102/approve |
| Git 仓库 |
Gitea · LZ-TK-Station · TK-QR-Gate |
| 本地路径 |
/tmp/QR-Code-Gate |
技术栈
| 层级 |
技术 |
| 后端框架 |
Python Flask |
| 模板引擎 |
Jinja2 |
| 数据存储 |
JSON 文件(无数据库) |
| 门禁对接 |
达实 C3 双通道 API(19002 + 19001) |
| 二维码生成 |
qrcode + base64 |
| 安全加固 |
PBKDF2 密码哈希、暴力破解锁定、签名验证 |
文件结构
QR-Code-Gate/
├── app.py # Flask 主应用(60+ 路由)
├── models.py # 数据模型 + 业务逻辑
├── api_client.py # C3 API 客户端
├── config.json # 运行时配置
├── data/
│ ├── accounts.json # 账户池
│ ├── approvals.json # 审批记录
│ ├── admins.json # 管理员
│ ├── devices.json # 门禁设备缓存
│ └── admins/
│ └── leon.json # 超管凭证
├── templates/ # Jinja2 模板(9 个)
│ ├── base.html
│ ├── index.html
│ ├── visitor.html
│ ├── approve.html
│ ├── qr.html
│ ├── dev.html
│ ├── remote.html
│ ├── admin.html
│ └── emp_pass.html
└── static/
├── css/
└── js/
核心文件说明
| 文件 |
行数 |
职责 |
| app.py |
2310 |
Flask 主应用、路由定义、C3 网关调试 |
| models.py |
813 |
账户池分时分配、门禁控制、管理员 CRUD、二维码生成 |
| api_client.py |
634 |
C3 双通道 API 客户端(WebApi + 签名版) |
账户模型设计
账户模型(AccountsModel)
class Account:
def __init__(self, account_no, visitor_name="", visitor_phone="",
allocated=False, allocated_by=None, allocated_at=None,
expires_at=None):
self.account_no = account_no # C3 门禁账户编号
self.visitor_name = visitor_name # 访客姓名
self.visitor_phone = visitor_phone # 访客手机号
self.allocated = allocated # 是否已分配
self.allocated_by = allocated_by # 哪个管理员分配的
self.allocated_at = allocated_at # 分配时间
self.expires_at = expires_at # 到期时间(分时分配用)
门禁设备(DoorsModel)
class DoorDevice:
def __init__(self, id, name, dev_mac, enabled, group_name):
self.id = id # 设备 ID
self.name = name # 门禁名称(doorName)
self.dev_mac = dev_mac # 设备 Mac 地址
self.enabled = enabled # 是否启用
self.group_name = group_name # 所属分组
门禁点位
共 404 个门禁点位(启用 387 个),分两大类:
| 类别 |
数量 |
说明 |
| 普通门锁 |
343 |
E 座东/西区通道、各栋消防梯、电梯厅、大堂门 |
| 人脸设备 |
61 |
刷脸闸机 |
URL 路由
| 路径 |
功能 |
/ |
首页 |
/login |
登录页 |
/visitor |
访客预约页 |
/approve |
审批列表页 |
/visit/<id>/<token> |
访客通行凭证页 |
/admin |
管理后台 |
/records |
通行记录页 |
/remote |
远程开门页 |
/qr |
二维码展示页 |
/emp_pass |
通行证页面 |
/api/door/open |
远程开门 API |
/api/doors/sync |
同步门禁 API |
/api/c3/proxy |
C3 开发者代理 |
测试脚本
项目附带完整的测试脚本:
| 脚本 |
用途 |
| test_c3_token.py |
测试 Token 获取 |
| test_c3_emp_list.py |
测试员工列表 |
| test_c3_emp_detail.py |
测试员工详情 |
| test_c3_qrcode.py |
测试二维码生成 |
| test_c3_door_list.py |
测试门禁列表 |
| test_c3_doors_batch.py |
测试批量开门 |
| test_c3_dev_face_list.py |
测试人脸设备列表 |
| test_c3_face_photo.py |
测试人脸照片获取 |
安全机制
| 机制 |
说明 |
| 密码哈希 |
PBKDF2(200k 迭代 + 盐) |
| 暴力破解防护 |
5 次失败锁定 15 分钟 |
| Session 安全 |
登录时自动轮换 session |
| 审批状态守卫 |
pending 才能操作,已通过/已拒绝不可逆 |
| 通道自动切换 |
单通道故障时自动切换 |
| 自动回收过期账户 |
每 15 分钟扫描回收 |
联系方式
| 角色 |
联系方式 |
| 超级管理员 |
Leon |
| 服务地址 |
TK-Server · 192.168.11.70 |
| 公网地址 |
http://119.145.17.34:5102 |
| Git 仓库 |
Gitea · LZ-TK-Station · TK-QR-Gate |
← 常见问题 返回首页