diff --git a/web/components.d.ts b/web/components.d.ts index 8824b169..1163e3dd 100644 --- a/web/components.d.ts +++ b/web/components.d.ts @@ -11,7 +11,6 @@ declare module 'vue' { ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCollapse: typeof import('element-plus/es')['ElCollapse'] ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] - ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDialog: typeof import('element-plus/es')['ElDialog'] @@ -25,13 +24,10 @@ declare module 'vue' { ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] ElPopover: typeof import('element-plus/es')['ElPopover'] - ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] - ElRow: typeof import('element-plus/es')['ElRow'] ElSelect: typeof import('element-plus/es')['ElSelect'] ElSelectV2: typeof import('element-plus/es')['ElSelectV2'] - ElSlider: typeof import('element-plus/es')['ElSlider'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] diff --git a/web/src/management/pages/edit/components/ModuleNavbar.vue b/web/src/management/pages/edit/components/ModuleNavbar.vue index 8b9de47b..4754af42 100644 --- a/web/src/management/pages/edit/components/ModuleNavbar.vue +++ b/web/src/management/pages/edit/components/ModuleNavbar.vue @@ -14,22 +14,21 @@ - - + \ No newline at end of file diff --git a/web/src/render/pages/IndexPage.vue b/web/src/render/pages/IndexPage.vue index 7f02b5cd..669d852c 100644 --- a/web/src/render/pages/IndexPage.vue +++ b/web/src/render/pages/IndexPage.vue @@ -79,6 +79,18 @@ const normalizationRequestBody = () => { clientTime: Date.now() } + //浏览器缓存数据 + localStorage.removeItem(surveyPath + "_questionData") + localStorage.removeItem("isSubmit") + + //数据加密 + var formData = Object.assign({}, store.state.formValues) + for(const key in formData){ + formData[key] = encodeURIComponent(formData[key]) + } + localStorage.setItem(surveyPath + "_questionData", JSON.stringify(formData)) + localStorage.setItem('isSubmit', JSON.stringify(true)) + if (encryptInfo?.encryptType) { result.encryptType = encryptInfo?.encryptType result.data = encrypt[result.encryptType as 'rsa']({ @@ -100,6 +112,7 @@ const submitSurver = async () => { const params = normalizationRequestBody() console.log(params) const res: any = await submitForm(params) + if (res.code === 200) { store.commit('setRouter', 'successPage') } else { diff --git a/web/src/render/store/actions.js b/web/src/render/store/actions.js index 3438ebea..34958c1e 100644 --- a/web/src/render/store/actions.js +++ b/web/src/render/store/actions.js @@ -6,6 +6,9 @@ moment.locale('zh-cn') import adapter from '../adapter' import { queryVote, getEncryptInfo } from '@/render/api/survey' import { RuleMatch } from '@/common/logicEngine/RulesMatch' +import state from './state' +import useCommandComponent from '../hooks/useCommandComponent' +import BackAnswerDialog from '../components/BackAnswerDialog.vue' /** * CODE_MAP不从management引入,在dev阶段,会导致B端 router被加载,进而导致C端路由被添加 baseUrl: /management */ @@ -15,12 +18,13 @@ const CODE_MAP = { NO_AUTH: 403 } const VOTE_INFO_KEY = 'voteinfo' +const confirm = useCommandComponent(BackAnswerDialog) export default { // 初始化 - init({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) { + init({ commit, dispatch },{ bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf}) { commit('setEnterTime') - const { begTime, endTime, answerBegTime, answerEndTime } = baseConf + const { begTime, endTime, answerBegTime, answerEndTime, breakAnswer, backAnswer} = baseConf const { msgContent } = submitConf const now = Date.now() if (now < new Date(begTime).getTime()) { @@ -53,33 +57,73 @@ export default { return } } - commit('setRouter', 'indexPage') - // 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段 - const { questionData, questionSeq, rules, formValues } = adapter.generateData({ - bannerConf, - baseConf, - bottomConf, - dataConf, - skinConf, - submitConf - }) + //回填,断点续填 + const localData = JSON.parse(localStorage.getItem(state.surveyPath + "_questionData")) - // 将数据设置到state上 - commit('assignState', { - questionData, - questionSeq, - rules, - bannerConf, - baseConf, - bottomConf, - dataConf, - skinConf, - submitConf, - formValues - }) - // 获取已投票数据 - dispatch('initVoteData') + //数据解密 + for(const key in localData){ + localData[key] = decodeURIComponent(localData[key]) + } + + const isSubmit = JSON.parse(localStorage.getItem('isSubmit')) + if(localData) { + if(isSubmit){ + if(!backAnswer) { + clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) + } else { + confirm({ + title: "您之前已提交过问卷,是否要回填?", + onConfirm: async () => { + try { + loadFormData({ commit, dispatch }, {bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }, localData) + } catch (error) { + console.log(error) + } finally { + confirm.close() + } + }, + onCancel: async() => { + try { + clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) + } catch (error) { + console.log(error) + } finally { + confirm.close() + } + } + }) + } + } else{ + if(!breakAnswer) { + clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) + } else { + confirm({ + title: "您之前已填写部分内容, 是否要继续填写?", + onConfirm: async () => { + try { + loadFormData({ commit, dispatch }, {bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }, localData) + } catch (error) { + console.log(error) + } finally { + confirm.close() + } + }, + onCancel: async() => { + try { + clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) + } catch (error) { + console.log(error) + } finally { + confirm.close() + } + } + }) + } + } + } else { + clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) + } }, // 用户输入或者选择后,更新表单数据 changeData({ commit }, data) { @@ -175,3 +219,71 @@ export default { commit('setRuleEgine', ruleEngine) } } + + // 加载上次填写过的数据到问卷页 + function loadFormData({ commit, dispatch }, {bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }, formData) { + commit('setRouter', 'indexPage') + + // 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段 + const { questionData, questionSeq, rules, formValues } = adapter.generateData({ + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf + }) + console.log("formdata", formData) + + for(const key in formData){ + formValues[key] = formData[key] + console.log("formValues",formValues) + } + + // 将数据设置到state上 + commit('assignState', { + questionData, + questionSeq, + rules, + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf, + formValues + }) + // 获取已投票数据 + dispatch('initVoteData') + } + + // 加载空白页面 + function clearFormData({ commit, dispatch }, { bannerConf, baseConf, bottomConf, dataConf, skinConf, submitConf }) { + commit('setRouter', 'indexPage') + + // 根据初始的schema生成questionData, questionSeq, rules, formValues, 这四个字段 + const { questionData, questionSeq, rules, formValues } = adapter.generateData({ + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf + }) + + // 将数据设置到state上 + commit('assignState', { + questionData, + questionSeq, + rules, + bannerConf, + baseConf, + bottomConf, + dataConf, + skinConf, + submitConf, + formValues + }) + // 获取已投票数据 + dispatch('initVoteData') + } diff --git a/web/src/render/store/mutations.js b/web/src/render/store/mutations.js index 33bc69f0..7ba6ab41 100644 --- a/web/src/render/store/mutations.js +++ b/web/src/render/store/mutations.js @@ -20,8 +20,19 @@ export default { }, changeFormData(state, data) { let { key, value } = data - // console.log('formValues', key, value) set(state, `formValues.${key}`, value) + + //数据加密 + var formData = Object.assign({}, state.formValues); + for(const key in formData){ + formData[key] = encodeURIComponent(formData[key]) + } + + //浏览器存储 + localStorage.removeItem(state.surveyPath + "_questionData") + localStorage.setItem(state.surveyPath + "_questionData", JSON.stringify(formData)) + localStorage.setItem('isSubmit', JSON.stringify(false)) + }, changeSelectMoreData(state, data) { const { key, value, field } = data