""" 主页面蓝图:首页、管理后台页、静态文件 """ import os from flask import Blueprint, current_app, redirect, url_for, send_file, session from werkzeug.utils import safe_join from utils.auth import login_required, is_session_user_valid from utils.render import render_html main = Blueprint('main', __name__, url_prefix='') BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_DIR = os.path.join(BASE_DIR, 'static') @main.route('/') def index(): if session.get('user_id') and is_session_user_valid(): return redirect(url_for('main.admin_page')) return redirect(url_for('auth.login')) @main.route('/admin') @login_required def admin_page(): """管理后台页:服务端直接渲染当前用户有权限的菜单,避免客户端二次渲染造成闪烁。""" context = {} try: # 复用权限菜单加载逻辑;Java 权限接口不可用时降级为无菜单(JS 侧会走 API 兜底) from blueprints.admin_api import _load_current_backend_menu_items _, _, items, denied = _load_current_backend_menu_items() if denied is None and items: context['admin_menu_items'] = items context['admin_menu_rendered'] = True else: # 权限接口失败:真实页面同样会失败,服务端不渲染菜单,避免展示越权菜单 context['admin_menu_rendered'] = False current_app.logger.warning('[admin] 服务端菜单渲染失败,降级为客户端加载: %s', (denied[0].get_json() if denied and len(denied) > 0 else None)) except Exception as exc: # 兜底:任何异常都不得阻断管理页打开,JS 会自行请求菜单接口 current_app.logger.exception('[admin] 服务端渲染菜单异常: %s', exc) context['admin_menu_rendered'] = False return render_html('admin.html', **context) @main.route('/static/') def serve_static(filename): """提供 static 目录及子目录下的静态文件访问""" filepath = safe_join(STATIC_DIR, filename) if filepath is None or not os.path.isfile(filepath): return '', 404 return send_file(filepath, as_attachment=False)