Python生成关联CRUD信息的条形码 实现EAN码绑定数据模态框展示
实现业务数据与EAN码绑定+扫描模态框展示的全流程方案
1. 调整数据模型完成EAN码与业务数据绑定
直接在你现有施工人员的Django模型中新增EAN码存储字段,建立唯一关联:
# 原有施工人员模型仅需新增ean_code字段 from django.db import models class ConstructionStaff(models.Model): # 原有字段全部保留(身份证号、姓名、所属班组、资质状态等) id_card = models.CharField(max_length=18, unique=True, verbose_name="身份证号") name = models.CharField(max_length=20, verbose_name="姓名") team = models.CharField(max_length=50, verbose_name="所属班组") qualification_valid = models.BooleanField(default=True, verbose_name="资质是否有效") # 新增EAN码字段,加唯一约束避免重复绑定,加索引提升查询速度 ean_code = models.CharField(max_length=13, unique=True, db_index=True, null=True, blank=True, verbose_name="绑定EAN码") create_time = models.DateTimeField(auto_now_add=True)
修改完成后执行数据库迁移命令生效:python manage.py makemigrationspython manage.py migrate
绑定逻辑可二选一:
- 预批量生成EAN码打印成标签,人员进场登记时直接扫码将EAN值写入对应人员的ean_code字段
- 人员登记完成后生成对应EAN码,绑定后打印下发,可借助
python-barcode库生成合规EAN码,安装命令:pip install python-barcode
生成+绑定EAN码示例代码:
from barcode import EAN13 from barcode.writer import ImageWriter import random # 生成全局唯一的13位EAN码 def generate_unique_ean(): while True: # 前12位自定义生成,最后1位校验位EAN库自动计算 ean_num = ''.join([str(random.randint(0,9)) for _ in range(12)]) if not ConstructionStaff.objects.filter(ean_code=ean_num).exists(): return ean_num # 绑定到指定人员 staff = ConstructionStaff.objects.get(id_card="待绑定人员身份证号") staff.ean_code = generate_unique_ean() staff.save() # 生成EAN码图片用于打印下发 with open(f"{staff.ean_code}.png", "wb") as f: EAN13(staff.ean_code, writer=ImageWriter()).write(f)
2. 开发EAN码查询接口
前端扫码后调用该接口返回关联的人员信息,普通Django视图示例:
from django.http import JsonResponse def query_staff_by_ean(request): ean_code = request.GET.get("ean_code") if not ean_code: return JsonResponse({"code": 400, "msg": "EAN码为空"}, status=400) try: staff = ConstructionStaff.objects.get(ean_code=ean_code) # 返回需要展示在模态框的所有字段 data = { "name": staff.name, "id_card": staff.id_card, "team": staff.team, "qualification_valid": staff.qualification_valid, "entry_count": staff.entryrecord_set.count() # 关联的进场记录等扩展字段也可一并返回 } return JsonResponse({"code": 200, "data": data}) except ConstructionStaff.DoesNotExist: return JsonResponse({"code": 404, "msg": "未查询到对应人员"}, status=404)
写完后在urls.py中配置对应路由即可。
3. 前端实现扫码+模态框展示逻辑
可借助h5-qrcode库实现网页端扫码,扫到EAN码后调用接口,拿到数据填充到模态框弹出展示,核心逻辑示例:
// 扫码成功回调 function onScanSuccess(decodedText) { // decodedText即为扫描得到的EAN码值 fetch(`/api/query_staff_by_ean?ean_code=${decodedText}`) .then(res => res.json()) .then(res => { if(res.code === 200) { const info = res.data // 把数据填充到模态框对应节点 document.getElementById("modal-name").innerText = info.name document.getElementById("modal-id-card").innerText = info.id_card document.getElementById("modal-team").innerText = info.team document.getElementById("modal-qual").innerText = info.qualification_valid ? "有效" : "无效" // 弹出模态框,可使用Bootstrap/Element UI等任意框架的模态框组件 const staffModal = new bootstrap.Modal(document.getElementById('staffInfoModal')) staffModal.show() } else { alert(res.msg) } }) } // 初始化扫码器,调用后置摄像头 const html5QrCode = new Html5Qrcode("qr-reader"); html5QrCode.start( { facingMode: "environment" }, { fps: 10, qrbox: { width: 250, height: 250 } }, onScanSuccess );
注意事项
- 双重核验逻辑可在接口中补充,先校验人员身份证核验状态,再返回EAN关联信息,匹配你的业务需求
- EAN码生成时直接用成熟库即可,无需自己计算校验位,避免生成不符合规范的码无法被普通扫码设备识别
内容的提问来源于stack exchange,提问作者Mario Chico
相关产品推荐
相关产品推荐

