|
@@ -0,0 +1,195 @@
|
|
|
+<template>
|
|
|
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="80px" class="demo-form" status-icon>
|
|
|
+ <el-col :span="24" class="btn">
|
|
|
+ <el-button class="button" @click="toBack()">返回</el-button>
|
|
|
+ <el-button class="button" type="primary" @click="submitForm(formRef)"> 提交 </el-button>
|
|
|
+ <el-button class="button" @click="resetForm(formRef)">重置</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="24" class="form">
|
|
|
+ <el-form-item label="表名中文" prop="name">
|
|
|
+ <el-input v-model="form.name_zh" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="表名" prop="name">
|
|
|
+ <el-input v-model="form.name" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注" prop="desc">
|
|
|
+ <el-input v-model="form.remark" type="textarea" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="字段列表" prop="columns">
|
|
|
+ <el-col :span="24" style="margin: 0 0 10px 0; text-align: right">
|
|
|
+ <el-button type="primary" @click="toAdd()">添加字段</el-button>
|
|
|
+ </el-col>
|
|
|
+ <el-table :data="form.columns" border>
|
|
|
+ <el-table-column label="字段名" prop="title" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.title"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="字段中文" prop="zh" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.zh" type="text"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="字段类型" prop="type" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select v-model="row.type">
|
|
|
+ <el-option v-for="i in data.typeList" :key="i.value" :label="i.label" :value="i.value"> </el-option>
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="默认值" prop="def" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.def" type="text"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="是否为索引" prop="index" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-radio-group v-model="row.index">
|
|
|
+ <el-radio v-for="i in data.groupList" :key="i.value" :label="i.value">{{ i.label }}</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="是否必填" prop="required" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-radio-group v-model="row.required">
|
|
|
+ <el-radio v-for="i in data.groupList" :key="i.value" :label="i.value">{{ i.label }}</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="关联表" prop="ref" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.ref" type="text"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="关联显示字段(使用分号(;)分隔)" prop="getProp" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.getProp" type="text"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="描述" prop="remark" align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.remark" type="text"></el-input>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" align="center" width="175">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button text type="danger" @click="toDel(row)">删除</el-button>
|
|
|
+ <el-button text type="primary" @click="toDel(row)">向下</el-button>
|
|
|
+ <el-button text type="success" @click="toDel(row)">向上</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-form>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { reactive, ref } from 'vue';
|
|
|
+import moment from 'moment';
|
|
|
+
|
|
|
+import type { FormInstance, FormRules } from 'element-plus';
|
|
|
+const emit = defineEmits(['toBack']);
|
|
|
+
|
|
|
+const formRef = ref<FormInstance>();
|
|
|
+let form: Object = reactive({
|
|
|
+ _id: '',
|
|
|
+ name: '',
|
|
|
+ columns: [],
|
|
|
+ name_zh: '',
|
|
|
+ remark: '',
|
|
|
+});
|
|
|
+const data = reactive({
|
|
|
+ typeList: [
|
|
|
+ { label: '字符串', value: 'String' },
|
|
|
+ { label: '布尔值', value: 'Boolean' },
|
|
|
+ { label: '数字', value: 'Number' },
|
|
|
+ { label: '金额', value: 'Money' },
|
|
|
+ { label: '对象', value: 'Object' },
|
|
|
+ { label: '集合', value: 'Array' },
|
|
|
+ { label: 'ObjectId', value: 'ObjectId' },
|
|
|
+ { label: 'Secret', value: 'Secret' },
|
|
|
+ ],
|
|
|
+ groupList: [
|
|
|
+ { label: '是', value: true },
|
|
|
+ { label: '否', value: false },
|
|
|
+ ],
|
|
|
+});
|
|
|
+const props = defineProps({ form: Object });
|
|
|
+console.log(props.form);
|
|
|
+
|
|
|
+form = props.form;
|
|
|
+const rules = reactive<FormRules>({
|
|
|
+ name: [{ required: true, message: '表名', trigger: 'blur' }],
|
|
|
+});
|
|
|
+interface Arr {
|
|
|
+ id: number;
|
|
|
+ name?: string;
|
|
|
+ // [prop:string]: string;
|
|
|
+}
|
|
|
+
|
|
|
+const toAdd = () => {
|
|
|
+ let list: Array<Arr> = form.columns;
|
|
|
+ list.push({ id: moment().valueOf() });
|
|
|
+};
|
|
|
+
|
|
|
+const toDel = (row: {}) => {
|
|
|
+ console.log(row);
|
|
|
+};
|
|
|
+const submitForm = async (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return;
|
|
|
+ await formEl.validate((valid, fields) => {
|
|
|
+ if (valid) {
|
|
|
+ console.log('submit!');
|
|
|
+ } else {
|
|
|
+ console.log('error submit!', fields);
|
|
|
+ }
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+const resetForm = (formEl: FormInstance | undefined) => {
|
|
|
+ if (!formEl) return;
|
|
|
+ formEl.resetFields();
|
|
|
+};
|
|
|
+const toBack = () => {
|
|
|
+ let query: Object = { type: 'list' };
|
|
|
+ emit('toBack', query);
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style>
|
|
|
+.btn {
|
|
|
+ height: 40px;
|
|
|
+ margin: 10px 0;
|
|
|
+ background: #7b9d93;
|
|
|
+ padding: 5px 5px;
|
|
|
+ text-align: center;
|
|
|
+}
|
|
|
+.btn .button {
|
|
|
+ margin: 0 16%;
|
|
|
+}
|
|
|
+.form {
|
|
|
+ max-height: 65vh;
|
|
|
+ background: #fff;
|
|
|
+ overflow-y: scroll;
|
|
|
+ margin: 20px 0 0 0;
|
|
|
+ padding: 10px;
|
|
|
+}
|
|
|
+/* .form::-webkit-scrollbar {
|
|
|
+ width: 1px;
|
|
|
+}
|
|
|
+.form::-webkit-scrollbar-thumb {
|
|
|
+ border-radius: 10px;
|
|
|
+ background: rgba(108, 43, 43, 0.2);
|
|
|
+}
|
|
|
+.form::-webkit-scrollbar-track {
|
|
|
+ border-radius: 0;
|
|
|
+ background: rgba(0, 0, 0, 0.1);
|
|
|
+} */
|
|
|
+.el-radio {
|
|
|
+ margin-right: 4px;
|
|
|
+}
|
|
|
+.el-button + .el-button {
|
|
|
+ margin-left: 0;
|
|
|
+}
|
|
|
+</style>
|