index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import React, { useCallback, useEffect, useRef, useState } from "react";
  2. import styles from "./index.module.scss";
  3. import { Z0tableType } from "@/types";
  4. import { Button, DatePicker, Form, FormInstance, Input, Select } from "antd";
  5. import ZupOne from "@/components/ZupOne";
  6. import dayjs from "dayjs";
  7. import { A4_APIgetInfo, A4_APIsave } from "@/store/action/A4goods";
  8. import { MessageFu } from "@/utils/message";
  9. import MyPopconfirm from "@/components/MyPopconfirm";
  10. import TextArea from "antd/es/input/TextArea";
  11. import ZupTypes from "@/components/ZupTypes";
  12. type Props = {
  13. editId: number;
  14. goodsList: Z0tableType[];
  15. addTableFu: () => void;
  16. editTableFu: () => void;
  17. closeFu: () => void;
  18. };
  19. function A4edit({
  20. editId,
  21. goodsList,
  22. addTableFu,
  23. editTableFu,
  24. closeFu,
  25. }: Props) {
  26. const [dirCode, setDirCode] = useState("");
  27. // 表单的ref
  28. const FormBoxRef = useRef<FormInstance>(null);
  29. // 封面图的ref
  30. const ZupThumbRef = useRef<any>(null);
  31. // 文件 类型的ref
  32. const ZupFilesRef = useRef<any>(null);
  33. const getInfoFu = useCallback(async (id: number) => {
  34. const res = await A4_APIgetInfo(id);
  35. if (res.code === 0) {
  36. const data = res.data;
  37. const entity = data.entity;
  38. const file = data.file;
  39. setDirCode(entity.dirCode);
  40. FormBoxRef.current?.setFieldsValue({
  41. ...entity,
  42. myTime: dayjs(entity.publishDate),
  43. });
  44. // 设置封面图
  45. ZupThumbRef.current?.setFileComFileFu({
  46. fileName: "",
  47. filePath: entity.thumb,
  48. });
  49. // 设置文件类型
  50. const sonInfo = {
  51. type: entity.fileTypes,
  52. fileList: file,
  53. };
  54. ZupFilesRef.current?.setFileComFileFu(sonInfo);
  55. }
  56. }, []);
  57. useEffect(() => {
  58. if (editId > 0) {
  59. getInfoFu(editId);
  60. } else {
  61. setDirCode(Date.now() + "");
  62. FormBoxRef.current?.setFieldsValue({
  63. myTime: dayjs(Date.now()),
  64. });
  65. }
  66. }, [editId, getInfoFu]);
  67. // 附件 是否 已经点击过确定
  68. const [fileCheck, setFileCheck] = useState(false);
  69. // 没有通过校验
  70. const onFinishFailed = useCallback(() => {
  71. setFileCheck(true);
  72. }, []);
  73. // 通过校验点击确定
  74. const onFinish = useCallback(
  75. async (values: any) => {
  76. setFileCheck(true);
  77. const coverUrl1 = ZupThumbRef.current?.fileComFileResFu();
  78. // 没有传 封面图
  79. if (!coverUrl1.filePath) return;
  80. // 附件组件的 type 数组 和 附件id数组
  81. const { sonType, sonFileIds, sonIsOk } =
  82. ZupFilesRef.current?.fileComFileResFu();
  83. if (sonIsOk) return;
  84. // 发布日期
  85. const publishDate = dayjs(values.myTime).format("YYYY-MM-DD");
  86. const obj = {
  87. ...values,
  88. id: editId > 0 ? editId : null,
  89. publishDate,
  90. thumb: coverUrl1.filePath,
  91. fileTypes: sonType ? sonType.join(",") : null,
  92. fileIds: sonFileIds ? sonFileIds.join(",") : null,
  93. };
  94. const res = await A4_APIsave(obj);
  95. if (res.code === 0) {
  96. MessageFu.success(editId > 0 ? "编辑成功!" : "新增成功!");
  97. editId > 0 ? editTableFu() : addTableFu();
  98. closeFu();
  99. }
  100. },
  101. [addTableFu, closeFu, editId, editTableFu]
  102. );
  103. return (
  104. <div className={styles.A4edit}>
  105. <div className="A4eMain">
  106. <Form
  107. ref={FormBoxRef}
  108. name="basic"
  109. labelCol={{ span: 3 }}
  110. onFinish={onFinish}
  111. onFinishFailed={onFinishFailed}
  112. autoComplete="off"
  113. scrollToFirstError
  114. >
  115. <Form.Item
  116. label="标题"
  117. name="name"
  118. rules={[{ required: true, message: "请输入标题!" }]}
  119. getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  120. >
  121. <Input maxLength={30} showCount placeholder="请输入内容" />
  122. </Form.Item>
  123. <Form.Item
  124. label="所属栏目"
  125. name="dictId"
  126. rules={[{ required: true, message: "请选择所属栏目!" }]}
  127. >
  128. <Select
  129. placeholder="请选择"
  130. style={{ width: 200 }}
  131. options={goodsList.map((v) => ({ value: v.id, label: v.name }))}
  132. />
  133. </Form.Item>
  134. <Form.Item
  135. label="发布日期"
  136. name="myTime"
  137. rules={[{ required: true, message: "请选择发布日期!" }]}
  138. >
  139. <DatePicker />
  140. </Form.Item>
  141. {/* 封面 */}
  142. <div className="formRow">
  143. <div className="formLeft">
  144. <span>* </span>
  145. 封面图:
  146. </div>
  147. <div className="formRight">
  148. <ZupOne
  149. ref={ZupThumbRef}
  150. isLook={false}
  151. fileCheck={fileCheck}
  152. size={5}
  153. dirCode={dirCode}
  154. myUrl="cms/goods/upload"
  155. format={["image/jpeg", "image/png"]}
  156. formatTxt="png、jpg和jpeg"
  157. checkTxt="请上传封面图!"
  158. upTxt="最多1张"
  159. myType="thumb"
  160. />
  161. </div>
  162. </div>
  163. <Form.Item
  164. label="模型链接"
  165. name="modelLink"
  166. getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  167. >
  168. <TextArea
  169. className="A4link"
  170. placeholder="请输入内容"
  171. showCount
  172. maxLength={200}
  173. />
  174. </Form.Item>
  175. {/* 文件类型 */}
  176. <div className="formRow">
  177. <div className="formLeft">
  178. <span>* </span>文件类型:
  179. </div>
  180. <div className="formRight">
  181. <ZupTypes
  182. ref={ZupFilesRef}
  183. // 这个项目没有模型
  184. selecFlag="图片/音频/视频"
  185. isLook={false}
  186. fileCheck={fileCheck}
  187. dirCode={dirCode}
  188. myUrl="cms/goods/upload"
  189. />
  190. </div>
  191. </div>
  192. <Form.Item
  193. label="时代"
  194. name="age"
  195. getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  196. >
  197. <Input maxLength={20} showCount placeholder="请输入内容" />
  198. </Form.Item>
  199. <Form.Item
  200. label="质地"
  201. name="texture"
  202. getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  203. >
  204. <Input maxLength={20} showCount placeholder="请输入内容" />
  205. </Form.Item>
  206. <Form.Item
  207. label="尺寸"
  208. name="size"
  209. getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
  210. >
  211. <Input maxLength={20} showCount placeholder="请输入内容" />
  212. </Form.Item>
  213. <Form.Item label="简介" name="description">
  214. <TextArea
  215. className="A4link"
  216. maxLength={200}
  217. showCount
  218. placeholder="请输入内容"
  219. />
  220. </Form.Item>
  221. {/* 确定和取消按钮 */}
  222. <Form.Item className="A4Ebtn">
  223. <Button type="primary" htmlType="submit">
  224. 提交
  225. </Button>
  226. <br />
  227. <br />
  228. <MyPopconfirm txtK="取消" onConfirm={closeFu} />
  229. </Form.Item>
  230. </Form>
  231. </div>
  232. </div>
  233. );
  234. }
  235. const MemoA4edit = React.memo(A4edit);
  236. export default MemoA4edit;