Form.jsx 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import React, { useEffect, useMemo, useState } from 'react';
  2. import ProForm, {
  3. ProFormText,
  4. ProFormSelect,
  5. ProFormTextArea,
  6. ProFormSwitch,
  7. ProFormDigit,
  8. ProFormRadio,
  9. } from '@ant-design/pro-form';
  10. import UploadImage from '@/components/UploadImage';
  11. import UploadVideo from '@/components/UploadVideo';
  12. import WangEditor from '@/components/WangEditor';
  13. import request from '@/utils/request';
  14. import { notification, Form } from 'antd';
  15. export default (props) => {
  16. const [form] = Form.useForm();
  17. const [isVideo, setIsVideo] = useState(false);
  18. const typeDict = useMemo(() => {
  19. return (props.typeList || []).reduce((acc, item) => {
  20. return {
  21. ...acc,
  22. [item.typeId]: item.name,
  23. };
  24. }, {});
  25. }, [props.typeList]);
  26. const handleSubmit = (values) => {
  27. const data = {
  28. ...props.post || {},
  29. ...values,
  30. }
  31. if (!data.postId) {
  32. // 新增
  33. return request('/post', { method: 'post', data })
  34. .then((res) => {
  35. props.onChange(res);
  36. notification.success({ message: '操作成功' });
  37. })
  38. .catch((e) => {
  39. notification.error({ message: e.message });
  40. return Promise.reject(e.message);
  41. });
  42. }
  43. // 编辑
  44. return request(`/post/${data.postId}`, { method: 'put', data })
  45. .then((res) => {
  46. props.onChange(res);
  47. notification.success({ message: '操作成功' });
  48. })
  49. .catch((e) => {
  50. notification.error({ message: e.message });
  51. return Promise.reject(e.message);
  52. });
  53. };
  54. const handleValueChange = (changed) => {
  55. const key = Object.keys(changed)[0];
  56. if (key === 'isVideo') {
  57. setIsVideo(changed[key]);
  58. }
  59. };
  60. useEffect(() => {
  61. if (props.post && props.post.postId) {
  62. form.setFieldsValue(props.post);
  63. setIsVideo(props.post.isVideo);
  64. }
  65. }, [props.post, form]);
  66. return (
  67. <ProForm form={form} onFinish={handleSubmit} onValuesChange={handleValueChange}>
  68. <ProFormText
  69. label="标题"
  70. placeholder="请输入标题"
  71. name="name"
  72. rules={[{ required: true, message: '请填写标题' }]}
  73. />
  74. <ProFormText
  75. label="作者"
  76. placeholder="请输入作者"
  77. name="author"
  78. rules={[{ required: true, message: '请填写作者' }]}
  79. />
  80. <ProFormSelect
  81. label="类型"
  82. placeholder="请选择类型"
  83. name="typeId"
  84. valueEnum={typeDict}
  85. rules={[{ required: true, message: '请选择类型' }]}
  86. />
  87. <Form.Item name="poster" label="封面" placeholder="请设置封面">
  88. <UploadImage />
  89. </Form.Item>
  90. <ProFormTextArea label="简介" placeholder="请输入简介" name="summary" />
  91. <ProFormSwitch label="视频" name="isVideo" checkedChildren="视频" unCheckedChildren="图文" />
  92. {isVideo ? (
  93. <>
  94. <Form.Item name="videoPoster" label="视频封面" placeholder="请设置封面">
  95. <UploadImage />
  96. </Form.Item>
  97. <Form.Item name="videoUrl" label="视频地址" placeholder="请上传视频">
  98. <UploadVideo />
  99. </Form.Item>
  100. </>
  101. ) : (
  102. <Form.Item name="content" label="图文内容" placeholder="请填写图文内容">
  103. <WangEditor />
  104. </Form.Item>
  105. )}
  106. <ProFormDigit
  107. label="答题数"
  108. name="answerNum"
  109. help="0 代表不会要求答题, 数字 N 代表至少要求答 N 道题目"
  110. fieldProps={{
  111. min: 0,
  112. max: 20,
  113. }}
  114. precision={0}
  115. />
  116. <ProFormDigit
  117. label="积分"
  118. placeholder="请设置获取积分"
  119. name="points"
  120. help="答题成功, 赢取积分数"
  121. fieldProps={{
  122. min: 0,
  123. }}
  124. precision={0}
  125. />
  126. <ProFormSwitch label="热门" name="isTopic" checkedChildren="是" unCheckedChildren="否" />
  127. <ProFormRadio.Group
  128. label="状态"
  129. name="status"
  130. options={[
  131. {
  132. label: '未发布',
  133. value: 0,
  134. },
  135. {
  136. label: '已发布',
  137. value: 1,
  138. },
  139. ]}
  140. />
  141. <ProFormText label="创建日期" name="createDate" readonly />
  142. </ProForm>
  143. );
  144. };