1474f69c73
Build Backend JAR / build (push) Has been cancelled
- main.py admin_page 调用 _load_current_backend_menu_items 取当前用户权限菜单, 经 render_html 传入模板;Java 权限接口不可用时降级不渲染(避免展示越权菜单) - admin.html 删除写死的 16 个静态菜单按钮,改为 Jinja2 按权限渲染分组菜单, 渲染成功时 nav 带 data-server-rendered 标记,失败显示轻量占位 - admin.js loadAdminMenus 识别 data-server-rendered 后直接绑定事件并激活, 不再请求 /current-user/menus 重渲染(保留 API 兜底路径)
55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""
|
|
主页面蓝图:首页、管理后台页、静态文件
|
|
"""
|
|
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/<path:filename>')
|
|
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)
|