RoleForm.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="modelVisible" width="800">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="80px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="角色名称" prop="name">
  11. <el-input v-model="formData.name" placeholder="请输入角色名称" />
  12. </el-form-item>
  13. <el-form-item label="角色类型" prop="type">
  14. <el-input :model-value="formData.type" placeholder="请输入角色类型" height="150px" />
  15. </el-form-item>
  16. <el-form-item label="角色标识" prop="code">
  17. <el-input :model-value="formData.code" placeholder="请输入角色标识" height="150px" />
  18. </el-form-item>
  19. <el-form-item label="显示顺序" prop="sort">
  20. <el-input :model-value="formData.sort" placeholder="请输入显示顺序" height="150px" />
  21. </el-form-item>
  22. <el-form-item label="状态" prop="status">
  23. <el-select v-model="formData.status" placeholder="请选择状态" clearable>
  24. <el-option
  25. v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
  26. :key="parseInt(dict.value)"
  27. :label="dict.label"
  28. :value="parseInt(dict.value)"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item label="备注" prop="remark">
  33. <el-input v-model="formData.remark" type="textarea" placeholder="请输备注" />
  34. </el-form-item>
  35. </el-form>
  36. <template #footer>
  37. <div class="dialog-footer">
  38. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  39. <el-button @click="modelVisible = false">取 消</el-button>
  40. </div>
  41. </template>
  42. </Dialog>
  43. </template>
  44. <script setup lang="ts">
  45. import { getDictOptions } from '@/utils/dict'
  46. import { CommonStatusEnum } from '@/utils/constants'
  47. import type { FormExpose } from '@/components/Form'
  48. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  49. import * as RoleApi from '@/api/system/role'
  50. // ========== CRUD 相关 ==========
  51. const dialogTitle = ref('edit') // 弹出层标题
  52. const formRef = ref<FormExpose>() // 表单 Ref
  53. const { t } = useI18n() // 国际化
  54. const dataScopeDictDatas = ref()
  55. const message = useMessage() // 消息弹窗
  56. const modelVisible = ref(false) // 弹窗的是否展示
  57. const modelTitle = ref('') // 弹窗的标题
  58. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  59. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  60. const formData = ref({
  61. id: undefined,
  62. name: '',
  63. type: '',
  64. code: '',
  65. sort: undefined,
  66. status: CommonStatusEnum.ENABLE,
  67. remark: ''
  68. })
  69. const formRules = reactive({
  70. name: [{ required: true, message: '岗位标题不能为空', trigger: 'blur' }],
  71. code: [{ required: true, message: '岗位编码不能为空', trigger: 'change' }],
  72. sort: [{ required: true, message: '岗位顺序不能为空', trigger: 'change' }],
  73. status: [{ required: true, message: '岗位状态不能为空', trigger: 'change' }],
  74. remark: [{ required: false, message: '岗位内容不能为空', trigger: 'blur' }]
  75. })
  76. /** 打开弹窗 */
  77. const openModal = async (type: string, id?: number) => {
  78. modelVisible.value = true
  79. modelTitle.value = t('action.' + type)
  80. formType.value = type
  81. resetForm()
  82. // 修改时,设置数据
  83. if (id) {
  84. formLoading.value = true
  85. try {
  86. formData.value = await RoleApi.getRole(id)
  87. } finally {
  88. formLoading.value = false
  89. }
  90. }
  91. }
  92. /** 重置表单 */
  93. const resetForm = () => {
  94. formData.value = {
  95. id: undefined,
  96. name: '',
  97. code: '',
  98. sort: undefined,
  99. status: CommonStatusEnum.ENABLE,
  100. remark: ''
  101. }
  102. formRef.value?.resetFields()
  103. }
  104. defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
  105. /** 提交表单 */
  106. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  107. const submitForm = async () => {
  108. // 校验表单
  109. if (!formRef) return
  110. const valid = await formRef.value.validate()
  111. if (!valid) return
  112. // 提交请求
  113. formLoading.value = true
  114. try {
  115. const data = formData.value as unknown as RoleApi.RoleVO
  116. if (formType.value === 'create') {
  117. await RoleApi.createRole(data)
  118. message.success(t('common.createSuccess'))
  119. } else {
  120. await RoleApi.updateRole(data)
  121. message.success(t('common.updateSuccess'))
  122. }
  123. modelVisible.value = false
  124. // 发送操作成功的事件
  125. emit('success')
  126. } finally {
  127. formLoading.value = false
  128. }
  129. }
  130. const init = () => {
  131. dataScopeDictDatas.value = getIntDictOptions(DICT_TYPE.SYSTEM_DATA_SCOPE)
  132. }
  133. // ========== 初始化 ==========
  134. onMounted(() => {
  135. init()
  136. })
  137. </script>
  138. <style scoped>
  139. .card {
  140. width: 100%;
  141. max-height: 400px;
  142. overflow-y: scroll;
  143. }
  144. </style>