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

chore: update

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