Commit ce0251ff authored by 陶晶晶's avatar 陶晶晶

feat:五粮液集成登录开发

parent 94dd7e55
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
This diff was suppressed by a .gitattributes entry.
......@@ -16,6 +16,7 @@ import DanlingPage from './project/danling';
import MilePage from './project/mile';
import DongyingPage from './project/dongying';
import QinzhouPage from './project/qinzhou';
import WuliangyePage from './project/wuliangye';
import JianshiPage from './project/jianshi';
import XinyuanPage from './project/xinyuan';
import IntegrationNewPage from './integrationNew';
......@@ -71,6 +72,11 @@ export const guidePage = [
value: 'qinzhouPage',
previewSrc: require('@/assets/images/integration/previewImg/钦州.png'),
},
{
label: '五粮液集成登录',
value: 'wulaingyePage',
previewSrc: require('@/assets/images/integration/previewImg/五粮液.png'),
},
{
label: '建始集成登录',
value: 'jianshiPage',
......@@ -107,4 +113,5 @@ export const BootPageTemplate = {
qinzhouPage: QinzhouPage,
jianshiPage: JianshiPage,
xinyuanPage: XinyuanPage,
wulaingyePage: WuliangyePage,
};
/* eslint-disable prettier/prettier */
import Icon1 from "@/assets/images/integration/wuliangye/1.png";
import Icon2 from "@/assets/images/integration/wuliangye/2.png";
import Icon3 from "@/assets/images/integration/wuliangye/3.png";
import Icon4 from "@/assets/images/integration/wuliangye/4.png";
import Icon5 from "@/assets/images/integration/wuliangye/5.png";
import Icon6 from "@/assets/images/integration/wuliangye/6.png";
import Icon7 from "@/assets/images/integration/wuliangye/7.png";
import Icon8 from "@/assets/images/integration/wuliangye/8.png";
import Icon9 from "@/assets/images/integration/wuliangye/厂区一张图.png";
import Icon10 from "@/assets/images/integration/wuliangye/驾驶舱.png";
import Icon11 from "@/assets/images/integration/wuliangye/三维模型.png";
import Icon12 from "@/assets/images/integration/wuliangye/园区一张图.png";
export default {
modalConfig: [
{ name: '再生水厂', bgImg: Icon1 },
{ name: '智能控制', bgImg: Icon2 },
{ name: '设备巡检', bgImg: Icon3 },
{ name: '工单系统', bgImg: Icon4 },
{ name: '', bgImg: '' },
{ name: '资产管理', bgImg: Icon5 },
{ name: '管网GIS', bgImg: Icon6 },
{ name: '报警中心', bgImg: Icon7 },
{ name: '系统设置', bgImg: Icon8 }
],
BIConfig: [
{ name: '领导驾驶舱', icon: Icon10 },
{
name: '三维模型', icon: Icon11
},
{ name: '厂区一张图', icon: Icon9 },
{ name: '园区一张图', icon: Icon12 },
]
}
\ No newline at end of file
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 { searchUrl } from '@/utils/utils';
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 { connect } from 'react-redux';
import { actionCreators } from '@/containers/App/store';
import { getWebSiteConfig } from '@/api/service/base';
import axios from 'axios';
import { useHistory, useAliveController } from '@wisdom-utils/runtime';
import Cookies from 'js-cookie';
import { store } from '@wisdom-utils/utils';
import LoginAction from '@/pages/user/login/login';
import { defaultApp } from '@/micro';
import useFullScreen from '../../demonstration/components/useFullScreen';
import styles from './index.less';
import titleIcon from "@/assets/images/integration/wuliangye/标题.png";
import pageConfig from "./config";
const { modalConfig, BIConfig } = pageConfig
const boxWidth = 1920;
const boxHeight = 930;
const IntegrationQinzhou = props => {
const integratedConfig = props.integratedConfig?.toObject
? props.integratedConfig.toObject()
: props.integratedConfig || {};
const [ref, isFullscreen, handleFullScreen, handleExitFullScreen] = useFullScreen(false);
const clientRef = useRef(props.global.client);
const integrationClient = integratedConfig?.client || window?.globalConfig?.client || 'city'; // 集成登录client
const [integrationData, setIntegrationData] = useState({}); // 所有子站
const loadingTime = integratedConfig?.loadingTime || 5;
const clientInfo = useRef({}); // 跳转子站信息
console.log('integrationData:', integrationData);
const history = useHistory();
const { clear } = useAliveController();
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 [loginAction, setAction] = useState(() => new LoginAction(props));
const configName = '集成配置文件';
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 () => {
const token = props.global?.token || Cookies.get('token');
const client = integratedConfig?.client || sessionStorage.getItem('client') || props?.global?.client || '';
localStorage.setItem('integrationClient', client);
appService
.GetIntegrationConfig({
type: '集成登录',
userId: window.globalConfig.userInfo?.OID ?? null,
isEnable: true,
client,
})
.then(res1 => {
const list = res1.data || [];
console.log('res1.data:', res1.data);
list.length && localStorage.setItem('integrationData', JSON.stringify(list));
const obj = {};
list.forEach(i => {
obj[i.name] = i;
});
setIntegrationData(obj);
});
};
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 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 toRevenue = async item => {
setJumpLoading(true);
jumpProgressStart();
startTiming(6);
try {
const res = await appService.getTicketByToken({ token: window.globalConfig?.token });
if (res.code === 0) {
// 营收是api-bcs,直饮水是api-ddw
// /api-ddw/sysUser/ssoGCK
// res.data = 'e44a2883a2ac4c4b8c8f1186cf27ca1dcc406c1dda1247cabe04bff3c06d28e7'; // 测试token
const apiPath = `${item.url + (item.url.indexOf('?') > 0 ? '&' : '?') + item.paramValue}=${res.data}`;
if (item?.openOpt === '当前页打开') {
props.history.push('/thirdParty', { linkUrl: apiPath });
} else {
setJumpLoading(false);
jumpProgressEnd();
window.open(apiPath, '_blank');
}
} else {
res.msg && message.error(res.msg);
setJumpLoading(false);
jumpProgressEnd();
}
} catch (error) {
setJumpLoading(false);
jumpProgressEnd();
}
};
const toClient = async (item, loginA) => {
const token = props.global?.token || Cookies.get('token');
const cli = item.client;
const res = await getWebSiteConfig({
identity: token,
client: cli,
});
if (!res?.data?.[0]?.widgets?.length) {
message.error({
duration: 3,
content: '您没有该板块权限,请联系管理员',
});
return;
}
if (window.qiankunIsCache) {
store.set('event:dropCache');
}
Cookies.set('client', cli, {
expires: 86400000 / (24 * 60 * 60 * 1000),
path: '/',
});
sessionStorage.setItem('client', cli);
const currentProduct = `__global__recent_productIndex__micro_${window.location.hostname}_${window.globalConfig
?.client ?? 'city'}`;
sessionStorage.removeItem(currentProduct);
const currentProductNew = `__global__recent_productIndex__micro_${window.location.hostname}_${cli || 'city'}`;
sessionStorage.setItem(currentProductNew, 0);
// 用全局存跳转信息,跳转过程页面会刷新
window.clientInfo = item;
clientRef.current = cli;
const config = props.global;
config.uiwidgets = [];
config.widgets = [];
config.allWidgets = [];
window.qiankunStarted = false;
if (cli) {
config.client = cli;
}
setJumpLoading(true);
jumpProgressStart();
startTiming(loadingTime);
window.jumpLoadingProgress = 99;
loginA && loginA.getUserInfoAndConfig('', true, item.type);
};
const onLink = (item, loginA) => {
if (!item) return;
if (window.clientInfo) {
window.clientInfo = null;
}
const token = props.global?.token || Cookies.get('token');
if (!token) {
history.push(`/user/login?client=${integrationClient}`, { reload: true });
clear();
props.logout();
return;
}
const { url, client } = item;
if (item.subType === '内链' && client) {
toClient(item, loginA);
} else {
if (!url) return;
if (url?.indexOf('{userId}') >= 0) {
item.url = url.replace('{userId}', window.globalConfig?.userInfo?.OID);
}
let link = item.url;
if (item.paramName) {
link = `${item.url + (item.url.indexOf('?') > 0 ? '&' : '?') + item.paramName}=${window.globalConfig?.token}`;
}
if (item.subType === '外链') {
if (item.paramValue === 'ticket') {
toRevenue(item); // 去营收
return;
}
if (item?.openOpt === '当前页打开') {
props.history.push('/thirdParty', { linkUrl: url });
} else {
window.open(url, '_blank');
}
return;
}
axios({
url: link,
method: 'get',
dataType: 'json',
}).then(res => {
if (res?.data?.code === 0) {
if (item?.openOpt === '当前页打开') {
props.history.push('/thirdParty', { linkUrl: res.data?.data });
} else {
window.open(res.data?.data, '_blank');
}
}
});
}
};
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;
};
}, []);
useEffect(() => {
const handleToggleIndustry = event => {
setJumpLoading(false);
jumpProgressEnd();
window.jumpLoadingProgress = 0;
let url = '';
if (window.clientInfo?.url && window.clientInfo.subType === '内链') {
url = searchUrl(window.clientInfo.url);
window.clientInfo = null;
}
props.history.push(`/?client=${clientRef.current || props.global.client}`);
props.updateCurrentIndex && props.updateCurrentIndex(0);
defaultApp(url);
};
const handleError = () => {
setJumpLoading(false);
jumpProgressEnd();
};
loginAction.events.on('toggleIndustry', handleToggleIndustry);
loginAction.events.on('loginError', handleError);
return () => {
loginAction && loginAction.events && loginAction.events.removeListener('toggleIndustry', handleToggleIndustry);
loginAction && loginAction.events && loginAction.events.removeListener('loginError', handleError);
};
}, [loginAction.events, props]);
return (
<div className={classNames(styles.integrationQinzhou, 'integrationQinzhou')} 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.integrationQinzhou_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.integrationQinzhou_title}>
<img src={titleIcon} />
</div>
<div className={styles.integration_row} type="业务应用">
<div className={styles.integration_row_list}>
<div className={styles.integration_row_grid} type="业务应用">
{modalConfig.length &&
modalConfig.map(item => (
<div
key={item.name}
className={classNames(
styles.integration_row_col,
item.name ? integrationData[item.name] ? styles.integration_row_col_link : styles.integration_row_col_no : '',
)}
type="业务应用"
onClick={() => { item.name ? onLink(integrationData[item.name], loginAction) : null }}
>
{item.name ? <img src={item.bgImg} /> : null}
</div>
))}
</div>
</div>
</div>
<div className={styles.integrationTips}>
{
BIConfig.map(item => {
return <div className={classNames(styles.integration_card,
item.name ? integrationData[item.name] ? styles.integration_row_col_link : styles.integration_row_col_no : '',
)}
name={item.name}
onClick={() => { item.name ? onLink(integrationData[item.name], loginAction) : null }}
>
<div className={styles.integration_TitBG} >{item.name}</div>
<img src={item.icon} />
</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
}
</div >
);
};
const mapStateToProps = state => ({
global: state.getIn(['global', 'globalConfig']),
integratedConfig: state.getIn(['global', 'integratedConfig']),
});
const mapDispatchToProps = dispatch => ({
updateConfig(config) {
dispatch(actionCreators.getConfig(config));
},
createContext(data) {
dispatch(actionCreators.createContext(data));
},
updateCurrentIndex(index) {
dispatch(actionCreators.updateCurrentIndex(index));
},
logout() {
dispatch(actionCreators.logout());
},
});
export default connect(
mapStateToProps,
mapDispatchToProps,
)(IntegrationQinzhou);
@imgSrc: '@/assets/images/integration/qinzhou/';
.integrationQinzhou {
width: 100%;
position: relative;
height: 100%;
overflow: hidden;
background: url('@/assets/images/integration/wuliangye/五粮液背景.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;
}
.integrationQinzhou_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: 100%;
overflow: hidden;
margin-bottom: 14px;
padding: 0px 20px;
.integration_row_title {
flex: none;
margin-right: 8px;
position: relative;
writing-mode: vertical-rl;
font-weight: bold;
font-size: 18px;
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;
padding-right: 30px;
}
.integration_row_list {
flex: 1;
display: flex;
align-items: center;
}
}
.integrationTips {
display: flex;
position: relative;
justify-content: space-around;
width: 100%;
top: -11px;
.integration_card {
text-align: center;
position: relative;
.integration_TitBG {
width: 200px;
height: 88px;
line-height: 88px;
background: url('@/assets/images/integration/wuliangye/tip框.png') center/100% 100% no-repeat;
font-family: Microsoft YaHei;
font-weight: bold;
font-size: 22px;
color: #FFFFFF;
text-shadow: 0px 0px 13px rgba(0, 156, 255, 0.5);
}
}
.integration_card[name='三维模型'] {
left: -57px;
top: 78px;
}
.integration_card[name='厂区一张图'] {
// left: -76px;
top: 78px;
right: -41px;
}
.integration_card[name='园区一张图'] {
right: 56px;
}
.integration_card[name='领导驾驶舱'] {
left: 41px;
}
}
.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_no {
filter: grayscale(100%) brightness(90%);
cursor: not-allowed;
}
.integration_row_col_link:hover {
filter: brightness(120%);
}
// 业务应用start
.integration_row[type='业务应用'] {
overflow: hidden;
display: flex;
align-items: center;
.integration_row_list {
height: 100%;
padding-top: 6px;
flex: 1;
padding-left: 2px;
}
}
.integration_row_grid[type='业务应用'] {
display: flex;
justify-content: space-between;
width: 100%;
}
.integration_row_col[type='业务应用'] {
width: 194px;
height: 426px;
position: relative;
flex: none;
}
//基础平台end
.integrationQinzhou_title {
display: flex;
align-items: center;
justify-content: center;
// padding-top: 30px;
// padding-bottom: 30px;
&_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: 50px;
font-weight: bold;
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;
padding: 0px 10px;
}
}
&_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 {
.integrationQinzhou {
.anticon {
vertical-align: 0.125em;
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment