from flask import Blueprint, render_template, request, redirect, url_for, flash, session import requests from frontend.config import Config import time import base64 wx_token_cache = { 'access_token': None, 'expires_at': 0 # 过期时间戳 } tables_bp = Blueprint('tables', __name__) @tables_bp.route('/tables/') def list_tables(): if not session.get('token'): flash("请先登录", "warning") return redirect(url_for('auth.login')) try: resp = requests.get( f"{Config.BASE_API_URL}/admin/tables", headers={"Authorization": f"Bearer {session['token']}"} ) if resp.status_code != 200: flash("获取桌台列表失败", "danger") return redirect(url_for('dashboard.index')) # print (resp.json()) return render_template('tables/list.html', tables=resp.json()) except Exception as e: flash(f"网络错误: {str(e)}", "danger") return redirect(url_for('dashboard.index')) @tables_bp.route('/tables/add', methods=['GET', 'POST']) def add_table(): if not session.get('token'): return redirect(url_for('auth.login')) strategies = [] try: strategy_resp = requests.post( f"{Config.BASE_API_URL}/admin/table-strategies/list", json={"token": session['token']} ) strategies = strategy_resp.json() if strategy_resp.status_code == 200 else [] except Exception as e: flash(f"获取策略列表失败: {str(e)}", "warning") if request.method == 'POST': try: payload = { "token": session['token'], "game_table_number": str(request.form['game_table_number']), "capacity": int(request.form['capacity']), "strategy_id" : int(request.form['strategy_id']) } resp = requests.post( f"{Config.BASE_API_URL}/admin/tables/create", json=payload, headers={"Authorization": f"Bearer {session['token']}"} ) if resp.status_code == 200: flash("添加成功", "success") return redirect(url_for('tables.list_tables')) else: error_msg = resp.json().get('detail', '未知错误') flash(f"添加失败: {error_msg}", "danger") except ValueError: flash("输入格式不正确", "danger") except Exception as e: flash(f"网络错误: {str(e)}", "danger") return render_template('tables/add.html', strategies = strategies ) @tables_bp.route('/tables/edit/', methods=['GET', 'POST']) def edit_table(table_id): if not session.get('token'): return redirect(url_for('auth.login')) # 获取策略列表 strategies = [] try: # 获取策略列表 strategy_resp = requests.post( f"{Config.BASE_API_URL}/admin/table-strategies/list", json={"token": session['token']} ) strategies = strategy_resp.json() if strategy_resp.status_code == 200 else [] except Exception as e: flash(f"获取策略列表失败: {str(e)}", "warning") if request.method == 'POST': try: payload = { "token": session['token'], "game_table_number": str(request.form['game_table_number']), "capacity": int(request.form['capacity']), "strategy_id" : int(request.form['strategy_id']) } resp = requests.put( f"{Config.BASE_API_URL}/admin/tables/{table_id}", json=payload, headers={"Authorization": f"Bearer {session['token']}"} ) if resp.status_code == 200: flash("更新成功", "success") return redirect(url_for('tables.list_tables')) else: error_msg = resp.json().get('detail', '未知错误') flash(f"更新失败: {error_msg}", "danger") except ValueError: flash("输入格式不正确", "danger") except Exception as e: flash(f"网络错误: {str(e)}", "danger") # 获取当前桌台信息 try: resp = requests.get( f"{Config.BASE_API_URL}/admin/tables", headers={"Authorization": f"Bearer {session['token']}"} ) if resp.status_code == 200: tables = resp.json() table = next((t for t in tables if t['table_id'] == table_id), None) if table: return render_template('tables/edit.html', table=table, strategies=strategies) flash("桌台不存在", "danger") except Exception as e: flash(f"获取数据失败: {str(e)}", "danger") return redirect(url_for('tables.list_tables')) @tables_bp.route('/tables/delete/', methods=['POST']) def delete_table(table_id): if not session.get('token'): return redirect(url_for('auth.login')) try: resp = requests.delete( f"{Config.BASE_API_URL}/admin/tables/{table_id}", headers={"Authorization": f"Bearer {session['token']}"} ) if resp.status_code == 200: flash("删除成功", "success") else: error_msg = resp.json().get('detail', '未知错误') flash(f"删除失败: {error_msg}", "danger") except Exception as e: flash(f"网络错误: {str(e)}", "danger") return redirect(url_for('tables.list_tables')) @tables_bp.route('/admin/tables/list', methods=['GET']) def list_all_tables(): if not session.get('token'): return {"detail": "未认证"}, 401 try: resp = requests.get( f"{Config.BASE_API_URL}/admin/tables", headers={"Authorization": f"Bearer {session['token']}"} ) return resp.json() except Exception as e: return {"detail": str(e)}, 500 @tables_bp.route('/tables/qrcode/') def get_table_qrcode(table_id): if not session.get('token'): return {"detail": "未认证"}, 401 # 获取access_token try: current_time = time.time() if current_time > wx_token_cache['expires_at']: resp = requests.get( "https://api.weixin.qq.com/cgi-bin/token", params={ "grant_type": "client_credential", "appid": Config.WX_APP_ID, "secret": Config.WX_APP_SECRET } ) token_data = resp.json() if 'access_token' not in token_data: return {"detail": "获取token失败"}, 500 wx_token_cache['access_token'] = token_data['access_token'] wx_token_cache['expires_at'] = current_time + token_data['expires_in'] - 300 # 提前5分钟过期 # 生成小程序码 qr_resp = requests.post( Config.WX_QRCODE_API, params={"access_token": wx_token_cache['access_token']}, json={ "path": f"/pages/timer/timer?table_id={table_id}", "env_version": "release", "width": 280 } ) if qr_resp.status_code != 200 or 'image' not in qr_resp.headers.get('Content-Type', ''): return {"detail": "生成二维码失败"}, 500 return { "image": f"data:image/png;base64,{base64.b64encode(qr_resp.content).decode('utf-8')}", "table_id": table_id } except Exception as e: return {"detail": str(e)}, 500