diff --git a/backend/apps/api.py b/backend/apps/api.py index 23ca0175..f1fe6686 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -8,6 +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 api_router = APIRouter() @@ -28,3 +29,5 @@ api_router.include_router(apikey.router) api_router.include_router(recommended_problem.router) + +#api_router.include_router(audit_api.router) diff --git a/backend/apps/chat/api/chat.py b/backend/apps/chat/api/chat.py index 6dfe495f..8cdfe674 100644 --- a/backend/apps/chat/api/chat.py +++ b/backend/apps/chat/api/chat.py @@ -21,8 +21,8 @@ from common.core.deps import CurrentAssistant, SessionDep, CurrentUser, Trans from common.utils.command_utils import parse_quick_command from common.utils.data_format import DataFormat -from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules -from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log router = APIRouter(tags=["Data Q&A"], prefix="/chat") @@ -83,9 +83,8 @@ async def rename(session: SessionDep, chat: RenameChat): @router.delete("/{chart_id}/{brief}", response_model=str, summary=f"{PLACEHOLDER_PREFIX}delete_chat") @system_log(LogConfig( - operation_type=OperationType.DELETE_QA, - operation_detail=OperationDetails.DELETE_QA_DETAILS, - module=OperationModules.QA, + operation_type=OperationType.DELETE, + module=OperationModules.CHAT, resource_id_expr="chart_id", remark_expr="brief" )) @@ -102,9 +101,8 @@ async def delete(session: SessionDep, chart_id: int, brief: str): @router.post("/start", response_model=ChatInfo, summary=f"{PLACEHOLDER_PREFIX}start_chat") @require_permissions(permission=SqlbotPermission(type='ds', keyExpression="create_chat_obj.datasource")) @system_log(LogConfig( - operation_type=OperationType.CREATE_QA, - operation_detail=OperationDetails.CREATE_QA_DETAILS, - module=OperationModules.QA, + operation_type=OperationType.CREATE, + module=OperationModules.CHAT, result_id_expr="id" )) async def start_chat(session: SessionDep, current_user: CurrentUser, create_chat_obj: CreateChat): diff --git a/backend/apps/dashboard/api/dashboard_api.py b/backend/apps/dashboard/api/dashboard_api.py index f93d1af7..6a5ad485 100644 --- a/backend/apps/dashboard/api/dashboard_api.py +++ b/backend/apps/dashboard/api/dashboard_api.py @@ -3,8 +3,8 @@ from apps.dashboard.crud.dashboard_service import list_resource, load_resource, \ create_resource, create_canvas, validate_name, delete_resource, update_resource, update_canvas from apps.dashboard.models.dashboard_model import CreateDashboard, BaseDashboard, QueryDashboard, DashboardResponse -from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules -from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig +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 SessionDep, CurrentUser router = APIRouter(tags=["dashboard"], prefix="/dashboard") @@ -32,8 +32,7 @@ async def update_resource_api(session: SessionDep, user: CurrentUser, dashboard: @router.delete("/delete_resource/{resource_id}/{name}") @system_log(LogConfig( - operation_type=OperationType.DELETE_DASHBOARD, - operation_detail=OperationDetails.DELETE_DASHBOARD_DETAILS, + operation_type=OperationType.DELETE, module=OperationModules.DASHBOARD, resource_id_expr="resource_id", remark_expr="name" @@ -44,8 +43,7 @@ async def delete_resource_api(session: SessionDep, resource_id: str, name: str): @router.post("/create_canvas", response_model=BaseDashboard) @system_log(LogConfig( - operation_type=OperationType.CREATE_DASHBOARD, - operation_detail=OperationDetails.CREATE_DASHBOARD_DETAILS, + operation_type=OperationType.CREATE, module=OperationModules.DASHBOARD, result_id_expr="id" )) @@ -55,8 +53,7 @@ async def create_canvas_api(session: SessionDep, user: CurrentUser, dashboard: C @router.post("/update_canvas", response_model=BaseDashboard) @system_log(LogConfig( - operation_type=OperationType.UPDATE_DASHBOARD, - operation_detail=OperationDetails.UPDATE_DASHBOARD_DETAILS, + operation_type=OperationType.UPDATE, module=OperationModules.DASHBOARD, resource_id_expr="dashboard.id" )) diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index a4d7caec..c3405bcb 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -28,8 +28,8 @@ from ..crud.table import get_tables_by_ds_id from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable, CoreField, FieldObj, \ TableSchemaResponse, ColumnSchemaResponse, PreviewResponse -from sqlbot_xpack.audit.models.log_model import OperationType, OperationDetails, OperationModules -from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import LogConfig, system_log router = APIRouter(tags=["Datasource"], prefix="/datasource") path = settings.EXCEL_PATH @@ -72,8 +72,7 @@ def inner(): @router.post("/add", response_model=CoreDatasource, summary=f"{PLACEHOLDER_PREFIX}ds_add") @system_log(LogConfig( - operation_type=OperationType.CREATE_DATASOURCE, - operation_detail=OperationDetails.CREATE_DATASOURCE_DETAILS, + operation_type=OperationType.CREATE, module=OperationModules.DATASOURCE, result_id_expr="id" )) @@ -96,8 +95,7 @@ def inner(): @router.post("/update", response_model=CoreDatasource, summary=f"{PLACEHOLDER_PREFIX}ds_update") @require_permissions(permission=SqlbotPermission(type='ds', keyExpression="ds.id")) @system_log(LogConfig( - operation_type=OperationType.UPDATE_DATASOURCE, - operation_detail=OperationDetails.UPDATE_DATASOURCE_DETAILS, + operation_type=OperationType.UPDATE, module=OperationModules.DATASOURCE, resource_id_expr="ds.id" )) @@ -111,8 +109,7 @@ def inner(): @router.post("/delete/{id}/{name}", response_model=None, summary=f"{PLACEHOLDER_PREFIX}ds_delete") @require_permissions(permission=SqlbotPermission(type='ds', keyExpression="id")) @system_log(LogConfig( - operation_type=OperationType.DELETE_DATASOURCE, - operation_detail=OperationDetails.DELETE_DATASOURCE_DETAILS, + operation_type=OperationType.DELETE, module=OperationModules.DATASOURCE, resource_id_expr="id", remark_expr="name" diff --git a/backend/apps/system/api/login.py b/backend/apps/system/api/login.py index 6b07f67a..80914228 100644 --- a/backend/apps/system/api/login.py +++ b/backend/apps/system/api/login.py @@ -11,9 +11,18 @@ from common.core.config import settings from common.core.schemas import Token from sqlbot_xpack.authentication.manage import logout as xpack_logout + +from sqlbot_xpack.audit.models.log_model import OperationType, OperationModules +from sqlbot_xpack.audit.schemas.logger_decorator import system_log, LogConfig + router = APIRouter(tags=["login"], prefix="/login") @router.post("/access-token") +@system_log(LogConfig( + operation_type=OperationType.LOGIN, + module=OperationModules.USER, + result_id_expr="id" +)) async def local_login( session: SessionDep, trans: Trans, diff --git a/backend/apps/system/schemas/system_schema.py b/backend/apps/system/schemas/system_schema.py index 9c67f92f..08d0d750 100644 --- a/backend/apps/system/schemas/system_schema.py +++ b/backend/apps/system/schemas/system_schema.py @@ -36,6 +36,7 @@ class BaseUserDTO(BaseUser, BaseCreatorDTO): password: str status: int = 1 origin: int = 0 + name: str def to_dict(self): return { diff --git a/backend/locales/en.json b/backend/locales/en.json index 3c9aed5d..36ce8d36 100644 --- a/backend/locales/en.json +++ b/backend/locales/en.json @@ -125,44 +125,34 @@ "i18n_audit": { "success": "Success", "failed": "Failed", - "create_qa": "Create Q&A", - "delete_qa": "Delete Q&A", - "create_datasource": "Create Datasource", - "update_datasource": "Edit Datasource", - "delete_datasource": "Delete Datasource", - "create_dashboard": "Create Dashboard", - "update_dashboard": "Edit Dashboard", - "delete_dashboard": "Delete Dashboard", - "setting_create_user": "Add Member", - "setting_delete_user": "Remove Member", - "setting_create_rule": "Add Rule Group", - "setting_delete_rule": "Remove Rule Group", - "setting_update_rule": "Configure Rules", - "setting_update_rule_user": "Configure Users", - "setting_create_terminology": "Create Terminology", - "create_qa_details": "Create Q&A【{resource_name}】", - "delete_qa_details": "Delete Q&A【{resource_name}】", - "create_datasource_details": "Create Datasource【{resource_name}】", - "update_datasource_details": "Edit Datasource【{resource_name}】", - "delete_datasource_details": "Delete Datasource【{resource_name}】", - "create_dashboard_details": "Create Dashboard【{resource_name}】", - "update_dashboard_details": "Edit Dashboard【{resource_name}】", - "delete_dashboard_details": "Delete Dashboard【{resource_name}】", - "setting_create_user_details": "Add Member【{resource_name}】", - "setting_delete_user_details": "Remove Member【{resource_name}】", - "setting_create_rule_details": "Add Rule Group【{resource_name}】", - "setting_delete_rule_details": "Remove Rule Group【{resource_name}】", - "setting_update_rule_details": "Configure Rules【{resource_name}】", - "setting_update_rule_user_details": "Configure Users【{resource_name}】", - "setting_create_terminology_details": "Create Terminology【{resource_name}】", - "system_log": "System Log", + "system_log": "Operation Log", "operation_type_name": "Operation Type", "operation_detail_info": "Operation Details", - "user_name": "Operating User", + "user_name": "Operator", "oid_name": "Workspace", "operation_status_name": "Operation Status", "error_message": "Error Message", "ip_address": "IP Address", - "create_time": "Operation Time" + "create_time": "Operation Time", + "chat": "AI Q&A", + "datasource": "Datasource", + "dashboard": "Dashboard", + "member": "Member", + "permission": "Permission", + "terminology": "Terminology", + "data_training": "SQL Examples", + "prompt_words": "Prompt Words", + "user": "User", + "workspace": "Workspace", + "ai_model": "AI Model", + "application": "Application", + "theme": "Appearance Settings", + "create": "Create", + "delete": "Delete", + "update": "Update", + "edit": "Edit", + "login": "Login", + "export": "Export", + "import": "Import" } } \ No newline at end of file diff --git a/backend/locales/ko-KR.json b/backend/locales/ko-KR.json index 2b725828..89386a7c 100644 --- a/backend/locales/ko-KR.json +++ b/backend/locales/ko-KR.json @@ -125,44 +125,34 @@ "i18n_audit": { "success": "성공", "failed": "실패", - "create_qa": "Q&A 생성", - "delete_qa": "Q&A 삭제", - "create_datasource": "데이터 소스 생성", - "update_datasource": "데이터 소스 편집", - "delete_datasource": "데이터 소스 삭제", - "create_dashboard": "대시보드 생성", - "update_dashboard": "대시보드 편집", - "delete_dashboard": "대시보드 삭제", - "setting_create_user": "멤버 추가", - "setting_delete_user": "멤버 제거", - "setting_create_rule": "규칙 그룹 추가", - "setting_delete_rule": "규칙 그룹 제거", - "setting_update_rule": "규칙 설정", - "setting_update_rule_user": "사용자 설정", - "setting_create_terminology": "용어 생성", - "create_qa_details": "Q&A 생성【{resource_name}】", - "delete_qa_details": "Q&A 삭제【{resource_name}】", - "create_datasource_details": "데이터 소스 생성【{resource_name}】", - "update_datasource_details": "데이터 소스 편집【{resource_name}】", - "delete_datasource_details": "데이터 소스 삭제【{resource_name}】", - "create_dashboard_details": "대시보드 생성【{resource_name}】", - "update_dashboard_details": "대시보드 편집【{resource_name}】", - "delete_dashboard_details": "대시보드 삭제【{resource_name}】", - "setting_create_user_details": "멤버 추가【{resource_name}】", - "setting_delete_user_details": "멤버 제거【{resource_name}】", - "setting_create_rule_details": "규칙 그룹 추가【{resource_name}】", - "setting_delete_rule_details": "규칙 그룹 제거【{resource_name}】", - "setting_update_rule_details": "규칙 설정【{resource_name}】", - "setting_update_rule_user_details": "사용자 설정【{resource_name}】", - "setting_create_terminology_details": "용어 생성【{resource_name}】", - "system_log": "시스템 로그", + "system_log": "작업 로그", "operation_type_name": "작업 유형", - "operation_detail_info": "작업 상세 정보", - "user_name": "작업 사용자", + "operation_detail_info": "작업 상세", + "user_name": "작업자", "oid_name": "작업 공간", "operation_status_name": "작업 상태", "error_message": "오류 메시지", "ip_address": "IP 주소", - "create_time": "작업 시간" + "create_time": "작업 시간", + "chat": "지능형 질의", + "datasource": "데이터 소스", + "dashboard": "대시보드", + "member": "구성원", + "permission": "권한", + "terminology": "용어", + "data_training": "SQL 예제 라이브러리", + "prompt_words": "프롬프트 단어", + "user": "사용자", + "workspace": "작업 공간", + "ai_model": "AI 모델", + "application": "애플리케이션", + "theme": "외관 설정", + "create": "생성", + "delete": "삭제", + "update": "수정", + "edit": "편집", + "login": "로그인", + "export": "내보내기", + "import": "가져오기" } } \ No newline at end of file diff --git a/backend/locales/zh-CN.json b/backend/locales/zh-CN.json index 84236f34..1a374912 100644 --- a/backend/locales/zh-CN.json +++ b/backend/locales/zh-CN.json @@ -125,36 +125,6 @@ "i18n_audit": { "success": "成功", "failed": "失败", - "create_qa": "新建问数", - "delete_qa": "删除问数", - "create_datasource": "新建数据源", - "update_datasource": "编辑数据源", - "delete_datasource": "删除数据源", - "create_dashboard": "新建仪表板", - "update_dashboard": "编辑仪表板", - "delete_dashboard": "删除仪表板", - "setting_create_user": "添加成员", - "setting_delete_user": "移除成员", - "setting_create_rule": "添加规则组", - "setting_delete_rule": "移除规则组", - "setting_update_rule": "设置规则", - "setting_update_rule_user": "设置用户", - "setting_create_terminology": "新建术语", - "create_qa_details": "新建问数【{resource_name}】", - "delete_qa_details": "删除问数【{resource_name}】", - "create_datasource_details": "新建数据源【{resource_name}】", - "update_datasource_details": "编辑数据源【{resource_name}】", - "delete_datasource_details": "删除数据源【{resource_name}】", - "create_dashboard_details": "新建仪表板【{resource_name}】", - "update_dashboard_details": "编辑仪表板【{resource_name}】", - "delete_dashboard_details": "删除仪表板【{resource_name}】", - "setting_create_user_details": "添加成员【{resource_name}】", - "setting_delete_user_details": "移除成员【{resource_name}】", - "setting_create_rule_details": "添加规则组【{resource_name}】", - "setting_delete_rule_details": "移除规则组【{resource_name}】", - "setting_update_rule_details": "设置规则【{resource_name}】", - "setting_update_rule_user_details": "设置用户【{resource_name}】", - "setting_create_terminology_details": "新建术语【{resource_name}】", "system_log": "操作日志", "operation_type_name": "操作类型", "operation_detail_info": "操作详情", @@ -163,6 +133,26 @@ "operation_status_name": "操作状态", "error_message": "错误信息", "ip_address": "IP 地址", - "create_time": "操作时间" + "create_time": "操作时间", + "chat": "智能问数", + "datasource": "数据源", + "dashboard": "仪表板", + "member": "成员", + "permission": "权限", + "terminology": "术语", + "data_training": "SQL 示例库", + "prompt_words": "提示词", + "user": "用户", + "workspace": "工作空间", + "ai_model": "AI 模型", + "application": "应用", + "theme": "外观配置", + "create": "新建", + "delete": "删除", + "update": "更新", + "edit": "编辑", + "login": "登录", + "export": "导出", + "import": "导入" } -} +} \ No newline at end of file diff --git a/frontend/src/api/audit.ts b/frontend/src/api/audit.ts index 7c19e90a..649d22a2 100644 --- a/frontend/src/api/audit.ts +++ b/frontend/src/api/audit.ts @@ -3,6 +3,7 @@ import { request } from '@/utils/request' export const audit = { getList: (pageNum: any, pageSize: any, params: any) => request.get(`/system/audit/page/${pageNum}/${pageSize}${params}`), + getOptions: () => request.get(`/system/audit/get_options`), export2Excel: (params: any) => request.get(`/system/audit/export`, { params, diff --git a/frontend/src/assets/svg/log.svg b/frontend/src/assets/svg/log.svg new file mode 100644 index 00000000..2c1a6704 --- /dev/null +++ b/frontend/src/assets/svg/log.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/menu/icon_log_filled.svg b/frontend/src/assets/svg/menu/icon_log_filled.svg new file mode 100644 index 00000000..2c1a6704 --- /dev/null +++ b/frontend/src/assets/svg/menu/icon_log_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/svg/menu/icon_log_outlined.svg b/frontend/src/assets/svg/menu/icon_log_outlined.svg new file mode 100644 index 00000000..af3f931a --- /dev/null +++ b/frontend/src/assets/svg/menu/icon_log_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue b/frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue new file mode 100644 index 00000000..69c3eb28 --- /dev/null +++ b/frontend/src/components/drawer-filter/src/DrawerTimeFilter.vue @@ -0,0 +1,96 @@ + + + + diff --git a/frontend/src/components/drawer-filter/src/DrawerTreeFilter.vue b/frontend/src/components/drawer-filter/src/DrawerTreeFilter.vue new file mode 100644 index 00000000..652ef11d --- /dev/null +++ b/frontend/src/components/drawer-filter/src/DrawerTreeFilter.vue @@ -0,0 +1,127 @@ + + + + diff --git a/frontend/src/components/drawer-main/src/DrawerMain.vue b/frontend/src/components/drawer-main/src/DrawerMain.vue index 6f149b5b..7b62359b 100644 --- a/frontend/src/components/drawer-main/src/DrawerMain.vue +++ b/frontend/src/components/drawer-main/src/DrawerMain.vue @@ -6,6 +6,8 @@ import DrawerFilter from '@/components/drawer-filter/src/DrawerFilter.vue' import DrawerEnumFilter from '@/components/drawer-filter/src/DrawerEnumFilter.vue' import { useEmitt } from '@/utils/useEmitt' import { useI18n } from 'vue-i18n' +import DrawerTreeFilter from '@/components/drawer-filter/src/DrawerTreeFilter.vue' +import DrawerTimeFilter from '@/components/drawer-filter/src/DrawerTimeFilter.vue' const { t } = useI18n() const props = defineProps({ filterOptions: propTypes.arrayOf( @@ -126,6 +128,14 @@ defineExpose({ direction="rtl" >
+ +