edit.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <component
  3. is="a-modal"
  4. v-model:visible="visible"
  5. :width="tool.getDevice() === 'mobile' ? '100%' : '600px'"
  6. :title="title"
  7. :mask-closable="false"
  8. :ok-loading="loading"
  9. @cancel="close"
  10. @before-ok="submit">
  11. <!-- 表单信息 start -->
  12. <a-form ref="formRef" :model="formData" :rules="rules" :auto-label-width="true">
  13. <!-- <a-form-item field="parent_id" label="上级角色">
  14. <a-tree-select
  15. v-model="formData.parent_id"
  16. :data="roleData"
  17. :field-names="{ key: 'value', title: 'label' }"
  18. allow-clear
  19. placeholder="请选择上级角色">
  20. </a-tree-select>
  21. </a-form-item> -->
  22. <a-form-item label="角色名称" field="name">
  23. <a-input v-model="formData.name" placeholder="请输入角色名称" />
  24. </a-form-item>
  25. <a-form-item label="角色标识" field="code">
  26. <a-input v-model="formData.code" placeholder="请输入角色标识" />
  27. </a-form-item>
  28. <a-form-item label="排序数字" field="sort">
  29. <a-input-number v-model="formData.sort" placeholder="请输入排序数字" />
  30. </a-form-item>
  31. <a-form-item label="状态" field="status">
  32. <sa-radio v-model="formData.status" dict="data_status" placeholder="请选择状态" />
  33. </a-form-item>
  34. <a-form-item label="备注" field="remark">
  35. <a-textarea v-model="formData.remark" placeholder="请输入备注" />
  36. </a-form-item>
  37. </a-form>
  38. <!-- 表单信息 end -->
  39. </component>
  40. </template>
  41. <script setup>
  42. import { ref, reactive, computed } from 'vue'
  43. import { Message } from '@arco-design/web-vue'
  44. import commonApi from '@/api/common'
  45. import tool from '@/utils/tool'
  46. import api from '@/api/system/role'
  47. const emit = defineEmits(['success'])
  48. // 引用定义
  49. const formRef = ref()
  50. const mode = ref('')
  51. const visible = ref(false)
  52. const loading = ref(false)
  53. const roleData = ref([])
  54. let title = computed(() => {
  55. return '角色管理' + (mode.value == 'add' ? '-新增' : '-编辑')
  56. })
  57. // 表单初始值
  58. const initialFormData = {
  59. id: '',
  60. parent_id: 0,
  61. level: '',
  62. name: '',
  63. code: '',
  64. sort: 100,
  65. status: 1,
  66. remark: '',
  67. }
  68. // 表单信息
  69. const formData = reactive({ ...initialFormData })
  70. // 验证规则
  71. const rules = {
  72. // parent_id: [{ required: true, message: '上级角色不能为空' }],
  73. name: [{ required: true, message: '角色名称不能为空' }],
  74. code: [{ required: true, message: '角色标识不能为空' }],
  75. }
  76. // 打开弹框
  77. const open = async (type = 'add') => {
  78. mode.value = type
  79. // 重置表单数据
  80. Object.assign(formData, initialFormData)
  81. formRef.value.clearValidate()
  82. visible.value = true
  83. await initPage()
  84. }
  85. // 初始化页面数据
  86. const initPage = async () => {
  87. const resp = await commonApi.commonGet('/core/role/index?tree=true&filter=false')
  88. roleData.value = resp.data
  89. }
  90. // 设置数据
  91. const setFormData = async (data) => {
  92. for (const key in formData) {
  93. if (data[key] != null && data[key] != undefined) {
  94. formData[key] = data[key]
  95. }
  96. }
  97. }
  98. // 数据保存
  99. const submit = async (done) => {
  100. const validate = await formRef.value?.validate()
  101. if (!validate) {
  102. loading.value = true
  103. let data = { ...formData }
  104. let result = {}
  105. if (mode.value === 'add') {
  106. // 添加数据
  107. data.id = undefined
  108. result = await api.save(data)
  109. } else {
  110. // 修改数据
  111. result = await api.update(data.id, data)
  112. }
  113. if (result.code === 200) {
  114. Message.success('操作成功')
  115. emit('success')
  116. done(true)
  117. }
  118. // 防止连续点击提交
  119. setTimeout(() => {
  120. loading.value = false
  121. }, 500)
  122. }
  123. done(false)
  124. }
  125. // 关闭弹窗
  126. const close = () => (visible.value = false)
  127. defineExpose({ open, setFormData })
  128. </script>