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