diff --git a/src/api/axios.config.ts b/src/api/axios.config.ts index 8b95c27..ee19b65 100644 --- a/src/api/axios.config.ts +++ b/src/api/axios.config.ts @@ -14,8 +14,3 @@ export const fetchAllowList = [ // 接口黑名单 export const fetchBlockList = [] - -// fts 接口列表(不添加 /Visual/v1 前缀) -export const ftsList = [ - '/Assets/v1/fts/uploader' -] diff --git a/src/api/axios.ts b/src/api/axios.ts index b3a7166..e868d15 100644 --- a/src/api/axios.ts +++ b/src/api/axios.ts @@ -5,8 +5,6 @@ import { StorageEnum } from '@/enums/storageEnum' import { axiosPre } from '@/settings/httpSetting' import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d' import { redirectErrorPage, getLocalStorage, routerTurnByName, isPreview } from '@/utils' -import { fetchAllowList, ftsList } from './axios.config' -import includes from 'lodash/includes' export interface MyResponseType { code: ResultEnum @@ -28,12 +26,6 @@ const axiosInstance = axios.create({ axiosInstance.interceptors.request.use( (config: InternalAxiosRequestConfig) => { - // fts 接口特殊处理:使用完整路径,不添加 /Visual/v1 前缀 - if (config.url && includes(ftsList, config.url)) { - const baseUrl = import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : import.meta.env.VITE_DEV_PATH - config.baseURL = baseUrl - } - // 获取 token 并添加到所有请求 const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE) if (info) { diff --git a/src/api/fts.ts b/src/api/fts.ts deleted file mode 100644 index 4852ff6..0000000 --- a/src/api/fts.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AxiosProgressEvent } from "axios"; -import axiosInstance from '@/api/axios' -import { ContentTypeEnum } from '@/enums/httpEnum' - -/** 上传文件 */ -const FtsUpload = (data: any, onUploadProgress?: (progress: number) => void) => { - data.append('provider', 'local') - data.append('bucket', 'visual') - - // 使用完整URL,绕过 /Visual/v1 前缀 - const baseUrl = import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : import.meta.env.VITE_DEV_PATH - - return axiosInstance({ - url: `${baseUrl}/Assets/v1/fts/uploader`, - method: 'POST', - data, - headers: { - 'Content-Type': ContentTypeEnum.FORM_DATA - }, - onUploadProgress: onUploadProgress ? (progressEvent: AxiosProgressEvent) => { - if (progressEvent.total) { - const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); - onUploadProgress(percentCompleted); - } - } : undefined - }) -} - -export default FtsUpload diff --git a/src/api/path/project.api.ts b/src/api/path/project.api.ts index e903bff..d348ace 100644 --- a/src/api/path/project.api.ts +++ b/src/api/path/project.api.ts @@ -81,19 +81,3 @@ export const changeProjectReleaseApi = async (data: object) => { httpErrorHandle() } } - -// * 上传文件 -export const uploadFile = async (data: object) => { - try { - const res = await http(RequestHttpEnum.POST)<{ - /** - * 文件地址 - */ - fileName: string, - fileurl: string, - }>(`${ModuleTypeEnum.PROJECT}/upload`, data, ContentTypeEnum.FORM_DATA) - return res - } catch { - httpErrorHandle() - } -} diff --git a/src/api/path/project.d.ts b/src/api/path/project.d.ts index 8dbcfe9..6f64f0d 100644 --- a/src/api/path/project.d.ts +++ b/src/api/path/project.d.ts @@ -21,6 +21,18 @@ export type ProjectItem = { * 预览图片url */ indexImage: string + /** + * 预览图片 Files 标识 + */ + indexImageFileId: string + /** + * 背景图片url + */ + backgroundImage: string + /** + * 背景图片 Files 标识 + */ + backgroundImageFileId: string /** * 创建者 identity */ @@ -36,4 +48,4 @@ export interface ProjectDetail extends ProjectItem { * 项目参数 */ content: string -} \ No newline at end of file +} diff --git a/src/api/projectFiles.ts b/src/api/projectFiles.ts new file mode 100644 index 0000000..1ac9dd5 --- /dev/null +++ b/src/api/projectFiles.ts @@ -0,0 +1,57 @@ +import { http } from '@/api/http' +import { RequestHttpEnum, ResultEnum } from '@/enums/httpEnum' + +export type ProjectImageKind = 'index' | 'background' + +interface PendingUpload { + file_id: string + object_key: string + upload: { + method: string + url: string + headers: Record + expires_at: string + } +} + +interface CompletedUpload { + file_id: string + url: string +} + +/** 上传项目图片并由 Visual 完成文件绑定。 */ +export async function uploadProjectImage( + projectIdentity: string, + kind: ProjectImageKind, + file: File +): Promise { + const projectPath = `project/${encodeURIComponent(projectIdentity)}/images/${kind}` + const initResponse = await http(RequestHttpEnum.POST)(`${projectPath}/init`, { + filename: file.name, + size: file.size, + content_type: file.type || 'application/octet-stream' + }) + const pendingUpload = initResponse.data + if (initResponse.code !== ResultEnum.SUCCESS || !pendingUpload?.file_id || !pendingUpload.upload?.url) { + throw new Error(initResponse.message || '初始化项目图片上传失败') + } + + const uploadResponse = await fetch(pendingUpload.upload.url, { + method: pendingUpload.upload.method, + headers: pendingUpload.upload.headers, + body: file, + credentials: 'omit' + }) + if (!uploadResponse.ok) { + throw new Error(`上传项目图片失败: HTTP ${uploadResponse.status}`) + } + + const completeResponse = await http(RequestHttpEnum.POST)(`${projectPath}/complete`, { + file_id: pendingUpload.file_id + }) + const completedUpload = completeResponse.data + if (completeResponse.code !== ResultEnum.SUCCESS || !completedUpload?.file_id || !completedUpload.url) { + throw new Error(completeResponse.message || '完成项目图片上传失败') + } + return completedUpload +} diff --git a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue index 1748cf3..79afcf6 100644 --- a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue +++ b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue @@ -126,27 +126,23 @@