From 18375e5b316e5585f5f7d6b25896b49decbcc699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=98=B1=E8=BE=BE?= Date: Fri, 21 Mar 2025 16:35:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(survey):=20=E9=97=AE=E5=8D=B7=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E9=97=AE=E5=8D=B7=E8=AF=A6=E6=83=85=E5=92=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=97=AE=E5=8D=B7=E7=8A=B6=E6=80=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 getSurveysDetail 和 changeStatus 函数 - 实现问卷详情获取和状态修改功能 - 优化 saveSetting函数,支持不同数据类型转换- 添加问卷状态检查和自动修改逻辑 --- src/api/design/index.js | 14 +++++ src/utils/request.js | 71 ++++++++++++++----------- src/views/Survey/views/Create/Index.vue | 54 +++++++++++++++---- 3 files changed, 97 insertions(+), 42 deletions(-) diff --git a/src/api/design/index.js b/src/api/design/index.js index c87e8d5..a113c6c 100644 --- a/src/api/design/index.js +++ b/src/api/design/index.js @@ -58,3 +58,17 @@ export function getSurveyTemplate(sn, params) { params }); } +export function getSurveysDetail(sn, params) { + return request({ + url: `/console/surveys/${sn}`, + method: 'get', + params + }); +} +export function changeStatus(params) { + return request({ + url: `/console/surveys/${params.sn}/status`, + method: 'PATCH', + data: params + }); +} diff --git a/src/utils/request.js b/src/utils/request.js index 183d93c..0d3daef 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,4 +1,5 @@ import axios from 'axios'; +import { showToast } from 'vant'; // import router from '@/router/index'; // import { A_COMMON_CLEAR_TOKEN } from '@/stores/constance/constance.common.js'; @@ -55,39 +56,45 @@ service.interceptors.response.use( return Promise.resolve(response); } // return Promise.reject(/* new Error(response.message || 'Error') */); + }, + (error) => { + // for debug + // if (error.response.status === 401) { + // const query = router.currentRoute.value.query; + // //关闭已弹出的所有弹框,防止弹框重叠 + // // Modal.destroyAll(); + // store.dispatch(A_COMMON_CLEAR_TOKEN); + // window.parent.postMessage( + // { + // code: '301', + // params: {} + // }, + // '*' + // ); + // store.commit('common/M_COMMON_SET_TOKEN_UNAUTHORIZED', false); + // } else if (error.response.status === 403) { + // router.push({ + // path: '/error/403' + // }); + // } else if (error.response.status === 404) { + // router.push({ + // path: '/error/404' + // }); + // } else if (error.response.status === 500) { + // router.push({ + // path: '/error/500' + // }); + // } else { + // // message.error(error.response.data?.message || '服务器错误'); + // } + if (error.response.data?.message) { + showToast({ + message: error.response.data?.message + }); + } + + return Promise.reject(error.response); } - // (error) => { - // // for debug - // if (error.response.status === 401) { - // const query = router.currentRoute.value.query; - // //关闭已弹出的所有弹框,防止弹框重叠 - // // Modal.destroyAll(); - // store.dispatch(A_COMMON_CLEAR_TOKEN); - // window.parent.postMessage( - // { - // code: '301', - // params: {} - // }, - // '*' - // ); - // store.commit('common/M_COMMON_SET_TOKEN_UNAUTHORIZED', false); - // } else if (error.response.status === 403) { - // router.push({ - // path: '/error/403' - // }); - // } else if (error.response.status === 404) { - // router.push({ - // path: '/error/404' - // }); - // } else if (error.response.status === 500) { - // router.push({ - // path: '/error/500' - // }); - // } else { - // // message.error(error.response.data?.message || '服务器错误'); - // } - // return Promise.reject(error.response); - // } ); export default service; diff --git a/src/views/Survey/views/Create/Index.vue b/src/views/Survey/views/Create/Index.vue index 6954c49..6df78df 100644 --- a/src/views/Survey/views/Create/Index.vue +++ b/src/views/Survey/views/Create/Index.vue @@ -167,7 +167,7 @@ size="0.5rem" :active-value="1" :inactive-value="0" - @change="saveSetting('is_publish_number', ['publish_number'])" + @change="saveSetting('is_publish_number', ['publish_number'], 'number')" > @@ -181,7 +181,7 @@ label="投放数量最大为" input-align="right" type="number" - @blur="saveSetting($event, 'publish_number')" + @blur="saveSetting" > @@ -277,7 +277,7 @@ label="同一个IP地址只能作答" :border="false" input-align="right" - @blur="saveSetting($event, 'is_number')" + @blur="saveSetting" > @@ -290,7 +290,8 @@ size="0.5rem" :active-value="1" :inactive-value="0" - @change="saveSetting('is_browser_number', 'browser_number')" + type="number" + @change="saveSetting('is_browser_number', ['browser_number'])" > @@ -304,7 +305,7 @@ label="同一个浏览器只能作答" :border="false" input-align="right" - @blur="saveSetting($event, 'browser_number')" + @blur="saveSetting" > @@ -342,7 +343,9 @@ import { snQuestions, sync, saveSettings, - saveProjectName + saveProjectName, + getSurveysDetail, + changeStatus } from '@/api/design/index'; import Design from '@/views/Design/Index.vue'; import { useCounterStore } from '@/stores/counter'; @@ -391,6 +394,7 @@ const onConfirmDate = (e) => { questionInfo.value.survey.end_time = e; } timePickerModel.value = false; + saveSetting(); }; // 获取选中的题目 @@ -489,25 +493,42 @@ const saveQuestionItem = (questionJson) => { }; // 保存设置 -const saveSetting = (parentKey, childKeys) => { +const saveSetting = (parentKey, childKeys, type) => { const query = {}; + + function changeValueType(type, value) { + if (type) { + switch (type) { + case 'number': + return Number(value); + default: + return value; + } + } else { + return value; + } + } + settingList.map((item) => { if (item === 'access_password') { query[item] = JSON.stringify(questionInfo.value.survey[item]); } else { query[item] = questionInfo.value.survey[item]; + if (item === 'is_time' && query[item] === 0) { + delete query['start_time']; + delete query['end_time']; + } } }); // 增删 修改 数据结构 - if (parentKey) { + if (childKeys) { childKeys.map((key) => { - query[key] = query[parentKey] === 1 ? query[key] : 0; + query[key] = query[parentKey] === 1 ? changeValueType(type, query[key]) : 0; if (parentKey === 'is_time' && query[parentKey] === 0) { delete query[key]; } }); } - saveSettings({ sn: route.query.sn, ...query @@ -587,8 +608,21 @@ const previewQuestion = () => { router.push({ name: 'preview', query: { ...route.query } }); }; +const surveyDetailFun = (back) => { + getSurveysDetail(route.query.sn).then((res) => { + if (res.data) { + // 投放中 + if (res.data.data.status === 1) { + changeStatus({ sn: route.query.sn, status: 0 }); + } + } + }); +}; + onMounted(async () => { await getQuestionDetail(); + + surveyDetailFun(); });