From 7a9f9cb3c34ebc0836720d0f5738bbe70070bbb3 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期四, 05 十二月 2024 14:22:24 +0800
Subject: [PATCH] 增加菜单和路由控制

---
 app/service/user.py |   89 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 79 insertions(+), 10 deletions(-)

diff --git a/app/service/user.py b/app/service/user.py
index f5cc7ea..9ceb047 100644
--- a/app/service/user.py
+++ b/app/service/user.py
@@ -2,11 +2,11 @@
 
 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
-from app.service.common.app_register import AppRegister
+from app.service.common.app_register import AppRegisterDao
 from app.service.ragflow import RagflowService
 from app.service.service_token import get_ragflow_token, get_bisheng_token, get_ragflow_new_token
 
@@ -104,7 +104,7 @@
     try:
         user = db.query(UserModel).filter(UserModel.id == user_id).first()
         pwd = user.decrypted_password()
-        for app_type in AppRegister(db).get_app():
+        for app_type in AppRegisterDao(db).get_app():
             if app_type == AgentType.RAGFLOW:
                 token = await get_ragflow_new_token(db, user_id, app_type)
                 ragflow_service = RagflowService(settings.fwr_base_url)
@@ -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