From 2669d0e0a93e06983dade724146bd0e1b6da6ba7 Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期二, 12 十一月 2024 18:42:05 +0800
Subject: [PATCH] 增加接口

---
 app/api/role.py                  |   18 
 app/models/agent_model.py        |   19 
 app/models/organization_model.py |   59 +++-
 .gitignore                       |    1 
 app/models/resource_model.py     |   19 +
 app/service/organization.py      |   89 ++++++
 app/Log/log.log                  |   53 ++++
 app/service/ragflow.py           |    2 
 app/service/user.py              |  111 ++++++++
 app/api/group.py                 |    2 
 app/api/user.py                  |   69 +++++
 app/service/resource.py          |   29 ++
 app/api/auth.py                  |    1 
 app/models/user.py               |   19 +
 app/api/resource.py              |   37 ++
 app/models/role_model.py         |    4 
 app/models/user_model.py         |   29 +-
 app/api/organization.py          |   68 +++++
 app/models/knowledge_model.py    |   32 -
 app/Log/__init__.py              |    4 
 main.py                          |    6 
 app/models/group_model.py        |   20 
 app/models/dialog_model.py       |   32 -
 23 files changed, 604 insertions(+), 119 deletions(-)

diff --git a/.gitignore b/.gitignore
index cba8701..52d2d3f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@
 .vscode
 .ipynb_checkpoints
 .pytest
+*.log
diff --git a/app/Log/__init__.py b/app/Log/__init__.py
index ebc086b..2a2c7cb 100644
--- a/app/Log/__init__.py
+++ b/app/Log/__init__.py
@@ -5,9 +5,9 @@
     logger = logging.getLogger()
     logger.setLevel(logging.INFO)
     # ch = logging.StreamHandler()
-    fh = logging.handlers.RotatingFileHandler("app/Log/log.log",mode="a",maxBytes = 100*1024, backupCount = 10)
+    fh = logging.handlers.RotatingFileHandler("app/Log/log.log",mode="a",maxBytes = 100*1024, backupCount = 10, encoding='utf-8')
     formatter = logging.Formatter(
-        "%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s - %(message)s"
+        "%(asctime)s - %(module)s - %(funcName)s - line:%(lineno)d - %(levelname)s -: %(message)s"
     )
     fh.setFormatter(formatter)
     logger.addHandler(fh)  # 灏嗘棩蹇楄緭鍑鸿嚦鏂囦欢
diff --git a/app/Log/log.log b/app/Log/log.log
index 09ff359..a12c025 100644
--- a/app/Log/log.log
+++ b/app/Log/log.log
@@ -1 +1,54 @@
 2024-11-11 16:33:10,255 - user - get_user_list - line:5 - ERROR - ffffffff
+2024-11-12 09:39:26,980 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 09:39:27,541 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 201 Created"
+2024-11-12 09:39:27,544 - user - create_user - line:61 - ERROR -: Failed to register with Ragflow: RagflowService.register() takes 3 positional arguments but 4 were given
+2024-11-12 09:40:40,106 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 09:40:40,236 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 200 OK"
+2024-11-12 09:40:40,237 - user - create_user - line:54 - ERROR -: Failed to register with Bisheng: Failed to fetch data from Bisheng API: {"status_code":500,"status_message":"??????????"}
+2024-11-12 09:42:02,264 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 09:42:02,660 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 201 Created"
+2024-11-12 09:42:04,209 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/register "HTTP/1.1 200 OK"
+2024-11-12 11:45:21,621 - organization - create_dept - line:30 - ERROR -: 'orderNum' is an invalid keyword argument for OrganizationModel
+2024-11-12 11:47:09,151 - organization - create_dept - line:30 - ERROR -: 'OrganizationModel' object has no attribute 'NAME'
+2024-11-12 11:57:15,151 - organization - create_dept - line:30 - ERROR -: Can't flush None value found in collection OrganizationModel.groups
+2024-11-12 15:59:58,270 - organization - delete_organization_info - line:87 - ERROR -: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`rag_basic`.`organization_group`, CONSTRAINT `organization_group_ibfk_2` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`id`))')
+[SQL: DELETE FROM organization WHERE organization.id = %(id_1)s]
+[parameters: {'id_1': 'e12a1067-cda5-4045-8479-a02c89ab9147'}]
+(Background on this error at: https://sqlalche.me/e/20/gkpj)
+2024-11-12 16:02:08,772 - organization - delete_organization_info - line:87 - ERROR -: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`rag_basic`.`organization_role`, CONSTRAINT `organization_role_ibfk_2` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`id`))')
+[SQL: DELETE FROM organization WHERE organization.id = %(id_1)s]
+[parameters: {'id_1': 'e12a1067-cda5-4045-8479-a02c89ab9147'}]
+(Background on this error at: https://sqlalche.me/e/20/gkpj)
+2024-11-12 16:05:07,805 - organization - delete_organization_info - line:87 - ERROR -: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`rag_basic`.`organization_role`, CONSTRAINT `organization_role_ibfk_2` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`id`))')
+[SQL: DELETE FROM organization WHERE organization.id = %(id_1)s]
+[parameters: {'id_1': 'e12a1067-cda5-4045-8479-a02c89ab9147'}]
+(Background on this error at: https://sqlalche.me/e/20/gkpj)
+2024-11-12 16:17:25,385 - organization - delete_organization_info - line:87 - ERROR -: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`rag_basic`.`organization_role`, CONSTRAINT `organization_role_ibfk_2` FOREIGN KEY (`organization_id`) REFERENCES `organization` (`id`))')
+[SQL: DELETE FROM organization WHERE organization.id = %(id_1)s]
+[parameters: {'id_1': 'e12a1067-cda5-4045-8479-a02c89ab9147'}]
+(Background on this error at: https://sqlalche.me/e/20/gkpj)
+2024-11-12 18:04:30,742 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:04:31,217 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:04:31,679 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/login "HTTP/1.1 200 OK"
+2024-11-12 18:05:55,757 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:05:56,206 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:05:56,684 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/login "HTTP/1.1 200 OK"
+2024-11-12 18:09:19,985 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:09:20,395 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 201 Created"
+2024-11-12 18:09:22,252 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/register "HTTP/1.1 200 OK"
+2024-11-12 18:13:37,826 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:13:38,274 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:13:38,830 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/login "HTTP/1.1 200 OK"
+2024-11-12 18:14:27,990 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:14:28,054 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:15:48,707 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:15:48,785 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:16:33,452 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:16:33,520 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 200 OK"
+2024-11-12 18:16:33,521 - user - create_user - line:54 - ERROR -: Failed to register with Bisheng: Failed to fetch data from Bisheng API: {"status_code":500,"status_message":"??????????"}
+2024-11-12 18:19:41,638 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:19:42,088 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/regist "HTTP/1.1 201 Created"
+2024-11-12 18:19:43,242 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/register "HTTP/1.1 200 OK"
+2024-11-12 18:19:56,167 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: GET http://192.168.20.119:13001/api/v1/user/public_key "HTTP/1.1 200 OK"
+2024-11-12 18:19:56,420 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:13001/api/v1/user/login "HTTP/1.1 201 Created"
+2024-11-12 18:19:56,815 - _client - _send_single_request - line:1786 - INFO -: HTTP Request: POST http://192.168.20.119:11080/v1/user/login "HTTP/1.1 200 OK"
diff --git a/app/api/auth.py b/app/api/auth.py
index 860fca7..0011ee9 100644
--- a/app/api/auth.py
+++ b/app/api/auth.py
@@ -77,6 +77,7 @@
         "token_type": "bearer",
         "username": user.username,
         "nickname": "",
+        "user": user.to_json()
     })
 
 
diff --git a/app/api/group.py b/app/api/group.py
index 4d0826e..e931fc3 100644
--- a/app/api/group.py
+++ b/app/api/group.py
@@ -1,5 +1,5 @@
 from fastapi import APIRouter, Depends
-from win32ctypes.pywin32.pywintypes import datetime
+from datetime import datetime
 
 from app.api import Response, get_current_user
 from app.models.base_model import get_db
diff --git a/app/api/organization.py b/app/api/organization.py
index e69de29..3589c07 100644
--- a/app/api/organization.py
+++ b/app/api/organization.py
@@ -0,0 +1,68 @@
+from fastapi import APIRouter, Depends
+from app.api import Response, pwd_context, get_current_user
+from app.models import DeptList, DeptInfo, DeptParent
+from app.models.base_model import get_db
+from app.models.user import PageParameter, UserStatus, UserInfo, LoginData
+from app.models.user_model import UserModel
+from app.service.organization import get_organization_list, create_dept, edit_dept_data, edit_dept_parent, \
+    get_organization_info, delete_organization_info
+
+dept_router = APIRouter()
+
+
+@dept_router.get("/list", response_model=Response)
+async def organization_list(paras: DeptList,current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    return Response(code=200, msg="", data=await get_organization_list(db, paras.deptName))
+
+
+@dept_router.post("/add_dept", response_model=Response)
+async def add_dept(dept: DeptInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if not dept.deptName:
+        return Response(code=400, msg="The deptName cannot be empty!")
+    if dept.status not in ["0", "1"]:
+        return Response(code=400, msg="The status cannot be {}!".format(dept.status))
+    is_create = await create_dept(db, dept.deptName, dept.leader, dept.phone, dept.address, dept.status, dept.orderNum, dept.roles, dept.groups, dept.parentId)
+    if not is_create:
+        return Response(code=500, msg="dept create failure", data={})
+    return Response(code=200, msg="dept create successfully", data={})
+
+
+@dept_router.put("/edit_dept", response_model=Response)
+async def edit_dept(dept: DeptInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if not dept.deptName:
+        return Response(code=400, msg="The deptName cannot be empty!")
+    if dept.status not in ["0", "1"]:
+        return Response(code=400, msg="The status cannot be {}!".format(dept.status))
+    is_create = await edit_dept_data(db, dept.deptId, dept.deptName, dept.leader, dept.phone, dept.address, dept.status, dept.orderNum, dept.roles, dept.groups, dept.parentId)
+    if not is_create:
+        return Response(code=500, msg="dept edit failure", data={})
+    return Response(code=200, msg="dept edit successfully", data={})
+
+@dept_router.put("/dept_parent", response_model=Response)
+async def dept_parent(dept: DeptParent, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_create = await edit_dept_parent(db, dept.deptId, dept.parentId, dept.orderNum)
+    if not is_create:
+        return Response(code=500, msg="dept edit failure", data={})
+    return Response(code=200, msg="dept edit successfully", data={})
+
+
+@dept_router.get("/{deptId}", response_model=Response)
+async def dept_info(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+
+    return Response(code=200, msg="", data=await get_organization_info(db, deptId))
+
+
+@dept_router.delete("/{deptId}", response_model=Response)
+async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_edit = await delete_organization_info(db, deptId)
+    if not is_edit:
+        return Response(code=500, msg="dept delete failure", data={})
+    return Response(code=200, msg="dept delete successfully", data={})
+
+
+@dept_router.delete("/{deptId}", response_model=Response)
+async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_edit = await delete_organization_info(db, deptId)
+    if not is_edit:
+        return Response(code=500, msg="dept delete failure", data={})
+    return Response(code=200, msg="dept delete successfully", data={})
diff --git a/app/api/resource.py b/app/api/resource.py
new file mode 100644
index 0000000..c3abb75
--- /dev/null
+++ b/app/api/resource.py
@@ -0,0 +1,37 @@
+from fastapi import APIRouter, Depends
+from app.api import Response, pwd_context, get_current_user
+from app.models.base_model import get_db
+from app.models.user_model import UserModel
+from app.service.resource import get_resource_tree, get_resource_info, delete_resource_info
+
+menu_router = APIRouter()
+
+
+@menu_router.get("/tree_select", response_model=Response)
+async def resource_tree_select(current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    return Response(code=200, msg="", data=await get_resource_tree(db))
+
+@menu_router.get("/{menuId}", response_model=Response)
+async def resource_info(menuId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+
+    return Response(code=200, msg="", data=await get_resource_info(db, menuId))
+
+
+@menu_router.delete("/{menuId}", response_model=Response)
+async def delete_resource(menuId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    is_edit = await delete_resource_info(db, menuId)
+    if not is_edit:
+        return Response(code=500, msg="menu delete failure", data={})
+    return Response(code=200, msg="menu delete successfully", data={})
+
+
+@menu_router.post("/add_menu", response_model=Response)
+async def add_dept(dept: DeptInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if not dept.deptName:
+        return Response(code=400, msg="The deptName cannot be empty!")
+    if dept.status not in ["0", "1"]:
+        return Response(code=400, msg="The status cannot be {}!".format(dept.status))
+    is_create = await create_dept(db, dept.deptName, dept.leader, dept.phone, dept.address, dept.status, dept.orderNum, dept.roles, dept.groups, dept.parentId)
+    if not is_create:
+        return Response(code=500, msg="dept create failure", data={})
+    return Response(code=200, msg="dept create successfully", data={})
diff --git a/app/api/role.py b/app/api/role.py
index dfcc7bb..1d54a6f 100644
--- a/app/api/role.py
+++ b/app/api/role.py
@@ -25,7 +25,7 @@
         return Response(code=200, msg="role already created")
     is_create = await create_role(db, role.roleName, role.remark, current_user.id)
     if not is_create:
-        return Response(code=200, msg="role create failure", data={})
+        return Response(code=500, msg="role create failure", data={})
     return Response(code=200, msg="role create successfully", data={"roleName": role.roleName})
 
 @role_router.delete("/delete_role/{role_id}", response_model=Response)
@@ -35,7 +35,7 @@
         return Response(code=200, msg="role does not exist")
     is_edit = await delete_role_data(db, role_id)
     if not is_edit:
-        return Response(code=200, msg="role delete failure", data={})
+        return Response(code=500, msg="role delete failure", data={})
     return Response(code=200, msg="role delete successfully", data={})
 
 
@@ -48,19 +48,21 @@
         return Response(code=200, msg="role does not exist")
     is_edit = await edit_role_status(db, role.status,role.role_id)
     if not is_edit:
-        return Response(code=200, msg="role status edit failure", data={})
+        return Response(code=500, msg="role status edit failure", data={})
     return Response(code=200, msg="role status edit successfully", data={})
 
 @role_router.put("/edit_role", response_model=Response)
 async def edit_role_data(role: RoleEdit, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if not role.roleName:
+        return Response(code=400, msg="The roleName cannot be empty!")
     db_role = db.query(RoleModel).filter(RoleModel.id == role.role_id).first()
     if not db_role:
         return Response(code=200, msg="role does not exist")
-    if role.roleName:
-        db_role = db.query(RoleModel).filter(RoleModel.name == role.roleName).first()
-        if db_role:
-            return Response(code=200, msg="role already created")
+
+    db_role = db.query(RoleModel).filter(RoleModel.name == role.roleName).first()
+    if db_role and db_role.id != role.role_id:
+        return Response(code=200, msg="role already created")
     is_edit = await edit_role_resource(db, role.role_id,role.roleName, role.remark, role.resources)
     if not is_edit:
-        return Response(code=200, msg="role edit failure", data={})
+        return Response(code=500, msg="role edit failure", data={})
     return Response(code=200, msg="role edit successfully", data={})
\ No newline at end of file
diff --git a/app/api/user.py b/app/api/user.py
index 6f98233..4390296 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -1,9 +1,10 @@
 from fastapi import APIRouter, Depends
 from app.api import Response, pwd_context, get_current_user
 from app.models.base_model import get_db
-from app.models.user import PageParameter
+from app.models.user import PageParameter, UserStatus, UserInfo, LoginData
 from app.models.user_model import UserModel
-from app.service.user import get_user_list
+from app.service.user import get_user_list, edit_user_status, delete_user_data, create_user, edit_user_data, \
+    edit_user_pwd
 
 user_router = APIRouter()
 
@@ -13,4 +14,68 @@
     return Response(code=200, msg="", data=await get_user_list(db, paras.page_size, paras.page_index, paras.keyword))
 
 
+@user_router.post("/add_user", response_model=Response)
+async def add_user(user: UserInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if not user.userName:
+        return Response(code=400, msg="The userName cannot be empty!")
+    db_user = db.query(UserModel).filter(UserModel.username == user.userName).first()
+    if db_user:
+        return Response(code=200, msg="user already created")
+    pwd = user.pwd
+    if not pwd:
+        pwd = "000000"
+    is_create = await create_user(db, user.userName, user.email, user.phone, user.loginName, pwd, user.roles, user.groups)
+    if not is_create:
+        return Response(code=500, msg="user create failure", data={})
+    return Response(code=200, msg="user create successfully", data={})
 
+
+@user_router.put("/edit_user", response_model=Response)
+async def edit_user(user: UserInfo, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    # if not user.userName:
+    #     return Response(code=400, msg="The userName cannot be empty!")
+    user_info = db.query(UserModel).filter(UserModel.id == user.userId).first()
+    if not user_info:
+        return Response(code=200, msg="user does not exist")
+    # db_user = db.query(UserModel).filter(UserModel.username == user.userName).first()
+    # if db_user and db_user.id != user.userId:
+    #     return Response(code=200, msg="user already created")
+    is_edit = await edit_user_data(db, user.userId, user.email, user.phone, user.loginName, user.roles, user.groups)
+    if not is_edit:
+        return Response(code=500, msg="user edit failure", data={})
+    return Response(code=200, msg="user edit successfully", data={})
+
+
+@user_router.put("/change_status", response_model=Response)
+async def change_user_status(user: UserStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    if user.status not in ["0", "1"]:
+        return Response(code=400, msg="The status cannot be {}!".format(user.status))
+    db_user = db.query(UserModel).filter(UserModel.id == user.userId).first()
+    if not db_user:
+        return Response(code=200, msg="user does not exist")
+    is_edit = await edit_user_status(db, user.status,user.userId)
+    if not is_edit:
+        return Response(code=500, msg="user status edit failure", data={})
+    return Response(code=200, msg="user status edit successfully", data={})
+
+
+@user_router.delete("/delete_user/{user_id}", response_model=Response)
+async def delete_user(user_id, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    db_user = db.query(UserModel).filter(UserModel.id == user_id).first()
+    if not db_user:
+        return Response(code=200, msg="user does not exist")
+    is_edit = await delete_user_data(db, user_id)
+    if not is_edit:
+        return Response(code=500, msg="user delete failure", data={})
+    return Response(code=200, msg="user delete successfully", data={})
+
+
+@user_router.put("/reset_pwd", response_model=Response)
+async def reset_user_pwd(user: UserStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    db_user = db.query(UserModel).filter(UserModel.id == user.userId).first()
+    if not db_user:
+        return Response(code=200, msg="user does not exist")
+    is_edit = await edit_user_pwd(db, user.userId)
+    if not is_edit:
+        return Response(code=500, msg="user pwd reset failure", data={})
+    return Response(code=200, msg="user pwd reset successfully", data={})
\ No newline at end of file
diff --git a/app/models/agent_model.py b/app/models/agent_model.py
index 1b1cb00..e2151fc 100644
--- a/app/models/agent_model.py
+++ b/app/models/agent_model.py
@@ -31,20 +31,17 @@
 
 class CanvasModel(Base):
     __tablename__ = 'user_canvas'
-    __mapper_args__ = {
-        # "order_by": 'SEQ'
-    }
-    id = Column(String(32), primary_key=True)
-    create_time = Column(BigInteger)
+
+    id = Column(String(32), primary_key=True)      # id
     create_date = Column(DateTime, default=datetime.now)
-    update_time = Column(BigInteger)
     update_date = Column(DateTime, default=datetime.now)
-    avatar = Column(Text)
-    user_id = Column(String(255))
-    title = Column(String(255))
-    description = Column(Text)
-    canvas_type = Column(String(32))
+    avatar = Column(Text)                    # 鍥炬爣
+    user_id = Column(String(255))            # 鐢ㄦ埛id
+    title = Column(String(255))               # 鏍囬
+    description = Column(Text)               # 璇存槑
+    canvas_type = Column(String(32))           # agent绫诲瀷
     dsl = Column(Text)
+    agent_type = Column(String(2))            # agent骞冲彴
 
 
 
diff --git a/app/models/dialog_model.py b/app/models/dialog_model.py
index bfa4a8c..2ac706f 100644
--- a/app/models/dialog_model.py
+++ b/app/models/dialog_model.py
@@ -10,29 +10,15 @@
     __mapper_args__ = {
         # "order_by": 'SEQ'
     }
-    id = Column(String(32), primary_key=True)
-    create_time = Column(BigInteger)
-    create_date = Column(DateTime)
-    update_time = Column(BigInteger)
-    update_date = Column(DateTime)
-    tenant_id = Column(String(32))
-    name = Column(String(255))
-    description = Column(Text)
-    icon = Column(Text)
-    language = Column(String(32))
-    llm_id = Column(String(128))
-    llm_setting = Column(Text)
-    prompt_type = Column(String(16))
-    prompt_config = Column(Text)
-    similarity_threshold = Column(Float)
-    vector_similarity_weight = Column(Float)
-    top_n = Column(Integer)
-    top_k = Column(Integer)
-    do_refer = Column(String(1))
-    rerank_id = Column(String(128))
-    kb_ids = Column(Text)
-    status = Column(String(1))
-    hide = Column(Boolean)
+    id = Column(String(32), primary_key=True)  #  id
+    create_date = Column(DateTime)             # 鍒涘缓鏃堕棿
+    update_date = Column(DateTime)             # 鏇存柊鏃堕棿
+    tenant_id = Column(String(32))              # 鍒涘缓浜�
+    name = Column(String(255))                 # 鍚嶇О
+    description = Column(Text)                 # 璇存槑
+    icon = Column(Text)                         # 鍥炬爣
+    status = Column(String(1))                 # 鐘舵��
+    dialog_type = Column(String(1))            #    # 骞冲彴
 
     def get_id(self):
         return str(self.id)
diff --git a/app/models/group_model.py b/app/models/group_model.py
index 52e05a8..a1ac287 100644
--- a/app/models/group_model.py
+++ b/app/models/group_model.py
@@ -10,24 +10,24 @@
 
 
 group_knowledge_table = Table('group_Knowledge', Base.metadata
-                           , Column('group_id', Integer, ForeignKey('group.id'))
-                           , Column('knowledge_id', String(32), ForeignKey('knowledgebase.id')))
+                           , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE'))
+                           , Column('knowledge_id', String(32), ForeignKey('knowledgebase.id', ondelete='CASCADE')))
 
 group_dialog_table = Table('group_dialogs', Base.metadata
-                           , Column('group_id', Integer, ForeignKey('group.id'))
-                           , Column('dialog_id', String(36), ForeignKey('dialogs.id')))
+                           , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE'))
+                           , Column('dialog_id', String(36), ForeignKey('dialogs.id', ondelete='CASCADE')))
 
 group_agent_table = Table('group_agent', Base.metadata
-                           , Column('group_id', Integer, ForeignKey('group.id'))
-                           , Column('agent_id', String(36), ForeignKey('user_canvas.id')))
+                           , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE'))
+                           , Column('agent_id', String(36), ForeignKey('user_canvas.id', ondelete='CASCADE')))
 
 group_llm_table = Table('group_llm', Base.metadata
-                           , Column('group_id', Integer, ForeignKey('group.id'))
-                           , Column('llm_id', String(36), ForeignKey('common_llm.id')))
+                           , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE'))
+                           , Column('llm_id', String(36), ForeignKey('common_llm.id', ondelete='CASCADE')))
 
 group_unified_agent_table = Table('group_unified_agent', Base.metadata
-                                    , Column('group_id', Integer, ForeignKey('group.id'))
-                                    ,Column('unified_agent_id', String(36), ForeignKey('unified_agent.id')))
+                                    , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE'))
+                                    ,Column('unified_agent_id', String(36), ForeignKey('unified_agent.id', ondelete='CASCADE')))
 
 
 class GroupModel(Base):
diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py
index cc8d1b8..bde8241 100644
--- a/app/models/knowledge_model.py
+++ b/app/models/knowledge_model.py
@@ -10,28 +10,16 @@
     __mapper_args__ = {
         # "order_by": 'SEQ'
     }
-    id = Column(String(32), primary_key=True)
-    name = Column(String(128))
-    create_time = Column(BigInteger)
-    create_date = Column(DateTime)
-    update_time = Column(BigInteger)
-    update_date = Column(DateTime)
-    avatar = Column(Text)
-    tenant_id = Column(String(32))
-    language = Column(String(32))
-    description = Column(Text)
-    embd_id = Column(String(128))
-    permission = Column(String(16))
-    created_by = Column(String(32))
-    doc_num = Column(Integer)
-    token_num = Column(Integer)
-    chunk_num = Column(Integer)
-    similarity_threshold = Column(Float)
-    vector_similarity_weight = Column(Float)
-    parser_id = Column(String(32))
-    parser_config = Column(Text)
-    status = Column(String(1))
-    hide = Column(Boolean)
+    id = Column(String(32), primary_key=True)  # id
+    name = Column(String(128))                 # 鍚嶇О
+    create_date = Column(DateTime)             # 鍒涘缓鏃堕棿
+    update_date = Column(DateTime)             # 鏇存柊鏃堕棿
+    avatar = Column(Text)                       # 鍥炬爣
+    tenant_id = Column(String(32))              # 鍒涘缓浜篿d
+    description = Column(Text)                 # 璇存槑
+    status = Column(String(1))                    # 鐘舵��
+    kld_type = Column(String(1))                  # 鐭ヨ瘑搴撳钩鍙�
+
 
     def get_id(self):
         return str(self.id)
diff --git a/app/models/organization_model.py b/app/models/organization_model.py
index ae7a1de..f0c2f55 100644
--- a/app/models/organization_model.py
+++ b/app/models/organization_model.py
@@ -1,18 +1,20 @@
 from datetime import datetime
+from typing import Optional
 
+from pydantic import BaseModel
 from sqlalchemy import Column, Integer, String, Table, ForeignKey, DateTime
 from sqlalchemy.orm import relationship, backref
 
 from app.models.base_model import Base
 
-organization_group_table = Table('organization_group', Base.metadata,
-                                       Column('group_id', Integer, ForeignKey('group.id')),
-                                       Column('organization_id', String(36), ForeignKey('organization.id')))
+# organization_group_table = Table('organization_group', Base.metadata,
+#                                        Column('group_id', Integer, ForeignKey('group.id')),
+#                                        Column('organization_id', String(36), ForeignKey('organization.id')))
 
 # #鏋勫缓瀵箁ole琛ㄧ殑鍏崇郴
 organization_role_table = Table('organization_role', Base.metadata,
-                                   Column('role_id', String(36), ForeignKey('role.id')),
-                                   Column('organization_id', String(36), ForeignKey('organization.id')))
+                                   Column('role_id', String(36), ForeignKey('role.id', ondelete='CASCADE')),
+                                   Column('organization_id', String(36), ForeignKey('organization.id', ondelete='CASCADE')))
 
 class OrganizationModel(Base):
     __tablename__ = 'organization'
@@ -25,13 +27,13 @@
     iconcls = Column(String(255))
     seq = Column(Integer)
     leader = Column(String(255))
-    phone = Column(String(11))
+    phone = Column(String(32))
     email = Column(String(64))
     status = Column(String(10), nullable=False, default="0")
 
-    groups = relationship('GroupModel',
-                                secondary=organization_group_table,
-                                backref=backref('organizations', lazy='dynamic'))
+    # groups = relationship('GroupModel',
+    #                             secondary=organization_group_table,
+    #                             backref=backref('organizations', lazy='dynamic'))
 
     roles = relationship('RoleModel',
                             secondary=organization_role_table,
@@ -61,13 +63,11 @@
             'email': self.email,
             'status': self.status,
             'roles': [self.role_json(role) for role in self.roles],
-            'groups': [self.group_json(group) for group in self.groups],
+            # 'groups': [self.group_json(group) for group in self.groups],
             'children': [
                 org.to_json() for org in self.children
             ]
         }
-
-
 
         return json
 
@@ -87,25 +87,48 @@
 
     def to_tree_select_json(self):
         return {
-            'id': self.ID,
-            'label': self.NAME,
+            'id': self.id,
+            'label': self.name,
             'children': [org.to_tree_select_json() for org in self.children]
         }
 
     def get_pid(self):
         if self.parent:
-            return self.parent.ID
+            return self.parent.id
         return ''
 
     def get_pName(self):
         if self.parent:
-            return self.parent.NAME
+            return self.parent.name
         return ''
 
 
 
     def get_id(self):
-        return str(self.ID)
+        return str(self.id)
 
     def __repr__(self):
-        return '<Organization %r>\n' %(self.NAME)
\ No newline at end of file
+        return '<Organization %r>\n' %(self.name)
+
+
+class DeptList(BaseModel):
+    deptName: Optional[str] = ""
+
+
+class DeptInfo(BaseModel):
+    deptId: Optional[str] = ""
+    deptName: Optional[str] = ""
+    leader: Optional[str] = ""
+    phone: Optional[str] = ""
+    orderNum: int
+    address: Optional[str] = ""
+    parentId: Optional[str] = ""
+    status: str
+    roles: list
+    groups: Optional[list] = []
+
+
+class DeptParent(BaseModel):
+    deptId: str
+    parentId: str
+    orderNum: int
diff --git a/app/models/resource_model.py b/app/models/resource_model.py
index 3aeff5a..61e1bc9 100644
--- a/app/models/resource_model.py
+++ b/app/models/resource_model.py
@@ -1,4 +1,7 @@
 from datetime import datetime
+from typing import Optional
+
+from pydantic import BaseModel
 from sqlalchemy import Column, Integer, String, DateTime, Table, ForeignKey
 from sqlalchemy.orm import relationship, backref
 
@@ -137,4 +140,18 @@
         }
 
     def __repr__(self):
-        return '<ResourceTypeModel %r>\n' %(self.name)
\ No newline at end of file
+        return '<ResourceTypeModel %r>\n' %(self.name)
+
+class MenuInfo(BaseModel):
+    menuId: Optional[str] = ""
+    menuName: Optional[str] = ""
+    component: Optional[str] = ""
+    path: Optional[str] = ""
+    orderNum: int
+    perms: Optional[str] = ""
+    menuType: Optional[str] = ""
+    description: Optional[str] = ""
+    parentId: str
+    status: str
+    roles: list
+    groups: Optional[list] = []
\ No newline at end of file
diff --git a/app/models/role_model.py b/app/models/role_model.py
index 3121054..e9b80bf 100644
--- a/app/models/role_model.py
+++ b/app/models/role_model.py
@@ -9,8 +9,8 @@
 
 # 瑙掕壊璧勬簮鍏宠仈琛�
 role_resource_table = Table('role_resource', Base.metadata,
-                            Column('role_id', String(36), ForeignKey('role.id')),
-                            Column('resource_id', String(36), ForeignKey('resource.id')))
+                            Column('role_id', String(36), ForeignKey('role.id', ondelete='CASCADE')),
+                            Column('resource_id', String(36), ForeignKey('resource.id', ondelete='CASCADE')))
 
 
 
diff --git a/app/models/user.py b/app/models/user.py
index 45874f7..ab53067 100644
--- a/app/models/user.py
+++ b/app/models/user.py
@@ -27,4 +27,21 @@
 class PageParameter(BaseModel):
     page_index: int
     page_size: int
-    keyword: Optional[str] = ""
\ No newline at end of file
+    keyword: Optional[str] = ""
+
+class UserStatus(BaseModel):
+    userId: int
+    status: Optional[str] = ""
+    pwd: Optional[str] = ""
+
+class UserInfo(BaseModel):
+    userId: Optional[int] = 0
+    userName: Optional[str] = ""
+    loginName: Optional[str] = ""
+    phone: Optional[str] = ""
+    pwd: Optional[str] = ""
+    email: str
+    roles: list
+    groups: Optional[list] = []
+
+
diff --git a/app/models/user_model.py b/app/models/user_model.py
index 81715df..aea4cbd 100644
--- a/app/models/user_model.py
+++ b/app/models/user_model.py
@@ -6,16 +6,16 @@
 from app.models.base_model import Base
 
 user_organization_table = Table('user_organization',Base.metadata
-                                   , Column('user_id', Integer, ForeignKey('user.id'))
-                                   , Column('organization_id', String(36), ForeignKey('organization.id')))
+                                   , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
+                                   , Column('organization_id', String(36), ForeignKey('organization.id', ondelete='CASCADE')))
 
 user_role_table = Table('user_role', Base.metadata
-                           , Column('user_id', Integer, ForeignKey('user.id'))
-                           , Column('role_id', String(36), ForeignKey('role.id')))
+                           , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
+                           , Column('role_id', String(36), ForeignKey('role.id', ondelete='CASCADE')))
 
 user_group_table = Table('user_group', Base.metadata
-                           , Column('user_id', Integer, ForeignKey('user.id'))
-                           , Column('group_id', Integer, ForeignKey('group.id')))
+                           , Column('user_id', Integer, ForeignKey('user.id', ondelete='CASCADE'))
+                           , Column('group_id', Integer, ForeignKey('group.id', ondelete='CASCADE')))
 
 
 
@@ -89,7 +89,7 @@
             'sex': self.sex,
             'age': self.age,
             "status": self.status,
-            'photo': self.phone,
+            'phone': self.phone,
             'email': self.email,
             # 'phoneNumber': self.phone_number
         }
@@ -101,16 +101,17 @@
         json['groups'] = [group.to_dict() for group in self.groups]
 
         roles = []
-        # if len(self.roles.all()) > 0:
-        #     roles = [role.to_json() for role in self.roles]
-        # organization_roles = [role.to_json() for organization in self.organizations for role in
-        #                       organization.role_list]
-        # for role in organization_roles:
-        #     if role not in roles:
-        #         roles.append(role)
+        # if len(self.roles) > 0:
+        roles = [role.to_json() for role in self.roles]
+        organization_roles = [role.to_json() for organization in self.organizations for role in
+                              organization.roles]
+        for role in organization_roles:
+            if role not in roles:
+                roles.append(role)
         json['roles'] = roles
         return json
 
+
     def get_children(self):
         """閫掑綊鑾峰彇鎸囧畾鐢ㄦ埛鐨勫瓙鐢ㄦ埛ID鍒楄〃"""
         users = UserModel.query.filter_by(CREATOR=self.ID).all()
diff --git a/app/service/organization.py b/app/service/organization.py
index e69de29..67f59a9 100644
--- a/app/service/organization.py
+++ b/app/service/organization.py
@@ -0,0 +1,89 @@
+import uuid
+
+from app.Log import logger
+from app.models import OrganizationModel, GroupModel
+from app.models.role_model import RoleModel
+
+
+
+async def get_organization_list(db, deptName: str):
+    query = db.query(OrganizationModel).filter(OrganizationModel.organization_id == None)
+    if deptName:
+        query = query.filter(OrganizationModel.name.like('%{}%'.format(deptName)))
+    depts = query.order_by(OrganizationModel.seq.desc()).all()
+    return {"total": query.count(), "rows":  [dept.to_json() for dept in depts]}
+
+
+async def create_dept(db, dept_name, leader, phone, address, status, order_num, roles, groups,parent_id):
+    try:
+        dept_model = OrganizationModel(id=str(uuid.uuid4()),name=dept_name, address=address,leader=leader,phone=phone,seq=order_num,status=status)
+        if parent_id:
+            dept_model.parent = db.get(OrganizationModel, parent_id)
+        if roles:
+            dept_model.roles = [db.get(RoleModel, roleId) for roleId in roles]
+        # if groups:
+        #     dept_model.groups = [db.get(GroupModel, groupId) for groupId in groups]
+        db.add(dept_model)
+        db.commit()
+        db.refresh(dept_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def edit_dept_data(db, dept_id, dept_name, leader, phone, address, status, order_num, roles, groups,parent_id):
+    try:
+        dept_model = db.query(OrganizationModel).filter(OrganizationModel.id == dept_id).first()
+        dept_model.name = dept_name
+        dept_model.address = address
+        dept_model.phone = phone
+        dept_model.leader = leader
+        dept_model.status = status
+        dept_model.seq = order_num
+        # if parent_id:
+        #     dept_model.parent = db.get(OrganizationModel, parent_id)
+        if roles:
+            dept_model.roles = [db.get(RoleModel, roleId) for roleId in roles]
+        # if groups:
+        #     dept_model.groups = [db.get(GroupModel, groupId) for groupId in groups]
+        # db.add(dept_model)
+        db.commit()
+        db.refresh(dept_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def edit_dept_parent(db, dept_id, parent_id, order_num):
+    try:
+        dept_model = db.query(OrganizationModel).filter(OrganizationModel.id == dept_id).first()
+        dept_model.parent = db.get(OrganizationModel, parent_id)
+        dept_model.seq = order_num
+        db.commit()
+        db.refresh(dept_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def get_organization_info(db, dept_id: str):
+    dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first()
+
+    return {"total": 0, "data":  dept.to_json()}
+
+
+async def delete_organization_info(db, dept_id: str):
+    try:
+        db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).delete()
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
\ No newline at end of file
diff --git a/app/service/ragflow.py b/app/service/ragflow.py
index 1677ed5..d5d4726 100644
--- a/app/service/ragflow.py
+++ b/app/service/ragflow.py
@@ -39,7 +39,7 @@
             response = await client.post(
                 f"{self.base_url}/v1/user/register",
                 headers={'Content-Type': 'application/json'},
-                json={"nickname": username, "email": f"{username}@example.com", "password": password}
+                json={"nickname": username, "email":  f"{username}@example.com", "password": password}
             )
             if response.status_code != 200:
                 raise Exception(f"Ragflow registration failed: {response.text}")
diff --git a/app/service/resource.py b/app/service/resource.py
new file mode 100644
index 0000000..572c55e
--- /dev/null
+++ b/app/service/resource.py
@@ -0,0 +1,29 @@
+import uuid
+
+from app.Log import logger
+from app.models import OrganizationModel, GroupModel, ResourceModel
+from app.models.role_model import RoleModel
+
+
+
+async def get_resource_tree(db):
+    resource = db.query(ResourceModel).filter(ResourceModel.resource_id == None).order_by(ResourceModel.seq.desc()).all()
+
+    return {"total": 0, "rows":  [dept.to_tree_select_json() for dept in resource]}
+
+
+async def get_resource_info(db, menu_id: str):
+    dept = db.query(ResourceModel).filter(ResourceModel.id.__eq__(menu_id)).first()
+
+    return {"total": 0, "data":  dept.to_json()}
+
+
+async def delete_resource_info(db, menu_id):
+    try:
+        db.query(ResourceModel).filter(ResourceModel.id.__eq__(menu_id)).delete()
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
\ No newline at end of file
diff --git a/app/service/user.py b/app/service/user.py
index 472c77a..061d9b9 100644
--- a/app/service/user.py
+++ b/app/service/user.py
@@ -1,11 +1,120 @@
+import base64
+
+from datetime import datetime
+
+from app.api import pwd_context
+from app.config.config import settings
+from app.models import RoleModel, GroupModel
 from app.models.user_model import UserModel
 from app.Log import logger
+from app.service.bisheng import BishengService
+from app.service.ragflow import RagflowService
+
 
 async def get_user_list(db, page_size: int, page_index: int, keyword: str):
-    logger.error("ffffffff")
     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]}
+
+
+async def edit_user_status(db, status: str, user_id: int):
+    try:
+        db.query(UserModel).filter(UserModel.id == user_id).update({"status":status})
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def delete_user_data(db, user_id: str):
+    try:
+        db.query(UserModel).filter(UserModel.id == user_id).delete()
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def create_user(db, user_name, email, phone, login_name, password, roles, groups):
+    try:
+        bisheng_service = BishengService(settings.sgb_base_url)
+        ragflow_service = RagflowService(settings.fwr_base_url)
+
+        # 娉ㄥ唽鍒版瘯鏄�
+        try:
+            bisheng_info = await bisheng_service.register(user_name, password)
+        except Exception as e:
+            logger.error(f"Failed to register with Bisheng: {str(e)}")
+            return False
+
+        # 娉ㄥ唽鍒皉agflow
+        try:
+            ragflow_info = await ragflow_service.register(user_name, password)
+        except Exception as e:
+            logger.error(f"Failed to register with Ragflow: {str(e)}")
+            return False
+
+        # 瀛樺偍鐢ㄦ埛淇℃伅
+        hashed_password = pwd_context.hash(password)
+        user_model =  UserModel(username=user_name, hashed_password=hashed_password, email=email,ragflow_id=ragflow_info.get("id"),bisheng_id=bisheng_info.get("user_id"),
+                                phone=phone,login_name=login_name)
+
+        user_model.roles = [db.get(RoleModel, roleId) for roleId in roles]
+        if groups:
+            user_model.groups = [db.get(GroupModel, groupId) for groupId in groups]
+        db.add(user_model)
+        db.commit()
+        db.refresh(user_model)
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def edit_user_data(db, user_id, email, phone, login_name, roles, groups):
+    try:
+        user = db.query(UserModel).filter(UserModel.id == user_id).first()
+        user.email = email
+        user.phone = phone
+        user.login_name = login_name
+        user.email = email
+        user.updated_at = datetime.now()
+        user.roles = [db.get(RoleModel, roleId) for roleId in roles]
+        user.groups = [db.get(GroupModel, groupId) for groupId in groups]
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
+
+async def edit_user_pwd(db, user_id, password="000000"):
+    try:
+        #TODO
+        hashed_password = pwd_context.hash(password)
+        user = db.query(UserModel).filter(UserModel.id == user_id).first()
+        user.hashed_password = hashed_password
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    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
diff --git a/main.py b/main.py
index 5826d6f..b183845 100644
--- a/main.py
+++ b/main.py
@@ -1,13 +1,13 @@
 from contextlib import asynccontextmanager
 from fastapi import FastAPI
-
-from app.Log import init_log
 from app.api.auth import router as auth_router
 from app.api.chat import router as chat_router
 from app.api.agent import router as agent_router
 from app.api.excel import router as excel_router
 from app.api.files import router as files_router
+from app.api.organization import dept_router
 from app.api.report import router as report_router
+from app.api.resource import menu_router
 from app.api.user import user_router
 from app.api.group import group_router
 from app.api.role import role_router
@@ -44,6 +44,8 @@
 app.include_router(user_router, prefix='/api/user', tags=["user"])
 app.include_router(group_router, prefix='/api/group', tags=["group"])
 app.include_router(role_router, prefix='/api/role', tags=["role"])
+app.include_router(dept_router, prefix='/api/dept', tags=["dept"])
+app.include_router(menu_router, prefix='/api/menu', tags=["menu"])
 
 if __name__ == "__main__":
     import uvicorn

--
Gitblit v1.8.0