diff --git a/src/api/model/tools.ts b/src/api/model/tools.ts index 921b4de..ab29d79 100644 --- a/src/api/model/tools.ts +++ b/src/api/model/tools.ts @@ -29,5 +29,10 @@ export default { show: async function (data = {}) { return await http.get("gen_table/show", data); }, + }, + form: { + build: async function (data = {}) { + return await http.post("form/build", data); + }, } } diff --git a/src/assets/icons/Json.vue b/src/assets/icons/Json.vue new file mode 100644 index 0000000..94d277e --- /dev/null +++ b/src/assets/icons/Json.vue @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/QieHuan.vue b/src/assets/icons/QieHuan.vue new file mode 100644 index 0000000..02d659c --- /dev/null +++ b/src/assets/icons/QieHuan.vue @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/ZanCun.vue b/src/assets/icons/ZanCun.vue new file mode 100644 index 0000000..c79f52b --- /dev/null +++ b/src/assets/icons/ZanCun.vue @@ -0,0 +1,3 @@ + + + diff --git a/src/views/tools/flow/index.vue b/src/views/tools/flow/index.vue index 6c8befc..f45fd6f 100644 --- a/src/views/tools/flow/index.vue +++ b/src/views/tools/flow/index.vue @@ -25,6 +25,10 @@ import {CustomLineModel, CustomLine, CUSTOM_LINE} from "./model/CustomLine" import {ElMessageBox} from 'element-plus' import {useI18n} from "vue-i18n" +defineOptions({ + name: 'toolsFlow' +}) + const containerRef = ref(HTMLElement | null); const {t} = useI18n() let lf = ref(LogicFlow | null); @@ -256,7 +260,7 @@ const handleKeydown = (event) => { .right-panel { width: 320px; background: #fff; - border-left: 1px solid #ddd; + border-left: 1px solid var(--el-border-color-light); padding: 10px; } diff --git a/src/views/tools/form/center.vue b/src/views/tools/form/center.vue index 9a00887..e960908 100644 --- a/src/views/tools/form/center.vue +++ b/src/views/tools/form/center.vue @@ -1,67 +1,148 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/tools/form/config.ts b/src/views/tools/form/config.ts index 8b431e4..6986c9a 100644 --- a/src/views/tools/form/config.ts +++ b/src/views/tools/form/config.ts @@ -246,3 +246,193 @@ export function setByPath(obj, path, value) { keys.slice(0, -1).forEach(k => o = o[k]) o[keys[keys.length - 1]] = value } + +export const inputComps = [{ + title: "单行文本", + icon: "pi-icon-line-input", + name: "text", + props: { + type: 'text' + }, + rules: [], + width: "100%", + required: false +}, { + title: "多行文本", + icon: "pi-icon-multi-input", + name: "textarea", + props: { + type: 'textarea' + }, + rules: [], + width: "100%", + required: false +}, { + title: "密码", + icon: "pi-icon-lock", + name: "password", + props: { + type: 'password', + showPassword: true + }, + rules: [], + width: "100%", + required: false +}, { + title: "计数器", + icon: "pi-icon-number-input", + name: "number", + props: { + controlsPosition: '' + }, + rules: [], + width: "100%", + required: false, + value: 1 +}] +export const choiceComps = [{ + title: "下拉组件", + icon: "pi-icon-select", + name: "select", + props: {}, + rules: [], + options: [], + width: "100%", + required: false, +}, { + title: "级联组件", + icon: "pi-icon-cascader", + name: "cascader", + props: { + props: { + label: 'label', + value: 'value', + multiple: false, + }, + options: [{label: '一号楼', value: 'r1', children: [{label: '二单元', value: 'c2'}]}] + }, + rules: [], + width: "100%", + required: false, +}, { + title: "单选组件", + icon: "pi-icon-radio", + name: "radio", + props: {}, + rules: [], + options: [], + width: "100%", + style: '', + required: false, +}, { + title: "多选组件", + icon: "pi-icon-checkbox", + name: "checkbox", + props: {}, + rules: [], + options: [], + style: '', + required: false, +}, { + title: "开关", + icon: "pi-icon-switch", + name: "switch", + props: {}, + rules: [], + required: false, +}, { + title: "滑块", + icon: "pi-icon-slider", + name: "slider", + props: {}, + rules: [], + width: "100%", + required: false, +}, { + title: "时间选择", + icon: "pi-icon-time-picker", + name: "time", + props: { + format: 'HH:mm:ss', + valueFormat: 'HH:mm:ss' + }, + rules: [] +}, { + title: "时间范围", + icon: "pi-icon-time-range", + name: "timerange", + props: { + isRange: true, + format: 'HH:mm:ss', + valueFormat: 'HH:mm:ss' + }, + rules: [], + width: "100%", + required: false, +}, { + title: "日期选择", + icon: "pi-icon-date-picker", + name: "date", + props: { + type: "date", + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD' + }, + rules: [], + width: "100%", + required: false, +}, { + title: "日期范围", + icon: "pi-icon-date-range", + name: "daterange", + props: { + type: "daterange", + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD' + }, + rules: [], + width: "100%", + required: false, +}, { + title: "评分", + icon: "pi-icon-rate", + name: "rate", + props: {}, + rules: [], + required: false, +}, { + title: "颜色选择", + icon: "pi-icon-color-picker", + name: "color", + props: {}, + rules: [], + required: false, +}, { + title: "上传", + icon: "pi-icon-upload-file", + name: "upload", + props: { + listType: 'text', + name: 'file' + }, + rules: [], + required: false, + btnText: "点击上传" +}] +export const layoutComps = [{ + title: "行容器", + icon: "pi-icon-row-layout", + name: "layout", + props: { + gutter: 15 + }, + children: [] +}, { + title: "按钮", + icon: "pi-icon-button", + name: "button", + props: { + type: 'primary' + }, + btnText: "按钮文字" +}]; diff --git a/src/views/tools/form/demo.vue b/src/views/tools/form/demo.vue new file mode 100644 index 0000000..218bb97 --- /dev/null +++ b/src/views/tools/form/demo.vue @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + 取 消 + 保 存 + + + + + diff --git a/src/views/tools/form/drag.vue b/src/views/tools/form/drag.vue index b1dce77..61b8305 100644 --- a/src/views/tools/form/drag.vue +++ b/src/views/tools/form/drag.vue @@ -1,18 +1,18 @@ - + ghostClass="ghostClass" :class="{empty: data.fields.length === 0, layout: isRow}"> - {{ element.field_name }} - + - - + @@ -30,71 +30,52 @@ import draggable from 'vuedraggable' import {computed, nextTick} from "vue" import item from "./item.vue" import drag from "./drag.vue" -import tools from "@/utils/tools.js" - -const emit = defineEmits(['change', 'update:curKey', 'update:counter']) +import tools from "@/utils/tools" +import FormBuild from "./formBuild" const props = defineProps({ - fields: {type: Array, default: []}, + data: {type: FormBuild, default: {}}, curKey: {type: String, default: ''}, isRow: {type: Boolean, default: false}, - counter: {type: Number, default: 0}, name: {type: String, default: 'page'} }) const group = {name: props.name, pull: true, put: true} -const curr = computed({ - get() { - return props.curKey - }, - set(value) { - emit('update:curKey', value) - } -}) - -const counter = computed({ - get() { - return props.counter - }, - set(value) { - emit('update:counter', value) - } +const field = computed(() => { + return props.data.activeField || {} }) // 排序 function sortComp(e) { - let element = props.fields[e.newIndex] + let element = props.data.fields[e.newIndex] if (element) { - curr.value = element.id - emit('change', element) + props.data.setActiveField(element) } } // 添加项时 function addComp(e) { - let element = props.fields[e.newIndex] + let element = props.data.fields[e.newIndex] if (props.isRow) { element.span = 12 } - curr.value = element.id - emit('change', element) + props.data.setActiveField(element) } // 选中项 function clickComp(element) { - if (curr.value === element.id) { + if (field.value.id === element.id) { return; } - curr.value = element.id - emit('change', element) + props.data.setActiveField(element) } // 删除字段 function delComp(index) { nextTick(() => { // 原数组长度 - const len = props.fields.length - props.fields.splice(index, 1); + const len = props.data.fields.length + props.data.fields.splice(index, 1); let i = 0; if (len > 1) { if (index === 0) { @@ -105,37 +86,31 @@ function delComp(index) { i = index } } - let element = props.fields[i] || {} - curr.value = element.id || null - emit('change', element) + let element = props.data.fields[i] || {} + props.data.setActiveField(element) }) } function copyComp(index) { nextTick(() => { // 复制当前元素到尾部 - const tmp = JSON.parse(JSON.stringify(props.fields[index])) + const tmp = JSON.parse(JSON.stringify(props.data.fields[index])) tmp.field_name = increaseNum(tmp.field_name) tmp.id = increaseNum(tmp.id) - counter.value++ - props.fields.push(tmp) + props.data.config.counter++ + props.data.fields.push(tmp) // 将复制的元素移动到当前元素下边 - tools.array.zIndexTo(props.fields, props.fields.length - 1, index + 1) - let element = props.fields[index + 1] - curr.value = element.id - emit('change', element) + tools.array.zIndexTo(props.data.fields, props.data.fields.length - 1, index + 1) + let element = props.data.fields[index + 1] + props.data.setActiveField(element) }) } function increaseNum(str) { return str.replace(/(\d+)(?!.*\d)/, () => { - return props.counter.toString(); + return props.data.config.counter.toString(); }); } - -function changeHandle(e) { - emit('change', e) -} diff --git a/src/views/tools/form/left.vue b/src/views/tools/form/left.vue index 960874f..314613f 100644 --- a/src/views/tools/form/left.vue +++ b/src/views/tools/form/left.vue @@ -1,5 +1,5 @@ - + @@ -9,7 +9,8 @@ 输入组件 - @@ -31,7 +32,8 @@ 选择组件 - @@ -53,7 +55,8 @@ 布局组件 - @@ -68,234 +71,38 @@ - +