115 lines
3.5 KiB
Python
115 lines
3.5 KiB
Python
# 模板管理路由
|
|
|
|
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/<int:template_id>", 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/<int:template_id>", 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/<int:template_id>", 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/<string:template_type>/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})
|