diff --git "a/src/assets/images/integration/danling/GIS\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/GIS\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..468991c40fac09ad77ea78de499532c153b68104 Binary files /dev/null and "b/src/assets/images/integration/danling/GIS\344\270\255\345\277\203.png" differ diff --git a/src/assets/images/integration/danling/title_left.png b/src/assets/images/integration/danling/title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..f1aba46f4b442ec60dc26d9b97284a7c7463ae44 Binary files /dev/null and b/src/assets/images/integration/danling/title_left.png differ diff --git a/src/assets/images/integration/danling/title_right.png b/src/assets/images/integration/danling/title_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e21e4477ed5f75399ac7fddbbb0c031cc83cc328 Binary files /dev/null and b/src/assets/images/integration/danling/title_right.png differ diff --git "a/src/assets/images/integration/danling/\344\270\232\345\212\241\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\344\270\232\345\212\241\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9f7fc0828ed4176d66aefd0d08fc6e5dbd0738d Binary files /dev/null and "b/src/assets/images/integration/danling/\344\270\232\345\212\241\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\345\216\202\347\253\231\347\256\241\347\220\206.png" "b/src/assets/images/integration/danling/\345\216\202\347\253\231\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc96d5ad6d68f35a2ab2e31a00ec900b6843501b Binary files /dev/null and "b/src/assets/images/integration/danling/\345\216\202\347\253\231\347\256\241\347\220\206.png" differ diff --git "a/src/assets/images/integration/danling/\346\212\245\350\255\246\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\346\212\245\350\255\246\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..1b5a7aabbd45ca94363f4ec6d486c88f0c584c4b Binary files /dev/null and "b/src/assets/images/integration/danling/\346\212\245\350\255\246\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\346\216\247\346\274\217\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\346\216\247\346\274\217\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..128c243ee7dbdf98cef7aa7f8ef7b8e630f35242 Binary files /dev/null and "b/src/assets/images/integration/danling/\346\216\247\346\274\217\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\346\225\260\346\215\256\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\346\225\260\346\215\256\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..abfd1dcaad51868be7b9389f6fd0da32e8de700f Binary files /dev/null and "b/src/assets/images/integration/danling/\346\225\260\346\215\256\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\346\260\264\350\264\250\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\346\260\264\350\264\250\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..c96ceed0dd389e61c22e11cc52d9a3ae58de3c19 Binary files /dev/null and "b/src/assets/images/integration/danling/\346\260\264\350\264\250\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\347\233\221\346\216\247\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\347\233\221\346\216\247\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..4c50d27c1fcf263350aa5fed8b9831d5c92da3a6 Binary files /dev/null and "b/src/assets/images/integration/danling/\347\233\221\346\216\247\344\270\255\345\277\203.png" differ diff --git "a/src/assets/images/integration/danling/\347\256\241\347\275\221\347\256\241\347\220\206.png" "b/src/assets/images/integration/danling/\347\256\241\347\275\221\347\256\241\347\220\206.png" new file mode 100644 index 0000000000000000000000000000000000000000..e26b518e0f41a08b0fd2575cb3e5cf6eed308194 Binary files /dev/null and "b/src/assets/images/integration/danling/\347\256\241\347\275\221\347\256\241\347\220\206.png" differ diff --git "a/src/assets/images/integration/danling/\350\203\214\346\231\257.png" "b/src/assets/images/integration/danling/\350\203\214\346\231\257.png" new file mode 100644 index 0000000000000000000000000000000000000000..32a89e0ebcff8aa06a09b2a5dbb9ef40a2ebda5f Binary files /dev/null and "b/src/assets/images/integration/danling/\350\203\214\346\231\257.png" differ diff --git "a/src/assets/images/integration/danling/\350\256\276\347\275\256\344\270\255\345\277\203.png" "b/src/assets/images/integration/danling/\350\256\276\347\275\256\344\270\255\345\277\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..883ec5016d98b85186717ba9280edebbb60ce9f7 Binary files /dev/null and "b/src/assets/images/integration/danling/\350\256\276\347\275\256\344\270\255\345\277\203.png" differ diff --git a/src/pages/bootpage/template/constants.js b/src/pages/bootpage/template/constants.js index 8196cc0496de859e979e57aa09914a383da648e3..cebcfbf43bbbf7c4311b149bde0053a23aba84aa 100644 --- a/src/pages/bootpage/template/constants.js +++ b/src/pages/bootpage/template/constants.js @@ -10,6 +10,8 @@ import IntegrationPage from './integration'; import IntegrationPage2 from './integration2'; import TaihuPage from './project/taihu'; import JimusaerPage from './project/jimusaer'; +import YixingPage from './project/yixing'; +import DanlingPage from './project/danling'; export const guidePage = [ // type 为true åˆ™éœ€è¦ åŠŸèƒ½é…ç½® isPanda 为true { @@ -28,6 +30,14 @@ export const guidePage = [ label: 'å‰å°”木è¨é›†æˆç™»å½•', value: 'jimusaerPage', }, + { + label: '宜兴集æˆç™»å½•', + value: 'yixingPage', + }, + { + label: '丹棱集æˆç™»å½•', + value: 'danlingPage', + }, { label: '演示环境(旧版)', type: true, @@ -45,5 +55,7 @@ export const BootPageTemplate = { integration2: IntegrationPage2, demonstration: Demonstration, taihuPage: TaihuPage, - jimusaerPage:JimusaerPage, + jimusaerPage: JimusaerPage, + yixingPage: YixingPage, + danlingPage: DanlingPage, }; diff --git a/src/pages/bootpage/template/project/danling/data.json b/src/pages/bootpage/template/project/danling/data.json new file mode 100644 index 0000000000000000000000000000000000000000..9cb96af0cb2c37eabf9f876ee8c2e93000c67b3a --- /dev/null +++ b/src/pages/bootpage/template/project/danling/data.json @@ -0,0 +1,66 @@ +{ + "listData": [ + { + "name": "厂站管ç†", + "english": "Factory Station Management", + "label": "", + "url": "" + }, + { + "name": "æ•°æ®ä¸å¿ƒ", + "english": "Data Center", + "label": "", + "url": "" + }, + { + "name": "æ°´è´¨ä¸å¿ƒ", + "english": "Water Quality Center", + "label": "", + "url": "" + }, + { + "name": "GISä¸å¿ƒ", + "english": "GIS System", + "label": "", + "url": "" + }, + { + "name": "控æ¼ä¸å¿ƒ", + "english": "Leakage Control Center", + "label": "", + "url": "" + }, + { + "name": "管网管ç†", + "english": "Pipeline Management", + "label": "", + "url": "" + }, + { + "name": "监控ä¸å¿ƒ", + "english": "Monitoring Center", + "label": "", + "url": "" + }, + { + "name": "业务ä¸å¿ƒ", + "english": "Business Center", + "label": "", + "url": "" + }, + { + "name": "报è¦ä¸å¿ƒ", + "english": "Alarm Center", + "label": "", + "url": "" + }, + { + "name": "设置ä¸å¿ƒ", + "english": "System Settings", + "label": "", + "url": "" + } + ], + "æ ‡é¢˜": "丹棱县农æ‘供水信æ¯åŒ–å¹³å°", + "å‰¯æ ‡é¢˜": "Danling County Rural Water Supply Information Platform" +} \ No newline at end of file diff --git a/src/pages/bootpage/template/project/danling/index.js b/src/pages/bootpage/template/project/danling/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4a760bd40e39d249ae883b4aaa41b062346ec616 --- /dev/null +++ b/src/pages/bootpage/template/project/danling/index.js @@ -0,0 +1,284 @@ +/* + * @Title: 丹棱 集æˆé¡µ + * @Author: hongmye + * @Date: 2024-08-05 18:34:42 + */ +import { appService } from '@/api'; +import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons'; +import { message, Button } from 'antd'; +import classNames from 'classnames'; +import { debounce } from 'lodash'; +import React, { useRef, useEffect, useState, useMemo } from 'react'; +import backImg from '@/assets/images/demonstration/返回.png'; +import arrowLeftImg from '@/assets/images/demonstration/å·¦ç®å¤´.png'; +import LoadPage from '@/components/LoadPage'; +// import $ from 'jquery'; +import { connect } from 'react-redux'; + +import useFullScreen from '../../demonstration/components/useFullScreen'; +import defaultConfig from './data.json'; +import styles from './index.less'; +import Iframe from '../../demonstration/components/Iframe'; +const boxWidth = 1920; +const boxHeight = 930; +// const Cripples = require('@/assets/js/ripples/jquery.ripples'); + +const IntegrationDanling = props => { + const [ref, isFullscreen, handleFullScreen, handleExitFullScreen] = useFullScreen(false); + const timer2 = useRef(null); + const timer3 = useRef(null); + + const progressRef2 = useRef(0); + // 退出 + const exit = () => { + if (isFullscreen) { + handleExitFullScreen && handleExitFullScreen(); + } else { + handleFullScreen && handleFullScreen(); + } + }; + const [boxSize, setBoxSize] = useState({ + scale: 1, + boxHeight: 930, + }); + const [linkUrl, setLinkUrl] = useState(''); + const [jumpLoading, setJumpLoading] = useState(false); + const [progressValue2, setProgressValue2] = useState(0); + const [showBackBtn, setShowBackBtn] = useState(true); // æ˜¯å¦æ˜¾ç¤ºiframe 返回按钮,三维平å°ç”¨ + + const configName = '宜兴集æˆé…置文件'; + + const [configData, setConfigData] = useState(defaultConfig); + + const jumpProgressStart = () => { + if (timer2.current) { + clearInterval(timer2.current); + timer2.current = null; + } + progressRef2.current = 0; + setProgressValue2(0); + timer2.current = setInterval(() => { + if (progressRef2.current < 97.5) { + progressRef2.current += 2.5; + setProgressValue2(progressRef2.current); + } else { + setProgressValue2(99); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + } + }, 100); + }; + const jumpProgressEnd = () => { + setProgressValue2(100); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + }; + const getData = async () => { + appService + .GetConfigJson({ + config: configName, + }) + .then(res => { + if (res.code === 0 && res.data) { + const data = JSON.parse(res.data) || defaultConfig; + setConfigData(data); + } + }); + }; + const onResize = () => { + if (ref?.current) { + const { clientWidth, clientHeight } = ref.current; + if (!boxWidth || !boxHeight) return; + const xScale = clientWidth / boxWidth; + const yScale = clientHeight / boxHeight; + const poor = clientHeight / clientWidth - boxHeight / boxWidth; + let n = Math.min(xScale, yScale); + let bHeight = boxHeight; + if (poor > 0.05) { + bHeight = boxHeight + 30; + } + // é«˜åº¦ä¸ºå¶æ•° + bHeight = parseInt(bHeight, 10); + if (bHeight % 2 !== 0) { + bHeight += 1; + } + n = Number(n.toFixed(4)); + setBoxSize({ + scale: n, + boxHeight: bHeight, + }); + } + }; + const handError = err => { + if (err) { + message.error(err); + } + setLinkUrl(''); + setJumpLoading(false); + jumpProgressEnd(); + }; + const onMessageBack = data => { + if (!data?.type) return; + console.log('onMessageBack ~ data:', data); + switch (data?.type) { + // 页é¢åŠ è½½å®Œæˆ + // 登录æˆåŠŸ + case 'runAfterFirstMounted': + case 'loginSuccess': + jumpProgressEnd(); + setTimeout(() => { + setJumpLoading(false); + }, 100); + break; + case 'loginError': + message.warning('登录失败,请è”系管ç†äººå‘˜'); + handError(); + break; + case 'æ— æ³•è¿žæŽ¥': + message.warning('è¯¥ç«™ç‚¹æ— æ³•è¿žæŽ¥ï¼Œè¯·è”系管ç†äººå‘˜'); + setTimeout(() => { + handError(); + }, 100); + break; + case 'showBack': + setShowBackBtn(true); + break; + case 'hideBack': + setShowBackBtn(false); + break; + default: + break; + } + }; + const iframeItem = useMemo(() => { + if (!linkUrl) return null; + return ( + <> + <div className={classNames(!jumpLoading ? styles.scaleInCenter : styles.hide, 'animate__animated')}> + <Iframe linkUrl={linkUrl} onMessageBack={onMessageBack} /> + </div> + </> + ); + }, [linkUrl, jumpLoading]); + const startTiming = (time = 2) => { + if (timer3.current) { + clearInterval(timer3.current); + timer3.current = null; + } + timer3.current = setTimeout(() => { + setJumpLoading(false); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + }, time * 1000); + }; + const onLink = url => { + if (!url) return message.warning('未é…置功能路径'); + setJumpLoading(true); + jumpProgressStart(); + + setLinkUrl(url); + let time = 15; + if (!url.includes('user/noscret')) { + time = 4; + } + startTiming(time); + }; + useEffect(() => { + getData(); + window.addEventListener('resize', debounce(onResize, 300)); + onResize(); + // setTimeout(() => { + // if ($('.CarouselRipples')) { + // $('.CarouselRipples').ripples({ + // resolution: 800, + // dropRadius: 20, // px + // perturbance: 2, + // }); + // } + // }, 1000); + return () => { + window.removeEventListener('resize', onResize); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + timer3.current && clearInterval(timer3.current); + timer3.current = null; + }; + }, []); + + return ( + <div className={classNames(styles.integrationDanling, 'integrationDanling')} ref={ref}> + {jumpLoading ? ( + <div className={styles.integrationJumpLoad} key="jumpLoading"> + <div style={{ width: '285px' }}> + <LoadPage percent={progressValue2 / 100} text="页é¢åŠ è½½ä¸~" /> + </div> + </div> + ) : null} + {!linkUrl ? ( + <div className={styles.integrationDanling_exit} onClick={exit}> + <Button type="text" style={{ color: '#fff', fontSize: '24px' }}> + {isFullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />} + </Button> + </div> + ) : null} + + <div + className={styles.integration_content} + style={{ + width: boxWidth, + height: boxSize.boxHeight, + transform: `scale(${boxSize.scale}) translate(-50%,-50%)`, + }} + > + <div className={styles.integrationDanling_title}> + <div className={styles.integrationDanling_icon}> + <img + src={ + props.global && + props.global.transformDevAssetsBaseURL && + props.global.transformDevAssetsBaseURL(props.global.logo) + } + alt="logo" + /> + </div> + <div className={styles.integrationDanling_title_text}> + <span>{configData?.['æ ‡é¢˜'] || '智慧水务综åˆç›‘控平å°'}</span> + </div> + </div> + <div className={styles.integrationDanling_title_sub}> + {configData?.['å‰¯æ ‡é¢˜'] || 'Danling County Rural Water Supply Information Platform'} + </div> + <div className={styles.IY_list}> + {configData?.listData + ? configData?.listData.map(item => ( + <div onClick={() => onLink(item.url)} className={styles.IY_item} key={item.name} type={item.name}> + <div className={styles.IY_item_name}>{item.label || item.name}</div> + <div className={styles.IY_item_name_sub}>{item.english || ''}</div> + </div> + )) + : null} + </div> + </div> + {linkUrl && showBackBtn ? ( + <div + className={classNames(styles.iframeExit, 'animate__animated', 'animate__fadeIn')} + onClick={() => setLinkUrl('')} + > + <div className={styles.iframeBackLeft}> + <img src={arrowLeftImg} alt="返回" /> + </div> + <div className={styles.iframeExitIcon}> + <img src={backImg} alt="返回" /> + 返回 + </div> + </div> + ) : null} + {iframeItem} + {/* <div className={classNames(styles.CarouselRipples, 'CarouselRipples')} data-ripple="ripple" /> */} + </div> + ); +}; +const mapStateToProps = state => ({ + global: state.getIn(['global', 'globalConfig']), +}); +export default connect(mapStateToProps)(IntegrationDanling); diff --git a/src/pages/bootpage/template/project/danling/index.less b/src/pages/bootpage/template/project/danling/index.less new file mode 100644 index 0000000000000000000000000000000000000000..76f97b95612a655dda81777e2c9edc0609706200 --- /dev/null +++ b/src/pages/bootpage/template/project/danling/index.less @@ -0,0 +1,306 @@ +.integrationDanling { + width: 100%; + position: relative; + height: 100%; + overflow: hidden; + background: url('@/assets/images/integration/danling/背景.png') center/100% 100% no-repeat; + + .iframeExitIcon { + position: absolute; + top: 0; + left: -45px; + display: flex; + height: 44px; + width: 44px; + background: rgba(28, 94, 180, 0.95); + border-radius: 0 7px 7px 0; + flex-direction: column; + justify-content: space-around; + align-items: center; + font-size: 12px; + transition: all 0.2s; + padding: 3px 0; + + img { + width: 17px; + height: 12px; + } + } + + + .iframeExit:hover { + .iframeExitIcon { + left: 0; + } + + .iframeBackLeft { + left: -15px; + } + } + + + .iframeBackLeft { + position: absolute; + top: 0; + left: 0; + width: 14px; + height: 44px; + background: rgba(28, 94, 180, 0.95); + border-radius: 0 7px 7px 0; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; + + img { + width: 6px; + height: 11px; + } + } + + .iframeExit { + width: 44px; + height: 44px; + position: absolute; + top: 4px; + left: 0; + color: #FFF; + cursor: pointer; + user-select: none; + position: absolute; + z-index: 110; + + + } + + .integrationDanling_exit { + position: absolute; + right: 10px; + top: 10px; + z-index: 100; + } + + .integration_content { + display: flex; + flex-direction: column; + align-items: center; + transform-origin: left top; + position: absolute; + left: 50%; + top: 50%; + padding: 0px 20px 10px; + } + + + + //基础平å°end + .integrationDanling_title { + display: flex; + align-items: center; + justify-content: center; + padding-top: 15px; + padding-bottom: 5px; + + .integrationDanling_icon { + margin-right: 20px; + + } + + &_text { + flex: none; + color: #fff; + + span { + line-height: 64px; + font-weight: bold; + font-size: 36px; + color: #FFFFFF; + letter-spacing: 4px; + // background: linear-gradient(0deg, #56A1EF 0%, #FFFFFF 59%); + // -webkit-background-clip: text; + // -webkit-text-fill-color: transparent; + position: relative; + // top: -8px; + font-family: Microsoft YaHei; + + } + } + + } + + .integrationDanling_title_sub { + font-family: Microsoft YaHei; + font-weight: 400; + font-size: 14px; + color: rgba(255, 255, 255, 0.75); + line-height: 22px; + padding: 0 125px; + background: url(@/assets/images/integration/danling/title_left.png) no-repeat left center, url(@/assets/images/integration/danling/title_right.png) no-repeat right center; + background-size: 115px 1px, 115px 1px; + } + + + + .IY_list { + padding-top: 95px; + display: grid; + margin: auto; + grid-template-columns: 270px 270px 270px 270px 270px; + grid-template-rows: 280px 280px 280px 280px 280px; + gap: 56px 68px; + z-index: 1000; + + } + + .IY_item { + border-radius: 50px; + text-align: center; + padding-top: 198px; + transition: all 0.3s; + position: relative; + top: 0; + cursor: pointer; + z-index: 1000; + + .IY_item_name { + font-weight: bold; + font-size: 24px; + line-height: 42px; + color: #FFFFFF; + } + + .IY_item_name_sub { + font-weight: 400; + font-size: 14px; + color: rgba(255, 255, 255, 0.7); + } + + } + + .IY_item:hover { + top: -15px; + } + + .IY_item[type='厂站管ç†'] { + background: url('@/assets/images/integration/danling/厂站管ç†.png') center/100% 100% no-repeat; + } + + .IY_item[type='æ•°æ®ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/æ•°æ®ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='æ°´è´¨ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/æ°´è´¨ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='GISä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/GISä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='控æ¼ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/控æ¼ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='管网管ç†'] { + background: url('@/assets/images/integration/danling/管网管ç†.png') center/100% 100% no-repeat; + } + + .IY_item[type='监控ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/监控ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='业务ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/业务ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='报è¦ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/报è¦ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + + .IY_item[type='设置ä¸å¿ƒ'] { + background: url('@/assets/images/integration/danling/设置ä¸å¿ƒ.png') center/100% 100% no-repeat; + } + +} + +.integrationJumpLoad { + width: 100%; + height: 100%; + position: absolute; + display: flex; + align-items: center; + justify-content: center; + top: 0; + left: 0; + z-index: 1080; + padding-bottom: 50px; + background-color: rgba(0, 0, 0, 0.6); + + +} + +.hide { + visibility: hidden; +} + + + +@-webkit-keyframes scale-in-center { + 0% { + -webkit-transform: scaleY(0); + transform: scaleY(0); + opacity: 1; + } + + 100% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + opacity: 1; + } +} + +@keyframes scale-in-center { + 0% { + -webkit-transform: scaleY(0); + transform: scaleY(0); + opacity: 1; + } + + 100% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + opacity: 1; + } +} + +.scaleInCenter { + visibility: visible; + -webkit-animation: scale-in-center .3s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: scale-in-center .3s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; +} + +// .CarouselRipples { +// width: 100%; +// height: 100%; +// position: absolute; +// top: 0; +// left: 0; +// z-index: 1; + +// } + + +& :global { + // .CarouselRipples:before { + // content: ''; + // display: inline-block; + // vertical-align: middle; + // height: 100%; + // } + + .integrationDanling { + .anticon { + vertical-align: 0.125em; + } + } +} \ No newline at end of file diff --git a/src/pages/bootpage/template/project/yixing/data.json b/src/pages/bootpage/template/project/yixing/data.json new file mode 100644 index 0000000000000000000000000000000000000000..3f6fd0b239a845ef95e141172a4a8b7eb6379850 --- /dev/null +++ b/src/pages/bootpage/template/project/yixing/data.json @@ -0,0 +1,94 @@ +{ + "业务ä¸å¿ƒ": [ + { + "name": "水务业务门户", + "label": "", + "url": "" + }, + { + "name": "综åˆå±•示", + "url": "" + }, + { + "name": "制水管控", + "url": "" + } + ], + "智慧管网": [ + { + "name": "管网GIS系统", + "label": "", + "url": "", + "english": "Pipeline GIS" + }, + { + "name": "管网采集系统", + "url": "", + "english": "Pipeline Collection" + }, + { + "name": "ç®¡ç½‘ä¸€å¼ å›¾", + "url": "", + "english": "Pipe Network" + } + ], + "综åˆè°ƒåº¦": [ + { + "name": "管网è¿è¡Œç›‘测", + "label": "", + "url": "", + "english": "Pipeline Operation" + }, + { + "name": "调度事物管ç†", + "url": "", + "english": "Scheduling Management" + }, + { + "name": "报è¦ç®¡ç†å¹³å°", + "url": "", + "english": "Alarm Management" + } + ], + "智慧è¥é”€": [ + { + "name": "è¥ä¸šæ”¶è´¹", + "label": "", + "url": "", + "english": "Operating Fees" + }, + { + "name": "抄表管ç†", + "url": "", + "english": "Meter Reading" + }, + { + "name": "网上è¥ä¸šåŽ…", + "url": "", + "english": "Online Business Hall" + } + ], + "基础平å°": [ + { + "name": "物è”统一接入平å°", + "url": "", + "english": "IoT Unified Access" + }, + { + "name": "综åˆåŽå°ç®¡ç†å¹³å°", + "url": "", + "english": "Integrated Backend" + }, + { + "name": "GISæœåС平å°", + "url": "", + "english": "GIS Service " + }, + { + "name": "Web组æ€å¹³å°", + "url": "", + "english": "Web Configuration" + } + ], + "æ ‡é¢˜": "宜兴智慧水务管控平å°" +} \ No newline at end of file diff --git a/src/pages/bootpage/template/project/yixing/index.js b/src/pages/bootpage/template/project/yixing/index.js new file mode 100644 index 0000000000000000000000000000000000000000..1c7032872ff9833bf292148db82c451834ac6ea4 --- /dev/null +++ b/src/pages/bootpage/template/project/yixing/index.js @@ -0,0 +1,400 @@ +/* + * @Title: 宜兴 集æˆé¡µ + * @Author: hongmye + * @Date: 2024-08-05 18:34:42 + */ +import { appService } from '@/api'; +import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons'; +import { message, Button } from 'antd'; +import classNames from 'classnames'; +import { debounce } from 'lodash'; +import React, { useRef, useEffect, useState, useMemo } from 'react'; +import backImg from '@/assets/images/demonstration/返回.png'; +import arrowLeftImg from '@/assets/images/demonstration/å·¦ç®å¤´.png'; +import LoadPage from '@/components/LoadPage'; +import icon1 from '@/assets/images/integration/taihu2/综åˆç®¡æŽ§_arrow.png'; +import icon2 from '@/assets/images/integration/taihu2/智慧应用_arrow.png'; +import icon3 from '@/assets/images/integration/taihu2/支撑平å°_arrow.png'; + +import useFullScreen from '../../demonstration/components/useFullScreen'; +import defaultConfig from './data.json'; +import styles from './index.less'; +import Iframe from '../../demonstration/components/Iframe'; +const boxWidth = 1920; +const boxHeight = 930; +const IntegrationYixing = props => { + const [ref, isFullscreen, handleFullScreen, handleExitFullScreen] = useFullScreen(false); + const timer2 = useRef(null); + const timer3 = useRef(null); + + const progressRef2 = useRef(0); + // 退出 + const exit = () => { + if (isFullscreen) { + handleExitFullScreen && handleExitFullScreen(); + } else { + handleFullScreen && handleFullScreen(); + } + }; + const [boxSize, setBoxSize] = useState({ + scale: 1, + boxHeight: 930, + }); + const [linkUrl, setLinkUrl] = useState(''); + const [jumpLoading, setJumpLoading] = useState(false); + const [progressValue2, setProgressValue2] = useState(0); + const [showBackBtn, setShowBackBtn] = useState(true); // æ˜¯å¦æ˜¾ç¤ºiframe 返回按钮,三维平å°ç”¨ + + const configName = '宜兴集æˆé…置文件'; + + const [configData, setConfigData] = useState(defaultConfig); + + const jumpProgressStart = () => { + if (timer2.current) { + clearInterval(timer2.current); + timer2.current = null; + } + progressRef2.current = 0; + setProgressValue2(0); + timer2.current = setInterval(() => { + if (progressRef2.current < 97.5) { + progressRef2.current += 2.5; + setProgressValue2(progressRef2.current); + } else { + setProgressValue2(99); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + } + }, 100); + }; + const jumpProgressEnd = () => { + setProgressValue2(100); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + }; + const getData = async () => { + appService + .GetConfigJson({ + config: configName, + }) + .then(res => { + if (res.code === 0 && res.data) { + const data = JSON.parse(res.data) || defaultConfig; + setConfigData(data); + } + }); + }; + const onResize = () => { + if (ref?.current) { + const { clientWidth, clientHeight } = ref.current; + if (!boxWidth || !boxHeight) return; + const xScale = clientWidth / boxWidth; + const yScale = clientHeight / boxHeight; + const poor = clientHeight / clientWidth - boxHeight / boxWidth; + let n = Math.min(xScale, yScale); + let bHeight = boxHeight; + if (poor > 0.05) { + bHeight = boxHeight + 30; + } + // é«˜åº¦ä¸ºå¶æ•° + bHeight = parseInt(bHeight, 10); + if (bHeight % 2 !== 0) { + bHeight += 1; + } + n = Number(n.toFixed(4)); + setBoxSize({ + scale: n, + boxHeight: bHeight, + }); + } + }; + const handError = err => { + if (err) { + message.error(err); + } + setLinkUrl(''); + setJumpLoading(false); + jumpProgressEnd(); + }; + const onMessageBack = data => { + if (!data?.type) return; + console.log('onMessageBack ~ data:', data); + switch (data?.type) { + // 页é¢åŠ è½½å®Œæˆ + // 登录æˆåŠŸ + case 'runAfterFirstMounted': + case 'loginSuccess': + jumpProgressEnd(); + setTimeout(() => { + setJumpLoading(false); + }, 100); + break; + case 'loginError': + message.warning('登录失败,请è”系管ç†äººå‘˜'); + handError(); + break; + case 'æ— æ³•è¿žæŽ¥': + message.warning('è¯¥ç«™ç‚¹æ— æ³•è¿žæŽ¥ï¼Œè¯·è”系管ç†äººå‘˜'); + setTimeout(() => { + handError(); + }, 100); + break; + case 'showBack': + setShowBackBtn(true); + break; + case 'hideBack': + setShowBackBtn(false); + break; + default: + break; + } + }; + const iframeItem = useMemo(() => { + if (!linkUrl) return null; + return ( + <> + <div className={classNames(!jumpLoading ? styles.scaleInCenter : styles.hide, 'animate__animated')}> + <Iframe linkUrl={linkUrl} onMessageBack={onMessageBack} /> + </div> + </> + ); + }, [linkUrl, jumpLoading]); + const startTiming = (time = 2) => { + if (timer3.current) { + clearInterval(timer3.current); + timer3.current = null; + } + timer3.current = setTimeout(() => { + setJumpLoading(false); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + }, time * 1000); + }; + const onLink = url => { + if (!url) return message.warning('未é…置功能路径'); + setJumpLoading(true); + jumpProgressStart(); + + setLinkUrl(url); + let time = 15; + if (!url.includes('user/noscret')) { + time = 4; + } + startTiming(time); + }; + useEffect(() => { + getData(); + window.addEventListener('resize', debounce(onResize, 300)); + onResize(); + return () => { + window.removeEventListener('resize', onResize); + timer2.current && clearInterval(timer2.current); + timer2.current = null; + timer3.current && clearInterval(timer3.current); + timer3.current = null; + }; + }, []); + + return ( + <div className={classNames(styles.integrationYixing, 'integrationYixing')} ref={ref}> + {jumpLoading ? ( + <div className={styles.integrationJumpLoad} key="jumpLoading"> + <div style={{ width: '285px' }}> + <LoadPage percent={progressValue2 / 100} text="页é¢åŠ è½½ä¸~" /> + </div> + </div> + ) : null} + {!linkUrl ? ( + <div className={styles.integrationYixing_exit} onClick={exit}> + <Button type="text" style={{ color: '#fff', fontSize: '24px' }}> + {isFullscreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />} + </Button> + </div> + ) : null} + + <div + className={styles.integration_content} + style={{ + width: boxWidth, + height: boxSize.boxHeight, + transform: `scale(${boxSize.scale}) translate(-50%,-50%)`, + }} + > + <div className={styles.integrationYixing_title}> + <div className={styles.integrationYixing_title_text}> + <span>{configData?.['æ ‡é¢˜'] || '智慧水务综åˆç›‘控平å°'}</span> + </div> + </div> + <div className={styles.integration_row} type="业务ä¸å¿ƒ"> + <div className={styles.integration_row_title} type="业务ä¸å¿ƒ"> + 业务ä¸å¿ƒ + <img src={icon1} alt="" /> + </div> + <div className={styles.integration_row_list}> + <div className={styles.integration_row_grid} type="业务ä¸å¿ƒ"> + {configData['业务ä¸å¿ƒ'] && + configData['业务ä¸å¿ƒ'].map(item => ( + <div + key={item.name} + className={styles.integration_row_col} + type="业务ä¸å¿ƒ" + onClick={() => onLink(item.url)} + > + <div + className={classNames( + styles.integration_row_col_hover, + 'animate__fadeIn animate__animated duration-100ms', + )} + /> + <div className={styles.integration_row_col_content} name={item.name}> + <div className={styles.integration_row_col_text} type="业务ä¸å¿ƒ"> + {item.label || item.name} + </div> + <div className={styles.integration_row_col_sub}>{item.english || ''}</div> + </div> + </div> + ))} + </div> + </div> + </div> + <div className={styles.integration_row} type="应用系统"> + <div className={styles.integration_row_title} type="应用系统"> + 应用系统 + <img src={icon2} alt="" /> + </div> + <div className={styles.integration_row_right2}> + <div className={styles.integration_row_list} type="智慧管网"> + <div className={styles.integration_row_list_title} type="智慧管网"> + - 智慧管网 - + </div> + <div className={styles.integration_row_grid} type="智慧管网"> + {configData['智慧管网'] && + configData['智慧管网'].map(item => ( + <div + key={item.name} + className={styles.integration_row_col} + type={item.name} + onClick={() => onLink(item.url)} + > + <div + className={classNames( + styles.integration_row_col_hover, + 'animate__fadeIn animate__animated duration-100ms', + )} + /> + <div className={styles.integration_row_col_content} name={item.name}> + <div className={styles.integration_row_col_text}>{item.label || item.name}</div> + <div className={styles.integration_row_col_sub}>{item.english || ''}</div> + </div> + </div> + ))} + </div> + </div> + <div className={styles.integration_row_list} type="智慧管网"> + <div className={styles.integration_row_list_title} type="智慧管网"> + - 综åˆè°ƒåº¦ - + </div> + <div className={styles.integration_row_grid} type="智慧管网"> + {configData['综åˆè°ƒåº¦'] && + configData['综åˆè°ƒåº¦'].map(item => ( + <div + key={item.name} + className={styles.integration_row_col} + type={item.name} + onClick={() => onLink(item.url)} + > + <div + className={classNames( + styles.integration_row_col_hover, + 'animate__fadeIn animate__animated duration-100ms', + )} + /> + <div className={styles.integration_row_col_content} name={item.name}> + <div className={styles.integration_row_col_text}>{item.label || item.name}</div> + <div className={styles.integration_row_col_sub}>{item.english || ''}</div> + </div> + </div> + ))} + </div> + </div> + <div className={styles.integration_row_list} type="智慧管网"> + <div className={styles.integration_row_list_title} type="智慧管网"> + - 智慧è¥é”€ - + </div> + <div className={styles.integration_row_grid} type="智慧管网"> + {configData['智慧è¥é”€'] && + configData['智慧è¥é”€'].map(item => ( + <div + key={item.name} + className={styles.integration_row_col} + type={item.name} + onClick={() => onLink(item.url)} + > + <div + className={classNames( + styles.integration_row_col_hover, + 'animate__fadeIn animate__animated duration-100ms', + )} + /> + <div className={styles.integration_row_col_content} name={item.name}> + <div className={styles.integration_row_col_text}>{item.label || item.name}</div> + <div className={styles.integration_row_col_sub}>{item.english || ''}</div> + </div> + </div> + ))} + </div> + </div> + </div> + </div> + <div className={styles.integration_row} type="基础平å°"> + <div className={styles.integration_row_title} type="基础平å°"> + åŸºç¡€å¹³å° + <img src={icon3} alt="" /> + </div> + <div className={styles.integration_row_list}> + <div className={styles.integration_row_grid} type="基础平å°"> + {configData['基础平å°'] && + configData['基础平å°'].map(item => ( + <div + key={item.name} + className={styles.integration_row_col} + type="基础平å°" + onClick={() => onLink(item.url)} + > + <div + className={classNames( + styles.integration_row_col_hover, + 'animate__fadeIn animate__animated duration-100ms', + )} + /> + <div className={styles.integration_row_col_content} name={item.name}> + <div className={styles.integration_row_col_text} type="基础平å°"> + {item.label || item.name} + </div> + <div className={styles.integration_row_col_sub}>{item.english || ''}</div> + </div> + </div> + ))} + </div> + </div> + </div> + </div> + {linkUrl && showBackBtn ? ( + <div + className={classNames(styles.iframeExit, 'animate__animated', 'animate__fadeIn')} + onClick={() => setLinkUrl('')} + > + <div className={styles.iframeBackLeft}> + <img src={arrowLeftImg} alt="返回" /> + </div> + <div className={styles.iframeExitIcon}> + <img src={backImg} alt="返回" /> + 返回 + </div> + </div> + ) : null} + {iframeItem} + </div> + ); +}; +export default IntegrationYixing; diff --git a/src/pages/bootpage/template/project/yixing/index.less b/src/pages/bootpage/template/project/yixing/index.less new file mode 100644 index 0000000000000000000000000000000000000000..b3c2612efa5a1f81cba9f53887786e02f10908e8 --- /dev/null +++ b/src/pages/bootpage/template/project/yixing/index.less @@ -0,0 +1,617 @@ +.integrationYixing { + width: 100%; + position: relative; + height: 100%; + overflow: hidden; + background: url('@/assets/images/integration/taihu2/背景2.jpg') center/100% 100% no-repeat; + + .iframeExitIcon { + position: absolute; + top: 0; + left: -45px; + display: flex; + height: 44px; + width: 44px; + background: rgba(28, 94, 180, 0.95); + border-radius: 0 7px 7px 0; + flex-direction: column; + justify-content: space-around; + align-items: center; + font-size: 12px; + transition: all 0.2s; + padding: 3px 0; + + img { + width: 17px; + height: 12px; + } + } + + + .iframeExit:hover { + .iframeExitIcon { + left: 0; + } + + .iframeBackLeft { + left: -15px; + } + } + + + .iframeBackLeft { + position: absolute; + top: 0; + left: 0; + width: 14px; + height: 44px; + background: rgba(28, 94, 180, 0.95); + border-radius: 0 7px 7px 0; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; + + img { + width: 6px; + height: 11px; + } + } + + .iframeExit { + width: 44px; + height: 44px; + position: absolute; + top: 4px; + left: 0; + color: #FFF; + cursor: pointer; + user-select: none; + position: absolute; + z-index: 110; + + + } + + .integrationYixing_exit { + position: absolute; + right: 10px; + top: 10px; + z-index: 100; + } + + .integration_content { + display: flex; + flex-direction: column; + align-items: center; + transform-origin: left top; + position: absolute; + left: 50%; + top: 50%; + padding: 0px 20px 10px; + } + + .integration_row { + display: flex; + width: 1505px; + overflow: hidden; + + .integration_row_title { + flex: none; + margin-right: 30px; + position: relative; + writing-mode: vertical-rl; + font-weight: bold; + font-size: 22px; + color: #fff; + line-height: 33px; + text-shadow: 0 0 18px rgba(0, 144, 255, 0.5); + display: flex; + align-items: flex-start; + justify-content: center; + letter-spacing: 3px; + + img { + width: 33px; + height: 42px; + position: absolute; + right: -25px; + top: 50%; + transform: translateY(-50%); + } + } + + .integration_row_list { + flex: 1; + display: flex; + align-items: center; + } + + } + + .integration_row_col { + position: relative; + cursor: pointer; + } + + .integration_row_col_text { + font-weight: bold; + font-size: 20px; + color: #FFFFFF; + transition: all 0.1s; + position: relative; + white-space: nowrap; + + } + + .integration_row_col:hover { + filter: brightness(120%); + + .integration_row_col_hover { + display: block !important; + } + + .integration_row_col_text { + color: #fff !important; + } + + .integration_row_col_sub { + color: #fff !important; + + } + } + + .integration_row_title[type='业务ä¸å¿ƒ'] { + width: 46px; + height: 154px; + background: url('@/assets/images/integration/jimusaer/业务ä¸å¿ƒ.png') center center no-repeat; + background-size: 100% 100%; + } + + .integration_row_title[type='应用系统'] { + width: 46px; + height: 421px; + background: url('@/assets/images/integration/jimusaer/应用系统.png') center center no-repeat; + background-size: 100% 100%; + + } + + .integration_row_title[type='基础平å°'] { + width: 46px; + height: 153px; + background: url('@/assets/images/integration/jimusaer/基础平å°.png') center center no-repeat; + background-size: 100% 100%; + + } + + // 综åˆç®¡æŽ§start + .integration_row[type='业务ä¸å¿ƒ'] { + height: 153px; + display: flex; + align-items: center; + margin-bottom: 15px; + + .integration_row_list { + height: 140px; + background: linear-gradient(0deg, rgba(171, 136, 0, 0) 0%, rgba(177, 153, 58, 0.5) 100%); + border-radius: 20px; + padding-top: 7px; + position: relative; + top: 5px; + } + } + + .integration_row_grid[type='业务ä¸å¿ƒ'] { + display: flex; + justify-content: space-around; + padding-left: 13px; + padding-top: 8px; + } + + .integration_row_col[type='业务ä¸å¿ƒ'] { + width: 468px; + height: 118px; + + + .integration_row_col_text { + font-weight: bold; + font-size: 20px; + color: #FFED9A; + text-shadow: 2px 3px 4px rgba(0, 0, 0, 0.5); + margin-bottom: 2px; + } + + .integration_row_col_sub { + font-weight: 400; + font-size: 13px; + color: rgba(231, 215, 138, 0.6); + } + + .integration_row_col_content { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + padding: 28px 20px 45px 183px; + + } + + .integration_row_col_content[name='综åˆç®¡ç†é—¨æˆ·'] { + background: url('@/assets/images/integration/jimusaer/综åˆç®¡ç†é—¨æˆ·.png') 66px 29px no-repeat, + url('@/assets/images/integration/jimusaer/业务ä¸å¿ƒbg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='综åˆå¤–业工å•'] { + background: url('@/assets/images/integration/jimusaer/综åˆå¤–业工å•.png') 66px 29px no-repeat, + url('@/assets/images/integration/jimusaer/业务ä¸å¿ƒbg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + } + + .integration_row_col_content[name='综åˆä¸šåС大å±'] { + background: url('@/assets/images/integration/jimusaer/综åˆä¸šåС大å±.png') 66px 29px no-repeat, + url('@/assets/images/integration/jimusaer/业务ä¸å¿ƒbg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + } + + // 综åˆç®¡æŽ§end + + // 应用系统 + .integration_row[type='应用系统'] { + height: 421px; + display: flex; + align-items: flex-start; + margin-bottom: 15px; + + .integration_row_right2 { + flex: 1; + display: flex; + overflow: hidden; + padding-top: 12px; + justify-content: space-between; + } + + .integration_row_list_title { + font-weight: bold; + font-size: 18px; + color: #FFFFFF; + font-style: italic; + letter-spacing: 2px; + padding-right: 14px; + } + + .integration_row_list { + // flex: 1; + width: 458px; + height: 400px; + overflow: hidden; + + + } + + } + + .integration_row_list[type='智慧管网'] { + overflow: hidden; + flex-direction: column; + background: linear-gradient(180deg, rgba(39, 112, 173, 0.5) 0%, rgba(39, 112, 173, 0) 100%); + border-radius: 20px; + flex: none; + + + .integration_row_list_title { + width: 100%; + height: 60px; + position: relative; + top: -4px; + padding-top: 24px; + line-height: 1; + text-align: center; + background: url('@/assets/images/integration/jimusaer/智慧管网.png') center center no-repeat; + background-size: 100% 60px; + + + } + + .integration_row_col_text { + font-weight: bold; + font-size: 20px; + color: #AEEFFF; + // padding-top: 50px; + padding-bottom: 4px; + text-shadow: 2px 3px 4px rgba(0, 0, 0, 0.5); + } + + + .integration_row_col_content { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + padding-left: 183px; + padding-bottom: 13px; + + } + + .integration_row_col_sub { + font-weight: 400; + font-size: 13px; + color: rgba(174, 239, 255, 0.6); + } + + + } + + .integration_row_grid[type='智慧管网'] { + display: flex; + flex-direction: column; + + } + + .integration_row_col { + width: 426px; + height: 118px; + + } + + .integration_row_col_content[name='管网GIS系统'] { + background: url('@/assets/images/integration/jimusaer/管网GIS系统.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='管网采集系统'] { + background: url('@/assets/images/integration/jimusaer/管网采集系统.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='ç®¡ç½‘ä¸€å¼ å›¾'] { + background: url('@/assets/images/integration/jimusaer/ç®¡ç½‘ä¸€å¼ å›¾.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='管网è¿è¡Œç›‘测'] { + background: url('@/assets/images/integration/jimusaer/管网è¿è¡Œç›‘测.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='调度事物管ç†'] { + background: url('@/assets/images/integration/jimusaer/调度事物管ç†.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='报è¦ç®¡ç†å¹³å°'] { + background: url('@/assets/images/integration/jimusaer/报è¦ç®¡ç†å¹³å°.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='è¥ä¸šæ”¶è´¹'] { + background: url('@/assets/images/integration/jimusaer/è¥ä¸šæ”¶è´¹.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='抄表管ç†'] { + background: url('@/assets/images/integration/jimusaer/抄表管ç†.png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='网上è¥ä¸šåŽ…'] { + background: url('@/assets/images/integration/jimusaer/网上è¥ä¸šåŽ….png') 67px 28px no-repeat, + url('@/assets/images/integration/jimusaer/应用系统bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + // 智慧生产调度end + + + + + // 基础平å°start + .integration_row[type='基础平å°'] { + height: 153px; + display: flex; + align-items: center; + + + .integration_row_list { + height: 140px; + background: linear-gradient(0deg, rgba(0, 131, 120, 0) 0%, rgba(0, 131, 120, 0.5) 100%); + border-radius: 20px; + padding-top: 7px; + position: relative; + top: 5px; + } + } + + .integration_row_grid[type='基础平å°'] { + display: flex; + justify-content: space-between; + padding-left: 13px; + padding-top: 8px; + width: 100%; + padding-right: 17px; + } + + .integration_row_col[type='基础平å°'] { + width: 348px; + height: 118px; + + + .integration_row_col_text { + font-weight: bold; + font-size: 20px; + color: #89FFDC; + text-shadow: 2px 3px 4px rgba(0, 0, 0, 0.5); + margin-bottom: 2px; + } + + .integration_row_col_sub { + font-weight: 400; + font-size: 13px; + color: rgba(137, 255, 220, 0.6); + } + + .integration_row_col_content { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + padding: 28px 20px 45px 144px; + + } + + .integration_row_col_content[name='物è”统一接入平å°'] { + background: url('@/assets/images/integration/jimusaer/物è”统一接入平å°.png') 47px 28px no-repeat, + url('@/assets/images/integration/jimusaer/基础平å°bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='综åˆåŽå°ç®¡ç†å¹³å°'] { + background: url('@/assets/images/integration/jimusaer/综åˆåŽå°ç®¡ç†å¹³å°.png') 47px 28px no-repeat, + url('@/assets/images/integration/jimusaer/基础平å°bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + } + + .integration_row_col_content[name='GISæœåС平å°'] { + background: url('@/assets/images/integration/jimusaer/GISæœåС平å°.png') 47px 28px no-repeat, + url('@/assets/images/integration/jimusaer/基础平å°bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + + .integration_row_col_content[name='Web组æ€å¹³å°'] { + background: url('@/assets/images/integration/jimusaer/Web组æ€å¹³å°.png') 47px 28px no-repeat, + url('@/assets/images/integration/jimusaer/基础平å°bg.png') center center no-repeat; + background-size: 54px 54px, 100% 100%; + + } + } + + //基础平å°end + .integrationYixing_title { + display: flex; + // align-items: center; + justify-content: center; + padding-top: 10px; + + &_left { + width: 372px; + height: 75px; + background: url('@/assets/images/integration2/left.png') center/100% 100% no-repeat; + + } + + &_text { + flex: none; + color: #fff; + + span { + line-height: 97px; + color: #fff; + font-size: 56px; + letter-spacing: 4px; + background: linear-gradient(0deg, #56A1EF 0%, #FFFFFF 59%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + position: relative; + // top: -8px; + font-weight: bolder; + } + } + + &_right { + width: 372px; + height: 75px; + background: url('@/assets/images/integration2/right.png') center/100% 100% no-repeat; + + } + } + +} + +.integrationJumpLoad { + width: 100%; + height: 100%; + position: absolute; + display: flex; + align-items: center; + justify-content: center; + top: 0; + left: 0; + z-index: 1080; + padding-bottom: 50px; + background-color: rgba(0, 0, 0, 0.6); + + +} + +.hide { + visibility: hidden; +} + + + +@-webkit-keyframes scale-in-center { + 0% { + -webkit-transform: scaleY(0); + transform: scaleY(0); + opacity: 1; + } + + 100% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + opacity: 1; + } +} + +@keyframes scale-in-center { + 0% { + -webkit-transform: scaleY(0); + transform: scaleY(0); + opacity: 1; + } + + 100% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + opacity: 1; + } +} + +.scaleInCenter { + visibility: visible; + -webkit-animation: scale-in-center .3s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; + animation: scale-in-center .3s cubic-bezier(0.250, 0.460, 0.450, 0.940) both; +} + +& :global { + .integrationYixing { + .anticon { + vertical-align: 0.125em; + } + } +} \ No newline at end of file