Quellcode durchsuchen

会话菜单增加

zhaoqingang vor 1 Jahr
Ursprung
Commit
c7d5be908e

+ 32 - 0
alembic/versions/2f304d60542b_zhishiku_type_add.py

@@ -0,0 +1,32 @@
+"""ZHISHIKU type add 
+
+Revision ID: 2f304d60542b
+Revises: d8f96e825884
+Create Date: 2024-12-10 18:04:36.301693
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = '2f304d60542b'
+down_revision: Union[str, None] = 'd8f96e825884'
+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('knowledgebase', sa.Column('documents', sa.Integer(), nullable=True))
+    op.add_column('knowledgebase', sa.Column('icon', sa.String(length=128), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('knowledgebase', 'icon')
+    op.drop_column('knowledgebase', 'documents')
+    # ### end Alembic commands ###

+ 30 - 0
alembic/versions/d8f96e825884_role_type_add.py

@@ -0,0 +1,30 @@
+"""role type add 
+
+Revision ID: d8f96e825884
+Revises: f49ae5b5f2c8
+Create Date: 2024-12-10 17:03:38.366156
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'd8f96e825884'
+down_revision: Union[str, None] = 'f49ae5b5f2c8'
+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('role', sa.Column('role_type', sa.Integer(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade() -> None:
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('role', 'role_type')
+    # ### end Alembic commands ###

+ 7 - 2
app/api/dialog.py

@@ -11,6 +11,11 @@ dialog_router = APIRouter()
 
 
 @dialog_router.get("/list", response_model=Response)
-async def dialog_list(current_user: UserModel = Depends(get_current_user),
+async def dialog_list(current: int,
+                      pageSize: int,
+                      keyword: str = "",
+                      current_user: UserModel = Depends(get_current_user),
                       db=Depends(get_db)):
-    return Response(code=200, msg="", data=await get_dialog_list(db, current_user.id))
+    if current and not pageSize:
+        return ResponseList(code=400, msg="缺少参数")
+    return Response(code=200, msg="", data=await get_dialog_list(db, current_user.id, keyword, pageSize, current))

+ 3 - 1
app/api/group.py

@@ -36,7 +36,7 @@ async def edit_group(group: GroupData, current_user: UserModel = Depends(get_cur
     if not group.group_name:
         return Response(code=400, msg="The group_name cannot be empty!")
     db_group = db.query(GroupModel).filter(GroupModel.group_name == group.group_name).first()
-    if db_group:
+    if db_group and db_group.id != group.id:
         return Response(code=200, msg="group_name already created")
     is_edit = await edit_group_data(db, group.id,
                                     {"group_name": group.group_name, "group_description": group.group_description,
@@ -65,6 +65,8 @@ async def delete_group(groupId, current_user: UserModel = Depends(get_current_us
     db_group = db.query(GroupModel).filter(GroupModel.id == groupId).first()
     if not db_group:
         return Response(code=200, msg="group does not exist")
+    if db_group.group_type ==2:
+        return Response(code=400, msg="默认组无法删除!")
     is_edit = await delete_group_data(db, groupId)
     if not is_edit:
         return Response(code=200, msg="group delete failure", data={})

+ 2 - 1
app/api/knowledge.py

@@ -13,10 +13,11 @@ knowledge_router = APIRouter()
 async def knowledge_list(
         current: int,
         pageSize: int,
+        keyword: str="",
         current_user: UserModel = Depends(get_current_user),
         db=Depends(get_db)):
     if current and not pageSize:
         return ResponseList(code=400, msg="缺少参数")
-    getknowledgelist = await get_knowledge_list(db, current_user.id, pageSize, current)
+    getknowledgelist = await get_knowledge_list(db, current_user.id, keyword, pageSize, current)
 
     return Response(code=200, msg="", data=getknowledgelist)

+ 2 - 0
app/api/role.py

@@ -34,6 +34,8 @@ async def delete_group(role_id: str, current_user: UserModel = Depends(get_curre
     db_role = db.query(RoleModel).filter(RoleModel.id == role_id).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)
     if not is_edit:
         return Response(code=500, msg="role delete failure", data={})

+ 1 - 1
app/models/dialog_model.py

@@ -28,7 +28,7 @@ class DialogModel(Base):
             'id': self.id,
             'create_date': self.create_date,
             'update_date': self.update_date,
-            'tenant_id': self.tenant_id,
+            'user_id': self.tenant_id,
             'name': self.name,
             'description': self.description,
             'icon': self.icon,

+ 5 - 2
app/models/knowledge_model.py

@@ -21,6 +21,8 @@ class KnowledgeModel(Base):
     tenant_id = Column(String(32))              # 创建人id
     description = Column(Text)                 # 说明
     status = Column(String(1))                    # 状态
+    documents = Column(Integer, default=0)                    # 文档
+    icon = Column(String(128))                    # 文档
     # kld_type = Column(String(1))                  # 知识库平台
 
 
@@ -34,10 +36,11 @@ class KnowledgeModel(Base):
             'create_time': self.create_date,
             'update_time': self.update_date,
             'avatar': self.avatar,
-            'tenant_id': self.tenant_id,
+            'user_id': self.tenant_id,
             'description': self.description,
             'status': self.status,
-            # 'kld_type': self.kld_type
+            'documents': self.documents,
+            'icon': self.icon
         }
     def __repr__(self):
         return '<Knowledge name:%r url:%r>\n' % (self.name, self.id)

+ 1 - 0
app/models/role_model.py

@@ -27,6 +27,7 @@ class RoleModel(Base):
     dataScope = Column(Integer)
     status = Column(String(10), default="0")
     creator = Column(Integer)
+    role_type = Column(Integer, default=1)
 
     # 包含资源
     resources = relationship('ResourceModel',

+ 4 - 1
app/service/auth.py

@@ -9,6 +9,7 @@ from sqlalchemy.orm import Session
 
 from Log import logger
 from app.config.config import settings
+from app.models import RoleModel, GroupModel
 from app.models.user_model import UserModel, UserAppModel
 
 SECRET_KEY = settings.secret_key
@@ -71,7 +72,8 @@ async def save_register_user(db, username, password, email, register_dict):
         db_user = UserModel(username=username, hashed_password=hashed_password, email=email)
         pwd = db_user.encrypted_password(password)
         db_user.password = pwd
-        db.add(db_user)
+        db_user.roles = [db.query(RoleModel).filter(RoleModel.role_type == 2).first()]
+        db_user.groups = [db.query(GroupModel).filter(GroupModel.group_type == 2).first()]
         db.add(db_user)
         db.commit()
         db.refresh(db_user)
@@ -84,6 +86,7 @@ async def save_register_user(db, username, password, email, register_dict):
         # db.roolback()
         if user_id:
             db.query(UserModel).filter(UserModel.id == user_id).delete()
+            db.commit
         return False
     return True
 

+ 17 - 2
app/service/dialog.py

@@ -5,7 +5,7 @@ from app.models.user_model import UserModel
 from Log import logger
 
 
-async def get_dialog_list(db, user_id):
+async def get_dialog_list(db, user_id, keyword, page_size, page_index):
     user = db.query(UserModel).filter(UserModel.id == user_id).first()
     if user is None:
         return {"rows": []}
@@ -23,7 +23,22 @@ async def get_dialog_list(db, user_id):
                 group_dialog_table.c.group_id.in_(group_list)
             )
         )
-    return {"rows": [kld.to_json() for kld in query.all()]}
+    if keyword:
+        query = query.filter(DialogModel.name.like('%{}%'.format(keyword)))
+    total = query.count()
+    if page_size:
+        query = query.limit(page_size).offset((page_index - 1) * page_size)
+
+    rows = []
+    user_id_set = set()
+    for kld in query.all():
+        user_id_set.add(kld.tenant_id)
+        rows.append(kld.to_json())
+    print(rows)
+    user_dict = {i.id: i.to_dict() for i in db.query(UserModel).filter(UserModel.id.in_(user_id_set)).all()}
+    for r in rows:
+        r["user"] = user_dict.get(r["user_id"], {})
+    return {"total":  total, "rows": rows}
 
 
 async def update_session_history(db, data: dict, user_id):

+ 8 - 4
app/service/knowledge.py

@@ -3,7 +3,7 @@ from app.models.user_model import UserModel
 from Log import logger
 
 
-async def get_knowledge_list(db, user_id, page_size, page_index):
+async def get_knowledge_list(db, user_id, keyword, page_size, page_index):
     user = db.query(UserModel).filter(UserModel.id == user_id).first()
     if user is None:
         return {"rows": []}
@@ -13,6 +13,7 @@ async def get_knowledge_list(db, user_id, page_size, page_index):
         group_list = [i.id for i in user.groups]
         query = db.query(KnowledgeModel)
         query = query.filter(KnowledgeModel.tenant_id == user_id)
+
         query = query.union(
             db.query(KnowledgeModel).join(
                 group_knowledge_table,
@@ -21,6 +22,9 @@ async def get_knowledge_list(db, user_id, page_size, page_index):
                 group_knowledge_table.c.group_id.in_(group_list)
             )
         )
-        if page_size:
-            query = query.limit(page_size).offset((page_index - 1) * page_size)
-    return {"rows": [kld.to_json() for kld in query.all()]}
+    if keyword:
+        query = query.filter(KnowledgeModel.name.like('%{}%'.format(keyword)))
+    total = query.count()
+    if page_size:
+        query = query.limit(page_size).offset((page_index - 1) * page_size)
+    return {"total":  total, "rows": [kld.to_json() for kld in query.all()]}

+ 22 - 2
app/service/v2/initialize_data.py

@@ -1,7 +1,7 @@
 import json
 
 from Log import logger
-from app.models import MenuCapacityModel, WebMenuModel, GroupModel
+from app.models import MenuCapacityModel, WebMenuModel, GroupModel, RoleModel
 
 
 async def dialog_menu_sync(db):
@@ -33,4 +33,24 @@ async def dialog_menu_sync(db):
 async def default_group_sync(db):
     group = db.query(GroupModel).filter_by(group_type=2).first()
     if not group:
-        logger.error("未初始化")
+        logger.error("未初始默认组, 开始初始化!")
+
+        try:
+            group = GroupModel(group_name="默认用户组", group_description="默认组", group_type=2)
+            db.add(group)
+            db.commit()
+        except Exception as e:
+            logger.error(e)
+
+
+async def default_role_sync(db):
+    role = db.query(RoleModel).filter_by(role_type=2).first()
+    if not role:
+        logger.error("未初始默认角色, 开始初始化!")
+
+        try:
+            group = RoleModel(id="morenjuese1234567890", name="默认角色", description="默认角色", role_type=2)
+            db.add(group)
+            db.commit()
+        except Exception as e:
+            logger.error(e)

+ 5 - 3
app/task/fetch_agent.py

@@ -8,7 +8,7 @@ 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
+from app.service.v2.initialize_data import dialog_menu_sync, default_group_sync, default_role_sync
 
 # 创建数据库引擎和会话工厂
 engine_bisheng = create_engine(settings.sgb_db_url)
@@ -156,6 +156,8 @@ async def sync_web_menu():
     await dialog_menu_sync(db)
 
 
-async def sync_default_group():
+async def sync_default_data():
     db = SessionLocal()
-    await dialog_menu_sync(db)
+    await default_group_sync(db)
+    await default_role_sync(db)
+

+ 2 - 2
main.py

@@ -21,7 +21,7 @@ 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
-from app.task.fetch_agent import sync_agents, initialize_agents, sync_web_menu
+from app.task.fetch_agent import sync_agents, initialize_agents, sync_web_menu, sync_default_data
 
 
 # 使用 Lifespan 事件处理程序
@@ -31,7 +31,7 @@ async def lifespan(app: FastAPI):
     initialize_agents()
     # 在应用启动时同步代理
     sync_agents()
-    await sync_default_group()
+    await sync_default_data()
     await sync_web_menu()
     yield
     # 在应用关闭时执行清理操作(如果需要)