Przeglądaj źródła

差背景图和logo

shaogen1995 1 tydzień temu
rodzic
commit
7338ac3c04
35 zmienionych plików z 1246 dodań i 101 usunięć
  1. 0 1
      后台管理/public/sss.js
  2. BIN
      后台管理/src/assets/img/pic.png
  3. BIN
      后台管理/src/assets/img/title.png
  4. 1 1
      后台管理/src/pages/A1record/A1look/index.tsx
  5. 1 1
      后台管理/src/pages/A1record/A1tab/A2tab2clan/index.tsx
  6. 10 0
      后台管理/src/pages/A1record/A1tab/A4tab4antique/index.module.scss
  7. 83 3
      后台管理/src/pages/A1record/A1tab/A4tab4antique/index.tsx
  8. 95 0
      后台管理/src/pages/A4antique/A4add/index.module.scss
  9. 173 0
      后台管理/src/pages/A4antique/A4add/index.tsx
  10. 14 0
      后台管理/src/pages/A4antique/data.ts
  11. 30 0
      后台管理/src/pages/A4antique/index.module.scss
  12. 184 2
      后台管理/src/pages/A4antique/index.tsx
  13. 26 0
      后台管理/src/pages/A5introduce/A5add/index.module.scss
  14. 78 0
      后台管理/src/pages/A5introduce/A5add/index.tsx
  15. 11 0
      后台管理/src/pages/A5introduce/data.ts
  16. 25 0
      后台管理/src/pages/A5introduce/index.module.scss
  17. 40 1
      后台管理/src/pages/A5introduce/index.tsx
  18. 9 0
      后台管理/src/pages/A6statistics/data.ts
  19. 51 0
      后台管理/src/pages/A6statistics/index.module.scss
  20. 155 1
      后台管理/src/pages/A6statistics/index.tsx
  21. 6 7
      后台管理/src/pages/Layout/data.ts
  22. 54 52
      后台管理/src/pages/Layout/index.tsx
  23. 1 6
      后台管理/src/pages/Login/index.tsx
  24. 14 14
      后台管理/src/pages/Z1user/Z1auth.tsx
  25. 5 7
      后台管理/src/pages/Z1user/index.tsx
  26. 42 0
      后台管理/src/store/action/A4antique.ts
  27. 20 0
      后台管理/src/store/action/A5A5introduce.ts
  28. 22 0
      后台管理/src/store/action/A6statistics.ts
  29. 3 3
      后台管理/src/store/action/Z1user.ts
  30. 28 0
      后台管理/src/store/reducer/A4antique.ts
  31. 25 0
      后台管理/src/store/reducer/A5introduce.ts
  32. 25 0
      后台管理/src/store/reducer/A6statistics.ts
  33. 6 0
      后台管理/src/store/reducer/index.ts
  34. 2 2
      后台管理/src/utils/http.ts
  35. 7 0
      后台管理/src/utils/tableData.ts

+ 0 - 1
后台管理/public/sss.js

@@ -1 +0,0 @@
-const aa = 

BIN
后台管理/src/assets/img/pic.png


BIN
后台管理/src/assets/img/title.png


+ 1 - 1
后台管理/src/pages/A1record/A1look/index.tsx

@@ -191,7 +191,7 @@ function A1look({ sId }: Props) {
             {tabAc === 1 ? <A1tab1life sId={sId} /> : null}
             {tabAc === 2 ? <A2tab2clan sId={sId} listAllRes={listAllRes} /> : null}
             {tabAc === 3 ? <A3tab3clue sId={sId} listAllRes={listAllRes} /> : null}
-            {tabAc === 4 ? <A4tab4antique sId={sId} /> : null}
+            {tabAc === 4 ? <A4tab4antique sId={sId} listAllRes={listAllRes} /> : null}
           </div>
         </>
       ) : null}

+ 1 - 1
后台管理/src/pages/A1record/A1tab/A2tab2clan/index.tsx

@@ -74,7 +74,7 @@ function A2tab2clan({ sId, listAllRes }: Props) {
     <div className={styles.A2tab2clan}>
       <div className='A2t1btn'>
         <Button type='primary' onClick={() => setEditId(-1)}>
-          新增线索
+          新增亲属
         </Button>
       </div>
       <MyTable list={list} columnsTemp={A3tableC} lastBtn={tableLastBtn} pagingInfo={false} />

+ 10 - 0
后台管理/src/pages/A1record/A1tab/A4tab4antique/index.module.scss

@@ -1,4 +1,14 @@
 .A4tab4antique {
   :global {
+    .A4t1btn {
+      position: absolute;
+      right: 10px;
+      top: 12px;
+      z-index: 10;
+    }
+
+    .ant-table-cell {
+      padding: 8px !important;
+    }
   }
 }

+ 83 - 3
后台管理/src/pages/A1record/A1tab/A4tab4antique/index.tsx

@@ -1,14 +1,94 @@
-import React from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import styles from './index.module.scss'
+import { A1ListSelectType } from '../../data'
+import { A4ListType } from '@/pages/A4antique/data'
+import { A4_APIdel, A4_APIgetList } from '@/store/action/A4antique'
+import { MessageFu } from '@/utils/message'
+import { Button } from 'antd'
+import MyPopconfirm from '@/components/MyPopconfirm'
+import MyTable from '@/components/MyTable'
+import { A4tableC } from '@/utils/tableData'
+import A4add from '@/pages/A4antique/A4add'
 
 type Props = {
   sId: number
+  listAllRes: A1ListSelectType
 }
 
-function A4tab4antique({ sId }: Props) {
+function A4tab4antique({ sId, listAllRes }: Props) {
+  // 获取列表信息
+  const [list, setList] = useState<A4ListType[]>([])
+
+  const getList = useCallback(async () => {
+    const res = await A4_APIgetList(
+      {
+        pageNum: 1,
+        pageSize: 99999,
+        martyrId: sId
+      },
+      true
+    )
+    if (res.code === 0) {
+      setList(res.data.records || [])
+    }
+  }, [sId])
+
+  useEffect(() => {
+    getList()
+  }, [getList])
+
+  // 点击新增、编辑
+  const [editId, setEditId] = useState(0)
+
+  // 点击删除
+  const delTableFu = useCallback(
+    async (id: number) => {
+      const res = await A4_APIdel(id)
+      if (res.code === 0) {
+        MessageFu.success('删除成功!')
+        getList()
+      }
+    },
+    [getList]
+  )
+
+  const tableLastBtn = useMemo(() => {
+    return [
+      {
+        title: '操作',
+        render: (item: any) => {
+          return (
+            <>
+              <Button size='small' type='text' onClick={() => setEditId(item.id)}>
+                编辑
+              </Button>
+              <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item.id)} />
+            </>
+          )
+        }
+      }
+    ]
+  }, [delTableFu])
+
   return (
     <div className={styles.A4tab4antique}>
-      <h1>A4tab4antique</h1>
+      <div className='A4t1btn'>
+        <Button type='primary' onClick={() => setEditId(-1)}>
+          新增文物
+        </Button>
+      </div>
+      <MyTable list={list} columnsTemp={A4tableC} lastBtn={tableLastBtn} pagingInfo={false} />
+
+      {editId ? (
+        <A4add
+          sId={editId}
+          closeFu={() => setEditId(0)}
+          addTableFu={getList}
+          upTableFu={getList}
+          listAllRes={listAllRes}
+          martyrId={sId}
+        />
+      ) : null}
     </div>
   )
 }

+ 95 - 0
后台管理/src/pages/A4antique/A4add/index.module.scss

@@ -0,0 +1,95 @@
+.A4add {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 100;
+  width: 100%;
+  height: 100%;
+  border-radius: 10px;
+  background-color: rgba(0, 0, 0, 0.6);
+  padding: 50px 100px;
+  overflow: hidden;
+  :global {
+    .A4addMain {
+      width: 100%;
+      height: 100%;
+      background-color: #fff;
+      border-radius: 10px;
+      position: relative;
+      padding: 15px;
+
+      .A4aTit {
+        font-weight: 700;
+        font-size: 16px;
+        color: var(--themeColor);
+        margin-bottom: 15px;
+      }
+
+      .A4accc {
+        width: calc(100% - 100px);
+        height: calc(100% - 30px);
+        overflow: auto;
+
+        .ant-form-item-label {
+          width: 81px;
+        }
+
+        .A4aRow {
+          display: flex;
+          justify-content: space-between;
+          .ant-form-item {
+            width: 48%;
+          }
+
+          .A4aRowSon {
+            width: 48%;
+            display: flex;
+            .ant-btn {
+              margin-left: 10px;
+            }
+            .ant-form-item {
+              width: calc(100% - 74px);
+            }
+          }
+        }
+        .A4aRowAll {
+          width: 100%;
+          .ant-form-item {
+            width: 100%;
+          }
+        }
+
+        .formRow {
+          display: flex;
+
+          .formLeft {
+            position: relative;
+            top: 3px;
+            width: 81px;
+            text-align: right;
+
+            & > span {
+              color: #ff4d4f;
+            }
+          }
+
+          .formRight {
+            width: calc(100% - 81px);
+            position: relative;
+            top: -15px;
+          }
+        }
+        .formRow2 {
+          margin-bottom: -20px;
+        }
+
+        .A4aBtn {
+          position: absolute;
+          top: 50%;
+          right: 20px;
+          transform: translateY(-50%);
+        }
+      }
+    }
+  }
+}

+ 173 - 0
后台管理/src/pages/A4antique/A4add/index.tsx

@@ -0,0 +1,173 @@
+import React, { useCallback, useEffect, useRef } from 'react'
+import styles from './index.module.scss'
+import { A1ListSelectType } from '@/pages/A1record/data'
+import { Button, Form, FormInstance, Input, Select } from 'antd'
+import { A4_APIgetInfo, A4_APIsave } from '@/store/action/A4antique'
+import { MessageFu } from '@/utils/message'
+import TextArea from 'antd/es/input/TextArea'
+import ZupTypes from '@/components/ZupTypes'
+import MyPopconfirm from '@/components/MyPopconfirm'
+
+type Props = {
+  sId: number
+  closeFu: () => void
+  addTableFu: () => void
+  upTableFu: () => void
+  listAllRes: A1ListSelectType
+  // 从烈士档案中进来
+  martyrId?: number
+}
+
+function A4add({ sId, closeFu, addTableFu, upTableFu, listAllRes, martyrId }: Props) {
+  // 表单的ref
+  const FormBoxRef = useRef<FormInstance>(null)
+
+  // 多张图片的ref
+  const ZupImgsRef = useRef<any>(null)
+
+  // 编辑进来获取详情
+  const getInfoFu = useCallback(async (id: number) => {
+    const res = await A4_APIgetInfo(id)
+    if (res.code === 0) {
+      const obj = res.data
+
+      // 线索地址
+      if (obj.province) obj.myCity = [obj.province]
+      if (obj.city) obj.myCity.push(obj.city)
+      if (obj.region) obj.myCity.push(obj.region)
+
+      FormBoxRef.current?.setFieldsValue(obj)
+    }
+
+    const file = res.data.img || []
+    // 传给 附件 组件的
+    const sonInfo = {
+      type: 'img',
+      fileList: file
+    }
+    ZupImgsRef.current?.setFileComFileFu(sonInfo)
+  }, [])
+
+  useEffect(() => {
+    if (sId > 0) getInfoFu(sId)
+    if (martyrId) FormBoxRef.current?.setFieldsValue({ martyrId })
+  }, [getInfoFu, martyrId, sId])
+
+  // 没有通过校验
+  const onFinishFailed = useCallback(() => {}, [])
+
+  //  通过校验点击确定
+  const onFinish = useCallback(
+    async (values: any) => {
+      // 多张图片
+      const { sonFileIds, sonIsOk, coverUrl, coverUrlBig } = ZupImgsRef.current?.fileComFileResFu()
+
+      const obj = {
+        ...values,
+        id: sId > 0 ? sId : null,
+        thumb: coverUrl || '',
+        thumbPc: coverUrlBig || '',
+        imgIds: sonIsOk ? '' : sonFileIds.join(',')
+      }
+
+      const res = await A4_APIsave(obj)
+      if (res.code === 0) {
+        MessageFu.success(sId > 0 ? '编辑成功' : '新增成功')
+        sId > 0 ? upTableFu() : addTableFu()
+        closeFu()
+      }
+    },
+    [addTableFu, closeFu, sId, upTableFu]
+  )
+
+  const formDomRef = useRef<HTMLDivElement>(null)
+
+  return (
+    <div className={styles.A4add} style={{ position: martyrId ? 'fixed' : 'absolute' }}>
+      <div className='A4addMain'>
+        <div className='A4aTit'>{sId > 0 ? '编辑' : '新增'}文物</div>
+
+        <div className='A4accc' ref={formDomRef}>
+          <div>
+            <Form
+              ref={FormBoxRef}
+              name='basic'
+              onFinish={onFinish}
+              onFinishFailed={onFinishFailed}
+              autoComplete='off'
+              scrollToFirstError
+            >
+              <div className='A4aRow'>
+                <Form.Item
+                  label='文物名称'
+                  name='name'
+                  rules={[{ required: true, message: '请输入文物名称' }]}
+                  // getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
+                  getValueFromEvent={e => e.target.value.trim()}
+                >
+                  <Input maxLength={50} showCount placeholder='请输入内容' />
+                </Form.Item>
+
+                <Form.Item
+                  label='关联烈士'
+                  name='martyrId'
+                  rules={[{ required: true, message: '请选择关联烈士' }]}
+                >
+                  <Select
+                    disabled={!!martyrId}
+                    getPopupContainer={() => formDomRef.current!}
+                    filterOption={(input, option) =>
+                      (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
+                    }
+                    placeholder='请搜索并选择'
+                    showSearch
+                    options={listAllRes}
+                  />
+                </Form.Item>
+              </div>
+
+              {/* 多个图片 */}
+              <div className='formRow'>
+                <div className='formLeft'>图片:</div>
+                <div className='formRight'>
+                  <ZupTypes
+                    ref={ZupImgsRef}
+                    isLook={false}
+                    fileCheck={false}
+                    selecFlag='图片'
+                    imgSize={5}
+                    imgLength={50}
+                    dirCode='A4antique'
+                    myUrl='cms/relic/upload'
+                    isTypeShow={true}
+                    oneIsCover={true}
+                  />
+                </div>
+              </div>
+
+              <div className='A4aRowAll'>
+                <Form.Item label='文物介绍' name='intro'>
+                  <TextArea maxLength={500} showCount placeholder='请输入内容' />
+                </Form.Item>
+              </div>
+
+              {/* 确定和取消按钮 */}
+              <Form.Item className='A4aBtn'>
+                <Button type='primary' htmlType='submit'>
+                  提交
+                </Button>
+                <br />
+                <br />
+                <MyPopconfirm txtK='取消' onConfirm={closeFu} />
+              </Form.Item>
+            </Form>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+const MemoA4add = React.memo(A4add)
+
+export default MemoA4add

+ 14 - 0
后台管理/src/pages/A4antique/data.ts

@@ -0,0 +1,14 @@
+export type A4ListType = {
+  createTime: string
+  creatorId: number
+  creatorName: string
+  id: number
+  img?: any
+  imgIds: string
+  intro: string
+  martyrId: number
+  name: string
+  thumb: string
+  thumbPc: string
+  updateTime: string
+}

+ 30 - 0
后台管理/src/pages/A4antique/index.module.scss

@@ -1,4 +1,34 @@
 .A4antique {
   :global {
+    .A4top {
+      padding: 15px 24px;
+      border-radius: 10px;
+      background-color: #fff;
+      display: flex;
+      justify-content: space-between;
+
+      .A4topLeft {
+        display: flex;
+
+        & > div {
+          margin-right: 24px;
+          .ant-btn {
+            margin-right: 10px;
+          }
+        }
+      }
+    }
+
+    .A4tableBox {
+      border-radius: 10px;
+      overflow: hidden;
+      margin-top: 15px;
+      height: calc(100% - 77px);
+      background-color: #fff;
+
+      .ant-table-cell {
+        padding: 8px !important;
+      }
+    }
   }
 }

+ 184 - 2
后台管理/src/pages/A4antique/index.tsx

@@ -1,9 +1,191 @@
-import React from 'react'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
 import styles from './index.module.scss'
+import { useDispatch, useSelector } from 'react-redux'
+import { A1ListSelectType, A1ListType } from '../A1record/data'
+import { A1_APIgetList } from '@/store/action/A1record'
+import { A4_APIdel, A4_APIgetList } from '@/store/action/A4antique'
+import { RootState } from '@/store'
+import { MessageFu } from '@/utils/message'
+import { Button, Input, Select } from 'antd'
+import MyPopconfirm from '@/components/MyPopconfirm'
+import MyTable from '@/components/MyTable'
+import { A4tableC } from '@/utils/tableData'
+import A4add from './A4add'
+
+const baseFromData = {
+  pageNum: 1,
+  pageSize: 10,
+  searchKey: '',
+  martyrId: ''
+}
+
 function A4antique() {
+  const dispatch = useDispatch()
+
+  // 获取所有烈士信息
+  const [listAllRes, setListAllRes] = useState<A1ListSelectType>([])
+
+  const getListAllFu = useCallback(async () => {
+    const res = await A1_APIgetList(
+      {
+        pageNum: 1,
+        pageSize: 99999
+      },
+      true
+    )
+    if (res.code === 0) {
+      const list: A1ListType[] = res.data.records || []
+      setListAllRes(
+        list.map(c => ({
+          value: c.id,
+          label: c.name
+        }))
+      )
+    }
+  }, [])
+
+  useEffect(() => {
+    getListAllFu()
+  }, [getListAllFu])
+  // 获取所有烈士信息-end
+
+  const [fromData, setFromData] = useState(baseFromData)
+
+  const getListFu = useCallback(() => {
+    dispatch(A4_APIgetList(fromData))
+  }, [dispatch, fromData])
+
+  useEffect(() => {
+    getListFu()
+  }, [getListFu])
+
+  const tableInfo = useSelector((state: RootState) => state.A4antique.tableInfo)
+
+  // 点击重置
+  const resetSelectFu = useCallback(() => {
+    setInputKey(Date.now())
+    setFromData({ ...baseFromData })
+  }, [])
+
+  // 下拉框的改变
+  const selectChangeFu = useCallback(
+    (value: any, key: 'martyrId') => {
+      setFromData({ ...fromData, [key]: value, pageNum: 1 })
+    },
+    [fromData]
+  )
+
+  // 作品名称的输入
+  const timeRef = useRef(-1)
+  const [inputKey, setInputKey] = useState(0)
+  const fromKeyChangeFu = useCallback(
+    (e: React.ChangeEvent<HTMLInputElement>, key: 'searchKey') => {
+      clearTimeout(timeRef.current)
+      timeRef.current = window.setTimeout(() => {
+        setFromData({ ...fromData, [key]: e.target.value, pageNum: 1 })
+      }, 500)
+    },
+    [fromData]
+  )
+
+  // 点击新增、编辑
+  const [editId, setEditId] = useState(0)
+
+  // 点击删除
+  const delTableFu = useCallback(
+    async (id: number) => {
+      const res = await A4_APIdel(id)
+      if (res.code === 0) {
+        MessageFu.success('删除成功!')
+        getListFu()
+      }
+    },
+    [getListFu]
+  )
+
+  const tableLastBtn = useMemo(() => {
+    return [
+      {
+        title: '操作',
+        render: (item: any) => {
+          return (
+            <>
+              <Button size='small' type='text' onClick={() => setEditId(item.id)}>
+                编辑
+              </Button>
+              <MyPopconfirm txtK='删除' onConfirm={() => delTableFu(item.id)} />
+            </>
+          )
+        }
+      }
+    ]
+  }, [delTableFu])
+
   return (
     <div className={styles.A4antique}>
-      <div className='pageTitle'>烈士文物</div>
+      <div className='pageTitle'>烈士文物{editId ? (editId > 0 ? ' - 编辑' : ' - 新增') : ''}</div>
+      {/* 顶部筛选 */}
+      <div className='A4top'>
+        <div className='A4topLeft'>
+          <div>
+            <Input
+              key={inputKey}
+              maxLength={30}
+              showCount
+              style={{ width: 300 }}
+              placeholder='请输入文物名称'
+              allowClear
+              onChange={e => fromKeyChangeFu(e, 'searchKey')}
+            />
+          </div>
+
+          <div>
+            <Select
+              style={{ width: 240 }}
+              filterOption={(input, option) =>
+                (option?.label ?? '').toLowerCase().includes(input.toLowerCase())
+              }
+              allowClear
+              placeholder='搜索并选择关联烈士'
+              showSearch
+              options={listAllRes}
+              value={fromData.martyrId || null}
+              onChange={e => selectChangeFu(e, 'martyrId')}
+            />
+          </div>
+        </div>
+
+        <div>
+          <Button onClick={resetSelectFu}>重置</Button>
+          &emsp;
+          <Button type='primary' onClick={() => setEditId(-1)}>
+            新增
+          </Button>
+        </div>
+      </div>
+
+      {/* 表格主体 */}
+      <div className='A4tableBox'>
+        <MyTable
+          yHeight={645}
+          list={tableInfo.list}
+          columnsTemp={A4tableC}
+          lastBtn={tableLastBtn}
+          pageNum={fromData.pageNum}
+          pageSize={fromData.pageSize}
+          total={tableInfo.total}
+          onChange={(pageNum, pageSize) => setFromData({ ...fromData, pageNum, pageSize })}
+        />
+      </div>
+      {editId ? (
+        <A4add
+          sId={editId}
+          closeFu={() => setEditId(0)}
+          addTableFu={resetSelectFu}
+          upTableFu={getListFu}
+          listAllRes={listAllRes}
+        />
+      ) : null}
     </div>
   )
 }

+ 26 - 0
后台管理/src/pages/A5introduce/A5add/index.module.scss

@@ -0,0 +1,26 @@
+.A5add {
+  :global {
+    .ant-modal-close {
+      display: none;
+    }
+    .ant-modal {
+      width: 1050px !important;
+    }
+    .A1main {
+      border-top: 1px solid #ccc;
+      padding-top: 15px;
+      // 富文本
+      .formRightZWRR {
+        position: absolute;
+        left: 0;
+        & > div {
+          margin-left: 0 !important;
+        }
+      }
+    }
+    .A1btn {
+      margin-top: 20px;
+      text-align: center;
+    }
+  }
+}

+ 78 - 0
后台管理/src/pages/A5introduce/A5add/index.tsx

@@ -0,0 +1,78 @@
+import React, { useCallback, useEffect, useRef } from 'react'
+import styles from './index.module.scss'
+import { Button, Modal } from 'antd'
+import MyPopconfirm from '@/components/MyPopconfirm'
+import ZRichTexts from '@/components/ZRichTexts'
+import { MessageFu } from '@/utils/message'
+import { A5ListType } from '../data'
+import { A5_APIsave } from '@/store/action/A5A5introduce'
+
+type Props = {
+  sInfo: A5ListType
+  closeFu: () => void
+  upTableFu: () => void
+}
+
+function A5add({ sInfo, closeFu, upTableFu }: Props) {
+  // 富文本的ref
+  const ZRichTextRef = useRef<any>(null)
+
+  useEffect(() => {
+    if (sInfo.id > 0) {
+      // 设置富文本
+      if (sInfo.rtf) ZRichTextRef.current?.ritxtShowFu(JSON.parse(sInfo.rtf))
+    }
+  }, [sInfo])
+
+  const addBtn = useCallback(async () => {
+    // 富文本
+    const rtf = ZRichTextRef.current?.fatherBtnOkFu() || { flag: true }
+
+    const obj = {
+      ...sInfo,
+      rtf: JSON.stringify(rtf.val || '')
+    }
+    const res = await A5_APIsave(obj)
+    if (res.code === 0) {
+      MessageFu.success(sInfo.id > 0 ? '编辑成功' : '新增成功')
+      upTableFu()
+      closeFu()
+    }
+  }, [closeFu, sInfo, upTableFu])
+
+  return (
+    <Modal
+      wrapClassName={styles.A5add}
+      open={true}
+      title='编辑展馆介绍'
+      footer={
+        [] // 设置footer为空,去掉 取消 确定默认按钮
+      }
+    >
+      <div className='A1main'>
+        <ZRichTexts
+          check={false}
+          dirCode='A5introduce'
+          myUrl='cms/exhibition/upload'
+          isLook={false}
+          ref={ZRichTextRef}
+          isOne={true}
+          upAudioBtnNone={true}
+          imgOne
+        />
+      </div>
+
+      <div className='A1btn'>
+        <Button type='primary' onClick={addBtn}>
+          提交
+        </Button>
+        &emsp;
+        <MyPopconfirm txtK='取消' onConfirm={closeFu} />
+      </div>
+    </Modal>
+  )
+}
+
+const MemoA5add = React.memo(A5add)
+
+export default MemoA5add

+ 11 - 0
后台管理/src/pages/A5introduce/data.ts

@@ -0,0 +1,11 @@
+export type A5ListType = {
+  createTime: string
+  creatorId?: any
+  creatorName: string
+  id: number
+  name: string
+  rtf: string
+  thumb: string
+  type: string
+  updateTime: string
+}

+ 25 - 0
后台管理/src/pages/A5introduce/index.module.scss

@@ -1,4 +1,29 @@
 .A5introduce {
+  background-color: #fff;
+  border-radius: 10px;
+  padding: 15px 24px;
   :global {
+    .A5main {
+      display: flex;
+      justify-content: space-between;
+      height: 100%;
+      .A5ll {
+        width: calc(100% - 80px);
+        height: 100%;
+
+        padding-right: 10px;
+        & > div {
+          font-size: 16px;
+          height: 100%;
+          overflow: auto;
+          p {
+            min-height: 20px;
+          }
+          .image-wrap {
+            text-align: center;
+          }
+        }
+      }
+    }
   }
 }

+ 40 - 1
后台管理/src/pages/A5introduce/index.tsx

@@ -1,9 +1,48 @@
-import React from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
 import styles from './index.module.scss'
+import { Button } from 'antd'
+import { textFu } from '@/utils/history'
+import A5add from './A5add'
+import { A5_APIgetList } from '@/store/action/A5A5introduce'
+import { useDispatch, useSelector } from 'react-redux'
+import { A5ListType } from './data'
+import { RootState } from '@/store'
+
 function A5introduce() {
+  const dispatch = useDispatch()
+
+  const getInfoFu = useCallback(async () => {
+    dispatch(A5_APIgetList())
+  }, [dispatch])
+
+  useEffect(() => {
+    getInfoFu()
+  }, [getInfoFu])
+
+  const info = useSelector((state: RootState) => state.A5introduce.info)
+
+  // 新增和编辑
+  const [addInfo, setAddInfo] = useState({} as A5ListType)
+
   return (
     <div className={styles.A5introduce}>
       <div className='pageTitle'>展馆介绍</div>
+      {info.id ? (
+        <div className='A5main'>
+          <div className='A5ll'>
+            <div dangerouslySetInnerHTML={{ __html: textFu(info.rtf) || '(空)' }}></div>
+          </div>
+          <div className='A5rr'>
+            <Button type='primary' onClick={() => setAddInfo(info)}>
+              编辑
+            </Button>
+          </div>
+        </div>
+      ) : null}
+
+      {addInfo.id ? (
+        <A5add sInfo={addInfo} closeFu={() => setAddInfo({} as A5ListType)} upTableFu={getInfoFu} />
+      ) : null}
     </div>
   )
 }

+ 9 - 0
后台管理/src/pages/A6statistics/data.ts

@@ -0,0 +1,9 @@
+export type A6ListType = {
+  createTime: string
+  name: string
+  creatorName: string
+  id: number
+  pcs: number
+  type: string
+  updateTime: string
+}

+ 51 - 0
后台管理/src/pages/A6statistics/index.module.scss

@@ -1,4 +1,55 @@
 .A6statistics {
+  background-color: #fff;
+  border-radius: 10px;
+  display: flex;
+  padding: 20px;
+  font-size: 16px;
   :global {
+    .A6ll {
+      width: 560px;
+
+      .A6ll1 {
+        border: 1px solid #ccc;
+        border-radius: 6px;
+        margin-bottom: 20px;
+        width: 100%;
+        height: 650px;
+        margin-bottom: 20px;
+        .A6llTit {
+          padding: 15px 20px 0 20px;
+          font-weight: 700;
+        }
+        .echBox {
+          width: 100%;
+          height: calc(100% - 40px);
+        }
+      }
+      .A6ll2 {
+        height: calc(100% - 670px);
+        border: 1px solid #ccc;
+        border-radius: 6px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        & > span {
+          font-weight: 700;
+        }
+      }
+    }
+    .A6rr {
+      border: 1px solid #ccc;
+      border-radius: 6px;
+
+      margin-left: 20px;
+      width: calc(100% - 580px);
+      padding: 15px 20px;
+      .A6rrTit {
+        margin-bottom: 15px;
+        font-weight: 700;
+      }
+      .ant-table-cell {
+        padding: 8px !important;
+      }
+    }
   }
 }

+ 155 - 1
后台管理/src/pages/A6statistics/index.tsx

@@ -1,9 +1,163 @@
-import React from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import styles from './index.module.scss'
+
+import * as echarts from 'echarts/core'
+import { TooltipComponent, LegendComponent } from 'echarts/components'
+import { PieChart } from 'echarts/charts'
+import { LabelLayout } from 'echarts/features'
+import { CanvasRenderer } from 'echarts/renderers'
+import { A6_APIgetList, A6_APIgetNum } from '@/store/action/A6statistics'
+import { A6ListType } from './data'
+import { useDispatch, useSelector } from 'react-redux'
+import { RootState } from '@/store'
+import MyTable from '@/components/MyTable'
+
+echarts.use([TooltipComponent, LegendComponent, PieChart, CanvasRenderer, LabelLayout])
+
 function A6statistics() {
+  const [JSnum, setJSNum] = useState(0)
+
+  const initFu = useCallback(async () => {
+    const res = await A6_APIgetNum()
+    if (res.code === 0) {
+      const list: A6ListType[] = res.data
+      const obj = list.find(v => v.id === 7)
+      if (obj) setJSNum(obj.pcs)
+
+      // 去掉最后一个
+      const listRes = list.filter(v => v.id !== 7)
+
+      const maxNum = listRes.reduce((accumulator, currentObj) => accumulator + currentObj.pcs, 0)
+
+      const data = listRes.map(c => ({ value: c.pcs, name: c.name }))
+
+      const dom: HTMLDivElement = document.querySelector('.echBox')!
+      const myChart = echarts.getInstanceByDom(dom) || echarts.init(dom)
+
+      // 创建名称到数值的映射(用于图例显示)
+      const nameToValueMap: any = {}
+      data.forEach(item => {
+        nameToValueMap[item.name] = item.value
+      })
+
+      const option = {
+        tooltip: {
+          trigger: 'item',
+          show: true
+        },
+        legend: {
+          // 图例移动到底部并竖向排列
+          orient: 'vertical',
+          bottom: '2%', // 距离底部5%的位置
+          left: 'center', // 右侧定位
+          itemGap: 15, // 图例项间距[6,8](@ref)
+          itemHeight: 12, // 图例图标高度[6](@ref)
+
+          // 自定义图例文本(显示名称+数值)
+          formatter: function (name: string) {
+            return `${name}: ${nameToValueMap[name]}`
+          },
+          textStyle: {
+            fontSize: 14,
+            rich: {
+              value: {
+                fontWeight: 'bold',
+                color: '#1890ff'
+              }
+            }
+          }
+        },
+        series: [
+          {
+            name: '',
+            type: 'pie',
+            radius: ['40%', '70%'],
+            center: ['50%', '36%'],
+            avoidLabelOverlap: false,
+            itemStyle: {
+              borderRadius: 10,
+              borderColor: '#fff',
+              borderWidth: 2
+            },
+            label: {
+              show: true,
+              position: 'center',
+              fontSize: 18,
+              fontWeight: 'bold',
+              color: '#333',
+              formatter: `总访问量\n\n{c|${maxNum} 次}`,
+              rich: {
+                c: { color: '#1890ff' }
+              }
+            },
+            // 修复中心文字消失问题[9,10](@ref)
+            emphasis: {
+              label: {
+                show: true // 关键修改:悬停时保持中心文字显示
+              },
+              itemStyle: {
+                shadowBlur: 10,
+                shadowColor: 'rgba(0, 0, 0, 0.5)'
+              }
+            },
+            labelLine: {
+              show: false
+            },
+            data: data
+          }
+        ]
+      }
+      option && myChart.setOption(option)
+    }
+  }, [])
+
+  useEffect(() => {
+    initFu()
+  }, [initFu])
+
+  // 获取列表数据
+  const dispatch = useDispatch()
+  const { list } = useSelector((state: RootState) => state.A6statistics.info)
+
+  useEffect(() => {
+    dispatch(A6_APIgetList())
+  }, [dispatch])
+
+  const tableLastBtn = useMemo(() => {
+    return [
+      {
+        title: '访问次数',
+        width: 200,
+        render: (item: A6ListType) => item.pcs || 0
+      }
+    ]
+  }, [])
+
   return (
     <div className={styles.A6statistics}>
       <div className='pageTitle'>数据统计</div>
+
+      <div className='A6ll'>
+        <div className='A6ll1'>
+          <div className='A6llTit'>线上展馆访问量</div>
+
+          {/* ech dom */}
+          <div className='echBox'></div>
+        </div>
+        <div className='A6ll2'>
+          <span>祭扫人次:</span>&emsp;{JSnum}人次
+        </div>
+      </div>
+      <div className='A6rr'>
+        <div className='A6rrTit'>馆藏文物</div>
+        <MyTable
+          yHeight={675}
+          list={list}
+          columnsTemp={[['txt', '藏品名称', 'name']]}
+          lastBtn={tableLastBtn}
+          pagingInfo={false}
+        />
+      </div>
     </div>
   )
 }

+ 6 - 7
后台管理/src/pages/Layout/data.ts

@@ -7,38 +7,37 @@ const tabLeftArr: RouterType = [
     name: '内容管理',
     son: [
       {
-        id: 101,
+        id: 200,
         name: '烈士档案',
         path: '/',
         Com: React.lazy(() => import('../A1record'))
       },
       {
-        id: 102,
+        id: 300,
         name: '线索管理',
         path: '/clue',
         Com: React.lazy(() => import('../A2clue'))
       },
       {
-        id: 103,
+        id: 400,
         name: '亲属信息',
         path: '/clan',
         Com: React.lazy(() => import('../A3clan'))
       },
       {
-        id: 104,
+        id: 500,
         name: '烈士文物',
         path: '/antique',
         Com: React.lazy(() => import('../A4antique'))
       },
       {
-        id: 105,
+        id: 600,
         name: '展馆介绍',
         path: '/introduce',
         Com: React.lazy(() => import('../A5introduce'))
       },
       {
-        // 待完善id
-        id: 106,
+        id: 700,
         name: '数据统计',
         path: '/statistics',
         Com: React.lazy(() => import('../A6statistics'))

+ 54 - 52
后台管理/src/pages/Layout/index.tsx

@@ -18,7 +18,8 @@ import NotFound from '@/components/NotFound'
 import { RouterType, RouterTypeRow } from '@/types'
 import tabLeftArr from './data'
 import MyPopconfirm from '@/components/MyPopconfirm'
-// import { Z1_APIgetAuthByUserId } from "@/store/action/Z1user";
+import { Z1_APIgetAuthByUserId } from '@/store/action/Z1user'
+import { UserListType } from '../Z1user/Z1auth'
 
 function Layout() {
   // 当前路径选中的左侧菜单
@@ -37,62 +38,62 @@ function Layout() {
   const getUserAuthFu = useCallback(async () => {
     const userInfo = getTokenInfo().user
 
-    // const res = await Z1_APIgetAuthByUserId(userInfo.id);
-    // if (res.code === 0) {
-    // 这里后台返回的一层的数据。懒得改逻辑,手动修改成2级的数据
-    // res.data = [
-    //   {
-    //     id: Date.now(),
-    //     name: "",
-    //     children: res.data,
-    //   },
-    // ];
-
-    const isOkIdArr: number[] = [101, 102, 103, 104, 105]
-    // const tempList: UserListType[] = res.data || [];
-    // console.log(123, tempList);
-    // tempList.forEach((v) => {
-    //   if (v.children) {
-    //     v.children.forEach((c) => {
-    //       if (c.authority) isOkIdArr.push(c.id);
-    //     });
-    //   }
-    // });
-    // 是管理员
-    if (userInfo.isAdmin === 1) {
-      isOkIdArr.push(2100)
-      isOkIdArr.push(2200)
-    }
+    const res = await Z1_APIgetAuthByUserId(userInfo.id)
+    if (res.code === 0) {
+      // 这里后台返回的一层的数据。懒得改逻辑,手动修改成2级的数据
+      res.data = [
+        {
+          id: Date.now(),
+          name: '',
+          children: res.data
+        }
+      ]
+
+      const isOkIdArr: number[] = []
+      const tempList: UserListType[] = res.data || []
+      // console.log(123, tempList);
+      tempList.forEach(v => {
+        if (v.children) {
+          v.children.forEach(c => {
+            if (c.authority) isOkIdArr.push(c.id)
+          })
+        }
+      })
+      // 是管理员
+      if (userInfo.isAdmin === 1) {
+        isOkIdArr.push(2100)
+        isOkIdArr.push(2200)
+      }
 
-    const tempArr: RouterTypeRow = []
+      const tempArr: RouterTypeRow = []
 
-    tabLeftArr.forEach(v1 => {
-      if (v1.son && v1.son[0]) {
-        v1.son.forEach(v2 => {
-          if (isOkIdArr.includes(v2.id)) {
-            tempArr.push(v2)
-          }
-        })
-      }
-    })
+      tabLeftArr.forEach(v1 => {
+        if (v1.son && v1.son[0]) {
+          v1.son.forEach(v2 => {
+            if (isOkIdArr.includes(v2.id)) {
+              tempArr.push(v2)
+            }
+          })
+        }
+      })
 
-    setRouterCom(tempArr)
+      setRouterCom(tempArr)
 
-    // 如果当前页面没有权限了,跳转有权限的第一个页面
-    const urlAll = window.location.hash
-    const isNowPath = urlAll.replace('#', '')
-    const pathArr = tempArr.map(v => v.path)
-    if (!pathArr.includes(isNowPath)) {
-      history.push(pathArr[0])
-    }
+      // 如果当前页面没有权限了,跳转有权限的第一个页面
+      const urlAll = window.location.hash
+      const isNowPath = urlAll.replace('#', '')
+      const pathArr = tempArr.map(v => v.path)
+      if (!pathArr.includes(isNowPath)) {
+        history.push(pathArr[0])
+      }
 
-    const resList = tabLeftArr.map(v => ({
-      ...v,
-      son: v.son.filter(c => isOkIdArr.includes(c.id))
-    }))
+      const resList = tabLeftArr.map(v => ({
+        ...v,
+        son: v.son.filter(c => isOkIdArr.includes(c.id))
+      }))
 
-    setList(resList)
-    // }
+      setList(resList)
+    }
   }, [])
 
   useEffect(() => {
@@ -153,7 +154,8 @@ function Layout() {
       {/* 左边 */}
       <div className='layoutLeft'>
         <div className='layoutLeftTop'>
-          <img src={logoImg} alt='' />
+          {/* 待完善 */}
+          <img src={logoImg} alt='' style={{ opacity: 0 }} />
         </div>
         {/* 左边主体 */}
         <div className='layoutLeftMain'>

+ 1 - 6
后台管理/src/pages/Login/index.tsx

@@ -10,8 +10,6 @@ import history from '@/utils/history'
 import { MessageFu } from '@/utils/message'
 import { API_LoginGetCode, userLoginAPI } from '@/store/action/layout'
 import title_2 from '@/assets/img/title_2.png'
-import title from '@/assets/img/title.png'
-import pic from '@/assets/img/pic.png'
 
 export default function Login() {
   // 获取验证码
@@ -75,10 +73,7 @@ export default function Login() {
 
   return (
     <div className={styles.Login}>
-      <div className='mainLeft'>
-        <img className='loLeImg1' src={title} alt='' />
-        <img className='loLeImg2' src={pic} alt='' />
-      </div>
+      <div className='mainLeft'>{/* 待完善 */}</div>
 
       <div className='mainRight'>
         {/* logg */}

+ 14 - 14
后台管理/src/pages/Z1user/Z1auth.tsx

@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import styles from './index.module.scss'
 import { Button, Checkbox, Modal } from 'antd'
 import MyPopconfirm from '@/components/MyPopconfirm'
-import { Z1_APIsetAuth } from '@/store/action/Z1user'
+import { Z1_APIgetAuthByUserId, Z1_APIsetAuth } from '@/store/action/Z1user'
 import classNmaes from 'classnames'
 import { MessageFu } from '@/utils/message'
 
@@ -23,19 +23,19 @@ type Props = {
 
 function Z1auth({ authInfo, closeFu }: Props) {
   const getAuthByUserIdFu = useCallback(async () => {
-    // const res = await Z1_APIgetAuthByUserId(authInfo.id);
-    // if (res.code === 0) {
-    //   // 这里后台返回的一层的数据。懒得改逻辑,手动修改成2级的数据
-    //   setList([
-    //     {
-    //       id: Date.now(),
-    //       name: "",
-    //       children: res.data,
-    //     },
-    //   ]);
-    //   // setList(res.data)
-    // }
-  }, [])
+    const res = await Z1_APIgetAuthByUserId(authInfo.id)
+    if (res.code === 0) {
+      // 这里后台返回的一层的数据。懒得改逻辑,手动修改成2级的数据
+      setList([
+        {
+          id: Date.now(),
+          name: '',
+          children: res.data
+        }
+      ])
+      // setList(res.data)
+    }
+  }, [authInfo.id])
 
   useEffect(() => {
     getAuthByUserIdFu()

+ 5 - 7
后台管理/src/pages/Z1user/index.tsx

@@ -113,15 +113,13 @@ function Z1user() {
                   </Button>
                 }
               />
-              {/* <Button
-                size="small"
-                type="text"
-                onClick={() =>
-                  setAuthInfo({ id: item.id, name: item.userName })
-                }
+              <Button
+                size='small'
+                type='text'
+                onClick={() => setAuthInfo({ id: item.id, name: item.userName })}
               >
                 权限管理
-              </Button> */}
+              </Button>
               <Button size='small' type='text' onClick={() => openEditPageFu(item.id)}>
                 编辑
               </Button>

+ 42 - 0
后台管理/src/store/action/A4antique.ts

@@ -0,0 +1,42 @@
+import http from '@/utils/http'
+import { AppDispatch } from '..'
+/**
+ * 烈士文物-获取列表
+ */
+export const A4_APIgetList = (data: any, flag = false): any => {
+  if (flag) return http.post('cms/relic/pageList', data)
+  else {
+    return async (dispatch: AppDispatch) => {
+      const res = await http.post('cms/relic/pageList', data)
+      if (res.code === 0) {
+        const obj = {
+          list: res.data.records,
+          total: res.data.total
+        }
+
+        dispatch({ type: 'A4/getList', payload: obj })
+      }
+    }
+  }
+}
+
+/**
+ * 烈士文物-删除
+ */
+export const A4_APIdel = (id: number) => {
+  return http.get(`cms/relic/remove/${id}`)
+}
+
+/**
+ * 烈士文物-新增
+ */
+export const A4_APIsave = (data: any) => {
+  return http.post('cms/relic/save', data)
+}
+
+/**
+ * 烈士文物-获取详情
+ */
+export const A4_APIgetInfo = (id: number) => {
+  return http.get(`cms/relic/detail/${id}`)
+}

+ 20 - 0
后台管理/src/store/action/A5A5introduce.ts

@@ -0,0 +1,20 @@
+import http from '@/utils/http'
+import { AppDispatch } from '..'
+/**
+ * 展馆介绍-获取信息
+ */
+export const A5_APIgetList = (id = 1): any => {
+  return async (dispatch: AppDispatch) => {
+    const res = await http.get(`cms/exhibition/detail/${id}`)
+    if (res.code === 0) {
+      dispatch({ type: 'A5/getInfo', payload: res.data || {} })
+    }
+  }
+}
+
+/**
+ * 展馆介绍-新增
+ */
+export const A5_APIsave = (data: any) => {
+  return http.post('cms/exhibition/save', data)
+}

+ 22 - 0
后台管理/src/store/action/A6statistics.ts

@@ -0,0 +1,22 @@
+import http from '@/utils/http'
+import { AppDispatch } from '..'
+/**
+ * 数据统计-获取文物列表
+ */
+export const A6_APIgetList = (): any => {
+  return async (dispatch: AppDispatch) => {
+    const res = await http.get(`cms/visit/getRelic`)
+    if (res.code === 0) {
+      console.log(1231, res)
+
+      dispatch({ type: 'A6/getInfo', payload: { list: res.data || {}, flag: true } })
+    }
+  }
+}
+
+/**
+ * 数据统计-获取访问量
+ */
+export const A6_APIgetNum = () => {
+  return http.get('cms/visit/getList')
+}

+ 3 - 3
后台管理/src/store/action/Z1user.ts

@@ -49,9 +49,9 @@ export const getUserInfoByIdAPI = (id: number) => {
 /**
  * 角色授权-获取
  */
-// export const Z1_APIgetAuthByUserId = (userId: number) => {
-//   return http.get(`sys/user/perm/getUserTree/${userId}`);
-// };
+export const Z1_APIgetAuthByUserId = (userId: number) => {
+  return http.get(`sys/user/perm/getUserTree/${userId}`)
+}
 
 /**
  * 角色授权-设置

+ 28 - 0
后台管理/src/store/reducer/A4antique.ts

@@ -0,0 +1,28 @@
+import { A4ListType } from '@/pages/A4antique/data'
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  tableInfo: {
+    list: [] as A4ListType[],
+    total: 0
+  }
+}
+
+// 定义 action 类型
+type Props = {
+  type: 'A4/getList'
+  payload: { list: A4ListType[]; total: number }
+}
+
+// reducer
+export default function userReducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case 'A4/getList':
+      return { ...state, tableInfo: action.payload }
+
+    default:
+      return state
+  }
+}

+ 25 - 0
后台管理/src/store/reducer/A5introduce.ts

@@ -0,0 +1,25 @@
+import { A5ListType } from '@/pages/A5introduce/data'
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  info: {} as A5ListType
+}
+
+// 定义 action 类型
+type Props = {
+  type: 'A5/getInfo'
+  payload: A5ListType
+}
+
+// reducer
+export default function userReducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case 'A5/getInfo':
+      return { ...state, info: action.payload }
+
+    default:
+      return state
+  }
+}

+ 25 - 0
后台管理/src/store/reducer/A6statistics.ts

@@ -0,0 +1,25 @@
+import { A6ListType } from '@/pages/A6statistics/data'
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  info: { list: [], flag: false } as { list: A6ListType[]; flag: boolean }
+}
+
+// 定义 action 类型
+type Props = {
+  type: 'A6/getInfo'
+  payload: { list: A6ListType[]; flag: boolean }
+}
+
+// reducer
+export default function userReducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case 'A6/getInfo':
+      return { ...state, info: action.payload }
+
+    default:
+      return state
+  }
+}

+ 6 - 0
后台管理/src/store/reducer/index.ts

@@ -6,6 +6,9 @@ import A0Layout from './layout'
 import A1record from './A1record'
 import A2clue from './A2clue'
 import A3clan from './A3clan'
+import A4antique from './A4antique'
+import A5introduce from './A5introduce'
+import A6statistics from './A6statistics'
 
 import Z1user from './Z1user'
 import Z2log from './Z2log'
@@ -16,6 +19,9 @@ const rootReducer = combineReducers({
   A1record,
   A2clue,
   A3clan,
+  A4antique,
+  A5introduce,
+  A6statistics,
   Z1user,
   Z2log
 })

+ 2 - 2
后台管理/src/utils/http.ts

@@ -7,8 +7,8 @@ import { domShowFu } from './domShow'
 
 const envFlag = process.env.NODE_ENV === 'development'
 
-// const baseUrlTemp = 'xxxxxxxxxxxxxxx' // 测试环境
-const baseUrlTemp = 'http://192.168.20.61:8104' // 线下环境
+const baseUrlTemp = 'https://sit-jinanlsly.4dage.com' // 测试环境
+// const baseUrlTemp = 'http://192.168.20.61:8104' // 线下环境
 
 const baseFlag = baseUrlTemp.includes('https://')
 

+ 7 - 0
后台管理/src/utils/tableData.ts

@@ -43,6 +43,13 @@ export const A3tableC = [
   ['text', '备注', 'remark', 80]
 ]
 
+export const A4tableC = [
+  ['txt', '文物名称', 'name'],
+  ['img', '文物图片', 'thumb'],
+  ['text', '文物介绍', 'intro', 80],
+  ['txt', '相关烈士', 'martyrName']
+]
+
 export const Z1tableC = [
   ['txt', '用户名', 'userName'],
   ['txtChange', '角色', 'isAdmin', { 1: '管理员', 0: '普通成员' }],