|
"""
|
|
Web路由模块 - 处理所有页面请求和身份验证
|
|
"""
|
|
import re
|
|
from flask import Blueprint, render_template, request, redirect, url_for, make_response, session
|
|
from datetime import datetime
|
|
from config import ADMIN_PASSWORD, PLATFORMS, PLATFORM_STYLES, TOKEN_EXPIRY_DAYS
|
|
from utils.auth import AuthManager
|
|
from models.api_key import ApiKeyManager
|
|
|
|
|
|
web_bp = Blueprint('web', __name__)
|
|
|
|
|
|
def get_sort_key(key):
|
|
"""
|
|
生成用于排序的元组 (balance, platform_priority)。
|
|
- balance: 主要排序键,降序。
|
|
- platform_priority: 次要排序键,仅在 balance 相同时生效,降序。
|
|
- Google: paid=1, free=0
|
|
- OpenAI/Claude: t5=5, t4=4, ..., t1=1, 其他=0
|
|
"""
|
|
balance = key.get('balance', 0)
|
|
platform_priority = 0
|
|
platform = key.get('platform', '').lower()
|
|
name = key.get('name', '').lower()
|
|
states = key.get('states', '').lower()
|
|
|
|
if platform == 'google':
|
|
if 'paid' in states:
|
|
platform_priority = 1
|
|
elif platform in ['openai', 'anthropic']:
|
|
match = re.search(r't(\d)', name)
|
|
if match:
|
|
try:
|
|
tier = int(match.group(1))
|
|
if 1 <= tier <= 5:
|
|
platform_priority = tier
|
|
except ValueError:
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
return (balance, platform_priority)
|
|
|
|
@web_bp.route('/')
|
|
def index():
|
|
"""首页 - 显示API密钥管理界面"""
|
|
api_keys_data = ApiKeyManager.get_all_keys()
|
|
all_keys_list = api_keys_data.get("api_keys", [])
|
|
|
|
|
|
|
|
|
|
sorted_keys = sorted(all_keys_list, key=get_sort_key, reverse=True)
|
|
|
|
|
|
grouped_keys = {}
|
|
for platform in PLATFORMS:
|
|
grouped_keys[platform["id"]] = {
|
|
"name": platform["name"],
|
|
"keys": []
|
|
}
|
|
|
|
|
|
for key in sorted_keys:
|
|
platform_id = key.get("platform", "other").lower()
|
|
if platform_id not in grouped_keys:
|
|
platform_id = "other"
|
|
grouped_keys[platform_id]["keys"].append(key)
|
|
|
|
is_ajax = request.args.get('ajax', '0') == '1'
|
|
return render_template('index.html', platforms=PLATFORMS, grouped_keys=grouped_keys, platform_styles=PLATFORM_STYLES)
|
|
|
|
@web_bp.route('/update-test')
|
|
def update_test():
|
|
"""API密钥更新测试页面"""
|
|
return render_template('update_test.html')
|
|
|
|
@web_bp.route('/login', methods=['GET', 'POST'])
|
|
def login():
|
|
"""用户登录"""
|
|
error = None
|
|
if request.method == 'POST':
|
|
password = request.form.get('password')
|
|
if password == ADMIN_PASSWORD:
|
|
|
|
token = AuthManager.generate_token()
|
|
AuthManager.store_token(token)
|
|
|
|
|
|
response = make_response(redirect(url_for('web.index')))
|
|
response.set_cookie(
|
|
'auth_token',
|
|
token,
|
|
max_age=TOKEN_EXPIRY_DAYS * 24 * 60 * 60,
|
|
httponly=True,
|
|
secure=request.is_secure
|
|
)
|
|
return response
|
|
else:
|
|
error = "密码错误,请重试"
|
|
|
|
|
|
current_year = datetime.now().year
|
|
return render_template('login.html', error=error, now={'year': current_year})
|
|
|
|
@web_bp.route('/logout')
|
|
def logout():
|
|
"""用户登出"""
|
|
|
|
token = request.cookies.get('auth_token')
|
|
|
|
|
|
if token:
|
|
AuthManager.remove_token(token)
|
|
|
|
|
|
response = make_response(redirect(url_for('web.login')))
|
|
response.delete_cookie('auth_token')
|
|
return response
|
|
|