
目录一、做这个项目的背景二、技术栈的选择前端技术栈后端技术栈项目架构图三、核心功能的详解1. 用户系统登录注册与权限控制2. 演出搜索让用户快速找到想看的演出3. 智能推荐猜你喜欢数据来源推荐策略4. 核心交互选座购票4.1 交互式座位图4.2 座位锁定机制5. 秒杀系统高并发挑战6. 订单管理全生命周期追踪7. 智能客服24小时在线答疑7.1 多轮对话支持7.2 知识库集成7.3 智能路由7.4 客服界面8. 后台管理系统8.1 演出管理8.2 用户管理8.3 订单管理8.4 数据统计四、项目中遇到的问题以及解决问题一库存超卖问题二缓存一致性问题问题三分布式事务问题问题四消息队列堆积五、项目的亮点六、项目总结与感受这篇博客是我做完这个项目后的一个总结一、做这个项目的背景这是一个高并发的票务平台项目做这个项目的初衷是市面上的票务平台对于个别城市开放的中小型演出没有兼顾到并且在热门演出开票时常常出现卡顿库存超卖的情况我想切实的解决这些问题所以做了这个项目试水核心目标有三个扛住高并发秒杀场景下能稳定处理大量请求数据实时同步座位、订单状态要实时更新智能化体验给用户推荐感兴趣的演出用AI客服减轻运营压力二、技术栈的选择前端技术栈框架Vue 3 TypeScriptVue3的组合式API太好用了TypeScript让代码更规范构建工具Vite开发体验好状态管理PiniaVue官方推荐路由Vue Router 4单页应用必备UI组件库Element Plus组件丰富文档友好样式Tailwind CSS 3原子化CSS写样式快到飞起后端技术栈框架FastAPIPython异步生态成熟开发效率高自动生成API文档数据库MySQL 8.0 SQLAlchemy 2.0关系型数据库首选ORM用着省心缓存Redis 7支持分布式锁、原子操作秒杀必备搜索Elasticsearch 8全文检索性能好还支持向量检索消息队列RabbitMQ异步任务处理解耦业务AI能力Dify可视化工作流快速集成LLM项目架构图┌─────────────────────────────────────────────────────────────┐ │ 前端层 (Vue3 TypeScript) │ ├─────────────────────────────────────────────────────────────┤ │ API Gateway (FastAPI Nginx) │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────────────┐ │ │ │ 用户服务│ │ 演出服务│ │ 订单服务 │ │ AI服务 │ │ │ │ │ │ │ │ │ │ (Dify工作流) │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────────┬─────────┘ │ │ │ │ │ │ │ ├───────┼───────────┼───────────┼────────────────┼───────────┤ │ ▼ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────────────┐│ │ │ 中间件层 ││ │ │ Redis(座位锁/热点缓存) │ RabbitMQ(异步消息任务) ││ │ │ Elasticsearch(演出检索) │ Canal(MySQL数据同步) ││ │ └─────────────────────────────────────────────────────────┘│ ├─────────────────────────────────────────────────────────────┤ │ 数据持久层 (MySQL 8.0) │ └─────────────────────────────────────────────────────────────┘三、核心功能的详解1. 用户系统登录注册与权限控制用户模块是基础我们做了手机号注册、密码登录还集成了JWT认证登录成功后返回token后续请求都要带上这个tokenapp.post(/api/login) async def login(username: str, password: str): user await get_user_by_username(username) if not user or not verify_password(password, user.password): raise HTTPException(status_code401, detail用户名或密码错误) access_token create_access_token(data{sub: user.username}) return {access_token: access_token, token_type: bearer}2. 演出搜索让用户快速找到想看的演出搜索功能用了Elasticsearch支持关键词搜索、分类筛选、城市筛选比如用户搜周杰伦就能找到相关演出async def search_performance(keyword: str, city: str None): query {bool: {must: [{match: {name: keyword}}], filter: []}} if city: query[bool][filter].append({term: {city: city}}) result await es_client.search(indexperformance_index, queryquery) return [hit[_source] for hit in result[hits][hits]]3. 智能推荐猜你喜欢这个功能是提升用户转化率的关键我们基于用户行为做个性化推荐数据来源用户浏览过的演出用户购买过的演出用户搜索过的关键词用户收藏的演出推荐策略协同过滤根据相似用户的行为推荐内容推荐根据演出类型、艺人、城市推荐热门推荐结合平台热度综合推荐实现方式 我们用Dify搭建了推荐工作流输入用户行为数据输出个性化推荐列表async def get_personalized_recommend(user_id: int): # 获取用户最近30天的行为数据 behavior await get_user_behavior(user_id) # 调用Dify工作流生成推荐 response await dify_client.run_workflow( workflow_idpersonalized_recommend, inputs{ user_id: user_id, behavior: behavior, top_k: 6 # 返回6个推荐结果 } ) return response.get(recommendations, [])效果 上线后推荐模块的点击率比随机推荐提升了35%用户转化率提升了20%4. 核心交互选座购票这部分是用户购票的核心流程我们做了很多优化4.1 交互式座位图用户进入选座页面后会看到一个可视化的座位图不同状态的座位用不同颜色区分绿色可选座位红色已售出座位蓝色用户已选座位黄色临时锁定座位template div classseat-map-container div classstage-indicator舞台/div div classseat-area div v-for(row, rowIndex) in seatRows :keyrowIndex classseat-row div classrow-label{{ rowIndex 1 }}/div div v-forseat in row :keyseat.id :classgetSeatClass(seat) clickhandleSeatClick(seat) span v-ifseat.status 0 selectedSeats.includes(seat.id)✓/span /div /div /div /div /template4.2 座位锁定机制用户选好座位后系统会自动锁定这些座位15分钟防止被其他用户抢走async def lock_seats(seat_ids: list, user_id: int) - bool: async with async_session() as session: seats await session.execute( select(Seat).where(Seat.id.in_(seat_ids), Seat.status 0) ) if len(seats.scalars().all()) ! len(seat_ids): return False await session.execute( update(Seat) .where(Seat.id.in_(seat_ids)) .values(status2, lock_user_iduser_id, lock_timedatetime.now()) ) await session.commit() for seat_id in seat_ids: await redis_client.set(fseat_lock:{seat_id}, user_id, ex900) return True5. 秒杀系统高并发挑战秒杀是最考验技术的部分。我们用Redis预减库存再用MySQL乐观锁兜底确保不会超卖。单SKU能支持5万次/秒的请求async def seckill(sku_id: int, user_id: int): result await redis_client.decr(fstock:{sku_id}) if result 0: return False async with async_session() as session: update_count await session.execute( update(PerformanceSKU) .where(PerformanceSKU.id sku_id, PerformanceSKU.stock 1) .values(stockPerformanceSKU.stock - 1) ) if update_count.rowcount 0: await redis_client.incr(fstock:{sku_id}) return False await session.commit() return True6. 订单管理全生命周期追踪订单状态流转很复杂我们做了清晰的状态机待支付→已支付→已出票支持退票和取消。超时未支付的订单会自动取消待支付 → 已支付 → 已出票 ↓ ↓ 支付失败 退票申请中 → 已退款 ↓ 超时取消/主动取消7. 智能客服24小时在线答疑7.1 多轮对话支持用户可以和客服进行多轮对话客服会记住上下文async def ai_chat(user_id: int, question: str, session_id: str None): history await get_chat_history(user_id, session_id) messages [] for msg in history: messages.append({role: msg.role, content: msg.content}) messages.append({role: user, content: question}) response await dify_client.run_workflow( workflow_idai_chat, inputs{user_id: user_id, messages: messages} ) await save_chat_history(user_id, response.get(session_id), [ {role: user, content: question}, {role: assistant, content: response.get(answer)} ]) return {answer: response.get(answer), session_id: response.get(session_id)}7.2 知识库集成我们把演出信息、购票规则、退票政策等内容整理成知识库让AI客服能准确回答用户问题async def query_knowledge_base(question: str) - str: 查询知识库 # 构建ES查询 query { bool: { should: [ {match: {title: {query: question, boost: 2}}}, {match: {content: question}} ] } } result await es_client.search(indexknowledge_base, queryquery) if result[hits][total][value] 0: return result[hits][hits][0][_source][content] return None7.3 智能路由根据用户问题类型自动路由到不同的处理逻辑订单查询、退票政策、演出信息等async def process_user_question(user_id: int, question: str): 处理用户问题 # 意图识别 intent await classify_intent(question) if intent order_status: # 查询订单状态 order_no extract_order_no(question) return await get_order_status(order_no) elif intent refund_policy: # 返回退票政策 return await query_knowledge_base(退票政策) elif intent performance_info: # 查询演出信息 performance_name extract_performance_name(question) return await get_performance_info(performance_name) else: # 交给AI处理 return await ai_chat(user_id, question)7.4 客服界面前端做了一个类似聊天软件的界面template div classchat-container !-- 聊天消息列表 -- div classmessage-list div v-for(msg, index) in messages :keyindex :class[message, msg.role] div classavatar{{ msg.role user ? 我 : 客服 }}/div div classcontent{{ msg.content }}/div /div /div !-- 输入框 -- div classinput-area input v-modelinputMessage keyup.entersendMessage placeholder请问有什么可以帮您 / button clicksendMessage发送/button /div /div /template script setup langts import { ref } from vue const messages ref{role: string; content: string}[]([ {role: assistant, content: 您好我是智速优座的智能客服请问有什么可以帮您} ]) const inputMessage ref() const sendMessage async () { if (!inputMessage.value.trim()) return // 添加用户消息 messages.value.push({role: user, content: inputMessage.value}) // 调用API const response await api.aiChat(inputMessage.value) // 添加客服回复 messages.value.push({role: assistant, content: response.answer}) inputMessage.value } /script8. 后台管理系统有很多功能这里挑重要的说8.1 演出管理演出列表支持分页、搜索、筛选按状态、城市、类型新增演出填写演出名称、类型、海报、场馆、时间等信息场次管理给演出添加多个场次设置票价和库存座位管理批量导入座位信息可视化座位图编辑状态控制一键上架/下架演出自动下架过期演出8.2 用户管理用户列表查看所有用户支持搜索和筛选用户详情查看用户的基本信息、订单记录、积分余额黑名单管理将恶意用户加入黑名单禁止登录8.3 订单管理订单列表支持按订单号、用户ID、状态筛选订单详情查看订单完整信息座位、金额、支付方式等退票审核处理用户的退票申请支持通过/拒绝订单统计实时统计订单数量、销售额、转化率# 退票审核接口 app.post(/api/admin/order/{order_id}/refund) async def approve_refund(order_id: int, approved: bool, operator_id: int): async with async_session() as session: order await session.get(Order, order_id) if not order or order.status ! OrderStatus.REFUND_PENDING.value: raise HTTPException(status_code400, detail订单状态不允许) if approved: # 计算退款金额扣除手续费 refund_amount order.amount * (1 - (order.refund_fee_rate or 0)) order.status OrderStatus.REFUNDED.value order.refund_amount refund_amount order.refund_approved True order.refund_approve_time datetime.now() order.refund_operator operator_id # 返还库存 await session.execute( update(PerformanceSKU) .where(PerformanceSKU.id order.sku_id) .values(stockPerformanceSKU.stock 1) ) else: order.status OrderStatus.PAID.value order.refund_approved False await session.commit() return {message: 审核成功}8.4 数据统计销售统计每日/每周/每月的订单数量、销售额、客单价演出排行按销售额、购票人数排序的演出TOP10实时监控当前在线用户数、系统响应时间、错误率# 获取销售统计数据 async def get_sales_statistics(start_date: date, end_date: date): async with async_session() as session: result await session.execute( select( func.date(Order.create_time).label(date), func.count(Order.id).label(order_count), func.sum(Order.amount).label(total_amount) ) .where( Order.create_time start_date, Order.create_time end_date, Order.status OrderStatus.PAID.value ) .group_by(func.date(Order.create_time)) ) return [{date: row.date, order_count: row.order_count, total_amount: row.total_amount} for row in result]四、项目中遇到的问题以及解决问题一库存超卖问题场景第一次做秒杀测试的时候我们准备了100张票结果系统显示卖出去了120多张问题表现秒杀开始后库存瞬间变成负数用户下单成功但实际没有票客服收到大量投诉根本原因 我们一开始用的是先查后改的逻辑在高并发场景下多个请求同时查到库存0然后同时扣减就导致了超卖解决方案 改成了Redis预减库存 MySQL乐观锁的方案先用Redis的原子操作预减库存再用MySQL乐观锁兜底如果MySQL扣减失败回滚Redis库存效果秒杀成功率达到99.99%再也没出现过超卖问题问题二缓存一致性问题问题场景运营人员在后台修改了演出信息但用户看到的还是旧数据问题表现后台修改了演出票价用户看到的还是旧价格演出下架了但搜索结果里还能找到根本原因 MySQL数据更新后Redis缓存没有及时失效。我们一开始是手动删除缓存但有时候会忘记或者删除失败解决方案用Canal监听MySQL的binlog当数据变化时自动删除对应的Redis缓存加一个缓存失效队列确保缓存一定会被删除效果数据延迟从原来的几分钟降到了100ms问题三分布式事务问题问题场景用户下单时订单创建成功了但座位锁定失败导致数据不一致。问题表现用户收到订单成功的消息但选的座位还是可选状态同一个座位被多个用户下单根本原因 订单创建和座位锁定是两个独立的数据库操作没有用事务管理。如果中间某个步骤失败就会导致数据不一致。解决方案 用消息队列实现最终一致性先创建订单状态为待确认发送座位锁定消息到RabbitMQ消费者收到消息后锁定座位如果锁定成功更新订单状态为待支付如果锁定失败取消订单效果订单和座位状态保持一致再也没有出现过数据不一致的情况问题四消息队列堆积问题场景秒杀活动结束后支付回调消息堆了好几万条消费者处理不过来。问题表现RabbitMQ消息队列长度持续增长用户支付成功后订单状态迟迟不更新系统响应变慢根本原因 我们一开始只部署了1个消费者处理能力有限。秒杀时每秒产生几千条消息远远超过了消费者的处理能力。解决方案动态扩容消费者数量从1个增加到10个给消息设置优先级重要消息优先处理优化消费者代码提高处理速度效果消息堆积问题得到缓解消息处理延迟从原来的几分钟降到了几秒钟五、项目的亮点高并发秒杀成功率99.99%实时数据同步Canal监听MySQL数据延迟100msAI智能推荐提升用户转化率20%完善的选座体验可视化座位图智能锁定智能客服多轮对话知识库支持强大的后台管理全流程运营支持Docker容器化一键部署六、项目总结与感受做这个项目最大的收获就是对高并发有了真正的理解。以前只在书本上看过的概念这次都在实战中用到了智能推荐、选座体验、智能客服这些功能虽然不是核心交易流程但对提升用户体验和转化率至关重要。后台管理系统则是运营团队的核心工具能大大提升工作效率还有一个感悟没有完美的系统只有不断进化的系统。我标签建议通用标签文章分析内容标签关键词提取文本分类技术/方法论标签自然语言处理文本挖掘信息检索机器学习应用场景标签内容推荐知识管理数据标注智能摘要细分领域标签语义分析主题建模特征提取标签生成如果需要更具体的标签可以提供文章内容或主题方向以便进一步细化。现在的系统还有很多不足但只要持续改进就会越来越好最后如果你也在做类似的项目欢迎一起交流