IntelliClass_FE/components/fn/teach/Plan.vue
Timothy Yin 49b9e97ee8
Some checks failed
CI / test (push) Failing after 1m12s
CI / lint (push) Failing after 14m36s
feat: 完成教学设计模块(除了课程图谱),添加了炫酷的思考中动画
2025-04-27 18:51:40 +08:00

132 lines
3.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script lang="ts" setup>
import { toTypedSchema } from '@vee-validate/zod'
import { useForm } from 'vee-validate'
import { toast } from 'vue-sonner'
import { z } from 'zod'
const route = useRoute()
const router = useRouter()
const historyStore = useLlmHistories('course-teaching-plan')
const { conversations } = storeToRefs(historyStore)
const { updateConversation, appendChunkToLast, isConversationExist } =
historyStore
const activeConversationId = ref<string | null>(null)
watch(activeConversationId, (val) => {
if (val) {
router.replace({
query: {
fn: route.query.fn,
conversationId: val,
},
})
} else {
router.replace({
query: {
fn: route.query.fn,
},
})
}
})
onMounted(() => {
if (route.query.conversationId) {
if (isConversationExist(route.query.conversationId as string)) {
activeConversationId.value = route.query.conversationId as string
} else {
activeConversationId.value = null
toast.error('会话不存在')
}
}
})
const schema = z.object({
identity: z.string({ required_error: '请输入你的身份' }).describe('身份'),
mainPlan: z.string({ required_error: '请输入主要计划' }).describe('主要计划'),
planTemplate: z
.string({ required_error: '请输入教学计划模板' })
.describe('教学计划模板'),
otherRequirement: z.string().describe('其他要求').optional(),
})
const form = useForm({
validationSchema: toTypedSchema(schema),
})
const onSubmit = (values: z.infer<typeof schema>) => {
http_stream<z.infer<typeof schema>>('/ai/teaching-plan/stream', values, {
onStart(id, created_at) {
activeConversationId.value = id
updateConversation(id, {
id,
created_at,
title: values.mainPlan,
messages: [
{
role: 'user',
content: `*生成一份教学计划*`,
},
{
role: 'assistant',
content: '',
},
],
})
},
onTextChunk: (chunk) => {
appendChunkToLast(activeConversationId.value!, chunk)
},
onComplete: (id, finished_at) => {
updateConversation(id!, {
finished_at,
})
},
})
}
</script>
<template>
<div>
<AiConversation
:form
:form-schema="schema"
:form-field-config="{
identity: {
inputProps: {
placeholder: '请输入你的身份高中数学教师大学物理教师',
},
},
mainPlan: {
component: 'textarea',
inputProps: {
placeholder:
'请输入主要计划课程目标教学内容安排教学方法设计',
},
},
planTemplate: {
component: 'textarea',
inputProps: {
placeholder:
'请输入教学计划模板教学目标教学进度考核评估方式',
},
},
otherRequirement: {
inputProps: {
placeholder: '请输入其他要求',
},
},
}"
:conversations
:active-conversation-id="activeConversationId"
disable-user-input
@submit="onSubmit"
@update:conversation-id="activeConversationId = $event"
@delete-conversation="historyStore.removeConversation($event)"
/>
</div>
</template>
<style scoped></style>