This commit is contained in:
吴红兵
2025-12-02 10:37:49 +08:00
commit 1f645dad3e
1183 changed files with 147673 additions and 0 deletions

View File

@@ -0,0 +1,167 @@
<template>
<div :class="!props.layoutPadding ? '' : 'layout-padding'">
<div :class="!props.layoutPadding ? '' : 'layout-padding-auto layout-padding-view'">
<fc-designer ref="designer" height="100vh" :config="config.designer" :handle="config.handle" @save="props.saveFormInfo"/>
</div>
</div>
</template>
<script setup lang="ts" name="FlowForm">
import FcDesigner from 'form-create-designer';
import type { Config, DragRule } from 'form-create-designer';
import ZhCn from 'form-create-designer/src/locale/zh-cn';
import En from 'form-create-designer/src/locale/en';
import {Local} from '/@/utils/storage';
import { rules } from './rules';
import {useI18n} from "vue-i18n"
import {validateNull} from "/@/utils/validate";
import {useUserInfo} from "/@/stores/userInfo";
import {deepClone} from "/@/utils/other";
import {notifyLeft} from "../../index";
import {initFcDesignerFetch} from "./api";
const {t} = useI18n();
const {proxy} = getCurrentInstance();
const props = defineProps({
currFlowForm: {
type: Object,
default: null,
},
layoutPadding: {
type: Boolean,
default: true,
},
showSaveBtn: {
type: Boolean,
default: false,
},
saveFormInfo: {
type: Function,
default: null,
},
});
// 组件引用
const designer = ref<InstanceType<typeof FcDesigner> | null>(null);
// 设计器配置
const config = {
designer: {
fieldReadonly: false, // 字段是否只读
showSaveBtn: props.showSaveBtn,
},
handle: [
{
label: '中英切换',
handle: () => {
changeLocale();
},
},
],
locale: null,
}
function changeLocale(isInit?) {
if (!isInit) {
if (config.locale === En) {
config.locale = ZhCn;
} else {
config.locale = En;
}
} else {
// 语言
let globalI18n = Local.get('themeConfig').globalI18n;
if (globalI18n === 'en') {
config.locale = En;
} else {
config.locale = ZhCn;
}
}
FcDesigner.useLocale(config.locale);
}
const methods = {
syncCurrFlowForm() {
// 保存表单
let json = designer.value.getRule()
if (validateNull(json)) props.currFlowForm.formInfo = null
else {
let options = designer.value.getOptions()
options.widgetList = json
props.currFlowForm.formInfo = options
}
},
handleSubmit(callback, isNotify) {
methods.syncCurrFlowForm()
let json = props.currFlowForm.formInfo
if (validateNull(json)) {
if (isNotify) notifyLeft('表单设计请添加组件', 'warning')
return false
}
props.currFlowForm.formDesign = true
if (callback) callback()
return true
}
}
const data = reactive({
globalDsv: {
type: Object,
default: {},
}
});
function initFcDesigner() {
designer.value.addMenu({ name: 'biz', title: '业务组件', list: []});
// Add all rules at once
rules.forEach((rule) => {
designer.value?.addComponent(rule as DragRule);
});
initFcDesignerFetch(designer.value, null, data.globalDsv)
changeLocale(true);
}
function getFormInfo() {
initFcDesigner()
data.globalDsv.userInfos = useUserInfo().userInfos
let formInfo = deepClone(props.currFlowForm.formInfo)
if (validateNull(formInfo)) {
designer.value.setRule([]);
return
}
designer.value.setRule(formInfo.widgetList);
delete formInfo.widgetList
designer.value.setOptions(formInfo);
}
onMounted(() => {
nextTick(() => {
getFormInfo();
})
});
// 暴露变量
defineExpose({
handleSubmit: methods.handleSubmit
});
</script>
<style lang="scss">
.fc-form-row {
// 选中效果
._fd-drag-tool.active {
outline: 2px solid #2e73ff !important;
}
// 栅格线条
._fd-drag-tool {
outline: 1px dashed var(--fc-tool-border-color)!important;
}
}
// 设置事件样式
._fd-event-l {
.el-menu-item {
line-height: 1em!important;
}
}
</style>