完善权限系统

This commit is contained in:
BBIT-Kai
2025-12-08 18:11:48 +08:00
parent c53926afd6
commit dbdc222541
1503 changed files with 132197 additions and 885 deletions
+32 -18
View File
@@ -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,
}
)
+377
View File
@@ -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)