From 4002d00672ed5bdc0adedfa3b1329441d07ca8fe Mon Sep 17 00:00:00 2001 From: tsui <1146818706@qq.com> Date: Thu, 24 Jul 2025 15:30:49 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E5=AD=97=E6=AF=8D=E6=95=B0=E5=AD=97=E7=B1=BB=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81Verify=E5=AD=90=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Verifition/src/Verify.vue | 7 +- .../src/Verify/VerifyPictureWord.vue | 194 ++++++++++++++++++ src/components/Verifition/src/Verify/index.ts | 3 +- src/locales/en.ts | 4 +- src/locales/zh-CN.ts | 4 +- 5 files changed, 206 insertions(+), 6 deletions(-) create mode 100644 src/components/Verifition/src/Verify/VerifyPictureWord.vue diff --git a/src/components/Verifition/src/Verify.vue b/src/components/Verifition/src/Verify.vue index b7b504861..f9dea4ffc 100644 --- a/src/components/Verifition/src/Verify.vue +++ b/src/components/Verifition/src/Verify.vue @@ -36,14 +36,15 @@ * Verify 验证码组件 * @description 分发验证码使用 * */ -import { VerifyPoints, VerifySlide } from './Verify' +import {VerifyPictureWord, VerifyPoints, VerifySlide} from './Verify' import { computed, ref, toRefs, watchEffect } from 'vue' export default { name: 'Vue3Verify', components: { VerifySlide, - VerifyPoints + VerifyPoints, + VerifyPictureWord }, props: { captchaType: { @@ -438,4 +439,4 @@ export default { content: ' '; inset: 0; } - + \ No newline at end of file diff --git a/src/components/Verifition/src/Verify/VerifyPictureWord.vue b/src/components/Verifition/src/Verify/VerifyPictureWord.vue new file mode 100644 index 000000000..4fa26c377 --- /dev/null +++ b/src/components/Verifition/src/Verify/VerifyPictureWord.vue @@ -0,0 +1,194 @@ + + + + + + + + + + + + {{ text }} + + + + {{ t('captcha.verify') }} + + + + \ No newline at end of file diff --git a/src/components/Verifition/src/Verify/index.ts b/src/components/Verifition/src/Verify/index.ts index 0daa63a56..e027ab3fd 100644 --- a/src/components/Verifition/src/Verify/index.ts +++ b/src/components/Verifition/src/Verify/index.ts @@ -1,4 +1,5 @@ import VerifySlide from './VerifySlide.vue' import VerifyPoints from './VerifyPoints.vue' +import VerifyPictureWord from './VerifyPictureWord.vue' -export { VerifySlide, VerifyPoints } +export { VerifySlide, VerifyPoints, VerifyPictureWord } \ No newline at end of file diff --git a/src/locales/en.ts b/src/locales/en.ts index 505cfd80d..bd4c0b42c 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -146,9 +146,11 @@ export default { invalidTenantName:"Invalid Tenant Name" }, captcha: { + verify: 'Verify', verification: 'Please complete security verification', slide: 'Swipe right to complete verification', point: 'Please click', + code: 'Please enter the verification code', success: 'Verification succeeded', fail: 'verification failed' }, @@ -457,4 +459,4 @@ export default { btn_zoom_out: 'Zoom out', preview: 'Preivew' } -} +} \ No newline at end of file diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 768b5879a..3b6c2e904 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -147,9 +147,11 @@ export default { invalidTenantName: '无效的租户名称' }, captcha: { + verify: '验证', verification: '请完成安全验证', slide: '向右滑动完成验证', point: '请依次点击', + code: '请输入验证码', success: '验证成功', fail: '验证失败' }, @@ -453,4 +455,4 @@ export default { preview: '预览' }, 'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错 -} +} \ No newline at end of file From a164509565a72d310520bc8bcb2b3c435a439a53 Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Sat, 2 Aug 2025 14:15:34 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AE=A1=E6=89=B9=E4=BA=BA=E6=92=A4=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/bpm/task/index.ts | 5 ++++ src/views/bpm/model/form/ExtraSettings.vue | 29 ++++++++++++++++------ src/views/bpm/model/form/index.vue | 10 +++++--- src/views/bpm/task/done/index.vue | 12 ++++++++- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/api/bpm/task/index.ts b/src/api/bpm/task/index.ts index a818ae5aa..713400fc4 100644 --- a/src/api/bpm/task/index.ts +++ b/src/api/bpm/task/index.ts @@ -106,6 +106,11 @@ export const copyTask = async (data: any) => { return await request.put({ url: '/bpm/task/copy', data }) } +// 撤回 +export const withdrawTask = async (taskId: string) => { + return await request.put({ url: '/bpm/task/withdraw', params: { taskId } }) +} + // 获取我的待办任务 export const myTodoTask = async (processInstanceId: string) => { return await request.get({ url: '/bpm/task/my-todo?processInstanceId=' + processInstanceId }) diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue index 9c5beaf60..b6536d16d 100644 --- a/src/views/bpm/model/form/ExtraSettings.vue +++ b/src/views/bpm/model/form/ExtraSettings.vue @@ -11,6 +11,17 @@ + + + 审批人权限 + + + + + 审批人可撤回正在审批节点的前一节点 + + + 流程编码 @@ -233,31 +244,30 @@ import HttpRequestSetting from '@/components/SimpleProcessDesignerV2/src/nodes-c const modelData = defineModel() const formFields = ref([]) - + const props = defineProps({ // 流程表单 ID modelFormId: { type: Number, required: false, - default: undefined, + default: undefined } }) - // 监听 modelFormId 变化 watch( () => props.modelFormId, async (newVal) => { if (newVal) { - const form = await FormApi.getForm(newVal); - formFields.value = form?.fields; + const form = await FormApi.getForm(newVal) + formFields.value = form?.fields } else { // 如果 modelFormId 为空,清空表单字段 - formFields.value = []; + formFields.value = [] } }, - { immediate: true }, -); + { immediate: true } +) // 暴露给子组件使用 provide('formFields', formFields) @@ -445,6 +455,9 @@ const initData = () => { if (modelData.value.taskAfterTriggerSetting) { taskAfterTriggerEnable.value = true } + if (modelData.value.allowWithdrawTask) { + modelData.value.allowWithdrawTask = false + } } defineExpose({ initData }) diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue index 341d95684..b77ea62e3 100644 --- a/src/views/bpm/model/form/index.vue +++ b/src/views/bpm/model/form/index.vue @@ -78,9 +78,10 @@ + ref="extraSettingsRef" + v-model="formData" + :model-form-id="formData.formId" + /> @@ -176,7 +177,8 @@ const formData: any = ref({ summarySetting: { enable: false, summary: [] - } + }, + allowWithdrawTask: false }) // 流程数据 diff --git a/src/views/bpm/task/done/index.vue b/src/views/bpm/task/done/index.vue index 2f91e69a1..29c4d7558 100644 --- a/src/views/bpm/task/done/index.vue +++ b/src/views/bpm/task/done/index.vue @@ -184,8 +184,9 @@ :show-overflow-tooltip="true" /> - + + 撤回 历史 @@ -209,6 +210,7 @@ import * as DefinitionApi from '@/api/bpm/definition' defineOptions({ name: 'BpmDoneTask' }) const { push } = useRouter() // 路由 +const message = useMessage() const loading = ref(true) // 列表的加载中 const total = ref(0) // 列表的总页数 @@ -262,6 +264,14 @@ const handleAudit = (row: any) => { }) } +/** 测回按钮 */ +const handleWithdraw = (row: any) => { + TaskApi.withdrawTask(row.id).then(() => { + message.success('撤回成功') + getList() + }) +} + /** 初始化 **/ onMounted(async () => { await getList() From 5a87a41812b10af09ea92797d3a32bc5da361f6c Mon Sep 17 00:00:00 2001 From: tsui <1146818706@qq.com> Date: Sat, 2 Aug 2025 18:59:54 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix:=E6=98=8E=E7=A1=AE=E6=96=87=E5=AD=97?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E6=8C=89=E9=92=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E7=99=BB=E5=BD=95=E8=A1=A8=E5=8D=95=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E6=96=87=E5=AD=97=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=20=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Verifition/src/Verify.vue | 4 ++++ src/components/Verifition/src/Verify/VerifyPictureWord.vue | 4 ++-- src/views/Login/components/LoginForm.vue | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/Verifition/src/Verify.vue b/src/components/Verifition/src/Verify.vue index f9dea4ffc..930d0e721 100644 --- a/src/components/Verifition/src/Verify.vue +++ b/src/components/Verifition/src/Verify.vue @@ -119,6 +119,10 @@ export default { } watchEffect(() => { switch (captchaType.value) { + case 'pictureWord': + verifyType.value = '3' + componentType.value = 'VerifyPictureWord' + break case 'blockPuzzle': verifyType.value = '2' componentType.value = 'VerifySlide' diff --git a/src/components/Verifition/src/Verify/VerifyPictureWord.vue b/src/components/Verifition/src/Verify/VerifyPictureWord.vue index 4fa26c377..f996f648c 100644 --- a/src/components/Verifition/src/Verify/VerifyPictureWord.vue +++ b/src/components/Verifition/src/Verify/VerifyPictureWord.vue @@ -37,7 +37,7 @@ }"> - {{ t('captcha.verify') }} + {{ t('captcha.verify') }} @@ -48,7 +48,7 @@ * */ import { resetSize } from '../utils/util'; import { aesEncrypt } from '../utils/ase'; -import { getCode, reqCheck } from 'src/api/login'; +import { getCode, reqCheck } from '@/api/login'; import { getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs } from 'vue'; const props = defineProps({ diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue index 3c4e1d1a9..cb4dd429a 100644 --- a/src/views/Login/components/LoginForm.vue +++ b/src/views/Login/components/LoginForm.vue @@ -177,7 +177,8 @@ const permissionStore = usePermissionStore() const redirect = ref('') const loginLoading = ref(false) const verify = ref() -const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 +const captchaType = ref('pictureWord') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 +// const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN) @@ -360,4 +361,4 @@ onMounted(() => { cursor: pointer; } } - + \ No newline at end of file From ca17d5ac219ada85c89eaf2b561a3a643c51dd50 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 2 Aug 2025 22:08:32 +0800 Subject: [PATCH 04/10] =?UTF-8?q?feat=EF=BC=9A=E3=80=90bpm=20=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E3=80=91=E5=AE=A1=E6=89=B9=E4=BA=BA=E8=87=AA?= =?UTF-8?q?=E9=80=89=E6=97=B6=EF=BC=8C=E7=9B=B8=E5=90=8C=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=85=B1=E4=BA=AB=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/ProcessInstanceOperationButton.vue | 23 ++++++++++++ .../detail/ProcessInstanceTimeline.vue | 35 ++++++++++++++----- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue index 7a5559386..1b7d5c73d 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue @@ -51,8 +51,10 @@ > @@ -571,6 +573,7 @@ const approveFormRef = ref() const signRef = ref() const approveSignFormRef = ref() const nextAssigneesActivityNode = ref([]) // 下一个审批节点信息 +const nextAssigneesTimelineRef = ref() // 下一个节点审批人时间线组件的引用 const approveReasonForm = reactive({ reason: '', signPicUrl: '', @@ -717,6 +720,10 @@ const closePopover = (type: string, formRef: FormInstance | undefined) => { } popOverVisible.value[type] = false nextAssigneesActivityNode.value = [] + // 清理 Timeline 组件中的自定义审批人数据 + if (nextAssigneesTimelineRef.value) { + nextAssigneesTimelineRef.value.batchSetCustomApproveUsers({}) + } } /** 流程通过时,根据表单变量查询新的流程节点,判断下一个节点类型是否为自选审批人 */ @@ -729,6 +736,7 @@ const initNextAssigneesFormField = async () => { processVariablesStr: JSON.stringify(variables) }) if (data && data.length > 0) { + const customApproveUsersData: Record = {} // 用于收集需要设置到 Timeline 组件的自定义审批人数据 data.forEach((node: any) => { if ( // 情况一:当前节点没有审批人,并且是发起人自选 @@ -740,7 +748,18 @@ const initNextAssigneesFormField = async () => { ) { nextAssigneesActivityNode.value.push(node) } + + // 如果节点有 candidateUsers,设置到 customApproveUsers 中 + if (node.candidateUsers && node.candidateUsers.length > 0) { + customApproveUsersData[node.id] = node.candidateUsers + } }) + + // 将 candidateUsers 设置到 Timeline 组件中 + await nextTick() // 等待下一个 tick,确保 Timeline 组件已经渲染 + if (nextAssigneesTimelineRef.value && Object.keys(customApproveUsersData).length > 0) { + nextAssigneesTimelineRef.value.batchSetCustomApproveUsers(customApproveUsersData) + } } } @@ -803,6 +822,10 @@ const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) => await TaskApi.approveTask(data) popOverVisible.value.approve = false nextAssigneesActivityNode.value = [] + // 清理 Timeline 组件中的自定义审批人数据 + if (nextAssigneesTimelineRef.value) { + nextAssigneesTimelineRef.value.batchSetCustomApproveUsers({}) + } message.success('审批通过成功') } else { // 审批不通过数据 diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue index 8f55c6c4b..91f333e8e 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue @@ -15,7 +15,7 @@ > @@ -55,13 +55,13 @@ class="flex flex-wrap gap2 items-center" v-if=" isEmpty(activity.tasks) && - isEmpty(activity.candidateUsers) && - (CandidateStrategy.START_USER_SELECT === activity.candidateStrategy || - CandidateStrategy.APPROVE_USER_SELECT === activity.candidateStrategy) + ((CandidateStrategy.START_USER_SELECT === activity.candidateStrategy && + isEmpty(activity.candidateUsers)) || + (props.enableApproveUserSelect && + CandidateStrategy.APPROVE_USER_SELECT === activity.candidateStrategy)) " > - @@ -165,7 +165,7 @@ @@ -198,13 +198,15 @@ import transactorSvg from '@/assets/svgs/bpm/transactor.svg' import childProcessSvg from '@/assets/svgs/bpm/child-process.svg' defineOptions({ name: 'BpmProcessInstanceTimeline' }) -withDefaults( +const props = withDefaults( defineProps<{ activityNodes: ProcessInstanceApi.ApprovalNodeInfo[] // 审批节点信息 showStatusIcon?: boolean // 是否显示头像右下角状态图标 + enableApproveUserSelect?: boolean // 是否开启审批人自选功能 }>(), { - showStatusIcon: true // 默认值为 true + showStatusIcon: true, // 默认值为 true + enableApproveUserSelect: false // 默认值为 false } ) const { push } = useRouter() // 路由 @@ -341,4 +343,19 @@ const handleChildProcess = (activity: any) => { } }) } + +/** 设置自定义审批人 */ +const setCustomApproveUsers = (activityId: string, users: any[]) => { + customApproveUsers.value[activityId] = users || [] +} + +/** 批量设置多个节点的自定义审批人 */ +const batchSetCustomApproveUsers = (data: Record) => { + Object.keys(data).forEach((activityId) => { + customApproveUsers.value[activityId] = data[activityId] || [] + }) +} + +// 暴露方法给父组件 +defineExpose({ setCustomApproveUsers, batchSetCustomApproveUsers }) From dd6c7481f8a16d71cece00f6679eb3722ec752d0 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 3 Aug 2025 15:29:04 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix=EF=BC=9A=E3=80=90mall=20=E5=95=86?= =?UTF-8?q?=E5=9F=8E=E3=80=91=E5=BA=97=E9=93=BA=E8=A3=85=E4=BF=AE=E6=97=B6?= =?UTF-8?q?=EF=BC=8Cforce-fallback=20=E6=8B=96=E6=8B=BD=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8Chttps://t.zsxq.com/ue8Qv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/DiyEditor/components/ComponentLibrary.vue | 2 +- src/components/DiyEditor/index.vue | 2 +- src/components/Draggable/index.vue | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/DiyEditor/components/ComponentLibrary.vue b/src/components/DiyEditor/components/ComponentLibrary.vue index fdb0b1de3..06f231285 100644 --- a/src/components/DiyEditor/components/ComponentLibrary.vue +++ b/src/components/DiyEditor/components/ComponentLibrary.vue @@ -17,7 +17,7 @@ :group="{ name: 'component', pull: 'clone', put: false }" :clone="handleCloneComponent" :animation="200" - :force-fallback="true" + :force-fallback="false" > diff --git a/src/components/DiyEditor/index.vue b/src/components/DiyEditor/index.vue index 940ad664b..fa23a4d0f 100644 --- a/src/components/DiyEditor/index.vue +++ b/src/components/DiyEditor/index.vue @@ -73,7 +73,7 @@ 拖动左上角的小圆点可对其排序 Date: Mon, 4 Aug 2025 12:53:45 +0800 Subject: [PATCH 06/10] =?UTF-8?q?feat:=E3=80=90system=20=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E3=80=91=E4=BC=98=E5=8C=96=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Verify/VerifyPictureWord.vue | 166 +++++++++--------- src/views/Login/SocialLogin.vue | 2 +- .../Login/components/ForgetPasswordForm.vue | 2 +- src/views/Login/components/LoginForm.vue | 10 +- src/views/Login/components/RegisterForm.vue | 2 +- 5 files changed, 90 insertions(+), 92 deletions(-) diff --git a/src/components/Verifition/src/Verify/VerifyPictureWord.vue b/src/components/Verifition/src/Verify/VerifyPictureWord.vue index f996f648c..e1725f894 100644 --- a/src/components/Verifition/src/Verify/VerifyPictureWord.vue +++ b/src/components/Verifition/src/Verify/VerifyPictureWord.vue @@ -26,18 +26,22 @@ :style="{ width: setSize.imgWidth, color: barAreaColor, - 'border-color': barAreaBorderColor, + 'border-color': barAreaBorderColor // 'line-height': barSize.height }" class="verify-bar-area" > {{ text }} - + - {{ t('captcha.verify') }} + {{ + t('captcha.verify') + }} @@ -46,13 +50,13 @@ * VerifyPictureWord * @description 输入文字 * */ -import { resetSize } from '../utils/util'; -import { aesEncrypt } from '../utils/ase'; -import { getCode, reqCheck } from '@/api/login'; -import { getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs } from 'vue'; +import { resetSize } from '../utils/util' +import { aesEncrypt } from '../utils/ase' +import { getCode, reqCheck } from '@/api/login' +import { getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs } from 'vue' const props = defineProps({ - //弹出式pop,固定fixed + // 弹出式 pop,固定 fixed mode: { type: String, default: 'fixed' @@ -60,7 +64,7 @@ const props = defineProps({ captchaType: { type: String }, - //间隔 + // 间隔 vSpace: { type: Number, default: 5 @@ -71,7 +75,7 @@ const props = defineProps({ return { width: '310px', height: '155px' - }; + } } }, barSize: { @@ -80,20 +84,18 @@ const props = defineProps({ return { width: '310px', height: '40px' - }; + } } } -}); - -const { t } = useI18n(); -const { mode, captchaType } = toRefs(props); -const { proxy } = getCurrentInstance(); -let secretKey = ref(''), //后端返回的ase加密秘钥 +}) +const { t } = useI18n() +const { mode, captchaType } = toRefs(props) +const { proxy } = getCurrentInstance() +let secretKey = ref(''), // 后端返回的ase加密秘钥 userCode = ref(''), // 用户输入的验证码 暂存至pointJson,无需加密 - - verificationCodeImg = ref(''), //后端获取到的背景图片 - backToken = ref(''), //后端返回的token值 + verificationCodeImg = ref(''), // 后端获取到的背景图片 + backToken = ref(''), // 后端返回的token值 setSize = reactive({ imgHeight: 0, imgWidth: 0, @@ -104,91 +106,91 @@ let secretKey = ref(''), //后端返回的ase加密秘钥 barAreaColor = ref('#000'), barAreaBorderColor = ref('#ddd'), showRefresh = ref(true), -// bindingClick = ref(true) - checking = ref(false); + // bindingClick = ref(true) + checking = ref(false) const init = () => { - //加载页面 - getPicture(); + // 加载页面 + getPicture() nextTick(() => { - let { imgHeight, imgWidth, barHeight, barWidth } = resetSize(proxy); - setSize.imgHeight = imgHeight; - setSize.imgWidth = imgWidth; - setSize.barHeight = barHeight; - setSize.barWidth = barWidth; - proxy.$parent.$emit('ready', proxy); - }); -}; + let { imgHeight, imgWidth, barHeight, barWidth } = resetSize(proxy) + setSize.imgHeight = imgHeight + setSize.imgWidth = imgWidth + setSize.barHeight = barHeight + setSize.barWidth = barWidth + proxy.$parent.$emit('ready', proxy) + }) +} onMounted(() => { // 禁止拖拽 - init(); - proxy.$el.onselectstart = function() { - return false; - }; -}); -const canvas = ref(null); + init() + proxy.$el.onselectstart = function () { + return false + } +}) +const canvas = ref(null) const submit = () => { - checking.value = true; - //发送后端请求 - var captchaVerification = secretKey.value + checking.value = true + // 发送后端请求 + const captchaVerification = secretKey.value ? aesEncrypt(backToken.value + '---' + userCode.value, secretKey.value) - : backToken.value + '---' + userCode.value; + : backToken.value + '---' + userCode.value let data = { captchaType: captchaType.value, pointJson: userCode.value, token: backToken.value - }; + } reqCheck(data).then((res) => { - if (res.repCode == '0000') { - barAreaColor.value = '#4cae4c'; - barAreaBorderColor.value = '#5cb85c'; - text.value = t('captcha.success'); + if (res.repCode === '0000') { + barAreaColor.value = '#4cae4c' + barAreaBorderColor.value = '#5cb85c' + text.value = t('captcha.success') // bindingClick.value = false - if (mode.value == 'pop') { + if (mode.value === 'pop') { setTimeout(() => { - proxy.$parent.clickShow = false; - refresh(); - }, 1500); + proxy.$parent.clickShow = false + refresh() + }, 1500) } - proxy.$parent.$emit('success', { captchaVerification }); + proxy.$parent.$emit('success', { captchaVerification }) } else { - proxy.$parent.$emit('error', proxy); - barAreaColor.value = '#d9534f'; - barAreaBorderColor.value = '#d9534f'; - text.value = t('captcha.fail'); + proxy.$parent.$emit('error', proxy) + barAreaColor.value = '#d9534f' + barAreaBorderColor.value = '#d9534f' + text.value = t('captcha.fail') setTimeout(() => { - refresh(); - }, 700); + refresh() + }, 700) } - checking.value = false; - }); -}; + checking.value = false + }) +} -const refresh = async function() { - barAreaColor.value = '#000'; - barAreaBorderColor.value = '#ddd'; - checking.value = false; +const refresh = async function () { + barAreaColor.value = '#000' + barAreaBorderColor.value = '#ddd' + checking.value = false - userCode.value = ''; + userCode.value = '' - await getPicture(); - showRefresh.value = true; -}; + await getPicture() + showRefresh.value = true +} // 请求背景图片和验证图片 const getPicture = async () => { let data = { captchaType: captchaType.value - }; - const res = await getCode(data); - if (res.repCode == '0000') { - verificationCodeImg.value = res.repData.originalImageBase64; - backToken.value = res.repData.token; - secretKey.value = res.repData.secretKey; - text.value = t('captcha.code'); - } else { - text.value = res.repMsg; } -}; - \ No newline at end of file + const res = await getCode(data) + if (res.repCode === '0000') { + verificationCodeImg.value = res.repData.originalImageBase64 + backToken.value = res.repData.token + secretKey.value = res.repData.secretKey + text.value = t('captcha.code') + } else { + text.value = res.repMsg + } +} + diff --git a/src/views/Login/SocialLogin.vue b/src/views/Login/SocialLogin.vue index e0caace83..961f4ddb1 100644 --- a/src/views/Login/SocialLogin.vue +++ b/src/views/Login/SocialLogin.vue @@ -185,7 +185,7 @@ const { push } = useRouter() const permissionStore = usePermissionStore() const loginLoading = ref(false) const verify = ref() -const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 +const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN) diff --git a/src/views/Login/components/ForgetPasswordForm.vue b/src/views/Login/components/ForgetPasswordForm.vue index 0c3b2e04f..f47b2299a 100644 --- a/src/views/Login/components/ForgetPasswordForm.vue +++ b/src/views/Login/components/ForgetPasswordForm.vue @@ -143,7 +143,7 @@ const iconCircleCheck = useIcon({ icon: 'ep:circle-check' }) const { validForm } = useFormValid(formSmsResetPassword) const { handleBackLogin, getLoginState, setLoginState } = useLoginState() const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD) -const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 +const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 const validatePass2 = (_rule, value, callback) => { if (value === '') { diff --git a/src/views/Login/components/LoginForm.vue b/src/views/Login/components/LoginForm.vue index cb4dd429a..1bb5173d8 100644 --- a/src/views/Login/components/LoginForm.vue +++ b/src/views/Login/components/LoginForm.vue @@ -47,10 +47,7 @@ /> - + @@ -177,8 +174,7 @@ const permissionStore = usePermissionStore() const redirect = ref('') const loginLoading = ref(false) const verify = ref() -const captchaType = ref('pictureWord') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 -// const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 +const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.LOGIN) @@ -361,4 +357,4 @@ onMounted(() => { cursor: pointer; } } - \ No newline at end of file + diff --git a/src/views/Login/components/RegisterForm.vue b/src/views/Login/components/RegisterForm.vue index 0636a1c82..eb1f75b69 100644 --- a/src/views/Login/components/RegisterForm.vue +++ b/src/views/Login/components/RegisterForm.vue @@ -119,7 +119,7 @@ const permissionStore = usePermissionStore() const redirect = ref('') const loginLoading = ref(false) const verify = ref() -const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 +const captchaType = ref('blockPuzzle') // blockPuzzle 滑块 clickWord 点击文字 pictureWord 文字验证码 const getShow = computed(() => unref(getLoginState) === LoginStateEnum.REGISTER) From ff7beb6db2ce31dcccb0cdff4b508d679d63ec58 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 5 Aug 2025 21:12:33 +0800 Subject: [PATCH 07/10] =?UTF-8?q?feat=EF=BC=9A=E3=80=90system=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=8A=9F=E8=83=BD=E3=80=91=E9=82=AE=E7=AE=B1=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8A=84=E9=80=81=E3=80=81=E5=AF=86=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/system/mail/log/index.ts | 4 +- src/api/system/mail/template/index.ts | 9 +++- src/views/system/mail/log/MailLogDetail.vue | 28 +++++++++++-- src/views/system/mail/log/index.vue | 42 +++++++++++++++---- .../mail/template/MailTemplateSendForm.vue | 31 +++++++++++--- 5 files changed, 94 insertions(+), 20 deletions(-) diff --git a/src/api/system/mail/log/index.ts b/src/api/system/mail/log/index.ts index d891db07c..409ced631 100644 --- a/src/api/system/mail/log/index.ts +++ b/src/api/system/mail/log/index.ts @@ -4,7 +4,9 @@ export interface MailLogVO { id: number userId: number userType: number - toMail: string + toMails: string[] + ccMails?: string[] + bccMails?: string[] accountId: number fromMail: string templateId: number diff --git a/src/api/system/mail/template/index.ts b/src/api/system/mail/template/index.ts index c6dae688a..6e1d083f2 100644 --- a/src/api/system/mail/template/index.ts +++ b/src/api/system/mail/template/index.ts @@ -14,7 +14,9 @@ export interface MailTemplateVO { } export interface MailSendReqVO { - mail: string + toMails: string[] + ccMails?: string[] + bccMails?: string[] templateCode: string templateParams: Map } @@ -46,7 +48,10 @@ export const deleteMailTemplate = async (id: number) => { // 批量删除邮件模版 export const deleteMailTemplateList = async (ids: number[]) => { - return await request.delete({ url: '/system/mail-template/delete-list', params: { ids: ids.join(',') } }) + return await request.delete({ + url: '/system/mail-template/delete-list', + params: { ids: ids.join(',') } + }) } // 发送邮件 diff --git a/src/views/system/mail/log/MailLogDetail.vue b/src/views/system/mail/log/MailLogDetail.vue index a7ec449bb..37d757a3d 100644 --- a/src/views/system/mail/log/MailLogDetail.vue +++ b/src/views/system/mail/log/MailLogDetail.vue @@ -13,12 +13,34 @@ {{ detailData.templateNickname }} - - {{ detailData.toMail }} + ({{ detailData.userId }}) + 无 + + + + + 收件: + + {{ mail }}、 + + + + 抄送: + + {{ mail }}、 + + + + 密送: + + {{ mail }}、 + + + {{ detailData.templateTitle }} @@ -58,7 +80,7 @@ defineOptions({ name: 'SystemMailLogDetail' }) const dialogVisible = ref(false) // 弹窗的是否展示 const detailLoading = ref(false) // 表单的加载中 const detailData = ref() // 详情数据 -const accountList = ref([]) // 邮箱账号列表 +const accountList = ref([]) // 邮箱账号列表 /** 打开弹窗 */ const open = async (data: MailLogApi.MailLogVO) => { diff --git a/src/views/system/mail/log/index.vue b/src/views/system/mail/log/index.vue index dd915e52f..1bd794f59 100644 --- a/src/views/system/mail/log/index.vue +++ b/src/views/system/mail/log/index.vue @@ -119,12 +119,36 @@ width="180" :formatter="dateFormatter" /> - + - {{ scope.row.toMail }} - {{ '(' + scope.row.userId + ')' }} + {{ '(' + scope.row.userId + ')' }} + + - + + + + + + + 收件: + + {{ mail }}、 + + + + 抄送: + + {{ mail }}、 + + + + 密送: + + {{ mail }}、 + + @@ -185,15 +209,15 @@ const queryParams = reactive({ pageNo: 1, pageSize: 10, toMail: '', - accountId: null, - templateId: null, - sendStatus: null, - userId: null, - userType: null, + accountId: undefined, + templateId: undefined, + sendStatus: undefined, + userId: undefined, + userType: undefined, sendTime: [] }) const exportLoading = ref(false) // 导出的加载中 -const accountList = ref([]) // 邮箱账号列表 +const accountList = ref([]) // 邮箱账号列表 /** 查询列表 */ const getList = async () => { diff --git a/src/views/system/mail/template/MailTemplateSendForm.vue b/src/views/system/mail/template/MailTemplateSendForm.vue index 6e4c918e6..3decb448c 100644 --- a/src/views/system/mail/template/MailTemplateSendForm.vue +++ b/src/views/system/mail/template/MailTemplateSendForm.vue @@ -10,8 +10,26 @@ - - + + + + + + + + { formData.value = { content: '', params: {}, - mail: '', + toMails: [], + ccMails: [], + bccMails: [], templateCode: '', templateParams: new Map() } From 47863e8d22d6a8193089d10cb18cb6f99dbc504f Mon Sep 17 00:00:00 2001 From: LesanOuO <1960681385@qq.com> Date: Wed, 6 Aug 2025 19:25:12 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8form-create?= =?UTF-8?q?=E5=86=85=E7=BD=AE=E6=96=B9=E6=B3=95=E4=BF=AE=E5=A4=8D=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=96=B9=E6=B3=95JSON=E8=A7=A3=E6=9E=90=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/formCreate.ts | 153 ++-------------------------------------- 1 file changed, 5 insertions(+), 148 deletions(-) diff --git a/src/utils/formCreate.ts b/src/utils/formCreate.ts index 19862f571..f3f005ea9 100644 --- a/src/utils/formCreate.ts +++ b/src/utils/formCreate.ts @@ -2,6 +2,7 @@ * 针对 https://github.com/xaboy/form-create-designer 封装的工具类 */ import { isRef } from 'vue' +import formCreate from '@form-create/element-ui' // 编码表单 Conf export const encodeConf = (designerRef: object) => { @@ -24,7 +25,7 @@ export const encodeFields = (designerRef: object) => { export const decodeFields = (fields: string[]) => { const rule: object[] = [] fields.forEach((item) => { - rule.push(JSON.parse(item)) + rule.push(formCreate.parseJson(item)) }) return rule } @@ -32,7 +33,7 @@ export const decodeFields = (fields: string[]) => { // 设置表单的 Conf 和 Fields,适用 FcDesigner 场景 export const setConfAndFields = (designerRef: object, conf: string, fields: string) => { // @ts-ignore - designerRef.value.setOption(JSON.parse(conf)) + designerRef.value.setOption(formCreate.parseJson(conf)) // @ts-ignore designerRef.value.setRule(decodeFields(fields)) } @@ -49,154 +50,10 @@ export const setConfAndFields2 = ( detailPreview = detailPreview.value } - // 修复所有函数类型(解决设计器保存后函数变成字符串的问题)。例如说: - // https://t.zsxq.com/rADff - // https://t.zsxq.com/ZfbGt - // https://t.zsxq.com/mHOoj - // https://t.zsxq.com/BSylB - const option = JSON.parse(conf) - const rule = decodeFields(fields) - // 🔧 修复所有函数类型 - 解决设计器保存后函数变成字符串的问题 - const fixFunctions = (obj: any) => { - if (obj && typeof obj === 'object') { - Object.keys(obj).forEach((key) => { - // 检查是否是函数相关的属性 - if (isFunctionProperty(key)) { - // 如果不是函数类型,重新构建为函数 - if (typeof obj[key] !== 'function') { - obj[key] = createDefaultFunction(key) - } - } else if (typeof obj[key] === 'object' && obj[key] !== null) { - // 递归处理嵌套对象 - fixFunctions(obj[key]) - } - }) - } - } - // 判断是否是函数属性 - const isFunctionProperty = (key: string): boolean => { - const functionKeys = [ - 'beforeFetch', // 请求前处理 - 'afterFetch', // 请求后处理 - 'onSubmit', // 表单提交 - 'onReset', // 表单重置 - 'onChange', // 值变化 - 'onInput', // 输入事件 - 'onClick', // 点击事件 - 'onFocus', // 获取焦点 - 'onBlur', // 失去焦点 - 'onMounted', // 组件挂载 - 'onCreated', // 组件创建 - 'onReload', // 重新加载 - 'remoteMethod', // 远程搜索方法 - 'parseFunc', // 解析函数 - 'validator', // 验证器 - 'asyncValidator', // 异步验证器 - 'formatter', // 格式化函数 - 'parser', // 解析函数 - 'beforeUpload', // 上传前处理 - 'onSuccess', // 成功回调 - 'onError', // 错误回调 - 'onProgress', // 进度回调 - 'onPreview', // 预览回调 - 'onRemove', // 移除回调 - 'onExceed', // 超出限制回调 - 'filterMethod', // 过滤方法 - 'sortMethod', // 排序方法 - 'loadData', // 加载数据 - 'renderContent', // 渲染内容 - 'render' // 渲染函数 - ] - // 检查是否以函数相关前缀开头 - const functionPrefixes = ['on', 'before', 'after', 'handle'] - return functionKeys.includes(key) || functionPrefixes.some((prefix) => key.startsWith(prefix)) - } - // 根据函数名创建默认函数 - const createDefaultFunction = (key: string): Function => { - switch (key) { - case 'beforeFetch': - return (config: any) => { - // 添加 Token 认证头。例如说: - // https://t.zsxq.com/hK3FO - const token = localStorage.getItem('token') - if (token) { - config.headers = { - ...config.headers, - Authorization: 'Bearer ' + token - } - } - // 添加通用请求头 - config.headers = { - ...config.headers, - 'Content-Type': 'application/json', - 'X-Requested-With': 'XMLHttpRequest' - } - // 添加时间戳防止缓存 - config.params = { - ...config.params, - _t: Date.now() - } - return config - } - case 'afterFetch': - return (data: any) => { - return data - } - case 'onSubmit': - return (_formData: any) => { - return true - } - case 'onReset': - return () => { - return true - } - case 'onChange': - return (_value: any, _oldValue: any) => {} - case 'remoteMethod': - return (query: string) => { - console.log('remoteMethod被调用:', query) - } - case 'parseFunc': - return (data: any) => { - // 默认解析逻辑:如果是数组直接返回,否则尝试获取list属性 - if (Array.isArray(data)) { - return data - } - return data?.list || data?.data || [] - } - case 'validator': - return (_rule: any, _value: any, callback: Function) => { - callback() - } - case 'beforeUpload': - return (_file: any) => { - return true - } - default: - // 通用默认函数 - return (...args: any[]) => { - // 对于事件处理函数,返回true表示继续执行 - if (key.startsWith('on') || key.startsWith('handle')) { - return true - } - // 对于其他函数,返回第一个参数(通常是数据传递) - return args[0] - } - } - } - // 修复 option 中的所有函数 - fixFunctions(option) - // 修复 rule 中的所有函数(包括组件的 props) - if (Array.isArray(rule)) { - rule.forEach((item: any) => { - fixFunctions(item) - }) - } - // @ts-ignore - detailPreview.option = option + detailPreview.option = formCreate.parseJson(conf) // @ts-ignore - detailPreview.rule = rule + detailPreview.rule = decodeFields(fields) if (value) { // @ts-ignore From 2b48d60735cb6de837b90888ec362b831f54019f Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 10 Aug 2025 22:26:35 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20[BPM=20=E5=B7=A5=E4=BD=9C=E6=B5=81?= =?UTF-8?q?]=20=E8=A7=A6=E5=8F=91=E5=99=A8=E9=85=8D=E7=BD=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/nodes-config/TriggerNodeConfig.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue index 2baac8d2e..c4fa63ccc 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/TriggerNodeConfig.vue @@ -236,7 +236,7 @@ 确 定 - 取 消 + 取 消 @@ -467,6 +467,13 @@ const saveConfig = async () => { return true } +/** 取消配置 */ +const cancelConfig = () => { + // 恢复原来的配置 + currentNode.value.triggerSetting = originalSetting + closeDrawer() +} + /** 获取节点展示内容 */ const getShowText = (): string => { let showText = '' @@ -498,7 +505,7 @@ const getShowText = (): string => { /** 显示触发器节点配置, 由父组件传过来 */ const showTriggerNodeConfig = (node: SimpleFlowNode) => { nodeName.value = node.name - originalSetting = node.triggerSetting ? JSON.parse(JSON.stringify(node.triggerSetting)) : {} + originalSetting = cloneDeep(node.triggerSetting) if (node.triggerSetting) { configForm.value = { type: node.triggerSetting.type, From e1151738f5adfe22093e0eb6a90aa7481c4a396a Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sun, 10 Aug 2025 22:47:47 +0800 Subject: [PATCH 10/10] =?UTF-8?q?perf:=20=20[BPM=20=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E6=B5=81]=20=E6=9B=B4=E5=A4=9A=E8=AE=BE=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E6=B5=81=E7=A8=8B=E8=A1=A8=E5=8D=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/bpm/model/form/ExtraSettings.vue | 47 ++++++---------------- src/views/bpm/model/form/index.vue | 5 +-- 2 files changed, 14 insertions(+), 38 deletions(-) diff --git a/src/views/bpm/model/form/ExtraSettings.vue b/src/views/bpm/model/form/ExtraSettings.vue index 9c5beaf60..0f40ad66b 100644 --- a/src/views/bpm/model/form/ExtraSettings.vue +++ b/src/views/bpm/model/form/ExtraSettings.vue @@ -232,34 +232,6 @@ import { ProcessVariableEnum } from '@/components/SimpleProcessDesignerV2/src/co import HttpRequestSetting from '@/components/SimpleProcessDesignerV2/src/nodes-config/components/HttpRequestSetting.vue' const modelData = defineModel() -const formFields = ref([]) - -const props = defineProps({ - // 流程表单 ID - modelFormId: { - type: Number, - required: false, - default: undefined, - } -}) - - -// 监听 modelFormId 变化 -watch( - () => props.modelFormId, - async (newVal) => { - if (newVal) { - const form = await FormApi.getForm(newVal); - formFields.value = form?.fields; - } else { - // 如果 modelFormId 为空,清空表单字段 - formFields.value = []; - } - }, - { immediate: true }, -); -// 暴露给子组件使用 -provide('formFields', formFields) /** 自定义 ID 流程编码 */ const timeOptions = ref([ @@ -374,10 +346,10 @@ const handleTaskAfterTriggerEnableChange = (val: boolean | string | number) => { } } -/** 表单选项 */ -const formField = ref>([]) +/** 已解析表单字段 */ +const formFields = ref>([]) const formFieldOptions4Title = computed(() => { - let cloneFormField = formField.value.map((item) => { + let cloneFormField = formFields.value.map((item) => { return { label: item.title, value: item.field @@ -399,7 +371,7 @@ const formFieldOptions4Title = computed(() => { return cloneFormField }) const formFieldOptions4Summary = computed(() => { - return formField.value.map((item) => { + return formFields.value.map((item) => { return { label: item.title, value: item.field @@ -407,6 +379,11 @@ const formFieldOptions4Summary = computed(() => { }) }) +/** 未解析的表单字段 */ +const unParsedFormFields = ref([]) +/** 暴露给子组件 HttpRequestSetting 使用 */ +provide('formFields', unParsedFormFields) + /** 兼容以前未配置更多设置的流程 */ const initData = () => { if (!modelData.value.processIdRule) { @@ -456,13 +433,15 @@ watch( const data = await FormApi.getForm(newFormId) const result: Array<{ field: string; title: string }> = [] if (data.fields) { + unParsedFormFields.value = data.fields data.fields.forEach((fieldStr: string) => { parseFormFields(JSON.parse(fieldStr), result) }) } - formField.value = result + formFields.value = result } else { - formField.value = [] + formFields.value = [] + unParsedFormFields.value = [] } }, { immediate: true } diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue index 341d95684..ec8efa287 100644 --- a/src/views/bpm/model/form/index.vue +++ b/src/views/bpm/model/form/index.vue @@ -77,10 +77,7 @@ - +