完善权限系统
This commit is contained in:
+32
-18
@@ -1,33 +1,33 @@
|
||||
from models.ChatRequest import ChatRequest
|
||||
from models.ChatWithReportRequest import ChatWithReportRequest
|
||||
from models.BaseResponse import BaseResponse
|
||||
# import db.postgres as pg
|
||||
import uuid
|
||||
import db.postgres as pg
|
||||
import db.sqlserver as sqlserver
|
||||
import uuid
|
||||
import threading
|
||||
from fastapi import APIRouter, Depends
|
||||
from uuid import UUID
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
import db.postgres as pg
|
||||
from config.security import get_user_id_from_token
|
||||
from models.BaseResponse import BaseResponse
|
||||
from models.ChatRequest import ChatRequest
|
||||
|
||||
chatRouter = APIRouter()
|
||||
from agent.dataAgent import get_graph_output
|
||||
from llm.chatLLM import get_chat_response
|
||||
from llm.titleChain import get_title
|
||||
from llm.sqlLLM import get_sql_description_response,get_chat_sql_response,get_chat_sql_improve_response
|
||||
from models.SaveReportRequest import SaveReportRequest
|
||||
from models.AIProfilesRequest import AIProfilesRequest
|
||||
import json
|
||||
|
||||
|
||||
# 对话历史记录
|
||||
@chatRouter.get("/history")
|
||||
def getHistory(sessionId: str):
|
||||
return BaseResponse(data=pg.get_history(sessionId))
|
||||
|
||||
|
||||
# 对话列表
|
||||
@chatRouter.get("/sessionsForBot")
|
||||
def getSessions(user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
return BaseResponse(data=pg.get_sessions(user_id,'bot'))
|
||||
return BaseResponse(data=pg.get_sessions(user_id, "bot"))
|
||||
|
||||
|
||||
@chatRouter.post("/chatForBot")
|
||||
def chat(req: ChatRequest, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
@@ -40,7 +40,7 @@ def chat(req: ChatRequest, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not req.sessionId:
|
||||
is_new_session = True
|
||||
req.sessionId = str(uuid.uuid4())
|
||||
pg.insert_session(user_id,req.aiId, req.sessionId, session_name,"bot")
|
||||
pg.insert_session(user_id, req.aiId, req.sessionId, session_name, "bot")
|
||||
else:
|
||||
is_new_session = False
|
||||
pg.update_session_updated_at(req.sessionId)
|
||||
@@ -51,11 +51,25 @@ def chat(req: ChatRequest, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
# 调用 LLM
|
||||
if req.aiId == "9d157dd1-921b-c768-5b90-3e903b50f6f9":
|
||||
# 数据专家AI
|
||||
answer = get_graph_output(aiRole=pg.get_ai_personality(req.aiId),history=pg.get_history(req.sessionId), userInput= req.userInput)
|
||||
answer = get_graph_output(
|
||||
aiRole=pg.get_ai_personality(req.aiId),
|
||||
history=pg.get_history(req.sessionId),
|
||||
userInput=req.userInput,
|
||||
)
|
||||
else:
|
||||
answer = get_chat_response(aiRole=pg.get_ai_personality(req.aiId),history=pg.get_history(req.sessionId), userInput= req.userInput).content
|
||||
answer = get_chat_response(
|
||||
aiRole=pg.get_ai_personality(req.aiId),
|
||||
history=pg.get_history(req.sessionId),
|
||||
userInput=req.userInput,
|
||||
).content
|
||||
# 插入 AI 回复
|
||||
pg.insert_message(req.sessionId, True, answer)
|
||||
|
||||
return BaseResponse(data={"session_name":session_name,"isNewSession":is_new_session,"content":answer,"sessionId": req.sessionId})
|
||||
|
||||
return BaseResponse(
|
||||
data={
|
||||
"session_name": session_name,
|
||||
"isNewSession": is_new_session,
|
||||
"content": answer,
|
||||
"sessionId": req.sessionId,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -0,0 +1,377 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from config.security import get_user_id_from_token
|
||||
from db.postgres.system import *
|
||||
from models.BaseResponse import BaseResponse
|
||||
from utils.MyUtils import build_dept_tree, format_datetime, build_menu_tree
|
||||
|
||||
systemRouter = APIRouter()
|
||||
|
||||
|
||||
@systemRouter.get("/dept/list")
|
||||
async def dept_list(user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
depts = get_all_depts()
|
||||
|
||||
# 字段映射(关键)
|
||||
for d in depts:
|
||||
# 映射字段
|
||||
d["pid"] = d.pop("parent_id") or 0 # !!!null → 0
|
||||
d["remark"] = d.pop("comment")
|
||||
d["createTime"] = format_datetime(d.pop("created_at"))
|
||||
|
||||
# 前端示例格式要求有 status 字段
|
||||
d["status"] = 1
|
||||
|
||||
# children 初始化
|
||||
d["children"] = []
|
||||
|
||||
# 构建树
|
||||
tree = build_dept_tree(depts)
|
||||
|
||||
return BaseResponse(data=tree)
|
||||
|
||||
|
||||
@systemRouter.post("/dept/add")
|
||||
async def dept_add(data: dict, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
parent_id = data.get("pid")
|
||||
name = data.get("name")
|
||||
comment = data.get("comment")
|
||||
|
||||
if not name:
|
||||
return BaseResponse(status=False, message="部门名不能为空", data=None)
|
||||
|
||||
new_id = insert_dept(parent_id, name, comment)
|
||||
|
||||
return BaseResponse(data={"id": new_id})
|
||||
|
||||
|
||||
@systemRouter.put("/dept/{id}")
|
||||
async def dept_update(
|
||||
id: str, data: dict, user_id: UUID = Depends(get_user_id_from_token)
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
parent_id = data.get("pid")
|
||||
name = data.get("name")
|
||||
comment = data.get("comment")
|
||||
|
||||
rowcount = update_dept(id, parent_id, name, comment)
|
||||
if rowcount == 0:
|
||||
return BaseResponse(status=False, message="部门不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.delete("/dept/{id}")
|
||||
async def dept_dept(id: str, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
if has_child_dept(id):
|
||||
return BaseResponse(status=False, message="禁止删除:请先删除子部门", data=None)
|
||||
|
||||
deleted = delete_dept(id)
|
||||
if deleted == 0:
|
||||
return BaseResponse(status=False, message="部门不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
from fastapi import Depends
|
||||
from uuid import UUID
|
||||
|
||||
|
||||
@systemRouter.get("/menu/list/{plat_id}")
|
||||
async def menu_list(plat_id: int, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
# 1. 根据用户ID获取角色ID列表
|
||||
role_ids = get_role_ids_by_user(user_id)
|
||||
if not role_ids:
|
||||
BaseResponse(data=[]) # 用户没有角色,则返回空列表
|
||||
|
||||
# 2. 根据角色ID获取菜单ID列表
|
||||
menu_ids = get_menu_ids_by_roles(role_ids)
|
||||
if not menu_ids:
|
||||
BaseResponse(data=[]) # 角色没有菜单权限,则返回空列表
|
||||
|
||||
# 3. 查询菜单信息
|
||||
menus = get_menus_by_ids(menu_ids, plat_id)
|
||||
|
||||
# 4. 字段映射,兼容前端
|
||||
for m in menus:
|
||||
m["pid"] = m.get("pid") or "0"
|
||||
m["meta"] = m.get("meta") or {}
|
||||
m["createTime"] = format_datetime(m.get("created_at"))
|
||||
m["updateTime"] = format_datetime(m.get("updated_at"))
|
||||
m["children"] = []
|
||||
|
||||
# 5. 构建菜单树
|
||||
tree = build_menu_tree(menus)
|
||||
return BaseResponse(data=tree)
|
||||
|
||||
|
||||
@systemRouter.get("/menu/list/all/{plat_id}")
|
||||
async def menu_list_all(plat_id: int, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
if plat_id == -1:
|
||||
menus = get_all_menus()
|
||||
else:
|
||||
menus = get_menus(plat_id)
|
||||
|
||||
# 字段映射
|
||||
for m in menus:
|
||||
m["pid"] = m.pop("pid") or "0"
|
||||
m["meta"] = m["meta"] or {}
|
||||
m["createTime"] = format_datetime(m.pop("created_at"))
|
||||
m["updateTime"] = format_datetime(m.pop("updated_at"))
|
||||
m["children"] = []
|
||||
|
||||
# 构建树,与 build_dept_tree 同逻辑
|
||||
tree = build_menu_tree(menus)
|
||||
|
||||
return BaseResponse(data=tree)
|
||||
|
||||
|
||||
@systemRouter.get("/menu/name-exists/{plat_id}")
|
||||
async def menu_name_exists(
|
||||
plat_id: int,
|
||||
name: str,
|
||||
id: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
exists = db_menu_name_exists(name, id, plat_id)
|
||||
return BaseResponse(data=exists)
|
||||
|
||||
|
||||
@systemRouter.get("/menu/path-exists/{plat_id}")
|
||||
async def menu_path_exists(
|
||||
plat_id: int,
|
||||
path: str,
|
||||
id: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
exists = db_menu_path_exists(path, id, plat_id)
|
||||
return BaseResponse(data=exists)
|
||||
|
||||
|
||||
@systemRouter.post("/menu/{plat_id}")
|
||||
async def create_menu(
|
||||
plat_id: int, data: dict, user_id: UUID = Depends(get_user_id_from_token)
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
new_id = insert_menu(data, plat_id)
|
||||
return BaseResponse(data={"id": new_id})
|
||||
|
||||
|
||||
@systemRouter.put("/menu/{id}")
|
||||
async def update_menu(
|
||||
id: str,
|
||||
data: dict,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
count = update_menu_db(id, data)
|
||||
if count == 0:
|
||||
return BaseResponse(status=False, message="菜单不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.delete("/menu/{id}")
|
||||
async def delete_menu(
|
||||
id: str,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
if menu_has_children(id):
|
||||
return BaseResponse(status=False, message="禁止删除:请先删除子菜单", data=None)
|
||||
|
||||
deleted = delete_menu_db(id)
|
||||
if deleted == 0:
|
||||
return BaseResponse(status=False, message="菜单不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.get("/role/name-exists")
|
||||
async def role_name_exists(
|
||||
name: str,
|
||||
id: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
exists = db_role_name_exists(name, id)
|
||||
return BaseResponse(data=exists)
|
||||
|
||||
|
||||
@systemRouter.get("/role/all")
|
||||
async def get_role_list(user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
roles = get_role_list_db()
|
||||
return BaseResponse(data=roles)
|
||||
|
||||
|
||||
@systemRouter.get("/role/list")
|
||||
async def get_role_list(
|
||||
page: int = 1,
|
||||
pageSize: int = 10,
|
||||
id: str | None = None,
|
||||
name: str | None = None,
|
||||
remark: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
roles, total = get_role_list_db_page(page, pageSize, id, name, remark)
|
||||
|
||||
return BaseResponse(data={"list": roles, "total": total})
|
||||
|
||||
|
||||
@systemRouter.post("/role")
|
||||
async def create_role(data: dict, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
new_id = insert_role(data)
|
||||
return BaseResponse(data={"id": new_id})
|
||||
|
||||
|
||||
@systemRouter.put("/role/{id}")
|
||||
async def update_role(
|
||||
id: str,
|
||||
data: dict,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
count = update_role_db(id, data)
|
||||
if count == 0:
|
||||
return BaseResponse(status=False, message="角色不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.delete("/role/{id}")
|
||||
async def delete_role(
|
||||
id: str,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
deleted = delete_role_db(id)
|
||||
if deleted == 0:
|
||||
return BaseResponse(status=False, message="角色不存在", data=None)
|
||||
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.get("/user/name-exists")
|
||||
async def user_name_exists(
|
||||
username: str,
|
||||
id: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
exists = db_user_name_exists(username, id)
|
||||
return BaseResponse(data=exists)
|
||||
|
||||
|
||||
@systemRouter.get("/user/list")
|
||||
async def get_user_list(
|
||||
page: int = 1,
|
||||
pageSize: int = 10,
|
||||
id: str | None = None,
|
||||
name: str | None = None,
|
||||
status: int | None = None,
|
||||
dept_id: str | None = None,
|
||||
startTime: str | None = None,
|
||||
endTime: str | None = None,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
users, total = get_user_list_db_page(
|
||||
page, pageSize, id, name, status, dept_id, startTime, endTime
|
||||
)
|
||||
|
||||
return BaseResponse(data={"list": users, "total": total})
|
||||
|
||||
|
||||
@systemRouter.post("/user")
|
||||
async def create_user(data: dict, user_id: UUID = Depends(get_user_id_from_token)):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
new_id = insert_user(data)
|
||||
return BaseResponse(data={"id": new_id})
|
||||
|
||||
|
||||
@systemRouter.put("/user/{id}")
|
||||
async def update_user(
|
||||
id: str,
|
||||
data: dict,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
count = update_user_db(id, data)
|
||||
if count == 0:
|
||||
return BaseResponse(status=False, message="用户不存在", data=None)
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.patch("/user/{id}")
|
||||
async def patch_user(
|
||||
id: str,
|
||||
data: dict,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
count = patch_user_db(id, data)
|
||||
if count == 0:
|
||||
return BaseResponse(status=False, message="用户不存在", data=None)
|
||||
return BaseResponse(data=True)
|
||||
|
||||
|
||||
@systemRouter.delete("/user/{id}")
|
||||
async def delete_user(
|
||||
id: str,
|
||||
user_id: UUID = Depends(get_user_id_from_token),
|
||||
):
|
||||
if not user_id:
|
||||
return {"error": "userId is required"}
|
||||
|
||||
deleted = delete_user_db(id)
|
||||
if deleted == 0:
|
||||
return BaseResponse(status=False, message="用户不存在", data=None)
|
||||
return BaseResponse(data=True)
|
||||
Reference in New Issue
Block a user