structure.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <template>
  2. <div>
  3. <el-table :data="structures" class="draggable">
  4. <el-table-column prop="field" :label="$t('generate.schema.structure.field_name.name')" />
  5. <el-table-column prop="type" :label="$t('generate.schema.structure.type.name')">
  6. <template #default="scope">
  7. <el-tag type="success">{{ scope.row.type }}</el-tag>
  8. </template>
  9. </el-table-column>
  10. <el-table-column prop="nullable" :label="$t('generate.schema.structure.nullable')" width="90px">
  11. <template #default="scope">
  12. <el-tag v-if="scope.row.nullable">{{ $t('system.yes') }}</el-tag>
  13. <el-tag v-else type="info">{{ $t('system.no') }}</el-tag>
  14. </template>
  15. </el-table-column>
  16. <el-table-column prop="default" :label="$t('generate.schema.structure.default')" />
  17. <!--<el-table-column prop="comment" label="注释" />-->
  18. <el-table-column prop="id" :label="$t('generate.schema.structure.operate')" width="120px">
  19. <template #default="scope">
  20. <el-button type="primary" :icon="Edit" @click="updateField(scope.row.id)" size="small" />
  21. <el-button type="danger" :icon="Delete" @click="deleteField(scope.row.id)" size="small" />
  22. </template>
  23. </el-table-column>
  24. </el-table>
  25. <div class="flex justify-end mt-4">
  26. <el-button type="success" :icon="Plus" @click="addField">{{ $t('system.add') }}</el-button>
  27. </div>
  28. <div class="w-full sm:w-96 justify-between mx-auto pl-24 mt-2">
  29. <el-button class="mt-5" @click="emits('prev')">{{ $t('system.prev') }}</el-button>
  30. <el-button class="mt-5" type="primary" @click="next">{{ $t('system.confirm') }}</el-button>
  31. </div>
  32. <Dialog v-model="visible" :title="$t('system.add')">
  33. <el-form :model="structure" status-icon label-width="120px" ref="form">
  34. <el-form-item
  35. :label="$t('generate.schema.structure.field_name.name')"
  36. prop="field"
  37. :rules="[
  38. {
  39. required: true,
  40. message: $t('generate.schema.structure.field_name.verify'),
  41. },
  42. ]"
  43. >
  44. <el-input v-model="structure.field" />
  45. </el-form-item>
  46. <div class="flex justify-between">
  47. <el-form-item
  48. class="w-full"
  49. :label="$t('generate.schema.structure.type.name')"
  50. prop="type"
  51. :rules="[
  52. {
  53. required: true,
  54. message: $t('generate.schema.structure.type.verify'),
  55. },
  56. ]"
  57. >
  58. <el-select v-model="structure.type" :placeholder="$t('generate.schema.structure.type.placeholder')" filterable class="w-full">
  59. <el-option v-for="item in types" :key="item" :label="item" :value="item" />
  60. </el-select>
  61. </el-form-item>
  62. </div>
  63. <el-form-item :label="$t('generate.schema.structure.length')" prop="length">
  64. <el-input-number v-model="structure.length" :min="0" />
  65. </el-form-item>
  66. <div class="flex justify-between">
  67. <el-form-item label="nullable" prop="nullable">
  68. <el-switch v-model="structure.nullable" inline-prompt :active-text="$t('system.yes')" :inactive-text="$t('system.no')" />
  69. </el-form-item>
  70. <el-form-item :label="$t('generate.schema.structure.default')" prop="default" v-if="!structure.nullable">
  71. <el-input v-model="structure.default" />
  72. </el-form-item>
  73. </div>
  74. <el-form-item :label="$t('generate.schema.structure.unique')" prop="unique">
  75. <el-switch v-model="structure.unique" inline-prompt :active-text="$t('system.yes')" :inactive-text="$t('system.no')" />
  76. </el-form-item>
  77. <el-form-item :label="$t('generate.schema.structure.comment')" prop="comment">
  78. <el-input v-model="structure.comment" text />
  79. </el-form-item>
  80. <div class="flex justify-end">
  81. <el-button type="primary" @click="submitStructure(form)">{{ $t('system.confirm') }}</el-button>
  82. </div>
  83. </el-form>
  84. </Dialog>
  85. </div>
  86. </template>
  87. <script lang="ts" setup>
  88. import {computed, onMounted, Ref, ref} from 'vue'
  89. import {Structure, useSchemaStore} from '../store'
  90. import {Delete, Edit, Plus} from '@element-plus/icons-vue'
  91. import type {FormInstance} from 'element-plus'
  92. import Message from '/admin/support/message'
  93. import http from '/admin/support/http'
  94. import {Code} from '/admin/enum/app'
  95. import Sortable from 'sortablejs'
  96. const schemaStore = useSchemaStore()
  97. const emits = defineEmits(['prev', 'next'])
  98. const visible = ref(false)
  99. const structures = computed(() => {
  100. return schemaStore.getStructures
  101. })
  102. const structure: Ref<Structure> = ref(schemaStore.initStructure())
  103. // structure
  104. const addField = async () => {
  105. await form.value?.clearValidate()
  106. visible.value = true
  107. }
  108. const updateField = (id: number) => {
  109. visible.value = true
  110. schemaStore.getStructures.forEach(s => {
  111. if (s.id === id) {
  112. structure.value = s
  113. }
  114. })
  115. }
  116. onMounted(() => {
  117. const tbody = document.querySelector('.draggable .el-table__body-wrapper tbody')
  118. const structures = schemaStore.getStructures
  119. Sortable.create(tbody, {
  120. draggable: 'tr',
  121. onEnd({ newIndex, oldIndex }) {
  122. const newStructures = []
  123. const s = structures.splice(oldIndex, newIndex - oldIndex)
  124. s.concat(structures).forEach(item => {
  125. newStructures.push(item)
  126. })
  127. schemaStore.setStructures(newStructures)
  128. // console.log(structure)
  129. // structures[newIndex] = structures[oldIndex]
  130. // structures[oldIndex] = temp
  131. },
  132. })
  133. })
  134. const form = ref<FormInstance>()
  135. const submitStructure = (formEl: FormInstance | undefined) => {
  136. if (!formEl) return
  137. formEl.validate(valid => {
  138. if (valid) {
  139. visible.value = !visible.value
  140. schemaStore.addStructure(structure.value)
  141. structure.value = schemaStore.initStructure()
  142. } else {
  143. return false
  144. }
  145. })
  146. }
  147. const deleteField = (id: number) => {
  148. schemaStore.filterStructures(id)
  149. }
  150. const next = () => {
  151. if (schemaStore.getStructures.length < 1) {
  152. Message.error('请先填写表结构数据')
  153. } else {
  154. http.post('schema', schemaStore.$state).then(r => {
  155. if (r.data.code == Code.SUCCESS) {
  156. Message.success('创建成功')
  157. schemaStore.finished()
  158. }
  159. })
  160. }
  161. }
  162. const types: string[] = [
  163. 'id',
  164. 'smallIncrements',
  165. 'mediumIncrements',
  166. 'increments',
  167. 'smallInteger',
  168. 'integer',
  169. 'bigIncrements',
  170. 'bigInteger',
  171. 'mediumInteger',
  172. 'unsignedInteger',
  173. 'unsignedMediumInteger',
  174. 'unsignedSmallInteger',
  175. 'unsignedTinyInteger',
  176. 'string',
  177. 'text',
  178. 'binary',
  179. 'boolean',
  180. 'char',
  181. 'dateTimeTz',
  182. 'dateTime',
  183. 'date',
  184. 'decimal',
  185. 'double',
  186. 'float',
  187. 'geometryCollection',
  188. 'geometry',
  189. 'ipAddress',
  190. 'json',
  191. 'jsonb',
  192. 'lineString',
  193. 'longText',
  194. 'macAddress',
  195. 'mediumText',
  196. 'multiLineString',
  197. 'multiPoint',
  198. 'multiPolygon',
  199. 'nullableMorphs',
  200. 'nullableTimestamps',
  201. 'nullableUuidMorphs',
  202. 'point',
  203. 'polygon',
  204. 'timeTz',
  205. 'time',
  206. 'timestampTz',
  207. 'timestamp',
  208. 'timestampsTz',
  209. 'timestamps',
  210. 'tinyIncrements',
  211. 'tinyInteger',
  212. 'tinyText',
  213. 'unsignedDecimal',
  214. 'uuid',
  215. 'year',
  216. ]
  217. </script>