Files
AILab/bbit_ai/app/routers/System.py
T
2025-12-23 09:55:06 +08:00

477 lines
13 KiB
Python

from fastapi import APIRouter, Depends, Query
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("remark")
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,
user_id: UUID = Depends(get_user_id_from_token),
):
if not user_id:
return {"error": "userId is required"}
exists = db_user_name_exists(username)
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.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)
@systemRouter.get("/dict/list")
def getScVideoList(
user_id: UUID = Depends(get_user_id_from_token),
name: str = "",
page: int = Query(1, ge=1),
page_size: int = Query(10, ge=1, le=100),
):
if not user_id:
return {"error": "userId is required"}
total, items = get_dict_list(name, page=page, page_size=page_size)
return BaseResponse(
data={
"total": total,
"items": items,
}
)
@systemRouter.post("/dict")
def create_dict_api(data: dict, user_id: UUID = Depends(get_user_id_from_token)):
"""
创建字典接口
data = { "key": str, "name": str, "remark": str }
"""
if not user_id:
return {"error": "userId is required"}
new_id = db_create_dict(data.get("key"), data.get("name"), data.get("remark"))
return BaseResponse(data={"id": new_id})
@systemRouter.put("/dict/{id}")
def update_dict_api(
id: str, data: dict, user_id: UUID = Depends(get_user_id_from_token)
):
"""
更新字典接口
"""
if not user_id:
return {"error": "userId is required"}
db_update_dict(id, data.get("key"), data.get("name"), data.get("remark"))
return BaseResponse(data={"id": id})
@systemRouter.delete("/dict/{id}")
def delete_dict_api(id: str, user_id: UUID = Depends(get_user_id_from_token)):
"""
删除字典接口
"""
if not user_id:
return {"error": "userId is required"}
db_delete_dict(id)
return BaseResponse(data={"id": id})
@systemRouter.get("/dict/detail/list")
def get_dict_detail_api(dictId: str, user_id: UUID = Depends(get_user_id_from_token)):
if not user_id:
return {"error": "userId is required"}
items = db_get_dict_detail(dictId)
return BaseResponse(data={"list": items})
@systemRouter.post("/dict/detail")
def create_dict_detail_api(data: dict, user_id: UUID = Depends(get_user_id_from_token)):
if not user_id:
return {"error": "userId is required"}
new_id = db_create_dict_detail(
value=data.get("value"),
dict_id=data.get("dict_id"),
sort=data.get("sort", 0),
pid=data.get("pid"),
remark=data.get("remark"),
)
return BaseResponse(data={"id": new_id})
@systemRouter.put("/dict/detail/{id}")
def update_dict_detail_api(
id: str, data: dict, user_id: UUID = Depends(get_user_id_from_token)
):
if not user_id:
return {"error": "userId is required"}
db_update_dict_detail(
id=id,
value=data.get("value"),
sort=data.get("sort"),
pid=data.get("pid"),
remark=data.get("remark"),
)
return BaseResponse(data={"id": id})
@systemRouter.delete("/dict/detail/{id}")
def delete_dict_detail_api(id: str, user_id: UUID = Depends(get_user_id_from_token)):
if not user_id:
return {"error": "userId is required"}
db_delete_dict_detail(id)
return BaseResponse(data={"id": id})
@systemRouter.get("/dict/getValue")
def get_dict_detail_by_key(
key: str = Query(..., min_length=1),
):
if not key:
return {"error": "key is required"}
items = get_dict_detail_list_by_key(key)
return BaseResponse(data=items)