🏢 展示站 🔐 登录编辑
🏠 首页 /附录

附录

📄 appendix.md 🕘 3 个历史版本

附录

项目信息

项目 内容
项目名称 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

← 常见问题 返回首页