zhaoqingang
2024-11-12 2669d0e0a93e06983dade724146bd0e1b6da6ba7
增加接口
21个文件已修改
2个文件已添加
723 ■■■■ 已修改文件
.gitignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/Log/__init__.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/Log/log.log 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/auth.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/group.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/organization.py 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/resource.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/role.py 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/api/user.py 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/agent_model.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/dialog_model.py 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/group_model.py 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/knowledge_model.py 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/organization_model.py 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/resource_model.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/role_model.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/user.py 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/models/user_model.py 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/organization.py 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/ragflow.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/resource.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/service/user.py 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -9,3 +9,4 @@
.vscode
.ipynb_checkpoints
.pytest
*.log
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)  # 将日志输出至文件
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"
app/api/auth.py
@@ -77,6 +77,7 @@
        "token_type": "bearer",
        "username": user.username,
        "nickname": "",
        "user": user.to_json()
    })
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
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={})
app/api/resource.py
New file
@@ -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={})
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={})
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={})
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平台
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)
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):
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))              # 创建人id
    description = Column(Text)                 # 说明
    status = Column(String(1))                    # 状态
    kld_type = Column(String(1))                  # 知识库平台
    def get_id(self):
        return str(self.id)
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')))
# #构建对role表的关系
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)
        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
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)
        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] = []
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')))
app/models/user.py
@@ -27,4 +27,21 @@
class PageParameter(BaseModel):
    page_index: int
    page_size: int
    keyword: Optional[str] = ""
    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] = []
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()
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
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}")
app/service/resource.py
New file
@@ -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
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
        # 注册到ragflow
        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]}
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