From 3b2ef0c32039e288c4e845a71f37334e7675436d Mon Sep 17 00:00:00 2001 From: shaohuzhang1 Date: Wed, 2 Jul 2025 20:59:48 +0800 Subject: [PATCH] feat: File URL adaptation --- apps/application/models/application.py | 2 +- apps/maxkb/urls.py | 4 +++- apps/oss/retrieval_urls.py | 21 +++++++++++++++++++++ apps/oss/serializers/file.py | 2 +- apps/oss/urls.py | 3 +-- apps/oss/views/file.py | 26 +++++++++++++++----------- ui/src/api/image.ts | 4 ++-- ui/vite.config.ts | 16 +++++++++++----- 8 files changed, 55 insertions(+), 23 deletions(-) create mode 100644 apps/oss/retrieval_urls.py diff --git a/apps/application/models/application.py b/apps/application/models/application.py index 3bdf46a3cd6..a20f76fe07d 100644 --- a/apps/application/models/application.py +++ b/apps/application/models/application.py @@ -73,7 +73,7 @@ class Application(AppModelMixin): model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict) tts_model_params_setting = models.JSONField(verbose_name="模型参数相关设置", default=dict) problem_optimization = models.BooleanField(verbose_name="问题优化", default=False) - icon = models.CharField(max_length=256, verbose_name="应用icon", default="/ui/favicon.ico") + icon = models.CharField(max_length=256, verbose_name="应用icon", default="./favicon.ico") work_flow = models.JSONField(verbose_name="工作流数据", default=dict) type = models.CharField(verbose_name="应用类型", choices=ApplicationTypeChoices.choices, default=ApplicationTypeChoices.SIMPLE, max_length=256) diff --git a/apps/maxkb/urls.py b/apps/maxkb/urls.py index 79ce80b6024..6f7d505ecae 100644 --- a/apps/maxkb/urls.py +++ b/apps/maxkb/urls.py @@ -41,8 +41,10 @@ path(admin_api_prefix, include("knowledge.urls")), path(admin_api_prefix, include("system_manage.urls")), path(admin_api_prefix, include("application.urls")), + path(admin_api_prefix, include("oss.urls")), path(chat_api_prefix, include("chat.urls")), - path('oss/', include('oss.urls')), + path(f'{admin_ui_prefix[1:]}/', include('oss.retrieval_urls')), + path(f'{chat_ui_prefix[1:]}/', include('oss.retrieval_urls')), ] urlpatterns += [ path('schema/', SpectacularAPIView.as_view(), name='schema'), # schema的配置文件的路由,下面两个ui也是根据这个配置文件来生成的 diff --git a/apps/oss/retrieval_urls.py b/apps/oss/retrieval_urls.py new file mode 100644 index 00000000000..77687a6462b --- /dev/null +++ b/apps/oss/retrieval_urls.py @@ -0,0 +1,21 @@ +# coding=utf-8 +""" + @project: MaxKB + @Author:虎虎 + @file: retrieval_urls.py + @date:2025/7/2 19:01 + @desc: +""" +from django.urls import re_path + +from . import views + +app_name = 'oss' + +urlpatterns = [ + re_path(rf'^(.*)/oss/file/(?P[\w-]+)/?$', + views.FileRetrievalView.as_view()), + re_path(rf'oss/file/(?P[\w-]+)/?$', + views.FileRetrievalView.as_view()), + +] diff --git a/apps/oss/serializers/file.py b/apps/oss/serializers/file.py index 63406a02c02..cfa22c01612 100644 --- a/apps/oss/serializers/file.py +++ b/apps/oss/serializers/file.py @@ -67,7 +67,7 @@ def upload(self, with_valid=True): file_id = meta.get('file_id', uuid.uuid7()) file = File(id=file_id, file_name=self.data.get('file').name, meta=meta) file.save(self.data.get('file').read()) - return f'/oss/file/{file_id}' + return f'./oss/file/{file_id}' class Operate(serializers.Serializer): id = serializers.UUIDField(required=True) diff --git a/apps/oss/urls.py b/apps/oss/urls.py index 3005b1c8e73..f344049f105 100644 --- a/apps/oss/urls.py +++ b/apps/oss/urls.py @@ -5,6 +5,5 @@ app_name = 'oss' urlpatterns = [ - path('file', views.FileView.as_view()), - path('file/', views.FileView.Operate.as_view()), + path('oss/file', views.FileView.as_view()), ] diff --git a/apps/oss/views/file.py b/apps/oss/views/file.py index a6e11b3056d..21f2c4be2cd 100644 --- a/apps/oss/views/file.py +++ b/apps/oss/views/file.py @@ -12,6 +12,20 @@ from oss.serializers.file import FileSerializer +class FileRetrievalView(APIView): + @extend_schema( + methods=['GET'], + summary=_('Get file'), + description=_('Get file'), + operation_id=_('Get file'), # type: ignore + parameters=FileGetAPI.get_parameters(), + responses=FileGetAPI.get_response(), + tags=[_('File')] # type: ignore + ) + def get(self, request: Request, file_id: str): + return FileSerializer.Operate(data={'id': file_id}).get() + + class FileView(APIView): authentication_classes = [TokenAuth] parser_classes = [MultiPartParser] @@ -31,17 +45,7 @@ def post(self, request: Request): return result.success(FileSerializer(data={'file': request.FILES.get('file')}).upload()) class Operate(APIView): - @extend_schema( - methods=['GET'], - summary=_('Get file'), - description=_('Get file'), - operation_id=_('Get file'), # type: ignore - parameters=FileGetAPI.get_parameters(), - responses=FileGetAPI.get_response(), - tags=[_('File')] # type: ignore - ) - def get(self, request: Request, file_id: str): - return FileSerializer.Operate(data={'id': file_id}).get() + authentication_classes = [TokenAuth] @extend_schema( methods=['DELETE'], diff --git a/ui/src/api/image.ts b/ui/src/api/image.ts index 425e8c6c375..e4800216d54 100644 --- a/ui/src/api/image.ts +++ b/ui/src/api/image.ts @@ -1,7 +1,7 @@ import { Result } from '@/request/Result' import { get, post, del, put } from '@/request/index' -const prefix = '/image' +const prefix = '/oss/file' /** * 上传图片 * @param 参数 file:file @@ -11,5 +11,5 @@ const postImage: (data: any) => Promise> = (data) => { } export default { - postImage + postImage, } diff --git a/ui/vite.config.ts b/ui/vite.config.ts index cc75c9ef7e0..2f07d062521 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -40,11 +40,6 @@ export default defineConfig((conf: any) => { target: 'http://127.0.0.1:8080', changeOrigin: true, } - proxyConf['/oss'] = { - target: 'http://127.0.0.1:8080', - changeOrigin: true, - rewrite: (path: string) => path.replace(ENV.VITE_BASE_PATH, '/'), - } proxyConf['/chat/api'] = { target: 'http://127.0.0.1:8080', changeOrigin: true, @@ -64,6 +59,17 @@ export default defineConfig((conf: any) => { changeOrigin: true, rewrite: (path: string) => path.replace(ENV.VITE_BASE_PATH, '/'), } + + // 前端静态资源转发到本身 + proxyConf[`^${ENV.VITE_BASE_PATH}.+\/oss\/file\/.*$`] = { + target: `http://127.0.0.1:8080`, + changeOrigin: true, + } + // 前端静态资源转发到本身 + proxyConf[`^${ENV.VITE_BASE_PATH}oss\/file\/.*$`] = { + target: `http://127.0.0.1:8080`, + changeOrigin: true, + } // 前端静态资源转发到本身 proxyConf[ENV.VITE_BASE_PATH] = { target: `http://127.0.0.1:${ENV.VITE_APP_PORT}`,