You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dingyulan1/app/query_manager.py

92 lines
3.7 KiB

import iso8601
from flask import Blueprint, jsonify, request
from flask_jwt_extended import get_jwt_identity, jwt_required
from app import LogService
from app.models import Station
from app.models.ticket_lib import Ticket
from app.models.train_lib import Train
from app.station_manager import station_bp
from presenter import StationPresenter
from presenter.ticket import TicketPresenter
from presenter.train import TrainPresenter
from utils import create_response, StateCode
# 创建一个名为 'query' 的 Flask 蓝图,用于管理查询相关的路由
query_bp = Blueprint('query', __name__)
@query_bp.route('/trains/query_train', methods=['GET'])
def queryTrains():
"""
查询符合条件的车次信息。
该函数从请求参数中获取出发站、到达站和日期信息,
验证参数的有效性,若有效则查询符合条件的车次,
将车次信息转换为适合展示的格式,记录日志并返回包含车次信息的成功响应。
Returns:
tuple: 包含 JSON 响应和 HTTP 状态码的元组。
"""
# 从请求参数中获取出发站
from_station = request.args.get('from')
# 从请求参数中获取到达站
to_station = request.args.get('to')
# 从请求参数中获取日期并使用 iso8601 解析为日期对象
date = iso8601.parse_date(request.args.get('date'))
# 检查出发站、到达站和日期是否为空
if not from_station or not to_station or not date:
# 若为空,返回参数错误的响应
return jsonify(create_response(StateCode.PARAMS_ERROR)), 400
# 查询符合条件的车次
trains = Train.queryTrains(from_station, to_station, date)
# 使用列车展示器将车次信息转换为适合展示的字典列表
trains_presenters = [TrainPresenter(train).as_dict() for train in trains]
# 记录日志
LogService.log()
# 返回包含成功状态码和车次信息的响应
return jsonify(create_response(StateCode.SUCCESS, data=trains_presenters)), 200
@query_bp.route('/tickets', methods=['GET'])
@jwt_required()
def getTickets():
"""
查询当前用户的车票信息。
该函数需要 JWT 认证,获取当前用户的身份信息,
从数据库中查询该用户的车票记录,
将车票信息转换为适合展示的格式,记录日志并返回包含车票信息的成功响应。
Returns:
tuple: 包含 JSON 响应和 HTTP 状态码的元组。
"""
# 获取当前用户的 JWT 身份信息
current_user = get_jwt_identity()
# 从数据库中查询当前用户的车票记录
tickets = Ticket.query.filter_by(passenger_id=current_user).all()
# 使用车票展示器将车票信息转换为适合展示的字典列表
tickets_presenters = [TicketPresenter(ticket).as_dict() for ticket in tickets]
# 记录日志
LogService.log()
# 返回包含成功状态码和车票信息的响应
return jsonify(create_response(StateCode.SUCCESS, data=tickets_presenters)), 200
@station_bp.route('/stations', methods=['GET'])
def queryStations():
"""
查询所有站点信息。
该函数从数据库中查询所有站点记录,
将站点信息转换为适合展示的格式,记录日志并返回包含站点信息的成功响应。
Returns:
tuple: 包含 JSON 响应和 HTTP 状态码的元组。
"""
# 从数据库中查询所有站点记录
stations = Station.query.all()
# 使用站点展示器将站点信息转换为适合展示的字典列表
stations_presenters = [StationPresenter(station).as_dict() for station in stations]
# 记录日志
LogService.log()
# 返回包含成功状态码和站点信息的响应
return jsonify(create_response(StateCode.SUCCESS, data=stations_presenters)), 200