在线抢票系统python
时间: 2023-10-10 11:05:28 浏览: 41
一个在线抢票系统的实现需要完成以下几个步骤:
1. 构建数据库模型:用于存储票务信息和已购买票的用户信息。
2. 编写后端API:用于接收用户的请求,查询数据库,更新票务信息,返回抢票结果。
3. 编写前端界面:用于展示抢票页面和抢票结果。
下面给出一个简单的实现示例:
1. 构建数据库模型
利用Python的ORM框架,可以轻松地定义数据库模型,并将其转换为数据库表。以下是一个简单的模型示例:
```python
from sqlalchemy import Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Ticket(Base):
__tablename__ = 'tickets'
id = Column(Integer, primary_key=True)
name = Column(String)
total_num = Column(Integer)
sold_num = Column(Integer, default=0)
is_sold_out = Column(Boolean, default=False)
```
该模型定义了一个票务信息表,包括票务名称、总票数、已售票数和是否售罄等信息。
2. 编写后端API
利用Python的Web框架,可以实现后端API,接收用户的请求,查询数据库,更新票务信息,返回抢票结果。以下是一个简单的示例:
```python
from flask import Flask, request, jsonify
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from ticket_model import Base, Ticket
app = Flask(__name__)
engine = create_engine('sqlite:///tickets.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
@app.route('/tickets', methods=['GET'])
def get_tickets():
session = Session()
tickets = session.query(Ticket).all()
session.close()
return jsonify([t.__dict__ for t in tickets])
@app.route('/tickets/<int:id>/purchase', methods=['POST'])
def purchase_ticket(id):
session = Session()
ticket = session.query(Ticket).filter_by(id=id).first()
if ticket.is_sold_out:
session.close()
return jsonify({'msg': 'Sorry, the ticket is sold out.'}), 400
if ticket.sold_num >= ticket.total_num:
ticket.is_sold_out = True
session.commit()
session.close()
return jsonify({'msg': 'Sorry, the ticket is sold out.'}), 400
ticket.sold_num += 1
if ticket.sold_num == ticket.total_num:
ticket.is_sold_out = True
session.commit()
session.close()
return jsonify({'msg': 'Purchase succeeded.'})
```
该示例实现了两个API:获取票务信息和购票。在购票API中,首先检查该票是否已售罄,如果是则返回错误信息;如果未售罄,则检查是否还有余票,如果没有则标记为售罄;如果还有余票,则将已售票数加1,并判断是否售罄。
3. 编写前端界面
利用HTML、CSS和JavaScript等前端技术,可以实现一个简单的抢票页面和结果展示。以下是一个示例:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Online Ticketing System</title>
</head>
<body>
<h1>Online Ticketing System</h1>
<div id="tickets"></div>
<div>
<h2>Purchase Ticket</h2>
<label for="ticket-id">Ticket ID:</label>
<input type="text" id="ticket-id"><br>
<button onclick="purchaseTicket()">Purchase</button>
<p id="result"></p>
</div>
<script>
function purchaseTicket() {
var id = document.getElementById('ticket-id').value;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var result = document.getElementById('result');
if (xhr.status == 200) {
result.innerHTML = JSON.parse(xhr.responseText).msg;
} else {
result.innerHTML = JSON.parse(xhr.responseText).msg;
}
}
};
xhr.open('POST', '/tickets/' + id + '/purchase', true);
xhr.send();
}
function loadTickets() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
var tickets = JSON.parse(xhr.responseText);
var ticketsDiv = document.getElementById('tickets');
var html = '<h2>Tickets</h2><ul>';
for (var i = 0; i < tickets.length; i++) {
var ticket = tickets[i];
html += '<li>' + ticket.name + ': ' + ticket.sold_num + '/' + ticket.total_num + (ticket.is_sold_out ? ' (Sold out)' : '') + '</li>';
}
html += '</ul>';
ticketsDiv.innerHTML = html;
}
};
xhr.open('GET', '/tickets', true);
xhr.send();
}
loadTickets();
</script>
</body>
</html>
```
该示例实现了一个简单的抢票页面,包括票务信息展示和购票表单。在购票表单中,用户输入票务ID后,点击“Purchase”按钮即可发送购票请求。购票结果将在页面下方展示。在页面加载完成后,将自动获取票务信息。