feat(course): 添加作业组件及文件上传功能

- 新增 HomeWorkComp 组件用于作业内容配置
- 实现作业名称、内容、附件、截至日期和提交模式设置
- 集成 FileUpload 组件支持作业附件上传与管理
- 更新 createCourse.vue 引入并注册 HomeWorkComp
- 修改 addHomework 方法以打开作业设置对话框
- 添加相关依赖包如 fastify 及其生态库
- 调整部分包的引用关系去除 dev 标记
This commit is contained in:
陈昱达
2025-11-25 17:20:50 +08:00
parent 6c87968ab4
commit 13bfa1a58b
4 changed files with 714 additions and 25 deletions

View File

@@ -0,0 +1,122 @@
<script setup>
import {
ElForm,
ElFormItem,
ElInput,
ElRadio,
ElRadioGroup,
ElUpload,
ElDatePicker,
ElButton,
} from "element-plus";
import { Close } from "@element-plus/icons-vue";
defineOptions({
resType: 60,
});
import FileUpload from "@/components/FileUpload/index.vue";
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 uploadHomeworkFile = (res) => {
localDialogVideoForm.value.file = res.result.filePath;
updateFormValue("file", res.result.filePath);
};
const removeHomeworkFile = () => {
localDialogVideoForm.value.file = "";
updateFormValue("file", "");
};
</script>
<template>
<el-form label-position="right" label-width="100px">
<el-form-item label="名称">
<el-input
v-model="localDialogVideoForm.name"
:disabled="isPreview"
placeholder="作业的名称(限50字以内)"
maxlength="50"
show-word-limit
@update:modelValue="(val) => updateFormValue('name', val)"
></el-input>
</el-form-item>
<el-form-item label="内容">
<el-input
type="textarea"
placeholder="限255字以内"
show-word-limit
v-model="localDialogVideoForm.content"
:disabled="isPreview"
maxlength="255"
@update:modelValue="(val) => updateFormValue('content', val)"
></el-input>
</el-form-item>
<el-form-item label="附件">
<div v-if="localDialogVideoForm.file !== ''" class="flex align-center">
<a :href="fileBaseUrl + localDialogVideoForm.file" target="_blank"
>下载作业附件
</a>
<Close
@click="removeHomeworkFile"
v-if="!isPreview"
class="ml10"
style="color: red; width: 15px; cursor: pointer"
></Close>
</div>
<file-upload
v-else
dir="files"
:isShowTip="false"
:disabled="isPreview"
@success="uploadHomeworkFile"
@remove="removeHomeworkFile"
></file-upload>
</el-form-item>
<el-form-item label="截至日期">
<el-date-picker
v-model="localDialogVideoForm.deadTime"
:disabled="isPreview"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="选择日期时间"
@update:modelValue="(val) => updateFormValue('deadTime', val)"
></el-date-picker>
</el-form-item>
<el-form-item label="提交模式">
<el-radio-group
:model-value="localDialogVideoForm.submitMode"
:disabled="isPreview"
@update:modelValue="(val) => updateFormValue('submitMode', val)"
>
<el-radio :label="1">附件文档</el-radio>
<el-radio :label="2">在线填写</el-radio>
<el-radio :label="3">前两种任选</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
</template>
<style scoped lang="scss"></style>