fix(timezone): 调整订单时间显示为北京时间

- 在订单创建时间和支付时间上统一加上8小时的时差偏移
- 修改get_orders和api_payment_history中时间的格式化逻辑,确保时间正确转换
- buy.html和recharge_history.html模板中调整paid_at时间显示,增加时差处理
- auth.py中buy_page接口支持支付成功提示和订单信息传递
- payment.py中同步支付回调改为重定向至充值页并传递成功参数
This commit is contained in:
24024 2026-01-14 20:29:31 +08:00
parent 72bacacf4f
commit 925da47118
8 changed files with 39 additions and 10 deletions

View File

@ -194,6 +194,7 @@ def delete_notification():
@permission_required('manage_system') # 仅限超级管理员 @permission_required('manage_system') # 仅限超级管理员
def get_orders(): def get_orders():
orders = Order.query.order_by(Order.created_at.desc()).all() orders = Order.query.order_by(Order.created_at.desc()).all()
from datetime import timedelta
return jsonify({ return jsonify({
"orders": [{ "orders": [{
"id": o.id, "id": o.id,
@ -203,7 +204,7 @@ def get_orders():
"points": o.points, "points": o.points,
"status": o.status, "status": o.status,
"trade_no": o.trade_no, "trade_no": o.trade_no,
"created_at": o.created_at.strftime('%Y-%m-%d %H:%M:%S'), "created_at": (o.created_at + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'),
"paid_at": o.paid_at.strftime('%Y-%m-%d %H:%M:%S') if o.paid_at else None "paid_at": (o.paid_at + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if o.paid_at else None
} for o in orders] } for o in orders]
}) })

View File

@ -62,8 +62,22 @@ def buy_page():
admin_orders = [] admin_orders = []
if is_admin: if is_admin:
admin_orders = Order.query.order_by(Order.created_at.desc()).limit(10).all() admin_orders = Order.query.order_by(Order.created_at.desc()).limit(10).all()
# 处理支付成功提示
success = request.args.get('success') == 'true'
out_trade_no = request.args.get('out_trade_no')
order = None
if out_trade_no:
order = Order.query.filter_by(out_trade_no=out_trade_no).first()
return render_template('buy.html', personal_orders=personal_orders, admin_orders=admin_orders, is_admin=is_admin) import datetime
return render_template('buy.html',
personal_orders=personal_orders,
admin_orders=admin_orders,
is_admin=is_admin,
modules={'datetime': datetime},
success=success,
order=order)
@auth_bp.route('/api/auth/send_code', methods=['POST']) @auth_bp.route('/api/auth/send_code', methods=['POST'])
def send_code(): def send_code():

View File

@ -82,8 +82,8 @@ def payment_return():
if success: if success:
logger.info(f"同步回调验证成功,订单号: {out_trade_no}") logger.info(f"同步回调验证成功,订单号: {out_trade_no}")
# 同步通知仅用于页面展示,实际业务逻辑在异步通知 notify 中处理 # 重定向到充值页面,并带上成功参数
return render_template('buy.html', success=True, order=order) return redirect(url_for('auth.buy_page', success='true', out_trade_no=out_trade_no))
else: else:
logger.error(f"同步回调验证失败,订单号: {out_trade_no}") logger.error(f"同步回调验证失败,订单号: {out_trade_no}")
return "支付验证失败", 400 return "支付验证失败", 400
@ -101,7 +101,8 @@ def payment_history():
user_id = session['user_id'] user_id = session['user_id']
orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all() orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all()
return render_template('recharge_history.html', orders=orders) import datetime
return render_template('recharge_history.html', orders=orders, modules={'datetime': datetime})
@payment_bp.route('/api/history', methods=['GET']) @payment_bp.route('/api/history', methods=['GET'])
def api_payment_history(): def api_payment_history():
@ -112,6 +113,7 @@ def api_payment_history():
user_id = session['user_id'] user_id = session['user_id']
orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all() orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all()
from datetime import timedelta
return jsonify({ return jsonify({
"orders": [{ "orders": [{
"id": o.id, "id": o.id,
@ -120,8 +122,8 @@ def api_payment_history():
"points": o.points, "points": o.points,
"status": o.status, "status": o.status,
"trade_no": o.trade_no, "trade_no": o.trade_no,
"created_at": o.created_at.strftime('%Y-%m-%d %H:%M:%S'), "created_at": (o.created_at + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S'),
"paid_at": o.paid_at.strftime('%Y-%m-%d %H:%M:%S') if o.paid_at else None "paid_at": (o.paid_at + timedelta(hours=8)).strftime('%Y-%m-%d %H:%M:%S') if o.paid_at else None
} for o in orders] } for o in orders]
}) })
@payment_bp.route('/notify', methods=['POST']) @payment_bp.route('/notify', methods=['POST'])

View File

@ -178,7 +178,13 @@
{% endif %} {% endif %}
</td> </td>
<td class="px-8 py-5"> <td class="px-8 py-5">
<span class="text-[10px] font-bold text-slate-400">{{ order.paid_at.strftime('%m-%d %H:%M') if order.paid_at else '-' }}</span> <span class="text-[10px] font-bold text-slate-400">
{% if order.paid_at %}
{{ (order.paid_at + modules.datetime.timedelta(hours=8)).strftime('%m-%d %H:%M') }}
{% else %}
-
{% endif %}
</span>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}

View File

@ -64,7 +64,13 @@
{% endif %} {% endif %}
</td> </td>
<td class="px-8 py-5"> <td class="px-8 py-5">
<span class="text-xs font-bold text-slate-400">{{ order.paid_at.strftime('%Y-%m-%d %H:%M') if order.paid_at else '-' }}</span> <span class="text-xs font-bold text-slate-400">
{% if order.paid_at %}
{{ (order.paid_at + modules.datetime.timedelta(hours=8)).strftime('%Y-%m-%d %H:%M') }}
{% else %}
-
{% endif %}
</span>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}