From f2c43713b16e821f4a1ae97804c60f18734d5f6a Mon Sep 17 00:00:00 2001
From: zhaoqingang <zhaoqg0118@163.com>
Date: 星期五, 13 十二月 2024 17:25:12 +0800
Subject: [PATCH] 问题优化

---
 app/api/role.py                                      |   18 
 app/service/user.py                                  |  100 ++++----
 alembic/versions/ef06c24632a7_dialog_id_to_update.py |   34 +++
 app/models/user.py                                   |    7 
 app/service/auth.py                                  |   13 
 env_conf/api_key_conf.json                           |    5 
 env_conf/default_agent_conf.json                     |   33 +++
 app/service/dialog.py                                |    4 
 alembic/versions/ba24e02a6610_menu_table_update.py   |   32 ++
 app/task/fetch_agent.py                              |   10 
 main.py                                              |    4 
 app/service/role.py                                  |    3 
 app/models/dialog_model.py                           |    9 
 env_conf/menu_conf.json                              |   62 ++++-
 app/service/service_token.py                         |   35 ++-
 app/models/menu_model.py                             |    3 
 env_conf/app_register_conf.json                      |    5 
 app/utils/password_handle.py                         |   31 ++
 app/api/user.py                                      |   33 ++
 app/api/auth.py                                      |   25 +
 app/models/role_model.py                             |    4 
 app/init_config/init_run_data.py                     |   14 +
 app/models/user_model.py                             |   18 +
 alembic/versions/1c4af61d72a5_dialog_id_to_36.py     |   52 ++++
 app/models/knowledge_model.py                        |    2 
 app/api/dialog.py                                    |    2 
 app/init_config/__init__.py                          |    0 
 app/service/v2/initialize_data.py                    |   53 ++++
 app/models/token_model.py                            |    8 
 29 files changed, 480 insertions(+), 139 deletions(-)

diff --git a/alembic/versions/1c4af61d72a5_dialog_id_to_36.py b/alembic/versions/1c4af61d72a5_dialog_id_to_36.py
new file mode 100644
index 0000000..8362b50
--- /dev/null
+++ b/alembic/versions/1c4af61d72a5_dialog_id_to_36.py
@@ -0,0 +1,52 @@
+"""dialog id to 36
+
+Revision ID: 1c4af61d72a5
+Revises: 0366cf835bba
+Create Date: 2024-12-13 11:24:57.138214
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision: str = '1c4af61d72a5'
+down_revision: Union[str, None] = '0366cf835bba'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('dialogs', 'id',
+               existing_type=mysql.VARCHAR(length=32),
+               type_=sa.String(length=36),
+               existing_nullable=False)
+    op.alter_column('dialogs', 'agent_id',
+               existing_type=mysql.VARCHAR(length=32),
+               type_=sa.String(length=36),
+               existing_nullable=True)
+    op.alter_column('knowledgebase', 'id',
+               existing_type=mysql.VARCHAR(length=32),
+               type_=sa.String(length=36),
+               existing_nullable=False)
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.alter_column('knowledgebase', 'id',
+               existing_type=sa.String(length=36),
+               type_=mysql.VARCHAR(length=32),
+               existing_nullable=False)
+    op.alter_column('dialogs', 'agent_id',
+               existing_type=sa.String(length=36),
+               type_=mysql.VARCHAR(length=32),
+               existing_nullable=True)
+    op.alter_column('dialogs', 'id',
+               existing_type=sa.String(length=36),
+               type_=mysql.VARCHAR(length=32),
+               existing_nullable=False)
+    # ### end Alembic commands ###
diff --git a/alembic/versions/ba24e02a6610_menu_table_update.py b/alembic/versions/ba24e02a6610_menu_table_update.py
new file mode 100644
index 0000000..6990720
--- /dev/null
+++ b/alembic/versions/ba24e02a6610_menu_table_update.py
@@ -0,0 +1,32 @@
+"""menu table update
+
+Revision ID: ba24e02a6610
+Revises: ef06c24632a7
+Create Date: 2024-12-13 17:19:35.020328
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'ba24e02a6610'
+down_revision: Union[str, None] = 'ef06c24632a7'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('menu_capacity', sa.Column('chat_id', sa.String(length=36), nullable=True))
+    op.add_column('menu_capacity', sa.Column('chat_type', sa.String(length=36), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('menu_capacity', 'chat_type')
+    op.drop_column('menu_capacity', 'chat_id')
+    # ### end Alembic commands ###
diff --git a/alembic/versions/ef06c24632a7_dialog_id_to_update.py b/alembic/versions/ef06c24632a7_dialog_id_to_update.py
new file mode 100644
index 0000000..1912f2c
--- /dev/null
+++ b/alembic/versions/ef06c24632a7_dialog_id_to_update.py
@@ -0,0 +1,34 @@
+"""dialog id to update
+
+Revision ID: ef06c24632a7
+Revises: 1c4af61d72a5
+Create Date: 2024-12-13 16:18:18.486282
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'ef06c24632a7'
+down_revision: Union[str, None] = '1c4af61d72a5'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('dialogs', sa.Column('mode', sa.String(length=36), nullable=True))
+    op.add_column('user', sa.Column('sync_flag', sa.String(length=36), nullable=True))
+    op.add_column('web_menu', sa.Column('rank', sa.Integer(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('web_menu', 'rank')
+    op.drop_column('user', 'sync_flag')
+    op.drop_column('dialogs', 'mode')
+    # ### end Alembic commands ###
diff --git a/app/api/auth.py b/app/api/auth.py
index 116d9e2..faad16d 100644
--- a/app/api/auth.py
+++ b/app/api/auth.py
@@ -12,7 +12,7 @@
 from app.models.app_token_model import AppToken
 from app.models.base_model import get_db
 from app.models.postgresql_base_model import get_pdb
-from app.models.token_model import upsert_token
+from app.models.token_model import upsert_token, update_token
 from app.models.user import UserCreate, LoginData
 from app.models.user_model import UserModel, UserAppModel
 from app.service.auth import authenticate_user, create_access_token, is_valid_password, save_register_user, \
@@ -24,6 +24,7 @@
 from app.service.ragflow import RagflowService
 from sqlalchemy.future import select
 
+from app.utils.password_handle import generate_password
 
 router = APIRouter()
 
@@ -122,12 +123,14 @@
             continue
         try:
             name = login_data.username
+            app_password = login_data.password
             user_app = await UserAppDao(db).get_data_by_id(user.id, app["id"])
             if user_app:
                 name  = user_app.username
+                app_password = user_app.decrypted_password(user_app.password)
             else:
                 await update_user_info(db, user.id)
-            token = await service.login(name, login_data.password)
+            token = await service.login(name, app_password)
             token_dict[app["id"]] = token
         except Exception as e:
             return Response(code=500, msg=f"Failed to login with {app['id']}: {str(e)}")
@@ -135,7 +138,7 @@
     # 鍒涘缓鏈湴token
     access_token = create_access_token(data={"sub": user.username, "user_id": user.id})
 
-    # await update_token(db, user.id, access_token, token_dict)
+    await update_token(db, user.id, access_token, token_dict)
     await update_user_token(db, user.id, token_dict)
     result = await pdb.execute(select(AppToken).where(AppToken.id == user.id))
     db_app_token = result.scalars().first()
@@ -173,6 +176,7 @@
     app_register = AppRegisterDao(db).get_apps()
     register_dict = {}
     token = ""
+    app_password = await generate_password(10)
     for app in app_register:
         if app["id"] == RAGFLOW:
             service = RagflowService(settings.fwr_base_url)
@@ -190,13 +194,20 @@
             continue
         try:
             name = app["id"] + str(int(time.time()))
-            register_info = await service.register(name, user.password, token)
+            register_info = await service.register(name, app_password, token)
             # print(register_info)
             register_dict[app['id']] = {"id":register_info.get("id"), "name": name, "email": register_info.get("email")}
         except Exception as e:
             return Response(code=500, msg=f"Failed to register with {app['id']}: {str(e)}")
-    user_id = await save_register_user(db, user.username, user.password, user.email, register_dict)
+    user_id = await save_register_user(db, user.username, user.password, user.email, app_password, register_dict)
     if not user_id:
         return Response(code=500, msg=f"Failed to register with app")
-    is_update = await update_user_group(db, user_id)
-    return Response(code=200, msg="User registered successfully",data={"username": user.username})
\ No newline at end of file
+    return Response(code=200, msg="User registered successfully",data={"userFlag": user_id})
+
+
+@router.get("/v2/sync", response_model=Response)
+async def sync_user_tenant(userFlag: str, db=Depends(get_db)):
+    app_register = AppRegisterDao(db).get_app_by_id(RAGFLOW)
+    if app_register:
+        is_update = await update_user_group(db, userFlag)
+    return Response(code=200, msg="success", data={})
\ No newline at end of file
diff --git a/app/api/dialog.py b/app/api/dialog.py
index 44030a2..28bd1df 100644
--- a/app/api/dialog.py
+++ b/app/api/dialog.py
@@ -25,7 +25,7 @@
 
 @dialog_router.post("/create", response_model=Response)
 async def create_dialog_api(dialog: dialogData, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
-    is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType, current_user.id)
+    is_create = await create_dialog_service(db, dialog.id, dialog.name, dialog.description, dialog.icon, dialog.dialogType, dialog.mode,current_user.id)
     if not is_create:
         return Response(code=500, msg="role create failure", data={})
     return Response(code=200, msg="role create success", data={})
diff --git a/app/api/role.py b/app/api/role.py
index e32764c..ad5e78d 100644
--- a/app/api/role.py
+++ b/app/api/role.py
@@ -29,14 +29,14 @@
         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)
-async def delete_group(role_id: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
-    db_role = db.query(RoleModel).filter(RoleModel.id == role_id).first()
+@role_router.delete("/delete_role/{roleId}", response_model=Response)
+async def delete_group(roleId: str, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
+    db_role = db.query(RoleModel).filter(RoleModel.id == roleId).first()
     if not db_role:
         return Response(code=200, msg="role does not exist")
     if db_role.role_type ==2:
         return Response(code=400, msg="榛樿瑙掕壊涓嶅厑璁稿垹闄�!")
-    is_edit = await delete_role_data(db, role_id)
+    is_edit = await delete_role_data(db, roleId)
     if not is_edit:
         return Response(code=500, msg="role delete failure", data={})
     return Response(code=200, msg="role delete successfully", data={})
@@ -46,10 +46,10 @@
 async def edit_group_status(role: RoleStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)):
     if role.status not in ["0", "1"]:
         return Response(code=400, msg="The status cannot be {}!".format(role.status))
-    db_role = db.query(RoleModel).filter(RoleModel.id == role.role_id).first()
+    db_role = db.query(RoleModel).filter(RoleModel.id == role.roleId).first()
     if not db_role:
         return Response(code=200, msg="role does not exist")
-    is_edit = await edit_role_status(db, role.status,role.role_id)
+    is_edit = await edit_role_status(db, role.status,role.roleId)
     if not is_edit:
         return Response(code=500, msg="role status edit failure", data={})
     return Response(code=200, msg="role status edit successfully", data={})
@@ -59,14 +59,14 @@
     if role.editType == 1:
         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()
+        db_role = db.query(RoleModel).filter(RoleModel.id == role.roleId).first()
         if not db_role:
             return Response(code=200, msg="role does not exist")
 
         db_role = db.query(RoleModel).filter(RoleModel.name == role.roleName).first()
-        if db_role and db_role.id != role.role_id:
+        if db_role and db_role.id != role.roleId:
             return Response(code=200, msg="role already created")
-    is_edit = await edit_role_resource(db, role.role_id,role.roleName, role.remark, role.roleKey, role.dataScope, role.resources, role.editType)
+    is_edit = await edit_role_resource(db, role.roleId,role.roleName, role.remark, role.roleKey, role.dataScope, role.resources, role.editType)
     if not is_edit:
         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 506c1b4..78666b4 100644
--- a/app/api/user.py
+++ b/app/api/user.py
@@ -1,12 +1,12 @@
 from fastapi import APIRouter, Depends
 from app.api import Response, pwd_context, get_current_user, ResponseList
-from app.models.public_api_model import AppRegisterModel
 from app.models.base_model import get_db
-from app.models.user import PageParameter, UserStatus, UserInfo, LoginData
+from app.models.user import PageParameter, UserStatus, UserInfo, LoginData, UserPassword
 from app.models.user_model import UserModel
-from app.service.auth import is_valid_password
+from app.service.auth import is_valid_password, verify_password
 from app.service.user import get_user_list, edit_user_status, delete_user_data, create_user, edit_user_data, \
-    edit_user_pwd, get_user_info, get_user_routers, get_user_menus, get_user_permission, get_user_dept
+    edit_user_pwd, get_user_info, get_user_routers, get_user_menus, get_user_permission, get_user_dept, change_user_pwd, \
+    user_data_service
 
 user_router = APIRouter()
 
@@ -86,6 +86,21 @@
     return Response(code=200, msg="user pwd reset successfully", data={})
 
 
+@user_router.put("/change_password", response_model=Response)
+async def change_user_password(user: UserPassword,  current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
+    user_info = db.query(UserModel).filter(UserModel.id==current_user.id).first()
+    if not user_info:
+        return Response(code=401, msg="Incorrect change password !")
+    if not verify_password(user.oldPassword, user_info.hashed_password):
+        return Response(code=400, msg="Incorrect password !")
+    if not is_valid_password(user.newPassword):
+        return Response(code=400, msg="The password must be at least 8 and contain both numbers and letters")
+    is_edit = await change_user_pwd(db, user_info.id, user.newPassword)
+    if not is_edit:
+        return Response(code=500, msg="user pwd change failure", data={})
+    return Response(code=200, msg="user pwd change success", data={})
+
+
 @user_router.get("/user_info", response_model=Response)
 async def user_info(current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
     user_info = await get_user_info(db,  current_user.id)
@@ -119,4 +134,12 @@
 @user_router.get("/dept", response_model=Response)
 async def user_dept_api(userId:int, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
     menus = await get_user_dept(db, userId)
-    return Response(code=200, msg="successfully", data=menus)
\ No newline at end of file
+    return Response(code=200, msg="successfully", data=menus)
+
+
+@user_router.get("/user_data", response_model=Response)
+async def user_data_api(userId, current_user: UserModel = Depends(get_current_user),db=Depends(get_db)):
+    user_info = await user_data_service(db, userId)
+    if not user_info:
+        return Response(code=500, msg="user get failure", data={})
+    return Response(code=200, msg="successfully", data=user_info)
\ No newline at end of file
diff --git a/app/init_config/__init__.py b/app/init_config/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/init_config/__init__.py
diff --git a/app/init_config/init_run_data.py b/app/init_config/init_run_data.py
new file mode 100644
index 0000000..b562456
--- /dev/null
+++ b/app/init_config/init_run_data.py
@@ -0,0 +1,14 @@
+from app.models.base_model import SessionLocal
+from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync, app_register_sync, \
+    basic_agent_sync
+
+
+async def sync_default_data():
+    db = SessionLocal()
+    await dialog_menu_sync(db)  # 灏忔暟
+    await default_group_sync(db) # 榛樿缁�
+    await default_role_sync(db) # 榛樿瑙掕壊
+    await app_register_sync(db) # 娉ㄥ唽鐨勫簲鐢�
+    await basic_agent_sync(db) # 寮�鍙戠殑agent
+    # await default_role_sync(db)  # 椤甸潰璧勬簮閰嶇疆淇℃伅
+    # await default_role_sync(db)  # 榛樿鐨勮鑹茶祫婧�
\ No newline at end of file
diff --git a/app/models/dialog_model.py b/app/models/dialog_model.py
index 1934388..d8c7a7a 100644
--- a/app/models/dialog_model.py
+++ b/app/models/dialog_model.py
@@ -12,7 +12,7 @@
     __mapper_args__ = {
         # "order_by": 'SEQ'
     }
-    id = Column(String(32), primary_key=True)  #  id
+    id = Column(String(36), primary_key=True)  #  id
     create_date = Column(DateTime, default=datetime.now())             # 鍒涘缓鏃堕棿
     update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now())             # 鏇存柊鏃堕棿
     tenant_id = Column(String(32))              # 鍒涘缓浜�
@@ -20,8 +20,9 @@
     description = Column(Text)                 # 璇存槑
     icon = Column(Text)                         # 鍥炬爣
     status = Column(String(1), default="1")                 # 鐘舵��
-    dialog_type = Column(String(1))            #    # 骞冲彴
-    agent_id = Column(String(32))
+    dialog_type = Column(String(1))            #  骞冲彴
+    agent_id = Column(String(36))
+    mode = Column(String(36))
 
     def get_id(self):
         return str(self.id)
@@ -38,6 +39,7 @@
             'status': self.status,
             'agentType': self.dialog_type,
             'agentId': self.agent_id,
+            'mode': self.mode,
         }
 
 
@@ -73,6 +75,7 @@
     description: Optional[str] = ""
     dialogType: str
     icon: str
+    mode: str
 
 
 class dialogDataUpdate(BaseModel):
diff --git a/app/models/knowledge_model.py b/app/models/knowledge_model.py
index afc89e5..661423e 100644
--- a/app/models/knowledge_model.py
+++ b/app/models/knowledge_model.py
@@ -13,7 +13,7 @@
     __mapper_args__ = {
         # "order_by": 'SEQ'
     }
-    id = Column(String(32), primary_key=True)  # id
+    id = Column(String(36), primary_key=True)  # id
     name = Column(String(128))                 # 鍚嶇О
     create_date = Column(DateTime, default=datetime.now())             # 鍒涘缓鏃堕棿
     update_date = Column(DateTime, default=datetime.now(), onupdate=datetime.now())             # 鏇存柊鏃堕棿
diff --git a/app/models/menu_model.py b/app/models/menu_model.py
index 77c00d9..1832514 100644
--- a/app/models/menu_model.py
+++ b/app/models/menu_model.py
@@ -12,6 +12,7 @@
     desc = Column(String(1000))
     icon = Column(String(16))
     img = Column(String(255))
+    rank = Column(Integer)
 
 
     def to_dict(self):
@@ -36,4 +37,6 @@
     menu_id = Column(Integer)
     capacity_id = Column(String(36))
     capacity_type = Column(Integer)
+    chat_id = Column(String(36))
+    chat_type = Column(String(36))
 
diff --git a/app/models/role_model.py b/app/models/role_model.py
index 74d79dd..22f73c5 100644
--- a/app/models/role_model.py
+++ b/app/models/role_model.py
@@ -90,12 +90,12 @@
 
 
 class RoleStatus(BaseModel):
-    role_id: str
+    roleId: str
     status: constr(min_length=1, max_length=1, pattern='^(0|1)$')
 
 
 class RoleEdit(BaseModel):
-    role_id: str
+    roleId: str
     remark: Optional[str] = ""
     roleName: Optional[str] = ""
     resources: Optional[list] = []
diff --git a/app/models/token_model.py b/app/models/token_model.py
index aa37d12..43dd2d0 100644
--- a/app/models/token_model.py
+++ b/app/models/token_model.py
@@ -65,16 +65,16 @@
         if db_token:
             # 璁板綍瀛樺湪锛岃繘琛屾洿鏂�
             db_token.token = access_token
-            for k, v in token.items():
-                setattr(db_token, k.replace("app", "token"), v)
+            # for k, v in token.items():
+            #     setattr(db_token, k.replace("app", "token"), v)
         else:
             # 璁板綍涓嶅瓨鍦紝杩涜鎻掑叆
             db_token = TokenModel(
                 user_id=user_id,
                 token=access_token,
             )
-            for k, v in token.items():
-                setattr(db_token, k.replace("app", "token"), v)
+            # for k, v in token.items():
+            #     setattr(db_token, k.replace("app", "token"), v)
             db.add(db_token)
 
         # 鎻愪氦浜嬪姟
diff --git a/app/models/user.py b/app/models/user.py
index daff50c..1d96a23 100644
--- a/app/models/user.py
+++ b/app/models/user.py
@@ -46,3 +46,10 @@
     groups: Optional[list] = []
 
 
+
+class UserPassword(BaseModel):
+    # userId: int
+    newPassword: str
+    oldPassword: str
+
+
diff --git a/app/models/user_model.py b/app/models/user_model.py
index eeaf3e6..dcbb612 100644
--- a/app/models/user_model.py
+++ b/app/models/user_model.py
@@ -39,6 +39,7 @@
     sex = Column(String(1))
     permission = Column(String(16), default="general")
     age = Column(Integer)
+    sync_flag = Column(String(36))
     created_at = Column(DateTime, default=datetime.now())
     updated_at = Column(DateTime, default=datetime.now(), onupdate=datetime.now())
 
@@ -115,6 +116,7 @@
         for ogt in self.organizations:
             if ogt.id in ogt_set:
                 continue
+            print(ogt.id)
             ogt_set.add(ogt.id)
             for role in ogt.roles:
                 roles[role.id] = role.to_dict()
@@ -122,9 +124,12 @@
             while parent_ogt:
                 if parent_ogt.id not in ogt_set:
                     ogt_set.add(ogt.id)
-                    for role in ogt.roles:
+                    for role in parent_ogt.roles:
                         roles[role.id] = role.to_dict()
-                    parent_ogt = ogt.parent
+                    parent_ogt = parent_ogt.parent
+                else:
+                    break
+
         json['roles'] = list(roles.values())
         return json
 
@@ -220,9 +225,10 @@
             "app_type": self.app_type,
             'status': self.status,
         }
-
-    def encrypted_password(self, password):
+    @staticmethod
+    def encrypted_password(password):
         return cipher_suite.encrypt(password.encode("utf-8")).decode("utf-8")
 
-    def decrypted_password(self):
-        return cipher_suite.decrypt(self.password).decode("utf-8")
\ No newline at end of file
+    @staticmethod
+    def decrypted_password(password):
+        return cipher_suite.decrypt(password).decode("utf-8")
\ No newline at end of file
diff --git a/app/service/auth.py b/app/service/auth.py
index 4353fcd..8c41fe9 100644
--- a/app/service/auth.py
+++ b/app/service/auth.py
@@ -1,6 +1,8 @@
 import re
+import uuid
 from datetime import datetime, timedelta
 from typing import Type
+from uuid import uuid4
 
 from jwt import encode, decode, exceptions
 from passlib.context import CryptContext
@@ -69,12 +71,13 @@
     return has_digit is not None and has_letter is not None
 
 
-async def save_register_user(db, username, password, email, register_dict):
+async def save_register_user(db, username, password, email, app_password, register_dict):
     user_id = ""
+    sync_flag = str(uuid.uuid4())
     try:
         hashed_password = pwd_context.hash(password)
-        db_user = UserModel(username=username, hashed_password=hashed_password, email=email)
-        pwd = db_user.encrypted_password(password)
+        db_user = UserModel(username=username, hashed_password=hashed_password, email=email, sync_flag=sync_flag)
+        pwd = db_user.encrypted_password(app_password)
         db_user.password = pwd
         db_user.roles = [db.query(RoleModel).filter(RoleModel.role_type == 2).first()]
         db_user.groups = [db.query(GroupModel).filter(GroupModel.group_type == 2).first()]
@@ -92,7 +95,7 @@
             db.query(UserModel).filter(UserModel.id == user_id).delete()
             db.commit
         return False
-    return user_id
+    return sync_flag
 
 
 async def update_user_token(db, user_id, token_dict):
@@ -139,7 +142,7 @@
     # db.commit()
     # db.refresh(db_user)
 
-    is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict)
+    # is_sava = await save_register_user(db, user.username, user.password, user.email, register_dict)
 
 class UserAppDao:
     def __init__(self, db: Session):
diff --git a/app/service/dialog.py b/app/service/dialog.py
index fa678ce..8a1ccbc 100644
--- a/app/service/dialog.py
+++ b/app/service/dialog.py
@@ -90,9 +90,9 @@
 
 
 
-async def create_dialog_service(db, dialog_id, dialog_name, description, icon, dialog_type, user_id):
+async def create_dialog_service(db, dialog_id, dialog_name, description, icon, dialog_type, mode, user_id):
     try:
-        dialog_model = DialogModel(id=dialog_id,name=dialog_name, description=description,icon=icon, dialog_type=dialog_type, tenant_id=user_id, agent_id=dialog_id)
+        dialog_model = DialogModel(id=dialog_id,name=dialog_name, description=description,icon=icon, dialog_type=dialog_type, tenant_id=user_id, agent_id=dialog_id, mode=mode)
         db.add(dialog_model)
         db.commit()
         db.refresh(dialog_model)
diff --git a/app/service/role.py b/app/service/role.py
index fd7d91d..bc3e1af 100644
--- a/app/service/role.py
+++ b/app/service/role.py
@@ -12,9 +12,10 @@
     #     query.filter(RoleModel.creator==user_id)
     if keyword:
         query = query.filter(RoleModel.name.like('%{}%'.format(keyword)))
+    total = query.count()
     roles = query.order_by(RoleModel.id.desc()).limit(page_size).offset(
         (page_index - 1) * page_size).all()
-    return {"total": query.count(), "rows":  [role.to_json() for role in roles]}
+    return {"total": total, "rows":  [role.to_json() for role in roles]}
 
 
 async def create_role(db, role_name: str, description: str, role_key, data_scope, user_id):
diff --git a/app/service/service_token.py b/app/service/service_token.py
index dd6b1e3..7a2a695 100644
--- a/app/service/service_token.py
+++ b/app/service/service_token.py
@@ -11,24 +11,28 @@
 
 
 async def get_bisheng_token(db, user_id: int):
-    token = await UserAppDao(db).get_data_by_id(user_id, BISHENG)
+
+    token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
     if not token:
-        token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
+        token = await UserAppDao(db).get_data_by_id(user_id, BISHENG)
         if not token:
             return None
-    else:
         return token.access_token
-    return token.bisheng_token
+    else:
+        return token.bisheng_token
+
 
 async def get_ragflow_token(db, user_id: int):
-    token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW)
+    # token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW)
+    token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
     if not token:
-        token = db.query(TokenModel).filter(TokenModel.user_id == user_id).first()
+        token = await UserAppDao(db).get_data_by_id(user_id, RAGFLOW)
         if not token:
             return None
-    else:
         return token.access_token
-    return token.ragflow_token
+    else:
+        return token.ragflow_token
+
 
 async def get_dify_token(db, user_id: int):
 
@@ -42,11 +46,12 @@
     user = db.query(UserAppModel).filter(UserAppModel.user_id == user_id, UserAppModel.app_type==app_type).first()
     if not user:
         return None
+    pwd = user.password
     if app_type == RAGFLOW:
         ragflow_service = RagflowService(settings.fwr_base_url)
         # 鐧诲綍鍒皉agflow
         try:
-            ragflow_token = await ragflow_service.login(user.username, user.decrypted_password())
+            ragflow_token = await ragflow_service.login(user.username, user.decrypted_password(pwd))
             return ragflow_token
         except Exception as e:
             logger.error(e)
@@ -56,7 +61,7 @@
         bisheng_service = BishengService(settings.sgb_base_url)
         # 鐧诲綍鍒版瘯鏄�
         try:
-            bisheng_token = await bisheng_service.login(user.username, user.decrypted_password())
+            bisheng_token = await bisheng_service.login(user.username, user.decrypted_password(pwd))
             return bisheng_token
         except Exception as e:
             logger.error(e)
@@ -67,7 +72,7 @@
         dify_service = DifyService(settings.dify_base_url)
         # 鐧诲綍鍒版瘯鏄�
         try:
-            dify_token = await dify_service.login(user.username, user.decrypted_password())
+            dify_token = await dify_service.login(user.username, user.decrypted_password(pwd))
             return dify_token
         except Exception as e:
             logger.error(e)
@@ -86,15 +91,19 @@
     return res
 
 
-async def update_user_group(db, user_id):
+async def update_user_group(db, sync_flag):
     admin_user = db.query(UserModel).filter(UserModel.permission == "admin").first()
+    sync_user = db.query(UserModel).filter(UserModel.sync_flag == sync_flag).first()
+    if not admin_user or not sync_user:
+        logger.error("娉ㄥ唽鐢ㄦ埛澶辫触锛�--------")
+        return False
     token = await get_new_token(db, admin_user.id, RAGFLOW)
     # print(token)
     if not token:
         logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇token澶辫触锛�")
         return False
     user_list = db.query(UserAppModel).filter(UserAppModel.app_type==RAGFLOW).all()
-    user = db.query(UserAppModel).filter(UserAppModel.user_id==user_id, UserAppModel.app_type == RAGFLOW).first()
+    user = db.query(UserAppModel).filter(UserAppModel.userFlag==sync_user.id, UserAppModel.app_type == RAGFLOW).first()
     if not user:
         logger.error("娉ㄥ唽鐢ㄦ埛鑾峰彇淇℃伅澶辫触锛�")
         return False
diff --git a/app/service/user.py b/app/service/user.py
index a86047f..1ce7417 100644
--- a/app/service/user.py
+++ b/app/service/user.py
@@ -15,6 +15,7 @@
 from app.service.difyService import DifyService
 from app.service.ragflow import RagflowService
 from app.service.service_token import get_ragflow_token, get_bisheng_token, get_new_token, get_dify_token
+from app.utils.password_handle import generate_password
 
 
 async def get_user_list(db, page_index: int, page_size: int, keyword: str, role_key: str, user_id):
@@ -23,9 +24,10 @@
     #     query.filter(UserModel.creator==user_id)
     if keyword:
         query = query.filter(UserModel.username.like('%{}%'.format(keyword)))
+    total = query.count()
     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]}
+    return {"total": total, "rows": [user.to_json() for user in users]}
 
 
 async def edit_user_status(db, status: str, user_id: int):
@@ -52,39 +54,24 @@
 
 async def create_user(db, user_name, email, phone, login_name, password, roles, groups, user_id):
     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
         app_register = AppRegisterDao(db).get_apps()
         register_dict = {}
         token = ""
+        app_password = generate_password()
         for app in app_register:
             if app["id"] == RAGFLOW:
                 service = RagflowService(settings.fwr_base_url)
             elif app["id"] == BISHENG:
                 service = BishengService(settings.sgb_base_url)
             elif app["id"] == DIFY:
-                token = await get_dify_token()
+                token = await get_dify_token(db, user_id)
                 service = DifyService(settings.dify_base_url)
             else:
                 logger.error("鏈煡娉ㄥ唽搴旂敤---")
                 continue
             try:
                 name = app["id"] + str(int(time.time()))
-                register_info = await service.register(name, password, token)
+                register_info = await service.register(name, app_password, token)
                 # print(register_info)
                 register_dict[app['id']] = {"id": register_info.get("id"), "name": name,
                                             "email": register_info.get("email")}
@@ -98,7 +85,7 @@
         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)
-        pwd = user_model.encrypted_password(password)
+        pwd = user_model.encrypted_password(app_password)
         user_model.roles = [db.get(RoleModel, roleId) for roleId in roles]
         user_model.password = pwd
         if groups:
@@ -126,7 +113,7 @@
         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]
+        # user.groups = [db.get(GroupModel, groupId) for groupId in groups]
         db.commit()
     except Exception as e:
         logger.error(e)
@@ -138,26 +125,38 @@
 async def edit_user_pwd(db, user_id, current_user_id, new_password="basic123456"):
     try:
         user = db.query(UserModel).filter(UserModel.id == user_id).first()
-        pwd = user.decrypted_password()
-        for app in AppRegisterDao(db).get_apps():
-            if app.get("id") == RAGFLOW:
-                token = await get_new_token(db, user_id, app.get("id"))
-                ragflow_service = RagflowService(settings.fwr_base_url)
-                await ragflow_service.set_user_password(token, pwd, new_password)
-            elif app.get("id") == BISHENG:
-                token = await get_bisheng_token(db, current_user_id)
-                bisheng_service = BishengService(settings.sgb_base_url)
-                await bisheng_service.change_password_public(token, user.username, pwd, new_password)
-            else:
-                logger.error("娉ㄥ唽鏈煡搴旂敤锛歿}".format(app.get("id")))
+        # pwd = user.decrypted_password()
+        # for app in AppRegisterDao(db).get_apps():
+        #     if app.get("id") == RAGFLOW:
+        #         token = await get_new_token(db, user_id, app.get("id"))
+        #         ragflow_service = RagflowService(settings.fwr_base_url)
+        #         await ragflow_service.set_user_password(token, pwd, new_password)
+        #     elif app.get("id") == BISHENG:
+        #         token = await get_bisheng_token(db, current_user_id)
+        #         bisheng_service = BishengService(settings.sgb_base_url)
+        #         await bisheng_service.change_password_public(token, user.username, pwd, new_password)
+        #     else:
+        #         logger.error("娉ㄥ唽鏈煡搴旂敤锛歿}".format(app.get("id")))
         user.hashed_password = pwd_context.hash(new_password)
-        user.password = user.encrypted_password(new_password)
+        # user.password = user.encrypted_password(new_password)
         db.commit()
     except Exception as e:
         logger.error(e)
         db.rollback()
         return False
     return True
+
+async def change_user_pwd(db, user_id, new_password):
+    try:
+        user = db.query(UserModel).filter(UserModel.id == user_id).first()
+        user.hashed_password = pwd_context.hash(new_password)
+        db.commit()
+    except Exception as e:
+        logger.error(e)
+        db.rollback()
+        return False
+    return True
+
 
 
 async def get_user_info(db, user_id):
@@ -223,7 +222,9 @@
             if parent_ogt.id not in dept_set:
                 await role_resource(role_set, permissions, parent_ogt.roles)
                 dept_set.add(parent_ogt.id)
-            parent_ogt = parent_ogt.parent
+                parent_ogt = parent_ogt.parent
+            else:
+                break
     tmp_dit = {}
     for permission in permissions.values():
         tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission]
@@ -238,17 +239,14 @@
 
 async def get_user_menus(db, user_id):
     dialog_list = []
-    agent_list = []
     menu_dict = {}
     res = []
     user = db.query(UserModel).filter_by(id=user_id).first()
     for group in user.groups:
         for dialog in group.dialogs:
             dialog_list.append(dialog.id)
-        for agent in group.agents:
-            agent_list.append(agent.id)
-    menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc,
-                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, DialogModel.agent_id.label("agentId")).outerjoin(
+    menu_list = db.query(WebMenuModel.id, WebMenuModel.title, WebMenuModel.describe, WebMenuModel.icon, WebMenuModel.desc,WebMenuModel.rank,
+                         WebMenuModel.img, MenuCapacityModel.capacity_id, MenuCapacityModel.capacity_type, MenuCapacityModel.chat_id.label("agentId")).outerjoin(
         MenuCapacityModel, WebMenuModel.id == MenuCapacityModel.menu_id).outerjoin(
         DialogModel, MenuCapacityModel.capacity_id == DialogModel.id).filter(DialogModel.status=="1").all()
 
@@ -262,8 +260,6 @@
                 continue
             elif not m.capacity_type or m.capacity_type == 1 and m.capacity_id not in dialog_list:
                 break
-            elif not m.capacity_type or m.capacity_type == 2 and m.capacity_id not in agent_list:
-                break
         else:
             res.append({
             'id': menus[0].id,
@@ -272,9 +268,10 @@
             'img': menus[0].img,
             'desc': menus[0].desc,
             'dialog': menus[0].describe,
-            'agentId': menus[0].agentId
+            'agentId': menus[0].agentId,
+            'rank': menus[0].rank
         })
-    return res
+    return sorted(res, key=lambda x: x['rank'], reverse=True)
 
 
 async def get_user_permission(db,  user_id):
@@ -286,7 +283,7 @@
     knowledge_dict = {}
     user = db.query(UserModel).filter_by(id=user_id).first()
     parent_id = ""
-    print(111111111111111)
+    # print(111111111111111)
     async def role_resource(role_set, permissions, roles):
         nonlocal parent_id
         for role in roles:
@@ -311,7 +308,9 @@
                 await role_resource(role_set, permissions, parent_ogt.roles)
                 dept_set.add(parent_ogt.id)
 
-            parent_ogt = parent_ogt.parent
+                parent_ogt = parent_ogt.parent
+            else:
+                break
 
     tmp_dit = {}
     for permission in permissions.values():
@@ -337,4 +336,11 @@
     res = {}
     user = db.query(UserModel).filter_by(id=user_id).first()
     res["rows"] = [i.to_dict() for i in user.organizations]
-    return res
\ No newline at end of file
+    return res
+
+
+async def user_data_service(db, user_id):
+    user = db.query(UserModel).filter_by(id=user_id).first()
+
+
+    return {"roles": [i.to_dict() for i in user.roles], "user": user.to_dict()}
\ No newline at end of file
diff --git a/app/service/v2/initialize_data.py b/app/service/v2/initialize_data.py
index 4929401..b5f2002 100644
--- a/app/service/v2/initialize_data.py
+++ b/app/service/v2/initialize_data.py
@@ -1,7 +1,8 @@
 import json
 
 from Log import logger
-from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel
+from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel, DialogModel, UserModel
+from app.service.v2.app_register import AppRegisterDao
 
 
 async def dialog_menu_sync(db):
@@ -17,13 +18,9 @@
 
     for menu in menu_list:
         # print(menu)
-        agent = menu.pop("agent", [])
-        for i in agent:
-            capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i, capacity_type=2)
-            db.add(capacity)
         dialog = menu.pop("dialog", [])
         for i in dialog:
-            capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i, capacity_type=1)
+            capacity = MenuCapacityModel(menu_id=menu["id"], capacity_id=i["id"], capacity_type=i["agentType"], chat_id=i["id"] if not i["chat_id"] else i["chat_id"], chat_type=i["chat_type"])
             db.add(capacity)
         menu_obj = WebMenuModel(**menu)
         db.add(menu_obj)
@@ -53,4 +50,46 @@
             db.add(group)
             db.commit()
         except Exception as e:
-            logger.error(e)
\ No newline at end of file
+            logger.error(e)
+
+
+async def app_register_sync(db):
+    app_dict = {}
+    with open("env_conf/app_register_conf.json", 'r', encoding='utf-8') as file:
+        # 鍔犺浇JSON鏁版嵁
+        app_dict = json.load(file)
+        try:
+            for app_id, status in app_dict.items():
+                AppRegisterDao(db).update_and_insert_app(app_id, status)
+        except Exception as e:
+            logger.error(e)
+
+
+async def basic_agent_sync(db):
+    agent_list = []
+    with open("env_conf/default_agent_conf.json", 'r', encoding='utf-8') as file:
+        # 鍔犺浇JSON鏁版嵁
+        agent_dict = json.load(file)
+        agent_list = agent_dict.get("basic", [])
+    user = db.query(UserModel).filter_by(permission="admin").first()
+    for agent in agent_list:
+        dialog = db.query(DialogModel).filter(DialogModel.id==agent["id"]).first()
+        if dialog:
+            try:
+                dialog.name = agent["name"]
+                dialog.description = agent["description"]
+                dialog.icon = agent["icon"]
+                db.commit()
+            except Exception as e:
+                logger.error(e)
+        else:
+            try:
+                dialog = DialogModel(id=agent["id"], name=agent["name"], description=agent["description"],
+                                     icon=agent["icon"], tenant_id=user.id if user else "", dialog_type="3",
+                                     agent_id=agent["id"])
+                db.add(dialog)
+                db.commit()
+                db.refresh(dialog)
+            except Exception as e:
+                print(e)
+                db.rollback()
\ No newline at end of file
diff --git a/app/task/fetch_agent.py b/app/task/fetch_agent.py
index 0f4fe22..991c0d0 100644
--- a/app/task/fetch_agent.py
+++ b/app/task/fetch_agent.py
@@ -1,14 +1,12 @@
 from typing import Dict, List, Tuple
 
 from sqlalchemy import create_engine, Column, String, Integer
-from sqlalchemy.dialects.postgresql import array
 from sqlalchemy.exc import IntegrityError
 from sqlalchemy.orm import sessionmaker
 
 from app.config.config import settings
 from app.models.agent_model import AgentModel
 from app.models.base_model import SessionLocal, Base
-from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync
 
 # 鍒涘缓鏁版嵁搴撳紩鎿庡拰浼氳瘽宸ュ巶
 engine_bisheng = create_engine(settings.sgb_db_url)
@@ -151,13 +149,5 @@
         print(f"Failed to sync agents: {str(e)}")
 
 
-async def sync_web_menu():
-    db = SessionLocal()
-    await dialog_menu_sync(db)
 
-
-async def sync_default_data():
-    db = SessionLocal()
-    await default_group_sync(db)
-    await default_role_sync(db)
 
diff --git a/app/utils/password_handle.py b/app/utils/password_handle.py
new file mode 100644
index 0000000..8852a11
--- /dev/null
+++ b/app/utils/password_handle.py
@@ -0,0 +1,31 @@
+import asyncio
+import random
+import string
+
+
+async def generate_password(length=10):
+    if length < 6:  # 鑷冲皯闇�瑕�3浣嶅瘑鐮佷互鍖呭惈鎵�鏈夊繀瑕佺殑瀛楃
+        raise ValueError("Password length should be at least 3")
+
+    # 纭繚瀵嗙爜涓嚦灏戝寘鍚竴涓瓧姣嶅拰涓�涓暟瀛�
+    password = [
+        random.choice(string.ascii_uppercase),  # 澶у啓瀛楁瘝
+        random.choice(string.ascii_lowercase),  # 灏忓啓瀛楁瘝
+        random.choice(string.digits)  # 鏁板瓧
+    ]
+
+    # 娣诲姞鍓╀綑鐨勯殢鏈哄瓧绗�
+    characters = string.ascii_letters + string.digits
+    password.extend(random.choice(characters) for _ in range(length - 3))
+
+    # 鎵撲贡瀵嗙爜浠ョ‘淇濋殢鏈烘��
+    random.shuffle(password)
+
+    # 灏嗗垪琛ㄨ浆鎹负瀛楃涓�
+    return ''.join(password)
+
+if __name__ == "__main__":
+    # 鐢熸垚涓�涓�10浣嶇殑瀵嗙爜
+    asyncio.run(generate_password(10))
+    # password = generate_password(10)
+    # print(password)
\ No newline at end of file
diff --git a/env_conf/api_key_conf.json b/env_conf/api_key_conf.json
new file mode 100644
index 0000000..8a5b98e
--- /dev/null
+++ b/env_conf/api_key_conf.json
@@ -0,0 +1,5 @@
+{
+  "image_and_text_conversion": "",
+  "document_to_report": "",
+  "document_to_cleaning": ""
+}
\ No newline at end of file
diff --git a/env_conf/app_register_conf.json b/env_conf/app_register_conf.json
new file mode 100644
index 0000000..75cbbbb
--- /dev/null
+++ b/env_conf/app_register_conf.json
@@ -0,0 +1,5 @@
+{
+  "bisheng_app": 1,
+  "dify_app": 1,
+  "ragflow_app": 1
+}
\ No newline at end of file
diff --git a/env_conf/default_agent_conf.json b/env_conf/default_agent_conf.json
new file mode 100644
index 0000000..70c35f7
--- /dev/null
+++ b/env_conf/default_agent_conf.json
@@ -0,0 +1,33 @@
+{
+  "basic": [
+    {
+      "id": "basic_excel_merge",
+      "name": "鎶ヨ〃鍚堝苟",
+      "description": "鎶ヨ〃鍚堝苟",
+      "icon": "intellFrame4",
+      "agentType": "excelMerge"
+    },
+    {
+      "id": "basic_excel_talk",
+      "name": "鏅鸿兘鏁版嵁",
+      "description": "鏅鸿兘鏁版嵁",
+      "icon": "intellFrame4",
+      "agentType": "excelTalk"
+    },
+    {
+      "id": "basic_question_talk",
+      "name": "鍑洪缁勫嵎",
+      "description": "鍑洪缁勫嵎",
+      "icon": "intellFrame4",
+      "agentType": "questionTalk"
+    },
+    {
+      "id": "basic_paper_talk",
+      "name": "鏂囨。鍑哄嵎",
+      "description": "鏂囨。鍑哄嵎",
+      "icon": "intellFrame4",
+      "agentType": "paperTalk"
+    }
+  ],
+  "bs": []
+}
\ No newline at end of file
diff --git a/env_conf/menu_conf.json b/env_conf/menu_conf.json
index 8376abd..6139123 100644
--- a/env_conf/menu_conf.json
+++ b/env_conf/menu_conf.json
@@ -7,8 +7,15 @@
       "img": "/src/assets/index/2.png",
       "desc": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜岀煡璇嗗簱涓殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��",
       "describe": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜岀煡璇嗗簱涓殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��",
-      "agent" : [],
-      "dialog": ["1"]
+      "rank": 100,
+      "dialog": [
+        {
+          "id": "1",
+          "chat_id": "",
+          "chat_type": "report",
+          "agentType": 2
+        }
+      ]
     },
     {
       "id": 1,
@@ -17,8 +24,15 @@
       "img": "/src/assets/index/6.png",
       "desc": "鍩轰簬鎮ㄤ笂浼犵殑鎶ヨ〃杩涜鍚堝苟锛屽姪鎮ㄥ揩閫熷畬鎴愭姤琛ㄦ暣鍚堜笌鍒嗘瀽",
       "describe": "鍩轰簬鎮ㄤ笂浼犵殑鎶ヨ〃杩涜鍚堝苟锛屽姪鎮ㄥ揩閫熷畬鎴愭姤琛ㄦ暣鍚堜笌鍒嗘瀽",
-      "agent" : [],
-      "dialog": ["2"]
+      "dialog": [
+        {
+          "id": "2",
+          "chat_id": "",
+          "chat_type": "excelMerge",
+          "agentType": 1
+        }
+      ],
+      "rank": 99
     },
     {
       "id": 2,
@@ -27,7 +41,7 @@
       "img": "/src/assets/index/5.png",
       "desc": "閬嶅巻宸插垱寤虹殑鏂囨。鐭ヨ瘑搴擄紝鐢熸垚瀹屾暣鍜屽噯纭殑绛旀锛屽悓鏃舵樉绀烘潵婧愭枃妗d緵鎮ㄥ弬鑰�",
       "describe": "鍨傚煙鐭ヨ瘑鐨勯棶绛斿姪鎵嬶紝閽堝浣犵殑鎻愰棶锛屾垜浠皢閬嶅巻宸插垱寤虹殑鏂囨。鐭ヨ瘑搴擄紝鐢熸垚瀹屾暣鍜屽噯纭殑绛旀锛屽悓鏃舵樉绀烘潵婧愭枃妗d緵鎮ㄥ弬鑰冦��",
-      "agent" : [],
+      "rank": 98,
       "dialog": []
     },
     {
@@ -37,8 +51,15 @@
       "img": "/src/assets/index/7.png",
       "desc": "涓汉鐭ヨ瘑搴撶殑闂瓟鍔╂墜锛屽熀浜庢偍涓婁紶鐨勬枃妗h繘琛岄棶绛旓紝鏀寔澶氭枃妗�",
       "describe": "涓汉鐭ヨ瘑搴撶殑闂瓟鍔╂墜锛屽熀浜庢偍涓婁紶鐨勬枃妗h繘琛岄棶绛旓紝鏀寔澶氭枃妗o紝澶у皬鍦�30M浠ュ唴銆�",
-      "agent" : [],
-      "dialog": ["3"]
+      "rank": 97,
+      "dialog": [
+        {
+          "id": "3",
+          "chat_id": "",
+          "chat_type": "report",
+          "agentType": 1
+        }
+      ]
     },
     {
       "id": 4,
@@ -47,7 +68,7 @@
       "img": "/src/assets/index/1.png",
       "desc": "鑳藉鐞嗚В鍜屽涔犱汉绫荤殑璇█锛屽叿澶囧杞璇濈殑鑳藉姏",
       "describe": "鎴戝彲浠ョ悊瑙e拰瀛︿範浜虹被鐨勮瑷�锛屽叿澶囧杞璇濈殑鑳藉姏锛岀幇鍦ㄥ拰鎴戝紑濮嬩氦娴佸惂锝�",
-      "agent" : [],
+      "rank": 96,
       "dialog": []
     },
     {
@@ -57,7 +78,7 @@
       "img": "/src/assets/index/8.png",
       "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗f垨娣诲姞鏁版嵁搴撳湴鍧�锛屽皬鏁板彲閽堝浣犳枃妗g殑鏁版嵁杩涜鍒嗘瀽锛屽苟鐢熸垚鎸囧畾鐨勫浘琛�",
       "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗f垨娣诲姞鏁版嵁搴撳湴鍧�锛屽皬鏁板彲閽堝浣犳枃妗g殑鏁版嵁杩涜鍒嗘瀽锛屽苟鐢熸垚鎸囧畾鐨勫浘琛�",
-      "agent" : ["3", "4"],
+      "rank": 95,
       "dialog": []
     },
     {
@@ -67,7 +88,7 @@
       "img": "/src/assets/index/7.png",
       "desc": "鍩轰簬鎮ㄤ笂浼犵殑鍥剧墖锛岀敓鎴愬搴旂殑鏂囧瓧鎻忚堪骞跺熀浜庡浘鐗囧唴瀹瑰疄鐜伴棶绛斻��",
       "describe": "鍩轰簬鎮ㄤ笂浼犵殑鍥剧墖锛岀敓鎴愬搴旂殑鏂囧瓧鎻忚堪骞跺熀浜庡浘鐗囧唴瀹瑰疄鐜伴棶绛斻��",
-      "agent" : ["3"],
+      "rank": 94,
       "dialog": []
     },
     {
@@ -77,7 +98,7 @@
       "img": "/src/assets/index/6.png",
       "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�",
       "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�",
-      "agent" : [],
+      "rank": 93,
       "dialog": []
     },
     {
@@ -87,7 +108,7 @@
       "img": "/src/assets/index/6.png",
       "desc": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�",
       "describe": "鎮ㄥ彲浠ヤ笂浼犳枃妗o紝灏忔暟鑳介拡瀵瑰崟鏂囨。鎴栧涓枃妗e唴瀹硅嚜鍔ㄥ嚭棰橈紝楂樻晥渚挎嵎鐨勫府鍔╀綘寤虹珛绉佷汉棰樺簱銆�",
-      "agent" : ["4"],
+      "rank": 92,
       "dialog": []
     },
     {
@@ -97,8 +118,21 @@
       "img": "/src/assets/index/2.png",
       "desc": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜屼笂浼犵殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��",
       "describe": "鍩轰簬鎮ㄥ垱寤虹殑鎶ュ憡鏍煎紡鍜屼笂浼犵殑鏂囨。鍐呭锛屽揩閫熺敓鎴愬畾鍒舵姤鍛婏紝骞舵敮鎸佷竴閿笅杞姐��",
-      "agent" : [],
-      "dialog": []
+      "rank": 91,
+      "dialog": [
+        {
+          "id": "basic_excel_merge",
+          "chat_id": "basic_report_clean",
+          "chat_type": "reportWorkflow",
+          "agentType": 4
+        },
+        {
+          "id": "basic_paper_talk",
+          "chat_id": "basic_report_clean",
+          "chat_type": "reportWorkflow",
+          "agentType": 4
+        }
+      ]
     }
   ]
 }
\ No newline at end of file
diff --git a/main.py b/main.py
index a9e4f0f..d3bac9a 100644
--- a/main.py
+++ b/main.py
@@ -22,7 +22,8 @@
 from app.api.user import user_router
 from app.api.group import group_router
 from app.api.role import role_router
-from app.task.fetch_agent import sync_agents, initialize_agents, sync_web_menu, sync_default_data
+from app.task.fetch_agent import sync_agents, initialize_agents
+from app.init_config.init_run_data import sync_default_data
 
 
 # 浣跨敤 Lifespan 浜嬩欢澶勭悊绋嬪簭
@@ -33,7 +34,6 @@
     # 鍦ㄥ簲鐢ㄥ惎鍔ㄦ椂鍚屾浠g悊
     sync_agents()
     await sync_default_data()
-    await sync_web_menu()
     yield
     # 鍦ㄥ簲鐢ㄥ叧闂椂鎵ц娓呯悊鎿嶄綔锛堝鏋滈渶瑕侊級
     pass

--
Gitblit v1.8.0