feat: 修复 eslint 报错, 删除多余生成文件

- 删除 vite.config.ts 自动生成的 vite.config.ts.timestamp...
- eslint 报错修复
This commit is contained in:
Huangzhe
2025-03-17 10:47:49 +08:00
parent 5060539964
commit 283e07a022
30 changed files with 278 additions and 418 deletions

View File

@@ -57,7 +57,8 @@ export default {
JSON.stringify({
type: 'back',
data: {
force: false // 不强制返回,让原生端判断是否可以返回
// 不强制返回,让原生端判断是否可以返回
force: false
}
})
);

View File

@@ -1,12 +1,8 @@
<template>
<div class="flex contenteditable align-center space-between" :class="className">
<p
:id="'editor' + id"
ref="editor"
:contenteditable="active"
class="van-field contenteditable-content"
@focus="onFocus"
v-html="modelValue"
:id="'editor' + id" ref="editor" :contenteditable="active" class="van-field contenteditable-content"
@focus="onFocus" v-html="modelValue"
></p>
<div class="right-icon ml10">
<slot name="right-icon"></slot>
@@ -75,7 +71,7 @@ const functions = {
const [file] = e.target.files;
if (!file) return;
if (file.size > 2 * 1024 * 1024) {
console.error('文件大小不能超过2M');
// console.error('文件大小不能超过2M');
return;
}
@@ -175,7 +171,7 @@ const onFocus = (e) => {
// 阻止
e.preventDefault();
e.stopPropagation();
console.log('Editor focused');
// console.log('Editor focused');
};
// 保存当前光标位置
@@ -247,7 +243,7 @@ const insertImageAtCaret = (html) => {
outline: none;
}
button + button {
button+button {
margin-left: 10px;
}
}

View File

@@ -35,22 +35,23 @@ const advancedQuesTypeList = [
type: 102
}
];
const advancedTypes = advancedQuesTypeList.map((i) => i.type); // 高级题型的 question_type
// 高级题型的 question_type
const advancedTypes = advancedQuesTypeList.map((i) => i.type);
const performance = {
start(label) {
start(/* label */) {
if (config.currentMode === 'dev') {
console.time(`${label} Performance`);
// console.time(`${label} Performance`);
}
},
end(label) {
end(/* label */) {
if (config.currentMode === 'dev') {
console.timeEnd(`${label} Performance`);
// console.timeEnd(`${label} Performance`);
}
},
log(...rest) {
log(/* ...rest */) {
if (config.currentMode === 'dev') {
console.log(...rest);
// console.log(...rest);
}
}
};
@@ -95,7 +96,8 @@ export function loopingAvailable({ cycles, questions, logics, isPerPage, reason
const cycleList = generateCyclePages(cycles, quizList);
const logicList = generateLogicPages(logics, quizList);
const lastPage = quizList.reduce((prev, curr) => Math.max(prev, curr.$page || 0), 0); // 最后一页的页码
// 最后一页的页码
const lastPage = quizList.reduce((prev, curr) => Math.max(prev, curr.$page || 0), 0);
// console.log('questions', questions, quizList);
// console.log('cycles', cycles, cycleList);
@@ -187,11 +189,15 @@ export function generateQuestionPages({ questions, logics, isPerPage, addon }) {
}
let page = 1;
let pageObjectCount = 0; // 计数,在 questions 有几个分页的对象
// 计数,在 questions 有几个分页的对象
let pageObjectCount = 0;
return questions.map((item, index, arr) => {
const asBlock = [...advancedTypes, 23]; // 需要自动加分页的题型:高级题型及知情同意书
const isPrevAdv = asBlock.includes(arr[index - 1]?.question_type); // 前一道题是高级题型
const isAdv = asBlock.includes(item?.question_type); // 前题是高级题型
// 需要自动加分页的题型:高级题型及知情同意书
const asBlock = [...advancedTypes, 23];
// 前一道题是高级题型
const isPrevAdv = asBlock.includes(arr[index - 1]?.question_type);
// 当前题是高级题型
const isAdv = asBlock.includes(item?.question_type);
// const isPrevAdv = advancedTypes.includes(arr[index - 1]?.question_type); // 前一道题是高级题型
// const isAdv = advancedTypes.includes(item?.question_type); // 当前题是高级题型
@@ -201,11 +207,12 @@ export function generateQuestionPages({ questions, logics, isPerPage, addon }) {
);
// 当前题配置了跳转逻辑
const isLogic = !!logics.find((logic) => logic.question_index === item.question_index);
const isSurroundedByPage = isAdv || isLogic; // 需要在该题前后添加分页
const isPrevPage = !!arr[index - 1]?.page; // 前一道题是一个分页对象
const prevIsQuestion = !arr[index - 1]?.page; // 前一道题是一道题而不是一个分页对象
// 需要在该题前后添加分页
const isSurroundedByPage = isAdv || isLogic;
// 前一道题是一个分页对象
const isPrevPage = !!arr[index - 1]?.page;
// 前一道题是一道题而不是一个分页对象
const prevIsQuestion = !arr[index - 1]?.page;
if (!index) {
page = 1;
@@ -347,7 +354,8 @@ export function isCross(range1, range2) {
const start2 = range2[0];
const end2 = range2[1];
const isPlainSequence = parsedRange1[0] === start1; // 跳转逻辑的方向true 为从前向后跳转
// 跳转逻辑的方向true 为从前向后跳转
const isPlainSequence = parsedRange1[0] === start1;
if (isNullish(start1) || isNullish(end1) || end1 < 0 || (isNullish(start2) && isNullish(end2))) {
return false;
@@ -377,13 +385,13 @@ export function isCross(range1, range2) {
|| (!isPlainSequence
&& (judge < start1
? ((isNullish(start2) || isSequence(judge, start2, start1))
&& (isNullish(end2) || isSequence(judge, end2, start1)))
|| ((isNullish(start2) || isSequence(start1, start2, end1))
&& (isNullish(end2) || isSequence(start1, end2, end1)))
&& (isNullish(end2) || isSequence(judge, end2, start1)))
|| ((isNullish(start2) || isSequence(start1, start2, end1))
&& (isNullish(end2) || isSequence(start1, end2, end1)))
: ((isNullish(start2) || isSequence(start1, start2, judge))
&& (isNullish(end2) || isSequence(start1, end2, judge)))
|| ((isNullish(start2) || isSequence(judge, start2, end1))
&& (isNullish(end2) || isSequence(judge, end2, end1)))));
&& (isNullish(end2) || isSequence(start1, end2, judge)))
|| ((isNullish(start2) || isSequence(judge, start2, end1))
&& (isNullish(end2) || isSequence(judge, end2, end1)))));
// 循环存在封闭区间,并且循环包含逻辑
const contained
= !isNullish(start2)

View File

@@ -231,7 +231,7 @@ const canPlanetPublishImage = function(data) {
qSteams.push(`(${s.title})`);
}
} catch (error) {
console.warn(error);
// console.warn(error);
}
}
});

View File

@@ -25,8 +25,8 @@ export default function createCOS(data) {
Bucket: bucket,
Key: name,
Body: file,
onProgress: (progressData) => {
console.log(progressData);
onProgress: (/* progressData */) => {
// console.log(progressData);
}
};
const client = new COS({
@@ -37,7 +37,8 @@ export default function createCOS(data) {
TmpSecretKey: tmpSecretKey,
SecurityToken: sessionToken,
// 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
StartTime: startTime, // 时间戳单位秒1580000000
// 时间戳单位秒1580000000
StartTime: startTime,
ExpiredTime: expiredTime
});
}
@@ -45,7 +46,7 @@ export default function createCOS(data) {
});
return new Promise((resolve, reject) => {
client.putObject(config, (err, data) => {
console.log('腾讯上传', err, data);
// console.log('腾讯上传', err, data);
if (err) {
reject(err);
} else {

View File

@@ -1,13 +1,10 @@
<template>
<div class="option-action">
<draggable
v-model:data="data"
item-key="option_index"
:handle="handle"
chosenClass="chosen"
animation="300"
v-model:data="data" item-key="option_index" :handle="handle" chosenClass="chosen" animation="300"
:scroll="true"
>
<!-- eslint-disable-next-line -->
<template #item="{ element, index }">
<div class="flex align-center option-action-container">
<slot name="item" :element="element" :index="index"></slot>
@@ -16,11 +13,7 @@
name="setting "
@click="openMoveModel(element, index)
"/>-->
<van-icon
class-prefix="mobilefont"
name="gengduo "
@click="openOptionActionModel(element, index)"
/>
<van-icon class-prefix="mobilefont" name="gengduo " @click="openOptionActionModel(element, index)" />
<van-icon class-prefix="mobilefont" name="del1 " @click="deleteOption(index)" />
</span>
</div>
@@ -36,10 +29,7 @@
<van-cell title="固定置底" :border="false">
<template #right-icon>
<van-switch
v-model="activeOption.is_fixed"
class="option-action-sheet-switch"
size="0.5rem"
:active-value="1"
v-model="activeOption.is_fixed" class="option-action-sheet-switch" size="0.5rem" :active-value="1"
:inactive-value="0"
></van-switch>
</template>
@@ -47,26 +37,17 @@
<van-cell title="设为其他项" :border="false">
<template #right-icon>
<van-switch
v-model="activeOption.is_other"
class="option-action-sheet-switch"
size="0.5rem"
:active-value="1"
v-model="activeOption.is_other" class="option-action-sheet-switch" size="0.5rem" :active-value="1"
:inactive-value="0"
></van-switch>
</template>
</van-cell>
<!--复选时出现-->
<checkbox-action
v-if="question?.question_type === 2"
v-model="activeOption.is_remove_other"
></checkbox-action>
<checkbox-action v-if="question?.question_type === 2" v-model="activeOption.is_remove_other"></checkbox-action>
</van-cell-group>
</van-action-sheet>
<van-action-sheet
v-model:show="moveShow"
cancel-text="取消"
:actions="actions"
@select="optionMove"
v-model:show="moveShow" cancel-text="取消" :actions="actions" @select="optionMove"
@cancel="moveShow = false"
>
<!-- <template #description>-->
@@ -185,15 +166,15 @@ const deleteOption = (index) => {
font-size: 16px;
}
& .mobilefont + .mobilefont {
& .mobilefont+.mobilefont {
margin-left: 5px;
}
& .van-icon + .van-icon {
& .van-icon+.van-icon {
margin-left: 5px;
}
& .van-icon + .mobilefont {
& .van-icon+.mobilefont {
margin-left: 5px;
}
}

View File

@@ -13,6 +13,9 @@
import { completionOptions } from '@/utils/questionSteeingList.js';
import YlSelect from '@/components/YLSelect.vue';
import YlInput from '@/components/YLInput.vue';
const logic = defineModel('logic');
const logic = defineModel('logic', {
type: Object,
default: () => ({})
});
</script>
<style scoped lang="scss"></style>

View File

@@ -4,11 +4,7 @@
<yl-select v-model="logic.row_index" :options="getOptions('row')" class="group"></yl-select>
<!-- 选项 or 分组 -->
<yl-select
v-model="logic.is_option_group"
:options="groupOptions"
class="ml10 group"
></yl-select>
<yl-select v-model="logic.is_option_group" :options="groupOptions" class="ml10 group"></yl-select>
<!-- <yl-select v-model="logic.operator" :options="symbolOptions" class="ml10 symbol"></yl-select>-->
<yl-select v-model="logic.cell_index" :options="getOptions('col')" class="ml10"></yl-select>
<yl-select v-model="logic.is_select" class="ml10" :options="chooseOptions"></yl-select>
@@ -21,8 +17,12 @@
<script setup>
import { chooseOptions, groupOptions } from '@/utils/questionSteeingList.js';
import YlSelect from '@/components/YLSelect.vue';
const logic = defineModel('logic');
const beforeQuesOptions = defineModel('beforeQuesOptions');
const logic = defineModel('logic', {
type: Object
});
const beforeQuesOptions = defineModel('beforeQuesOptions', {
type: Array
});
const getOptions = (type) => {
let options = [];

View File

@@ -4,11 +4,7 @@
<yl-select v-model="logic.row_index" :options="getOptions('row')" class="group"></yl-select>
<!-- 选项 or 分组 -->
<yl-select
v-model="logic.is_option_group"
:options="groupOptions"
class="ml10 group"
></yl-select>
<yl-select v-model="logic.is_option_group" :options="groupOptions" class="ml10 group"></yl-select>
<yl-select v-model="logic.operator" :options="symbolOptions" class="ml10 symbol"></yl-select>
<yl-select v-model="logic.cell_index" :options="getOptions('col')" class="ml10"></yl-select>
@@ -34,7 +30,7 @@ const beforeQuesOptions = defineModel('beforeQuesOptions', {
});
const getOptions = (type) => {
console.log(beforeQuesOptions);
// console.log(beforeQuesOptions);
let options = [];
beforeQuesOptions.value.forEach((item) => {

View File

@@ -79,10 +79,10 @@ import OptionAction from '@/views/Design/components/ActionCompoents/OptionAction
import { defineAsyncComponent, toRefs, ref } from 'vue';
// 是否是预览
const isPreview = defineModel('isPreview', { default: false });
const isPreview = defineModel('isPreview', { default: false, type: Booleans });
const choiceValue = defineModel('answer', { default: '1', type: String });
console.log(`choiceValue.value`, choiceValue.value);
// console.log(`choiceValue.value`, choiceValue.value);
const Contenteditable = defineAsyncComponent(() => import('@/components/contenteditable.vue'));
const props = defineProps({

View File

@@ -1,26 +1,18 @@
<template>
<div class="cont">
<van-field
v-model="element.stem"
:label="element.stem"
:required="element.config.is_required === 1"
v-model="element.stem" :label="element.stem" :required="element.config.is_required === 1"
label-align="top"
>
<template #left-icon>
{{ index + 1 }}
</template>
<template #label>
<contenteditable
v-model="element.stem"
:active="active"
@blur="emitValue"
></contenteditable>
<contenteditable v-model="element.stem" :active="active" @blur="emitValue"></contenteditable>
</template>
<template #input>
<textarea
v-model="completionValue"
class="other_input"
:placeholder="element.config.placeholder"
v-model="completionValue" class="other_input" :placeholder="element.config.placeholder"
:rows="element.config.line_height"
></textarea>
</template>
@@ -31,7 +23,7 @@
<script setup>
import { toRefs } from 'vue';
const completionValue = defineModel('completionValue', { default: '' });
const completionValue = defineModel('completionValue', { default: '', type: String });
const props = defineProps({
element: {
type: Object,

View File

@@ -35,7 +35,7 @@ import { vFocus } from '@/utils/directives/useVFocus';
const rowRecord = defineModel<number[][]>('rowRecord', { required: false, default: () => [] });
// const matrixAnswer = defineModel<{ [key: string]: 1 }>('matrixAnswer', { required: false, default: () => ({}) });
// 检查 rowRecord 是否存在
console.log(`rowRecord:`, rowRecord.value);
// console.log(`rowRecord:`, rowRecord.value);
/* const isPreview = */defineModel<boolean>('isPreview', { required: false, default: false });
defineProps<{
@@ -81,7 +81,7 @@ function handleMatrixRadioChange(row: number, col: number) {
cols.push(col);
}
console.log(`rowRecord:`, rowRecord.value);
// console.log(`rowRecord:`, rowRecord.value);
}
// const handleColNameChange = (rowOption: string, colOption: string) => {
// // const target = e.target as HTMLInputElement;

View File

@@ -35,7 +35,7 @@ import { vFocus } from '@/utils/directives/useVFocus';
const rowRecord = defineModel<number[]>('rowRecord', { required: false, default: () => [] });
// const matrixAnswer = defineModel<{ [key: string]: 1 }>('matrixAnswer', { required: false, default: () => ({}) });
// 检查 rowRecord 是否存在
console.log(`rowRecord:`, rowRecord.value);
// console.log(`rowRecord:`, rowRecord.value);
/* const isPreview = */defineModel<boolean>('isPreview', { required: false, default: false });
defineProps<{

View File

@@ -35,7 +35,7 @@ import { vFocus } from '@/utils/directives/useVFocus';
const rowRecord = defineModel<string[][]>('rowRecord', { required: false, default: () => [] });
// const matrixAnswer = defineModel<{ [key: string]: 1 }>('matrixAnswer', { required: false, default: () => ({}) });
// 检查 rowRecord 是否存在
console.log(`rowRecord:`, rowRecord.value);
// console.log(`rowRecord:`, rowRecord.value);
/* const isPreview = */defineModel<boolean>('isPreview', { required: false, default: false });
defineProps<{
@@ -51,8 +51,8 @@ const handleRowNameChange = (/* value: string */) => {
};
function getInputValue(row: number, col: number) {
console.log(`row: ${row}, col: ${col}`);
console.log(`rowRecord:`, rowRecord.value);
// console.log(`row: ${row}, col: ${col}`);
// console.log(`rowRecord:`, rowRecord.value);
return rowRecord.value?.[row]?.[col] ?? '';
}
@@ -70,7 +70,7 @@ function handleMatrixTextChange(row: number, col: number, e: Event) {
// cols 的逻辑 和 handleMatrixRadioChange 一致
const cols = rowRecord.value[row];
cols[col] = inputValue;
console.log(`rowRecord:`, rowRecord.value);
// console.log(`rowRecord:`, rowRecord.value);
}
// const handleColNameChange = (rowOption: string, colOption: string) => {
// // const target = e.target as HTMLInputElement;

View File

@@ -35,7 +35,7 @@
import { ref, toRefs } from 'vue';
import RateCharacter from './RateCharacter.vue';
const isPreview = defineModel('isPreview', { default: false });
const isPreview = defineModel('isPreview', { default: false, type: Boolean });
const props = defineProps({
element: {
type: Object
@@ -53,13 +53,13 @@ const props = defineProps({
});
// answer 的答案以 矩阵形式存储, 例如 [4,7],上层更新答案的时候也容易
const rates = defineModel('rates', { default: [] });
const rates = defineModel('rates', { default: [], type: Array });
const rate = ref(0);
// 不知道的 BUG ,开始的时候不能重置颜色。 故如此
setTimeout(() => {
rate.value = localStorage.getItem(props.sn);
console.log(`rate value:`, rate.value);
// console.log(`rate value:`, rate.value);
// if (rates.value[0] !== undefined) {
// console.log(`rates value:`, rates.value);
// rate.value = rates.value[0]

View File

@@ -49,9 +49,13 @@ const props = defineProps({
}
});
const model = defineModel();
const model = defineModel('model', {
type: Number
});
const index = defineModel('index');
const index = defineModel('index', {
type: Number
});
const emit = defineEmits(['change']);
const renderScore = (min, max, interval) => {
const result = [];

View File

@@ -20,9 +20,7 @@
</van-cell-group>
</van-cell-group>
<div
v-if="styleInfo.logo_status && styleInfo.logo_url"
class="example-logo"
:style="[
v-if="styleInfo.logo_status && styleInfo.logo_url" class="example-logo" :style="[
{
'justify-content':
styleInfo.logo_site === 1
@@ -42,53 +40,30 @@
<img class="logo" :src="styleInfo.logo_url" alt="logo" />
</div>
<!-- 问题 -->
<div
class="questions"
:style="`min-height: ${styleInfo.head_img_status ? 'calc(100% - 240px)' : '100%'};${
styleInfo.background_status
? `background-color: ${styleInfo.background_color};background-image: url(${styleInfo.background_url})`
: ''
}`"
<!-- eslint-disable-next-line -->
<div class="questions" :style="`min-height: ${styleInfo.head_img_status ? 'calc(100% - 240px)' : '100%'};${styleInfo.background_status
? `background-color: ${styleInfo.background_color};background-image: url(${styleInfo.background_url})`
: ''
}`"
>
<!-- 提前终止和正常完成 -->
<q-last
v-if="page === pages.length + 1"
:code="questionsData.action?.code"
:action="questionsData.action"
:survey="questionsData.survey"
:isAnswer="isAnswer"
:isTemplate="isTemplate"
v-if="page === pages.length + 1" :code="questionsData.action?.code" :action="questionsData.action"
:survey="questionsData.survey" :isAnswer="isAnswer" :isTemplate="isTemplate"
/>
<!-- 问卷名和描述 -->
<q-first
v-else-if="page === 0"
isMobile
:title="questionsData?.survey?.title"
:desc="questionsData?.survey?.introduction"
:questions="questionsData?.questions"
:isAnswer="isAnswer"
:showTitle="styleInfo.is_title"
:showDesc="styleInfo.is_introduce"
:label="questionsData?.survey?.title"
v-else-if="page === 0" isMobile :title="questionsData?.survey?.title"
:desc="questionsData?.survey?.introduction" :questions="questionsData?.questions" :isAnswer="isAnswer"
:showTitle="styleInfo.is_title" :showDesc="styleInfo.is_introduce" :label="questionsData?.survey?.title"
/>
<!-- -mobile -->
<question
v-for="question in questions"
v-else
:id="'questionIndex' + question.question_index"
:key="question.question_index"
class="question"
:tip="question.tip"
:stem="question.stem"
:title="question.title"
:error="question.error"
:warning="question.warning"
:questions="questionsData.questions"
:questionType="question.question_type"
:questionIndex="question.question_index"
:showTitle="styleInfo.is_question_number && true"
isMobile
:isAnswer="isAnswer"
v-for="question in questions" v-else :id="'questionIndex' + question.question_index"
:key="question.question_index" class="question" :tip="question.tip" :stem="question.stem"
:title="question.title" :error="question.error" :warning="question.warning" :questions="questionsData.questions"
:questionType="question.question_type" :questionIndex="question.question_index"
:showTitle="styleInfo.is_question_number && true" isMobile :isAnswer="isAnswer"
>
<!-- <q-radio-->
<!-- v-if="question.question_type === 1"-->
@@ -106,18 +81,10 @@
<!-- />-->
<!-- 单选题 -->
<preview-choice
v-if="question.question_type === 1"
v-model:answer="question.answer"
v-model:answerIndex="question.answerIndex"
:list="question.list"
:config="question.config"
:hideOptions="question.hideOptions"
:stem="question.stem"
:answerSn="questionsData.answer.sn"
:answerSurveySn="questionsData.answer.survey_sn"
:question="question"
@previous="previous"
@next="next"
v-if="question.question_type === 1" v-model:answer="question.answer"
v-model:answerIndex="question.answerIndex" :list="question.list" :config="question.config"
:hideOptions="question.hideOptions" :stem="question.stem" :answerSn="questionsData.answer.sn"
:answerSurveySn="questionsData.answer.survey_sn" :question="question" @previous="previous" @next="next"
@change-answer="onRelation($event, question)"
/>
<!-- &lt;!&ndash; 多选题 &ndash;&gt;-->
@@ -148,16 +115,9 @@
<!-- />-->
<!-- 填空题 -->
<preview-completion
v-else-if="question.question_type === 4"
:config="question.config"
:answer="question.answer"
:stem="question.stem"
:answerSn="questionsData.answer.sn"
:answerSurveySn="questionsData.answer.survey_sn"
:question="question"
@previous="previous"
@next="next"
@change-answer="onRelation($event, question)"
v-else-if="question.question_type === 4" :config="question.config" :answer="question.answer"
:stem="question.stem" :answerSn="questionsData.answer.sn" :answerSurveySn="questionsData.answer.survey_sn"
:question="question" @previous="previous" @next="next" @change-answer="onRelation($event, question)"
/>
<!-- &lt;!&ndash; 打分题 &ndash;&gt;-->
<!-- <q-rate-->
@@ -192,38 +152,21 @@
<!-- />-->
<!-- 矩阵填空题 -->
<preview-matrix-text
v-else-if="question.question_type === 8"
v-model:answer="question.answer"
:list="question.list"
:config="question.config"
:stem="question.stem"
:question="question"
@previous="previous"
@next="next"
@change-answer="onRelation($event, question)"
v-else-if="question.question_type === 8" v-model:answer="question.answer"
:list="question.list" :config="question.config" :stem="question.stem" :question="question"
@previous="previous" @next="next" @change-answer="onRelation($event, question)"
/>
<!-- 矩阵单选题 -->
<preview-matrix-radio
v-else-if="question.question_type === 9"
v-model:answer="question.answer"
:list="question.list"
:config="question.config"
:stem="question.stem"
:answerSn="questionsData.answer.sn"
:answerSurveySn="questionsData.answer.survey_sn"
:question="question"
@change-answer="onRelation($event, question)"
@previous="previous"
@next="next"
v-else-if="question.question_type === 9" v-model:answer="question.answer"
:list="question.list" :config="question.config" :stem="question.stem" :answerSn="questionsData.answer.sn"
:answerSurveySn="questionsData.answer.survey_sn" :question="question"
@change-answer="onRelation($event, question)" @previous="previous" @next="next"
/>
<!-- 矩阵多选题 -->
<preview-matrix-checkbox
v-else-if="question.question_type === 10"
v-model:answer="question.answer"
:list="question.list"
:config="question.config"
:question="question"
isMobile
v-else-if="question.question_type === 10" v-model:answer="question.answer"
:list="question.list" :config="question.config" :question="question" isMobile
@change-answer="onRelation($event, question)"
/>
<!-- &lt;!&ndash; 矩阵打分题 &ndash;&gt;-->
@@ -294,12 +237,8 @@
<!-- />-->
<!-- 文件上传题 -->
<preview-file-upload
v-else-if="question.question_type === 18"
v-model:answer="question.answer"
:config="question.config"
:question="question"
isMobile
:questionIndex="question.question_index"
v-else-if="question.question_type === 18" v-model:answer="question.answer"
:config="question.config" :question="question" isMobile :questionIndex="question.question_index"
@change-answer="onRelation($event, question)"
/>
<!-- &lt;!&ndash; 地理位置题 &ndash;&gt;-->
@@ -461,58 +400,31 @@
<!-- />-->
<!-- &lt;!&ndash; 高级题型-NPS &ndash;&gt;-->
<preview-n-p-s
v-else-if="question.question_type === 106"
v-model:answer="question.answer"
:isPreview="true"
:title="question.title"
:stem="question.stem"
:list="question.list"
:config="question.config"
:isAnswer="isAnswer"
:questionIndex="question.question_index"
:label="question.title"
:loading="loading"
:isTemplate="isTemplate"
:showTitle="styleInfo.is_question_number"
:question="question"
@previous="previous"
@next="next"
@change-answer="onRelation($event, question)"
v-else-if="question.question_type === 106" v-model:answer="question.answer" :isPreview="true"
:title="question.title" :stem="question.stem" :list="question.list" :config="question.config"
:isAnswer="isAnswer" :questionIndex="question.question_index" :label="question.title" :loading="loading"
:isTemplate="isTemplate" :showTitle="styleInfo.is_question_number" :question="question" @previous="previous"
@next="next" @change-answer="onRelation($event, question)"
/>
</question>
<!-- 分页 -->
<!-- eslint-disable max-len -->
<div v-show="showPage" class="footer-page">
<pfe-pagination
class="pagination"
:page="page"
:pages="pages.length + 1"
:min="styleInfo.is_home ? 0 : 1"
:loading="loading"
:showPrevious="styleInfo.is_up_button"
:showStart="styleInfo.is_start_button"
:startText="styleInfo.start_button_text"
:showSubmit="styleInfo.is_submit_button"
:submitText="
localPageTimer.is_show && localPageTimer.short_time
? `${localPageTimer.short_time}S`
: styleInfo.submit_button_text
"
:buttonTextColor="styleInfo.button_text_color"
:buttonColor="styleInfo.button_color"
:nextText="
localPageTimer.is_show && localPageTimer.short_time
? `${localPageTimer.short_time}S`
: ''
"
:nextDisabled="localPageTimer.short_time"
isMobile
@previous="previous"
@next="next"
class="pagination" :page="page" :pages="pages.length + 1" :min="styleInfo.is_home ? 0 : 1"
:loading="loading" :showPrevious="styleInfo.is_up_button" :showStart="styleInfo.is_start_button"
:startText="styleInfo.start_button_text" :showSubmit="styleInfo.is_submit_button" :submitText="localPageTimer.is_show && localPageTimer.short_time
? `${localPageTimer.short_time}S`
: styleInfo.submit_button_text
" :buttonTextColor="styleInfo.button_text_color" :buttonColor="styleInfo.button_color" :nextText="localPageTimer.is_show && localPageTimer.short_time
? `${localPageTimer.short_time}S`
: ''
" :nextDisabled="localPageTimer.short_time" isMobile @previous="previous" @next="next"
/>
</div>
<!-- eslint-enable max-len -->
<LangTranslate
v-if="isAnswer && styleInfo.is_yip"
translate-key="PoweredByDigitalTechnologyCenterYIP"
v-if="isAnswer && styleInfo.is_yip" translate-key="PoweredByDigitalTechnologyCenterYIP"
class="footer"
/>
</div>
@@ -870,7 +782,8 @@ async function answer(callback, callbackBeforePage) {
const { value } = answer;
const newValue = value.replace(/\n|\r|\r\n/g, '');
switch (config.text_type) {
case 3: // 字母
// 字母
case 3:
isError
= config.include_mark === 1
? !/^[a-zA-Z·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test(
@@ -879,7 +792,8 @@ async function answer(callback, callbackBeforePage) {
: !/^[a-zA-Z]+$/.test(newValue) || !newValue.length;
question.error = isError ? translatedText.value.PleaseEnterEnglishLetters : '';
break;
case 4: // 中文
// 中文
case 4:
isError
= config.include_mark === 1
? !/^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|[·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]])+$/.test(
@@ -898,11 +812,13 @@ async function answer(callback, callbackBeforePage) {
);
question.error = isError ? translatedText.value.PleaseEnterACorrectEmail : '';
break;
case 6: // 手机号
// 手机号
case 6:
isError = !/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value);
question.error = isError ? translatedText.value.PleaseEnterACorrectPhone : '';
break;
case 7: // 身份证号
// 身份证号
case 7:
isError
= !/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/.test(
value
@@ -922,7 +838,8 @@ async function answer(callback, callbackBeforePage) {
Object.keys(answer).forEach((key) => {
const value = answer[key];
switch (config.text_type) {
case 3: // 字母
// 字母
case 3:
isError
= config.include_mark === 1
? !/^[a-zA-Z·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test(
@@ -931,7 +848,8 @@ async function answer(callback, callbackBeforePage) {
: !/^[a-zA-Z]+$/.test(newValue) || !newValue.length;
question.error = isError ? translatedText.value.PleaseEnterEnglishLetters : '';
break;
case 4: // 中文
// 中文
case 4:
isError
= config.include_mark === 1
? !/^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|[·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]])+$/.test(
@@ -942,18 +860,21 @@ async function answer(callback, callbackBeforePage) {
) || !newValue.length;
question.error = isError ? translatedText.value.PleaseEnterChineseWords : '';
break;
case 5: // 邮箱
// 邮箱
case 5:
isError
= !/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
value
);
question.error = isError ? translatedText.value.PleaseEnterACorrectEmail : '';
break;
case 6: // 手机号
// 手机号
case 6:
isError = !/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value);
question.error = isError ? translatedText.value.PleaseEnterACorrectPhone : '';
break;
case 7: // 身份证号
// 身份证号
case 7:
isError
= !/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/.test(
value
@@ -1086,7 +1007,7 @@ async function answer(callback, callbackBeforePage) {
try {
// 模拟接口
const data = answerMock(questionsData.value, page.value);
console.log('模拟作答数据', data);
// console.log('模拟作答数据', data);
// 更新答案
updateAnswer(data.answer_info_autofill);
// 更新分页数组
@@ -1100,7 +1021,7 @@ async function answer(callback, callbackBeforePage) {
}
callback(data.jump_to);
} catch (error) {
console.log(error);
// console.log(error);
}
return (loading.value = false);
}
@@ -1189,11 +1110,11 @@ async function answer(callback, callbackBeforePage) {
}
}
} catch (error) {
console.log(error);
// console.log(error);
}
loading.value = false;
} else {
console.log(errors);
// console.log(errors);
const { error, title, question_index: questionIndex } = errors[0];
const lines = (error || '')
.split('\n')
@@ -1203,7 +1124,7 @@ async function answer(callback, callbackBeforePage) {
// 锚点
const anchor = document.querySelector(`#questionIndex${questionIndex}`);
console.log(anchor, scrollbar.value);
// console.log(anchor, scrollbar.value);
scrollbar.value.scrollTo(0, anchor.offsetTop - (props.isMobile ? 20 : 40));
}
} else {
@@ -1273,7 +1194,8 @@ function jumpImmediately() {
// 跳转链接
if (countTime <= 0 && url) {
questionsData.value.action.code = -1 * code; // 防止 AnswerMob AnswerPc 组件里显示最后一页
// 防止 AnswerMob AnswerPc 组件里显示最后一页
questionsData.value.action.code = -1 * code;
url = url.replaceAll('#sn#', questionsData.value.answer.sn);
url = url.replaceAll('#user#', questionsData.value.answer.respondent);

View File

@@ -2,10 +2,7 @@
<div class="base">
<div ref="target" class="container-viewer-1-"></div>
<div ref="elCart" style="position: absolute; right: 80px; bottom: 80px"></div>
<div
v-if="spinning"
style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-color: #fff"
>
<div v-if="spinning" style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-color: #fff">
<a-spin style="position: absolute; top: 50%; left: 50%" />
</div>
<div v-if="freezeRotY" style="position: absolute; top: 0; right: 0; bottom: 0; left: 0"></div>
@@ -73,8 +70,8 @@ export default {
}
},
page_shelves(newVal, oldVal) {
console.log('page ........', newVal, oldVal);
page_shelves(newVal /* oldVal */) {
// console.log('page ........', newVal, oldVal);
if (viewer_) {
viewer_.arrange_shelves(newVal).then(() => {
// this.$emit("onPageCompletion");
@@ -166,11 +163,13 @@ export default {
// const isHall = this.shopData.type === 'hall';
// this.useJoyStick = this.shopData.type == "hall";
// useJoyStick: isHall && this.shopData?.hall.useRoaming // #20230802
/* useJoyStick: isHall; */ /* && isHallCanWalk(this.shopData.hall); */ // #20230811
// #20230811
/* useJoyStick: isHall; */ /* && isHallCanWalk(this.shopData.hall); */
const sd = JSON.parse(JSON.stringify(this.shopData || {}));
sd.shelves.forEach((shelve) => {
shelve.hideWhenSurvey = true; // hideWhenSurvey 改成 true 时,不显示展台的紫色边框
// hideWhenSurvey 改成 true 时,不显示展台的紫色边框
shelve.hideWhenSurvey = true;
});
// viewer_ = new SurveyViewer({

View File

@@ -1,11 +1,7 @@
<template>
<!-- <van-field v-model="inputValue" v-focus placeholder="请输入内容"> </van-field>-->
<!-- <completion />-->
<completion
v-model:completionValue="completionValue"
:index="answerIndex"
:element="question"
></completion>
<completion v-model:completionValue="completionValue" :index="answerIndex" :element="question"></completion>
</template>
<script setup lang="ts">
import { defineEmits, ref, watch } from 'vue';
@@ -24,8 +20,8 @@ const question = defineModel<question>('question', {});
// // 预览新增 emit ['changeAnswer', 'previous', 'next']
const emit = defineEmits(['previous', 'next', 'update:modelValue', 'saveOption', 'changeAnswer']);
console.log(`answer`, answer.value);
console.log(question.value);
// console.log(`answer`, answer.value);
// console.log(question.value);
const completionValue = ref(answer.value?.value ?? '');
// console.log(`question:`, question.value);
// console.log(`list: `, list.value);

View File

@@ -52,12 +52,12 @@ const rowRecord = ref<number[][]>([]);
// 假如 answer 有数值,需要解析 answer ,然后传递 record 给子组件
answer.value && parseAnswer(answer.value);
console.log(`answer value`, answer.value);
// console.log(`answer value`, answer.value);
/**
* 解析 answer
*/
function parseAnswer(answer: answer) {
console.log(`come in parseAnswer`);
// console.log(`come in parseAnswer`);
const rowRecordList: number[][] = [];
Object.entries(answer).forEach(([key]) => {
const [row, col] = key.split('_').map(Number);
@@ -80,7 +80,7 @@ const rows = computed(() => question.value?.list[0]?.options ?? []);
const cols = computed(() => question.value?.list[1]?.options ?? []);
watch(rowRecord, () => {
console.log(`record has changed`, rowRecord.value);
// console.log(`record has changed`, rowRecord.value);
// 重新生成 answer
const newAnswer: answer = {};
rowRecord.value.forEach((rowOptions, rowIndex) => {

View File

@@ -46,7 +46,7 @@ answer.value && parseAnswer(answer.value);
* 解析 answer
*/
function parseAnswer(answer: answerType) {
console.log(`come in parseAnswer`);
// console.log(`come in parseAnswer`);
const rowRecordList: number[] = [];
Object.entries(answer).forEach(([key]) => {
const [row, col] = key.split('_');
@@ -65,7 +65,7 @@ const rows = computed(() => question.value?.list[0]?.options ?? []);
const cols = computed(() => question.value?.list[1]?.options ?? []);
watch(rowRecord, () => {
console.log(`record has changed`, rowRecord.value);
// console.log(`record has changed`, rowRecord.value);
// 生成 answer
const newAnswer: answerType = {};
rowRecord.value.forEach((row, col) => {

View File

@@ -52,7 +52,7 @@ const rowRecord = ref<string[][]>([]);
// 假如 answer 有数值,需要解析 answer ,然后传递 record 给子组件
answer.value && parseAnswer(answer.value);
console.log(`answer value`, answer.value);
// console.log(`answer value`, answer.value);
/**
* 解析 answer
*/
@@ -62,7 +62,7 @@ function parseAnswer(answer: answerType) {
const [row, col] = key.split('_');
// 如果对应位置不存在数组, 重新建立
if (!rowRecordList[Number(row) - 1]) rowRecordList[Number(row) - 1] = [];
console.log(`value ${value}`);
// console.log(`value ${value}`);
rowRecordList[Number(row) - 1][Number(col) - 1] = value;
});
rowRecord.value = rowRecordList;

View File

@@ -22,7 +22,7 @@ function getRates() {
});
}
console.log(answer.value && getRates());
// console.log(answer.value && getRates());
watch(
rates,
() => {

View File

@@ -21,27 +21,20 @@
<div class="modal">
<div class="m-title">
<LangTranslate
v-if="countTime > 0"
translate-key="QLast_RedirectingIn5Seconds"
v-if="countTime > 0" translate-key="QLast_RedirectingIn5Seconds"
:translate-params="[countTime]"
/>
<LangTranslate v-else translate-key="QLast_IosRedirectingPrompt" />
</div>
<div class="m-bottom">
<LangTranslate
v-if="countTime > 0"
translate-key="QLast_Stay"
class="m-btn border-right"
@click="stopJump"
/>
<LangTranslate v-if="countTime > 0" translate-key="QLast_Stay" class="m-btn border-right" @click="stopJump" />
<LangTranslate translate-key="QLast_Redirect" class="m-btn" @click="jump" />
</div>
</div>
</div>
<LangTranslate
v-if="isAnswer && questionsData.survey?.style?.is_yip"
translate-key="PoweredByDigitalTechnologyCenterYIP"
class="footer"
translate-key="PoweredByDigitalTechnologyCenterYIP" class="footer"
>
<template #prefix>
<img src="https://diaoyan-files.automark.cc/yili_logo.png" alt="" class="yip-icon" />
@@ -91,12 +84,16 @@ export default defineComponent({
},
setup(props) {
const { proxy } = getCurrentInstance();
// const questionsData = inject('questionsData'); // 问卷数据
// 问卷数据
// const questionsData = inject('questionsData');
const { questionsData } = storeToRefs(useQuestionStore());
console.log(11, questionsData, props.survey);
let countTimer; // 跳转计时器
const animation = ref(redJson); // 立即跳转动画
const countTime = ref(0); // 跳转倒计时
// console.log(11, questionsData, props.survey);
// 跳转计时器
let countTimer;
// 立即跳转动画
const animation = ref(redJson);
// 跳转倒计时
const countTime = ref(0);
// 是否有跳转链接
const isEndUrl = computed(() => {
@@ -113,19 +110,22 @@ export default defineComponent({
// 跳转
function toEndUrl() {
switch (props.action.code) {
case 20004: // 被甄别
// 被甄别
case 20004:
if (props.survey.screening_end_url_select && props.survey.screening_end_url) {
const url = props.survey.screening_end_url;
toUrl(url);
}
break;
case 20011: // 成功
// 成功
case 20011:
if (props.survey.success_end_url_select && props.survey.success_end_url) {
const url = props.survey.success_end_url;
toUrl(url);
}
break;
case 20016: // 配额超限
// 配额超限
case 20016:
if (props.survey.quota_end_url_select && props.survey.quota_end_url) {
const url = props.survey.quota_end_url;
toUrl(url);
@@ -138,12 +138,16 @@ export default defineComponent({
// 跳转链接
function toUrl(url) {
// eslint-disable-next-line
url = url.replaceAll('#sn#', questionsData.value.answer.sn);
// eslint-disable-next-line
url = url.replaceAll('#user#', questionsData.value.answer.respondent);
// eslint-disable-next-line
url = url.replaceAll('#survey_sn#', questionsData.value.answer.survey_sn);
if (proxy.$route.query.source === 'YILI_APP_WANGYI') {
Object.keys(proxy.$route.query).forEach((key) => {
if (!['sn', 'source', 'is_template', 'channelUCode'].includes(key)) {
// eslint-disable-next-line
url += `${url.indexOf('?') === -1 ? '?' : '&'}${key}=${proxy.$route.query[key]}`;
}
});
@@ -155,10 +159,11 @@ export default defineComponent({
wx.miniProgram.redirectTo({ url });
});
} else {
let _url;
if (url.indexOf('http://') === -1 && url.indexOf('https://') === -1) {
url = `http://${url}`;
_url = `http://${url}`;
}
open(url, '_self');
open(_url, '_self');
}
}

View File

@@ -115,9 +115,12 @@ export default defineComponent({
}
},
setup(props, context) {
const value = ref(''); // 值
const options = ref([]); // 选项
const optionGroups = ref([]); // 分组
// 值
const value = ref('');
// 选项
const options = ref([]);
// 分组
const optionGroups = ref([]);
// console.log(`radio input question: `, props.question);

View File

@@ -91,15 +91,23 @@ export default defineComponent({
}
},
setup(props) {
// const themeColor = inject('themeColor'); // 主题颜色
// 主题颜色
// const themeColor = inject('themeColor');
const { themeColor } = storeToRefs(useQuestionStore());
const buttonColor = themeColor.value?.buttonColor; // 按钮颜色
const buttonTextColor = themeColor.value?.buttonTextColor; // 按钮文字颜色
const answerColor = themeColor.value?.answerColor || '#333333'; // 答案颜色
const answerColor30 = toRgba(answerColor, 0.3); // 背景颜色(透明度30s)
const answerColor10 = toRgba(answerColor, 0.1); // 背景颜色(透明度10)
const answerBorder = answerColor === '#333333' ? '#d9d9d9' : answerColor; // 边框颜色
const answerPlaceholder = toRgba(answerColor, 0.3); // placeholder颜色
// 按钮颜色
const buttonColor = themeColor.value?.buttonColor;
// 按钮文字颜色
const buttonTextColor = themeColor.value?.buttonTextColor;
// 答案颜色
const answerColor = themeColor.value?.answerColor || '#333333';
// 背景颜色(透明度30s)
const answerColor30 = toRgba(answerColor, 0.3);
// 背景颜色(透明度10)
const answerColor10 = toRgba(answerColor, 0.1);
// 边框颜色
const answerBorder = answerColor === '#333333' ? '#d9d9d9' : answerColor;
// placeholder颜色
const answerPlaceholder = toRgba(answerColor, 0.3);
// 鼠标 hover 时的背景色,目前用于:单选、多选、图片单选、图片多选的选项
const hoverBackgroundColor = `${themeColor.value?.buttonColor}1E`;
@@ -125,12 +133,14 @@ export default defineComponent({
};
const newTitle = computed(() => {
const cycleIndexStr = props.title?.match(/\.\d/)?.[0] || ''; // 有循环体组的题,需要在没找到被关联的题目情况下,在循环题组内再查找一次
// 有循环体组的题,需要在没找到被关联的题目情况下,在循环题组内再查找一次
const cycleIndexStr = props.title?.match(/\.\d/)?.[0] || '';
let title = props.stem;
const matchArr = title.match(/(\[%cite\(.*?\)%\])/g) || [];
matchArr.forEach((matchValue) => {
const value = matchValue.replace('[%cite(', '').replace(')%]', '');
let replacement = ''; // 替换文本
// 替换文本
let replacement = '';
// 查找引用问题
const question
= props.questions.find((question) => {
@@ -156,7 +166,8 @@ export default defineComponent({
return question.title === value + cycleIndexStr;
});
if (question) {
let options = []; // 选项
// 选项
let options = [];
question.list.forEach((list) => {
options = [...options, ...list.options];
});
@@ -274,7 +285,7 @@ export default defineComponent({
min-height: 24px;
margin-bottom: 24px;
> span {
>span {
flex-shrink: 0;
}
@@ -302,8 +313,7 @@ export default defineComponent({
// .question-inner-span {
// width: 100%;
// }
</style>
// }</style>
<style lang="scss" scoped>
:deep(.theme-hover-default) {

View File

@@ -21,7 +21,8 @@ class AnswerApi {
url: `/console/surveys/${params.id}/detail`,
params: params.data,
headers: {
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id') // store.state.answer.answerSessionId,
// store.state.answer.answerSessionId,
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id')
}
});
}
@@ -54,7 +55,8 @@ class AnswerApi {
url: `/system/sms_codes`,
data: params.data,
headers: {
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id') // store.state.answer.answerSessionId,
// store.state.answer.answerSessionId,
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id')
}
});
}
@@ -65,7 +67,8 @@ class AnswerApi {
url: `/answer/surveys/${params.id}/password`,
data: params.data,
headers: {
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id') // store.state.answer.answerSessionId,
// store.state.answer.answerSessionId,
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id')
}
});
}
@@ -75,7 +78,8 @@ class AnswerApi {
method: 'get',
url: `/console/survey_word_export/${sn}?${params}`,
headers: {
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id') // store.state.answer.answerSessionId,
// store.state.answer.answerSessionId,
'answer-session-id': AnswerApi.getLocalStorageWithExpiration('answer-session-id')
}
});
}

View File

@@ -33,7 +33,8 @@ export default defineComponent({
// const questionsData = inject('questionsData'); // 问卷数据
const translatedText = computed(() => questionsData.value.language || {});
const startAnswerTime = new Date().getTime(); // 开始答题时间戳
// 开始答题时间戳
const startAnswerTime = new Date().getTime();
const { proxy } = getCurrentInstance();
const scrollbar = ref(null);
let localPageInterval;
@@ -340,7 +341,8 @@ export default defineComponent({
const { value } = answer;
const newValue = value.replace(/\n|\r|\r\n/g, '');
switch (config.text_type) {
case 3: // 字母
// 字母
case 3:
isError
= config.include_mark === 1
? !/^[a-zA-Z·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test(
@@ -349,7 +351,8 @@ export default defineComponent({
: !/^[a-zA-Z]+$/.test(newValue) || !newValue.length;
question.error = isError ? translatedText.value.PleaseEnterEnglishLetters : '';
break;
case 4: // 中文
// 中文
case 4:
isError
= config.include_mark === 1
? !/^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|[·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]])+$/.test(
@@ -360,18 +363,21 @@ export default defineComponent({
) || !newValue.length;
question.error = isError ? translatedText.value.PleaseEnterChineseWords : '';
break;
case 5: // 邮箱
// 邮箱
case 5:
isError
= !/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
value
);
question.error = isError ? translatedText.value.PleaseEnterACorrectEmail : '';
break;
case 6: // 手机号
// 手机号
case 6:
isError = !/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value);
question.error = isError ? translatedText.value.PleaseEnterACorrectPhone : '';
break;
case 7: // 身份证号
// 身份证号
case 7:
isError
= !/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/.test(
value
@@ -391,7 +397,8 @@ export default defineComponent({
Object.keys(answer).forEach((key) => {
const value = answer[key];
switch (config.text_type) {
case 3: // 字母
// 字母
case 3:
if (
!/^[a-zA-Z·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test(
value
@@ -400,7 +407,8 @@ export default defineComponent({
question.error = translatedText.value.PleaseEnterEnglishLetters;
}
break;
case 4: // 中文
// 中文
case 4:
if (
!/^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|[·~@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]])+$/.test(
value
@@ -409,7 +417,8 @@ export default defineComponent({
question.error = translatedText.value.PleaseEnterChineseWords;
}
break;
case 5: // 邮箱
// 邮箱
case 5:
if (
!/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
value
@@ -418,12 +427,14 @@ export default defineComponent({
question.error = translatedText.value.PleaseEnterACorrectEmail;
}
break;
case 6: // 手机号
// 手机号
case 6:
if (!/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value)) {
question.error = translatedText.value.PleaseEnterACorrectPhone;
}
break;
case 7: // 身份证号
// 身份证号
case 7:
if (
!/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/.test(
value
@@ -834,10 +845,11 @@ export default defineComponent({
wx.miniProgram.redirectTo({ url });
});
} else {
let _url;
if (url.indexOf('http://') === -1 && url.indexOf('https://') === -1) {
url = `http://${url}`;
_url = `http://${url}`;
}
open(url);
open(_url);
}
}

View File

@@ -29,10 +29,7 @@
<img class="not-publish-icon" src="@/assets/img/publish/not_pulish.png" alt="" />
<div class="text">点击"启用"按钮后问卷才可以开始回收数据</div>
<van-button
type="primary"
style="margin-top: 20px"
class="publish-btn"
color="#70b936"
type="primary" style="margin-top: 20px" class="publish-btn" color="#70b936"
@click="openPublishModal"
>
<template #icon>
@@ -63,7 +60,8 @@ const route = useRoute();
const surveyTitle = route.meta.title as string;
appBridge.setTitle(surveyTitle);
const sn = route.query.sn;
const status = ref<number>(0); // `0`: 编辑中 `1`: 投放中 `2`: 已结束
// `0`: 编辑中 `1`: 投放中 `2`: 已结束
const status = ref<number>(0);
const publishType = ref(0);
const operateList = reactive([
{
@@ -130,9 +128,10 @@ function shareLink() {
description: publishInfo.value.desc || '',
thumbImageUrl: publishInfo.value.img_url,
webpageUrl: publishInfo.value.url,
scene: 0 // 朋友圈1 微信好友0
// 朋友圈1 微信好友0
scene: 0
};
console.log('shareUrl', publishInfo.value.url);
// console.log('shareUrl', publishInfo.value.url);
appBridge.shareToWeChat(params);
}

File diff suppressed because one or more lines are too long