219 lines
7.5 KiB
Python
219 lines
7.5 KiB
Python
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/<int:table_id>', 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/<int:table_id>', 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/<int:table_id>')
|
|
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 |