lanxin 1 개월 전
부모
커밋
5a2b0e01ea

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 31293
package-lock.json


+ 1 - 1
package.json

@@ -65,4 +65,4 @@
     "react-app-rewired": "^2.2.1"
   },
   "homepage": "."
-}
+}

+ 0 - 1
public/index.html

@@ -5,7 +5,6 @@
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="theme-color" content="#000000" />
     <meta name="description" content="Web site created using create-react-app" />
-    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
     <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
     <!--
       manifest.json provides metadata used when your web app is installed on a

+ 34 - 34
src/App.tsx

@@ -1,25 +1,23 @@
-import "@/assets/styles/base.css";
+import '@/assets/styles/base.css'
 // 关于路由
-import React from "react";
-import { Router, Route, Switch } from "react-router-dom";
-import history from "./utils/history";
-import AuthRoute from "./components/AuthRoute";
-import SpinLoding from "./components/SpinLoding";
-import AsyncSpinLoding from "./components/AsyncSpinLoding";
-import { Image } from "antd";
-import { useSelector } from "react-redux";
-import store, { RootState } from "./store";
-import UpAsyncLoding from "./components/UpAsyncLoding";
-import MessageCom from "./components/Message";
-import LookDom from "./components/LookDom";
-const Layout = React.lazy(() => import("./pages/Layout"));
-const Login = React.lazy(() => import("./pages/Login"));
+import React from 'react'
+import { Router, Route, Switch } from 'react-router-dom'
+import history from './utils/history'
+import AuthRoute from './components/AuthRoute'
+import SpinLoding from './components/SpinLoding'
+import AsyncSpinLoding from './components/AsyncSpinLoding'
+import { Image } from 'antd'
+import { useSelector } from 'react-redux'
+import store, { RootState } from './store'
+import UpAsyncLoding from './components/UpAsyncLoding'
+import MessageCom from './components/Message'
+import LookDom from './components/LookDom'
+const Layout = React.lazy(() => import('./pages/Layout'))
+const Login = React.lazy(() => import('./pages/Login'))
 
 export default function App() {
   // 从仓库中获取查看图片的信息
-  const lookBigImg = useSelector(
-    (state: RootState) => state.A0Layout.lookBigImg
-  );
+  const lookBigImg = useSelector((state: RootState) => state.A0Layout.lookBigImg)
 
   return (
     <>
@@ -28,8 +26,8 @@ export default function App() {
         <React.Suspense fallback={<SpinLoding />}>
           <Switch>
             {/* 测试页面 */}
-            <Route path="/login" component={Login} />
-            <AuthRoute path="/" component={Layout} />
+            <Route path='/login' component={Login} />
+            <AuthRoute path='/' component={Layout} />
           </Switch>
         </React.Suspense>
       </Router>
@@ -38,19 +36,21 @@ export default function App() {
       <AsyncSpinLoding />
 
       {/* 所有图片点击预览查看大图 */}
-      <Image
-        preview={{
-          visible: lookBigImg.show,
-          src: lookBigImg.url,
-          onVisibleChange: (value) => {
-            // 清除仓库信息
-            store.dispatch({
-              type: "layout/lookBigImg",
-              payload: { url: "", show: false },
-            });
-          },
-        }}
-      />
+      {lookBigImg.show ? (
+        <Image
+          preview={{
+            visible: lookBigImg.show,
+            src: lookBigImg.url,
+            onVisibleChange: value => {
+              // 清除仓库信息
+              store.dispatch({
+                type: 'layout/lookBigImg',
+                payload: { url: '', show: false }
+              })
+            }
+          }}
+        />
+      ) : null}
 
       {/* 上传附件的进度条元素 */}
       <UpAsyncLoding />
@@ -61,5 +61,5 @@ export default function App() {
       {/* antd 轻提示 ---兼容360浏览器 */}
       <MessageCom />
     </>
-  );
+  )
 }

+ 2 - 1
src/components/MyTable/index.tsx

@@ -92,12 +92,13 @@ function MyTable({
           return item.status === 0 ? item[v[3]] || isNull : item[v[2]] || isNull
         },
         img: (item: any) => {
+          console.log(item, '---------------------')
           return (
             <div className='tableImgAuto'>
               <ImageLazy
                 width={60}
                 height={60}
-                srcBig={item.imgB}
+                srcBig={item.status === 0 ? item[v[5]] || item.imgB : item[v[4]] || item.img}
                 src={item.status === 0 ? item[v[3]] || item.imgThB : item[v[2]] || item.imgThB}
                 offline={(item.status === 0 ? item[v[3]] : item[v[2]] || '').includes('http')}
               />

+ 35 - 19
src/components/PreviewOperate/index.tsx

@@ -6,13 +6,15 @@ import { editPreview } from '@/store/action/layout'
 import { handleCopyClick } from '@/utils/copyTxt'
 import { MessageFu } from '@/utils/message'
 import html2canvas from 'html2canvas'
+import { domShowFu } from '@/utils/domShow'
 
 function PreviewOperate({ src }: { src?: string }) {
   const dispatch = useDispatch()
   const iframeRef = useRef<HTMLIFrameElement>(null)
+  const downloadRef = useRef<HTMLButtonElement>(null)
   // 用于标记 iframe 是否加载完成且文档就绪
   const [isIframeReady, setIsIframeReady] = useState(false)
-  const cachedImageUrl = useRef<string | null>(null)
+  // const cachedImageUrl = useRef<string | null>(null)
 
   const copyLink = useCallback(() => {
     if (src) {
@@ -23,6 +25,7 @@ function PreviewOperate({ src }: { src?: string }) {
   }, [src])
 
   const downloadImg = useCallback(async () => {
+    domShowFu('#AsyncSpinLoding', true)
     if (iframeRef.current && isIframeReady) {
       try {
         const iframeDocument = iframeRef.current.contentDocument!
@@ -34,12 +37,13 @@ function PreviewOperate({ src }: { src?: string }) {
             virInput.style.display = 'flex'
           }
           const canvas = await html2canvas(iframeDocument.body)
-          cachedImageUrl.current = canvas.toDataURL('image/png')
-          // const imageDataUrl = canvas.toDataURL('image/png')
-          // const link = document.createElement('a')
-          // link.download = 'preview.png'
-          // link.href = imageDataUrl
-          // link.click()
+          // cachedImageUrl.current = canvas.toDataURL('image/png')
+          const imageDataUrl = canvas.toDataURL('image/png')
+          const link = document.createElement('a')
+          link.download = 'preview.png'
+          link.href = imageDataUrl
+          link.click()
+          domShowFu('#AsyncSpinLoding', false)
           if (elInput && virInput) {
             elInput.style.display = 'flex'
             virInput.style.display = 'none'
@@ -51,18 +55,18 @@ function PreviewOperate({ src }: { src?: string }) {
     }
   }, [isIframeReady])
 
-  const download = useCallback(async () => {
-    if (!cachedImageUrl.current) {
-      MessageFu.error('正在加载...')
-      await downloadImg()
-      return
-    }
+  // const download = useCallback(async () => {
+  //   if (!cachedImageUrl.current) {
+  //     MessageFu.error('正在加载...')
+  //     await downloadImg()
+  //     return
+  //   }
 
-    const link = document.createElement('a')
-    link.download = 'preview.png'
-    link.href = cachedImageUrl.current
-    link.click()
-  }, [downloadImg])
+  //   const link = document.createElement('a')
+  //   link.download = 'preview.png'
+  //   link.href = cachedImageUrl.current
+  //   link.click()
+  // }, [downloadImg])
 
   useEffect(() => {
     const iframe = iframeRef.current
@@ -81,6 +85,10 @@ function PreviewOperate({ src }: { src?: string }) {
                   // 替换为正确的 CSS 路径,请根据实际情况修改
                   link.href = 'https://sit-kelamayi.4dage.com/mini/assets/index-BNWQR98R.css'
                 }
+                if (link.href.includes('index-DqAPdNY3.css')) {
+                  // 替换为正确的 CSS 路径,请根据实际情况修改
+                  link.href = 'https://sit-kelamayi.4dage.com/mini/assets/index-DqAPdNY3.css'
+                }
               })
               setIsIframeReady(true)
             } else {
@@ -98,6 +106,14 @@ function PreviewOperate({ src }: { src?: string }) {
     }
   }, [])
 
+  // useEffect(() => {
+  //   if (isIframeReady) {
+  //     setTimeout(() => {
+  //       downloadRef.current?.click()
+  //     }, 300)
+  //   }
+  // }, [isIframeReady])
+
   return (
     <div className={styles.PreviewOperate}>
       <div className='PreviewOperateMain'>
@@ -113,7 +129,7 @@ function PreviewOperate({ src }: { src?: string }) {
           )}
           <div className='copyLink'>
             <Button onClick={copyLink}>复制链接</Button>
-            <Button onClick={download} disabled={!isIframeReady}>
+            <Button ref={downloadRef} onClick={downloadImg} disabled={!isIframeReady}>
               下载图片
             </Button>
             <Button onClick={() => dispatch(editPreview({ isOpenPreview: false }))}>关闭</Button>

+ 2 - 2
src/components/ZupTypes/index.tsx

@@ -344,7 +344,7 @@ function ZupTypes(
 
               <div className='ZTboxTit'>
                 {type === 'model'
-                  ? `仅支持4dage格式的模型文件,大小不能超过${modelSize}M。`
+                  ? ``
                   : type === 'audio'
                   ? `仅支持mp3格式的音频文件,大小不得超过${audioSize}MB。`
                   : `仅支持MP4格式的视频文件,大小不得超过${videoSize}MB。${videoTit}`}
@@ -355,7 +355,7 @@ function ZupTypes(
       )
       return dom
     },
-    [audioSize, fileList, modelInputChange, modelSize, typeCheck, upFileFu, videoSize, videoTit]
+    [audioSize, fileList, modelInputChange, typeCheck, upFileFu, videoSize, videoTit]
   )
 
   // ------------让父组件调用的 回显

+ 13 - 0
src/index.tsx

@@ -33,3 +33,16 @@ root.render(
     </Provider>
   </ConfigProvider>
 )
+
+//旧版本浏览器,按 Backspace 键会回退到上一个页面
+const handleBackspace = (e: KeyboardEvent) => {
+  const target = e.target as HTMLElement | null
+  // 判断是否在可输入区域(input/textarea/内容可编辑元素)
+  const isInputArea = target?.matches('input, textarea, [contenteditable="true"]')
+
+  // 非输入区域按下Backspace时阻止回退行为
+  if (e.key === 'Backspace' && !isInputArea) {
+    e.preventDefault()
+  }
+}
+document.addEventListener('keydown', handleBackspace)

+ 4 - 1
src/pages/A1banner/index.tsx

@@ -45,10 +45,13 @@ function A1banner() {
       const res = await A1_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const publishFu = useCallback(

+ 1 - 1
src/pages/A2introduction/index.tsx

@@ -102,7 +102,7 @@ const A2introduction = () => {
                   dispatch(
                     editPreview({
                       isOpenPreview: true,
-                      src: `/allDetailsShow?id=${data.contextId}&type=museum&preview=1`
+                      src: `/allDetailsShow?id=${data.contextId}&type=museum&preview=1&isFromPage=indexPage`
                     })
                   )
                 }

+ 1 - 1
src/pages/A3map/index.tsx

@@ -102,7 +102,7 @@ const A3map = () => {
                   dispatch(
                     editPreview({
                       isOpenPreview: true,
-                      src: `/indexPage/map?preview=1`
+                      src: `/indexPage/map?preview=1&isFromPage=indexPage`
                     })
                   )
                 }

+ 4 - 1
src/pages/A4news/index.tsx

@@ -48,10 +48,13 @@ function A4news() {
       const res = await A4_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const publishFu = useCallback(

+ 4 - 1
src/pages/A5activity/index.tsx

@@ -48,10 +48,13 @@ function A5activity() {
       const res = await A5_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const publishFu = useCallback(

+ 4 - 1
src/pages/A6exhibition/index.tsx

@@ -49,10 +49,13 @@ function A6exhibition() {
       const res = await A6_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const publishFu = useCallback(

+ 1 - 1
src/pages/A7collection/A7add/index.tsx

@@ -80,7 +80,7 @@ function A7add({ editInfo, closeFu, addTableFu, editTableFu }: Props) {
       fileList: [
         ...imgFileList,
         editObj.typeModel && {
-          fileName: editObj.modelFile.split('/').pop(),
+          fileName: editObj.modelFile,
           filePath: editObj.modelFile,
           id: editObj.modelFile,
           type: 'model'

+ 4 - 1
src/pages/A7collection/index.tsx

@@ -49,10 +49,13 @@ function A7collection() {
       const res = await A7_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const publishFu = useCallback(

+ 11 - 2
src/pages/B1reserve1/index.tsx

@@ -44,10 +44,13 @@ function B1reserve1() {
       const res = await B_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   // 导出excel前端实现
@@ -74,7 +77,13 @@ function B1reserve1() {
 
   // 导出excel后端实现
   const exportExcelFu2 = useCallback(async () => {
-    window.open(B_APIexportExcel(1), '_blank')
+    const res: any = await B_APIexportExcel(1)
+    const downloadUrl = window.URL.createObjectURL(res)
+    const link = document.createElement('a')
+    link.href = downloadUrl
+    link.download = '展馆预约表.xlsx'
+    document.body.appendChild(link)
+    link.click()
   }, [])
 
   const tableLastBtn = useMemo(() => {

+ 11 - 2
src/pages/B2reserve2/index.tsx

@@ -44,10 +44,13 @@ function B2reserve2() {
       const res = await B_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   // 导出excel前端实现
@@ -74,7 +77,13 @@ function B2reserve2() {
 
   // 导出excel后端实现
   const exportExcelFu2 = useCallback(async () => {
-    window.open(B_APIexportExcel(2), '_blank')
+    const res: any = await B_APIexportExcel(2)
+    const downloadUrl = window.URL.createObjectURL(res)
+    const link = document.createElement('a')
+    link.href = downloadUrl
+    link.download = '活动预约表.xlsx'
+    document.body.appendChild(link)
+    link.click()
   }, [])
 
   const tableLastBtn = useMemo(() => {

+ 11 - 2
src/pages/D1feedback/index.tsx

@@ -43,10 +43,13 @@ function D1feedback() {
       const res = await D1_APIdel(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && pageData.pageNum > 1) {
+          setPageData({ ...pageData, pageNum: pageData.pageNum - 1 })
+        }
         getListFu()
       }
     },
-    [getListFu]
+    [getListFu, pageData, tableInfo.list.length]
   )
 
   const tableLastBtn = useMemo(() => {
@@ -85,7 +88,13 @@ function D1feedback() {
 
   // 导出excel后端实现
   const exportExcelFu2 = useCallback(async () => {
-    window.open(D1_APIexportExcel(), '_blank')
+    const res: any = await D1_APIexportExcel()
+    const downloadUrl = window.URL.createObjectURL(res)
+    const link = document.createElement('a')
+    link.href = downloadUrl
+    link.download = '意见反馈.xlsx'
+    document.body.appendChild(link)
+    link.click()
   }, [])
 
   //新增、编辑

+ 5 - 4
src/pages/Z1user/index.tsx

@@ -69,10 +69,13 @@ function Z1user() {
       const res: any = await userRemoveAPI(id)
       if (res.code === 0) {
         MessageFu.success('删除成功!')
+        if (tableInfo.list.length === 1 && fromData.pageNum > 1) {
+          setFromData({ ...fromData, pageNum: fromData.pageNum - 1 })
+        }
         getList()
       }
     },
-    [getList]
+    [fromData, getList, tableInfo.list.length]
   )
 
   // 点击重置密码
@@ -139,8 +142,6 @@ function Z1user() {
           <div className='selectBoxRow'>
             <Input
               key={inputKey}
-              maxLength={10}
-              showCount
               style={{ width: 200 }}
               placeholder='请输入用户名'
               allowClear
@@ -149,7 +150,7 @@ function Z1user() {
             />
             &emsp;
             <Button type='primary' onClick={() => txtChangeFu(name, 'userName')}>
-              查询
+              搜索
             </Button>
             &emsp;&emsp;
             <Button type='primary' onClick={resetSelectFu}>

+ 0 - 44
src/store/action/A3map.ts

@@ -1,44 +0,0 @@
-import http from '@/utils/http'
-import { AppDispatch } from '..'
-
-/**
- *图书推荐-列表
- */
-
-export const A3_APIgetList = (data: any): any => {
-  return async (dispatch: AppDispatch) => {
-    const res = await http.post('cms/rank/getList', data)
-    if (res.code === 0) {
-      dispatch({ type: 'A3/getList', payload: res.data })
-    }
-  }
-}
-
-// 获取新增 、编辑 里面的 书名/ISBN编号的下拉框数据
-export const A1_APIgetSelect = (): any => {
-  return http.post('cms/book/pageList', {
-    pageNum: 1,
-    pageSize: 99999
-  })
-}
-
-/**
- * 图书推荐-删除
- */
-export const A3_APIdel = (id: number) => {
-  return http.get(`cms/rank/remove/${id}`)
-}
-
-/**
- * 图书推荐-获取详情
- */
-export const A3_APIgetInfo = (id: number) => {
-  return http.get(`cms/rank/detail/${id}`)
-}
-
-/**
- * 图书推荐-新增、编辑
- */
-export const A3_APIsave = (data: any) => {
-  return http.post('cms/rank/save', data)
-}

+ 9 - 1
src/store/action/Breserve.ts

@@ -35,5 +35,13 @@ export const B_APIdel = (id: number) => {
  * 导出Excel Type 1-展馆预约记录 2-活动预约记录
  */
 export const B_APIexportExcel = (type: number) => {
-  return `https://sit-kelamayi.4dage.com/api/museum/appointment/exportExcel?type=${type}`
+  // return `https://sit-kelamayi.4dage.com/api/museum/appointment/exportExcel?type=${type}`
+  return http.get('museum/appointment/exportExcel?type=' + type, { responseType: 'blob' })
 }
+
+/**
+ * 导出Excel Type 1-展馆预约记录 2-活动预约记录
+ */
+// export const B_APIexportExcel = (type: number) => {
+//   return `https://sit-kelamayi.4dage.com/api/museum/appointment/exportExcel?type=${type}`
+// }

+ 2 - 1
src/store/action/D1feedback.ts

@@ -41,5 +41,6 @@ export const D1_APIgetInfo = (id: number) => {
  * 意见反馈记录-导出
  */
 export const D1_APIexportExcel = () => {
-  return `https://sit-kelamayi.4dage.com/api/museum/feedback/exportExcel`
+  // return `https://sit-kelamayi.4dage.com/api/museum/feedback/exportExcel`
+  return http.get('museum/feedback/exportExcel', { responseType: 'blob' })
 }

+ 0 - 14
src/store/action/Z1user.ts

@@ -40,13 +40,6 @@ export const userSaveAPI = (data: SaveUserType) => {
 }
 
 /**
- * 通过id获取角色详情
- */
-export const getUserInfoByIdAPI = (id: number) => {
-  return http.get(`sys/user/detail/${id}`)
-}
-
-/**
  * 角色授权-获取当前用户菜单树
  */
 export const Z1_APIgetAuthByUserId = (userId: number) => {
@@ -59,10 +52,3 @@ export const Z1_APIgetAuthByUserId = (userId: number) => {
 export const Z1_APIsetAuth = (data: any) => {
   return http.post('museum/user/changePermissions', data)
 }
-
-/**
- * 角色授权-获取 初始页面获取
- */
-export const Z1_APIgetAuthBase = () => {
-  return http.get('sys/user/perm/getTree')
-}

+ 0 - 25
src/store/reducer/A3map.ts

@@ -1,25 +0,0 @@
-import { A3tableType } from '@/types'
-
-// 初始化状态
-const initState = {
-  // 列表数据
-  tableList: [] as A3tableType[]
-}
-
-// 定义 action 类型
-type Props = {
-  type: 'A3/getList'
-  payload: A3tableType[]
-}
-
-// reducer
-export default function Reducer(state = initState, action: Props) {
-  switch (action.type) {
-    // 获取列表数据
-    case 'A3/getList':
-      return { ...state, tableList: action.payload }
-
-    default:
-      return state
-  }
-}

+ 0 - 2
src/store/reducer/index.ts

@@ -4,7 +4,6 @@ import { combineReducers } from 'redux'
 // 导入 登录 模块的 reducer
 import A0Layout from './layout'
 import A1banner from './A1banner'
-import A3map from './A3map'
 import A4news from './A4news'
 import A5activity from './A5activity'
 import A6exhibition from './A6exhibition'
@@ -18,7 +17,6 @@ import Breserve from './Breserve'
 const rootReducer = combineReducers({
   A0Layout,
   A1banner,
-  A3map,
   A4news,
   A5activity,
   A6exhibition,

+ 2 - 0
src/utils/http.ts

@@ -73,6 +73,8 @@ http.interceptors.response.use(
       // 密码错误
     } else if (response.data.code === 4004) {
       // 用户名重复
+    } else if (!!response.data === false) {
+      return response
     } else if (response.data.code !== 0) MessageFu.warning(response.data.message)
 
     return response.data

+ 1 - 1
src/utils/tableData.ts

@@ -25,7 +25,7 @@ export const A1tableC = [
 
 export const A4tableC = [
   ['txt', '标题', 'title', 'titleB'],
-  ['img', '封面', 'indexImgTh', 'indexImgThB'],
+  ['img', '封面', 'indexImgTh', 'indexImgThB', 'indexImg', 'indexImgB'],
   ['txt', '摘要', 'remark', 'remarkB'],
   ['txt', '发布日期', 'publish', 'publishB'],
   ['txtChange', '状态', 'status', { 0: '预发布', 1: '已发布' }]