Compare commits

...

2 Commits

Author SHA1 Message Date
ccy
e3fd214f4a Merge branch 'master' of http://121.41.2.71:3000/wyw/mh_jy_safe_web 2025-12-26 15:23:37 +08:00
ccy
4b30915a10 websocket刷新菜单 2025-12-26 15:23:06 +08:00
7 changed files with 177 additions and 10 deletions

View File

@ -3,13 +3,13 @@ import React from 'react'
import { connect } from 'dva'
// 组件库
import { Modal, Form, Input, InputNumber, message, Tabs, Button, Row, Col } from 'antd'
import { LayoutCard, AlarmNotice } from '@woowalker/feui'
import { LayoutCard, AlarmNotice } from '../../feui'
// eslint-disable-next-line no-unused-vars
import FormPage from '../FormPage'
import ListPage from '../Table/ListPage'
// eslint-disable-next-line no-unused-vars
import editPage from '../../models/editPage'
import { Socket } from '@woowalker/feui'
import { Socket } from '../../feui'
import config from '../../config'
// 样式
import styles from './edit.css'

View File

@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'dva'
import { Icon, Badge } from 'antd'
import { Icon, Badge, Modal } from 'antd'
import { Scrollbars } from 'react-custom-scrollbars'
import IFComponent from '../common/IFComponent'
import Socket from '../utils/socket'
@ -14,6 +14,12 @@ function AlarmNotice (props) {
TotalCount: 0,
Message: ''
})
const loginRef = useRef(props.login)
useEffect(() => {
loginRef.current = props.login
}, [props.login])
useEffect(() => {
let timer = -1
if (msg && !msg.TotalCount && !msg.Message && visible) {
@ -36,6 +42,7 @@ function AlarmNotice (props) {
if (UserId && OrgId) {
const socketIns = new Socket({
url: props.webSocketHost,
autoReconnect: true,
onopen: handleSocketOpened,
onmessage: handleSocketOnMsg
})
@ -48,7 +55,7 @@ function AlarmNotice (props) {
}, [props.login.userId, props.login.OrgId, props.login.Tenant])
const handleSocketOpened = (socketIns) => {
const { user, userId: UserId, OrgId, Tenant } = props.login
const { user, userId: UserId, OrgId, Tenant } = loginRef.current
const openedPayload = {
TypeCode: 'P0001',
Tenant,
@ -56,6 +63,7 @@ function AlarmNotice (props) {
UserId,
UserName: user.NAME,
OrgId,
Tenant,
ClientType: 0
})
}
@ -65,16 +73,37 @@ function AlarmNotice (props) {
const handleSocketOnMsg = (data) => {
if (data) {
console.log('收到消息', data)
const { TypeCode, Data } = JSON.parse(data)
if (TypeCode === 'M0003' && Data) {
Data.Message && !isEqual(Data.Message, refOfMsg.current.Message) && !visible && setVisible(true)
setMsg(Data)
} else if (TypeCode === 'MQ02') {
console.log('触发权限变更通知', data)
Modal.warning({
title: '权限变更通知',
content: '当前用户权限已变更!',
okText: '确认',
onOk: () => {
const { userId, OrgId, Tenant } = loginRef.current
props.dispatch({
type: 'login/getLoginInfo',
payload: {
UserId: userId,
OrgId,
Tenant,
onlyData: false,
noReload: true
}
})
}
})
}
}
}
const handleSocketSendMsg = (Data, socketIns) => {
const { userId: UserId, OrgId, Tenant } = props.login
const { userId: UserId, OrgId, Tenant } = loginRef.current
// 这里 Data 需要 JSON.stringify(Data) 是因为后端限制
const payload = { TypeCode: 'M0003', Tenant, Data: JSON.stringify({ UserId, OrgId, ...Data }) }
socketIns = socketIns || socket.current

View File

@ -2,7 +2,7 @@ import React, { useState, useMemo, useEffect } from 'react';
import { connect } from 'dva';
import { withRouter } from 'dva/router';
import { Dropdown, Icon, Menu, message, Button, Modal } from 'antd';
import { HeaderSearch as OPTSearch, PictureThumb } from '@woowalker/feui';
import { HeaderSearch as OPTSearch, PictureThumb } from '../feui';
import ModifyPassword from '../components/MainPage/ModifyPassword';
import FoUserInfoShow from '../components/MainPage/FoUserInfoShow';
import FeedbackQuestion from '../components/MainPage/FeedbackQuestion';

View File

@ -64,7 +64,7 @@ class Main extends React.Component {
<React.Fragment>
{matchBackend ? <BackendLayout {...this.props} /> : <MainLayout {...this.props} />}
{/* 去掉首页报警框 */}
{/* {matchLogin ? null : <AlarmEditModal />} */}
{matchLogin ? null : <AlarmEditModal />}
</React.Fragment>
)
}

View File

@ -245,6 +245,144 @@ export default {
}
},
// 登录、获取信息
*getLoginInfo({ payload, loginPayload }, { call, put, select }) {
const loginUserVerify = storage("lacal").getItem("loginUserVerify").val || {};
const { username, password } = loginUserVerify;
const webOrgId = storage("lacal").getItem("webOrgId").val;
const formConfigVersion = storage("lacal").getItem("formConfigVersion").val;
const newPayload = {
...payload,
Parameter1: payload.Parameter1 || username,
Parameter2: payload.Parameter2 || password,
Parameter4: payload.Parameter4 || webOrgId,
Parameter5: payload.Parameter5 || formConfigVersion,
Parameter7: true,
};
const ret = yield call(appService.getLoginInfo, newPayload);
if (ret) {
if (loginPayload) {
const {
accessToken,
refreshToken,
expiresIn,
username,
password,
userid,
} = loginPayload;
storage("lacal").setItem("accessToken", accessToken); // access_token存入localStorage
storage("lacal").setItem("refreshToken", refreshToken);
storage("lacal").setItem("expiresIn", expiresIn);
storage("lacal").setItem("refreshTimestamp", new Date().getTime());
storage("lacal").setItem("userid", userid);
storage("lacal").setItem("loginUserVerify", { username, password }); // 登录凭证存入localStorage
}
storage("lacal").setItem("webOrgId", ret.User.ORG_ID);
storage("lacal").setItem("webUserInfo", ret.User);
storage("lacal").setItem("DataRule", ret.DataRule || []);
storage("lacal").setItem("OrgRule", ret.OrgRule || []);
storage("lacal").setItem("departmentId", ret.User.DEPARTMENT_ID);
storage("lacal").setItem("MineType", ret.User.MineType);
storage("lacal").setItem("UserType", ret.UserType);
storage("lacal").setItem("baseConfig", ret.BaseConfig);
storage("lacal").setItem("roles", ret.Roles || []);
storage("lacal").setItem("rolePerm", ret.Nav_RolePerm || {});
const localStorage = window.localStorage;
ret.FormConfigVersion &&
storage("lacal").setItem("formConfigVersion", ret.FormConfigVersion);
// 拍平 Menus
const flatMenus = [];
const copyMenus = cloneDeep(ret.Menus);
recurseMenu(copyMenus, undefined, flatMenus);
ret.Menus = copyMenus;
const safeFlatMenus = flatMenus.map(m => ({ ID: m.ID, NAME: m.NAME, CODE: m.CODE, MENU_LEVEL: m.MENU_LEVEL, idLevels: m.idLevels, nameLevels: m.nameLevels, menuLevels: m.menuLevels, Nav_MenuForm: m.Nav_MenuForm, IS_RESIDENT: m.IS_RESIDENT, ICON: m.ICON, IS_BACKEND: m.IS_BACKEND, MineType: m.MineType }));
const pruneMenus = (arr) => arr.map(it => ({ Node: { ID: it.Node.ID, NAME: it.Node.NAME, CODE: it.Node.CODE, MENU_LEVEL: it.Node.MENU_LEVEL, MineType: it.Node.MineType, Nav_MenuForm: it.Node.Nav_MenuForm, IS_RESIDENT: it.Node.IS_RESIDENT, ICON: it.Node.ICON, IS_BACKEND: it.Node.IS_BACKEND }, Children: (it.Children && it.Children.length) ? pruneMenus(it.Children) : [] }));
const safeMenus = pruneMenus(copyMenus);
storage("lacal").setItem("menus", safeMenus);
storage("lacal").setItem("flatMenus", safeFlatMenus);
const currentMineType = localStorage.getItem("currentMineType");
if (currentMineType) {
storage("lacal").setItem("currentMineType", currentMineType);
var filterObj = function (item) {
if (item.Node.MineType && item.Node.MineType.indexOf("_" + currentMineType + "_") > -1) {
if (item.Children.length !== 0) {
item.Children = item.Children.filter(function (child) {
if (child.Children.length !== 0) {
return filterObj(child);
} else {
if (child.Node.MineType) {
return child.Node.MineType.indexOf("_" + currentMineType + "_") > -1
}
}
});
if (item.Children.length > 0) {
return true;
}
} else {
if (item.Node.MineType) {
return item.Node.MineType.indexOf("_" + currentMineType + "_") > -1;
}
return;
}
return true;
}
};
var filter = ret.Menus.filter(function (item) {
return filterObj(item);
});
ret.Menus = filter;
}
// 存储 model state
yield put({
type: "save",
payload: {
loginInfo: ret,
OrgId: ret.User.ORG_ID,
OrgCode: ret.User.Nav_Org ? ret.User.Nav_Org.CODE : "",
baseConfig: ret.BaseConfig,
userType: ret.UserType,
currentMineType: currentMineType,
roles: ret.Roles,
rolePerm: ret.Nav_RolePerm,
userId: ret.User.ID,
user: ret.User,
flatMenus,
},
});
// 不是很清楚为什么这里要清除这个 requestKey
// const localStorage = window.localStorage
if (localStorage) {
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
if (key.indexOf("_requestKey") > -1) {
localStorage.removeItem(key);
}
}
}
// 获取消息提醒
const getNoticesParams = initFilter(
ret.User.ORG_ID,
"",
"CREATE_TIME",
1,
1,
ret.User.ID
);
yield put({ type: "getNotices", payload: getNoticesParams });
// 刷新页面以应用新的权限
if (!payload.noReload) {
window.location.reload();
}
}
return ret;
},
// 登录、获取信息
*toLogin({ payload, loginPayload }, { call, put, select }) {
const ret = yield call(appService.getLoginInfo, payload);
if (ret) {

View File

@ -17,7 +17,7 @@ export function request(url, options, onlyData, requestKey, onException) {
if (response.status === 401) {
window.localStorage.removeItem('accessToken')
history.replace({ pathname: '/login' })
throw new Error('token过期')
//throw new Error('token过期')
}
requestKey && window.localStorage.removeItem(requestKey)
return response.json()