detailModal.vue.vm 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <a-modal
  3. v-model:visible="pageDataObj.visible"
  4. :title="pageDataObj.title"
  5. width="60%"
  6. :footer="null"
  7. >
  8. <a-descriptions bordered :column="2">
  9. #foreach($column in $columns)
  10. #if($column.list)
  11. #set($javaField=$column.javaField)
  12. #set($parentheseIndex=$column.columnComment.indexOf("("))
  13. #if($parentheseIndex != -1)
  14. #set($comment=$column.columnComment.substring(0, $parentheseIndex))
  15. #else
  16. #set($comment=$column.columnComment)
  17. #end
  18. #if($column.htmlType == "datetime")
  19. <a-descriptions-item label="${comment}">
  20. {{ BearJiaUtil.formatTime(detailFormObj.data.${javaField}) }}
  21. </a-descriptions-item>
  22. #elseif($column.htmlType == "imageUpload")
  23. <a-descriptions-item label="${comment}" :span="2">
  24. <div v-if="detailFormObj.data.${javaField}">
  25. <a-image
  26. :width="100"
  27. :src="detailFormObj.data.${javaField}"
  28. :preview="{ src: detailFormObj.data.${javaField} }"
  29. />
  30. </div>
  31. <span v-else>-</span>
  32. </a-descriptions-item>
  33. #elseif($column.htmlType == "fileUpload")
  34. <a-descriptions-item label="${comment}" :span="2">
  35. <div v-if="detailFormObj.data.${javaField}">
  36. <a :href="detailFormObj.data.${javaField}" target="_blank">
  37. <BearJiaIcon icon="download-outlined" />
  38. 下载文件
  39. </a>
  40. </div>
  41. <span v-else>-</span>
  42. </a-descriptions-item>
  43. #elseif($column.htmlType == "editor")
  44. <a-descriptions-item label="${comment}" :span="2">
  45. <div class="editor-content" v-html="detailFormObj.data.${javaField}"></div>
  46. </a-descriptions-item>
  47. #elseif($column.htmlType == "textarea")
  48. <a-descriptions-item label="${comment}" :span="2">
  49. <div class="textarea-content">
  50. {{ detailFormObj.data.${javaField} || '-' }}
  51. </div>
  52. </a-descriptions-item>
  53. #elseif("" != $column.dictType)
  54. <a-descriptions-item label="${comment}">
  55. <dict-tag :options="${javaField}Options" :value="detailFormObj.data.${javaField}" />
  56. </a-descriptions-item>
  57. #else
  58. <a-descriptions-item label="${comment}">
  59. {{ detailFormObj.data.${javaField} || '-' }}
  60. </a-descriptions-item>
  61. #end
  62. #end
  63. #end
  64. </a-descriptions>
  65. </a-modal>
  66. </template>
  67. <script setup>
  68. import { getCurrentInstance, reactive } from 'vue';
  69. import { BearJiaIcon } from '@/utils/BearJiaIcon.js';
  70. import BearJiaUtil from '@/utils/BearJiaUtil.js';
  71. // 获取当前实例
  72. const { proxy } = getCurrentInstance();
  73. // 字典数据
  74. #if(${dicts} != '')
  75. const { ${dicts} } = proxy.useDict(${dicts});
  76. #end
  77. #foreach ($column in $columns)
  78. #if(${column.dictType} != '')
  79. const ${column.javaField}Options = ref(${column.javaField});
  80. #end
  81. #end
  82. // 页面数据对象
  83. const pageDataObj = reactive({
  84. visible: false,
  85. title: '${functionName}详情'
  86. });
  87. // 详情数据对象
  88. const detailFormObj = reactive({
  89. data: {
  90. #foreach ($column in $columns)
  91. #if($column.list)
  92. ${column.javaField}: '',
  93. #end
  94. #end
  95. }
  96. });
  97. // 打开弹窗
  98. const open = (record) => {
  99. pageDataObj.visible = true;
  100. Object.assign(detailFormObj.data, record);
  101. };
  102. // 暴露方法
  103. defineExpose({
  104. open
  105. });
  106. </script>
  107. <style lang="less" scoped>
  108. .editor-content {
  109. max-height: 300px;
  110. overflow-y: auto;
  111. padding: 8px;
  112. border: 1px solid #d9d9d9;
  113. border-radius: 4px;
  114. background: #fafafa;
  115. :deep(img) {
  116. max-width: 100%;
  117. height: auto;
  118. }
  119. :deep(video) {
  120. max-width: 100%;
  121. height: auto;
  122. }
  123. }
  124. .textarea-content {
  125. white-space: pre-wrap;
  126. word-break: break-all;
  127. max-height: 200px;
  128. overflow-y: auto;
  129. }
  130. </style>