378 lines
10 KiB
Python
378 lines
10 KiB
Python
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)
|