CustomDialog.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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'])
  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. const submitGameChange = () => {
  44. dialogFormRef.value
  45. ?.submitFormData()
  46. .then((formData) => {
  47. emits('formSubmit', formData, dialogConfig.type)
  48. })
  49. .finally(() => {
  50. dialogConfig.dialogVisible = false
  51. })
  52. }
  53. // 表单关闭
  54. const closeDialog = () => {
  55. dialogClose(dialogFormRef.value, dialogConfig)
  56. }
  57. // 表单添加
  58. const addForm = () => {
  59. dialogConfigInfo.reqConfig.url = addUrl.value
  60. dialogConfig.type = 0
  61. dialogConfig.dialogVisible = true
  62. }
  63. // 表单修改
  64. const editForm = (row: any, updateURL?: string) => {
  65. dialogConfig.dialogVisible = true
  66. dialogConfig.type = 1
  67. if (updateURL) {
  68. updateUrl.value = updateURL
  69. dialogConfigInfo.reqConfig.url = updateUrl.value
  70. }
  71. nextTick(() => {
  72. dialogFormRef.value?.fillForm(row)
  73. })
  74. }
  75. /**
  76. * @description: 对字段进行加密
  77. * @param {*} fields 字段名
  78. * @param {*} useFormField 是否对表单的字段加密
  79. * @param {*} encryptMsg 加密的消息
  80. */
  81. const encrypt = (fields: string, useFormField: boolean, encryptMsg: Array<string>) => {
  82. dialogFormRef.value?.encryptData(fields, useFormField, encryptMsg).finally(() => {
  83. dialogConfig.dialogVisible = false
  84. })
  85. }
  86. onMounted(() => {
  87. dialogConfig.title = dialogConfigInfo.title
  88. addUrl.value = props.config.reqConfig.url // 保存一下新增的URL
  89. })
  90. defineExpose({
  91. addForm,
  92. editForm,
  93. encrypt
  94. })
  95. </script>
  96. <template>
  97. <div class="dialog">
  98. <el-dialog
  99. @close="closeDialog"
  100. v-model="dialogConfig.dialogVisible"
  101. :title="dialogConfig.title"
  102. :close-on-click-modal="false"
  103. style="width: 40%"
  104. append-to-body
  105. >
  106. <Form
  107. :disabled="true"
  108. ref="dialogFormRef"
  109. :config="{
  110. fieldsInfo: dialogConfigInfo.fieldsInfo,
  111. reqConfig: dialogConfigInfo.reqConfig,
  112. rules: dialogConfigInfo.rules
  113. }"
  114. ></Form>
  115. <template #footer>
  116. <div class="dialog-footer">
  117. <slot name="otherBtn"></slot>
  118. <slot name="btnGroup">
  119. <el-button class="dialogBtn" type="primary" @click="submitGameChange()">
  120. {{ configBtnText }}
  121. </el-button>
  122. <el-button class="dialogBtn" @click="closeDialog">取消</el-button>
  123. </slot>
  124. </div>
  125. </template>
  126. </el-dialog>
  127. </div>
  128. </template>
  129. <style scoped>
  130. .dialogBtn {
  131. box-sizing: border-box;
  132. margin-right: 10px;
  133. }
  134. </style>