ModelObject.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <route lang="yaml">
  2. meta:
  3. enabled: false
  4. </route>
  5. <script lang="ts" setup name="ModelObject">
  6. import type { FormInstance, FormRules } from 'element-plus'
  7. import { ElMessage } from 'element-plus'
  8. import { createObject, getObjectById, updateObject } from '@/api/model/modelObjectApi'
  9. const emit = defineEmits(['success'])
  10. const state = reactive({
  11. title: '',
  12. dialogVisible: false,
  13. loading: false,
  14. formData: {
  15. modelId: 0,
  16. objectId: 0,
  17. objectCode: '',
  18. objectTitle: '',
  19. comment: '',
  20. },
  21. actionType: 1,
  22. })
  23. const formRef = ref<FormInstance>()
  24. const formRules = ref<FormRules>({
  25. objectTitle: [
  26. { required: true, message: '请输入标题', trigger: 'blur' },
  27. ],
  28. objectCode: [
  29. { required: true, message: '请输入标题', trigger: 'blur' },
  30. ],
  31. comment: [
  32. { required: false, message: '请输入描述', trigger: 'blur' },
  33. ],
  34. })
  35. // 查询数据
  36. const getData = async (modelId: number, objectId: number) => {
  37. state.loading = true
  38. const { data } = await getObjectById(modelId, objectId)
  39. state.loading = false
  40. state.formData = data
  41. }
  42. onMounted(() => {
  43. nextTick(() => {
  44. })
  45. })
  46. // 保存
  47. function onSubmit() {
  48. formRef.value && formRef.value.validate(async (valid) => {
  49. if (valid) {
  50. if (state.actionType === 1) {
  51. await createObject(state.formData)
  52. state.dialogVisible = false
  53. ElMessage.success('新增成功')
  54. emit('success')
  55. }
  56. else {
  57. await updateObject(state.formData)
  58. state.dialogVisible = false
  59. ElMessage.success('修改成功')
  60. emit('success')
  61. }
  62. }
  63. })
  64. }
  65. function onCancel() {
  66. state.dialogVisible = false
  67. }
  68. function resetFormData() {
  69. state.formData = {
  70. modelId: 0,
  71. objectId: 0,
  72. objectCode: '',
  73. objectTitle: '',
  74. comment: '',
  75. }
  76. }
  77. defineExpose({
  78. showAddModel(modelId: number) {
  79. resetFormData()
  80. state.title = '新增对象'
  81. state.actionType = 1
  82. state.dialogVisible = true
  83. state.formData.modelId = modelId
  84. },
  85. showEditModel(modelId: number, objectId: number) {
  86. resetFormData()
  87. state.title = '编辑对象'
  88. state.actionType = 2
  89. state.dialogVisible = true
  90. getData(modelId, objectId)
  91. },
  92. })
  93. </script>
  94. <template>
  95. <el-drawer v-model="state.dialogVisible" :title="state.title" size="30%" direction="rtl">
  96. <el-scrollbar>
  97. <div class="form-content">
  98. <el-form ref="formRef" :model="state.formData" :rules="formRules" label-position="top">
  99. <el-form-item label="对象名称" prop="objectTitle">
  100. <el-input v-model="state.formData.objectTitle" placeholder="请输入标题" />
  101. </el-form-item>
  102. <el-form-item label="对象代码" prop="objectCode">
  103. <el-input v-model="state.formData.objectCode" placeholder="请输入代码" />
  104. </el-form-item>
  105. <el-form-item label="简要说明" prop="comment">
  106. <el-input v-model="state.formData.comment" type="textarea" rows="10" placeholder="请输入标题" />
  107. </el-form-item>
  108. </el-form>
  109. </div>
  110. </el-scrollbar>
  111. <template #footer>
  112. <div style="flex: auto">
  113. <el-button type="primary" size="large" @click="onSubmit">
  114. 提交
  115. </el-button>
  116. <el-button size="large" @click="onCancel">
  117. 取消
  118. </el-button>
  119. </div>
  120. </template>
  121. </el-drawer>
  122. </template>
  123. <style lang="scss" scoped>
  124. .form-right-side {
  125. padding: var(--container-padding);
  126. border-left: 1px dashed var(--el-disabled-border-color);
  127. background-color: var(--g-app-bg);
  128. transition: background-color 0.3s;
  129. :deep(.el-table) {
  130. height: 100%;
  131. margin-top: 15px;
  132. .el-table__row {
  133. .index {
  134. display: inline-block;
  135. }
  136. .delete {
  137. display: none;
  138. }
  139. &:hover {
  140. .index {
  141. display: none;
  142. }
  143. .delete {
  144. display: inline-block;
  145. }
  146. }
  147. .el-tag.sortable,
  148. .el-tag.sortable .el-icon {
  149. cursor: s-resize;
  150. }
  151. }
  152. }
  153. }
  154. </style>