2025-02-26 20:55:17 +08:00
parent 6586872327
commit dd633d34e6
4 changed files with 79 additions and 43 deletions

View File

@@ -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<DigitalHumanItem | null>(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<CreateCourseSche
digital_human_id: event.data.digital_human_id,
speed: 2 - event.data.speed,
device_id: 'XSHAssistant Web',
source_type: event.data.source_type as 1 | 2 | undefined,
}).then(res => {
if (!!res.data.task_id) {
toast.add({

View File

@@ -1,6 +1,8 @@
import { useFetchWrapped } from '~/composables/useFetchWrapped'
import { useFetchWrapped } from './useFetchWrapped'
import { useLoginState } from './useLoginState'
const putOSS = (file: File, signed_url: string) => new Promise<void>((resolve, reject) => {
const putOSS = (file: File, signed_url: string) =>
new Promise<void>((resolve, reject) => {
let xhr = new XMLHttpRequest()
xhr.open('PUT', signed_url as string)
xhr.setRequestHeader('Content-Type', '')
@@ -13,16 +15,25 @@ const putOSS = (file: File, signed_url: string) => new Promise<void>((resolve, r
}
xhr.onerror = reject
xhr.send(file)
})
})
export const useFileGo = (file: File) => new Promise<string>((resolve, reject) => {
useFetchWrapped<req.file.Upload & AuthedRequest, BaseResponse<string>>('App.Tools_Upload.UploadOssMaterial', {
export const useFileGo = (
file: File,
type: 'material' | 'ppt' | 'subtitles' | 'preview' | 'tmp'
) =>
new Promise<string>((resolve, reject) => {
useFetchWrapped<req.file.Upload & AuthedRequest, BaseResponse<string>>(
'App.Tools_Upload.DirectUpload',
{
token: useLoginState().token!,
user_id: useLoginState().user.id,
file_name: file.name,
file_type: file.type,
file_type: type,
file_size: file.size,
}).then(async res => {
file_mime: file.type,
}
)
.then(async (res) => {
if (res.data !== '') {
try {
await putOSS(file, res.data)
@@ -32,7 +43,8 @@ export const useFileGo = (file: File) => new Promise<string>((resolve, reject) =
reject(err)
}
}
}).catch(err => {
})
.catch((err) => {
reject(err)
})
})
})

View File

@@ -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) => {
>
<USelect
v-model="createAvatarState.type"
disabled
:options="[
{ label: '系统', value: 0 },
{ label: '用户', value: 1 },
{ label: '内部', value: 2 },
{ label: '上游(万木)', value: 1 },
]"
/>
</UFormGroup>

28
typings/types.d.ts vendored
View File

@@ -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 {