Browse Source

免密登录 50%

master
wenlele 2 years ago
parent
commit
c01708da84
  1. 2
      api/.vscode/launch.json
  2. 612
      web/client/src/layout/containers/layout/index.jsx
  3. 3
      web/client/src/utils/webapi.js
  4. 9
      web/config.js
  5. 3
      web/package.json
  6. 9
      web/routes/services/weekly.js

2
api/.vscode/launch.json

@ -42,7 +42,7 @@
// //
"--clickHouseUrl http://10.8.30.161", "--clickHouseUrl http://10.8.30.161",
"--clickHousePepEmis pepca_dev", "--clickHousePepEmis pepca8",
"--clickHouseCamworkflow camworkflow", "--clickHouseCamworkflow camworkflow",
"--clickHouseHr hrm", "--clickHouseHr hrm",
] ]

612
web/client/src/layout/containers/layout/index.jsx

@ -10,9 +10,13 @@ import { resize } from '../../actions/global';
import * as NProgress from 'nprogress'; import * as NProgress from 'nprogress';
import PerfectScrollbar from 'perfect-scrollbar'; import PerfectScrollbar from 'perfect-scrollbar';
import { useLocation } from "react-router"; import { useLocation } from "react-router";
import { RouteTable } from '$utils';
import { RouteRequest } from '@peace/utils';
import Cookie from 'js-cookie';
NProgress.configure({ NProgress.configure({
template: ` template: `
<div class="bar" style="height:2px" role="bar"> <div class="bar" style="height:2px" role="bar">
<div class="peg"></div> <div class="peg"></div>
</div> </div>
@ -23,303 +27,359 @@ NProgress.configure({
}); });
let scrollbar let scrollbar
let requestUser = true
// const location111 = useLocation(); // const location111 = useLocation();
const LayoutContainer = props => { const LayoutContainer = props => {
const { const {
dispatch, msg, user, copyright, children, sections, clientWidth, clientHeight, dispatch, msg, user, copyright, children, sections, clientWidth, clientHeight,
location, match, routes, history, socket, location, match, routes, history, socket,
} = props } = props
const [collapsed, setCollapsed] = useState(false) const [collapsed, setCollapsed] = useState(false)
NProgress.start(); NProgress.start();
const resize_ = () => { const resize_ = () => {
dispatch(resize( dispatch(resize(
document.getElementById('HrApp').clientHeight, document.getElementById('HrApp').clientHeight,
document.getElementById('HrApp').clientWidth - (collapsed ? 120 : 240) document.getElementById('HrApp').clientWidth - (collapsed ? 120 : 240)
)); ));
} }
function deepCopy(data) {// function deepCopy (data) {//
//string,number,bool,null,undefined,symbol //string,number,bool,null,undefined,symbol
//object,array,date //object,array,date
if (data && typeof data === "object") { if (data && typeof data === "object") {
// //
if (typeof data === "function") { if (typeof data === "function") {
let tempFunc = data.bind(null); let tempFunc = data.bind(null);
tempFunc.prototype = deepCopy(data.prototype); tempFunc.prototype = deepCopy(data.prototype);
return tempFunc; return tempFunc;
} }
switch (Object.prototype.toString.call(data)) { switch (Object.prototype.toString.call(data)) {
case "[object String]": case "[object String]":
return data.toString(); return data.toString();
case "[object Number]": case "[object Number]":
return Number(data.toString()); return Number(data.toString());
case "[object Boolean]": case "[object Boolean]":
return new Boolean(data.toString()); return new Boolean(data.toString());
case "[object Date]": case "[object Date]":
return new Date(data.getTime()); return new Date(data.getTime());
case "[object Array]": case "[object Array]":
var arr = []; var arr = [];
for (let i = 0; i < data.length; i++) { for (let i = 0; i < data.length; i++) {
arr[i] = deepCopy(data[i]); arr[i] = deepCopy(data[i]);
} }
return arr; return arr;
//js //js
case "[object Object]": case "[object Object]":
var obj = {}; var obj = {};
for (let key in data) { for (let key in data) {
//hasOwnProperty obj.hasOwnProperty(prop) //hasOwnProperty obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key]); obj[key] = deepCopy(data[key]);
} }
return obj; return obj;
} }
} else { } else {
//string,number,bool,null,undefined,symbol //string,number,bool,null,undefined,symbol
return data; return data;
} }
} }
const [allItems, setAllItems] = useState([]) const [allItems, setAllItems] = useState([])
// const [headerItems, setHeaderItems] = useState([]) // const [headerItems, setHeaderItems] = useState([])
const [leftItems, setLeftItems] = useState([]) const [leftItems, setLeftItems] = useState([])
const [leftChange, setLeftChange] = useState(true) const [leftChange, setLeftChange] = useState(true)
const [leftShow, setLeftShow] = useState(false) const [leftShow, setLeftShow] = useState(false)
useEffect(() => { useEffect(() => {
let topItems = []// let topItems = []//
const lastSelectedKeys = localStorage.getItem('poms_selected_sider') const lastSelectedKeys = localStorage.getItem('poms_selected_sider')
let nextItems = []// let nextItems = []//
for (let c of sections) { for (let c of sections) {
if (typeof c.getNavItem == 'function') { if (typeof c.getNavItem == 'function') {
let item = c.getNavItem(user, dispatch); let item = c.getNavItem(user, dispatch);
if (item) { if (item) {
nextItems.push.apply(nextItems, item) nextItems.push.apply(nextItems, item)
if (item.length > 0) { if (item.length > 0) {
for (let j = 0; j < item.length; j++) { for (let j = 0; j < item.length; j++) {
let itm = deepCopy(item[j]); let itm = deepCopy(item[j]);
if (itm.hasOwnProperty('items')) { if (itm.hasOwnProperty('items')) {
for (let i = 0; i < itm.items.length; i++) { for (let i = 0; i < itm.items.length; i++) {
itm.items[i].fatherKey = itm.itemKey itm.items[i].fatherKey = itm.itemKey
delete itm.items[i].items delete itm.items[i].items
}
// topItems.push(itm)
// }
// else {
// topItems.push.apply(topItems, item)
}
} }
} // topItems.push(itm)
} // }
// else {
// topItems.push.apply(topItems, item)
}
}
}
} }
} }
setAllItems(nextItems) }
// setHeaderItems(topItems) setAllItems(nextItems)
if (lastSelectedKeys) {// // setHeaderItems(topItems)
for (let i = 0; i < nextItems.length; i++) { if (lastSelectedKeys) {//
if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) { for (let i = 0; i < nextItems.length; i++) {
if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) {
// let openArr = [] // let openArr = []
// for (let j = 0; j < nextItems[i].items.length; j++) { // for (let j = 0; j < nextItems[i].items.length; j++) {
// openArr.push(nextItems[i].items[j].itemKey) // openArr.push(nextItems[i].items[j].itemKey)
// } // }
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr)) // localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(nextItems[i].items) setLeftItems(nextItems[i].items)
}
} }
setLeftShow(true) }
} setLeftShow(true)
else { }
setLeftShow(false) else {
} setLeftShow(false)
}
window.addEventListener('resize', resize_); window.addEventListener('resize', resize_);
return () => { return () => {
window.removeEventListener('resize', resize_); window.removeEventListener('resize', resize_);
} }
}, []) }, [])
useEffect(() => { useEffect(() => {
let pathnameArr = location.pathname.split('/') let pathnameArr = location.pathname.split('/')
let openArr = [] let openArr = []
for (let i = 0; i < allItems.length; i++) { for (let i = 0; i < allItems.length; i++) {
if (allItems[i].items) { if (allItems[i].items) {
for (let j = 0; j < allItems[i].items.length; j++) { for (let j = 0; j < allItems[i].items.length; j++) {
if (allItems[i].items[j].items) { if (allItems[i].items[j].items) {
for (let k = 0; k < allItems[i].items[j].items.length; k++) { for (let k = 0; k < allItems[i].items[j].items.length; k++) {
if (allItems[i].items[j].items[k].to == location.pathname) { if (allItems[i].items[j].items[k].to == location.pathname) {
for (let o = 0; o < allItems[i].items.length; o++) { for (let o = 0; o < allItems[i].items.length; o++) {
openArr.push(allItems[i].items[o].itemKey) openArr.push(allItems[i].items[o].itemKey)
}
localStorage.setItem('poms_selected_sider', JSON.stringify([pathnameArr[1]]))
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(allItems[i].items)
setLeftShow(true)
}
} }
} localStorage.setItem('poms_selected_sider', JSON.stringify([pathnameArr[1]]))
} // localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(allItems[i].items)
setLeftShow(true)
}
}
}
} }
} }
}, [location]) }
}, [location])
useEffect(() => { useEffect(() => {
NProgress.done(); NProgress.done();
if ((!user || !user.authorized)) { if ((!user || !user.authorized)) {
history.push('/signin'); // history.push('/signin');
} getUserInfoByToken()
if (msg) { }
if (msg.done) { if (msg) {
Notification.success({ if (msg.done) {
// title: msg.done, Notification.success({
content: msg.done, // title: msg.done,
duration: 2, content: msg.done,
}) duration: 2,
} })
if (msg.error) { }
Notification.error({ if (msg.error) {
// title: msg.error, Notification.error({
content: msg.error, // title: msg.error,
duration: 2, content: msg.error,
}) duration: 2,
} })
} }
const dom = document.getElementById('page-content'); }
if (dom) { const dom = document.getElementById('page-content');
if (!scrollbar) { if (dom) {
scrollbar = new PerfectScrollbar('#page-content', { suppressScrollX: true }); if (!scrollbar) {
scrollbar.update(); scrollbar = new PerfectScrollbar('#page-content', { suppressScrollX: true });
} else { scrollbar.update();
scrollbar.update(); } else {
dom.scrollTop = 0; scrollbar.update();
} dom.scrollTop = 0;
} }
}) }
})
const getUserInfoByToken = () => {
if (requestUser) {
requestUser = false;
RouteRequest.get(RouteTable.getDomain).then(res => {
console.log(res);
let token = Cookie.get('pepToken', { domain: res.root });
history.push('/humanAffairs/archivesCenter/personnelArchives/personnelFiles')
// websocket 使 dispatch(login(values.username, values.password)).then(res => {
useEffect(() => { const data = res.payload.user
// console.log(socket) localStorage.setItem('word', JSON.stringify(values.password))
if (socket) { dispatch(actions.layout.initWebSocket({ ioUrl: apiRoot, token: data.token, hrUserId: data.hrUserInfo && hrUserInfo.id }))
socket.on('CAMERA_ONLINE', function (msg) { })
console.info(msg);
if (msg.online == 'ON') { // dispatch(getUserInfoByTokenUrl(token)).then(userRes => {
Notification.success({ // if (userRes.success) {
title: 'Hi', // sessionStorage.setItem('user', JSON.stringify(userRes.payload.data));
content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>已上线</div></div>), // dispatch({
duration: 2, // type: 'INIT_AUTH',
}) // payload: {
} // user: userRes.payload.data
if (msg.online == 'OFF') { // }
Notification.error({ // })
title: 'Hi', // // window.location.href = window.location.href;
content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>发生离线</div></div>), // } else {
duration: 2, // redirectToLogin(true);
}) // }
} // }, error => {
}); // redirectToLogin(true);
return () => { // })
socket.off("CAMERA_ONLINE"); }, error => {
message.error('鉴权失败', 5);
redirectToLogin(true);
})
}
}
const redirectToLogin = (toLogin = false) => {
//
if (!requestlogout) {
requestlogout = true;//退redirectToLoginwindow.location.hrefmessage.warning
RouteRequest.get(RouteTable.getPepWebUrl).then(res => {
if (res.url) {
if (toLogin) {
window.location.href = `${res.url}/signin`;
}
else {
window.location.href = `${res.url}/signin?isLogout=true`;
}
} }
} });
}, [socket]) }
}
return ( // websocket 使
<Layout id="layout" style={{ height: '100%' }}> useEffect(() => {
{ // console.log(socket)
<> if (socket) {
<Layout.Header> socket.on('CAMERA_ONLINE', function (msg) {
<Header console.info(msg);
// headerItems={headerItems} // if (msg.online == 'ON') {
user={user} Notification.success({
pathname={location.pathname} title: 'Hi',
toggleCollapsed={() => { content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>已上线</div></div>),
setCollapsed(!collapsed); duration: 2,
}} })
collapsed={collapsed} }
history={history} if (msg.online == 'OFF') {
tochange={(val) => { Notification.error({
// setLeftChange(!leftChange) // title: 'Hi',
if (val.fatherKey) { content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>发生离线</div></div>),
localStorage.setItem('poms_selected_sider', JSON.stringify([val.itemKey])); duration: 2,
const historyOpenKeys = localStorage.getItem('poms_open_sider'); })
const openKeys = historyOpenKeys && JSON.parse(historyOpenKeys).concat(val.openKey || val.itemKey) || [val.openKey || val.itemKey]
localStorage.setItem('poms_open_sider', JSON.stringify(openKeys));
// for (let i = 0; i < allItems.length; i++) {
// if (val.fatherKey == allItems[i].itemKey) {
// let openArr = []
// for (let j = 0; j < allItems[i].items.length; j++) {
// openArr.push(allItems[i].items[j].itemKey)
// }
// localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey]))
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
// setLeftItems(allItems[i].items)
// }
// }
// setLeftShow(true)
}
else {
localStorage.setItem('poms_open_sider', JSON.stringify([]))
localStorage.removeItem('poms_selected_sider')
// setLeftShow(false)
}
history.push(val.to);
}}
/>
</Layout.Header>
<Layout style={{ height: 'calc(100% - 50px)' }}>
{leftShow ? (<Layout.Sider>
<Sider
sections={sections}
leftItems={leftItems}
dispatch={dispatch}
user={user}
leftChange={leftChange}
pathname={location.pathname}
collapsed={collapsed}
/>
</Layout.Sider>) : ('')}
<Layout.Content>
<div style={{
background: "#F2F3F5",
}}>
<div id="page-content" style={{
height: clientHeight - 12,
minWidth: 520,
position: 'relative',
}}>
<div style={{
minHeight: clientHeight - 32 - 12,
position: 'relative',
padding: '12px 8px',
}}>
{children}
</div>
<Layout.Footer>
<Footer />
</Layout.Footer>
</div>
</div>
</Layout.Content>
</Layout>
</>
} }
</Layout > });
) return () => {
socket.off("CAMERA_ONLINE");
}
}
}, [socket])
return (
<Layout id="layout" style={{ height: '100%' }}>
{
<>
<Layout.Header>
<Header
// headerItems={headerItems} //
user={user}
pathname={location.pathname}
toggleCollapsed={() => {
setCollapsed(!collapsed);
}}
collapsed={collapsed}
history={history}
tochange={(val) => {
// setLeftChange(!leftChange) //
if (val.fatherKey) {
localStorage.setItem('poms_selected_sider', JSON.stringify([val.itemKey]));
const historyOpenKeys = localStorage.getItem('poms_open_sider');
const openKeys = historyOpenKeys && JSON.parse(historyOpenKeys).concat(val.openKey || val.itemKey) || [val.openKey || val.itemKey]
localStorage.setItem('poms_open_sider', JSON.stringify(openKeys));
// for (let i = 0; i < allItems.length; i++) {
// if (val.fatherKey == allItems[i].itemKey) {
// let openArr = []
// for (let j = 0; j < allItems[i].items.length; j++) {
// openArr.push(allItems[i].items[j].itemKey)
// }
// localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey]))
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
// setLeftItems(allItems[i].items)
// }
// }
// setLeftShow(true)
}
else {
localStorage.setItem('poms_open_sider', JSON.stringify([]))
localStorage.removeItem('poms_selected_sider')
// setLeftShow(false)
}
history.push(val.to);
}}
/>
</Layout.Header>
<Layout style={{ height: 'calc(100% - 50px)' }}>
{leftShow ? (<Layout.Sider>
<Sider
sections={sections}
leftItems={leftItems}
dispatch={dispatch}
user={user}
leftChange={leftChange}
pathname={location.pathname}
collapsed={collapsed}
/>
</Layout.Sider>) : ('')}
<Layout.Content>
<div style={{
background: "#F2F3F5",
}}>
<div id="page-content" style={{
height: clientHeight - 12,
minWidth: 520,
position: 'relative',
}}>
<div style={{
minHeight: clientHeight - 32 - 12,
position: 'relative',
padding: '12px 8px',
}}>
{children}
</div>
<Layout.Footer>
<Footer />
</Layout.Footer>
</div>
</div>
</Layout.Content>
</Layout>
</>
}
</Layout >
)
} }
function mapStateToProps(state) { function mapStateToProps (state) {
const { global, auth, ajaxResponse, webSocket } = state; const { global, auth, ajaxResponse, webSocket } = state;
return { return {
title: global.title, title: global.title,
copyright: global.copyright, copyright: global.copyright,
sections: global.sections, sections: global.sections,
actions: global.actions, actions: global.actions,
clientWidth: global.clientWidth, clientWidth: global.clientWidth,
clientHeight: global.clientHeight, clientHeight: global.clientHeight,
msg: ajaxResponse.msg, msg: ajaxResponse.msg,
user: auth.user, user: auth.user,
socket: webSocket.socket socket: webSocket.socket
}; };
} }
export default connect(mapStateToProps)(LayoutContainer); export default connect(mapStateToProps)(LayoutContainer);

3
web/client/src/utils/webapi.js

@ -42,5 +42,6 @@ export const RouteTable = {
apiRoot: "/api/root", apiRoot: "/api/root",
fileUpload: "/_upload/new", fileUpload: "/_upload/new",
cleanUpUploadTrash: "/_upload/cleanup", cleanUpUploadTrash: "/_upload/cleanup",
getWeeklyService: '/_service/weekly' getWeeklyService: '/_service/weekly',
getDomain: '/domain',
}; };

9
web/config.js

@ -13,6 +13,8 @@ dev && console.log('\x1B[33m%s\x1b[0m', '请遵循并及时更新 readme.md,
args.option(['p', 'port'], '启动端口'); args.option(['p', 'port'], '启动端口');
args.option(['u', 'api-url'], 'webapi的URL'); args.option(['u', 'api-url'], 'webapi的URL');
args.option('apiHrUrl', 'webapi的URL 外网可访问'); args.option('apiHrUrl', 'webapi的URL 外网可访问');
args.option(['d', 'domain'], 'web domain');
// 七牛 // 七牛
args.option('qnak', 'qiniuAccessKey'); args.option('qnak', 'qiniuAccessKey');
@ -23,10 +25,13 @@ args.option('qndmn', 'qiniuDomain');
//基本动作-周报后端服务 //基本动作-周报后端服务
args.option('wkys', 'weeklyServices'); args.option('wkys', 'weeklyServices');
const flags = args.parse(process.argv); const flags = args.parse(process.argv);
const API_URL = process.env.API_URL || flags.apiUrl; const API_URL = process.env.API_URL || flags.apiUrl;
const API_HR_URL = process.env.API_HR_URL || flags.apiHrUrl; const API_HR_URL = process.env.API_HR_URL || flags.apiHrUrl;
const FS_HR_DOMAIN = process.env.FS_HR_DOMAIN || flags.domain;
// 七牛 // 七牛
const ANXINCLOUD_QINIU_AK = process.env.ANXINCLOUD_QINIU_ACCESSKEY || flags.qnak; const ANXINCLOUD_QINIU_AK = process.env.ANXINCLOUD_QINIU_ACCESSKEY || flags.qnak;
@ -40,6 +45,7 @@ const ANXINCLOUD_WEEKLY_SERVICES = process.env.ANXINCLOUD_WEEKLY_SERVICES || fla
if ( if (
!API_URL !API_URL
|| !API_HR_URL || !API_HR_URL
|| !FS_HR_DOMAIN
|| !ANXINCLOUD_QINIU_AK || !ANXINCLOUD_QINIU_SK || !ANXINCLOUD_QINIU_BUCKET_RESOURCE || !ANXINCLOUD_QINIU_DOMAIN_QNDMN_RESOURCE || !ANXINCLOUD_QINIU_AK || !ANXINCLOUD_QINIU_SK || !ANXINCLOUD_QINIU_BUCKET_RESOURCE || !ANXINCLOUD_QINIU_DOMAIN_QNDMN_RESOURCE
) { ) {
console.log('缺少启动参数,异常退出'); console.log('缺少启动参数,异常退出');
@ -79,7 +85,8 @@ const product = {
}, },
service: { service: {
weekly: ANXINCLOUD_WEEKLY_SERVICES weekly: ANXINCLOUD_WEEKLY_SERVICES
} },
domain: FS_HR_DOMAIN,
} }
}, { }, {
entry: require('./client').entry,// 静态信息 entry: require('./client').entry,// 静态信息

3
web/package.json

@ -7,7 +7,7 @@
"test": "mocha", "test": "mocha",
"start-vite": "cross-env NODE_ENV=developmentVite npm run start-params", "start-vite": "cross-env NODE_ENV=developmentVite npm run start-params",
"start": "cross-env NODE_ENV=development npm run start-params", "start": "cross-env NODE_ENV=development npm run start-params",
"start-params": "node server -p 5700 -u http://localhost:4700 --apiHrUrl http://localhost:4700 --qnak XuDgkao6cL0HidoMAPnA5OB10Mc_Ew08mpIfRJK5 --qnsk yewcieZLzKZuDfig0wLZ9if9jKp2P_1jd3CMJPSa --qnbkt dev-hr --qndmn http://rjkwed13l.hn-bkt.clouddn.com --wkys http://10.8.30.109:14000", "start-params": "node server -p 5700 -u http://localhost:4700 --apiHrUrl http://localhost:4700 -d localhost --qnak XuDgkao6cL0HidoMAPnA5OB10Mc_Ew08mpIfRJK5 --qnsk yewcieZLzKZuDfig0wLZ9if9jKp2P_1jd3CMJPSa --qnbkt dev-hr --qndmn http://rjkwed13l.hn-bkt.clouddn.com --wkys http://10.8.30.109:14000",
"deploy": "export NODE_ENV=production&& npm run build && node server", "deploy": "export NODE_ENV=production&& npm run build && node server",
"build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js", "build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js",
"build": "cross-env NODE_ENV=production&&webpack --config webpack.config.prod.js" "build": "cross-env NODE_ENV=production&&webpack --config webpack.config.prod.js"
@ -63,6 +63,7 @@
"ezuikit-js": "^0.6.1", "ezuikit-js": "^0.6.1",
"fs-attachment": "^1.0.0", "fs-attachment": "^1.0.0",
"fs-web-server-scaffold": "^1.0.6", "fs-web-server-scaffold": "^1.0.6",
"js-cookie": "^3.0.1",
"js-export-excel": "^1.1.4", "js-export-excel": "^1.1.4",
"koa-better-http-proxy": "^0.2.5", "koa-better-http-proxy": "^0.2.5",
"koa-proxy": "^1.0.0-alpha.3", "koa-proxy": "^1.0.0-alpha.3",

9
web/routes/services/weekly.js

@ -13,6 +13,15 @@ module.exports = {
}; };
}; };
const getDomain = async function (ctx) {
const { domain } = opts;
ctx.status = 200;
ctx.body = { root: domain };
};
router.get('/_service/weekly', getWeeklyService); router.get('/_service/weekly', getWeeklyService);
router.get('/domain', getDomain);
} }
}; };

Loading…
Cancel
Save