提交 a1617cc1 authored 作者: 刘旭's avatar 刘旭

集成的表单设计的js改为setup语法糖,保持代码一致

上级 4881991c
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"serve": "vite preview", "serve": "vite preview --open",
"tsc": "vue-tsc --noEmit" "tsc": "vue-tsc --noEmit"
}, },
"dependencies": { "dependencies": {
......
...@@ -15,6 +15,7 @@ export default { ...@@ -15,6 +15,7 @@ export default {
</script> </script>
<template> <template>
<!-- el-config-provider 设置系统语言 -->
<el-config-provider :locale="locale"> <el-config-provider :locale="locale">
<router-view></router-view> <router-view></router-view>
</el-config-provider> </el-config-provider>
...@@ -28,6 +29,7 @@ export default { ...@@ -28,6 +29,7 @@ export default {
/* 1px边框适配 */ /* 1px边框适配 */
.border-top-1px { .border-top-1px {
position: relative; position: relative;
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -38,8 +40,10 @@ export default { ...@@ -38,8 +40,10 @@ export default {
transform: scaleY(0.5); transform: scaleY(0.5);
} }
} }
.border-bottom-1px { .border-bottom-1px {
position: relative; position: relative;
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -50,8 +54,10 @@ export default { ...@@ -50,8 +54,10 @@ export default {
transform: scaleY(0.4); transform: scaleY(0.4);
} }
} }
.border-left-1px { .border-left-1px {
position: relative; position: relative;
&::after { &::after {
content: ""; content: "";
position: absolute; position: absolute;
...@@ -71,6 +77,7 @@ export default { ...@@ -71,6 +77,7 @@ export default {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
/* 垂直居中对齐 */ /* 垂直居中对齐 */
.flex-center-h { .flex-center-h {
display: flex; display: flex;
...@@ -90,16 +97,20 @@ export default { ...@@ -90,16 +97,20 @@ export default {
flex-flow: wrap; flex-flow: wrap;
align-content: space-between; align-content: space-between;
} }
/* flex布局end */ /* flex布局end */
.font12 { .font12 {
font-size: 12px; font-size: 12px;
} }
.font14 { .font14 {
font-size: 14px; font-size: 14px;
} }
.font16 { .font16 {
font-size: 16px; font-size: 16px;
} }
/* 超出省略... */ /* 超出省略... */
.over1 { .over1 {
overflow: hidden; overflow: hidden;
...@@ -141,5 +152,6 @@ export default { ...@@ -141,5 +152,6 @@ export default {
-moz-line-clamp: 3 !important; -moz-line-clamp: 3 !important;
-moz-box-orient: vertical; -moz-box-orient: vertical;
} }
/* 超出省略...end */ /* 超出省略...end */
</style> </style>
...@@ -22,8 +22,6 @@ import { permission } from './directives/permission' ...@@ -22,8 +22,6 @@ import { permission } from './directives/permission'
import SocketService from '@/socket/main' import SocketService from '@/socket/main'
// SocketService.Instance.connect(); // SocketService.Instance.connect();
import DesignForm from "../src/vueFormCreate";
// 国际化 // 国际化
import i18n from "@/lang/index"; import i18n from "@/lang/index";
...@@ -79,7 +77,6 @@ Object.keys(ElIconModules).forEach((key) => { ...@@ -79,7 +77,6 @@ Object.keys(ElIconModules).forEach((key) => {
app.use(store, key) app.use(store, key)
app.use(router); app.use(router);
app.use(ElementPlus) app.use(ElementPlus)
app.use(DesignForm);
app.use(i18n); app.use(i18n);
app.mount('#app'); app.mount('#app');
//注册 //注册
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
</div> </div>
<!-- 详情页面 --> <!-- 详情页面 -->
<el-drawer v-model="visible" :title="title" size="80%" @close="handleClose"> <el-drawer v-model="visible" :title="title" size="80%" @close="handleClose">
<ElDesignForm ref="jsonRef" /> <ElDesignForm ref="designFormRef" />
<template #footer> <template #footer>
<span> <span>
<el-button @click="handleClose">关闭</el-button> <el-button @click="handleClose">关闭</el-button>
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, nextTick } from 'vue' import { ref, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import { ElDesignForm, ElGenerateForm } from "../../vueFormCreate";
import { getStructureList, saveStructure, getStructureData, deleteStructure, deleteStructureData } from '@/services/api/systemApi/formConfiguration/formConfiguration' import { getStructureList, saveStructure, getStructureData, deleteStructure, deleteStructureData } from '@/services/api/systemApi/formConfiguration/formConfiguration'
const visible = ref(false) const visible = ref(false)
...@@ -72,7 +73,7 @@ const loading = ref(true) ...@@ -72,7 +73,7 @@ const loading = ref(true)
const loadingDialog = ref(true) const loadingDialog = ref(true)
const searchValue = ref('') const searchValue = ref('')
const tableList = ref() const tableList = ref()
const jsonRef = ref() const designFormRef = ref()
const title = ref('详情') const title = ref('详情')
const structureId = ref() const structureId = ref()
const dataList = ref() const dataList = ref()
...@@ -117,22 +118,23 @@ const handleScreen = () => init(searchValue.value, tablePage.value.pageNo, table ...@@ -117,22 +118,23 @@ const handleScreen = () => init(searchValue.value, tablePage.value.pageNo, table
const handleAdd = () => { const handleAdd = () => {
title.value = '添加' title.value = '添加'
visible.value = true visible.value = true
nextTick(() => jsonRef.value.clear()) nextTick(() => designFormRef.value.clear())
} }
const handleDetails = (row: any) => { const handleDetails = (row: any) => {
title.value = '详情' title.value = '详情'
visible.value = true visible.value = true
nextTick(() => jsonRef.value.detailJson(row.formJson)) nextTick(() => designFormRef.value.detailJson(row.formJson))
} }
const handleEdit = (row: any) => { const handleEdit = (row: any) => {
title.value = '编辑' title.value = '编辑'
structureId.value = row.id structureId.value = row.id
visible.value = true visible.value = true
nextTick(() => jsonRef.value.detailJson(row.formJson)) nextTick(() => designFormRef.value.detailJson(row.formJson))
} }
const handleQuery = (row: any) => { const handleQuery = (row: any) => {
formId.value = row.formId formId.value = row.formId
dbTableName.value = row.dbTableName dbTableName.value = row.dbTableName
...@@ -171,11 +173,11 @@ const deleteData = (id: any) => { ...@@ -171,11 +173,11 @@ const deleteData = (id: any) => {
} }
const onConfirm = () => { const onConfirm = () => {
const json = jsonRef.value.state.widgetForm const json = designFormRef.value.state.widgetForm
if (title.value === '添加') { if (title.value === '添加') {
saveStructure(json).then((res: any) => { saveStructure(json).then((res: any) => {
if (res.code === 200) { if (res.code === 200) {
jsonRef.value.handleClearable() designFormRef.value.handleClearable()
init(searchValue.value, tablePage.value.pageNo, tablePage.value.pageSize) init(searchValue.value, tablePage.value.pageNo, tablePage.value.pageSize)
visible.value = false visible.value = false
ElMessage({ type: 'success', message: '添加成功' }) ElMessage({ type: 'success', message: '添加成功' })
...@@ -184,7 +186,7 @@ const onConfirm = () => { ...@@ -184,7 +186,7 @@ const onConfirm = () => {
} else { } else {
saveStructure(json, structureId.value).then((res: any) => { saveStructure(json, structureId.value).then((res: any) => {
if (res.code === 200) { if (res.code === 200) {
jsonRef.value.handleClearable() designFormRef.value.handleClearable()
init(searchValue.value, tablePage.value.pageNo, tablePage.value.pageSize) init(searchValue.value, tablePage.value.pageNo, tablePage.value.pageSize)
visible.value = false visible.value = false
ElMessage({ type: 'success', message: '编辑成功' }) ElMessage({ type: 'success', message: '编辑成功' })
...@@ -195,7 +197,7 @@ const onConfirm = () => { ...@@ -195,7 +197,7 @@ const onConfirm = () => {
} }
const handleClose = () => { const handleClose = () => {
jsonRef.value.handleClearable() designFormRef.value.handleClearable()
visible.value = false visible.value = false
} }
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
<div ref="aceRef" style="width: 100%; height: 350px;"></div> <div ref="aceRef" style="width: 100%; height: 350px;"></div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, onMounted, reactive, toRefs, watch } from 'vue' import { onMounted, watch, ref } from 'vue'
// Ace 是一个用 JavaScript 编写的代码编辑器 仅生成文件 // Ace 是一个用 JavaScript 编写的代码编辑器 仅生成文件
import ace, { Ace } from 'ace-builds' import ace, { Ace } from 'ace-builds'
...@@ -11,68 +11,58 @@ interface State { ...@@ -11,68 +11,58 @@ interface State {
aceRef?: HTMLElement aceRef?: HTMLElement
codeEditor?: Ace.Editor codeEditor?: Ace.Editor
} }
const aceRef: any = ref<State>()
const codeEditor: any = ref<State>()
export default defineComponent({ const props = defineProps({
name: 'CodeEditor', value: {
props: { type: String,
value: { default: ''
type: String, },
default: '' language: {
}, type: String,
language: { default: 'javascript'
type: String, },
default: 'javascript' theme: {
}, tyle: String,
theme: { default: 'github'
tyle: String,
default: 'github'
},
readonly: {
type: Boolean,
default: false
}
}, },
emits: ['update:value'], readonly: {
setup(props, context) { type: Boolean,
const state = reactive<State>({ default: false
aceRef: undefined, }
codeEditor: undefined })
})
onMounted(() => { const emits = defineEmits(['update:value'])
state.codeEditor = ace.edit(state.aceRef!, {
mode: `ace/mode/${props.language}`,
theme: `ace/theme/${props.theme}`,
value: props.value,
readOnly: props.readonly,
fontSize: 12,
tabSize: 2
})
state.codeEditor.on('change', () => onMounted(() => {
context.emit('update:value', state.codeEditor?.getValue()) codeEditor.value = ace.edit(aceRef.value!, {
) mode: `ace/mode/${props.language}`,
}) theme: `ace/theme/${props.theme}`,
value: props.value,
readOnly: props.readonly,
fontSize: 12,
tabSize: 2
})
watch( codeEditor.value.on('change', () =>
() => props.value, emits('update:value', codeEditor.value?.getValue())
val => { )
if (state.codeEditor) { })
const currentPosition = state.codeEditor?.selection.getCursor()
state.codeEditor.setValue(val)
state.codeEditor.clearSelection()
state.codeEditor.gotoLine(
currentPosition.row + 1,
currentPosition.column,
true
)
}
}
)
return { watch(
...toRefs(state) () => props.value,
val => {
if (codeEditor.value) {
const currentPosition = codeEditor.value?.selection.getCursor()
codeEditor.value.setValue(val)
codeEditor.value.clearSelection()
codeEditor.value.gotoLine(
currentPosition.row + 1,
currentPosition.column,
true
)
} }
} }
}) )
</script> </script>
<template> <template>
<div class="widget-cate">{{ title }}</div> <div class="widget-cate">{{ title }}</div>
<Draggable <Draggable tag="ul" item-key="type" ghostClass="ghost" :group="{ name: 'people', pull: 'clone', put: false }"
tag="ul" :sort="false" :list="list">
item-key="type"
ghostClass="ghost"
:group="{ name: 'people', pull: 'clone', put: false }"
:sort="false"
:list="list"
>
<template #item="{ element }"> <template #item="{ element }">
<li <li class="form-edit-widget-label" :class="{ 'no-put': element.tpye === 'divider' }">
class="form-edit-widget-label"
:class="{ 'no-put': element.tpye === 'divider' }"
>
<a> <a>
<SvgIcon :iconClass="element.type" /> <SvgIcon :iconClass="element.type" />
<span>{{ element.label }}</span> <span>{{ element.label }}</span>
...@@ -22,25 +13,17 @@ ...@@ -22,25 +13,17 @@
</Draggable> </Draggable>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, PropType } from 'vue'
import Draggable from 'vuedraggable' import Draggable from 'vuedraggable'
import SvgIcon from './SvgIcon.vue' import SvgIcon from './SvgIcon.vue'
export default defineComponent({ const props = defineProps({
name: 'ComponentGroup', title: {
components: { type: String,
Draggable, required: true
SvgIcon
}, },
props: { list: {
title: { required: true
type: String,
required: true
},
list: {
required: true
}
} }
}) })
</script> </script>
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
<div ref="editor"></div> <div ref="editor"></div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { import {
computed, computed,
defineComponent,
onBeforeUnmount, onBeforeUnmount,
onMounted, onMounted,
ref, ref,
...@@ -13,50 +12,44 @@ import { ...@@ -13,50 +12,44 @@ import {
} from 'vue' } from 'vue'
import WangEditor from 'wangeditor' import WangEditor from 'wangeditor'
export default defineComponent({ const props = defineProps({
name: 'RichTextEditor', value: {
props: { type: String,
value: { default: ''
type: String,
default: ''
},
disable: {
type: Boolean,
default: false
}
}, },
emits: ['update:value'], disable: {
setup(props, context) { type: Boolean,
const editor = ref() default: false
const content = computed({
set: val => context.emit('update:value', val),
get: () => props.value
})
let instance: WangEditor | null
onMounted(() => {
instance = new WangEditor(editor.value)
Object.assign(instance.config, {
zIndex: 9,
onchange: (html: string) => (content.value = html)
})
instance.create()
watchEffect(() =>
instance && props.disable ? instance.disable() : instance?.enable()
)
})
onBeforeUnmount(() => {
instance && instance.destroy()
instance = null
})
return {
editor
}
} }
}) })
const emits = defineEmits(['update:value'])
const editor = ref()
const content = computed({
set: val => emits('update:value', val),
get: () => props.value
})
let instance: WangEditor | null
onMounted(() => {
instance = new WangEditor(editor.value)
Object.assign(instance.config, {
zIndex: 9,
onchange: (html: string) => (content.value = html)
})
instance.create()
watchEffect(() =>
instance && props.disable ? instance.disable() : instance?.enable()
)
})
onBeforeUnmount(() => {
instance && instance.destroy()
instance = null
})
</script> </script>
...@@ -5,45 +5,35 @@ ...@@ -5,45 +5,35 @@
</svg> </svg>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, computed } from 'vue' import { computed } from 'vue'
import * as utils from '../utils' import * as utils from '../utils'
export default defineComponent({ const props = defineProps({
name: 'SvgIcon', iconClass: {
props: { type: String,
iconClass: { required: true
type: String,
required: true
},
className: {
type: String,
default: ''
}
}, },
setup(props) { className: {
const isExternal = computed(() => utils.isExternal(props.iconClass)) type: String,
const iconName = computed(() => `#icon-${props.iconClass}`) default: ''
const svgClass = computed(() => { }
if (props.className) { })
return `svg-icon ${props.className}`
} else {
return 'svg-icon'
}
})
const styleExternalIcon = computed(() => ({
mask: `url(${props.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`
}))
return { const isExternal = computed(() => utils.isExternal(props.iconClass))
isExternal, const iconName = computed(() => `#icon-${props.iconClass}`)
iconName, const svgClass = computed(() => {
svgClass, if (props.className) {
styleExternalIcon return `svg-icon ${props.className}`
} } else {
return 'svg-icon'
} }
}) })
const styleExternalIcon = computed(() => ({
mask: `url(${props.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${props.iconClass}) no-repeat 50% 50%`
}))
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
......
...@@ -16,9 +16,9 @@ export interface WidgetForm { ...@@ -16,9 +16,9 @@ export interface WidgetForm {
size: any size: any
hideRequiredAsterisk: boolean hideRequiredAsterisk: boolean
labelWidth: number labelWidth: number
labelPosition: string labelPosition: any
dbTableName: string dbTableName: string
dbTableComment: string, dbTableComment: string
formId: string formId: string
} }
} }
...@@ -49,7 +49,7 @@ export const widgetForm: WidgetForm = { ...@@ -49,7 +49,7 @@ export const widgetForm: WidgetForm = {
} }
export const put = () => { export const put = () => {
console.log('widgetForm', widgetForm); console.log('widgetForm', widgetForm);
} }
export const basicComponents = [ export const basicComponents = [
......
...@@ -34,15 +34,14 @@ ...@@ -34,15 +34,14 @@
</el-header> </el-header>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'
import SvgIcon from '../../components/SvgIcon.vue' import SvgIcon from '../../components/SvgIcon.vue'
export default defineComponent({ const emits = defineEmits(['uploadJson', 'clearable', 'preview', 'generateJson', 'generateCode'])
name: 'CustomHeader',
components: {
SvgIcon
},
emits: ['uploadJson', 'clearable', 'preview', 'generateJson', 'generateCode']
})
</script> </script>
<style lang="scss" scoped>
:deep(.el-icon) {
width: 2em;
}
</style>
...@@ -37,39 +37,31 @@ ...@@ -37,39 +37,31 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { WidgetForm } from '../../config/element' import { WidgetForm } from '../../config/element'
import { element } from '../../config' import { element } from '../../config'
import { defineComponent, PropType, ref, watch } from 'vue' import { PropType, ref, watch } from 'vue'
export default defineComponent({ const props = defineProps({
name: 'ElFormConfig', config: {
props: { type: Object as PropType<WidgetForm['config']>,
config: { required: true
type: Object as PropType<WidgetForm['config']>, }
required: true })
} const emits = defineEmits(['update:config'])
}, const data = ref(props.config)
emits: ['update:config'],
setup(props, context) {
const data = ref(props.config)
watch(data, () => {
context.emit('update:config', data)
})
const state = ref<any>({
widgetForm: element.widgetForm
})
// 编辑时更新数据 watch(data, () => {
const updataNewData = (value: any) => data.value = value.config emits('update:config', data)
})
const state = ref<any>({
widgetForm: element.widgetForm
})
// 编辑时更新数据
const updataNewData = (value: any) => data.value = value.config
return { defineExpose({
data, updataNewData
state,
updataNewData
}
}
}) })
</script> </script>
<template> <template>
<div class="fc-style" style="padding: 20px;"> <div class="fc-style" style="padding: 20px;">
<el-form ref="generateForm" label-suffix=":" :model="model" :rules="rules" :size="widgetForm.config.size" <el-form ref="generateForm" label-suffix=":" :model="state.model" :rules="state.rules"
:label-position="widgetForm.config.labelPosition" :label-width="`${widgetForm.config.labelWidth}px`" :size="state.widgetForm.config.size" :label-position="state.widgetForm.config.labelPosition"
:hide-required-asterisk="widgetForm.config.hideRequiredAsterisk"> :label-width="`${state.widgetForm.config.labelWidth}px`"
<template v-for="(element, index) of widgetForm.list"> :hide-required-asterisk="state.widgetForm.config.hideRequiredAsterisk">
<template v-for="(element, index) of state.widgetForm.list">
<template v-if="element.type === 'grid'"> <template v-if="element.type === 'grid'">
<el-row type="flex" v-if="element.key" :key="element.key" :gutter="element.options.gutter ?? 0" <el-row type="flex" v-if="element.key" :key="element.key" :gutter="element.options.gutter ?? 0"
:justify="element.options.justify" :align="element.options.align"> :justify="element.options.justify" :align="element.options.align">
<el-col v-for="(col, colIndex) of element.columns" :key="colIndex" :span="col.span ?? 0"> <el-col v-for="(col, colIndex) of element.columns" :key="colIndex" :span="col.span ?? 0">
<ElGenerateFormItem v-for="colItem of col.list" :model="model" :key="colItem.key" :element="colItem" <ElGenerateFormItem v-for="colItem of col.list" :model="state.model" :key="colItem.key" :element="colItem"
:config="data.config" :disabled="disabled" /> :config="data.config" :disabled="disabled" />
</el-col> </el-col>
</el-row> </el-row>
</template> </template>
<ElGenerateFormItem v-else :model="model" :key="element.key" :element="widgetForm.list[index]" <ElGenerateFormItem v-else :model="state.model" :key="element.key" :element="state.widgetForm.list[index]"
:config="data.config" :disabled="disabled" /> :config="data.config" :disabled="disabled" />
</template> </template>
</el-form> </el-form>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, onMounted, reactive, toRefs, watch } from 'vue' import { onMounted, reactive, toRefs, watch } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import ElGenerateFormItem from './ElGenerateFormItem.vue' import ElGenerateFormItem from './ElGenerateFormItem.vue'
import { element } from '../../config' import { element } from '../../config'
export default defineComponent({
name: 'ElGenerateForm', const props = defineProps({
components: { data: {
ElGenerateFormItem type: Object,
default: element.widgetForm
}, },
props: { value: {
data: { type: Object
type: Object,
default: element.widgetForm
},
value: {
type: Object
},
disabled: {
type: Boolean,
default: false
}
}, },
setup(props) { disabled: {
const state = reactive({ type: Boolean,
generateForm: null as any, default: false
model: {} as any, }
rules: {} as any, })
widgetForm:
(props.data && JSON.parse(JSON.stringify(props.data))) ??
element.widgetForm
})
const generateModel = (list: any[]) => {
for (let index = 0; index < list.length; index++) {
const model = list[index].model
if (!model) {
return
}
if (list[index].type === 'grid') {
list[index].columns.forEach((col: any) => generateModel(col.list))
} else {
if (props.value && Object.keys(props.value).includes(model)) {
state.model[model] = props.value[model]
} else {
state.model[model] = list[index].options.defaultValue
}
state.rules[model] = list[index].options.rules const state = reactive({
} generateForm: null as any,
model: {} as any,
rules: {} as any,
widgetForm:
(props.data && JSON.parse(JSON.stringify(props.data))) ??
element.widgetForm
})
const generateModel = (list: any[]) => {
for (let index = 0; index < list.length; index++) {
const model = list[index].model
if (!model) {
return
}
if (list[index].type === 'grid') {
list[index].columns.forEach((col: any) => generateModel(col.list))
} else {
if (props.value && Object.keys(props.value).includes(model)) {
state.model[model] = props.value[model]
} else {
state.model[model] = list[index].options.defaultValue
} }
state.rules[model] = list[index].options.rules
} }
}
}
const generateOptions = (list: any[]) => { const generateOptions = (list: any[]) => {
list.forEach(item => { list.forEach(item => {
if (item.type === 'grid') { if (item.type === 'grid') {
item.columns.forEach((col: any) => generateOptions(col.list)) item.columns.forEach((col: any) => generateOptions(col.list))
} else { } else {
if (item.options.remote && item.options.remoteFunc) { if (item.options.remote && item.options.remoteFunc) {
fetch(item.options.remoteFunc) fetch(item.options.remoteFunc)
.then(resp => resp.json()) .then(resp => resp.json())
.then(json => { .then(json => {
if (json instanceof Array) { if (json instanceof Array) {
item.options.remoteOptions = json.map(data => ({ item.options.remoteOptions = json.map(data => ({
label: data[item.options.props.label], label: data[item.options.props.label],
value: data[item.options.props.value], value: data[item.options.props.value],
children: data[item.options.props.children] children: data[item.options.props.children]
})) }))
} }
}) })
} }
}
})
} }
})
}
watch( watch(
() => props.data, () => props.data,
val => { val => {
state.widgetForm = state.widgetForm =
(val && JSON.parse(JSON.stringify(val))) ?? element.widgetForm (val && JSON.parse(JSON.stringify(val))) ?? element.widgetForm
state.model = {} state.model = {}
state.rules = {} state.rules = {}
generateModel(state.widgetForm.list) generateModel(state.widgetForm.list)
generateOptions(state.widgetForm.list) generateOptions(state.widgetForm.list)
}, },
{ deep: true, immediate: true } { deep: true, immediate: true }
) )
onMounted(() => { onMounted(() => {
generateModel(state.widgetForm?.list ?? []) generateModel(state.widgetForm?.list ?? [])
generateOptions(state.widgetForm?.list ?? []) generateOptions(state.widgetForm?.list ?? [])
}) })
const getData = () => { const getData = () => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
state.generateForm state.generateForm
.validate() .validate()
.then((validate: boolean) => { .then((validate: boolean) => {
if (validate) { if (validate) {
// console.log('成功', state.generateForm); // console.log('成功', state.generateForm);
resolve(state.model) resolve(state.model)
} else { } else {
// console.log('失败'); // console.log('失败');
ElMessage.error('验证失败') ElMessage.error('验证失败')
} }
})
.catch((error: Error) => {
reject(error)
})
}) })
} .catch((error: Error) => {
reject(error)
})
})
}
const reset = () => { const reset = () => {
state.generateForm.resetFields() state.generateForm.resetFields()
} }
return { defineExpose({
...toRefs(state), ...toRefs(state),
getData, getData,
reset reset
}
}
}) })
</script> </script>
...@@ -402,115 +402,95 @@ ...@@ -402,115 +402,95 @@
</el-form> </el-form>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, ref, watch, reactive } from 'vue' import { ref, watch, reactive } from 'vue'
import Draggable from 'vuedraggable' import Draggable from 'vuedraggable'
import SvgIcon from '../../components/SvgIcon.vue' import SvgIcon from '../../components/SvgIcon.vue'
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
export default defineComponent({ const props = defineProps({
name: 'ElWidgetConfig', select: {
components: { type: Object
Draggable, }
SvgIcon })
},
props: {
select: {
type: Object
}
},
emits: ['update:select'],
setup(props, context) {
const add = async (formEl: FormInstance | undefined) => {
if (!formEl) return
console.log('sda');
await formEl.validate((valid, fields) => {
if (valid) {
console.log('校验通过');
} else {
console.log('fields', fields);
}
})
}
const data = ref<any>(props.select)
const widgetConfigRef = ref<FormInstance>()
const rules = reactive<FormRules>({
model: [{ required: true, message: '字段标识不为空', trigger: 'blur' }],
dbFieldName: [{ required: true, message: '表字段名称不为空', trigger: 'blur' }],
dbFieldComment: [{ required: true, message: '表字段注释不为空', trigger: 'blur' }]
})
watch(
() => props.select,
(val) => (data.value = val)
)
watch(data, (val) => context.emit('update:select', val), { deep: true })
const hasKey = (key: string) =>
Object.keys(data.value.options).includes(key)
const handleInsertColumn = () => {
data.value.columns.push({
span: 0,
list: []
})
}
const handleInsertOption = () => { const emits = defineEmits(['update:select'])
const index = data.value.options.options.length + 1
data.value.options.options.push({
label: `Option ${index}`,
value: `Option ${index}`
})
}
const handleOptionsRemove = (index: number) => { const add = async (formEl: FormInstance | undefined) => {
if (data.value.type === 'grid') { if (!formEl) return
data.value.columns.splice(index, 1) console.log('sda');
} else { await formEl.validate((valid, fields) => {
data.value.options.options.splice(index, 1) if (valid) {
} console.log('校验通过');
} } else {
console.log('fields', fields);
const handleSliderModeChange = (checked: boolean) => {
checked
? (data.value.options.defaultValue = [10, 90])
: (data.value.options.defaultValue = 0)
} }
})
}
const data = ref<any>(props.select)
const widgetConfigRef = ref<FormInstance>()
const rules = reactive<FormRules>({
model: [{ required: true, message: '字段标识不为空', trigger: 'blur' }],
dbFieldName: [{ required: true, message: '表字段名称不为空', trigger: 'blur' }],
dbFieldComment: [{ required: true, message: '表字段注释不为空', trigger: 'blur' }]
})
watch(
() => props.select,
(val) => (data.value = val)
)
watch(data, (val) => emits('update:select', val), { deep: true })
const hasKey = (key: string) =>
Object.keys(data.value.options).includes(key)
const handleInsertColumn = () => {
data.value.columns.push({
span: 0,
list: []
})
}
const handleInsertOption = () => {
const index = data.value.options.options.length + 1
data.value.options.options.push({
label: `Option ${index}`,
value: `Option ${index}`
})
}
const handleOptionsRemove = (index: number) => {
if (data.value.type === 'grid') {
data.value.columns.splice(index, 1)
} else {
data.value.options.options.splice(index, 1)
}
}
const handleSelectModeChange = (val: boolean) => { const handleSliderModeChange = (checked: boolean) => {
if (data.value.type === 'img-upload') { checked
return ? (data.value.options.defaultValue = [10, 90])
} : (data.value.options.defaultValue = 0)
if (val) { }
if (data.value.options.defaultValue) {
if (!(data.value.options.defaultValue instanceof Array)) {
data.value.options.defaultValue = [data.value.options.defaultValue]
}
} else {
data.value.options.defaultValue = []
}
} else {
data.value.options.defaultValue.length
? (data.value.options.defaultValue =
data.value.options.defaultValue[0])
: (data.value.options.defaultValue = null)
}
}
return { const handleSelectModeChange = (val: boolean) => {
data, if (data.value.type === 'img-upload') {
rules, return
widgetConfigRef, }
hasKey, if (val) {
handleInsertColumn, if (data.value.options.defaultValue) {
handleInsertOption, if (!(data.value.options.defaultValue instanceof Array)) {
handleOptionsRemove, data.value.options.defaultValue = [data.value.options.defaultValue]
handleSliderModeChange, }
handleSelectModeChange, } else {
add data.value.options.defaultValue = []
} }
} else {
data.value.options.defaultValue.length
? (data.value.options.defaultValue =
data.value.options.defaultValue[0])
: (data.value.options.defaultValue = null)
} }
}) }
</script> </script>
import { App } from 'vue' import { App } from 'vue'
import ElDesignForm from './core/element/ElDesignForm.vue' import ElDesignForm from './core/element/ElDesignForm.vue' // 主页面
import ElGenerateForm from './core/element/ElGenerateForm.vue' import ElGenerateForm from './core/element/ElGenerateForm.vue'
import Icons from './icons' import Icons from './icons'
import './styles/index.styl' import './styles/index.styl'
...@@ -32,5 +32,5 @@ export { ...@@ -32,5 +32,5 @@ export {
export default { export default {
install, install,
ElDesignForm, ElDesignForm,
ElGenerateForm ElGenerateForm,
} }
\ No newline at end of file
...@@ -122,6 +122,7 @@ export default ({ command, mode }) => { ...@@ -122,6 +122,7 @@ export default ({ command, mode }) => {
}, },
}, },
build: { build: {
minify: 'terser',
// 分块打包配置 // 分块打包配置
chunkSizeWarningLimit: 1500, // 分块打包,分解块,将大块分解成更小的块 chunkSizeWarningLimit: 1500, // 分块打包,分解块,将大块分解成更小的块
rollupOptions: { rollupOptions: {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论