RoleDrawer.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <ElDrawer ref="elDrawerRef" v-model="drawerVisible" :title="drawerProps.title" v-bind="$attrs" destroy-on-close>
  3. <template #header="scope">
  4. <slot name="header" v-bind="scope">
  5. <div style="display: flex">
  6. <slot name="title">
  7. <span style="flex: 1">{{ drawerProps.title }}</span>
  8. </slot>
  9. </div>
  10. </slot>
  11. </template>
  12. <el-form ref="ruleFormRef" label-width="100px" label-suffix=" :" :rules="rules" :model="drawerProps.row" @submit.enter.prevent="handleConfirm">
  13. <el-form-item label="参数名称" prop="name">
  14. <el-input v-model="drawerProps.row.name" placeholder="填写参数名称" clearable />
  15. </el-form-item>
  16. <el-form-item label="权限标识" prop="code">
  17. <el-input v-model="drawerProps.row.code" :disabled="drawerProps.row.roleId === '1'" placeholder="填写权限标识" clearable />
  18. </el-form-item>
  19. <el-form-item label="排序" prop="orderNum">
  20. <el-input-number v-model="drawerProps.row.orderNum" :precision="0" :min="1" :max="999999" />
  21. </el-form-item>
  22. <el-form-item label="状态" prop="status">
  23. <el-radio-group v-model="drawerProps.row.status">
  24. <el-radio-button :value="item.dictValue" v-for="(item, index) in commonStatus" :key="index" :label="item.dictLabel" />
  25. </el-radio-group>
  26. </el-form-item>
  27. <el-form-item label="备注" prop="remark">
  28. <el-input v-model="drawerProps.row.remark" placeholder="请填写备注" clearable />
  29. </el-form-item>
  30. </el-form>
  31. <template #footer>
  32. <slot name="footer">
  33. <ElButton @click="drawerVisible = false">取 消</ElButton>
  34. <ElButton type="primary" @click="handleConfirm()">确 定</ElButton>
  35. </slot>
  36. </template>
  37. </ElDrawer>
  38. </template>
  39. <script setup lang="ts" name="RoleForm">
  40. import { RoleBO } from '@/api/interface/system/role'
  41. import { ResultEnum } from '@/enums/HttpEnum'
  42. import { useDictOptions } from '@/hooks'
  43. const commonStatus = useDictOptions('COMMON_STATUS')
  44. import { FormInstance } from 'element-plus'
  45. const rules = reactive({
  46. name: [{ required: true, message: '请填写角色名称' }],
  47. code: [{ required: true, message: '请填权限标识' }],
  48. orderNum: [{ required: true, message: '排序不能为空' }],
  49. status: [{ required: true, message: '状态不能为空' }]
  50. })
  51. interface EcoDrawerProps {
  52. api?: (params: any) => Promise<any> // 调用接口
  53. title: string // 顶部标题
  54. isView: boolean
  55. row: Partial<RoleBO>
  56. getTableList?: () => void
  57. }
  58. const drawerVisible = ref(false)
  59. const drawerProps = ref<EcoDrawerProps>({
  60. isView: false,
  61. title: '',
  62. row: {}
  63. })
  64. // emit
  65. const emit = defineEmits(['submit'])
  66. // 接收父组件传过来的参数
  67. const acceptParams = (params: EcoDrawerProps) => {
  68. drawerProps.value = params
  69. drawerVisible.value = true
  70. drawerProps.value.row.status = drawerProps.value.row.status || '1'
  71. }
  72. // 提交数据(新增/编辑)
  73. const ruleFormRef = ref<FormInstance>()
  74. const handleConfirm = () => {
  75. ruleFormRef.value!.validate(async valid => {
  76. if (!valid) return
  77. try {
  78. const { code } = await drawerProps.value.api!(drawerProps.value.row)
  79. if (code == ResultEnum.SUCCESS) {
  80. ElMessage.success({ message: `${drawerProps.value.title}成功!` })
  81. drawerProps.value.getTableList!()
  82. emit('submit')
  83. drawerVisible.value = false
  84. }
  85. } catch (error) {
  86. console.log(error)
  87. }
  88. })
  89. }
  90. defineExpose({
  91. acceptParams
  92. })
  93. </script>
  94. <style scoped lang="scss"></style>