diff --git a/backend/apps/api.py b/backend/apps/api.py index f1fe6686..27d5f989 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -8,7 +8,7 @@ from apps.system.api import login, user, aimodel, workspace, assistant, parameter, apikey from apps.terminology.api import terminology from apps.settings.api import base -#from apps.audit.api import audit_api +#from audit.api import audit_api api_router = APIRouter() diff --git a/backend/apps/chat/api/chat.py b/backend/apps/chat/api/chat.py index ec7ade56..6ff1b6e7 100644 --- a/backend/apps/chat/api/chat.py +++ b/backend/apps/chat/api/chat.py @@ -71,6 +71,11 @@ def inner(): @router.post("/rename", response_model=str, summary=f"{PLACEHOLDER_PREFIX}rename_chat") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.CHAT, + resource_id_expr="chat.id" +)) async def rename(session: SessionDep, chat: RenameChat): try: return rename_chat(session=session, rename_object=chat) diff --git a/backend/apps/dashboard/api/dashboard_api.py b/backend/apps/dashboard/api/dashboard_api.py index 6a5ad485..06921a8e 100644 --- a/backend/apps/dashboard/api/dashboard_api.py +++ b/backend/apps/dashboard/api/dashboard_api.py @@ -26,6 +26,11 @@ async def create_resource_api(session: SessionDep, user: CurrentUser, dashboard: @router.post("/update_resource", response_model=BaseDashboard) +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.DASHBOARD, + resource_id_expr="dashboard.id" +)) async def update_resource_api(session: SessionDep, user: CurrentUser, dashboard: QueryDashboard): return update_resource(session=session, user=user, dashboard=dashboard) diff --git a/backend/apps/data_training/api/data_training.py b/backend/apps/data_training/api/data_training.py index b072f244..f11596c8 100644 --- a/backend/apps/data_training/api/data_training.py +++ b/backend/apps/data_training/api/data_training.py @@ -19,6 +19,8 @@ from common.core.deps import SessionDep, CurrentUser, Trans from common.utils.data_format import DataFormat from common.utils.excel import get_excel_column_count +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log router = APIRouter(tags=["SQL Examples"], prefix="/system/data-training") @@ -40,6 +42,7 @@ async def pager(session: SessionDep, current_user: CurrentUser, current_page: in @router.put("", response_model=int, summary=f"{PLACEHOLDER_PREFIX}create_or_update_dt") +@system_log(LogConfig(operation_type=OperationType.CREATE_OR_UPDATE, module=OperationModules.DATA_TRAINING,resource_id_expr='info.id', result_id_expr="result_self")) async def create_or_update(session: SessionDep, current_user: CurrentUser, trans: Trans, info: DataTrainingInfo): oid = current_user.oid if info.id: @@ -49,16 +52,19 @@ async def create_or_update(session: SessionDep, current_user: CurrentUser, trans @router.delete("", summary=f"{PLACEHOLDER_PREFIX}delete_dt") +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.DATA_TRAINING,resource_id_expr='id_list')) async def delete(session: SessionDep, id_list: list[int]): delete_training(session, id_list) @router.get("/{id}/enable/{enabled}", summary=f"{PLACEHOLDER_PREFIX}enable_dt") +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.DATA_TRAINING,resource_id_expr='id')) async def enable(session: SessionDep, id: int, enabled: bool, trans: Trans): enable_training(session, id, enabled, trans) @router.get("/export", summary=f"{PLACEHOLDER_PREFIX}export_dt") +@system_log(LogConfig(operation_type=OperationType.EXPORT, module=OperationModules.DATA_TRAINING)) async def export_excel(session: SessionDep, trans: Trans, current_user: CurrentUser, question: Optional[str] = Query(None, description="搜索术语(可选)")): def inner(): @@ -148,6 +154,7 @@ def inner(): @router.post("/uploadExcel", summary=f"{PLACEHOLDER_PREFIX}upload_excel_dt") +@system_log(LogConfig(operation_type=OperationType.IMPORT, module=OperationModules.DATA_TRAINING)) async def upload_excel(trans: Trans, current_user: CurrentUser, file: UploadFile = File(...)): ALLOWED_EXTENSIONS = {"xlsx", "xls"} if not file.filename.lower().endswith(tuple(ALLOWED_EXTENSIONS)): diff --git a/backend/apps/datasource/api/recommended_problem.py b/backend/apps/datasource/api/recommended_problem.py index a2346b60..d784f5e1 100644 --- a/backend/apps/datasource/api/recommended_problem.py +++ b/backend/apps/datasource/api/recommended_problem.py @@ -5,6 +5,8 @@ save_recommended_problem, get_datasource_recommended_base from apps.datasource.models.datasource import RecommendedProblemBase from common.core.deps import SessionDep, CurrentUser +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log router = APIRouter(tags=["recommended_problem"], prefix="/recommended_problem") @@ -19,6 +21,8 @@ async def datasource_recommended(session: SessionDep, ds_id: int): @router.post("/save_recommended_problem") +@system_log( + LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.DATASOURCE, resource_id_expr="data_info.datasource_id")) async def datasource_recommended(session: SessionDep, user: CurrentUser, data_info: RecommendedProblemBase): update_ds_recommended_config(session, data_info.datasource_id, data_info.recommended_config) return save_recommended_problem(session, user, data_info) diff --git a/backend/apps/system/api/aimodel.py b/backend/apps/system/api/aimodel.py index defa3b20..6cc193d5 100644 --- a/backend/apps/system/api/aimodel.py +++ b/backend/apps/system/api/aimodel.py @@ -16,6 +16,8 @@ from common.utils.utils import SQLBotLogUtil, prepare_model_arg router = APIRouter(tags=["system_model"], prefix="/system/aimodel") +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log @router.post("/status", include_in_schema=False) @require_permissions(permission=SqlbotPermission(role=['admin'])) @@ -54,7 +56,8 @@ async def check_default(session: SessionDep, trans: Trans): raise Exception(trans('i18n_llm.miss_default')) @router.put("/default/{id}", summary=f"{PLACEHOLDER_PREFIX}system_model_default", description=f"{PLACEHOLDER_PREFIX}system_model_default") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.AI_MODEL, resource_id_expr="id")) async def set_default(session: SessionDep, id: int = Path(description="ID")): db_model = session.get(AiModelDetail, id) if not db_model: @@ -122,7 +125,8 @@ async def get_model_by_id( return AiModelEditor(**data) @router.post("", summary=f"{PLACEHOLDER_PREFIX}system_model_create", description=f"{PLACEHOLDER_PREFIX}system_model_create") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.CREATE, module=OperationModules.AI_MODEL, result_id_expr="id")) async def add_model( session: SessionDep, creator: AiModelCreator @@ -137,9 +141,11 @@ async def add_model( detail.default_model = True session.add(detail) session.commit() + return detail @router.put("", summary=f"{PLACEHOLDER_PREFIX}system_model_update", description=f"{PLACEHOLDER_PREFIX}system_model_update") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.AI_MODEL, resource_id_expr="editor.id")) async def update_model( session: SessionDep, editor: AiModelEditor @@ -155,7 +161,8 @@ async def update_model( session.commit() @router.delete("/{id}", summary=f"{PLACEHOLDER_PREFIX}system_model_del", description=f"{PLACEHOLDER_PREFIX}system_model_del") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.AI_MODEL, resource_id_expr="id")) async def delete_model( session: SessionDep, trans: Trans, diff --git a/backend/apps/system/api/apikey.py b/backend/apps/system/api/apikey.py index e125a90d..192ed34a 100644 --- a/backend/apps/system/api/apikey.py +++ b/backend/apps/system/api/apikey.py @@ -9,6 +9,8 @@ import secrets router = APIRouter(tags=["system_apikey"], prefix="/system/apikey", include_in_schema=False) +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log @router.get("") async def grid(session: SessionDep, current_user: CurrentUser) -> list[ApikeyGridItem]: @@ -16,6 +18,7 @@ async def grid(session: SessionDep, current_user: CurrentUser) -> list[ApikeyGri return session.exec(query).all() @router.post("") +@system_log(LogConfig(operation_type=OperationType.CREATE, module=OperationModules.API_KEY,result_id_expr='result.self')) async def create(session: SessionDep, current_user: CurrentUser): count = session.exec(select(func.count()).select_from(ApiKeyModel)).one() if count >= 5: @@ -34,6 +37,7 @@ async def create(session: SessionDep, current_user: CurrentUser): return api_key.id @router.put("/status") +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.API_KEY,resource_id_expr='id')) async def status(session: SessionDep, current_user: CurrentUser, dto: ApikeyStatus): api_key = session.get(ApiKeyModel, dto.id) if not api_key: @@ -48,6 +52,7 @@ async def status(session: SessionDep, current_user: CurrentUser, dto: ApikeyStat session.commit() @router.delete("/{id}") +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.API_KEY,resource_id_expr='id')) async def delete(session: SessionDep, current_user: CurrentUser, id: int): api_key = session.get(ApiKeyModel, id) if not api_key: diff --git a/backend/apps/system/api/assistant.py b/backend/apps/system/api/assistant.py index b43cf695..61c8000f 100644 --- a/backend/apps/system/api/assistant.py +++ b/backend/apps/system/api/assistant.py @@ -21,6 +21,8 @@ from common.utils.utils import get_origin_from_referer, origin_match_domain router = APIRouter(tags=["system_assistant"], prefix="/system/assistant") +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log @router.get("/info/{id}", include_in_schema=False) @@ -168,12 +170,14 @@ async def query_advanced_application(session: SessionDep): @router.post("", summary=f"{PLACEHOLDER_PREFIX}assistant_create_api", description=f"{PLACEHOLDER_PREFIX}assistant_create_api") +@system_log(LogConfig(operation_type=OperationType.CREATE, module=OperationModules.APPLICATION, result_id_expr="id")) async def add(request: Request, session: SessionDep, creator: AssistantBase): - await save(request, session, creator) + return await save(request, session, creator) @router.put("", summary=f"{PLACEHOLDER_PREFIX}assistant_update_api", description=f"{PLACEHOLDER_PREFIX}assistant_update_api") @clear_cache(namespace=CacheNamespace.EMBEDDED_INFO, cacheName=CacheName.ASSISTANT_INFO, keyExpression="editor.id") +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.APPLICATION, resource_id_expr="editor.id")) async def update(request: Request, session: SessionDep, editor: AssistantDTO): id = editor.id db_model = session.get(AssistantModel, id) @@ -197,6 +201,7 @@ async def get_one(session: SessionDep, id: int = Path(description="ID")): @router.delete("/{id}", summary=f"{PLACEHOLDER_PREFIX}assistant_del_api", description=f"{PLACEHOLDER_PREFIX}assistant_del_api") @clear_cache(namespace=CacheNamespace.EMBEDDED_INFO, cacheName=CacheName.ASSISTANT_INFO, keyExpression="id") +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.APPLICATION, resource_id_expr="id")) async def delete(request: Request, session: SessionDep, id: int = Path(description="ID")): db_model = session.get(AssistantModel, id) if not db_model: diff --git a/backend/apps/system/api/parameter.py b/backend/apps/system/api/parameter.py index 27901e59..49645e51 100644 --- a/backend/apps/system/api/parameter.py +++ b/backend/apps/system/api/parameter.py @@ -6,7 +6,8 @@ from common.core.deps import SessionDep router = APIRouter(tags=["system/parameter"], prefix="/system/parameter", include_in_schema=False) - +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log @router.get("/login") async def get_login_args(session: SessionDep) -> list[SysArgModel]: @@ -21,6 +22,7 @@ async def get_args(session: SessionDep) -> list[SysArgModel]: @router.post("", ) @require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.PARAMS_SETTING)) async def save_args(session: SessionDep, request: Request): return await save_parameter_args(session=session, request=request) diff --git a/backend/apps/system/api/user.py b/backend/apps/system/api/user.py index bbc74316..4f05d35d 100644 --- a/backend/apps/system/api/user.py +++ b/backend/apps/system/api/user.py @@ -9,6 +9,8 @@ from apps.system.schemas.auth import CacheName, CacheNamespace from apps.system.schemas.permission import SqlbotPermission, require_permissions from apps.system.schemas.system_schema import PwdEditor, UserCreator, UserEditor, UserGrid, UserInfoDTO, UserLanguage, UserStatus, UserWs +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log from common.core.deps import CurrentUser, SessionDep, Trans from common.core.pagination import Paginator from common.core.schemas import PaginatedResponse, PaginationParams @@ -117,6 +119,11 @@ async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Tran @router.put("/ws/{oid}", summary=f"{PLACEHOLDER_PREFIX}switch_oid_api", description=f"{PLACEHOLDER_PREFIX}switch_oid_api") @clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.USER, + resource_id_expr="editor.id" +)) async def ws_change(session: SessionDep, current_user: CurrentUser, trans:Trans, oid: int = Path(description=f"{PLACEHOLDER_PREFIX}oid")): ws_list: list[UserWs] = await user_ws_options(session, current_user.id) if not any(x.id == oid for x in ws_list): @@ -141,8 +148,13 @@ async def query(session: SessionDep, trans: Trans, id: int = Path(description=f" @router.post("", summary=f"{PLACEHOLDER_PREFIX}user_create_api", description=f"{PLACEHOLDER_PREFIX}user_create_api") @require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig( + operation_type=OperationType.CREATE, + module=OperationModules.USER, + result_id_expr="id" +)) async def user_create(session: SessionDep, creator: UserCreator, trans: Trans): - await create(session=session, creator=creator, trans=trans) + return await create(session=session, creator=creator, trans=trans) async def create(session: SessionDep, creator: UserCreator, trans: Trans): if check_account_exists(session=session, account=creator.account): @@ -169,11 +181,17 @@ async def create(session: SessionDep, creator: UserCreator, trans: Trans): session.add_all(db_model_list) user_model.oid = creator.oid_list[0] session.add(user_model) + return user_model @router.put("", summary=f"{PLACEHOLDER_PREFIX}user_update_api", description=f"{PLACEHOLDER_PREFIX}user_update_api") @require_permissions(permission=SqlbotPermission(role=['admin'])) @clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.USER, + resource_id_expr="editor.id" +)) async def update(session: SessionDep, editor: UserEditor, trans: Trans): user_model: UserModel = get_db_user(session = session, user_id = editor.id) if not user_model: @@ -207,7 +225,12 @@ async def update(session: SessionDep, editor: UserEditor, trans: Trans): session.add(user_model) @router.delete("/{id}", summary=f"{PLACEHOLDER_PREFIX}user_del_api", description=f"{PLACEHOLDER_PREFIX}user_del_api") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig( + operation_type=OperationType.DELETE, + module=OperationModules.USER, + resource_id_expr="id" +)) async def delete(session: SessionDep, id: int = Path(description=f"{PLACEHOLDER_PREFIX}uid")): await single_delete(session, id) @@ -231,6 +254,11 @@ async def langChange(session: SessionDep, current_user: CurrentUser, trans: Tran @router.patch("/pwd/{id}", summary=f"{PLACEHOLDER_PREFIX}reset_pwd", description=f"{PLACEHOLDER_PREFIX}reset_pwd") @require_permissions(permission=SqlbotPermission(role=['admin'])) @clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.USER, + resource_id_expr="id" +)) async def pwdReset(session: SessionDep, current_user: CurrentUser, trans: Trans, id: int = Path(description=f"{PLACEHOLDER_PREFIX}uid")): if not current_user.isAdmin: raise Exception(trans('i18n_permission.no_permission', url = " patch[/user/pwd/id],", msg = trans('i18n_permission.only_admin'))) @@ -240,6 +268,11 @@ async def pwdReset(session: SessionDep, current_user: CurrentUser, trans: Trans, @router.put("/pwd", summary=f"{PLACEHOLDER_PREFIX}update_pwd", description=f"{PLACEHOLDER_PREFIX}update_pwd") @clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.USER, + result_id_expr="id" +)) async def pwdUpdate(session: SessionDep, current_user: CurrentUser, trans: Trans, editor: PwdEditor): new_pwd = editor.new_pwd if not check_pwd_format(new_pwd): @@ -249,11 +282,17 @@ async def pwdUpdate(session: SessionDep, current_user: CurrentUser, trans: Trans raise Exception(trans('i18n_error', key = trans('i18n_user.password'))) db_user.password = md5pwd(new_pwd) session.add(db_user) + return db_user @router.patch("/status", summary=f"{PLACEHOLDER_PREFIX}update_status", description=f"{PLACEHOLDER_PREFIX}update_status") @require_permissions(permission=SqlbotPermission(role=['admin'])) @clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="statusDto.id") +@system_log(LogConfig( + operation_type=OperationType.UPDATE, + module=OperationModules.USER, + resource_id_expr="statusDto.id" +)) async def statusChange(session: SessionDep, current_user: CurrentUser, trans: Trans, statusDto: UserStatus): if not current_user.isAdmin: raise Exception(trans('i18n_permission.no_permission', url = ", ", msg = trans('i18n_permission.only_admin'))) diff --git a/backend/apps/system/api/workspace.py b/backend/apps/system/api/workspace.py index 21eddf9a..78206c34 100644 --- a/backend/apps/system/api/workspace.py +++ b/backend/apps/system/api/workspace.py @@ -8,6 +8,8 @@ from apps.system.models.user import UserModel from apps.system.schemas.permission import SqlbotPermission, require_permissions from apps.system.schemas.system_schema import UserWsBase, UserWsDTO, UserWsEditor, UserWsOption, WorkspaceUser +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig from common.core.deps import CurrentUser, SessionDep, Trans from common.core.pagination import Paginator from common.core.schemas import PaginatedResponse, PaginationParams @@ -121,7 +123,9 @@ async def pager( @router.post("/uws", summary=f"{PLACEHOLDER_PREFIX}ws_user_bind_api", description=f"{PLACEHOLDER_PREFIX}ws_user_bind_api") -@require_permissions(permission=SqlbotPermission(role=['ws_admin'])) +@require_permissions(permission=SqlbotPermission(role=['ws_admin'])) +@system_log(LogConfig(operation_type=OperationType.ADD, module=OperationModules.MEMBER, resource_id_expr="creator.uid_list", + )) async def create(session: SessionDep, current_user: CurrentUser, trans: Trans, creator: UserWsDTO): if not current_user.isAdmin and current_user.weight == 0: raise Exception(trans('i18n_permission.no_permission', url = '', msg = '')) @@ -143,7 +147,9 @@ async def create(session: SessionDep, current_user: CurrentUser, trans: Trans, c session.add_all(db_model_list) @router.put("/uws", summary=f"{PLACEHOLDER_PREFIX}ws_user_status_api", description=f"{PLACEHOLDER_PREFIX}ws_user_status_api") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.MEMBER, resource_id_expr="editor.uid_list", + )) async def uws_edit(session: SessionDep, trans: Trans, editor: UserWsEditor): await edit(session, trans, editor) @@ -162,7 +168,9 @@ async def edit(session: SessionDep, trans: Trans, editor: UserWsEditor): await clean_user_cache(editor.uid) @router.delete("/uws", summary=f"{PLACEHOLDER_PREFIX}ws_user_unbind_api", description=f"{PLACEHOLDER_PREFIX}ws_user_unbind_api") -@require_permissions(permission=SqlbotPermission(role=['ws_admin'])) +@require_permissions(permission=SqlbotPermission(role=['ws_admin'])) +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.MEMBER, resource_id_expr="dto.uid_list", + )) async def delete(session: SessionDep, current_user: CurrentUser, trans: Trans, dto: UserWsBase): if not current_user.isAdmin and current_user.weight == 0: raise Exception(trans('i18n_permission.no_permission', url = '', msg = '')) @@ -189,13 +197,18 @@ async def query(session: SessionDep, trans: Trans): @router.post("", summary=f"{PLACEHOLDER_PREFIX}ws_create_api", description=f"{PLACEHOLDER_PREFIX}ws_create_api") @require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.CREATE, module=OperationModules.WORKSPACE, result_id_expr="id", + )) async def add(session: SessionDep, creator: WorkspaceBase): db_model = WorkspaceModel.model_validate(creator) db_model.create_time = get_timestamp() session.add(db_model) + return db_model @router.put("", summary=f"{PLACEHOLDER_PREFIX}ws_update_api", description=f"{PLACEHOLDER_PREFIX}ws_update_api") @require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.WORKSPACE, resource_id_expr="editor.id", + )) async def update(session: SessionDep, editor: WorkspaceEditor): id = editor.id db_model = session.get(WorkspaceModel, id) @@ -215,7 +228,9 @@ async def get_one(session: SessionDep, trans: Trans, id: int = Path(description= return db_model @router.delete("/{id}", summary=f"{PLACEHOLDER_PREFIX}ws_del_api", description=f"{PLACEHOLDER_PREFIX}ws_del_api") -@require_permissions(permission=SqlbotPermission(role=['admin'])) +@require_permissions(permission=SqlbotPermission(role=['admin'])) +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.WORKSPACE, resource_id_expr="id", + )) async def single_delete(session: SessionDep, current_user: CurrentUser, id: int = Path(description=f"{PLACEHOLDER_PREFIX}oid")): if not current_user.isAdmin: raise HTTPException("only admin can delete workspace") diff --git a/backend/apps/system/crud/assistant_manage.py b/backend/apps/system/crud/assistant_manage.py index b52913a2..74498508 100644 --- a/backend/apps/system/crud/assistant_manage.py +++ b/backend/apps/system/crud/assistant_manage.py @@ -37,4 +37,5 @@ async def save(request: Request, session: Session, creator: AssistantBase): db_model.create_time = get_timestamp() session.add(db_model) session.commit() - dynamic_upgrade_cors(request=request, session=session) \ No newline at end of file + dynamic_upgrade_cors(request=request, session=session) + return db_model \ No newline at end of file diff --git a/backend/apps/terminology/api/terminology.py b/backend/apps/terminology/api/terminology.py index 83123b27..8f4ca37f 100644 --- a/backend/apps/terminology/api/terminology.py +++ b/backend/apps/terminology/api/terminology.py @@ -19,7 +19,8 @@ from common.core.deps import SessionDep, CurrentUser, Trans from common.utils.data_format import DataFormat from common.utils.excel import get_excel_column_count - +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log router = APIRouter(tags=["Terminology"], prefix="/system/terminology") @@ -40,6 +41,7 @@ async def pager(session: SessionDep, current_user: CurrentUser, current_page: in @router.put("", summary=f"{PLACEHOLDER_PREFIX}create_or_update_term") +@system_log(LogConfig(operation_type=OperationType.CREATE_OR_UPDATE, module=OperationModules.TERMINOLOGY,resource_id_expr='info.id', result_id_expr="result_self")) async def create_or_update(session: SessionDep, current_user: CurrentUser, trans: Trans, info: TerminologyInfo): oid = current_user.oid if info.id: @@ -49,16 +51,19 @@ async def create_or_update(session: SessionDep, current_user: CurrentUser, trans @router.delete("", summary=f"{PLACEHOLDER_PREFIX}delete_term") +@system_log(LogConfig(operation_type=OperationType.DELETE, module=OperationModules.TERMINOLOGY,resource_id_expr='id_list')) async def delete(session: SessionDep, id_list: list[int]): delete_terminology(session, id_list) @router.get("/{id}/enable/{enabled}", summary=f"{PLACEHOLDER_PREFIX}enable_term") +@system_log(LogConfig(operation_type=OperationType.UPDATE, module=OperationModules.TERMINOLOGY,resource_id_expr='id')) async def enable(session: SessionDep, id: int, enabled: bool, trans: Trans): enable_terminology(session, id, enabled, trans) @router.get("/export", summary=f"{PLACEHOLDER_PREFIX}export_term") +@system_log(LogConfig(operation_type=OperationType.EXPORT, module=OperationModules.TERMINOLOGY)) async def export_excel(session: SessionDep, trans: Trans, current_user: CurrentUser, word: Optional[str] = Query(None, description="搜索术语(可选)")): def inner(): @@ -154,6 +159,7 @@ def inner(): @router.post("/uploadExcel", summary=f"{PLACEHOLDER_PREFIX}upload_term") +@system_log(LogConfig(operation_type=OperationType.IMPORT, module=OperationModules.TERMINOLOGY)) async def upload_excel(trans: Trans, current_user: CurrentUser, file: UploadFile = File(...)): ALLOWED_EXTENSIONS = {"xlsx", "xls"} if not file.filename.lower().endswith(tuple(ALLOWED_EXTENSIONS)): diff --git a/backend/locales/en.json b/backend/locales/en.json index 607e5fa0..f6f307b5 100644 --- a/backend/locales/en.json +++ b/backend/locales/en.json @@ -156,6 +156,12 @@ "edit": "Edit", "login": "Login", "export": "Export", - "import": "Import" + "import": "Import", + "add": "Add", + "create_or_update": "Change", + "api_key": "API Key", + "params_setting": "Parameters Setting", + "rules": "Permission Rules", + "log_setting": "Login Authentication" } } \ No newline at end of file diff --git a/backend/locales/ko-KR.json b/backend/locales/ko-KR.json index 7bab2fa8..1a0ff77f 100644 --- a/backend/locales/ko-KR.json +++ b/backend/locales/ko-KR.json @@ -156,6 +156,12 @@ "edit": "편집", "login": "로그인", "export": "내보내기", - "import": "가져오기" + "import": "가져오기", + "add": "추가", + "create_or_update": "변경", + "api_key": "API 키", + "params_setting": "매개변수 설정", + "rules": "권한 규칙", + "log_setting": "로그인 인증" } } \ No newline at end of file diff --git a/backend/locales/zh-CN.json b/backend/locales/zh-CN.json index e0058a2e..7189ae36 100644 --- a/backend/locales/zh-CN.json +++ b/backend/locales/zh-CN.json @@ -156,6 +156,12 @@ "edit": "编辑", "login": "登录", "export": "导出", - "import": "导入" + "import": "导入", + "add": "添加", + "create_or_update": "变更", + "api_key": "API Key", + "params_setting": "参数设置", + "rules": "权限规则", + "log_setting": "登录认证" } } \ No newline at end of file diff --git a/frontend/src/views/system/audit/index.vue b/frontend/src/views/system/audit/index.vue index a1bfd87f..8889f75d 100644 --- a/frontend/src/views/system/audit/index.vue +++ b/frontend/src/views/system/audit/index.vue @@ -284,7 +284,7 @@ const initOptions = () => { />