Upload4.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <Alert message="嵌入表单,自定义预览内容" />
  3. <BasicForm @register="registerPreview" class="my-5" />
  4. </template>
  5. <script setup lang="ts">
  6. import { createVNode } from 'vue';
  7. import { Alert, Button } from 'ant-design-vue';
  8. import { BasicForm, FormSchema, useForm } from '@/components/Form';
  9. import { useMessage } from '@/hooks/web/useMessage';
  10. import { uploadApi } from '@/api/sys/upload';
  11. const { createMessage } = useMessage();
  12. const schemasPreview: FormSchema[] = [
  13. {
  14. field: 'field5',
  15. component: 'Upload',
  16. label: '字段5',
  17. componentProps: {
  18. previewColumns: [
  19. {
  20. title: 'url5',
  21. dataIndex: 'url5',
  22. },
  23. {
  24. title: 'type5',
  25. dataIndex: 'type5',
  26. },
  27. {
  28. title: 'name5',
  29. dataIndex: 'name5',
  30. },
  31. {
  32. title: 'operation',
  33. dataIndex: '',
  34. customRender: ({ record }) => {
  35. return createVNode(
  36. Button,
  37. {
  38. onclick: () => {
  39. console.log(record);
  40. createMessage.success(`请到控制台查看该行输出结果`);
  41. },
  42. },
  43. () => '点我输出该行信息',
  44. );
  45. },
  46. },
  47. ],
  48. beforePreviewData: (arg) => {
  49. let data = arg
  50. .filter((item) => !!item)
  51. .map((item) => {
  52. if (typeof item !== 'string') {
  53. console.error('return value should be string');
  54. return;
  55. }
  56. return {
  57. url5: item,
  58. type5: item.split('.').pop() || '',
  59. name5: item.split('/').pop() || '',
  60. };
  61. });
  62. return data;
  63. },
  64. resultField: 'data5.url',
  65. api: (file, progress) => {
  66. return new Promise((resolve) => {
  67. uploadApi(file, progress).then((uploadApiResponse) => {
  68. resolve({
  69. code: 200,
  70. data5: {
  71. url: uploadApiResponse.data.url,
  72. },
  73. });
  74. });
  75. });
  76. },
  77. },
  78. },
  79. {
  80. field: 'field6',
  81. component: 'Upload',
  82. label: '字段6',
  83. componentProps: {
  84. maxNumber: 2,
  85. previewColumns: ({ handleRemove, handleAdd }) => {
  86. return [
  87. {
  88. title: 'url6',
  89. dataIndex: 'url6',
  90. },
  91. {
  92. title: 'type6',
  93. dataIndex: 'type6',
  94. },
  95. {
  96. title: '操作1',
  97. dataIndex: 'operation',
  98. customRender: ({ record }) => {
  99. return createVNode('div', {}, [
  100. createVNode(
  101. Button,
  102. {
  103. type: 'primary',
  104. style: 'margin:4px',
  105. onclick: () => {
  106. handleAdd({
  107. record: {
  108. id6: new Date().getTime(),
  109. url6: 'https://vebn.oss-cn-beijing.aliyuncs.com/vben/logo.png',
  110. },
  111. uidKey: 'id6',
  112. valueKey: 'url6',
  113. });
  114. },
  115. },
  116. () => '点我新增',
  117. ),
  118. createVNode(
  119. Button,
  120. {
  121. danger: true,
  122. onclick: () => {
  123. handleRemove({
  124. record: { url6: record.url6 },
  125. uidKey: 'url6',
  126. valueKey: 'url6',
  127. });
  128. },
  129. },
  130. () => '点我删除',
  131. ),
  132. ]);
  133. },
  134. },
  135. ];
  136. },
  137. beforePreviewData: (arg) => {
  138. let data = arg
  139. .filter((item) => !!item)
  140. .map((item) => {
  141. if (typeof item !== 'object') {
  142. console.error('return value should be object');
  143. return;
  144. }
  145. return {
  146. uid: item?.uid,
  147. url6: item?.url,
  148. type6: item?.url?.split('.').pop() || '',
  149. name6: item?.url?.split('/').pop() || '',
  150. };
  151. });
  152. return data;
  153. },
  154. resultField: 'data6.url',
  155. api: (file, progress) => {
  156. return new Promise((resolve) => {
  157. uploadApi(file, progress).then((uploadApiResponse) => {
  158. resolve({
  159. code: 200,
  160. data6: {
  161. url: uploadApiResponse.data.url,
  162. },
  163. });
  164. });
  165. });
  166. },
  167. },
  168. },
  169. ];
  170. const [registerPreview, { getFieldsValue: getFieldsValuePreview }] = useForm({
  171. labelWidth: 160,
  172. schemas: schemasPreview,
  173. actionColOptions: {
  174. span: 18,
  175. },
  176. submitFunc: () => {
  177. return new Promise((resolve) => {
  178. console.log(getFieldsValuePreview());
  179. resolve();
  180. createMessage.success(`请到控制台查看结果`);
  181. });
  182. },
  183. });
  184. </script>