Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
CivWeb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ReactWeb5
CivWeb
Commits
15916b72
Commit
15916b72
authored
4 months ago
by
周宏民
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: 集成登录跳转前做菜单权限判断,获取子站优化
parent
d6a25018
master
Pipeline
#93634
waiting for manual action with stages
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
191 additions
and
133 deletions
+191
-133
index.js
src/components/IntegratedSwitch/index.js
+91
-54
actions.js
src/containers/App/store/actions.js
+1
-0
BasicLayout.js
src/layouts/BasicLayout.js
+82
-76
index.js
src/pages/bootpage/template/integrationNew/index.js
+17
-3
No files found.
src/components/IntegratedSwitch/index.js
View file @
15916b72
...
...
@@ -14,6 +14,7 @@ import axios from 'axios';
import
{
defaultApp
}
from
'@/micro'
;
import
{
useHistory
}
from
'@wisdom-utils/runtime'
;
import
LoadPage
from
'@/components/LoadPage'
;
import
{
getUserInfo
,
getWebSiteConfig
}
from
'@/api/service/base'
;
import
styles
from
'./index.less'
;
const
IntegratedSwitch
=
props
=>
{
...
...
@@ -74,29 +75,38 @@ const IntegratedSwitch = props => {
useEffect
(()
=>
{
// if (!window?.globalConfig?.userInfo?.OID || (!(window?.globalConfig?.isIntegration > 1) && window?.globalConfig?.Industry !== '集成登录')) return setDataList([]);
if
(
!
window
?.
globalConfig
?.
userInfo
?.
OID
||
!
(
window
?.
globalConfig
?.
isIntegration
>=
1
))
return
setDataList
([]);
appService
.
GetIntegrationConfig
({
type
:
'集成登录'
,
userId
:
window
?.
globalConfig
?.
userInfo
?.
OID
??
null
,
isEnable
:
true
,
client
:
localStorage
.
getItem
(
'integrationClient'
)
||
sessionStorage
.
getItem
(
'client'
)
||
props
?.
global
?.
client
||
''
,
})
.
then
(
res
=>
{
setDataList
(
res
?.
data
||
[]);
})
.
catch
(
err
=>
{
setDataList
([]);
});
let
list
=
localStorage
.
getItem
(
'integrationData'
);
//
list
=
list
?
JSON
.
parse
(
list
)
:
[];
if
(
Array
.
isArray
(
list
)
&&
list
?.
length
)
{
setDataList
(
list
||
[]);
}
else
{
appService
.
GetIntegrationConfig
({
type
:
'集成登录'
,
userId
:
window
?.
globalConfig
?.
userInfo
?.
OID
??
null
,
isEnable
:
true
,
client
:
localStorage
.
getItem
(
'integrationClient'
)
||
sessionStorage
.
getItem
(
'client'
)
||
props
?.
global
?.
client
||
''
,
})
.
then
(
res
=>
{
setDataList
(
res
?.
data
||
[]);
})
.
catch
(
err
=>
{
setDataList
([]);
});
}
},
[]);
// 子站跳转
// eslint-disable-next-line no-shadow
const
handlePage
=
useCallback
((
item
,
loginAction
)
=>
{
setJumpLoading
(
true
);
jumpProgressStart
();
startTiming
(
5
);
if
(
item
.
subType
===
'外链'
)
{
setJumpLoading
(
true
);
jumpProgressStart
();
startTiming
(
5
);
// 营收
if
(
item
.
paramValue
===
'ticket'
)
{
// 获取临时token
...
...
@@ -129,35 +139,56 @@ const IntegratedSwitch = props => {
}
}
} else if (item.subType === '内链') {
if (window.qiankunIsCache) {
store.set('event:dropCache');
}
const cli = item.appKey;
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
);
const token = props.global?.token || Cookies.get('token');
getWebSiteConfig({
identity: token
,
client: cli,
}).then(res => {
if (!res?.data?.[0]?.widgets?.length) {
message.error({
duration: 3,
content: '您没有该板块权限,请联系管理员',
}
);
setClient(cli);
clientRef.current = cli;
const config = props.global;
config.uiwidgets = [];
config.widgets = [];
config.allWidgets = [];
window.qiankunStarted = false;
if (cli) {
config.client = cli;
}
return;
}
setJumpLoading(true);
jumpProgressStart();
startTiming(5);
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);
// props.instance && props.instance.updateConfig(config);
loginAction && loginAction.getUserInfoAndConfig('', true, item.type);
setClient(cli);
clientRef.current = cli;
const config = props.global;
config.uiwidgets = [];
config.widgets = [];
config.allWidgets = [];
window.qiankunStarted = false;
if (cli) {
config.client = cli;
}
// props.instance && props.instance.updateConfig(config);
loginAction && loginAction.getUserInfoAndConfig('', true, item.type);
});
} else {
setJumpLoading(true);
jumpProgressStart();
startTiming(5);
let { url } = item;
if (url?.indexOf('{userId}') >= 0) {
url = url.replace('{userId}', window.globalConfig?.userInfo?.OID);
...
...
@@ -173,6 +204,9 @@ const IntegratedSwitch = props => {
} else {
window.open(res.data?.data, '_blank');
}
} else {
setJumpLoading(false);
jumpProgressEnd();
}
});
}
...
...
@@ -220,18 +254,21 @@ const IntegratedSwitch = props => {
</Tooltip>
</div>
</li>
{dataList.map(item => (
<li className={styles.switchPageLi} key={item.name} onClick={event => handlePage(item, loginAction)}>
<div className={styles.switchPageList}>
<Tooltip placement="top" title={item.name}>
<img
src={`
$
{
window
.
location
.
origin
}
/${item.icon
?
item.icon : 'center/im
ages
/
科技风
/
二供
.
png
'}`}
alt=""
/>
</Tooltip>
</div>
</li>
))}
{dataList.map(item => {
if (item.subType === '内链' && item.appKey === props?.global?.client) return null;
return (
<li className={styles.switchPageLi} key={item.name} onClick={event => handlePage(item, loginAction)}>
<div className={styles.switchPageList}>
<Tooltip placement="top" title={item.name}>
<img
src={`
$
{
window
.
location
.
origin
}
/${item.icon
?
item.icon : 'center/im
ages
/
科技风
/
二供
.
png
'}`}
alt=""
/>
</Tooltip>
</div>
</li>
);
})}
</ul>
</div>
) : null;
...
...
This diff is collapsed.
Click to expand it.
src/containers/App/store/actions.js
View file @
15916b72
...
...
@@ -229,6 +229,7 @@ export function logout(data) {
sessionStorage
.
setItem
(
'client'
,
integrationClient
);
}
localStorage
.
removeItem
(
'integrationClient'
);
localStorage
.
removeItem
(
'integrationData'
);
localStorage
.
removeItem
(
'access_token'
);
localStorage
.
removeItem
(
'password_token'
);
localStorage
.
removeItem
(
'password_pwdRegex'
);
...
...
This diff is collapsed.
Click to expand it.
src/layouts/BasicLayout.js
View file @
15916b72
...
...
@@ -61,7 +61,7 @@ const arrowSvg = ({ fillColor = '#fff' }) => (
<
path
d
=
"M511.700683 639.423111 191.917496 319.596945 319.830771 319.596945 511.700683 511.715521 703.570595 319.596945 831.48387 319.596945Z"
p
-
id
=
"8626"
// fill={fillColor}
// fill={fillColor}
/>
<
/svg
>
);
...
...
@@ -97,7 +97,9 @@ const OnlyFocusStations = props => {
<
div
className
=
{
layoutStyles
.
focusStations
}
style
=
{{
border
:
'none'
}}
>
<
ul
>
{
Array
.
isArray
(
data
)
?
data
.
map
(
item
=>
StationsItem
(
item
,
props
.
action
,
props
.
setVisible
,
props
.
actionRef
,
props
.
setMenuLoading
,
props
.
data
))
?
data
.
map
(
item
=>
StationsItem
(
item
,
props
.
action
,
props
.
setVisible
,
props
.
actionRef
,
props
.
setMenuLoading
,
props
.
data
),
)
:
null
}
<
/ul
>
<
/div
>
...
...
@@ -180,7 +182,7 @@ const renderSite = ({ data, config, loading, setLoading, action, actionRef, setM
const
[
visible
,
setVisible
]
=
useState
(
false
);
const
[
stationName
,
setStationName
]
=
useState
(
''
);
useEffect
(()
=>
{
window
.
share
.
event
.
on
(
'changeSiteVisible'
,
(
res
)
=>
{
window
.
share
.
event
.
on
(
'changeSiteVisible'
,
res
=>
{
setStationName
(
res
.
currentStationName
);
setVisible
(
res
.
visible
);
});
...
...
@@ -292,11 +294,11 @@ const Layout = props => {
// }, [location.pathname])
useEffect
(()
=>
{
// window.share.event.on('onTopMenuHeaderClick_', res => {
// window.share.event.on('onTopMenuHeaderClick_', res => {
// onTopMenuHeaderClick(res)
// });
// });
window
.
onTopMenuHeaderClick_
=
onTopMenuHeaderClick
window
.
onTopMenuHeaderClick_
=
onTopMenuHeaderClick
;
event
.
on
(
'loading'
,
ret
=>
{
setSubLoading
(
ret
);
...
...
@@ -327,19 +329,19 @@ const Layout = props => {
?
`&generateType=
${
generateType
}
`
:
''
;
const
integrationClient
=
localStorage
.
getItem
(
'integrationClient'
);
if
(
integrationClient
)
client
=
integrationClient
if
(
integrationClient
)
client
=
integrationClient
;
if
(
!
isLogin
)
{
history
.
push
(
`/user/login?client=
${
client
}${
generateType
}
`
,
{
reload
:
true
});
clear
();
props
.
logout
();
}
if
(
props
.
global
.
security
===
"1"
)
{
if
(
props
.
global
.
security
===
'1'
)
{
store
.
off
(
'event:unauthorized'
);
}
else
{
store
.
on
(
'event:unauthorized'
,
()
=>
{
store
.
off
(
'event:unauthorized'
);
const
key
=
`open
${
Date
.
now
()}
`
;
if
(
notify
)
return
false
;
if
(
notify
)
return
false
;
notify
=
true
;
notification
.
open
({
description
:
'登录认证过期,即将跳转到登录页'
,
...
...
@@ -354,8 +356,10 @@ const Layout = props => {
notify
=
null
;
clear
();
props
.
logout
();
})
}}
>
确认
});
}}
>
确认
<
/Button
>
),
key
,
...
...
@@ -388,26 +392,30 @@ const Layout = props => {
const
GetIntegrationConfig
=
()
=>
{
if
(
first
)
{
const
integrationClient
=
localStorage
.
getItem
(
'integrationClient'
);
appService
.
GetIntegrationConfig
({
type
:
'集成登录'
,
userId
:
window
.
globalConfig
.
userInfo
?.
OID
??
null
,
isEnable
:
true
,
client
:
integrationClient
||
props
.
global
.
client
// 只有指定client才能获取集成登录信息
})
.
then
(
res
=>
{
setFirst
(
false
);
const
{
code
,
data
}
=
res
;
if
(
code
==
'0'
)
{
setIntegrationData
(
data
);
}
else
{
setIntegrationData
([]);
}
})
let
list
=
localStorage
.
getItem
(
'integrationData'
);
//
list
=
list
?
JSON
.
parse
(
list
)
:
[];
if
(
Array
.
isArray
(
list
)
&&
list
?.
length
)
{
setIntegrationData
(
list
);
}
else
{
appService
.
GetIntegrationConfig
({
type
:
'集成登录'
,
userId
:
window
.
globalConfig
.
userInfo
?.
OID
??
null
,
isEnable
:
true
,
client
:
integrationClient
||
props
.
global
.
client
,
// 只有指定client才能获取集成登录信息
})
.
then
(
res
=>
{
setFirst
(
false
);
const
{
code
,
data
}
=
res
;
if
(
code
==
'0'
)
{
setIntegrationData
(
data
);
}
else
{
setIntegrationData
([]);
}
});
}
}
}
};
useEffect
(()
=>
{
if
(
window
?.
globalConfig
?.
isIntegration
>=
1
)
{
...
...
@@ -433,7 +441,7 @@ const Layout = props => {
window
.
share
.
event
.
removeAllListeners
(
'updateSite'
);
loginAction
.
events
.
removeListener
(
'toggleIndustry'
,
handleToggleIndustry
);
};
},
[
GetIntegrationConfig
,
loginAction
.
events
,
props
]);
},
[
loginAction
.
events
,
props
]);
useEffect
(()
=>
{
const
needMark
=
()
=>
...
...
@@ -448,7 +456,7 @@ const Layout = props => {
return
()
=>
{
const
marks
=
document
.
querySelectorAll
(
'.pandawatermark_mask_div'
);
if
(
marks
&&
marks
.
length
)
{
Array
.
prototype
.
forEach
.
call
(
marks
,
function
(
dom
,
index
)
{
Array
.
prototype
.
forEach
.
call
(
marks
,
function
(
dom
,
index
)
{
document
.
body
.
removeChild
(
dom
);
});
}
...
...
@@ -460,29 +468,31 @@ const Layout = props => {
const
integrationClient
=
localStorage
.
getItem
(
'integrationClient'
);
// integrationClient存在,则返回集成登录站点
if
(
window
.
globalConfig
.
isIntegration
>
1
||
integrationData
.
length
>
1
||
integrationClient
)
{
if
(
integrationClient
)
{
if
(
integrationClient
)
{
Cookies
.
set
(
integrationClient
,
''
,
{
path
:
'/'
,
});
window
.
globalConfig
.
client
=
integrationClient
;
props
.
updateConfig
(
Object
.
assign
({},
window
.
globalConfig
,
{
client
:
integrationClient
,
}))
props
.
updateConfig
(
Object
.
assign
({},
window
.
globalConfig
,
{
client
:
integrationClient
,
}),
);
sessionStorage
.
setItem
(
'client'
,
integrationClient
);
localStorage
.
removeItem
(
'integrationClient'
);
// localStorage.removeItem('integrationData');
}
// window.qiankunIsCache = false;
history
.
push
(
'/Industry'
);
}
// 非云平台不做响应
if
(
!
props
.
global
.
get
(
'userInfo.site'
))
{
if
(
props
.
global
.
get
(
"isOpenTransitionPage"
))
{
if
(
props
.
global
.
get
(
'isOpenTransitionPage'
))
{
if
(
window
.
qiankunIsCache
)
{
store
.
set
(
'event:refreshCurrentMenu'
,
{
dropCache
:
true
,
action
:
'closeAllTabs'
})
action
:
'closeAllTabs'
,
})
;
}
history
.
push
(
'/homePage'
);
}
...
...
@@ -500,17 +510,17 @@ const Layout = props => {
// setMenuLoading(false);
// }, [props.menu]);
const
onTopMenuHeaderClick
=
(
index
=>
{
const
onTopMenuHeaderClick
=
index
=>
{
props
.
updateCurrentIndex
(
index
);
window
.
share
&&
window
.
share
.
event
.
emit
(
'trigger:updateMenuIndex'
,
index
);
store
.
set
(
'updateMenuIndex'
,
index
);
}
)
;
};
const
logo
=
props
.
global
&&
_
.
isFunction
(
props
.
global
.
get
)
&&
props
.
global
.
get
(
'bannerLogo'
)
?
props
.
global
&&
_
.
isFunction
(
props
.
global
.
transformDevAssetsBaseURL
)
&&
props
.
global
.
transformDevAssetsBaseURL
(
props
.
global
.
get
(
'bannerLogo'
))
_
.
isFunction
(
props
.
global
.
transformDevAssetsBaseURL
)
&&
props
.
global
.
transformDevAssetsBaseURL
(
props
.
global
.
get
(
'bannerLogo'
))
:
defaultSetting
.
logo
;
// 添加一个路由跳转事件
...
...
@@ -556,7 +566,7 @@ const Layout = props => {
if
(
url
.
indexOf
(
'|'
)
>
-
1
)
{
const
params
=
url
.
split
(
'|'
)[
1
];
params
.
split
(
'&'
).
map
(
function
(
item
)
{
params
.
split
(
'&'
).
map
(
function
(
item
)
{
return
(
ret
[
item
.
split
(
'='
)[
0
]]
=
item
.
split
(
'='
)[
1
]);
});
return
ret
;
...
...
@@ -575,11 +585,11 @@ const Layout = props => {
// 渲染集成站点切换弹框
const
renderIntegration
=
(
inData
,
loginAction
,
props
)
=>
{
if
(
inData
.
length
<=
1
)
{
return
<><
/
>
return
<><
/>
;
}
const
choiceOne
=
inData
?.
find
(
function
(
a
)
{
return
a
.
url
?.
indexOf
(
window
?.
globalConfig
?.
client
)
>=
0
})
const
choiceOne
=
inData
?.
find
(
function
(
a
)
{
return
a
.
url
?.
indexOf
(
window
?.
globalConfig
?.
client
)
>=
0
;
})
;
// 切换集成站点
const
checkIntegration
=
(
val
,
loginAction
,
props
)
=>
{
...
...
@@ -590,7 +600,7 @@ const Layout = props => {
if
(
res
.
code
===
0
)
{
setVisible
(
false
);
const
url
=
`
${
val
.
url
+
(
val
.
url
.
indexOf
(
'?'
)
>
0
?
'&'
:
'?'
)
+
val
.
paramName
}
=
${
res
.
data
}
`
;
window
.
open
(
url
,
"_blank"
);
window
.
open
(
url
,
'_blank'
);
}
else
{
setVisible
(
false
);
notification
.
error
({
...
...
@@ -602,15 +612,17 @@ const Layout = props => {
});
}
else
{
setVisible
(
false
);
const
url
=
`
${
val
.
url
+
(
val
.
url
.
indexOf
(
'?'
)
>
0
?
'&'
:
'?'
)
+
val
.
paramName
}
=
${
window
.
globalConfig
?.
token
}
`;
window.open(url, "_blank");
const
url
=
`
${
val
.
url
+
(
val
.
url
.
indexOf
(
'?'
)
>
0
?
'&'
:
'?'
)
+
val
.
paramName
}
=
${
window
.
globalConfig
?.
token
}
`;
window.open(url, '_blank');
}
} else {
if (window.qiankunIsCache) {
store.set('event:refreshCurrentMenu', {
dropCache: true,
action: 'closeAllTabs'
})
action: 'closeAllTabs'
,
})
;
}
const cli = val.url?.indexOf('client=') >= 0 ? val.url.split('client=')[1] : '';
Cookies.set('client', cli, {
...
...
@@ -618,7 +630,8 @@ const Layout = props => {
path: '/',
});
sessionStorage.setItem('client', cli);
const currentProduct = `
__global__recent_productIndex__micro_$
{
window
.
location
.
hostname
}
_$
{
window
.
globalConfig
?.
client
??
'city'
}
`;
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);
...
...
@@ -637,7 +650,7 @@ const Layout = props => {
// props.updateCurrentIndex(0);
// defaultApp();
}
}
}
;
return (
<>
...
...
@@ -647,14 +660,8 @@ const Layout = props => {
visible={visible}
content={
<div className={layoutStyles.integrationList}>
{
<Loading loading={integrationLoading} />
}
{
inData && inData.map((val) => (
<p onClick={() => checkIntegration(val, loginAction, props)}>{val.name}</p>
))
}
{<Loading loading={integrationLoading} />}
{inData && inData.map(val => <p onClick={() => checkIntegration(val, loginAction, props)}>{val.name}</p>)}
</div>
}
arrowPointAtCenter
...
...
@@ -675,8 +682,8 @@ const Layout = props => {
) : null}
</Popover>
</>
)
}
)
;
}
;
// 菜单比对方法
const querySkipUrl = (data, url) => {
...
...
@@ -759,11 +766,9 @@ const Layout = props => {
}}
headerSiteRender={() =>
window?.globalConfig?.isIntegration >= 1
?
// renderIntegration(integrationData, loginAction, props)
? // renderIntegration(integrationData, loginAction, props)
null
:
renderSite({
: renderSite({
data: cityData,
config: props.global,
loading: siteLoading,
...
...
@@ -783,13 +788,14 @@ const Layout = props => {
{dom}
</a>
)}
menuSuffixRender={() => (
props.global?.variableTheme?.navTheme === 'chinaWater' ?
(<img src={require('../assets/basic/chinaWater.png')} style={{width: '100%'}} alt="" />)
: <></>
)}
menuSuffixRender={() =>
props.global?.variableTheme?.navTheme === 'chinaWater' ? (
<img src={require('../assets/basic/chinaWater.png')} style={{ width: '100%' }} alt="" />
) : (
<></>
)
}
>
<div id="micro-container" className="subapp-container">
{props.children}
</div>
...
...
This diff is collapsed.
Click to expand it.
src/pages/bootpage/template/integrationNew/index.js
View file @
15916b72
...
...
@@ -9,6 +9,7 @@ import { connect } from 'react-redux';
import
{
actionCreators
}
from
'@/containers/App/store'
;
import
axios
from
'axios'
;
import
{
getImageUrl
}
from
'@/utils/utils'
;
import
{
getUserInfo
,
getWebSiteConfig
}
from
'@/api/service/base'
;
import
{
FullscreenExitOutlined
,
FullscreenOutlined
}
from
'@ant-design/icons'
;
import
{
message
,
Button
}
from
'antd'
;
...
...
@@ -100,7 +101,7 @@ const IntegrationNew = props => {
})
.
then
(
res1
=>
{
const
list
=
res1
.
data
||
[];
list
.
length
&&
localStorage
.
setItem
(
'integrationData'
,
JSON
.
stringify
(
list
));
setIntegrationData
(
list
);
});
};
...
...
@@ -175,11 +176,24 @@ const IntegrationNew = props => {
}
};
const
toClient
=
(
item
,
loginA
)
=>
{
const
toClient
=
async
(
item
,
loginA
)
=>
{
const
token
=
props
.
global
?.
token
||
Cookies
.
get
(
'token'
);
const
cli
=
item
.
appKey
;
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'
);
}
const
cli
=
item
.
appKey
;
Cookies
.
set
(
'client'
,
cli
,
{
expires
:
86400000
/
(
24
*
60
*
60
*
1000
),
path
:
'/'
,
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment