shaogen1995 9 months ago
parent
commit
d420834c03

+ 7 - 5
public/index.html

@@ -4,12 +4,9 @@
     <meta charset="utf-8" />
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="theme-color" content="#000000" />
     <meta name="theme-color" content="#000000" />
-    <meta
-      name="description"
-      content="Web site created using create-react-app"
-    />
+    <meta name="description" content="Web site created using create-react-app" />
     <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
     <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
-    <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon">
+    <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
     <!--
     <!--
       manifest.json provides metadata used when your web app is installed on a
       manifest.json provides metadata used when your web app is installed on a
       user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
       user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
@@ -40,4 +37,9 @@
       To create a production bundle, use `npm run build` or `yarn build`.
       To create a production bundle, use `npm run build` or `yarn build`.
     -->
     -->
   </body>
   </body>
+
+  <script>
+    // 图书影印模块-显示bookId
+    const isBookIdShow = true
+  </script>
 </html>
 </html>

+ 242 - 297
src/components/ZupTypes/index.tsx

@@ -1,58 +1,52 @@
-import React, {
-  useCallback,
-  useEffect,
-  useMemo,
-  useRef,
-  useState,
-} from "react";
-import styles from "./index.module.scss";
-import { Button, Checkbox, Input, Modal } from "antd";
-import { forwardRef, useImperativeHandle } from "react";
-import { baseURL } from "@/utils/http";
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import styles from './index.module.scss'
+import { Button, Checkbox, Input, Modal } from 'antd'
+import { forwardRef, useImperativeHandle } from 'react'
+import { baseURL } from '@/utils/http'
 import {
 import {
   PlusOutlined,
   PlusOutlined,
   CloseCircleOutlined,
   CloseCircleOutlined,
   UploadOutlined,
   UploadOutlined,
   CloseOutlined,
   CloseOutlined,
   DownloadOutlined,
   DownloadOutlined,
-  EyeOutlined,
-} from "@ant-design/icons";
-import { MessageFu } from "@/utils/message";
-import { API_upFile } from "@/store/action/layout";
-import { fileDomInitialFu } from "@/utils/domShow";
-import store from "@/store";
-import ImageLazy from "../ImageLazy";
-import classNames from "classnames";
-import MyPopconfirm from "../MyPopconfirm";
+  EyeOutlined
+} from '@ant-design/icons'
+import { MessageFu } from '@/utils/message'
+import { API_upFile } from '@/store/action/layout'
+import { fileDomInitialFu } from '@/utils/domShow'
+import store from '@/store'
+import ImageLazy from '../ImageLazy'
+import classNames from 'classnames'
+import MyPopconfirm from '../MyPopconfirm'
 // import { A2_APIchangeImgName } from "@/store/action/A2exhibition";
 // import { A2_APIchangeImgName } from "@/store/action/A2exhibition";
 
 
 export type FileListType = {
 export type FileListType = {
-  fileName: string;
-  thumb?: string;
-  filePath: string;
-  id: number;
-  type: "model" | "img" | "audio" | "video";
-  imgName: string;
-};
+  fileName: string
+  thumb?: string
+  filePath: string
+  id: number
+  type: 'model' | 'img' | 'audio' | 'video'
+  imgName: string
+}
 
 
 type Props = {
 type Props = {
-  ref: any; //当前自己的ref,给父组件调用
-  selecFlag: string; //筛选的字符串 模型/图片/音频/视频
-  fileCheck: boolean; //有没有点击过确定
-  dirCode: string; //文件的code码
-  myUrl: string; //请求地址
-  isLook?: boolean; //是不是查看
-  modelSize?: number; //模型文件大小限制
-  imgSize?: number; //图片大小限制
-  imgLength?: number; //图片数量限制
-  audioSize?: number; //音频大小限制
-  videoSize?: number; //视频大小限制
-  videoTit?: string; //视频上传的提示语
-  isTypeShow?: boolean; //默认就选中(只有一个类型的时候)
-  isUpName?: boolean; //是否能修改图片名字
-  lastImgTxt?: string; //加载最后面的上传提示
-  oneIsCover?: boolean; //是否将第一张作为封面
-};
+  ref: any //当前自己的ref,给父组件调用
+  selecFlag: string //筛选的字符串 模型/图片/音频/视频
+  fileCheck: boolean //有没有点击过确定
+  dirCode: string //文件的code码
+  myUrl: string //请求地址
+  isLook?: boolean //是不是查看
+  modelSize?: number //模型文件大小限制
+  imgSize?: number //图片大小限制
+  imgLength?: number //图片数量限制
+  audioSize?: number //音频大小限制
+  videoSize?: number //视频大小限制
+  videoTit?: string //视频上传的提示语
+  isTypeShow?: boolean //默认就选中(只有一个类型的时候)
+  isUpName?: boolean //是否能修改图片名字
+  lastImgTxt?: string //加载最后面的上传提示
+  oneIsCover?: boolean //是否将第一张作为封面
+}
 
 
 function ZupTypes(
 function ZupTypes(
   {
   {
@@ -66,223 +60,213 @@ function ZupTypes(
     imgLength = 9,
     imgLength = 9,
     audioSize = 10,
     audioSize = 10,
     videoSize = 500,
     videoSize = 500,
-    videoTit = "",
+    videoTit = '',
     isTypeShow = false,
     isTypeShow = false,
     isUpName = false,
     isUpName = false,
-    lastImgTxt = "",
-    oneIsCover = false,
+    lastImgTxt = '',
+    oneIsCover = false
   }: Props,
   }: Props,
   ref: any
   ref: any
 ) {
 ) {
   // 筛选
   // 筛选
-  const [typeCheck, setTypeCheck] = useState<string[]>([]);
+  const [typeCheck, setTypeCheck] = useState<string[]>([])
 
 
   // 筛选数组
   // 筛选数组
   const typeCheckArr = useMemo(() => {
   const typeCheckArr = useMemo(() => {
     const arr = [
     const arr = [
-      { label: "模型", value: "model" },
-      { label: "图片", value: "img" },
-      { label: "音频", value: "audio" },
-      { label: "视频", value: "video" },
-    ];
+      { label: '模型', value: 'model' },
+      { label: '图片', value: 'img' },
+      { label: '音频', value: 'audio' },
+      { label: '视频', value: 'video' }
+    ]
 
 
-    const arrRes = arr.filter((v) => selecFlag.includes(v.label));
+    const arrRes = arr.filter(v => selecFlag.includes(v.label))
     if (arrRes.length <= 1 && isTypeShow) {
     if (arrRes.length <= 1 && isTypeShow) {
-      setTypeCheck([arrRes[0].value]);
+      setTypeCheck([arrRes[0].value])
       // 默认就选中(只有一个类型的时候)
       // 默认就选中(只有一个类型的时候)
     }
     }
 
 
-    return arrRes;
-  }, [isTypeShow, selecFlag]);
+    return arrRes
+  }, [isTypeShow, selecFlag])
 
 
   // 上传附件的信息
   // 上传附件的信息
   const [fileList, setFileList] = useState({
   const [fileList, setFileList] = useState({
     model: {} as FileListType,
     model: {} as FileListType,
     img: [] as FileListType[],
     img: [] as FileListType[],
     audio: {} as FileListType,
     audio: {} as FileListType,
-    video: {} as FileListType,
-  });
+    video: {} as FileListType
+  })
 
 
   // 附件信息的校验,不满足返回 true
   // 附件信息的校验,不满足返回 true
   const fileCheckFu = useMemo(() => {
   const fileCheckFu = useMemo(() => {
-    let flag = false;
-    if (typeCheck.length === 0) flag = true;
-    if (typeCheck.includes("model") && !fileList.model.id) flag = true;
-    if (typeCheck.includes("img") && fileList.img.length === 0) flag = true;
-    if (typeCheck.includes("audio") && !fileList.audio.id) flag = true;
-    if (typeCheck.includes("video") && !fileList.video.id) flag = true;
-    return flag;
-  }, [fileList, typeCheck]);
+    let flag = false
+    if (typeCheck.length === 0) flag = true
+    if (typeCheck.includes('model') && !fileList.model.id) flag = true
+    if (typeCheck.includes('img') && fileList.img.length === 0) flag = true
+    if (typeCheck.includes('audio') && !fileList.audio.id) flag = true
+    if (typeCheck.includes('video') && !fileList.video.id) flag = true
+    return flag
+  }, [fileList, typeCheck])
 
 
   // 点击上传附件按钮
   // 点击上传附件按钮
-  const myInput = useRef<HTMLInputElement>(null);
+  const myInput = useRef<HTMLInputElement>(null)
 
 
-  const [fileOneType, setFileOneType] = useState("");
+  const [fileOneType, setFileOneType] = useState('')
 
 
   useEffect(() => {
   useEffect(() => {
-    if (fileOneType) myInput.current?.click();
-  }, [fileOneType]);
+    if (fileOneType) myInput.current?.click()
+  }, [fileOneType])
 
 
   const upFileFu = useCallback((type: string) => {
   const upFileFu = useCallback((type: string) => {
-    setFileOneType("");
+    setFileOneType('')
     window.setTimeout(() => {
     window.setTimeout(() => {
-      setFileOneType(type);
-    }, 100);
-  }, []);
+      setFileOneType(type)
+    }, 100)
+  }, [])
 
 
   // 上传附件的处理函数
   // 上传附件的处理函数
   const handeUpPhoto2 = useCallback(
   const handeUpPhoto2 = useCallback(
     async (e: React.ChangeEvent<HTMLInputElement>) => {
     async (e: React.ChangeEvent<HTMLInputElement>) => {
       if (e.target.files) {
       if (e.target.files) {
         // 拿到files信息
         // 拿到files信息
-        const filesInfo = e.target.files[0];
-
-        let anType = ["image/jpeg", "image/png"];
-        let anTit1 = "只支持png、jpg格式!";
-        let anTit2 = `最大支持${imgSize}M!`;
-        let anSize = imgSize * 1024 * 1024;
-
-        if (fileOneType === "audio") {
-          anType = ["audio/mpeg"];
-          anTit1 = "只支持mp3格式!";
-          anTit2 = `最大支持${audioSize}M!`;
-          anSize = audioSize * 1024 * 1024;
-        } else if (fileOneType === "video") {
-          anType = ["video/mp4"];
-          anTit1 = "只支持mp4格式!";
-          anTit2 = `最大支持${videoSize}M!`;
-          anSize = videoSize * 1024 * 1024;
-        } else if (fileOneType === "model") {
-          anType = [""];
-          anTit1 = "只支持4dage格式!";
-          anTit2 = `最大支持${modelSize}M!`;
-          anSize = modelSize * 1024 * 1024;
+        const filesInfo = e.target.files[0]
+
+        let anType = ['image/jpeg', 'image/png']
+        let anTit1 = '只支持png、jpg格式!'
+        let anTit2 = `最大支持${imgSize}M!`
+        let anSize = imgSize * 1024 * 1024
+
+        if (fileOneType === 'audio') {
+          anType = ['audio/mpeg']
+          anTit1 = '只支持mp3格式!'
+          anTit2 = `最大支持${audioSize}M!`
+          anSize = audioSize * 1024 * 1024
+        } else if (fileOneType === 'video') {
+          anType = ['video/mp4']
+          anTit1 = '只支持mp4格式!'
+          anTit2 = `最大支持${videoSize}M!`
+          anSize = videoSize * 1024 * 1024
+        } else if (fileOneType === 'model') {
+          anType = ['']
+          anTit1 = '只支持4dage格式!'
+          anTit2 = `最大支持${modelSize}M!`
+          anSize = modelSize * 1024 * 1024
         }
         }
 
 
         // 校验格式
         // 校验格式
-        if (fileOneType !== "model") {
+        if (fileOneType !== 'model') {
           if (!anType.includes(filesInfo.type)) {
           if (!anType.includes(filesInfo.type)) {
-            e.target.value = "";
-            return MessageFu.warning(anTit1);
+            e.target.value = ''
+            return MessageFu.warning(anTit1)
           }
           }
         } else {
         } else {
-          if (!filesInfo.name.includes(".4dage")) {
-            e.target.value = "";
-            return MessageFu.warning(anTit1);
+          if (!filesInfo.name.includes('.4dage')) {
+            e.target.value = ''
+            return MessageFu.warning(anTit1)
           }
           }
         }
         }
 
 
         // 校验大小
         // 校验大小
         if (filesInfo.size > anSize) {
         if (filesInfo.size > anSize) {
-          e.target.value = "";
-          return MessageFu.warning(anTit2);
+          e.target.value = ''
+          return MessageFu.warning(anTit2)
         }
         }
         // 创建FormData对象
         // 创建FormData对象
-        const fd = new FormData();
+        const fd = new FormData()
         // 把files添加进FormData对象(‘photo’为后端需要的字段)
         // 把files添加进FormData对象(‘photo’为后端需要的字段)
-        fd.append("type", fileOneType);
-        fd.append("dirCode", dirCode);
-        fd.append("isDb", "true");
+        fd.append('type', fileOneType)
+        fd.append('dirCode', dirCode)
+        fd.append('isDb', 'true')
 
 
         //初始图片 fileName为:未命名
         //初始图片 fileName为:未命名
         if (isUpName) {
         if (isUpName) {
-          fd.append("isDefaultName", "false");
+          fd.append('isDefaultName', 'false')
         }
         }
 
 
-        fd.append("file", filesInfo);
+        fd.append('file', filesInfo)
 
 
-        if (fileOneType === "img" && filesInfo.size > 1 * 1024 * 1024) {
+        if (fileOneType === 'img' && filesInfo.size > 1 * 1024 * 1024) {
           // 开启压缩图片
           // 开启压缩图片
-          fd.append("isCompress", "true");
+          fd.append('isCompress', 'true')
         }
         }
 
 
-        e.target.value = "";
+        e.target.value = ''
 
 
-        const res = await API_upFile(fd, myUrl);
+        const res = await API_upFile(fd, myUrl)
 
 
         try {
         try {
           if (res.code === 0) {
           if (res.code === 0) {
-            MessageFu.success("上传成功!");
-            if (fileOneType === "img")
+            MessageFu.success('上传成功!')
+            if (fileOneType === 'img')
               setFileList({
               setFileList({
                 ...fileList,
                 ...fileList,
-                img: [{ ...res.data, imgName: "未命名" }, ...fileList.img],
-              });
-            else setFileList({ ...fileList, [fileOneType]: res.data });
+                img: [...fileList.img, { ...res.data, imgName: '未命名' }]
+              })
+            else setFileList({ ...fileList, [fileOneType]: res.data })
           }
           }
-          fileDomInitialFu();
+          fileDomInitialFu()
         } catch (error) {
         } catch (error) {
-          fileDomInitialFu();
+          fileDomInitialFu()
         }
         }
       }
       }
     },
     },
-    [
-      audioSize,
-      dirCode,
-      fileList,
-      fileOneType,
-      imgSize,
-      isUpName,
-      modelSize,
-      myUrl,
-      videoSize,
-    ]
-  );
+    [audioSize, dirCode, fileList, fileOneType, imgSize, isUpName, modelSize, myUrl, videoSize]
+  )
 
 
   // 附件图片的拖动
   // 附件图片的拖动
-  const [dragImg, setDragImg] = useState<any>(null);
+  const [dragImg, setDragImg] = useState<any>(null)
 
 
   const handleDragOver = useCallback(
   const handleDragOver = useCallback(
     (e: React.DragEvent<HTMLDivElement>, item: FileListType) => {
     (e: React.DragEvent<HTMLDivElement>, item: FileListType) => {
-      if (isLook) return;
-      e.dataTransfer.dropEffect = "move";
+      if (isLook) return
+      e.dataTransfer.dropEffect = 'move'
     },
     },
     [isLook]
     [isLook]
-  );
+  )
 
 
   const handleDragEnter = useCallback(
   const handleDragEnter = useCallback(
     (e: React.DragEvent<HTMLDivElement>, item: FileListType) => {
     (e: React.DragEvent<HTMLDivElement>, item: FileListType) => {
-      if (isLook) return;
-
-      e.dataTransfer.effectAllowed = "move";
-      if (item === dragImg) return;
-      const newItems = [...fileList.img]; //拷贝一份数据进行交换操作。
-      const src = newItems.indexOf(dragImg); //获取数组下标
-      const dst = newItems.indexOf(item);
-      newItems.splice(dst, 0, ...newItems.splice(src, 1)); //交换位置
-      setFileList({ ...fileList, img: newItems });
+      if (isLook) return
+
+      e.dataTransfer.effectAllowed = 'move'
+      if (item === dragImg) return
+      const newItems = [...fileList.img] //拷贝一份数据进行交换操作。
+      const src = newItems.indexOf(dragImg) //获取数组下标
+      const dst = newItems.indexOf(item)
+      newItems.splice(dst, 0, ...newItems.splice(src, 1)) //交换位置
+      setFileList({ ...fileList, img: newItems })
     },
     },
     [dragImg, fileList, isLook]
     [dragImg, fileList, isLook]
-  );
+  )
 
 
   // 删除某一张图片
   // 删除某一张图片
   const delImgListFu = useCallback(
   const delImgListFu = useCallback(
     (id: number) => {
     (id: number) => {
-      const newItems = fileList.img.filter((v) => v.id !== id);
-      setFileList({ ...fileList, img: newItems });
+      const newItems = fileList.img.filter(v => v.id !== id)
+      setFileList({ ...fileList, img: newItems })
     },
     },
     [fileList]
     [fileList]
-  );
+  )
 
 
   // 模型 音频 视频 的 dom
   // 模型 音频 视频 的 dom
   const resOneDivDom = useCallback(
   const resOneDivDom = useCallback(
-    (type: "model" | "audio" | "video") => {
+    (type: 'model' | 'audio' | 'video') => {
       const dom = (
       const dom = (
-        <div className="ZTbox" hidden={!typeCheck.includes(type)}>
-          <div className="ZTbox1">
+        <div className='ZTbox' hidden={!typeCheck.includes(type)}>
+          <div className='ZTbox1'>
             <span> </span>
             <span> </span>
-            {type === "model" ? "模型" : type === "audio" ? "音频" : "视频"}:
+            {type === 'model' ? '模型' : type === 'audio' ? '音频' : '视频'}:
           </div>
           </div>
           {fileList[type].id ? (
           {fileList[type].id ? (
-            <div className="ZTbox2">
-              <div className="ZTbox2Name">{fileList[type].fileName}</div>
+            <div className='ZTbox2'>
+              <div className='ZTbox2Name'>{fileList[type].fileName}</div>
 
 
               <div
               <div
-                className="ZTbox2Look"
+                className='ZTbox2Look'
                 onClick={() =>
                 onClick={() =>
                   store.dispatch({
                   store.dispatch({
-                    type: "layout/lookDom",
-                    payload: { src: fileList[type].filePath, type },
+                    type: 'layout/lookDom',
+                    payload: { src: fileList[type].filePath, type }
                   })
                   })
                 }
                 }
               >
               >
@@ -292,97 +276,87 @@ function ZupTypes(
               <a
               <a
                 href={baseURL + fileList[type].filePath}
                 href={baseURL + fileList[type].filePath}
                 download
                 download
-                target="_blank"
-                className="ZTbox2Down"
-                rel="noreferrer"
+                target='_blank'
+                className='ZTbox2Down'
+                rel='noreferrer'
               >
               >
                 <DownloadOutlined rev={undefined} />
                 <DownloadOutlined rev={undefined} />
               </a>
               </a>
 
 
               <MyPopconfirm
               <MyPopconfirm
-                txtK="删除"
-                onConfirm={() =>
-                  setFileList({ ...fileList, [type]: {} as FileListType })
-                }
-                Dom={
-                  <CloseCircleOutlined className="ZTbox2X" rev={undefined} />
-                }
+                txtK='删除'
+                onConfirm={() => setFileList({ ...fileList, [type]: {} as FileListType })}
+                Dom={<CloseCircleOutlined className='ZTbox2X' rev={undefined} />}
               />
               />
             </div>
             </div>
           ) : (
           ) : (
             <>
             <>
-              <Button
-                onClick={() => upFileFu(type)}
-                icon={<UploadOutlined rev={undefined} />}
-              >
+              <Button onClick={() => upFileFu(type)} icon={<UploadOutlined rev={undefined} />}>
                 上传
                 上传
               </Button>
               </Button>
 
 
-              <div className="ZTboxTit">
-                {type === "model"
+              <div className='ZTboxTit'>
+                {type === 'model'
                   ? `仅支持4dage格式的模型文件,大小不能超过${modelSize}M。`
                   ? `仅支持4dage格式的模型文件,大小不能超过${modelSize}M。`
-                  : type === "audio"
+                  : type === 'audio'
                   ? `仅支持mp3格式的音频文件,大小不得超过${audioSize}MB。`
                   ? `仅支持mp3格式的音频文件,大小不得超过${audioSize}MB。`
                   : `仅支持mp4格式的视频文件,大小不得超过${videoSize}MB。${videoTit}`}
                   : `仅支持mp4格式的视频文件,大小不得超过${videoSize}MB。${videoTit}`}
               </div>
               </div>
             </>
             </>
           )}
           )}
         </div>
         </div>
-      );
-      return dom;
+      )
+      return dom
     },
     },
     [audioSize, fileList, modelSize, typeCheck, upFileFu, videoSize, videoTit]
     [audioSize, fileList, modelSize, typeCheck, upFileFu, videoSize, videoTit]
-  );
+  )
 
 
   // ------------让父组件调用的 回显
   // ------------让父组件调用的 回显
   const setFileComFileFu = useCallback((info: any) => {
   const setFileComFileFu = useCallback((info: any) => {
-    if (info.type) setTypeCheck(info.type.split(","));
+    if (info.type) setTypeCheck(info.type.split(','))
 
 
     if (info.fileList && info.fileList.length) {
     if (info.fileList && info.fileList.length) {
-      const data: FileListType[] = info.fileList;
+      const data: FileListType[] = info.fileList
       const obj = {
       const obj = {
         model: {} as FileListType,
         model: {} as FileListType,
         img: [] as FileListType[],
         img: [] as FileListType[],
         audio: {} as FileListType,
         audio: {} as FileListType,
-        video: {} as FileListType,
-      };
-
-      data.forEach((v) => {
-        if (v.type === "img") {
-          obj.img.push({ ...v, imgName: v.fileName });
-        } else obj[v.type!] = v;
-      });
-      setFileList(obj);
+        video: {} as FileListType
+      }
+
+      data.forEach(v => {
+        if (v.type === 'img') {
+          obj.img.push({ ...v, imgName: v.fileName })
+        } else obj[v.type!] = v
+      })
+      setFileList(obj)
     }
     }
-  }, []);
+  }, [])
 
 
   // --------------让父组件调用的返回 附件 信息
   // --------------让父组件调用的返回 附件 信息
   const fileComFileResFu = useCallback(() => {
   const fileComFileResFu = useCallback(() => {
-    let coverUrl = "";
-    const fileIds = [];
-    if (fileList.model.id && typeCheck.includes("model"))
-      fileIds.push(fileList.model.id);
-    if (fileList.audio.id && typeCheck.includes("audio"))
-      fileIds.push(fileList.audio.id);
-    if (fileList.video.id && typeCheck.includes("video"))
-      fileIds.push(fileList.video.id);
-    if (typeCheck.includes("img")) {
+    let coverUrl = ''
+    const fileIds = []
+    if (fileList.model.id && typeCheck.includes('model')) fileIds.push(fileList.model.id)
+    if (fileList.audio.id && typeCheck.includes('audio')) fileIds.push(fileList.audio.id)
+    if (fileList.video.id && typeCheck.includes('video')) fileIds.push(fileList.video.id)
+    if (typeCheck.includes('img')) {
       fileList.img.forEach((v, i) => {
       fileList.img.forEach((v, i) => {
         if (v.id) {
         if (v.id) {
-          fileIds.push(v.id);
+          fileIds.push(v.id)
           if (oneIsCover && i === 0) {
           if (oneIsCover && i === 0) {
             // 返回 第一张图的url 作为封面
             // 返回 第一张图的url 作为封面
-            coverUrl = v.thumb || v.filePath;
+            coverUrl = v.thumb || v.filePath
           }
           }
         }
         }
-      });
+      })
     }
     }
     return {
     return {
       sonType: typeCheck,
       sonType: typeCheck,
       sonFileIds: fileIds,
       sonFileIds: fileIds,
       sonIsOk: fileCheckFu,
       sonIsOk: fileCheckFu,
-      coverUrl,
-    };
+      coverUrl
+    }
   }, [
   }, [
     fileCheckFu,
     fileCheckFu,
     fileList.audio.id,
     fileList.audio.id,
@@ -390,45 +364,43 @@ function ZupTypes(
     fileList.model.id,
     fileList.model.id,
     fileList.video.id,
     fileList.video.id,
     oneIsCover,
     oneIsCover,
-    typeCheck,
-  ]);
+    typeCheck
+  ])
 
 
   // 可以让父组件调用子组件的方法
   // 可以让父组件调用子组件的方法
   useImperativeHandle(ref, () => ({
   useImperativeHandle(ref, () => ({
     setFileComFileFu,
     setFileComFileFu,
-    fileComFileResFu,
-  }));
+    fileComFileResFu
+  }))
 
 
   // 修改图片名称
   // 修改图片名称
   const [isNameChange, setIsNameChange] = useState({
   const [isNameChange, setIsNameChange] = useState({
     id: 0,
     id: 0,
-    oldName: "",
-    newName: "",
-  });
+    oldName: '',
+    newName: ''
+  })
 
 
   // 关闭弹窗
   // 关闭弹窗
   const isNameChangeXFu = useCallback(() => {
   const isNameChangeXFu = useCallback(() => {
-    setIsNameChange({ id: 0, oldName: "", newName: "" });
-  }, []);
+    setIsNameChange({ id: 0, oldName: '', newName: '' })
+  }, [])
 
 
   // 点击图片名字-出来弹窗
   // 点击图片名字-出来弹窗
   const isNameChangeFu = useCallback(
   const isNameChangeFu = useCallback(
     (item: FileListType) => {
     (item: FileListType) => {
-      if (isLook) return;
-      setIsNameChange({ id: item.id, oldName: item.imgName, newName: "" });
+      if (isLook) return
+      setIsNameChange({ id: item.id, oldName: item.imgName, newName: '' })
     },
     },
     [isLook]
     [isLook]
-  );
+  )
 
 
   // 修改完这点击 确定修改
   // 修改完这点击 确定修改
   const isNameChangeOkFu = useCallback(async () => {
   const isNameChangeOkFu = useCallback(async () => {
     // if (!isNameChange.newName) return MessageFu.warning("图片名不能为空!");
     // if (!isNameChange.newName) return MessageFu.warning("图片名不能为空!");
-
     // const res = await A2_APIchangeImgName({
     // const res = await A2_APIchangeImgName({
     //   id: isNameChange.id,
     //   id: isNameChange.id,
     //   fileName: isNameChange.newName,
     //   fileName: isNameChange.newName,
     // });
     // });
-
     // if (res.code === 0) {
     // if (res.code === 0) {
     //   MessageFu.success("修改图片名成功!");
     //   MessageFu.success("修改图片名成功!");
     //   setFileList({
     //   setFileList({
@@ -440,130 +412,108 @@ function ZupTypes(
     //   });
     //   });
     //   isNameChangeXFu();
     //   isNameChangeXFu();
     // }
     // }
-  }, []);
+  }, [])
   //
   //
 
 
   return (
   return (
-    <div
-      className={classNames(styles.ZupTypes, isLook ? styles.ZupTypesLook : "")}
-    >
+    <div className={classNames(styles.ZupTypes, isLook ? styles.ZupTypesLook : '')}>
       <input
       <input
-        id="upInput"
-        type="file"
+        id='upInput'
+        type='file'
         accept={
         accept={
-          fileOneType === "img"
-            ? ".png,.jpg,.jpeg"
-            : fileOneType === "audio"
-            ? ".mp3"
-            : fileOneType === "model"
-            ? ".4dage"
-            : ".mp4"
+          fileOneType === 'img'
+            ? '.png,.jpg,.jpeg'
+            : fileOneType === 'audio'
+            ? '.mp3'
+            : fileOneType === 'model'
+            ? '.4dage'
+            : '.mp4'
         }
         }
         ref={myInput}
         ref={myInput}
-        onChange={(e) => handeUpPhoto2(e)}
+        onChange={e => handeUpPhoto2(e)}
       />
       />
       <div hidden={isTypeShow}>
       <div hidden={isTypeShow}>
         <Checkbox.Group
         <Checkbox.Group
           options={typeCheckArr}
           options={typeCheckArr}
           value={typeCheck}
           value={typeCheck}
-          onChange={(e) => setTypeCheck(e as string[])}
+          onChange={e => setTypeCheck(e as string[])}
         />
         />
       </div>
       </div>
 
 
       {/* -----------模型 */}
       {/* -----------模型 */}
-      {resOneDivDom("model")}
+      {resOneDivDom('model')}
 
 
       {/* -----------图片 */}
       {/* -----------图片 */}
-      <div className="ZTboxImgMain" hidden={!typeCheck.includes("img")}>
-        <div className="ZTboxImgBox">
-          <div className="ZTbox1" hidden={isTypeShow}>
+      <div className='ZTboxImgMain' hidden={!typeCheck.includes('img')}>
+        <div className='ZTboxImgBox'>
+          <div className='ZTbox1' hidden={isTypeShow}>
             <span> </span> 图片:
             <span> </span> 图片:
           </div>
           </div>
 
 
-          <div
-            className="ZTbox1Img"
-            style={{ width: isTypeShow ? "100%" : "" }}
-          >
+          <div className='ZTbox1Img' style={{ width: isTypeShow ? '100%' : '' }}>
             <div
             <div
-              hidden={
-                (!!fileList.img.length && fileList.img.length >= imgLength) ||
-                isLook
-              }
-              className="ZTbox1ImgIcon"
-              onClick={() => upFileFu("img")}
+              hidden={(!!fileList.img.length && fileList.img.length >= imgLength) || isLook}
+              className='ZTbox1ImgIcon'
+              onClick={() => upFileFu('img')}
             >
             >
               <PlusOutlined rev={undefined} />
               <PlusOutlined rev={undefined} />
             </div>
             </div>
             {fileList.img.map((v, i) => (
             {fileList.img.map((v, i) => (
               <div
               <div
-                className="ZTbox1ImgRow"
+                className='ZTbox1ImgRow'
                 key={v.id}
                 key={v.id}
-                draggable="true"
+                draggable='true'
                 onDragStart={() => setDragImg(v)}
                 onDragStart={() => setDragImg(v)}
-                onDragOver={(e) => handleDragOver(e, v)}
-                onDragEnter={(e) => handleDragEnter(e, v)}
+                onDragOver={e => handleDragOver(e, v)}
+                onDragEnter={e => handleDragEnter(e, v)}
                 onDragEnd={() => setDragImg(null)}
                 onDragEnd={() => setDragImg(null)}
               >
               >
                 {v.thumb || v.filePath ? (
                 {v.thumb || v.filePath ? (
-                  <ImageLazy
-                    noLook={true}
-                    width={100}
-                    height={100}
-                    src={v.thumb || v.filePath}
-                  />
+                  <ImageLazy noLook={true} width={100} height={100} src={v.thumb || v.filePath} />
                 ) : null}
                 ) : null}
 
 
-                {oneIsCover && i === 0 ? (
-                  <div className="ZTbox1ImgRowCover">封面</div>
-                ) : null}
+                {oneIsCover && i === 0 ? <div className='ZTbox1ImgRowCover'>封面</div> : null}
 
 
                 {/* 修改图片名字 */}
                 {/* 修改图片名字 */}
                 {isUpName ? (
                 {isUpName ? (
                   <div
                   <div
                     title={v.imgName}
                     title={v.imgName}
-                    className="ZTbox1ImgRowName"
+                    className='ZTbox1ImgRowName'
                     onClick={() => isNameChangeFu(v)}
                     onClick={() => isNameChangeFu(v)}
                   >
                   >
                     {v.imgName}
                     {v.imgName}
                   </div>
                   </div>
                 ) : null}
                 ) : null}
 
 
-                <div className="ZTbox1ImgRowIcon">
+                <div className='ZTbox1ImgRowIcon'>
                   <EyeOutlined
                   <EyeOutlined
                     onClick={() =>
                     onClick={() =>
                       store.dispatch({
                       store.dispatch({
-                        type: "layout/lookBigImg",
+                        type: 'layout/lookBigImg',
                         payload: {
                         payload: {
                           url: baseURL + v.filePath,
                           url: baseURL + v.filePath,
-                          show: true,
-                        },
+                          show: true
+                        }
                       })
                       })
                     }
                     }
                     rev={undefined}
                     rev={undefined}
                   />
                   />
-                  <a
-                    href={baseURL + v.filePath}
-                    download
-                    target="_blank"
-                    rel="noreferrer"
-                  >
+                  <a href={baseURL + v.filePath} download target='_blank' rel='noreferrer'>
                     <DownloadOutlined rev={undefined} />
                     <DownloadOutlined rev={undefined} />
                   </a>
                   </a>
                 </div>
                 </div>
 
 
                 <MyPopconfirm
                 <MyPopconfirm
-                  txtK="删除"
+                  txtK='删除'
                   onConfirm={() => delImgListFu(v.id!)}
                   onConfirm={() => delImgListFu(v.id!)}
-                  Dom={
-                    <CloseOutlined className="ZTbox1ImgRowX" rev={undefined} />
-                  }
+                  Dom={<CloseOutlined className='ZTbox1ImgRowX' rev={undefined} />}
                 />
                 />
               </div>
               </div>
             ))}
             ))}
           </div>
           </div>
         </div>
         </div>
 
 
-        <div className="ZTboxTit" hidden={isLook}>
+        <div className='ZTboxTit' hidden={isLook}>
           {fileList.img.length && fileList.img.length >= 2 ? (
           {fileList.img.length && fileList.img.length >= 2 ? (
             <>
             <>
               按住鼠标可拖动图片调整顺序。
               按住鼠标可拖动图片调整顺序。
@@ -576,18 +526,13 @@ function ZupTypes(
       </div>
       </div>
 
 
       {/* -----------音频 */}
       {/* -----------音频 */}
-      {resOneDivDom("audio")}
+      {resOneDivDom('audio')}
 
 
       {/* -----------视频 */}
       {/* -----------视频 */}
-      {resOneDivDom("video")}
+      {resOneDivDom('video')}
 
 
       {/* 最后的提示 */}
       {/* 最后的提示 */}
-      <div
-        className={classNames(
-          "ZcheckTxt",
-          fileCheck && fileCheckFu ? "ZcheckTxtAc" : ""
-        )}
-      >
+      <div className={classNames('ZcheckTxt', fileCheck && fileCheckFu ? 'ZcheckTxtAc' : '')}>
         请最少上传一张图片!
         请最少上传一张图片!
       </div>
       </div>
 
 
@@ -596,45 +541,45 @@ function ZupTypes(
         <Modal
         <Modal
           wrapClassName={styles.ZupTypesMo}
           wrapClassName={styles.ZupTypesMo}
           open={true}
           open={true}
-          title="修改展品图片名称"
+          title='修改展品图片名称'
           footer={
           footer={
             [] // 设置footer为空,去掉 取消 确定默认按钮
             [] // 设置footer为空,去掉 取消 确定默认按钮
           }
           }
         >
         >
           <br />
           <br />
-          <div className="ZupTypesMoRow">
+          <div className='ZupTypesMoRow'>
             <strong>当前名:</strong>
             <strong>当前名:</strong>
             {isNameChange.oldName}
             {isNameChange.oldName}
           </div>
           </div>
-          <div className="ZupTypesMoRow">
+          <div className='ZupTypesMoRow'>
             <br />
             <br />
             <strong>修改为:</strong>
             <strong>修改为:</strong>
             <Input
             <Input
               style={{ width: 400 }}
               style={{ width: 400 }}
-              placeholder="请输入图片名"
+              placeholder='请输入图片名'
               maxLength={50}
               maxLength={50}
               showCount
               showCount
               value={isNameChange.newName}
               value={isNameChange.newName}
-              onChange={(e) => {
+              onChange={e => {
                 setIsNameChange({
                 setIsNameChange({
                   ...isNameChange,
                   ...isNameChange,
-                  newName: e.target.value.replace(/\s+/g, ""),
-                });
+                  newName: e.target.value.replace(/\s+/g, '')
+                })
               }}
               }}
             />
             />
           </div>
           </div>
 
 
-          <div className="ZupTypesMoBtn">
+          <div className='ZupTypesMoBtn'>
             <Button onClick={isNameChangeXFu}>取消</Button>
             <Button onClick={isNameChangeXFu}>取消</Button>
             &emsp;
             &emsp;
-            <Button type="primary" onClick={isNameChangeOkFu}>
+            <Button type='primary' onClick={isNameChangeOkFu}>
               修改
               修改
             </Button>
             </Button>
           </div>
           </div>
         </Modal>
         </Modal>
       ) : null}
       ) : null}
     </div>
     </div>
-  );
+  )
 }
 }
 
 
-export default forwardRef(ZupTypes);
+export default forwardRef(ZupTypes)

+ 1 - 1
src/pages/A1manage/A1add/index.tsx

@@ -236,7 +236,7 @@ function A1add({
             <Input
             <Input
               readOnly={editInfo.txt === '查看'}
               readOnly={editInfo.txt === '查看'}
               placeholder='请输入内容'
               placeholder='请输入内容'
-              maxLength={20}
+              maxLength={50}
               showCount
               showCount
             />
             />
           </Form.Item>
           </Form.Item>

+ 9 - 8
src/types/declaration.d.ts

@@ -1,8 +1,9 @@
-declare module "history";
-declare module "*.scss";
-declare module "*.png";
-declare module "*.jpg";
-declare module "*.gif";
-declare module "*.svg";
-declare module "js-export-excel";
-declare module 'braft-utils';
+declare module 'history'
+declare module '*.scss'
+declare module '*.png'
+declare module '*.jpg'
+declare module '*.gif'
+declare module '*.svg'
+declare module 'js-export-excel'
+declare module 'braft-utils'
+declare const isBookIdShow: boolean

+ 3 - 1
src/utils/tableData.ts

@@ -14,7 +14,7 @@
 //     ["text", "创建日期",'description', 50,A],
 //     ["text", "创建日期",'description', 50,A],
 //   ];
 //   ];
 
 
-export const A1tableC = [
+const A1tableCTemp = [
   ['txt', '书名', 'name'],
   ['txt', '书名', 'name'],
   ['img', '封面', 'thumb'],
   ['img', '封面', 'thumb'],
   ['txt', '作者', 'author'],
   ['txt', '作者', 'author'],
@@ -27,6 +27,8 @@ export const A1tableC = [
   ['txt', '编辑时间', 'updateTime']
   ['txt', '编辑时间', 'updateTime']
 ]
 ]
 
 
+export const A1tableC = isBookIdShow ? [['txt', 'bookId', 'id'], ...A1tableCTemp] : A1tableCTemp
+
 export const A1tableCimp = [
 export const A1tableCimp = [
   ['txt', '书名', 'name'],
   ['txt', '书名', 'name'],
   ['img', '封面(png、jpg)', 'thumb', `<span class='tabx'>(待填入)</span>`],
   ['img', '封面(png、jpg)', 'thumb', `<span class='tabx'>(待填入)</span>`],