diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc index 63b4247..3c13584 100644 Binary files a/__pycache__/config.cpython-312.pyc and b/__pycache__/config.cpython-312.pyc differ diff --git a/blueprints/__pycache__/auth.cpython-312.pyc b/blueprints/__pycache__/auth.cpython-312.pyc index 2a5fea6..3183e55 100644 Binary files a/blueprints/__pycache__/auth.cpython-312.pyc and b/blueprints/__pycache__/auth.cpython-312.pyc differ diff --git a/blueprints/__pycache__/payment.cpython-312.pyc b/blueprints/__pycache__/payment.cpython-312.pyc index 78f2738..3190b24 100644 Binary files a/blueprints/__pycache__/payment.cpython-312.pyc and b/blueprints/__pycache__/payment.cpython-312.pyc differ diff --git a/blueprints/auth.py b/blueprints/auth.py index 8754003..7c85826 100644 --- a/blueprints/auth.py +++ b/blueprints/auth.py @@ -38,12 +38,32 @@ def notifications_page(): """系统通知管理页面""" return render_template('notifications.html') +@auth_bp.route('/admin/orders') +@admin_required +def admin_orders_page(): + """全员订单管理页面""" + return render_template('orders.html') + @auth_bp.route('/buy') def buy_page(): """购买积分页面""" if 'user_id' not in session: return redirect(url_for('auth.login_page')) - return render_template('buy.html') + + from models import Order, User + user_id = session['user_id'] + user = User.query.get(user_id) + + # 获取用户个人充值记录 + personal_orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).limit(10).all() + + # 如果是管理员,获取全员记录 + is_admin = user.has_permission('manage_system') + admin_orders = [] + if is_admin: + admin_orders = Order.query.order_by(Order.created_at.desc()).limit(10).all() + + return render_template('buy.html', personal_orders=personal_orders, admin_orders=admin_orders, is_admin=is_admin) @auth_bp.route('/api/auth/send_code', methods=['POST']) def send_code(): diff --git a/blueprints/payment.py b/blueprints/payment.py index 86676a0..69f6d02 100644 --- a/blueprints/payment.py +++ b/blueprints/payment.py @@ -92,6 +92,38 @@ def payment_return(): logger.error(f"处理同步回调时发生异常: {str(e)}", exc_info=True) return f"处理支付回调失败: {str(e)}", 500 +@payment_bp.route('/history', methods=['GET']) +def payment_history(): + """获取当前用户的充值历史记录""" + if 'user_id' not in session: + return redirect(url_for('auth.login')) + + user_id = session['user_id'] + orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all() + + return render_template('recharge_history.html', orders=orders) + +@payment_bp.route('/api/history', methods=['GET']) +def api_payment_history(): + """API 获取当前用户的充值历史记录""" + if 'user_id' not in session: + return jsonify({'code': 401, 'msg': '请先登录'}), 401 + + user_id = session['user_id'] + orders = Order.query.filter_by(user_id=user_id).order_by(Order.created_at.desc()).all() + + return jsonify({ + "orders": [{ + "id": o.id, + "out_trade_no": o.out_trade_no, + "amount": float(o.amount), + "points": o.points, + "status": o.status, + "trade_no": o.trade_no, + "created_at": o.created_at.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 + } for o in orders] + }) @payment_bp.route('/notify', methods=['POST']) def payment_notify(): """支付宝异步通知""" diff --git a/config.py b/config.py index 76d86d2..2edef04 100644 --- a/config.py +++ b/config.py @@ -45,9 +45,9 @@ class Config: SMS_NEED_PARAM = False # 该模板需要参数,如使用系统赠送模板请改为 False # 支付宝配置 (待填) - ALIPAY_APP_ID = "2021006126656681" # 支付宝 AppID + ALIPAY_APP_ID = "2021006125623511" # 支付宝 AppID ALIPAY_APP_PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY----- -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 -----END RSA PRIVATE KEY-----""" # 应用私钥 ALIPAY_PUBLIC_KEY = """-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlDx4KdOtOQE+tBq6jHKKFenRaRe2gbBnleBk++5gki9IQuxVyZUGTJixstf2gELFHWrGanpnwmGggXsqG+Rm5ZLJOlmFM1k0XeAIDvi6tP/rM+ZDFSu1bMBYtT5vzgVZC7mzIvOp9gsT/puqd3aNZmlviLD0R6OYN0zvFX+5qADZV7A9ziA+nXPFSHreBh7yY/q9ophVZNeHGPoYkDVI5++RrF1cALKOdit0giN5vxpe3ch9z3E6+FZg3LiP+1RW3tMiDQfp/SlVs6bNhLUtmlI5r7+mtFCKDUCEpnQ3S9e0II6rzyVXRyKCFs7qi5YzyhhmO3tJJoe9ilEFyNzfRQIDAQAB diff --git a/logs/system.log b/logs/system.log index d2cb7ed..51055a5 100644 --- a/logs/system.log +++ b/logs/system.log @@ -130,3 +130,7 @@ [2026-01-13 23:59:02] INFO - 用户登录成功 [2026-01-14 16:45:23] INFO - 用户登录尝试 [2026-01-14 16:45:23] INFO - 用户登录成功 +[2026-01-14 20:12:31] INFO - 用户登录尝试 +[2026-01-14 20:12:31] INFO - 用户登录成功 +[2026-01-14 20:17:10] INFO - 用户登录尝试 +[2026-01-14 20:17:10] INFO - 用户登录成功 diff --git a/static/A_2IGfT6uTwlgAAAAAQmAAAAgAerF1AQ.png b/static/A_2IGfT6uTwlgAAAAAQmAAAAgAerF1AQ.png new file mode 100644 index 0000000..261591e Binary files /dev/null and b/static/A_2IGfT6uTwlgAAAAAQmAAAAgAerF1AQ.png differ diff --git a/templates/base.html b/templates/base.html index d6c933d..f03c2cc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,6 +4,7 @@ {% block title %}AI 视界{% endblock %} + @@ -18,8 +19,8 @@
{% endblock %} {% block scripts %} {% endblock %} \ No newline at end of file diff --git a/templates/orders.html b/templates/orders.html new file mode 100644 index 0000000..a91d21b --- /dev/null +++ b/templates/orders.html @@ -0,0 +1,148 @@ +{% extends "base.html" %} + +{% block title %}全员充值记录 - 管理后台{% endblock %} + +{% block content %} +
+
+ +
+
+

全员充值记录

+

+ + 管理和查询系统内所有用户的充值情况 +

+
+
+
+ + +
+ +
+
+ + +
+
+ + + + + + + + + + + + + + + +
用户信息订单详情积分/金额状态时间
+
+ +

正在获取记录...

+
+
+
+
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} diff --git a/templates/recharge_history.html b/templates/recharge_history.html new file mode 100644 index 0000000..14d30dd --- /dev/null +++ b/templates/recharge_history.html @@ -0,0 +1,87 @@ +{% extends "base.html" %} + +{% block title %}充值记录 - AI 视界{% endblock %} + +{% block content %} +
+
+ +
+
+

充值记录

+

+ + 查看您的所有积分充值历史 +

+
+ + + 立即充值 + +
+ + +
+
+ + + + + + + + + + + + {% if orders %} + {% for order in orders %} + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
订单号积分金额状态支付时间
+
+ {{ order.out_trade_no }} + Ali: {{ order.trade_no or '-' }} +
+
+
+
+ +
+ +{{ order.points }} +
+
+ ¥{{ order.amount }} + + {% if order.status == 'PAID' %} + 已完成 + {% elif order.status == 'PENDING' %} + 待支付 + {% else %} + 已取消 + {% endif %} + + {{ order.paid_at.strftime('%Y-%m-%d %H:%M') if order.paid_at else '-' }} +
+
+ +

暂无充值记录

+
+
+
+
+
+
+{% endblock %}