You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

228 lines
8.6 KiB

import json
import logging
from robyn import jsonify, Response
from app import app
from service.GraphStyleService import GraphStyleService
# 配置日志记录
logger = logging.getLogger(__name__)
# --- 核心工具函数:解决乱码 ---
def create_response(status_code, data_dict):
"""
统一响应格式封装,强制使用 UTF-8 防止中文乱码。
"""
return Response(
status_code=status_code,
description=json.dumps(data_dict, ensure_ascii=False),
headers={"Content-Type": "application/json; charset=utf-8"}
)
@app.post("/api/graph/style/save")
async def save_style_config(request):
"""
保存配置接口 - 增强校验版
支持:
1. 跨组精准移动 (id + target_group_id) - 优先级最高
2. 跨组名称移动 (id + group_name + is_auto_save: false)
3. 手动/自动保存 (id + is_auto_save: true/false)
4. 新建保存 (无 id)
"""
try:
# 1. 解析请求体
body = request.json()
# 提取参数
config_id = body.get('id')
canvas_name = body.get('canvas_name')
current_label = body.get('current_label')
styles = body.get('styles')
# 核心改动点:接收精准 ID
target_group_id = body.get('target_group_id')
group_name = body.get('group_name')
# 默认为 False,代表这是一次手动操作(可能是保存,也可能是移动)
is_auto_save = body.get('is_auto_save', False)
# 2. 基础参数校验
if not all([canvas_name, current_label, styles]):
return create_response(200, {"code": 400, "msg": "参数不完整:缺失标签名或样式数据"})
# --- 核心逻辑分流 ---
# 情况 A:更新记录 (前端传了 ID)
if config_id:
# 判断动作类型用于日志和反馈
# 只要传了 target_group_id 或提供了 group_name 且非自动保存,就视为移动
is_moving = (target_group_id is not None) or (group_name is not None and not is_auto_save)
action_label = "移动" if is_moving else "更新"
# 修改点:将 target_group_id 显式传递给 Service 层
success = GraphStyleService.update_config(
config_id=int(config_id),
canvas_name=canvas_name,
current_label=current_label,
styles_dict=styles,
group_name=group_name,
target_group_id=target_group_id, # 确保这一行存在!
is_auto_save=is_auto_save
)
if success:
return create_response(200, {"code": 200, "msg": f"{action_label}操作完成"})
else:
return create_response(200,
{"code": 500, "msg": f"{action_label}失败,请确认配置是否存在或内容是否有变化"})
# 情况 B:新增记录 (前端未传 ID)
else:
success = GraphStyleService.create_config(
canvas_name=canvas_name,
current_label=current_label,
styles_dict=styles,
group_name=group_name
)
if success:
return create_response(200, {"code": 200, "msg": "新配置已创建成功"})
else:
return create_response(200, {"code": 500, "msg": "新建配置失败,请重试"})
except Exception as e:
logger.error(f"Controller 异常: {str(e)}", exc_info=True)
return create_response(200, {"code": 500, "msg": f"服务器内部错误: {str(e)}"})
@app.get("/api/graph/style/list/grouped")
async def get_grouped_style_list(request):
"""获取【分组嵌套】格式的配置列表"""
try:
data = GraphStyleService.get_grouped_configs()
return create_response(200, {"code": 200, "data": data, "msg": "查询成功"})
except Exception as e:
logger.error(f"查询异常: {str(e)}")
return create_response(200, {"code": 500, "msg": f"查询异常: {str(e)}"})
@app.get("/api/graph/style/active")
async def get_active_style(request):
"""获取【分组嵌套】格式的配置列表(用于右侧折叠面板)"""
try:
# 调用 Service 的嵌套聚合方法,现在内部已包含 is_active/is_default 逻辑
data = GraphStyleService.get_active_configs()
return create_response(200, {"code": 200, "data": data, "msg": "查询成功"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"查询异常: {str(e)}"})
@app.post("/api/graph/style/group/apply")
async def apply_style_group(request):
"""应用全案:一键切换当前激活的样式组"""
try:
body = request.json()
group_id = body.get('group_id')
if not group_id:
return create_response(200, {"code": 400, "msg": "缺少分组ID"})
success = GraphStyleService.apply_group_all(group_id)
if success:
return create_response(200, {"code": 200, "msg": "方案已成功应用"})
else:
return create_response(200, {"code": 500, "msg": "应用全案失败,请检查方案是否存在"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"操作异常: {str(e)}"})
@app.post("/api/graph/style/group/set_default")
async def set_default_style_group(request):
"""设为系统初始默认方案"""
try:
body = request.json()
group_id = body.get('group_id')
if not group_id:
return create_response(200, {"code": 400, "msg": "缺少分组ID"})
success = GraphStyleService.set_default_group(group_id)
if success:
return create_response(200, {"code": 200, "msg": "已成功设为系统默认方案"})
else:
return create_response(200, {"code": 500, "msg": "设置默认方案失败"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"操作异常: {str(e)}"})
@app.get("/api/graph/style/groups")
async def get_group_names(request):
"""获取所有已存在的方案组列表(用于下拉选择)"""
try:
data = GraphStyleService.get_group_list()
return create_response(200, {"code": 200, "data": data, "msg": "查询成功"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"查询异常: {str(e)}"})
@app.post("/api/graph/style/delete")
async def delete_style_config(request):
"""删除单条配置记录"""
try:
body = request.json()
config_id = body.get('id')
if not config_id:
return create_response(200, {"code": 400, "msg": "缺少ID"})
success = GraphStyleService.delete_config(config_id)
if success:
return create_response(200, {"code": 200, "msg": "删除成功"})
else:
return create_response(200, {"code": 404, "msg": "删除失败,配置可能已被删除"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"操作异常: {str(e)}"})
@app.post("/api/graph/style/group/delete")
async def delete_style_group(request):
"""级联删除整个方案组及其下属所有配置"""
try:
body = request.json()
group_id = body.get('group_id')
if not group_id:
return create_response(200, {"code": 400, "msg": "缺少分组ID"})
success = GraphStyleService.delete_group(group_id)
if success:
return create_response(200, {"code": 200, "msg": "方案组及关联配置已彻底删除"})
else:
return create_response(200, {"code": 500, "msg": "方案组删除失败"})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"操作异常: {str(e)}"})
@app.post("/api/graph/style/batch_delete")
async def batch_delete_style(request):
"""批量删除配置接口"""
try:
body = request.json()
config_ids = body.get('ids')
# 容错:处理前端可能以 JSON 字符串形式发送的列表
if isinstance(config_ids, str):
try:
config_ids = json.loads(config_ids)
except:
pass
if not config_ids or not isinstance(config_ids, list):
return create_response(200, {"code": 400, "msg": "参数格式错误,请提供ID列表"})
count = GraphStyleService.batch_delete_configs(config_ids)
return create_response(200, {
"code": 200,
"msg": f"成功删除 {count} 条配置数据",
"count": count
})
except Exception as e:
return create_response(200, {"code": 500, "msg": f"批量删除异常: {str(e)}"})