feat(course): 新增课程评估组件并完善相关功能

- 创建 AccessComp.vue 组件用于课程评估配置
- 在 createCourse.vue 中引入并注册评估组件
- 添加评估数据结构及默认内容
- 实现评估表单的展示与交互逻辑
- 增加 copyChooseItemData 用于取消操作时的数据恢复
- 修改取消按钮逻辑以支持数据回滚
- 调整组件间通信逻辑以适配新评估功能
This commit is contained in:
陈昱达
2025-11-25 18:14:56 +08:00
parent 13bfa1a58b
commit c6321027e1
2 changed files with 186 additions and 2 deletions

View File

@@ -0,0 +1,165 @@
<script setup>
import {
ElForm,
ElFormItem,
ElInput,
ElRadioButton,
ElRadioGroup,
} from "element-plus";
defineOptions({
resType: 62,
});
const props = defineProps({
dialogVideoForm: {
type: Object,
default: () => ({
name: "",
filePath: "",
isDrag: true,
completeSetup: 0,
setupTage: 0,
openType: "",
}),
},
isPreview: {
type: Boolean,
default: false,
},
});
import { useMediaComponent } from "@/hooks/useMediaComponent";
// Emit updates to parent component
const emit = defineEmits(["update:dialogVideoForm"]);
// 使用hook处理公共逻辑
const { localDialogVideoForm, updateFormValue, fileBaseUrl } =
useMediaComponent(props, emit);
const content = {
countType: "权重配置",
countText: "问题1*80%+问题2*10%+问题3*10%",
resultCount: "[q1]*0.8+[q2]*0.1+[q3]*0.1",
items: [
{
id: "1",
question: "您觉的课程对工作有帮助/启发呢?",
minText: "完全没用",
maxText: "非常有帮助/启发",
qType: 1,
answer: 10,
},
{
id: "2",
question: "您愿意推荐其它同事来上这门课程吗?",
minText: "不愿意",
maxText: "非常愿意",
qType: 1,
answer: 2,
},
{
id: "3",
question: "您愿意参加该教师开设的其它课程吗?",
minText: "不愿意",
maxText: "非常愿意",
qType: 1,
answer: 2,
},
{
id: "4",
question: "学员之声(写下您想说的话)",
minText: "",
maxText: "",
qType: 9,
answer: "",
},
],
};
localDialogVideoForm.value.content = Object.assign(
content,
localDialogVideoForm.value.content
);
updateFormValue("content", localDialogVideoForm.value.content);
</script>
<template>
<el-form ref="form" label-width="100px">
<el-form-item label="评估名称">
<el-input
v-model="localDialogVideoForm.name"
placeholder="请输入评估名称"
:disabled="isPreview"
@update:modelValue="(val) => updateFormValue('name', val)"
></el-input>
</el-form-item>
<div style="margin: 0 auto; width: 80%">
<div class="text-center mb10">京东方大学课程评估V2.0</div>
<div class="mb10">
课程满意度计算方式:{{ localDialogVideoForm.content.countType }}
</div>
<div>满意度:{{ localDialogVideoForm.content.countText }}</div>
<hr />
<div v-if="localDialogVideoForm.content.items">
<div
v-for="(ass, assIdx) in localDialogVideoForm.content.items"
:key="assIdx"
>
<div class="assess-info">{{ assIdx + 1 }}.{{ ass.question }}</div>
<div v-if="ass.qType === 1" class="assess-info" style="height: 20px">
<span style="float: left">{{ ass.minText }}</span>
<span style="float: right">{{ ass.maxText }}</span>
</div>
<div v-if="ass.qType === 1" class="assess-info">
<el-radio-group v-model="ass.answer" class="assessRadio1">
<el-radio-button :label="1">1</el-radio-button>
<el-radio-button :label="2">2</el-radio-button>
<el-radio-button :label="3">3</el-radio-button>
<el-radio-button :label="4">4</el-radio-button>
<el-radio-button :label="5">5</el-radio-button>
<el-radio-button :label="6">6</el-radio-button>
<el-radio-button :label="7">7</el-radio-button>
<el-radio-button :label="8">8</el-radio-button>
<el-radio-button :label="9">9</el-radio-button>
<el-radio-button :label="10">10</el-radio-button>
</el-radio-group>
</div>
<div v-if="ass.qType === 9" class="assess-info">
<el-input
type="textarea"
:rows="4"
v-model="ass.answer"
style="width: 100%"
placeholder=""
></el-input>
</div>
</div>
</div>
</div>
</el-form>
</template>
<style scoped lang="scss">
.assess-info {
margin-bottom: 10px;
}
.assessRadio1 {
.el-radio-button {
margin: 0 10px;
//outline: 1px solid #ecf5ff;
:deep(.el-radio-button__inner) {
border-width: 1px;
border-left: var(--el-border);
border-radius: 5px;
}
&.is-active {
:deep(.el-radio-button__inner) {
border-width: 1px;
border-left: var(--el-color-primary);
border-radius: 5px;
}
}
}
}
</style>