摘要

本论文设计并实现了一个基于 Python 的智能门票系统,旨在解决传统门票管理中的效率低下、防伪性差、用户体验不佳等问题。系统采用 Python 作为主要开发语言,结合 Web 技术、数据库技术和二维码 / 条形码技术,实现了门票的在线销售、电子验票、数据分析等功能。通过引入区块链技术,进一步增强了门票的防伪性和不可篡改性。实验结果表明,该系统能够有效提高门票管理效率,降低运营成本,提升用户体验。

1 引言

1.1 研究背景与意义

随着旅游业的快速发展,景区、演出、展览等场所的门票管理面临着越来越多的挑战。传统的纸质门票存在以下问题:

  • 防伪性差:容易被伪造和复制,给主办方带来经济损失
  • 效率低下:人工检票速度慢,容易造成排队拥堵,影响用户体验
  • 数据统计困难:难以对门票销售和使用情况进行实时统计和分析
  • 环保问题:大量使用纸质门票造成资源浪费和环境污染

智能门票系统的出现为解决上述问题提供了有效的途径。智能门票系统利用信息技术,将门票数字化,实现了门票的在线销售、电子验票、数据分析等功能,具有防伪性强、效率高、数据统计方便等优点。

1.2 国内外研究现状

目前,国内外已经有一些智能门票系统的研究和应用:

  • 国外研究现状:国外在智能门票领域的研究起步较早,技术相对成熟。例如,美国的 Ticketmaster 公司开发的智能门票系统,支持在线购票、移动支付、电子验票等功能;日本的 JR 东日本公司推出的 Suica 卡,不仅可以用于乘坐地铁、公交等交通工具,还可以用于购买景区门票。
  • 国内研究现状:国内智能门票系统的研究和应用也在不断发展。例如,故宫博物院推出的电子门票系统,实现了在线购票、预约参观、电子验票等功能;腾讯公司开发的 "腾讯文旅" 平台,为景区提供了智能门票、智慧导览、数据分析等一站式解决方案。

然而,现有的智能门票系统在安全性、用户体验、数据分析等方面仍存在一些不足之处。

1.3 研究内容与目标

本论文的研究内容包括:

  1. 智能门票系统的需求分析和功能设计
  2. 基于 Python 的智能门票系统架构设计
  3. 门票防伪技术研究与实现
  4. 电子验票系统设计与实现
  5. 门票数据分析与可视化
  6. 系统安全与性能优化

研究目标是开发一个功能完善、安全可靠、用户友好的智能门票系统,实现门票的在线销售、电子验票、数据分析等功能,提高门票管理效率,降低运营成本,提升用户体验。

2 相关技术与理论基础

2.1 Python 编程语言

Python 是一种高级、解释型、通用编程语言,具有以下特点:

  • 语法简洁:代码可读性高,开发效率高
  • 丰富的库支持:拥有大量用于 Web 开发、数据处理、机器学习等领域的库
  • 跨平台:可以在 Windows、Linux、Mac OS 等多种操作系统上运行
  • 开源免费:社区活跃,资源丰富

在本系统中,Python 主要用于 Web 后端开发、数据处理和业务逻辑实现。

2.2 Web 开发技术

Web 开发技术是构建智能门票系统的基础,主要包括:

  • 前端技术:HTML、CSS、JavaScript 等,用于构建用户界面
  • 后端技术:Python Web 框架(如 Django、Flask),用于处理业务逻辑和数据交互
  • 数据库技术:关系型数据库(如 MySQL、PostgreSQL)和非关系型数据库(如 MongoDB),用于存储系统数据
  • Web 服务:RESTful API,用于实现系统各模块之间的通信

在本系统中,采用 Flask 作为 Web 框架,MySQL 作为数据库,RESTful API 作为系统接口。

2.3 二维码 / 条形码技术

二维码 / 条形码是智能门票系统中常用的技术,具有以下优点:

  • 信息容量大:可以存储大量的信息,如门票编号、有效期、票价等
  • 防伪性强:可以通过加密技术和校验码提高防伪性
  • 读取速度快:可以通过扫码设备快速读取,提高检票效率
  • 成本低:生成和打印成本低,适合大规模应用

在本系统中,采用二维码作为门票的载体,使用 Python 的 qrcode 库生成二维码。

2.4 区块链技术

区块链是一种分布式账本技术,具有去中心化、不可篡改、可追溯等特点。在智能门票系统中引入区块链技术,可以提高门票的防伪性和不可篡改性,防止门票被伪造和重复使用。

在本系统中,采用 Hyperledger Fabric 作为区块链平台,实现门票的区块链存证和交易。

2.5 数据分析与可视化技术

数据分析与可视化技术可以帮助主办方了解门票销售情况、用户行为特征等,为决策提供支持。常用的数据分析与可视化技术包括:

  • 数据挖掘算法:关联规则挖掘、聚类分析、分类算法等
  • 数据可视化工具:Matplotlib、Seaborn、ECharts 等

在本系统中,使用 Python 的 pandas、numpy 等库进行数据处理和分析,使用 ECharts 进行数据可视化。

2.6 移动开发技术

移动开发技术可以帮助用户通过手机等移动设备购买门票、验票等,提高用户体验。常用的移动开发技术包括:

  • 原生开发:使用 Android Studio 和 Xcode 分别开发 Android 和 iOS 应用
  • 跨平台开发:使用 React Native、Flutter 等框架开发一次,同时在 Android 和 iOS 平台运行

在本系统中,采用 React Native 开发移动应用,实现门票的在线购买和验票功能。

3 系统需求分析

3.1 功能需求
3.1.1 用户管理模块
  • 用户注册与登录
  • 用户信息管理
  • 用户权限管理
  • 用户收藏管理
3.1.2 门票管理模块
  • 门票信息发布
  • 门票分类管理
  • 门票价格管理
  • 门票库存管理
  • 门票有效期管理
3.1.3 订单管理模块
  • 订单创建
  • 订单支付
  • 订单查询
  • 订单取消
  • 订单退款
3.1.4 电子验票模块
  • 二维码 / 条形码扫描
  • 门票验证
  • 验票记录
  • 异常处理
3.1.5 数据分析模块
  • 门票销售统计
  • 用户行为分析
  • 热门景点分析
  • 销售趋势预测
3.1.6 系统管理模块
  • 系统参数配置
  • 数据备份与恢复
  • 系统日志管理
  • 系统监控
3.2 非功能需求
3.2.1 性能需求
  • 系统响应时间不超过 3 秒
  • 支持至少 1000 个并发用户
  • 门票验证时间不超过 1 秒
  • 数据处理时间不超过 5 分钟
3.2.2 安全需求
  • 用户密码加密存储
  • 数据传输加密
  • 门票防伪技术
  • 防止 SQL 注入和 XSS 攻击
  • 防止恶意刷票
3.2.3 可用性需求
  • 系统 7×24 小时可用
  • 故障恢复时间不超过 30 分钟
  • 操作界面友好,易于使用
3.2.4 兼容性需求
  • 兼容主流浏览器
  • 支持移动端访问
  • 支持多种支付方式
  • 支持多种验票设备

4 系统设计

4.1 总体架构设计

系统采用分层架构设计,主要包括以下几层:

系统的核心模块包括:

  • 用户管理模块:负责用户的注册、登录、信息管理等
  • 门票管理模块:负责门票的信息发布、分类管理、价格管理等
  • 订单管理模块:负责订单的创建、支付、查询等
  • 电子验票模块:负责门票的验证、验票记录等
  • 数据分析模块:负责门票销售数据的统计、分析和可视化
  • 系统管理模块:负责系统参数配置、数据备份与恢复等
4.2 数据库设计
4.2.1 数据库表结构

用户表 (users)

sql

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码(加密)',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
  `id_card` varchar(20) DEFAULT NULL COMMENT '身份证号',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
  `role` tinyint(4) NOT NULL DEFAULT '1' COMMENT '角色(1:普通用户,2:管理员)',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(1:正常,0:禁用)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_username` (`username`),
  UNIQUE KEY `idx_email` (`email`),
  UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

景区 / 场馆表 (venues)

sql

CREATE TABLE `venues` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '景区/场馆ID',
  `name` varchar(100) NOT NULL COMMENT '名称',
  `description` text DEFAULT NULL COMMENT '描述',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
  `latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
  `phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `opening_hours` varchar(255) DEFAULT NULL COMMENT '开放时间',
  `ticket_limit` int(11) DEFAULT NULL COMMENT '每日门票限制',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(1:开放,0:关闭)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='景区/场馆表';

门票类型表 (ticket_types)

sql

CREATE TABLE `ticket_types` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '门票类型ID',
  `venue_id` int(11) NOT NULL COMMENT '景区/场馆ID',
  `name` varchar(100) NOT NULL COMMENT '名称',
  `description` text DEFAULT NULL COMMENT '描述',
  `price` decimal(10,2) NOT NULL COMMENT '价格',
  `valid_days` int(11) DEFAULT '1' COMMENT '有效期天数',
  `is_refundable` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否可退款(1:是,0:否)',
  `refund_fee_rate` decimal(5,2) DEFAULT '0.00' COMMENT '退票手续费率',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(1:可用,0:不可用)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_venue_id` (`venue_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门票类型表';

门票表 (tickets)

sql

CREATE TABLE `tickets` (
  `id` varchar(50) NOT NULL COMMENT '门票ID',
  `ticket_type_id` int(11) NOT NULL COMMENT '门票类型ID',
  `order_id` varchar(50) NOT NULL COMMENT '订单ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `name` varchar(100) NOT NULL COMMENT '名称',
  `price` decimal(10,2) NOT NULL COMMENT '价格',
  `valid_date` date NOT NULL COMMENT '有效日期',
  `entry_time` datetime DEFAULT NULL COMMENT '入园时间',
  `exit_time` datetime DEFAULT NULL COMMENT '出园时间',
  `is_used` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否已使用(1:是,0:否)',
  `is_refunded` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否已退款(1:是,0:否)',
  `refund_time` datetime DEFAULT NULL COMMENT '退款时间',
  `refund_amount` decimal(10,2) DEFAULT NULL COMMENT '退款金额',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(1:有效,0:无效)',
  `qrcode` varchar(255) DEFAULT NULL COMMENT '二维码图片路径',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_ticket_type_id` (`ticket_type_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_valid_date` (`valid_date`),
  KEY `idx_is_used` (`is_used`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='门票表';

订单表 (orders)

sql

CREATE TABLE `orders` (
  `id` varchar(50) NOT NULL COMMENT '订单ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `total_amount` decimal(10,2) NOT NULL COMMENT '总金额',
  `payment_method` varchar(50) DEFAULT NULL COMMENT '支付方式',
  `payment_time` datetime DEFAULT NULL COMMENT '支付时间',
  `transaction_id` varchar(100) DEFAULT NULL COMMENT '交易流水号',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(0:未支付,1:已支付,2:已取消,3:已退款)',
  `refund_amount` decimal(10,2) DEFAULT NULL COMMENT '退款金额',
  `refund_time` datetime DEFAULT NULL COMMENT '退款时间',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

订单明细表 (order_items)

sql

CREATE TABLE `order_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '明细ID',
  `order_id` varchar(50) NOT NULL COMMENT '订单ID',
  `ticket_id` varchar(50) NOT NULL COMMENT '门票ID',
  `ticket_type_id` int(11) NOT NULL COMMENT '门票类型ID',
  `price` decimal(10,2) NOT NULL COMMENT '单价',
  `quantity` int(11) NOT NULL DEFAULT '1' COMMENT '数量',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_ticket_id` (`ticket_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单明细表';

验票记录表 (check_records)

sql

CREATE TABLE `check_records` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `ticket_id` varchar(50) NOT NULL COMMENT '门票ID',
  `venue_id` int(11) NOT NULL COMMENT '景区/场馆ID',
  `check_time` datetime NOT NULL COMMENT '验票时间',
  `check_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '验票类型(1:入园,2:出园)',
  `checker_id` int(11) DEFAULT NULL COMMENT '验票人员ID',
  `checker_name` varchar(50) DEFAULT NULL COMMENT '验票人员姓名',
  `device_id` varchar(50) DEFAULT NULL COMMENT '验票设备ID',
  `result` tinyint(4) NOT NULL DEFAULT '1' COMMENT '验票结果(1:成功,0:失败)',
  `message` varchar(255) DEFAULT NULL COMMENT '验票信息',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_ticket_id` (`ticket_id`),
  KEY `idx_venue_id` (`venue_id`),
  KEY `idx_check_time` (`check_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='验票记录表';

收藏表 (favorites)

sql

CREATE TABLE `favorites` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '收藏ID',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `venue_id` int(11) NOT NULL COMMENT '景区/场馆ID',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_id_venue_id` (`user_id`,`venue_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收藏表';

系统配置表 (system_config)

sql

CREATE TABLE `system_config` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '配置ID',
  `config_key` varchar(100) NOT NULL COMMENT '配置键',
  `config_value` text NOT NULL COMMENT '配置值',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_config_key` (`config_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统配置表';

日志表 (system_logs)

sql

CREATE TABLE `system_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志ID',
  `user_id` int(11) DEFAULT NULL COMMENT '用户ID',
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `action` varchar(100) NOT NULL COMMENT '操作',
  `module` varchar(50) NOT NULL COMMENT '模块',
  `ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `user_agent` varchar(255) DEFAULT NULL COMMENT 'User-Agent',
  `content` text DEFAULT NULL COMMENT '操作内容',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_action` (`action`),
  KEY `idx_module` (`module`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统日志表';
4.3 系统架构图

4.4 部署架构图

4.5 用例图

4.6 界面原型
4.6.1 首页

首页展示热门景区 / 场馆、推荐门票、促销活动等信息,用户可以进行搜索、筛选等操作。

4.6.2 景区 / 场馆详情页

展示景区 / 场馆的详细信息,包括基本信息、开放时间、门票类型、用户评价等,用户可以进行收藏、购票等操作。

4.6.3 门票详情页

展示门票的详细信息,包括门票类型、价格、有效期、使用规则等,用户可以进行购票操作。

4.6.4 购票页面

用户选择购票数量、填写购票人信息、选择支付方式等,确认订单后进行支付。

4.6.5 订单页面

展示用户的订单列表,包括订单状态、订单金额、订单时间等信息,用户可以查看订单详情、取消订单、申请退款等。

4.6.6 门票页面

展示用户购买的门票列表,包括门票状态、门票类型、有效日期等信息,用户可以查看门票详情、使用门票等。

4.6.7 验票页面

验票人员使用验票设备扫描用户的门票二维码,系统验证门票有效性并记录验票信息。

4.6.8 管理后台首页

展示系统概览信息,包括今日订单数、今日验票数、热门景区 / 场馆等。

4.6.9 景区 / 场馆管理页面

管理员可以添加、编辑、删除景区 / 场馆信息,查看景区 / 场馆统计数据等。

4.6.10 门票管理页面

管理员可以添加、编辑、删除门票类型信息,查看门票销售统计数据等。

4.6.11 订单管理页面

管理员可以查看所有订单信息,处理订单退款、取消等操作。

4.6.12 验票管理页面

管理员可以查看验票记录,统计验票数据等。

4.6.13 统计分析页面

展示系统的各项统计数据,包括门票销售趋势、用户分布、热门景区 / 场馆等,支持数据导出和可视化展示。

4.6.14 用户管理页面

管理员可以查看、编辑、禁用用户信息,分配用户权限等。

4.6.15 系统配置页面

管理员可以配置系统参数,如支付方式、短信通知、邮件通知等。

5 系统实现

5.1 后端实现
5.1.1 项目结构

plaintext

smart-ticket-system/
├── src/
│   ├── main/
│   │   ├── python/
│   │   │   └── smart_ticket/
│   │   │       ├── __init__.py
│   │   │       ├── app.py                      # Flask应用入口
│   │   │       ├── config.py                   # 配置文件
│   │   │       ├── models/                    # 数据模型
│   │   │       │   ├── __init__.py
│   │   │       │   ├── user.py
│   │   │       │   ├── venue.py
│   │   │       │   ├── ticket_type.py
│   │   │       │   ├── ticket.py
│   │   │       │   ├── order.py
│   │   │       │   ├── order_item.py
│   │   │       │   ├── check_record.py
│   │   │       │   ├── favorite.py
│   │   │       │   ├── system_config.py
│   │   │       │   └── system_log.py
│   │   │       ├── controllers/               # 控制器
│   │   │       │   ├── __init__.py
│   │   │       │   ├── user_controller.py
│   │   │       │   ├── venue_controller.py
│   │   │       │   ├── ticket_controller.py
│   │   │       │   ├── order_controller.py
│   │   │       │   ├── check_controller.py
│   │   │       │   ├── analysis_controller.py
│   │   │       │   └── admin_controller.py
│   │   │       ├── services/                  # 服务层
│   │   │       │   ├── __init__.py
│   │   │       │   ├── user_service.py
│   │   │       │   ├── venue_service.py
│   │   │       │   ├── ticket_service.py
│   │   │       │   ├── order_service.py
│   │   │       │   ├── check_service.py
│   │   │       │   ├── payment_service.py
│   │   │       │   ├── notification_service.py
│   │   │       │   ├── qrcode_service.py
│   │   │       │   └── blockchain_service.py
│   │   │       ├── utils/                     # 工具类
│   │   │       │   ├── __init__.py
│   │   │       │   ├── db_utils.py
│   │   │       │   ├── security_utils.py
│   │   │       │   ├── date_utils.py
│   │   │       │   ├── file_utils.py
│   │   │       │   ├── http_utils.py
│   │   │       │   └── logger.py
│   │   │       ├── auth/                      # 认证授权
│   │   │       │   ├── __init__.py
│   │   │       │   ├── jwt_utils.py
│   │   │       │   └── auth_middleware.py
│   │   │       ├── scheduler/                 # 定时任务
│   │   │       │   ├── __init__.py
│   │   │       │   ├── daily_tasks.py
│   │   │       │   └── hourly_tasks.py
│   │   │       └── api/                       # API路由
│   │   │           ├── __init__.py
│   │   │           ├── v1/
│   │   │           │   ├── __init__.py
│   │   │           │   ├── user_api.py
│   │   │           │   ├── venue_api.py
│   │   │           │   ├── ticket_api.py
│   │   │           │   ├── order_api.py
│   │   │           │   ├── check_api.py
│   │   │           │   ├── analysis_api.py
│   │   │           │   └── admin_api.py
│   │   ├── static/                            # 静态资源
│   │   │   ├── css/
│   │   │   ├── js/
│   │   │   ├── images/
│   │   │   └── qrcodes/
│   │   └── templates/                         # HTML模板
│   │       ├── index.html
│   │       ├── venue.html
│   │       ├── ticket.html
│   │       ├── order.html
│   │       ├── my_tickets.html
│   │       ├── login.html
│   │       ├── register.html
│   │       ├── profile.html
│   │       ├── favorites.html
│   │       └── admin/
│   │           ├── dashboard.html
│   │           ├── venues.html
│   │           ├── ticket_types.html
│   │           ├── orders.html
│   │           ├── check_records.html
│   │           ├── statistics.html
│   │           ├── users.html
│   │           └── settings.html
│   └── test/                                  # 测试代码
├── requirements.txt                           # 依赖包
├── run.py                                     # 运行入口
└── README.md                                  # 项目说明
5.1.2 核心代码实现

门票生成与验证实现

python

运行

import uuid
import hashlib
import time
import base64
import qrcode
from io import BytesIO
from datetime import datetime, timedelta
from smart_ticket.models import Ticket, TicketType, Order, CheckRecord
from smart_ticket.utils import db_utils, security_utils, date_utils
from smart_ticket.services import user_service, venue_service, order_service

class TicketService:
    """门票服务"""
    
    def __init__(self):
        """初始化门票服务"""
        pass
    
    def generate_ticket_id(self):
        """生成门票ID"""
        # 使用UUID生成唯一ID
        ticket_id = str(uuid.uuid4()).replace('-', '')
        # 添加前缀和时间戳
        timestamp = int(time.time())
        ticket_id = f"ST{timestamp}{ticket_id[:16]}"
        return ticket_id
    
    def generate_ticket(self, order_id, user_id):
        """生成门票"""
        # 获取订单信息
        order = Order.query.filter_by(id=order_id).first()
        if not order:
            return None, "订单不存在"
        
        # 检查订单状态
        if order.status != 1:  # 已支付
            return None, "订单状态不正确"
        
        # 获取订单明细
        order_items = OrderItem.query.filter_by(order_id=order_id).all()
        if not order_items or len(order_items) == 0:
            return None, "订单明细不存在"
        
        # 生成门票
        tickets = []
        for item in order_items:
            # 获取门票类型
            ticket_type = TicketType.query.filter_by(id=item.ticket_type_id).first()
            if not ticket_type:
                continue
            
            # 生成门票ID
            ticket_id = self.generate_ticket_id()
            
            # 计算有效日期
            valid_date = datetime.now().date()
            
            # 创建门票
            ticket = Ticket()
            ticket.id = ticket_id
            ticket.ticket_type_id = item.ticket_type_id
            ticket.order_id = order_id
            ticket.user_id = user_id
            ticket.name = ticket_type.name
            ticket.price = ticket_type.price
            ticket.valid_date = valid_date
            ticket.is_used = 0
            ticket.is_refunded = 0
            ticket.status = 1
            ticket.create_time = datetime.now()
            ticket.update_time = datetime.now()
            
            # 保存门票
            db_utils.db.session.add(ticket)
            tickets.append(ticket)
        
        # 提交事务
        db_utils.db.session.commit()
        
        # 生成二维码
        for ticket in tickets:
            qrcode_url = self.generate_ticket_qrcode(ticket.id)
            ticket.qrcode = qrcode_url
            db_utils.db.session.commit()
        
        return tickets, "门票生成成功"
    
    def generate_ticket_qrcode(self, ticket_id):
        """生成门票二维码"""
        # 获取门票信息
        ticket = Ticket.query.filter_by(id=ticket_id).first()
        if not ticket:
            return None
        
        # 构建二维码内容
        qrcode_content = f"smart_ticket:{ticket_id}:{ticket.create_time.timestamp()}"
        
        # 添加签名
        signature = security_utils.generate_signature(qrcode_content)
        qrcode_content = f"{qrcode_content}:{signature}"
        
        # 生成二维码图片
        qr = qrcode.QRCode(
            version=1,
            error_correction=qrcode.constants.ERROR_CORRECT_L,
            box_size=10,
            border=4,
        )
        qr.add_data(qrcode_content)
        qr.make(fit=True)
        
        img = qr.make_image(fill_color="black", back_color="white")
        
        # 保存二维码图片
        filename = f"qrcodes/ticket_{ticket_id}.png"
        filepath = f"src/main/static/{filename}"
        img.save(filepath)
        
        return filename
    
    def verify_ticket(self, qrcode_content, venue_id, checker_id=None, checker_name=None, device_id=None):
        """验证门票"""
        # 解析二维码内容
        try:
            parts = qrcode_content.split(':')
            if len(

    博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c++等开发语言,以及毕业项目实战✌

       从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。

       先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。

       拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。

-----------------------------------------------------------------------------------

      大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。

相关博客地址:

csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog

Iteye博客:        https://www.iteye.com/blog/user/mr-lili-1986-163-com

门户:http://www.petsqi.cn

七、其他案例: 

 

  

 

Logo

更多推荐