column.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <div id="column">
  3. <el-row>
  4. <el-col :span="23" style="text-align: right; padding: 10px 0">
  5. <el-affix target=".backCard" :offset="50">
  6. <el-button type="primary" size="mini" @click="toAdd">添加字段</el-button>
  7. </el-affix>
  8. </el-col>
  9. </el-row>
  10. <el-table :data="value" style="width: 100%" stripe border fit>
  11. <el-table-column align="center" prop="title" label="字段名">
  12. <template #default="{ row }">
  13. <el-input v-model="row.title"></el-input>
  14. </template>
  15. </el-table-column>
  16. <el-table-column align="center" label="字段类型">
  17. <template #default="{ row }">
  18. <el-select v-model="row.type" placeholder="请选择字段类型">
  19. <el-option v-for="(i, index) in columnType" :key="`type-${index}`" :label="i.label" :value="i.value"> </el-option>
  20. </el-select>
  21. </template>
  22. </el-table-column>
  23. <el-table-column align="center" prop="def" label="默认值">
  24. <template #default="{ row }">
  25. <el-input v-model="row.def"></el-input>
  26. </template>
  27. </el-table-column>
  28. <el-table-column align="center" label="是否为索引">
  29. <template #default="{ row }">
  30. <el-radio-group v-model="row.index">
  31. <el-radio v-for="(i, index) in required" :key="`index-${index}`" :label="i.value">{{ i.value ? '是' : '否' }} </el-radio>
  32. </el-radio-group>
  33. </template>
  34. </el-table-column>
  35. <el-table-column align="center" label="是否必填">
  36. <template #default="{ row }">
  37. <el-radio-group v-model="row.required">
  38. <el-radio v-for="(i, index) in required" :key="`req-${index}`" :label="i.value">{{ i.label }}</el-radio>
  39. </el-radio-group>
  40. </template>
  41. </el-table-column>
  42. <el-table-column align="center" label="描述">
  43. <template #default="{ row }">
  44. <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 2 }" v-model="row.remark"></el-input>
  45. </template>
  46. </el-table-column>
  47. <el-table-column align="center" label="操作">
  48. <template #default="{ $index }">
  49. <el-row justify="space-around">
  50. <el-col :span="8">
  51. <el-link :underline="false" size="mini" type="danger" @click="toDelete($index)">删除</el-link>
  52. </el-col>
  53. </el-row>
  54. </template>
  55. </el-table-column>
  56. </el-table>
  57. </div>
  58. </template>
  59. <script>
  60. import optionQuery from '@/api/options';
  61. const _ = require('lodash');
  62. import { defineComponent } from 'vue';
  63. export default defineComponent({
  64. name: 'column',
  65. components: {},
  66. props: {
  67. value: Array,
  68. },
  69. emits: ['update:value'],
  70. data() {
  71. return {
  72. columnType: [],
  73. required: [],
  74. };
  75. },
  76. setup(props, context) {
  77. return optionQuery();
  78. },
  79. created() {
  80. this.init();
  81. },
  82. methods: {
  83. toAdd() {
  84. let def = this.columnType.find((f) => f.default);
  85. let obj = { index: false, required: false };
  86. if (def) obj.type = def.value;
  87. else obj.type = _.get(_.head(this.columnType), 'value');
  88. this.$emit('update:value', [...this.value, obj]);
  89. },
  90. async init() {
  91. const arr = ['columnType', 'required'];
  92. const res = await this.query(arr);
  93. for (const i of arr) {
  94. this[i] = res[i];
  95. }
  96. },
  97. toDelete(index) {
  98. this.value.splice(index, 1);
  99. },
  100. },
  101. });
  102. </script>
  103. <style lang="less" scoped></style>