feat(设计): 优化问卷设计功能

- 调整完成式题目字数限制显示逻辑- 为 NPS 问卷添加内容编辑组件
- 优化文本加图片问卷的编辑功能
- 调整必答设置的显示逻辑
- 修复完成式题目的保存问题
- 优化 API 接口配置
This commit is contained in:
陈昱达
2025-03-12 20:35:53 +08:00
parent b0c0979f70
commit eb22b77d46
7 changed files with 49 additions and 34 deletions

View File

@@ -1,5 +1,5 @@
# .env.development
VITE_APP_BASEURL=http://192.168.8.165:15011/
VITE_APP_BASEURL=https://yls-api-uat.dctest.digitalyili.com/
VITE_APP_ENV=development
VITE_APP_CURRENTMODE=dev
VITE_APP_BASEOSS=https://diaoyan-files.automark.cc

View File

@@ -335,6 +335,9 @@ const actionFun = {
// emit 事件
const saveQueItem = (logics, questions, survey) => {
// questions.map((item, index) => {
// item.title = index + 1;
// });
saveQuestion({
sn: route.query.sn,
data: {

View File

@@ -11,7 +11,12 @@
<div class="flex flex-start">操作选项</div>
</template>
<van-cell-group :border="false" class="ml10">
<van-cell title="此题必答" :border="false" label-align="left">
<van-cell
title="此题必答"
:border="false"
label-align="left"
v-if="![6].includes(activeQuestion.question_type)"
>
<template #right-icon>
<van-switch
v-model="activeQuestion.config.is_required"
@@ -233,8 +238,8 @@ const getSkipTypeText = (skipType) => {
const ls = [];
logics.map((item) => {
if (
item.skip_type === skipType
&& item.question_index === activeQuestion.value.question_index
item.skip_type === skipType &&
item.question_index === activeQuestion.value.question_index
) {
ls.push(item);
}

View File

@@ -63,6 +63,7 @@
:active-value="1"
:inactive-value="0"
size="0.5rem"
@change="emit('saveOption')"
></van-switch>
</template>
</van-field>
@@ -71,7 +72,7 @@
<van-cell
v-if="![5, 6, 7].includes(actionQuestion.config.text_type)"
title="字数限制"
:title="`${[1, 2].includes(actionQuestion.config.text_type) ? '数值限制' : '字数限制'}`"
:border="false"
label-align="left"
>
@@ -130,6 +131,7 @@
v-model="actionQuestion.config.line_type"
icon-size="0.4rem"
direction="horizontal"
@change="emit('saveOption')"
>
<van-radio :name="0">单行</van-radio>
<van-radio :name="1">多行</van-radio>
@@ -165,7 +167,7 @@
label-align="left"
input-align="right"
class="action-field"
placeholder="不限"
placeholder=""
@blur="emit('saveOption')"
@update:model-value="
(value) => {
@@ -239,6 +241,7 @@ const selectText = (textType) => {
const confirm = ({ selectedValues }) => {
actionQuestion.value.config.text_type = Number(selectedValues[0]);
selectTextTypeModel.value = false;
emit('saveOption');
};
const actionQuestion = computed({

View File

@@ -17,7 +17,11 @@
></contenteditable>
</template>
<template #input>
<div contenteditable="true" class="input other_input"></div>
<textarea
class="other_input"
:placeholder="element.config.placeholder"
:rows="element.config.line_height"
></textarea>
</template>
</van-field>
</div>
@@ -45,7 +49,6 @@ const props = defineProps({
// 创建一个本地副本以保存更改
const emit = defineEmits(['update:element']);
const { element } = toRefs(props);
const emitValue = () => {
emit('update:element', element.value);
};
@@ -55,7 +58,7 @@ const emitValue = () => {
.cont {
.other_input {
width: 100%;
height: 40px;
min-height: 40px;
margin-bottom: 10px;
padding: 3px 5px;
border: 1px solid #ccc;

View File

@@ -10,12 +10,7 @@
{{ index + 1 }}
</template>
<template #label>
<div
:contenteditable="active"
class="van-field"
@blur="saveStem($event, element)"
v-html="element.stem"
></div>
<contenteditable :active="active" @blur="saveStem" v-model="element.stem"></contenteditable>
</template>
<template #input>
<div v-for="(optionItem, optionItemIndex) in element.options" :key="optionItemIndex">
@@ -38,7 +33,7 @@
</template>
<script setup>
import { ref } from 'vue';
import { ref, toRefs } from 'vue';
import RateCharacter from './RateCharacter.vue';
const props = defineProps({
@@ -56,13 +51,11 @@ const props = defineProps({
sn: { type: String, default: '' },
questionType: { type: [String, Number], default: 4 }
});
const element = ref(props.element);
const { element } = toRefs(props);
const chooseId = ref('');
// 创建一个本地副本以保存更改
const localElement = ref({ ...props.element });
const saveStem = (e) => {
localElement.value.stem = e.target.innerHTML;
const emit = defineEmits(['update:element']);
const saveStem = () => {
emit('update:element', element.value);
};
const chooseOption = (item) => {

View File

@@ -11,15 +11,18 @@
{{ index + 1 }}
</template>
<template #label>
<contenteditable v-model="element.stem" :active="active"></contenteditable>
<!-- <div v-html="element.stem" v-else></div>-->
<contenteditable
v-model="element.stem"
:active="active"
@blur="emitValue"
></contenteditable>
</template>
</van-field>
</div>
</template>
<script setup>
import contenteditable from '@/components/contenteditable.vue';
import { ref } from 'vue';
import { toRefs } from 'vue';
const props = defineProps({
element: {
type: Object,
@@ -39,6 +42,11 @@ const props = defineProps({
}
});
const element = ref(props.element);
const { element } = toRefs(props);
const emit = defineEmits(['update:element']);
const emitValue = () => {
emit('update:element', element.value);
};
</script>
<style scoped lang="scss"></style>