From 7a9f9cb3c34ebc0836720d0f5738bbe70070bbb3 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期四, 05 十二月 2024 14:22:24 +0800 Subject: [PATCH] 增加菜单和路由控制 --- app/models/role_model.py | 15 +++++ app/models/organization_model.py | 7 ++ app/models/user_model.py | 3 + app/models/resource_model.py | 29 +++++++++ app/service/user.py | 85 +++++++++++++++++++++++++-- app/api/user.py | 18 +++++ app/api/auth.py | 1 app/service/auth.py | 4 8 files changed, 149 insertions(+), 13 deletions(-) diff --git a/app/api/auth.py b/app/api/auth.py index aa56f3a..dae561b 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -98,6 +98,7 @@ return Response(code=400, msg="token not found") return Response(code=200, msg="success", data={ "ragflow_token": token.ragflow_token, + "bisheng_token": token.bisheng_token, }) diff --git a/app/api/user.py b/app/api/user.py index e9d34b3..90a23cd 100644 --- a/app/api/user.py +++ b/app/api/user.py @@ -5,7 +5,7 @@ from app.models.user import PageParameter, UserStatus, UserInfo, LoginData from app.models.user_model import UserModel from app.service.user import get_user_list, edit_user_status, delete_user_data, create_user, edit_user_data, \ - edit_user_pwd + edit_user_pwd, get_user_info, get_user_routers user_router = APIRouter() @@ -80,3 +80,19 @@ if not is_edit: return Response(code=500, msg="user pwd reset failure", data={}) return Response(code=200, msg="user pwd reset successfully", data={}) + + +@user_router.get("/user_info", response_model=Response) +async def user_info(current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): + user_info = await get_user_info(db, current_user.id) + if not user_info: + return Response(code=500, msg="user get failure", data={}) + return Response(code=200, msg="successfully", data=user_info) + + +@user_router.get("/user_routers", response_model=Response) +async def user_routers(current_user: UserModel = Depends(get_current_user),db=Depends(get_db)): + routers = await get_user_routers(db, current_user.id) + if not routers: + return Response(code=500, msg="user get failure", data={}) + return Response(code=200, msg="successfully", data=routers) \ No newline at end of file diff --git a/app/models/organization_model.py b/app/models/organization_model.py index f0c2f55..950ba32 100644 --- a/app/models/organization_model.py +++ b/app/models/organization_model.py @@ -92,6 +92,13 @@ 'children': [org.to_tree_select_json() for org in self.children] } + def to_parent_select_json(self): + return { + 'id': self.id, + 'label': self.name, + 'parent': [org.to_parent_select_json() for org in self.parent] + } + def get_pid(self): if self.parent: return self.parent.id diff --git a/app/models/resource_model.py b/app/models/resource_model.py index 405570e..e898e3a 100644 --- a/app/models/resource_model.py +++ b/app/models/resource_model.py @@ -87,6 +87,31 @@ return router + + def to_router_dict(self): + router = { + 'id': self.id, + 'name': self.path.capitalize() if self.path else '', + 'path': self.path, + 'hidden': bool(self.hidden), + 'redirect': 'noRedirect', + 'component': self.url, + 'alwaysShow': True, + 'resourceType': self.get_type_json(), + 'meta': { + 'title': self.name, + 'icon': self.icon, + 'noCache': False, + 'link': '' + }, + 'parentId': self.get_pid(), + } + + if not router['component']: + router['component'] = 'Layout' + return router + + def to_menu_json(self): return { 'id': self.id, @@ -133,8 +158,8 @@ def to_json(self): return { 'id': self.id, - 'createdatetime': self.created_at, - 'updatedatetime': self.updated_at, + # 'createdatetime': self.created_at, + # 'updatedatetime': self.updated_at, 'name': self.name, 'description': self.description } diff --git a/app/models/role_model.py b/app/models/role_model.py index 666eaf2..520bd86 100644 --- a/app/models/role_model.py +++ b/app/models/role_model.py @@ -66,6 +66,21 @@ return json + def to_dict(self): + json = { + 'roleId': self.id, + 'createTime': self.created_at.strftime('%Y-%m-%d %H:%M:%S'), + 'updateTime': self.updated_at.strftime('%Y-%m-%d %H:%M:%S'), + 'roleName': self.name, + 'remark': self.description, + 'iconCls': self.iconCls, + 'roleSort': self.seq, + 'status': self.status, + 'roleKey': self.roleKey, + 'dataScope': self.dataScope + } + return json + class RoleData(BaseModel): remark: Optional[str] = "" roleName: str diff --git a/app/models/user_model.py b/app/models/user_model.py index e51ae00..77d8a4b 100644 --- a/app/models/user_model.py +++ b/app/models/user_model.py @@ -81,6 +81,9 @@ 'userName': self.username, 'loginName': self.login_name if self.login_name else "", 'status': self.status, + 'email': self.email, + 'phone': self.phone, + 'permission':self.permission } def to_json(self): diff --git a/app/service/auth.py b/app/service/auth.py index 566ebd2..896b8d9 100644 --- a/app/service/auth.py +++ b/app/service/auth.py @@ -25,8 +25,8 @@ user = db.query(UserModel).filter(UserModel.username == username).first() if not user: return False - # if not verify_password(password, user.hashed_password): - # return False + if not verify_password(password, user.hashed_password): + return False return user diff --git a/app/service/user.py b/app/service/user.py index cd7a053..9ceb047 100644 --- a/app/service/user.py +++ b/app/service/user.py @@ -2,7 +2,7 @@ from app.api import pwd_context from app.config.config import settings -from app.models import RoleModel, GroupModel, AgentType +from app.models import RoleModel, GroupModel, AgentType, role_resource_table from app.models.user_model import UserModel from Log import logger from app.service.bisheng import BishengService @@ -127,10 +127,79 @@ return True -async def get_user_info(db, page_size: int, page_index: int, keyword: str): - query = db.query(UserModel) - if keyword: - query = query.filter(UserModel.group_name.like('%{}%'.format(keyword))) - users = query.order_by(UserModel.id.desc()).limit(page_size).offset( - (page_index - 1) * page_size).all() - return {"total": query.count(), "rows": [user.to_json() for user in users]} \ No newline at end of file +async def get_user_info(db, user_id): + permissions = set() + roles = [] + dept = [] + role_set = set() + dept_set = set() + user = db.query(UserModel).filter_by(id=user_id).first() + await role_resource(role_set, roles, permissions, user.roles) + for ogt in user.organizations: + dept.append(ogt.to_json()) + if ogt.roles: + await role_resource(role_set, roles, permissions, user.roles) + parent_ogt = ogt.parent + while parent_ogt: + if parent_ogt.id not in dept_set: + await role_resource(role_set, roles, permissions, parent_ogt.roles) + dept_set.add(parent_ogt.id) + parent_ogt = parent_ogt.parent + if user.permission == "admin": + permissions = ["*:*:*"] + + return {"permissions": list(permissions), "dept": dept , "roles": roles, "user": user.to_dict()} + + +async def role_resource(role_set, role_list, permissions, roles): + for role in roles: + if role.id not in role_set: + role_set.add(role.id) + role_list.append(role.to_dict()) + for r in role.resources: + if r.resource_type_id == "1": + permissions.add(r.perms) + + +async def get_user_routers(db, user_id): + permissions = {} + role_set = set() + dept_set = set() + user = db.query(UserModel).filter_by(id=user_id).first() + parent_id = "" + async def role_resource(role_set, permissions, roles): + nonlocal parent_id + for role in roles: + if role.id not in role_set: + role_set.add(role.id) + + for r in role.resources: + if r.resource_type_id != "1": + if not r.resource_id: + parent_id = r.id + continue + permissions[r.id] = r.to_router_dict() + + await role_resource(role_set, permissions, user.roles) + for ogt in user.organizations: + if ogt.roles: + await role_resource(role_set, permissions, user.roles) + parent_ogt = ogt.parent + while parent_ogt: + if parent_ogt.id not in dept_set: + await role_resource(role_set, permissions, parent_ogt.roles) + dept_set.add(parent_ogt.id) + parent_ogt = parent_ogt.parent + tmp_dit = {} + for permission in permissions.values(): + tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) +[permission] + def get_child(parent_id): + res = permissions[parent_id] + res["children"] = [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])] + return res + + print(parent_id) + print(tmp_dit) + return {"routers": [get_child(i["id"]) for i in tmp_dit.get(parent_id, [])]} + + -- Gitblit v1.8.0