column.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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" prop="zh" label="字段中文">
  17. <template #default="{ row }">
  18. <el-input v-model="row.zh"></el-input>
  19. </template>
  20. </el-table-column>
  21. <el-table-column align="center" label="字段类型">
  22. <template #default="{ row }">
  23. <el-select v-model="row.type" placeholder="请选择字段类型">
  24. <el-option v-for="(i, index) in columnType" :key="`type-${index}`" :label="i.label" :value="i.value"> </el-option>
  25. </el-select>
  26. </template>
  27. </el-table-column>
  28. <el-table-column align="center" prop="def" label="默认值">
  29. <template #default="{ row }">
  30. <el-input v-model="row.def"></el-input>
  31. </template>
  32. </el-table-column>
  33. <el-table-column align="center" label="是否为索引">
  34. <template #default="{ row }">
  35. <el-radio-group v-model="row.index">
  36. <el-radio v-for="(i, index) in required" :key="`index-${index}`" :label="i.value">{{ i.value ? '是' : '否' }} </el-radio>
  37. </el-radio-group>
  38. </template>
  39. </el-table-column>
  40. <el-table-column align="center" label="是否必填">
  41. <template #default="{ row }">
  42. <el-radio-group v-model="row.required">
  43. <el-radio v-for="(i, index) in required" :key="`req-${index}`" :label="i.value">{{ i.label }}</el-radio>
  44. </el-radio-group>
  45. </template>
  46. </el-table-column>
  47. <el-table-column align="center" prop="ref" label="关联表">
  48. <template #default="{ row }">
  49. <el-input v-model="row.ref"></el-input>
  50. </template>
  51. </el-table-column>
  52. <el-table-column align="center" prop="getProp" label="关联显示字段(使用分号(;)分隔)">
  53. <template #default="{ row }">
  54. <el-input v-model="row.getProp"></el-input>
  55. </template>
  56. </el-table-column>
  57. <el-table-column align="center" label="描述">
  58. <template #default="{ row }">
  59. <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 2 }" v-model="row.remark"></el-input>
  60. </template>
  61. </el-table-column>
  62. <el-table-column align="center" label="操作">
  63. <template #default="{ $index }">
  64. <el-row justify="space-around">
  65. <el-col :span="8">
  66. <el-link :underline="false" size="mini" type="danger" @click="toDelete($index)">删除</el-link>
  67. </el-col>
  68. <el-col :span="8" v-if="$index > 0">
  69. <el-link :underline="false" size="mini" type="primary" @click="toMove('up', $index)"> 向上</el-link>
  70. </el-col>
  71. <el-col :span="8" v-if="$index < value.length - 1">
  72. <el-link :underline="false" size="mini" type="primary" @click="toMove('down', $index)"> 向下</el-link>
  73. </el-col>
  74. </el-row>
  75. </template>
  76. </el-table-column>
  77. </el-table>
  78. </div>
  79. </template>
  80. <script>
  81. import optionQuery from '@/api/options';
  82. const _ = require('lodash');
  83. import { defineComponent } from 'vue';
  84. export default defineComponent({
  85. name: 'column',
  86. props: {
  87. value: Array,
  88. },
  89. emits: ['update:value'],
  90. data() {
  91. return {
  92. columnType: [],
  93. required: [],
  94. };
  95. },
  96. setup(props, context) {
  97. return optionQuery();
  98. },
  99. created() {
  100. this.init();
  101. },
  102. methods: {
  103. toAdd() {
  104. let def = this.columnType.find((f) => f.default);
  105. let obj = { index: false, required: false };
  106. if (def) obj.type = def.value;
  107. else obj.type = _.get(_.head(this.columnType), 'value');
  108. this.$emit('update:value', [...this.value, obj]);
  109. },
  110. async init() {
  111. const arr = ['columnType', 'required'];
  112. const res = await this.query(arr);
  113. for (const i of arr) {
  114. this[i] = res[i];
  115. }
  116. },
  117. toDelete(index) {
  118. this.value.splice(index, 1);
  119. },
  120. toMove(type, index) {
  121. const list = _.cloneDeep(this.value);
  122. const source = _.cloneDeep(this.value[index]);
  123. const targetIndex = type === 'up' ? index - 1 : index + 1;
  124. const target = _.cloneDeep(this.value[targetIndex]);
  125. list.splice(targetIndex, 1, source);
  126. list.splice(index, 1, target);
  127. this.$emit('update:value', list);
  128. },
  129. },
  130. });
  131. </script>
  132. <style lang="less" scoped></style>