CustomDialog.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <!--
  2. * @Author: fxs bjnsfxs@163.com
  3. * @Date: 2024-09-04 11:21:05
  4. * @LastEditors: fxs bjnsfxs@163.com
  5. * @LastEditTime: 2024-12-07
  6. * @FilePath: \Game-Backstage-Management-System\src\components\common\CustomDialog.vue
  7. * @Description:
  8. *
  9. -->
  10. <script setup lang="ts">
  11. import type { DialogConfig } from '@/types/dialog'
  12. import { useDialog } from '@/hooks/useDialog'
  13. import { nextTick, onMounted, reactive, ref } from 'vue'
  14. import Form from '../form/CustomForm.vue'
  15. interface DialogProps {
  16. config: DialogConfig
  17. configBtnText?: string
  18. }
  19. // 临时用的close
  20. const { dialogClose } = useDialog()
  21. const emits = defineEmits(['formSubmit', 'customSubmit'])
  22. // 新增的URL与更新URL,因为有时候更新和新增在一起,有时候是分开的,所以在这里去区分
  23. const addUrl = ref<string>('')
  24. const updateUrl = ref<string>('')
  25. // 对话框ref
  26. const dialogFormRef = ref<InstanceType<typeof Form>>()
  27. // props
  28. const props = withDefaults(defineProps<DialogProps>(), {
  29. configBtnText: '确定'
  30. })
  31. // props中的关于配置的信息
  32. const dialogConfigInfo = props.config
  33. // 游戏配置对话框设置
  34. const dialogConfig = reactive({
  35. dialogVisible: false,
  36. title: '',
  37. formLabelWidth: '150px',
  38. type: 0 // 0 是新增 1是修改
  39. })
  40. /**
  41. * 表单提交
  42. * 根据传入的配置决定是由用户自定义提交过程,还是由组件内部进行提交
  43. */
  44. const submitForm = () => {
  45. // if (props.config.customSubmit) {
  46. // emits('customSubmit', dialogFormRef.value?.getFormData(), dialogConfig.type)
  47. // return
  48. // }
  49. dialogFormRef.value
  50. ?.submitFormData()
  51. .then((formData) => {
  52. emits('formSubmit', formData, dialogConfig.type)
  53. })
  54. .finally(() => {
  55. dialogConfig.dialogVisible = false
  56. })
  57. }
  58. //
  59. const handleSubmit = () => {
  60. // 待定,并没有使用
  61. if (props.config.customSubmit) {
  62. emits('customSubmit', dialogFormRef.value?.getFormData(), dialogConfig.type)
  63. return
  64. }
  65. submitForm()
  66. }
  67. // 表单关闭
  68. const closeDialog = () => {
  69. dialogClose(dialogFormRef.value, dialogConfig)
  70. }
  71. // 表单添加
  72. const addForm = () => {
  73. dialogConfigInfo.reqConfig.url = addUrl.value
  74. dialogConfig.type = 0
  75. dialogConfig.dialogVisible = true
  76. }
  77. // 表单修改
  78. const editForm = (row: any, updateURL?: string) => {
  79. dialogConfig.dialogVisible = true
  80. dialogConfig.type = 1
  81. if (updateURL) {
  82. updateUrl.value = updateURL
  83. dialogConfigInfo.reqConfig.url = updateUrl.value
  84. }
  85. nextTick(() => {
  86. dialogFormRef.value?.fillForm(row)
  87. })
  88. }
  89. /**
  90. * @description: 对字段进行加密
  91. * @param {*} fields 字段名
  92. * @param {*} useFormField 是否对表单的字段加密
  93. * @param {*} encryptMsg 加密的消息
  94. */
  95. const encrypt = (fields: string, useFormField: boolean, encryptMsg: Array<string>) => {
  96. dialogFormRef.value?.encryptData(fields, useFormField, encryptMsg).finally(() => {
  97. dialogConfig.dialogVisible = false
  98. })
  99. }
  100. /**
  101. * @description: 获取表单数据
  102. */
  103. const getFormData = () => {
  104. return dialogFormRef.value?.getFormData()
  105. }
  106. onMounted(() => {
  107. dialogConfig.title = dialogConfigInfo.title
  108. addUrl.value = props.config.reqConfig.url // 保存一下新增的URL
  109. })
  110. defineExpose({
  111. getFormData,
  112. addForm,
  113. editForm,
  114. encrypt
  115. })
  116. </script>
  117. <template>
  118. <div class="dialog">
  119. <el-dialog
  120. @close="closeDialog"
  121. v-model="dialogConfig.dialogVisible"
  122. :title="dialogConfig.title"
  123. :close-on-click-modal="false"
  124. style="width: 40%"
  125. append-to-body
  126. >
  127. <Form
  128. :disabled="true"
  129. ref="dialogFormRef"
  130. :config="{
  131. fieldsInfo: dialogConfigInfo.fieldsInfo,
  132. reqConfig: dialogConfigInfo.reqConfig,
  133. rules: dialogConfigInfo.rules
  134. }"
  135. ></Form>
  136. <template #footer>
  137. <div class="dialog-footer">
  138. <slot name="otherBtn"></slot>
  139. <slot name="btnGroup">
  140. <el-button class="dialogBtn" type="primary" @click="handleSubmit()">
  141. {{ configBtnText }}
  142. </el-button>
  143. <el-button class="dialogBtn" @click="closeDialog">取消</el-button>
  144. </slot>
  145. </div>
  146. </template>
  147. </el-dialog>
  148. </div>
  149. </template>
  150. <style scoped>
  151. .dialogBtn {
  152. box-sizing: border-box;
  153. margin-right: 10px;
  154. }
  155. </style>