|
@@ -6,20 +6,21 @@ import VoiceSelector from '@/components/VoiceSelector.vue'
|
|
|
import LangSelector from '@/components/LangSelector.vue'
|
|
import LangSelector from '@/components/LangSelector.vue'
|
|
|
import NationalitySelector from '@/components/NationalitySelector.vue'
|
|
import NationalitySelector from '@/components/NationalitySelector.vue'
|
|
|
import { saveRole } from '@/api/modules/anycallService'
|
|
import { saveRole } from '@/api/modules/anycallService'
|
|
|
-import type { TRole } from '@/api/modules/anycallService'
|
|
|
|
|
|
|
+import type { TSaveRoleParams } from '@/api/modules/anycallService'
|
|
|
// 定义表单数据类型
|
|
// 定义表单数据类型
|
|
|
type IFormData = {
|
|
type IFormData = {
|
|
|
|
|
+ id?: string
|
|
|
name: string
|
|
name: string
|
|
|
- avatar: string[]
|
|
|
|
|
photo: string
|
|
photo: string
|
|
|
prompt: string
|
|
prompt: string
|
|
|
language: string
|
|
language: string
|
|
|
|
|
+ languageCode: string
|
|
|
|
|
+ area: string
|
|
|
|
|
+ areaCode: string
|
|
|
gender: number
|
|
gender: number
|
|
|
description: string
|
|
description: string
|
|
|
- clonedVoice: boolean
|
|
|
|
|
- voice: string
|
|
|
|
|
|
|
+ voiceId: string
|
|
|
voiceName: string
|
|
voiceName: string
|
|
|
- nationality?: string
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 定义组件的属性
|
|
// 定义组件的属性
|
|
@@ -43,11 +44,12 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
mode: 'create'
|
|
mode: 'create'
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+const avatars = ref<string[]>([])
|
|
|
|
|
+
|
|
|
const emit = defineEmits<Emits>()
|
|
const emit = defineEmits<Emits>()
|
|
|
|
|
|
|
|
// 创建本地响应式变量用于 v-model 绑定
|
|
// 创建本地响应式变量用于 v-model 绑定
|
|
|
const dialogVisible = ref(props.visible)
|
|
const dialogVisible = ref(props.visible)
|
|
|
-const dialogCardSelectorVisible = ref(false)
|
|
|
|
|
|
|
|
|
|
// 监听 props.visible 变化,更新本地变量
|
|
// 监听 props.visible 变化,更新本地变量
|
|
|
watch(() => props.visible, (newVisible) => {
|
|
watch(() => props.visible, (newVisible) => {
|
|
@@ -65,15 +67,17 @@ const editFormRef = ref<FormInstance>();
|
|
|
const currentSelected = ref<any>(null)
|
|
const currentSelected = ref<any>(null)
|
|
|
|
|
|
|
|
// 响应式数据 - 直接定义所有必需字段
|
|
// 响应式数据 - 直接定义所有必需字段
|
|
|
-const formData = ref<Partial<IFormData>>({
|
|
|
|
|
|
|
+const formData = ref<Partial<IFormData> & {voiceId: string, voiceName: string}>({
|
|
|
name: '',
|
|
name: '',
|
|
|
- avatar: [],
|
|
|
|
|
photo: '',
|
|
photo: '',
|
|
|
prompt: '',
|
|
prompt: '',
|
|
|
language: '',
|
|
language: '',
|
|
|
|
|
+ languageCode: '',
|
|
|
|
|
+ area: '',
|
|
|
|
|
+ areaCode: '',
|
|
|
description: '',
|
|
description: '',
|
|
|
gender: 1,
|
|
gender: 1,
|
|
|
- voice: '',
|
|
|
|
|
|
|
+ voiceId: '',
|
|
|
voiceName: '',
|
|
voiceName: '',
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -86,6 +90,7 @@ watch(() => props.modelValue, (newModelValue) => {
|
|
|
...formData.value,
|
|
...formData.value,
|
|
|
...newModelValue
|
|
...newModelValue
|
|
|
};
|
|
};
|
|
|
|
|
+ avatars.value = newModelValue.photo ? [newModelValue.photo] : []
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -120,17 +125,19 @@ function resetForm() {
|
|
|
if (editFormRef.value) {
|
|
if (editFormRef.value) {
|
|
|
editFormRef.value.resetFields()
|
|
editFormRef.value.resetFields()
|
|
|
}
|
|
}
|
|
|
|
|
+ avatars.value = [],
|
|
|
formData.value = {
|
|
formData.value = {
|
|
|
- avatar: [],
|
|
|
|
|
photo: '',
|
|
photo: '',
|
|
|
name: '',
|
|
name: '',
|
|
|
prompt: '',
|
|
prompt: '',
|
|
|
description: '',
|
|
description: '',
|
|
|
language: '',
|
|
language: '',
|
|
|
|
|
+ languageCode: '',
|
|
|
|
|
+ area: '',
|
|
|
|
|
+ areaCode: '',
|
|
|
gender: 1,
|
|
gender: 1,
|
|
|
- voice: '',
|
|
|
|
|
|
|
+ voiceId: '',
|
|
|
voiceName: '',
|
|
voiceName: '',
|
|
|
- nationality: ''
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -141,23 +148,23 @@ async function handleConfirm() {
|
|
|
try {
|
|
try {
|
|
|
await editFormRef.value.validate()
|
|
await editFormRef.value.validate()
|
|
|
const defaultData = {
|
|
const defaultData = {
|
|
|
- avatar: "",
|
|
|
|
|
- clonedVoice: false,
|
|
|
|
|
- clonedVoiceFileName: "",
|
|
|
|
|
- description: "",
|
|
|
|
|
- gender: 1,
|
|
|
|
|
- isCloning: false,
|
|
|
|
|
- language: "US",
|
|
|
|
|
- name: "",
|
|
|
|
|
- prompt: "",
|
|
|
|
|
- voice: '',
|
|
|
|
|
- voiceFileName: "",
|
|
|
|
|
- voiceId: "",
|
|
|
|
|
|
|
+ // Matches TSaveRoleParams
|
|
|
|
|
+ id: formData.value.id,
|
|
|
|
|
+ name: formData.value.name ?? '',
|
|
|
|
|
+ voiceId: formData.value.voiceId ?? '',
|
|
|
|
|
+ language: formData.value.language ?? '',
|
|
|
|
|
+ languageCode: formData.value.languageCode ?? '',
|
|
|
|
|
+ area: formData.value.area ?? '',
|
|
|
|
|
+ areaCode: formData.value.areaCode ?? '',
|
|
|
|
|
+ description: formData.value.description ?? '',
|
|
|
|
|
+ prompt: formData.value.prompt ?? '',
|
|
|
|
|
+ photo: '',
|
|
|
|
|
+ gender: formData.value.gender ?? 1,
|
|
|
}
|
|
}
|
|
|
- const avatar = formData.value.avatar?.[0] ?? ''
|
|
|
|
|
|
|
+ const avatar = avatars.value?.[0] ?? ''
|
|
|
// 字段全后再对齐字段
|
|
// 字段全后再对齐字段
|
|
|
//@ts-ignore
|
|
//@ts-ignore
|
|
|
- const d: TRole = { ...defaultData, ...formData.value, avatar , photo: avatar }
|
|
|
|
|
|
|
+ const d: TSaveRoleParams = { ...defaultData, photo: avatar }
|
|
|
console.log(d)
|
|
console.log(d)
|
|
|
const { code } = await saveRole(d)
|
|
const { code } = await saveRole(d)
|
|
|
if (code === 0) {
|
|
if (code === 0) {
|
|
@@ -220,45 +227,25 @@ const handleRemoveAgent = ()=> {
|
|
|
<ElInput type="textarea" v-model="formData.description" placeholder="Enter description" />
|
|
<ElInput type="textarea" v-model="formData.description" placeholder="Enter description" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
- <!-- <ElFormItem label="use voice" prop="voiceName" label-width="120">
|
|
|
|
|
- <LLMSelector v-model="formData.voiceId" />
|
|
|
|
|
- </ElFormItem> -->
|
|
|
|
|
-
|
|
|
|
|
- <ElFormItem label="use voice" prop="voice" label-width="120">
|
|
|
|
|
- <VoiceSelector :gender="formData.gender ?? 1" v-model="formData.voice" v-model:voice-name="formData.voiceName" />
|
|
|
|
|
|
|
+ <ElFormItem label="音色" prop="voice" label-width="120">
|
|
|
|
|
+ <VoiceSelector :gender="formData.gender ?? 1" v-model="formData.voiceId" v-model:voice-name="formData.voiceName" />
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
- <ElFormItem label="Avatar" prop="avatar" label-width="120">
|
|
|
|
|
|
|
+ <ElFormItem label="Avatar" prop="photo" label-width="120">
|
|
|
<FaImageUpload
|
|
<FaImageUpload
|
|
|
- v-model="formData.avatar"
|
|
|
|
|
|
|
+ v-model="avatars"
|
|
|
:max-count="1"
|
|
:max-count="1"
|
|
|
list-type="avatar"
|
|
list-type="avatar"
|
|
|
/>
|
|
/>
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
- <!-- <ElFormItem label="大模型" prop="agentId" label-width="120">
|
|
|
|
|
- <ElSpace wrap>
|
|
|
|
|
- <ElButton v-if="mode === 'create'" type="primary" @click="dialogCardSelectorVisible = true">选择大模型</ElButton>
|
|
|
|
|
- </ElSpace>
|
|
|
|
|
- </ElFormItem> -->
|
|
|
|
|
- <ElFormItem label="国籍" prop="nationality">
|
|
|
|
|
|
|
+ <ElFormItem label="区域" prop="区域">
|
|
|
|
|
|
|
|
- <NationalitySelector v-model="formData.nationality" placeholder="请选择国籍"></NationalitySelector>
|
|
|
|
|
|
|
+ <NationalitySelector v-model="formData.areaCode" v-model:key="formData.area" placeholder="区域"></NationalitySelector>
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
<ElFormItem label="语言" prop="language">
|
|
<ElFormItem label="语言" prop="language">
|
|
|
- <LangSelector v-model="formData.language" placeholder="请选择语言"></LangSelector>
|
|
|
|
|
- </ElFormItem>
|
|
|
|
|
-
|
|
|
|
|
- <ElFormItem label="clonedVoice" prop="clonedVoice">
|
|
|
|
|
- <ElSpace>
|
|
|
|
|
- <ElSwitch
|
|
|
|
|
- v-model="formData.clonedVoice"
|
|
|
|
|
- :active-value="true"
|
|
|
|
|
- :inactive-value="false"
|
|
|
|
|
- />
|
|
|
|
|
- {{formData.clonedVoice === true ? 'true' : 'false'}}
|
|
|
|
|
- </ElSpace>
|
|
|
|
|
|
|
+ <LangSelector v-model="formData.languageCode" v-model:key="formData.language" placeholder="请选择语言"></LangSelector>
|
|
|
</ElFormItem>
|
|
</ElFormItem>
|
|
|
|
|
|
|
|
</ElForm>
|
|
</ElForm>
|