From 1f0ffa679be09ef5b90af840ea2e8fd79696568b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=B1=E8=BE=BE?= Date: Tue, 18 Mar 2025 11:34:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(survey):=20=E9=97=AE=E5=8D=B7=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在问卷列表页面添加搜索框 - 优化页面布局,调整搜索框位置- 更新样式,确保搜索框与页面其他元素协调 --- components.d.ts | 3 +- src/App.vue | 2 +- src/api/common.js | 6 +- src/assets/css/base.scss | 1 + src/components/YLPicker.vue | 8 +- src/components/YLSelect.vue | 10 +- src/components/contenteditable.vue | 4 +- src/fonts/demo.css | 4 +- src/fonts/moblie/demo.css | 4 +- src/layouts/logic.js | 58 +++--- src/layouts/utils.js | 57 +++--- src/request/api/modules/survey.ts | 4 +- src/request/axios/index.ts | 8 +- src/utils/request.js | 8 +- src/views/Design/Index.vue | 4 +- .../ActionCompoents/OptionAction.vue | 46 +++-- .../ActionCompoents/QuestionAction.vue | 16 +- .../CompletionQuestionAction.vue | 2 +- .../QuestionItemAction/QuestionBefore.vue | 4 +- .../QuestionItemAction/RateQuestionAction.vue | 6 +- src/views/Design/components/Draggable.vue | 161 ++++++++------- .../Design/components/Questions/Choice.vue | 21 +- .../components/Questions/MartrixQuestion.vue | 12 +- .../components/Questions/paging/Paging.vue | 3 +- src/views/Home/Index.vue | 2 +- .../Home/components/LastSurvey/Index.vue | 3 +- src/views/Home/components/Market/Index.vue | 4 +- .../Market/components/MarketItem.vue | 4 +- src/views/Market/Index.vue | 4 +- src/views/Survey/Index.vue | 25 ++- src/views/Survey/views/Create/Index.vue | 18 +- src/views/Survey/views/Preview/Index.vue | 184 +++++++++--------- src/views/Survey/views/Publish/Index.vue | 26 +-- src/views/Survey/views/Success/Index.vue | 4 +- 34 files changed, 371 insertions(+), 355 deletions(-) diff --git a/components.d.ts b/components.d.ts index e5047fc..f8ab87f 100644 --- a/components.d.ts +++ b/components.d.ts @@ -2,7 +2,7 @@ // @ts-nocheck // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -export {}; +export {} /* prettier-ignore */ declare module 'vue' { @@ -39,6 +39,7 @@ declare module 'vue' { VanRadio: typeof import('vant/es')['Radio'] VanRadioGroup: typeof import('vant/es')['RadioGroup'] VanRow: typeof import('vant/es')['Row'] + VanSearch: typeof import('vant/es')['Search'] VanStepper: typeof import('vant/es')['Stepper'] VanSwitch: typeof import('vant/es')['Switch'] VanTab: typeof import('vant/es')['Tab'] diff --git a/src/App.vue b/src/App.vue index aee81b0..1301bf3 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,7 +4,7 @@ import { onMounted } from 'vue'; import appBridge from '@/assets/js/appBridge'; import utils from '@/assets/js/common'; -onMounted(async () => { +onMounted(async() => { if (utils.getParameter('digitalYiliToken')) { // 隐藏/显示 header appBridge.setHeaderShown(false); diff --git a/src/api/common.js b/src/api/common.js index fc4dfe9..1c90620 100644 --- a/src/api/common.js +++ b/src/api/common.js @@ -85,9 +85,9 @@ export default class CommonApi { }; /* eslint-disable no-useless-escape */ const reg = /\\|\/|\?|\?|\*|"|“|”|'|‘|’|<|>|{|}|\[|\]|\【|\】|:|:|、|\^|\$|!|~|`|\s|\+/g; - name = - name || - getRandomFileName(file?.name?.replace(reg, '') ?? '' ?? `${new Date().getTime()}.png`); + name + = name + || getRandomFileName(file?.name?.replace(reg, '') ?? '' ?? `${new Date().getTime()}.png`); const res = await CommonApi.getOssInfo(); /* eslint-enable no-useless-escape */ diff --git a/src/assets/css/base.scss b/src/assets/css/base.scss index ef453cc..48c4b5e 100644 --- a/src/assets/css/base.scss +++ b/src/assets/css/base.scss @@ -20,6 +20,7 @@ --van-calendar-range-edge-background: var(--primary-color); --van-cascader-active-color: var(--primary-color); --status-bar-height: 20px; + --sticky-top-height: calc(var(--status-bar-height) + calc(var(--van-nav-bar-height) + 13px)); } /* semantic color variables for this project */ diff --git a/src/components/YLPicker.vue b/src/components/YLPicker.vue index 7e5cf8f..c5108d0 100644 --- a/src/components/YLPicker.vue +++ b/src/components/YLPicker.vue @@ -170,8 +170,8 @@ const getMaxDateLimit = computed(() => { props.format ); const tempStr = '0000-12-31 23:59:59'; - const result = - props.maxDate.length !== 0 && thisMax.length > props.maxDate.length + const result + = props.maxDate.length !== 0 && thisMax.length > props.maxDate.length ? thisMax.slice(0, props.maxDate.length) + tempStr.slice(props.maxDate.length) : thisMax; return result.slice(0, props.format.length); @@ -194,8 +194,8 @@ function onChange({ selectedValues, columnIndex }) { renderMinuteColumns, renderSecondColumns ]; - updateColumns[columnIndex] && - updateColumns[columnIndex](changeValue, getMinDateLimit.value, getMaxDateLimit.value, false); + updateColumns[columnIndex] + && updateColumns[columnIndex](changeValue, getMinDateLimit.value, getMaxDateLimit.value, false); } // 渲染全部列 diff --git a/src/components/YLSelect.vue b/src/components/YLSelect.vue index a477355..8d4d700 100644 --- a/src/components/YLSelect.vue +++ b/src/components/YLSelect.vue @@ -83,14 +83,14 @@ export default defineComponent({ diff --git a/src/views/Design/components/Questions/Choice.vue b/src/views/Design/components/Questions/Choice.vue index de1dee7..e8d542b 100644 --- a/src/views/Design/components/Questions/Choice.vue +++ b/src/views/Design/components/Questions/Choice.vue @@ -102,7 +102,7 @@ diff --git a/src/views/Survey/views/Preview/Index.vue b/src/views/Survey/views/Preview/Index.vue index 07b810e..8d5de7f 100644 --- a/src/views/Survey/views/Preview/Index.vue +++ b/src/views/Survey/views/Preview/Index.vue @@ -680,9 +680,9 @@ async function answer(callback, callbackBeforePage) { question.error = translatedText.value.ThisIsARequiredQuestion; } } else if ( - answer && - questionType === 1 && - Object.keys(answer).findIndex((value) => !answer[value]) !== -1 + answer + && questionType === 1 + && Object.keys(answer).findIndex((value) => !answer[value]) !== -1 ) { // 单选题 isError = true; @@ -857,51 +857,51 @@ async function answer(callback, callbackBeforePage) { const { value } = answer; const newValue = value.replace(/\n|\r|\r\n/g, ''); switch (config.text_type) { - // 字母 - case 3: - isError = - config.include_mark === 1 - ? !/^[a-zA-Z·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test( - newValue - ) || !newValue.length - : !/^[a-zA-Z]+$/.test(newValue) || !newValue.length; - question.error = isError ? translatedText.value.PleaseEnterEnglishLetters : ''; - break; + // 字母 + case 3: + isError + = config.include_mark === 1 + ? !/^[a-zA-Z·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test( + newValue + ) || !newValue.length + : !/^[a-zA-Z]+$/.test(newValue) || !newValue.length; + question.error = isError ? translatedText.value.PleaseEnterEnglishLetters : ''; + break; // 中文 - 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( - newValue - ) || !newValue.length - : !/^(?:[\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( - newValue - ) || !newValue.length; - question.error = isError ? translatedText.value.PleaseEnterChineseWords : ''; - break; + 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( + newValue + ) || !newValue.length + : !/^(?:[\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( + newValue + ) || !newValue.length; + question.error = isError ? translatedText.value.PleaseEnterChineseWords : ''; + break; // 邮箱 - 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 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: - isError = !/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value); - question.error = isError ? translatedText.value.PleaseEnterACorrectPhone : ''; - break; + case 6: + isError = !/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value); + question.error = isError ? translatedText.value.PleaseEnterACorrectPhone : ''; + break; // 身份证号 - 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 - ); - question.error = isError ? translatedText.value.PleaseEnterACorrectID : ''; - break; - default: - break; + 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 + ); + question.error = isError ? translatedText.value.PleaseEnterACorrectID : ''; + break; + default: + break; } if (!isError && value.length < config.min && ![1, 2].includes(config.text_type)) { isError = true; @@ -913,54 +913,54 @@ async function answer(callback, callbackBeforePage) { Object.keys(answer).forEach((key) => { const value = answer[key]; switch (config.text_type) { - // 字母 - case 3: - if ( - !/^[a-zA-Z·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test( - value - ) - ) { - question.error = translatedText.value.PleaseEnterEnglishLetters; - } - break; + // 字母 + case 3: + if ( + !/^[a-zA-Z·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、`~!@#$%^&*()_\-+=<>?:"{}|,./;'\\[\]]+$/.test( + value + ) + ) { + question.error = translatedText.value.PleaseEnterEnglishLetters; + } + break; // 中文 - 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 - ) - ) { - question.error = translatedText.value.PleaseEnterChineseWords; - } - break; + 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 + ) + ) { + question.error = translatedText.value.PleaseEnterChineseWords; + } + break; // 邮箱 - 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 - ) - ) { - question.error = translatedText.value.PleaseEnterACorrectEmail; - } - break; + 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 + ) + ) { + question.error = translatedText.value.PleaseEnterACorrectEmail; + } + break; // 手机号 - case 6: - if (!/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value)) { - question.error = translatedText.value.PleaseEnterACorrectPhone; - } - break; + case 6: + if (!/^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(value)) { + question.error = translatedText.value.PleaseEnterACorrectPhone; + } + break; // 身份证号 - 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 - ) - ) { - question.error = translatedText.value.PleaseEnterACorrectID; - } - break; - default: - break; + 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 + ) + ) { + question.error = translatedText.value.PleaseEnterACorrectID; + } + break; + default: + break; } if (!question.error && value.length < config.min && ![1, 2].includes(config.text_type)) { question.error = translatedText.value.PleaseEnterMoreThanOneCharacters(config.min); @@ -1037,14 +1037,14 @@ async function answer(callback, callbackBeforePage) { currentQuestions.forEach((question, index) => { if (index >= warnStart && index < warnEnd) { if (repeat.repeat_type) { - question.warning = - translatedText.value.TheAnswerIsRepeatedMoreThanOneTimesPleaseRevise( + question.warning + = translatedText.value.TheAnswerIsRepeatedMoreThanOneTimesPleaseRevise( repeat.allow_repeat_num, repeat.repeat_type ); } else { - question.error = - translatedText.value.TheAnswerIsRepeatedMoreThanOneTimesPleaseRevise( + question.error + = translatedText.value.TheAnswerIsRepeatedMoreThanOneTimesPleaseRevise( repeat.allow_repeat_num, repeat.repeat_type ); diff --git a/src/views/Survey/views/Publish/Index.vue b/src/views/Survey/views/Publish/Index.vue index 2f97137..e9d0a10 100644 --- a/src/views/Survey/views/Publish/Index.vue +++ b/src/views/Survey/views/Publish/Index.vue @@ -94,17 +94,17 @@ type OperateItem = (typeof operateList)[0]; const operateBtn = (item: OperateItem) => { switch (item.type) { - case 'shareLink': - shareLink(); - break; - case 'copyLink': - copyLink(); - break; - case 'qrCode': - downLoadImg(); - break; - default: - break; + case 'shareLink': + shareLink(); + break; + case 'copyLink': + copyLink(); + break; + case 'qrCode': + downLoadImg(); + break; + default: + break; } }; // 复制链接 @@ -192,7 +192,7 @@ watch(status, (val) => { getCode(); } }); -onMounted(async () => { +onMounted(async() => { fetchInfo(); }); @@ -224,10 +224,10 @@ onMounted(async () => { flex-direction: column; justify-content: center; margin: 0 10px; + color: #000; font-weight: 600; font-size: 14px; line-height: 20px; - color: #000; } } diff --git a/src/views/Survey/views/Success/Index.vue b/src/views/Survey/views/Success/Index.vue index 9da41c8..e85b8d2 100644 --- a/src/views/Survey/views/Success/Index.vue +++ b/src/views/Survey/views/Success/Index.vue @@ -6,8 +6,8 @@