From 0d30c03eed22efc4cd69715518d022de035053c8 Mon Sep 17 00:00:00 2001 From: ulleo Date: Tue, 18 Nov 2025 19:18:29 +0800 Subject: [PATCH] feat: import Sample SQL / Terminologies --- backend/apps/api.py | 2 + .../apps/data_training/api/data_training.py | 30 +- backend/apps/settings/api/base.py | 39 ++ backend/apps/settings/api/terminology.py | 68 ---- frontend/src/api/professional.ts | 9 - frontend/src/api/setting.ts | 12 +- frontend/src/api/training.ts | 9 - frontend/src/views/setting/Professional.vue | 340 ------------------ frontend/src/views/setting/index.vue | 75 ---- .../src/views/system/professional/index.vue | 4 +- frontend/src/views/system/training/index.vue | 3 +- 11 files changed, 57 insertions(+), 534 deletions(-) create mode 100644 backend/apps/settings/api/base.py delete mode 100644 backend/apps/settings/api/terminology.py delete mode 100644 frontend/src/views/setting/Professional.vue delete mode 100644 frontend/src/views/setting/index.vue diff --git a/backend/apps/api.py b/backend/apps/api.py index 8b836c0d..eac8c39e 100644 --- a/backend/apps/api.py +++ b/backend/apps/api.py @@ -7,6 +7,7 @@ from apps.mcp import mcp from apps.system.api import login, user, aimodel, workspace, assistant from apps.terminology.api import terminology +from apps.settings.api import base api_router = APIRouter() api_router.include_router(login.router) @@ -14,6 +15,7 @@ api_router.include_router(workspace.router) api_router.include_router(assistant.router) api_router.include_router(aimodel.router) +api_router.include_router(base.router) api_router.include_router(terminology.router) api_router.include_router(data_training.router) api_router.include_router(datasource.router) diff --git a/backend/apps/data_training/api/data_training.py b/backend/apps/data_training/api/data_training.py index 134ff90b..9d40c5ca 100644 --- a/backend/apps/data_training/api/data_training.py +++ b/backend/apps/data_training/api/data_training.py @@ -8,7 +8,7 @@ import pandas as pd from fastapi import APIRouter, File, UploadFile, Query -from fastapi.responses import StreamingResponse, FileResponse +from fastapi.responses import StreamingResponse from apps.chat.models.chat_model import AxisObj from apps.data_training.curd.data_training import page_data_training, create_training, update_training, delete_training, \ @@ -16,7 +16,6 @@ from apps.data_training.models.data_training_model import DataTrainingInfo from common.core.config import settings from common.core.deps import SessionDep, CurrentUser, Trans -from common.core.file import FileRequest from common.utils.data_format import DataFormat router = APIRouter(tags=["DataTraining"], prefix="/system/data-training") @@ -213,30 +212,3 @@ def inner(): } return await asyncio.to_thread(inner) - - -@router.post("/download-fail-info") -async def download_excel(req: FileRequest): - """ - 根据文件路径下载 Excel 文件 - """ - filename = req.file - file_path = os.path.join(path, filename) - - # 检查文件是否存在 - if not os.path.exists(file_path): - raise HTTPException(404, "File Not Exists") - - # 检查文件是否是 Excel 文件 - if not filename.endswith('_error.xlsx'): - raise HTTPException(400, "Only support _error.xlsx") - - # 获取文件名 - filename = os.path.basename(file_path) - - # 返回文件 - return FileResponse( - path=file_path, - filename=filename, - media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' - ) diff --git a/backend/apps/settings/api/base.py b/backend/apps/settings/api/base.py new file mode 100644 index 00000000..5b96a0d0 --- /dev/null +++ b/backend/apps/settings/api/base.py @@ -0,0 +1,39 @@ +import os +from http.client import HTTPException + +from fastapi import APIRouter +from fastapi.responses import FileResponse + +from common.core.config import settings +from common.core.file import FileRequest + +router = APIRouter(tags=["System"], prefix="/system") + +path = settings.EXCEL_PATH + + +@router.post("/download-fail-info") +async def download_excel(req: FileRequest): + """ + 根据文件路径下载 Excel 文件 + """ + filename = req.file + file_path = os.path.join(path, filename) + + # 检查文件是否存在 + if not os.path.exists(file_path): + raise HTTPException(404, "File Not Exists") + + # 检查文件是否是 Excel 文件 + if not filename.endswith('_error.xlsx'): + raise HTTPException(400, "Only support _error.xlsx") + + # 获取文件名 + filename = os.path.basename(file_path) + + # 返回文件 + return FileResponse( + path=file_path, + filename=filename, + media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + ) diff --git a/backend/apps/settings/api/terminology.py b/backend/apps/settings/api/terminology.py deleted file mode 100644 index 708e6ee7..00000000 --- a/backend/apps/settings/api/terminology.py +++ /dev/null @@ -1,68 +0,0 @@ -from fastapi import APIRouter -from sqlmodel import select -from apps.settings.models.setting_models import term_model -from apps.settings.schemas.setting_schemas import term_schema_creator -from common.core.deps import SessionDep -from common.core.pagination import Paginator -from common.core.schemas import PaginatedResponse, PaginationParams -router = APIRouter(tags=["Settings"], prefix="/settings/terminology") - - -@router.get("/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[term_model]) -async def pager( - session: SessionDep, - pageNum: int, - pageSize: int -): - pagination = PaginationParams(page=pageNum, size=pageSize) - paginator = Paginator(session) - filters = {} - return await paginator.get_paginated_response( - stmt=term_model, - pagination=pagination, - **filters) - - -@router.get("/{id}", response_model=term_model) -async def get_terminology_by_id( - session: SessionDep, - id: int -): - term = session.get(term_model, id) - return term - -@router.post("", response_model=term_model) -async def add_terminology( - session: SessionDep, - creator: term_schema_creator -): - terminology = term_model(**creator.model_dump()) - session.add(terminology) - session.commit() - return terminology - -@router.put("", response_model=term_model) -async def update_terminology( - session: SessionDep, - terminology: term_model -): - terminology.id = int(terminology.id) - term = session.exec(select(term_model).where(term_model.id == terminology.id)).first() - update_data = terminology.model_dump(exclude_unset=True) - for field, value in update_data.items(): - setattr(term, field, value) - session.add(term) - session.commit() - return terminology - -@router.delete("/{id}", response_model=term_model) -async def delete_terminology( - session: SessionDep, - id: int -): - term = session.exec(select(term_model).where(term_model.id == id)).first() - session.delete(term) - session.commit() - return { - "message": f"Terminology with ID {id} deleted successfully." - } diff --git a/frontend/src/api/professional.ts b/frontend/src/api/professional.ts index 36599f47..64408d3a 100644 --- a/frontend/src/api/professional.ts +++ b/frontend/src/api/professional.ts @@ -16,13 +16,4 @@ export const professionalApi = { responseType: 'blob', requestOptions: { customError: true }, }), - downloadError: (path: any) => - request.post( - `/system/terminology/download-fail-info`, - { file: path }, - { - responseType: 'blob', - requestOptions: { customError: true }, - } - ), } diff --git a/frontend/src/api/setting.ts b/frontend/src/api/setting.ts index 13dd64e4..456e5b6d 100644 --- a/frontend/src/api/setting.ts +++ b/frontend/src/api/setting.ts @@ -1,10 +1,20 @@ import { request } from '@/utils/request' -export const termApi = { +export const settingsApi = { pager: (pageNumber: number, pageSize: number) => request.get(`/settings/terminology/pager/${pageNumber}/${pageSize}`), add: (data: any) => request.post('/settings/terminology', data), edit: (data: any) => request.put('/settings/terminology', data), delete: (id: number) => request.delete(`/settings/terminology/${id}`), query: (id: number) => request.get(`/settings/terminology/${id}`), + + downloadError: (path: any) => + request.post( + `/system/download-fail-info`, + { file: path }, + { + responseType: 'blob', + requestOptions: { customError: true }, + } + ), } diff --git a/frontend/src/api/training.ts b/frontend/src/api/training.ts index dbb83ee0..ebc68e69 100644 --- a/frontend/src/api/training.ts +++ b/frontend/src/api/training.ts @@ -15,13 +15,4 @@ export const trainingApi = { responseType: 'blob', requestOptions: { customError: true }, }), - downloadError: (path: any) => - request.post( - `/system/data-training/download-fail-info`, - { file: path }, - { - responseType: 'blob', - requestOptions: { customError: true }, - } - ), } diff --git a/frontend/src/views/setting/Professional.vue b/frontend/src/views/setting/Professional.vue deleted file mode 100644 index 4ab19613..00000000 --- a/frontend/src/views/setting/Professional.vue +++ /dev/null @@ -1,340 +0,0 @@ - - - - - diff --git a/frontend/src/views/setting/index.vue b/frontend/src/views/setting/index.vue deleted file mode 100644 index 7ea3cbfa..00000000 --- a/frontend/src/views/setting/index.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/frontend/src/views/system/professional/index.vue b/frontend/src/views/system/professional/index.vue index 4d5d4f7a..8e15a2cf 100644 --- a/frontend/src/views/system/professional/index.vue +++ b/frontend/src/views/system/professional/index.vue @@ -13,8 +13,8 @@ import EmptyBackground from '@/views/dashboard/common/EmptyBackground.vue' import { useI18n } from 'vue-i18n' import { cloneDeep } from 'lodash-es' import { genFileId, type UploadInstance, type UploadProps, type UploadRawFile } from 'element-plus' -import { trainingApi } from '@/api/training.ts' import { useCache } from '@/utils/useCache.ts' +import { settingsApi } from '@/api/setting.ts' interface Form { id?: string | null @@ -105,7 +105,7 @@ const onSuccess = (response: any) => { fail_info: response.data.error_excel_filename, }) ) - trainingApi + settingsApi .downloadError(response.data.error_excel_filename) .then((res) => { const blob = new Blob([res], { diff --git a/frontend/src/views/system/training/index.vue b/frontend/src/views/system/training/index.vue index 001759d6..f8d538b5 100644 --- a/frontend/src/views/system/training/index.vue +++ b/frontend/src/views/system/training/index.vue @@ -2,6 +2,7 @@ import { computed, nextTick, onMounted, reactive, ref, unref } from 'vue' import icon_export_outlined from '@/assets/svg/icon_export_outlined.svg' import { trainingApi } from '@/api/training' +import { settingsApi } from '@/api/setting.ts' import { formatTimestamp } from '@/utils/date' import { datasourceApi } from '@/api/datasource' import ccmUpload from '@/assets/svg/icon_ccm-upload_outlined.svg' @@ -124,7 +125,7 @@ const onSuccess = (response: any) => { fail_info: response.data.error_excel_filename, }) ) - trainingApi + settingsApi .downloadError(response.data.error_excel_filename) .then((res) => { const blob = new Blob([res], {