|
|
@@ -1,8 +1,17 @@
|
|
|
-import React, { useState, useEffect } from 'react'
|
|
|
+import React, { useState, useEffect, useRef } from 'react'
|
|
|
import styles from './index.module.scss'
|
|
|
import Select from 'antd/es/select'
|
|
|
import Pagination from 'antd/es/pagination'
|
|
|
import { isMobileFu } from '@/utils/history'
|
|
|
+import store from '@/store'
|
|
|
+
|
|
|
+import { Swiper, SwiperSlide } from 'swiper/react'
|
|
|
+import 'media-chrome';
|
|
|
+import 'swiper/css'
|
|
|
+import 'swiper/css/effect-coverflow'
|
|
|
+import 'swiper/css/pagination'
|
|
|
+import 'swiper/css/navigation'
|
|
|
+import { EffectCoverflow, Pagination as SwiperPagination, Navigation } from 'swiper/modules'
|
|
|
function Appreciate({
|
|
|
style,
|
|
|
setHidenComplete
|
|
|
@@ -16,6 +25,7 @@ function Appreciate({
|
|
|
const [searchText, setSearchText] = useState('')
|
|
|
const [textureFilter, setTextureFilter] = useState('all')
|
|
|
const [typeFilter, setTypeFilter] = useState('all')
|
|
|
+ const swiperRef = useRef<any>(null);
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (currentIndex !== undefined) {
|
|
|
@@ -23,57 +33,67 @@ function Appreciate({
|
|
|
} else {
|
|
|
setHidenComplete(false)
|
|
|
}
|
|
|
-
|
|
|
}, [currentIndex, setHidenComplete])
|
|
|
|
|
|
useEffect(() => {
|
|
|
- let filteredData = oreData;
|
|
|
+ let filteredData = oreData
|
|
|
if (textureFilter !== 'all') {
|
|
|
- filteredData = filteredData.filter(item => item.texture === textureFilter);
|
|
|
+ filteredData = filteredData.filter(item => item.texture === textureFilter)
|
|
|
}
|
|
|
if (typeFilter !== 'all') {
|
|
|
- filteredData = filteredData.filter(item => item.type === typeFilter);
|
|
|
+ filteredData = filteredData.filter(item => item.type === typeFilter)
|
|
|
}
|
|
|
- filteredData = filteredData.filter(item => item.title.includes(searchText));
|
|
|
- setOreData1(filteredData);
|
|
|
- }, [searchText, textureFilter, typeFilter]);
|
|
|
+ filteredData = filteredData.filter(item => item.title.includes(searchText))
|
|
|
+ setOreData1(filteredData)
|
|
|
+ }, [searchText, textureFilter, typeFilter])
|
|
|
|
|
|
return (
|
|
|
<div className={styles.Appreciate} style={style}>
|
|
|
<div className='top_A'>
|
|
|
- {isMobileFu() && <div className="txt_A">文物赏析</div>}
|
|
|
+ {isMobileFu() && <div className='txt_A'>文物赏析</div>}
|
|
|
<div className='search'>
|
|
|
- <input type='text' value={searchText} onChange={e => setSearchText(e.target.value)} placeholder='请输入要查找的文字信息' />
|
|
|
+ <input
|
|
|
+ type='text'
|
|
|
+ value={searchText}
|
|
|
+ onChange={e => setSearchText(e.target.value)}
|
|
|
+ placeholder='请输入要查找的文字信息'
|
|
|
+ />
|
|
|
<img src={require('@/assets/img/search.png')} alt='' />
|
|
|
</div>
|
|
|
- <div className='texture'>
|
|
|
- <div className='label'>质地:</div>
|
|
|
+
|
|
|
+ <div className='type'>
|
|
|
+ <div className='label'>文物类别:</div>
|
|
|
<Select
|
|
|
- defaultValue={textureFilter}
|
|
|
+ defaultValue={typeFilter}
|
|
|
options={[
|
|
|
{ value: 'all', label: '全部' },
|
|
|
- ...Array.from(new Set(oreData.map(item => item.texture)))
|
|
|
- .map(texture => ({ value: texture, label: texture }))
|
|
|
+ ...Array.from(new Set(oreData.map(item => item.type))).map(type => ({
|
|
|
+ value: type,
|
|
|
+ label: type
|
|
|
+ }))
|
|
|
]}
|
|
|
- onChange={value => setTextureFilter(value)}
|
|
|
+ onChange={value => setTypeFilter(value)}
|
|
|
/>
|
|
|
</div>
|
|
|
- <div className='type'>
|
|
|
- <div className='label'>文物类别:</div>
|
|
|
+ <div className='texture'>
|
|
|
+ <div className='label'>质地:</div>
|
|
|
<Select
|
|
|
- defaultValue={typeFilter}
|
|
|
+ defaultValue={textureFilter}
|
|
|
options={[
|
|
|
{ value: 'all', label: '全部' },
|
|
|
- ...Array.from(new Set(oreData.map(item => item.type)))
|
|
|
- .map(type => ({ value: type, label: type }))
|
|
|
+ ...Array.from(new Set(oreData.map(item => item.texture))).map(texture => ({
|
|
|
+ value: texture,
|
|
|
+ label: texture
|
|
|
+ }))
|
|
|
]}
|
|
|
- onChange={value => setTypeFilter(value)}
|
|
|
+ onChange={value => setTextureFilter(value)}
|
|
|
/>
|
|
|
</div>
|
|
|
+
|
|
|
<div className='total'>文物总数:{oreData.length}件</div>
|
|
|
</div>
|
|
|
<div className='content'>
|
|
|
- <div className="scroll">
|
|
|
+ <div className='scroll'>
|
|
|
{oreData1.map((item, index) => (
|
|
|
<div
|
|
|
className={`item ${currentIndex === index ? 'active' : ''}`}
|
|
|
@@ -87,34 +107,125 @@ function Appreciate({
|
|
|
</div>
|
|
|
))}
|
|
|
</div>
|
|
|
-
|
|
|
</div>
|
|
|
<div className='page'>
|
|
|
<Pagination defaultCurrent={1} total={50} />
|
|
|
</div>
|
|
|
- {currentIndex !== undefined && (
|
|
|
+ {currentIndex !== undefined && (oreData1[currentIndex].type === '三维' ? (
|
|
|
<div className='detail'>
|
|
|
- <iframe title='文物展示' src="https://4dscene.4dage.com/culturalrelics/demo2/Model.html?m=JN-RMYXjinianbei" allow="fullscreen" />
|
|
|
+ <iframe
|
|
|
+ title='文物展示'
|
|
|
+ src='https://4dscene.4dage.com/culturalrelics/demo2/Model.html?m=JN-RMYXjinianbei'
|
|
|
+ allow='fullscreen'
|
|
|
+ />
|
|
|
<div className={`info ${isShowInfo ? 'showInfo' : 'hideInfo'}`}>
|
|
|
- <div className='arrow' onClick={() => { isMobileFu() ? setIsShowInfo(true) : setIsShowInfo(false) }}>
|
|
|
- <img src={require(`@/assets/img/${isMobileFu() ? 'up' : 'left'}.png`)} alt='' />
|
|
|
+ <div
|
|
|
+ className='arrow'
|
|
|
+ onClick={() => {
|
|
|
+ isMobileFu() ? setIsShowInfo(true) : setIsShowInfo(false)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ src={require(`@/assets/img/${isMobileFu() ? 'up' : 'left'}.png`)}
|
|
|
+ alt=''
|
|
|
+ />
|
|
|
</div>
|
|
|
- <div className="content">
|
|
|
- <div className="title">{oreData1[currentIndex]?.title}</div>
|
|
|
- <div className="time">年代:{oreData1[currentIndex]?.year}</div>
|
|
|
- <div className="texture">质地:{oreData1[currentIndex]?.texture}</div>
|
|
|
- <div className="size">尺寸:{oreData1[currentIndex]?.size}</div>
|
|
|
+ <div className='content'>
|
|
|
+ <div className='title'>{oreData1[currentIndex]?.title}</div>
|
|
|
+ {/* <div className="time">年代:{oreData1[currentIndex]?.year}</div> */}
|
|
|
+ <div className='texture'>质地:{oreData1[currentIndex]?.texture}</div>
|
|
|
+ <div className='size'>尺寸:{oreData1[currentIndex]?.size}</div>
|
|
|
</div>
|
|
|
- <div className="arrow arrowR" onClick={() => { isMobileFu() ? setIsShowInfo(false) : setIsShowInfo(true) }}>
|
|
|
- <img src={require(`@/assets/img/${isMobileFu() ? 'down' : 'right'}.png`)} alt='' />
|
|
|
+ <div
|
|
|
+ className='arrow arrowR'
|
|
|
+ onClick={() => {
|
|
|
+ isMobileFu() ? setIsShowInfo(false) : setIsShowInfo(true)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ src={require(`@/assets/img/${isMobileFu() ? 'down' : 'right'}.png`)}
|
|
|
+ alt=''
|
|
|
+ />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div className='close' onClick={() => setCurrentIndex(undefined)}></div>
|
|
|
{/* <div className='bigger' onClick={handleScrollLeft}></div>
|
|
|
<div className='smaller' onClick={handleScrollRight}></div> */}
|
|
|
</div>
|
|
|
- )}
|
|
|
- </div>
|
|
|
+ ) : (
|
|
|
+ <div className='detail2'>
|
|
|
+ <div className='close' onClick={() => setCurrentIndex(undefined)}></div>
|
|
|
+ <Swiper
|
|
|
+ ref={swiperRef}
|
|
|
+ loop={false}
|
|
|
+ loopPreventsSliding={false}
|
|
|
+ effect={'slide'}
|
|
|
+ grabCursor={true}
|
|
|
+ centeredSlides={true}
|
|
|
+ slidesPerView={'1'}
|
|
|
+ coverflowEffect={{
|
|
|
+ rotate: 0,
|
|
|
+ stretch: 0,
|
|
|
+ depth: 0,
|
|
|
+ modifier: 1,
|
|
|
+ }}
|
|
|
+ pagination={{ el: '.swiper-pagination', clickable: true }}
|
|
|
+ navigation={{
|
|
|
+ prevEl: '.swiper-button-prev.swiper-button-arr-custom',
|
|
|
+ nextEl: '.swiper-button-next.swiper-button-arr-custom',
|
|
|
+ }}
|
|
|
+ modules={[EffectCoverflow, SwiperPagination, Navigation]}
|
|
|
+ className='swiper_container'
|
|
|
+ onTransitionEnd={(swiper: unknown) => {
|
|
|
+ const swiperInternal = swiper as { loopFix: () => void }
|
|
|
+ swiperInternal.loopFix()
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {currentIndex !== undefined && oreData1[currentIndex].imgList?.map((item: string, index: number) => (
|
|
|
+ <SwiperSlide key={index}>
|
|
|
+ <div
|
|
|
+ className='itemCard'
|
|
|
+ key={index}
|
|
|
+ >
|
|
|
+ <div className='itemImage'>
|
|
|
+
|
|
|
+ <img
|
|
|
+ onClick={() =>
|
|
|
+ store.dispatch({
|
|
|
+ type: 'layout/lookBigImg',
|
|
|
+ payload: {
|
|
|
+ url: item,
|
|
|
+ show: true
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ src={item}
|
|
|
+ alt=''
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </SwiperSlide>
|
|
|
+ ))}
|
|
|
+ </Swiper>
|
|
|
+ {/* 添加左右箭头元素 */}
|
|
|
+ <div className="swiper-button-prev swiper-button-arr-custom">
|
|
|
+ <img src={require('@/assets/img/left.png')} alt="上一张" />
|
|
|
+ </div>
|
|
|
+ <div className="swiper-button-next swiper-button-arr-custom">
|
|
|
+ <img src={require('@/assets/img/right.png')} alt="下一张" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className="detail2Info">
|
|
|
+ <div className="title">{oreData1[currentIndex]?.title}</div>
|
|
|
+ <div className="text">
|
|
|
+ <div className="texture">质地:{oreData1[currentIndex]?.texture}</div>
|
|
|
+ <div className="size">尺寸:{oreData1[currentIndex]?.size}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))
|
|
|
+ }
|
|
|
+ </div >
|
|
|
)
|
|
|
}
|
|
|
|