Browse Source

角色管理接口

baoyubo 11 months ago
parent
commit
8a3c76fee2

+ 2 - 0
routers/prod_api/system/__init__.py

@@ -10,6 +10,7 @@ from . import menu
 from . import dic
 from . import dept
 from . import config
+from . import role
 
 import json
 
@@ -21,6 +22,7 @@ router.include_router(menu.router, prefix="/menu") #, dependencies=[Depends(vali
 
 router.include_router(dic.router, prefix="/dict")
 router.include_router(dept.router, prefix="/dept")
+router.include_router(role.router, prefix="/role")
 router.include_router(config.router, prefix="/config")
 
 

+ 55 - 0
routers/prod_api/system/menu/__init__.py

@@ -9,6 +9,7 @@ from sqlalchemy.orm import Session
 from typing import List
 from models import *
 from utils import *
+from utils.ry_system_util import *
 import json
 from sqlalchemy.sql import func
 from common.auth_user import *
@@ -50,6 +51,60 @@ class Router_frame(BaseModel):
     redirect: str = 'noRedirect'
     children: List[Child] = []
     alwaysShow: bool = True
+# checkedKeys roleMenuTreeselect
+
+@router.get('/roleMenuTreeselect/{roleId}')
+async def getmunutreeselect(request: Request,roleId:int,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
+    def build_dept_tree(menus, parent_dept):
+        menu_tree = []
+        for menu_info in menus:
+            menu = {
+                "id": menu_info.menu_id,
+                "label": menu_info.menu_name,
+                "parentId": menu_info.parent_id,
+                "weight": menu_info.order_num
+            }
+            # print(dept_info.dept_id)
+            children = parent_id_get_menu_info(db, menu_info.menu_id)
+            if len(children) > 0:
+                children_depts = build_dept_tree(children, menu)
+                menu["children"] = children_depts
+            menu_tree.append(menu)
+        return menu_tree
+
+    checkedKeys = role_id_get_role_menus(db,roleId)
+    menus = build_dept_tree(parent_id_get_menu_info(db, 0), None)
+    return {
+        "code": 200,
+        "msg": "操作成功",
+        "data": {"menus":menus,"checkedKeys":checkedKeys}
+    }
+
+@router.get('/treeselect')
+async def getmunutreeselect(request: Request,db: Session = Depends(get_db), user_id: int = Depends(valid_access_token)):
+    def build_dept_tree(menus, parent_dept):
+        menu_tree = []
+        for menu_info in menus:
+            menu = {
+                "id": menu_info.menu_id,
+                "label": menu_info.menu_name,
+                "parentId": menu_info.parent_id,
+                "weight": menu_info.order_num
+            }
+            # print(dept_info.dept_id)
+            children = parent_id_get_menu_info(db, menu_info.menu_id)
+            if len(children) > 0:
+                children_depts = build_dept_tree(children, menu)
+                menu["children"] = children_depts
+            menu_tree.append(menu)
+        return menu_tree
+
+    result = build_dept_tree(parent_id_get_menu_info(db, 0), None)
+    return {
+        "code": 200,
+        "msg": "操作成功",
+        "data": result
+    }
 
 @router.get('/getRouters')
 async def getRouters(request: Request, db: Session = Depends(get_db),

+ 191 - 0
routers/prod_api/system/role/__init__.py

@@ -0,0 +1,191 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+from fastapi import APIRouter, Request, Depends,Query,HTTPException
+from database import get_db
+from sqlalchemy.orm import Session
+from fastapi.responses import JSONResponse
+from models import *
+from utils import *
+from utils.ry_system_util import *
+from common.security import valid_access_token
+import traceback
+
+router = APIRouter()
+
+
+@router.post('')
+async def rolecreate(
+                    db: Session = Depends(get_db),
+                    user_id: int = Depends(valid_access_token),
+                    body = Depends(remove_xss_json)
+):
+    try:
+
+
+        role.role_key = body['roleKey']
+        role.role_name = body['roleName']
+        role.role_sort = body['roleSort']
+        role.status = body['status']
+        role.remark = body['remark']
+        menuCheckStrictly = body['menuCheckStrictly']
+        if menuCheckStrictly:
+            role.menu_check_strictly = 1
+        else:
+            role.menu_check_strictly = 0
+
+        menuIds = body['menuIds']
+
+
+        # 清除当前用户的所有角色关联
+        db.query(SysRoleMenu).filter(SysRoleMenu.role_id == roleId).delete()
+
+        # 创建新的用户角色关联
+        new_role_menus = [SysRoleMenu(role_id=roleId, menu_id=menu_id) for menu_id in menuIds]
+        db.add_all(new_role_menus)
+
+
+        db.commit()
+        return {"code": 200, "msg": "更新成功", "data": None}
+
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.put('')
+async def roleupdate(
+                    db: Session = Depends(get_db),
+                    user_id: int = Depends(valid_access_token),
+                    body = Depends(remove_xss_json)
+):
+    try:
+        roleId = body['roleId']
+
+        query = db.query(SysRole)
+        query = query.filter(SysRole.del_flag != '2')
+        query = query.filter(SysRole.role_id == roleId)
+        role = query.first()
+        if not role :
+            return JSONResponse(status_code=410, content={
+            'errcode': 410,
+            'errmsg': f'角色{roleId}不存在'
+        })
+
+        role.role_key = body['roleKey']
+        role.role_name = body['roleName']
+        role.role_sort = body['roleSort']
+        role.status = body['status']
+        role.remark = body['remark']
+        menuCheckStrictly = body['menuCheckStrictly']
+        if menuCheckStrictly:
+            role.menu_check_strictly = 1
+        else:
+            role.menu_check_strictly = 0
+
+        menuIds = body['menuIds']
+
+
+        # 清除当前用户的所有角色关联
+        db.query(SysRoleMenu).filter(SysRoleMenu.role_id == roleId).delete()
+
+        # 创建新的用户角色关联
+        new_role_menus = [SysRoleMenu(role_id=roleId, menu_id=menu_id) for menu_id in menuIds]
+        db.add_all(new_role_menus)
+
+
+        db.commit()
+        return {"code": 200, "msg": "更新成功", "data": None}
+
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+
+
+
+
+@router.get('/list')
+async def rolelist( roleName: int = Query(None ,description='角色名称'),
+                    roleKey: str = Query(None, description='权限字符'),
+                    status: int = Query(None, description='角色状态'),
+                    # beginTime: str = Depends(get_time_params),
+                    # endTime: str = Depends(get_time_params),
+                    page: int = Query(1, gt=0, description='页码'),
+                    pageSize: int = Query(10, gt=0, description='每页条目数量'),
+                    db: Session = Depends(get_db),
+                    user_id: int = Depends(valid_access_token)):
+    try:
+        # 构建查询
+        query = db.query(SysRole)
+        query = query.filter(SysRole.del_flag != '2')
+        # 应用查询条件
+
+        # if beginTime:
+        #     query = query.filter(SysUser.create_time >= beginTime)
+        # if endTime:
+        #     query = query.filter(SysUser.create_time <= endTime)
+        # if params:
+        #     query = query.filter(SysUser.create_time >= params.get("beginTime"))
+        #     query = query.filter(SysUser.create_time <= params.get("endTime"))
+        if roleName:
+            query =query.filter(SysRole.role_name.like(f'%{roleName}%'))
+        if status:
+            query =query.filter(SysRole.status==status)
+        if roleKey:
+            query =query.filter(SysRole.role_key.like(f'%{roleKey}%'))
+
+        # 计算总条目数
+        total_items = query.count()
+
+        # 排序
+        query = query.order_by(SysRole.create_time.desc())
+        # 执行分页查询
+        roles = query.offset((page - 1) * pageSize).limit(pageSize).all()
+
+        # 将查询结果转换为列表形式的字典
+        role_list = role_list_to_dict(roles,[])
+
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "rows": role_list,
+            "total": total_items,
+            "page": page,
+            "pageSize": pageSize,
+            "totalPages": (total_items + pageSize - 1) // pageSize
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")
+
+@router.get('/{roleId}')
+async def rolelist( roleId:int,
+                    db: Session = Depends(get_db),
+                    user_id: int = Depends(valid_access_token)):
+    try:
+        # 构建查询
+        query = db.query(SysRole)
+        query = query.filter(SysRole.del_flag != '2')
+        # 应用查询条件
+        query = query.filter(SysRole.role_id==roleId)
+
+        roles = query.all()
+
+        # 将查询结果转换为列表形式的字典
+        role_list = role_list_to_dict(roles,[])
+
+        # 返回结果
+        return {
+            "code": 200,
+            "msg": "成功",
+            "data": role_list[0]
+        }
+
+    except Exception as e:
+        traceback.print_exc()
+        raise HTTPException(status_code=500, detail=f"Internal server error: {str(e)}")

+ 15 - 1
utils/ry_system_util.py

@@ -71,4 +71,18 @@ def parent_id_get_dept_info(db,parent_id):
     query = db.query(SysDept)
     query = query.filter(SysDept.del_flag != '2')
     query = query.filter(SysDept.parent_id == parent_id)
-    return query.all()
+    return query.all()
+
+def parent_id_get_menu_info(db,parent_id):
+    query = db.query(SysMenu)
+    query = query.filter(SysMenu.del_flag != '2')
+    query = query.filter(SysMenu.visible != '1')
+    query = query.filter(SysMenu.parent_id == parent_id)
+    return query.all()
+
+def role_id_get_role_menus(db,role_id):
+    query = db.query(SysRoleMenu)
+    # query = query.filter(SysUserRole.del_flag != '2')
+    query = query.filter(SysRoleMenu.role_id == role_id)
+    resutl = query.all()
+    return [i.menu_id for i in resutl]