提交 8c92f7f5 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 5b434d34
...@@ -11,11 +11,11 @@ ...@@ -11,11 +11,11 @@
"@element-plus/icons-vue": "^2.1.0", "@element-plus/icons-vue": "^2.1.0",
"@tinymce/tinymce-vue": "^5.0.1", "@tinymce/tinymce-vue": "^5.0.1",
"@vue-flow/controls": "^1.0.4", "@vue-flow/controls": "^1.0.4",
"@vue-flow/core": "^1.15.5", "@vue-flow/core": "^1.16.1",
"@vueuse/core": "^9.13.0", "@vueuse/core": "^9.13.0",
"axios": "^1.3.4", "axios": "^1.3.4",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"element-plus": "^2.2.35", "element-plus": "^2.2.32",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"nanoid": "^4.0.1", "nanoid": "^4.0.1",
"pinia": "^2.0.33", "pinia": "^2.0.33",
...@@ -1611,9 +1611,9 @@ ...@@ -1611,9 +1611,9 @@
} }
}, },
"node_modules/@vue-flow/core": { "node_modules/@vue-flow/core": {
"version": "1.15.5", "version": "1.16.1",
"resolved": "https://registry.npmmirror.com/@vue-flow/core/-/core-1.15.5.tgz", "resolved": "https://registry.npmmirror.com/@vue-flow/core/-/core-1.16.1.tgz",
"integrity": "sha512-HvCxr/JaY8fpJuSrAkhM8d3hqBJe1JBiqlBBSbA02I9AZ4tHqRcb2NfoNMf43ReDtjT1d6kjNAsBF3H2/PRNKw==", "integrity": "sha512-WGaqLhHOVfvbCXK029LdSgSWumjC8368GI9FMV7Zxs0YDBC/z6e0t4akg925M/ejYHU8Vp++Ysm2OmWJeIFAzg==",
"dependencies": { "dependencies": {
"@vueuse/core": "^9.13.0", "@vueuse/core": "^9.13.0",
"d3-drag": "^3.0.0", "d3-drag": "^3.0.0",
...@@ -2641,9 +2641,9 @@ ...@@ -2641,9 +2641,9 @@
"peer": true "peer": true
}, },
"node_modules/element-plus": { "node_modules/element-plus": {
"version": "2.2.35", "version": "2.2.36",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.35.tgz", "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.36.tgz",
"integrity": "sha512-if5QW41hQwVltekRS+avXYtqjRNra/fSgGstXKPR1lSJ81PWQccy+oztw/OP+USqZP/OejFs7rjLPk5MHgT40w==", "integrity": "sha512-9DzLqOVuw8P5Ck8Uqd9XdnDYVg2Z3iosZ1gtk2xDCWNqeoACpldP5gxa/Hbfgp4QeA3xC+f3g+UeoKKu79l28g==",
"dependencies": { "dependencies": {
"@ctrl/tinycolor": "^3.4.1", "@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6", "@element-plus/icons-vue": "^2.0.6",
......
...@@ -18,11 +18,11 @@ ...@@ -18,11 +18,11 @@
"@element-plus/icons-vue": "^2.1.0", "@element-plus/icons-vue": "^2.1.0",
"@tinymce/tinymce-vue": "^5.0.1", "@tinymce/tinymce-vue": "^5.0.1",
"@vue-flow/controls": "^1.0.4", "@vue-flow/controls": "^1.0.4",
"@vue-flow/core": "^1.15.5", "@vue-flow/core": "^1.16.1",
"@vueuse/core": "^9.13.0", "@vueuse/core": "^9.13.0",
"axios": "^1.3.4", "axios": "^1.3.4",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"element-plus": "^2.2.35", "element-plus": "^2.2.32",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"nanoid": "^4.0.1", "nanoid": "^4.0.1",
"pinia": "^2.0.33", "pinia": "^2.0.33",
......
...@@ -45,6 +45,7 @@ export default { ...@@ -45,6 +45,7 @@ export default {
position: absolute; position: absolute;
background-color: #fff; background-color: #fff;
span { span {
font-size: 14px;
margin-right: 5px; margin-right: 5px;
} }
.el-icon { .el-icon {
......
...@@ -44,8 +44,8 @@ const maxScore = computed(() => { ...@@ -44,8 +44,8 @@ const maxScore = computed(() => {
}) })
// 保存 // 保存
function submit() { async function submit() {
formRef.value?.validate().then(updateNode) await formRef.value?.validate().then(updateNode)
} }
function updateNode() { function updateNode() {
...@@ -100,11 +100,19 @@ function updateNode() { ...@@ -100,11 +100,19 @@ function updateNode() {
<!-- <el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button> --> <!-- <el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button> -->
<el-button @click="step--" plain auto-insert-space v-if="step >= 1">上一步</el-button> <el-button @click="step--" plain auto-insert-space v-if="step >= 1">上一步</el-button>
<el-button @click="step++" plain auto-insert-space v-if="step < stepNum">下一步</el-button> <el-button @click="step++" plain auto-insert-space v-if="step < stepNum">下一步</el-button>
<el-button type="primary" auto-insert-space @click="submit" v-if="step === stepNum">保存</el-button> <el-button
type="primary"
auto-insert-space
@click="submit().then(() => $emit('update:modelValue', false))"
v-if="step === stepNum"
>保存</el-button
>
</el-row> </el-row>
<el-row justify="center" v-else> <el-row justify="center" v-else>
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button> <el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary" auto-insert-space @click="submit">保存</el-button> <el-button type="primary" auto-insert-space @click="submit().then(() => $emit('update:modelValue', false))"
>保存</el-button
>
</el-row> </el-row>
</template> </template>
</el-dialog> </el-dialog>
......
...@@ -11,6 +11,7 @@ const props = defineProps<Props>() ...@@ -11,6 +11,7 @@ const props = defineProps<Props>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const role = inject('role') as string const role = inject('role') as string
const templateType = inject('templateType') as string
const formRef = ref<FormInstance>() const formRef = ref<FormInstance>()
const form = reactive({ const form = reactive({
...@@ -38,7 +39,7 @@ function updateNode() { ...@@ -38,7 +39,7 @@ function updateNode() {
<template> <template>
<el-dialog title="组件配置" append-to-body width="600px"> <el-dialog title="组件配置" append-to-body width="600px">
<el-form ref="formRef" :rules="rules" label-suffix=":"> <el-form ref="formRef" :model="form" :rules="rules" label-suffix=":">
<el-row justify="space-between"> <el-row justify="space-between">
<el-form-item label="组件类型">{{ node.data.type }}</el-form-item> <el-form-item label="组件类型">{{ node.data.type }}</el-form-item>
<el-form-item label="组件名称">{{ node.data.name }}</el-form-item> <el-form-item label="组件名称">{{ node.data.name }}</el-form-item>
...@@ -49,20 +50,26 @@ function updateNode() { ...@@ -49,20 +50,26 @@ function updateNode() {
{{ node.data.teacher?.answer_analysis }} {{ node.data.teacher?.answer_analysis }}
</el-form-item> </el-form-item>
<!-- 老师评分 --> <!-- 老师评分 -->
<template v-if="role === 'teacher'"> <template v-if="role === 'teacher' && templateType === '2'">
<el-form-item label="得分"> <el-row justify="center">
<el-input-number v-model="form.score" :controls="false" /> <el-form-item label="得分">
</el-form-item> <el-input-number v-model="form.score" :controls="false" />
</el-form-item>
</el-row>
</template> </template>
<!-- 学生查看评分 --> <!-- 学生查看评分 -->
<template v-if="role === 'student'"> <template v-if="role === 'student' && templateType === '2'">
<el-form-item label="得分">{{ node.data.student?.score }}</el-form-item> <el-row justify="center">
<el-form-item label="得分">{{ node.data.student?.score }}</el-form-item>
</el-row>
</template> </template>
</el-form> </el-form>
<template #footer> <template #footer>
<el-row justify="center"> <el-row justify="center">
<el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button> <el-button plain auto-insert-space @click="$emit('update:modelValue', false)">关闭</el-button>
<el-button type="primary" auto-insert-space @click="submit" v-if="role === 'teacher'">保存</el-button> <el-button type="primary" auto-insert-space @click="submit" v-if="role === 'teacher' && templateType === '2'"
>保存</el-button
>
</el-row> </el-row>
</template> </template>
</el-dialog> </el-dialog>
......
...@@ -8,11 +8,9 @@ const props = withDefaults( ...@@ -8,11 +8,9 @@ const props = withDefaults(
{ canSetting: true, canConnect: true } { canSetting: true, canConnect: true }
) )
const action = inject('action')
const emit = defineEmits<{ (e: 'setting'): void }>() const emit = defineEmits<{ (e: 'setting'): void }>()
const { findNode, removeNodes } = useVueFlow() const { findNode, removeNodes, nodesDraggable, nodesConnectable } = useVueFlow()
// 删除 // 删除
function onRemove() { function onRemove() {
...@@ -24,7 +22,7 @@ function onRemove() { ...@@ -24,7 +22,7 @@ function onRemove() {
<template> <template>
<div class="custom-node"> <div class="custom-node">
<div class="node-toolbar"> <div class="node-toolbar">
<el-icon v-if="action !== 'view'" size="12" @click="onRemove"><Delete /></el-icon> <el-icon v-if="nodesDraggable" size="12" @click="onRemove"><Delete /></el-icon>
<el-icon size="12" @click="emit('setting')" v-if="canSetting"><Setting /></el-icon> <el-icon size="12" @click="emit('setting')" v-if="canSetting"><Setting /></el-icon>
</div> </div>
<div class="custom-node__inner"><slot :node="node" /></div> <div class="custom-node__inner"><slot :node="node" /></div>
...@@ -34,7 +32,7 @@ function onRemove() { ...@@ -34,7 +32,7 @@ function onRemove() {
<Handle id="handle-top" class="handle" :position="Position.Top" :connectable="false" /> <Handle id="handle-top" class="handle" :position="Position.Top" :connectable="false" />
<Handle id="handle-bottom" class="handle" :position="Position.Bottom" :connectable="false" /> <Handle id="handle-bottom" class="handle" :position="Position.Bottom" :connectable="false" />
<Handle id="handle-right" class="handle" :position="Position.Right" :connectable="false" /> <Handle id="handle-right" class="handle" :position="Position.Right" :connectable="false" />
<div class="handle-wrap" v-if="canConnect"> <div class="handle-wrap" v-if="!!(nodesConnectable && canConnect)">
<template v-if="connectionType === 1"> <template v-if="connectionType === 1">
<Handle id="handle-yes" class="handle-link is-yes" :position="Position.Left"></Handle> <Handle id="handle-yes" class="handle-link is-yes" :position="Position.Left"></Handle>
<Handle id="handle-no" class="handle-link is-no" :position="Position.Left"></Handle> <Handle id="handle-no" class="handle-link is-no" :position="Position.Left"></Handle>
...@@ -144,7 +142,7 @@ function onRemove() { ...@@ -144,7 +142,7 @@ function onRemove() {
position: absolute; position: absolute;
top: 100%; top: 100%;
left: 50%; left: 50%;
font-size: 12px; font-size: 14px;
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
transform: translateX(-50%); transform: translateX(-50%);
......
...@@ -44,7 +44,7 @@ const weekList = ref(['周一', '周二', '周三', '周四', '周五', '周六' ...@@ -44,7 +44,7 @@ const weekList = ref(['周一', '周二', '周三', '周四', '周五', '周六'
v-model="form.date" v-model="form.date"
type="date" type="date"
placeholder="请选择" placeholder="请选择"
/> value-format="YYYY-MM-DD" />
<el-date-picker <el-date-picker
v-else v-else
v-model="form.date" v-model="form.date"
...@@ -52,7 +52,7 @@ const weekList = ref(['周一', '周二', '周三', '周四', '周五', '周六' ...@@ -52,7 +52,7 @@ const weekList = ref(['周一', '周二', '周三', '周四', '周五', '周六'
type="daterange" type="daterange"
start-placeholder="开始时间" start-placeholder="开始时间"
end-placeholder="结束时间" end-placeholder="结束时间"
/> value-format="YYYY-MM-DD" />
</template> </template>
<template v-else> <template v-else>
<el-checkbox-group v-model="form.week"> <el-checkbox-group v-model="form.week">
......
...@@ -47,7 +47,12 @@ const timeUnitList = ref([ ...@@ -47,7 +47,12 @@ const timeUnitList = ref([
</el-radio> </el-radio>
<el-radio label="1" size="large" style="display: block"> <el-radio label="1" size="large" style="display: block">
<span>延时至 </span> <span>延时至 </span>
<el-date-picker :disabled="form.time_type !== '1'" v-model="form.time" type="datetime" placeholder="请选择" /> <el-date-picker
:disabled="form.time_type !== '1'"
v-model="form.time"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm:ss" />
</el-radio> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
......
...@@ -26,7 +26,7 @@ watchEffect(() => { ...@@ -26,7 +26,7 @@ watchEffect(() => {
</el-form-item> </el-form-item>
<template v-if="form.trigger_type === '0'"> <template v-if="form.trigger_type === '0'">
<el-form-item label="触发时间" prop="trigger_time"> <el-form-item label="触发时间" prop="trigger_time">
<el-date-picker v-model="form.trigger_time" type="date" /> <el-date-picker v-model="form.trigger_time" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item> </el-form-item>
</template> </template>
<template v-if="form.trigger_type === '1'"> <template v-if="form.trigger_type === '1'">
...@@ -51,7 +51,8 @@ watchEffect(() => { ...@@ -51,7 +51,8 @@ watchEffect(() => {
type="datetimerange" type="datetimerange"
range-separator="To" range-separator="To"
start-placeholder="开始时间" start-placeholder="开始时间"
end-placeholder="结束时间" /> end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss" />
</el-form-item> </el-form-item>
</template> </template>
</ConfigTemplate> </ConfigTemplate>
......
...@@ -43,10 +43,10 @@ async function fetchDemo() { ...@@ -43,10 +43,10 @@ async function fetchDemo() {
} }
} }
// 保存 // 保存 status:1缓存 2提交
function handleSubmit() { function handleSubmit() {
if (!detail.value) return if (!detail.value) return
const params = { itinerary_id: detail.value.itinerary_id, graph: JSON.stringify(elements.value), status: 1 } const params = { itinerary_id: detail.value.itinerary_id, graph: JSON.stringify(elements.value), status: 2 }
updateTrip(params).then(() => { updateTrip(params).then(() => {
ElMessage.success('保存成功') ElMessage.success('保存成功')
}) })
...@@ -64,7 +64,7 @@ function handleConnectionUpdate(value: string[]) { ...@@ -64,7 +64,7 @@ function handleConnectionUpdate(value: string[]) {
</script> </script>
<template> <template>
<AppCard :title="detail?.experiment_itinerary_type_name"> <AppCard :title="detail?.experiment_itinerary_type_name" v-if="detail">
<el-card shadow="never" style="margin-bottom: 20px" v-if="detail"> <el-card shadow="never" style="margin-bottom: 20px" v-if="detail">
<el-descriptions class="info"> <el-descriptions class="info">
<el-descriptions-item label="课程名称:">{{ detail.course_name }}</el-descriptions-item> <el-descriptions-item label="课程名称:">{{ detail.course_name }}</el-descriptions-item>
...@@ -72,7 +72,13 @@ function handleConnectionUpdate(value: string[]) { ...@@ -72,7 +72,13 @@ function handleConnectionUpdate(value: string[]) {
<el-descriptions-item label="旅程类型:">{{ detail.experiment_itinerary_type_name }}</el-descriptions-item> <el-descriptions-item label="旅程类型:">{{ detail.experiment_itinerary_type_name }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-card> </el-card>
<TripFlow v-model="elements" action="edit" role="student" :nodes-draggable="!isFree"> <TripFlow
v-model="elements"
action="edit"
role="student"
:templateType="detail?.experiment_itinerary_type"
:nodes-draggable="isFree"
:nodes-connectable="isFree">
<template #left-panel v-if="isFree"> <template #left-panel v-if="isFree">
<TripFlowSidebar :connectionIds="connectionIds" /> <TripFlowSidebar :connectionIds="connectionIds" />
</template> </template>
......
...@@ -35,7 +35,12 @@ const commentVisible = ref(false) ...@@ -35,7 +35,12 @@ const commentVisible = ref(false)
<el-button type="primary" @click="commentVisible = true">教师评语</el-button> <el-button type="primary" @click="commentVisible = true">教师评语</el-button>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<TripFlow v-model="elements" action="view" role="student" :nodes-draggable="false"></TripFlow> <TripFlow
v-model="elements"
action="view"
role="student"
:nodes-draggable="false"
:nodes-connectable="false"></TripFlow>
</AppCard> </AppCard>
<el-dialog title="评语" width="500px" append-to-body v-model="commentVisible"> <el-dialog title="评语" width="500px" append-to-body v-model="commentVisible">
......
...@@ -15,11 +15,11 @@ const isReviewed = computed(() => { ...@@ -15,11 +15,11 @@ const isReviewed = computed(() => {
function fetchRecord() { function fetchRecord() {
getStudentTripRecord().then(res => { getStudentTripRecord().then(res => {
const record = res.data.detail.record
detail.value = res.data.detail detail.value = res.data.detail
// 评语 Object.assign(form, { score: record.score ? parseFloat(record.score) : 0, comment: record.comment })
form.comment = res.data.detail.record.comment
try { try {
elements.value = res.data.detail.record.graph ? JSON.parse(res.data.detail.record.graph) : [] elements.value = record.graph ? JSON.parse(record.graph) : []
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
...@@ -28,7 +28,7 @@ function fetchRecord() { ...@@ -28,7 +28,7 @@ function fetchRecord() {
onMounted(() => fetchRecord()) onMounted(() => fetchRecord())
const commentVisible = ref(false) const commentVisible = ref(false)
const form = reactive({ comment: '' }) const form = reactive({ comment: '', score: 0 })
// 保存评语 // 保存评语
function handleSubmitComment() { function handleSubmitComment() {
...@@ -41,23 +41,24 @@ function handleSubmitComment() { ...@@ -41,23 +41,24 @@ function handleSubmitComment() {
// 保存 // 保存
function handleSubmit() { function handleSubmit() {
const score = elements.value.reduce((total: number, item: any) => { // 固定旅程
return total + (item?.data?.score ? parseFloat(item.data.score) : 0) if (detail.value.itinerary.type === '2') {
}, 0) form.score = elements.value.reduce((total: number, item: any) => total + (item.data.student?.score || 0), 0)
}
const params = { const params = {
...form, ...form,
itinerary_id: detail.value?.itinerary.id, itinerary_id: detail.value?.itinerary.id,
graph: JSON.stringify(elements.value), graph: JSON.stringify(elements.value)
score
} }
checkStudentTripRecord(params).then(() => { checkStudentTripRecord(params).then(() => {
ElMessage({ message: '保存成功', type: 'success' }) ElMessage({ message: '保存成功', type: 'success' })
fetchRecord()
}) })
} }
</script> </script>
<template> <template>
<AppCard> <AppCard v-if="detail">
<el-descriptions :column="4" v-if="detail"> <el-descriptions :column="4">
<el-descriptions-item label="课程名称:">{{ detail.course.name }}</el-descriptions-item> <el-descriptions-item label="课程名称:">{{ detail.course.name }}</el-descriptions-item>
<el-descriptions-item label="实验名称:">{{ detail.experiment.name }}</el-descriptions-item> <el-descriptions-item label="实验名称:">{{ detail.experiment.name }}</el-descriptions-item>
<el-descriptions-item label="用户旅程名称:">{{ detail.itinerary.name }}</el-descriptions-item> <el-descriptions-item label="用户旅程名称:">{{ detail.itinerary.name }}</el-descriptions-item>
...@@ -65,12 +66,25 @@ function handleSubmit() { ...@@ -65,12 +66,25 @@ function handleSubmit() {
{{ getNameByValue(detail.itinerary.type, tripTemplateTypeList) }} {{ getNameByValue(detail.itinerary.type, tripTemplateTypeList) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="客户旅程总分:">{{ detail.itinerary.score }}</el-descriptions-item> <el-descriptions-item label="客户旅程总分:">{{ detail.itinerary.score }}</el-descriptions-item>
<el-descriptions-item label="客户旅程得分:">{{ detail.record.score }}</el-descriptions-item> <el-descriptions-item label="客户旅程得分:">
<template v-if="detail.itinerary.type === '1'">
<el-input-number v-model="form.score" :controls="false" />
</template>
<template v-else>
{{ detail.record.score }}
</template>
</el-descriptions-item>
<el-descriptions-item> <el-descriptions-item>
<el-button type="primary" @click="commentVisible = true">填写评语</el-button> <el-button type="primary" @click="commentVisible = true">填写评语</el-button>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<TripFlow v-model="elements" action="view" role="teacher" :nodes-draggable="false"> <TripFlow
v-model="elements"
action="view"
role="teacher"
:template-type="detail.itinerary.type"
:nodes-draggable="false"
:nodes-connectable="false">
<template #footer> <template #footer>
<el-row justify="center"> <el-row justify="center">
<el-button type="primary" auto-insert-space @click="handleSubmit" :disabled="isReviewed">保存</el-button> <el-button type="primary" auto-insert-space @click="handleSubmit" :disabled="isReviewed">保存</el-button>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论