# 模板管理路由 from flask import Blueprint, request, jsonify from app.models import db, Template from app.routes.auth import admin_required, login_required_json templates_bp = Blueprint('templates', __name__, url_prefix='/templates') def init_default_templates(): """初始化默认模板(如果不存在)""" # 默认模板从数据库获取,按 sort_order 排序 pass # 不再使用代码中的硬编码模板 @templates_bp.route("/") @admin_required def templates_page(): """模板管理页面""" from flask import render_template return render_template("templates.html", active_nav="templates") @templates_bp.route("/templates", methods=["GET"]) @login_required_json def get_templates(): """获取所有模板(按sort_order排序,可按type筛选)""" query = Template.query.order_by(Template.sort_order.asc()) template_type = request.args.get('type') if template_type: query = query.filter_by(type=template_type) templates = query.all() return jsonify([t.to_dict() for t in templates]) @templates_bp.route("/templates/", methods=["GET"]) @admin_required def get_template(template_id): """获取单个模板""" tmpl = Template.query.get_or_404(template_id) return jsonify(tmpl.to_dict()) @templates_bp.route("/templates", methods=["POST"]) @admin_required def create_template(): """创建模板""" data = request.get_json() tmpl = Template( name=data.get("name"), type=data.get("type"), content=data.get("content"), description=data.get("description", ""), sort_order=data.get("sort_order", 0) ) db.session.add(tmpl) db.session.commit() return jsonify(tmpl.to_dict()), 201 @templates_bp.route("/templates/", methods=["PUT"]) @admin_required def update_template(template_id): """更新模板""" tmpl = Template.query.get_or_404(template_id) data = request.get_json() if "content" in data: tmpl.content = data["content"] if "description" in data: tmpl.description = data["description"] if "name" in data: tmpl.name = data["name"] if "sort_order" in data: tmpl.sort_order = data["sort_order"] db.session.commit() return jsonify(tmpl.to_dict()) @templates_bp.route("/templates/", methods=["DELETE"]) @admin_required def delete_template(template_id): """删除模板""" tmpl = Template.query.get_or_404(template_id) template_type = tmpl.type # 检查该类型模板总数,删除后必须至少剩1个 count = Template.query.filter_by(type=template_type).count() if count <= 1: return jsonify({"error": f"无法删除:{template_type}类型至少需要保留1个模板"}), 400 db.session.delete(tmpl) db.session.commit() return jsonify({"message": "删除成功"}) @templates_bp.route("/templates//render", methods=["POST"]) @admin_required def render_template_preview(template_type): """渲染模板(用于预览)- 使用该类型中 sort_order 最小的模板""" data = request.get_json() tmpl = Template.query.filter_by(type=template_type).order_by(Template.sort_order.asc()).first() if not tmpl: return jsonify({"error": "模板不存在"}), 404 content = tmpl.content # 替换变量 for key, value in data.items(): placeholder = "{" + key + "}" content = content.replace(placeholder, str(value)) return jsonify({"rendered": content})