diff --git a/components/SlideCreateCourseGreen.vue b/components/SlideCreateCourseGreen.vue index 70511e8..f1e8a2f 100644 --- a/components/SlideCreateCourseGreen.vue +++ b/components/SlideCreateCourseGreen.vue @@ -18,6 +18,7 @@ const createCourseSchema = object({ title: string().trim().min(4, '标题必须大于4个字符').max(20, '标题不能超过20个字符').required('请输入视频标题'), content: string().trim().min(4, '内容必须大于4个字符').max(1000, '内容不能超过1000个字符').required('请输入驱动文本内容'), digital_human_id: number().not([0], '请选择数字人'), + source_type: number().default(0).required(), speed: number().default(1.0).min(0.5).max(1.5).required(), }) @@ -27,6 +28,7 @@ const createCourseState = reactive({ title: undefined, content: undefined, digital_human_id: 0, + source_type: 0, speed: 1.0, }) @@ -34,7 +36,9 @@ const selected_digital_human = ref(null) watchEffect(() => { if (selected_digital_human.value) { - createCourseState.digital_human_id = selected_digital_human.value.model_id || selected_digital_human.value.id! + // 2025.02.26 使用内部数字人 ID + createCourseState.digital_human_id = selected_digital_human.value.digital_human_id! + createCourseState.source_type = selected_digital_human.value.type! } }) @@ -48,6 +52,7 @@ const onCreateCourseGreenSubmit = async (event: FormSubmitEvent { if (!!res.data.task_id) { toast.add({ diff --git a/composables/useFileGo.ts b/composables/useFileGo.ts index 19cbbea..67dc3ed 100644 --- a/composables/useFileGo.ts +++ b/composables/useFileGo.ts @@ -1,38 +1,50 @@ -import { useFetchWrapped } from '~/composables/useFetchWrapped' +import { useFetchWrapped } from './useFetchWrapped' +import { useLoginState } from './useLoginState' -const putOSS = (file: File, signed_url: string) => new Promise((resolve, reject) => { - let xhr = new XMLHttpRequest() - xhr.open('PUT', signed_url as string) - xhr.setRequestHeader('Content-Type', '') - xhr.onload = () => { - if (xhr.status === 200) { - resolve() - } else { - reject() - } - } - xhr.onerror = reject - xhr.send(file) -}) - -export const useFileGo = (file: File) => new Promise((resolve, reject) => { - useFetchWrapped>('App.Tools_Upload.UploadOssMaterial', { - token: useLoginState().token!, - user_id: useLoginState().user.id, - file_name: file.name, - file_type: file.type, - file_size: file.size, - }).then(async res => { - if (res.data !== '') { - try { - await putOSS(file, res.data) - let url = res.data.split('?')[0] - resolve(url) - } catch (err) { - reject(err) +const putOSS = (file: File, signed_url: string) => + new Promise((resolve, reject) => { + let xhr = new XMLHttpRequest() + xhr.open('PUT', signed_url as string) + xhr.setRequestHeader('Content-Type', '') + xhr.onload = () => { + if (xhr.status === 200) { + resolve() + } else { + reject() } } - }).catch(err => { - reject(err) + xhr.onerror = reject + xhr.send(file) + }) + +export const useFileGo = ( + file: File, + type: 'material' | 'ppt' | 'subtitles' | 'preview' | 'tmp' +) => + new Promise((resolve, reject) => { + useFetchWrapped>( + 'App.Tools_Upload.DirectUpload', + { + token: useLoginState().token!, + user_id: useLoginState().user.id, + file_name: file.name, + file_type: type, + file_size: file.size, + file_mime: file.type, + } + ) + .then(async (res) => { + if (res.data !== '') { + try { + await putOSS(file, res.data) + let url = res.data.split('?')[0] + resolve(url) + } catch (err) { + reject(err) + } + } + }) + .catch((err) => { + reject(err) + }) }) -}) \ No newline at end of file diff --git a/pages/generation/avatar-models.vue b/pages/generation/avatar-models.vue index 3b3ebe6..12f4f7a 100644 --- a/pages/generation/avatar-models.vue +++ b/pages/generation/avatar-models.vue @@ -127,7 +127,7 @@ const createAvatarState = reactive({ description: '', model_id: undefined, avatar: '', - type: 0, + type: 2, }) const createAvatarSchema = object({ @@ -424,10 +424,9 @@ const onAvatarUpload = async (files: FileList) => { > diff --git a/typings/types.d.ts b/typings/types.d.ts index 8597c65..5cf1185 100644 --- a/typings/types.d.ts +++ b/typings/types.d.ts @@ -58,16 +58,33 @@ interface ServiceBalance { request_type: ServiceTag } +/** + * Represents an item related to a digital human. + * + * @interface DigitalHumanItem + * + * @property {number} user_id - The ID of the user associated with the digital human. + * @property {number} create_time - The timestamp when the digital human item was created. + * @property {number} [id] - Internal model ID + * @property {number} model_id - 上Upstream model ID + * @property {string} avatar - The URL or path to the avatar image of the digital human. + * @property {number} type - 1: upstream, 2: internal + * @property {string} name - The name of the digital human. + * @property {string} description - A brief description of the digital human. + * @property {number} [digital_human_id] - The ID of the digital human. + */ interface DigitalHumanItem { user_id: number create_time: number + // Local ID + id?: number + // Upstream model ID model_id: number avatar: string - type: number + type?: 1 | 2 name: string description: string - id?: number - digital_human_id: number + digital_human_id?: number } interface GBVideoItem { @@ -164,8 +181,9 @@ namespace req { namespace file { interface Upload { file_name: string - file_type: string + file_type: 'material' | 'ppt' | 'subtitles' | 'preview' | 'tmp' file_size: number + file_mime: string } } @@ -231,6 +249,8 @@ namespace req { content: string bg_img?: string speed?: number + // 1: upstream 2: internal + source_type?: 1 | 2 } interface GBVideoDelete {