Commit cd3ab983 by chengming

修改bug

parent 57206161
...@@ -22,3 +22,4 @@ dll ...@@ -22,3 +22,4 @@ dll
dist dist
src\util\request.js src\util\request.js
package-lock.json package-lock.json
build/config.js
\ No newline at end of file
// 1.计算加载时间 // 1.计算加载时间
function getPerformanceTiming() { function getPerformanceTiming() {
...@@ -59,7 +58,7 @@ function getPerformanceTiming() { ...@@ -59,7 +58,7 @@ function getPerformanceTiming() {
} }
// 2.计算加载时间 // 2.计算加载时间
function getEntryTiming(entry) { function getEntryTiming(entry) {
var t = entry; var t = entry;
...@@ -90,7 +89,7 @@ function getPerformanceTiming() { ...@@ -90,7 +89,7 @@ function getPerformanceTiming() {
} }
// 例如: // 例如:
function entriesTimes() { function entriesTimes() {
var entries = window.performance.getEntries();//这个函数返回的将是一个数组,包含了页面中所有的 HTTP 请求 var entries = window.performance.getEntries();//这个函数返回的将是一个数组,包含了页面中所有的 HTTP 请求
entries.forEach(function (entry) { entries.forEach(function (entry) {
var times = getEntryTiming(entry); var times = getEntryTiming(entry);
...@@ -99,8 +98,8 @@ function getPerformanceTiming() { ...@@ -99,8 +98,8 @@ function getPerformanceTiming() {
} }
entriesTimes() entriesTimes()
$(function() { $(function () {
let comGetLocation={ let comGetLocation = {
//hash parm //hash parm
getUrlParam() { getUrlParam() {
var search = location.search; var search = location.search;
...@@ -109,15 +108,15 @@ $(function() { ...@@ -109,15 +108,15 @@ $(function() {
} }
var queryString = search.split("?")[1]; var queryString = search.split("?")[1];
if (queryString.indexOf("&") != -1) { if (queryString.indexOf("&") != -1) {
var data={}; var data = {};
var arr = queryString.split("&"); // split var arr = queryString.split("&"); // split
arr.map((item)=>{ arr.map((item) => {
data[item.split("=")[0]]=item.substring(item.indexOf("=")+1) data[item.split("=")[0]] = item.substring(item.indexOf("=") + 1)
}) })
return data; return data;
}else { } else {
return ''; return '';
} }
...@@ -125,67 +124,92 @@ $(function() { ...@@ -125,67 +124,92 @@ $(function() {
}; };
function getAuthorization(parms,href_url) { function getAuthorization(parms, href_url) {
if(!parms.md5nm){ if (!parms.md5nm) {
alert("login_name没有找到") alert("login_name没有找到")
return; return;
} }
console.log(href_url,"url") console.log(href_url, "url")
let {appId,mp,companyCode,siteCode,md5nm,token,salt,sign}= parms; let { appId, mp, companyCode, siteCode, md5nm, token, salt, sign } = parms;
console.log(appId,'appid'); console.log(appId, 'appid');
console.log(mp,'mp'); console.log(mp, 'mp');
console.log(appId,'appid'); console.log(appId, 'appid');
console.log(companyCode,'companyCode'); console.log(companyCode, 'companyCode');
console.log(siteCode,'siteCode'); console.log(siteCode, 'siteCode');
console.log(md5nm,'md5nm'); console.log(md5nm, 'md5nm');
console.log(token,'token'); console.log(token, 'token');
console.log(salt,'salt'); console.log(salt, 'salt');
console.log(sign,'sign'); console.log(sign, 'sign');
// md5nm -->name ,mp -> terminalType,hrefUrl // md5nm -->name ,mp -> terminalType,hrefUrl
var data={appId,name:md5nm,token,salt,sign,hrefUrl:href_url,type:parms.authType?parms.authType:1}; var data = { appId, name: md5nm, token, salt, sign, hrefUrl: href_url, type: parms.authType ? parms.authType : 1 };
if(parms.mp==1||parms.mp==0){ if (parms.mp == 1 || parms.mp == 0) {
data.terminalType=3; data.terminalType = 3;
}else{ } else {
data.terminalType=parms.mp; data.terminalType = parms.mp;
} }
var origin= location.origin; var origin = location.origin;
$.ajax({ $.ajax({
type: "post", type: "post",
url: origin+"/system/public/api/plus/getAccount?companyCode=" + companyCode + "&siteCode=" + siteCode, url: origin + "/system/public/api/plus/getAccount?companyCode=" + companyCode + "&siteCode=" + siteCode,
async: true, async: true,
dataType: "json", dataType: "json",
contentType: 'application/json;charset=UTF-8', contentType: 'application/json;charset=UTF-8',
data:JSON.stringify(data), data: JSON.stringify(data),
success: function (res) { success: function (res) {
if (res.code == 1000) { if (res.code == 1000) {
sessionStorage.setItem("mgtk",res.data.Authorization) sessionStorage.setItem("mgtk", res.data.Authorization)
sessionStorage.setItem("userName", res.data.userInfo.name); sessionStorage.setItem("userName", res.data.userInfo.name);
sessionStorage.setItem("dev", res.data.userInfo.dev); sessionStorage.setItem("dev", res.data.userInfo.dev);
href_url=decodeURIComponent(href_url);
// 新增:设置用户权限到localStorage
if (res.data.authRole && Array.isArray(res.data.authRole)) {
const permissionsArray = res.data.authRole.map(role => role.code);
localStorage.setItem("userPermissions", JSON.stringify(permissionsArray));
// 触发权限更新事件 - 使用更可靠的方式
setTimeout(() => {
const event = new CustomEvent("permissionsUpdate", {
detail: { permissions: permissionsArray }
});
window.dispatchEvent(event);
console.log('RJump: 权限更新事件已触发:', permissionsArray);
}, 100);
} else {
localStorage.setItem("userPermissions", "[]");
setTimeout(() => {
const event = new CustomEvent("permissionsUpdate", {
detail: { permissions: [] }
});
window.dispatchEvent(event);
console.log('RJump: 权限更新事件已触发: []');
}, 100);
}
href_url = decodeURIComponent(href_url);
location.replace(href_url); location.replace(href_url);
}else { } else {
$("#body").html("<span style='color: red'>错误信息:</span>"+JSON.stringify(res)) $("#body").html("<span style='color: red'>错误信息:</span>" + JSON.stringify(res))
} }
}, },
error:function (err) { error: function (err) {
$("#body").html(`<span style='color: red'>错误信息:${JSON.stringify(err)}</span>`) $("#body").html(`<span style='color: red'>错误信息:${JSON.stringify(err)}</span>`)
} }
}); });
}; };
let datas= comGetLocation.getUrlParam(); let datas = comGetLocation.getUrlParam();
console.log('集合',datas); console.log('集合', datas);
var parms = datas; var parms = datas;
let {appId,mp,companyCode,siteCode,md5nm,token,salt,sign}= parms; let { appId, mp, companyCode, siteCode, md5nm, token, salt, sign } = parms;
if(appId&&companyCode&&siteCode&&md5nm&&token&&salt&&sign){ if (appId && companyCode && siteCode && md5nm && token && salt && sign) {
}else{ } else {
alert("参数不全,不发请求跳转"); alert("参数不全,不发请求跳转");
return; return;
} }
getAuthorization(parms,datas.href_url); getAuthorization(parms, datas.href_url);
}); });
\ No newline at end of file
var os = require('os'), IP = "http://10.10.12.94:8090", ifaces = os.networkInterfaces() // 获取本机IP var os = require('os');
// 修改为指向项目根目录的config.js
const config = require('./config');
let IP = config.IP;
const ifaces = os.networkInterfaces();
out: out:
for (var i in ifaces) { for (var i in ifaces) {
for (var j in ifaces[i]) { for (var j in ifaces[i]) {
...@@ -9,22 +15,5 @@ for (var i in ifaces) { ...@@ -9,22 +15,5 @@ for (var i in ifaces) {
} }
} }
}; };
const host = {
prod: {
BASE_URL: "https://mg.kmelearning.com",
},
deve: {
BASE_URL: "https://mg.fairyclass.cn",
},
sit: {
BASE_URL: "https://mg.fairyclass.cn/",
},
uat: {
BASE_URL: "https://uat.mg.kmelearning.com",
},
other: {
BASE_URL: "",
},
};
module.exports = {IP,host}; module.exports = {IP, host: config.host};
\ No newline at end of file \ No newline at end of file
...@@ -12,20 +12,65 @@ ...@@ -12,20 +12,65 @@
* <App /> * <App />
* </AuthProvider> * </AuthProvider>
*/ */
import React, { createContext, useState, useEffect } from "react"; import React, { createContext, useState, useEffect, useCallback } from "react";
export const AuthContext = createContext(); export const AuthContext = createContext();
export const AuthProvider = ({ children }) => { export const AuthProvider = ({ children }) => {
const [userPermissions, setUserPermissions] = useState([]); const [userPermissions, setUserPermissions] = useState([]);
// 使用useCallback优化更新函数,避免不必要的重新渲染
const updatePermissions = useCallback((newPermissions) => {
const permissionsArray = Array.isArray(newPermissions) ? newPermissions : [];
console.log('AuthContext: 更新权限:', permissionsArray);
// 更新状态
setUserPermissions(permissionsArray);
// 更新localStorage
localStorage.setItem("userPermissions", JSON.stringify(permissionsArray));
// 触发自定义事件,确保当前窗口能收到权限更新
window.dispatchEvent(new CustomEvent("permissionsUpdate", {
detail: { permissions: permissionsArray }
}));
}, []);
useEffect(() => { useEffect(() => {
// 初始化权限
const perms = JSON.parse(localStorage.getItem("userPermissions") || "[]"); const perms = JSON.parse(localStorage.getItem("userPermissions") || "[]");
console.log('AuthContext: 初始化权限:', perms);
setUserPermissions(perms); setUserPermissions(perms);
}, []);
// 监听 localStorage 变化(其他标签页修改时触发)
const handleStorageChange = (e) => {
if (e.key === "userPermissions") {
console.log('AuthContext: storage事件触发,权限更新:', e.newValue);
const newPerms = JSON.parse(e.newValue || "[]");
setUserPermissions(newPerms);
}
};
// 监听自定义权限更新事件(当前标签页修改时触发)
const handlePermissionsUpdate = (e) => {
if (e.detail && Array.isArray(e.detail.permissions)) {
console.log('AuthContext: 自定义权限更新事件触发:', e.detail.permissions);
setUserPermissions(e.detail.permissions);
}
};
// 添加事件监听器
window.addEventListener("storage", handleStorageChange);
window.addEventListener("permissionsUpdate", handlePermissionsUpdate);
return () => {
window.removeEventListener("storage", handleStorageChange);
window.removeEventListener("permissionsUpdate", handlePermissionsUpdate);
};
}, []); // 空依赖数组,只在组件挂载时执行一次
return ( return (
<AuthContext.Provider value={{ userPermissions }}> <AuthContext.Provider value={{ userPermissions, updatePermissions }}>
{children} {children}
</AuthContext.Provider> </AuthContext.Provider>
); );
......
import React, { useContext, useEffect, useState } from "react";
import { AuthContext } from "./AuthContext";
/** /**
* @file @/common/permissions/Permission.jsx * 权限控制组件
* @description 控制组件渲染权限
* @param {Object} props - 组件属性 * @param {Object} props - 组件属性
* @param {React.ReactNode} props.children - 需要权限控制的子组件 * @param {string|string[]} props.permission - 需要的权限
* @param {string|string[]} props.permission - 所需权限字符串或数组 * @param {string} props.mode - 权限检查模式:'and' | 'or',默认 'and'
* @param {'or' | 'and'} [props.mode='or'] - 权限匹配模式,'or' 表示满足任一权限即可,'and' 表示需满足所有权限 * @param {React.ReactNode} props.children - 子组件
* @param {React.ReactNode} [props.fallback=null] - 无权限时显示的替代组件,默认为 null(不显示) * @param {React.ReactNode} props.fallback - 无权限时显示的组件
* @returns {React.ReactNode} - 根据权限渲染子组件或替代组件 * @returns {React.ReactNode} - 根据权限条件渲染的组件
* @author Lichen
* @date 2025/09/28
* @example
* import Permission from '@/common/permissions/Permission';
* <Permission permission="edu_site_admin">
* <button>用户管理</button>
* </Permission>
*
* <Permission permission={['edu_site_admin']} mode="and" fallback={<span>无权限</span>}>
* <button>删除用户</button>
* </Permission> // mode="and" 表示权限全部满足时才显示组件,否则显示 fallback
*
* <Permission permission={['edu_site_admin']} mode="or">
* <button>修改用户</button>
* </Permission> // mode="or" 表示权限满足其一时显示组件,否则显示 fallback
*/ */
import usePermission from "./usePermission"; const Permission = ({ permission, mode = "and", children, fallback = null }) => {
const { userPermissions } = useContext(AuthContext);
const [forceUpdate, setForceUpdate] = useState(0);
// 监听权限更新事件,强制重新渲染
useEffect(() => {
const handlePermissionsUpdate = () => {
console.log('Permission组件: 收到权限更新事件,强制重新渲染');
setForceUpdate(prev => prev + 1);
};
window.addEventListener("permissionsUpdate", handlePermissionsUpdate);
return () => {
window.removeEventListener("permissionsUpdate", handlePermissionsUpdate);
};
}, []);
// 权限检查函数
const checkPermission = () => {
if (!userPermissions || !Array.isArray(userPermissions)) return false;
if (typeof permission === "string") {
return userPermissions.includes(permission);
}
if (Array.isArray(permission)) {
if (mode === "and") {
return permission.every(p => userPermissions.includes(p));
} else {
return permission.some(p => userPermissions.includes(p));
}
}
return false;
};
const Permission = ({ children, permission, mode = "or", fallback = null }) => { // 使用forceUpdate确保权限更新后重新渲染
const hasPermission = usePermission(); return checkPermission() ? children : fallback;
return hasPermission(permission, mode) ? children : fallback;
}; };
export default Permission; export default Permission;
\ No newline at end of file
/**
* @file @/common/permissions/permissionUtils.js
* @description 权限工具函数
* @author Lichen
* @date 2025/09/28
*/
/**
* 更新用户权限并触发更新事件
* @param {string[]} permissions - 新的权限数组
*/
export const updateUserPermissions = (permissions) => {
const permissionsArray = Array.isArray(permissions) ? permissions : [];
console.log('权限工具函数:更新权限为:', permissionsArray);
// 更新localStorage
localStorage.setItem("userPermissions", JSON.stringify(permissionsArray));
// 触发自定义事件,通知所有权限组件更新
const event = new CustomEvent("permissionsUpdate", {
detail: { permissions: permissionsArray }
});
window.dispatchEvent(event);
// 为了确保兼容性,也触发storage事件(主要给其他标签页使用)
try {
window.dispatchEvent(new StorageEvent("storage", {
key: "userPermissions",
newValue: JSON.stringify(permissionsArray),
oldValue: localStorage.getItem("userPermissions"),
url: window.location.href
}));
} catch (e) {
// 在某些浏览器中,手动创建StorageEvent可能不支持,忽略错误
console.log('StorageEvent创建失败,使用自定义事件:', e);
}
};
/**
* 触发权限更新事件
* @param {string[]} permissions - 新的权限数组
*/
export const triggerPermissionsUpdate = (permissions) => {
updateUserPermissions(permissions);
};
/**
* 获取当前用户权限
* @returns {string[]} 权限数组
*/
export const getCurrentPermissions = () => {
return JSON.parse(localStorage.getItem("userPermissions") || "[]");
};
/**
* 清除用户权限
*/
export const clearPermissions = () => {
updateUserPermissions([]);
};
\ No newline at end of file
...@@ -536,7 +536,7 @@ class homePage extends Component { ...@@ -536,7 +536,7 @@ class homePage extends Component {
// 使用 formatter 来显示百分比 // 使用 formatter 来显示百分比
return `${params.marker}${params.name}${parseFloat( return `${params.marker}${params.name}${parseFloat(
params.value params.value
)}%`; // 使用计算后的百分比值 ).toFixed(2)}%`; // 使用计算后的百分比值
}, },
}, },
type: "bar", type: "bar",
...@@ -549,7 +549,9 @@ class homePage extends Component { ...@@ -549,7 +549,9 @@ class homePage extends Component {
position: "top", position: "top",
formatter: function (params) { formatter: function (params) {
// 使用 formatter 来显示百分比 // 使用 formatter 来显示百分比
return `${params.value}%`; return `${parseFloat(
params.value
).toFixed(2)}%`;
}, },
textStyle: { textStyle: {
//数值样式 //数值样式
......
...@@ -40,7 +40,6 @@ export function exfetchR(data, cb, check) { ...@@ -40,7 +40,6 @@ export function exfetchR(data, cb, check) {
// 校验token // 校验token
if (check) { if (check) {
url = checkToken; url = checkToken;
// let authorization = cookie.load("token");
let authorization = sessionStorage.getItem("mgtk"); let authorization = sessionStorage.getItem("mgtk");
data = { authorization, terminalType: "1" }; data = { authorization, terminalType: "1" };
} }
...@@ -55,19 +54,21 @@ export function exfetchR(data, cb, check) { ...@@ -55,19 +54,21 @@ export function exfetchR(data, cb, check) {
const authRole = res?.data?.authRole || []; const authRole = res?.data?.authRole || [];
if (authRole.length > 0) { if (authRole.length > 0) {
userPermissions = JSON.stringify(authRole.map(role => role.code)); userPermissions = JSON.stringify(authRole.map(role => role.code));
window.localStorage.setItem("userPermissions", userPermissions);
}else{
window.localStorage.setItem("userPermissions", userPermissions);
} }
//只有社群的话直接滚走去社群 // 确保userPermissions先写入localStorage
window.localStorage.setItem("userPermissions", userPermissions);
// 触发权限更新事件,确保权限上下文能收到更新
window.dispatchEvent(new CustomEvent("permissionsUpdate", {
detail: { permissions: JSON.parse(userPermissions || "[]") }
}));
// 只有社群的话直接滚走去社群
if (res.data.isOnlyCommunity) { if (res.data.isOnlyCommunity) {
sessionStorage.setItem("mgtk", res.data.Authorization); sessionStorage.setItem("mgtk", res.data.Authorization);
return cb(res); return cb(res);
} else { } else {
if (cb) {
cb(res);
}
// 登录 // 登录
if (!check) { if (!check) {
// 临时设置语言,后期需要根据选择语言更改 // 临时设置语言,后期需要根据选择语言更改
...@@ -76,20 +77,21 @@ export function exfetchR(data, cb, check) { ...@@ -76,20 +77,21 @@ export function exfetchR(data, cb, check) {
setGlobalData("companyCode", location.pathname.split("/")[1]); setGlobalData("companyCode", location.pathname.split("/")[1]);
setGlobalData("siteCode", location.pathname.split("/")[2]); setGlobalData("siteCode", location.pathname.split("/")[2]);
// 存储token // 存储token
// cookie.save("token", res.data.Authorization);
sessionStorage.setItem("mgtk", res.data.Authorization); sessionStorage.setItem("mgtk", res.data.Authorization);
// cookie.save("token", res.data.Authorization);
} }
// 任意进入 // 任意进入
// 临时设置语言,后期需要根据选择语言更改
setGlobalData("language", "zh-CN"); setGlobalData("language", "zh-CN");
// cookie.save("userName", res.data.userInfo.fullName);//bug-12952-cwj
sessionStorage.setItem("userName", res.data.userInfo.fullName); sessionStorage.setItem("userName", res.data.userInfo.fullName);
// 站点code // 站点code
setGlobalData("companyCode", location.pathname.split("/")[1]); setGlobalData("companyCode", location.pathname.split("/")[1]);
setGlobalData("siteCode", location.pathname.split("/")[2]); setGlobalData("siteCode", location.pathname.split("/")[2]);
// 更新菜单和用户信息 // 更新菜单和用户信息
dispatch({ type: Types.SIGN_FORM, userLogin: res.data }); dispatch({ type: Types.SIGN_FORM, userLogin: res.data });
// 最后执行回调函数,确保所有数据都已保存
if (cb) {
cb(res);
}
} }
} }
}); });
......
...@@ -24,6 +24,9 @@ import intl from "react-intl-universal"; ...@@ -24,6 +24,9 @@ import intl from "react-intl-universal";
import func from "@/common/commonFunc"; import func from "@/common/commonFunc";
import { locales } from "@/locales/api"; import { locales } from "@/locales/api";
import { publicLanguageGet } from "@/common/Layout/Header/redux/actions"; import { publicLanguageGet } from "@/common/Layout/Header/redux/actions";
// 导入权限上下文
import { AuthProvider } from "@/common/permissions/AuthContext";
// end // end
const zh_CN = require("@/locales/zh-CN.json") const zh_CN = require("@/locales/zh-CN.json")
const en_US = require("@/locales/en-US.json") const en_US = require("@/locales/en-US.json")
...@@ -92,31 +95,22 @@ class Routes extends React.Component { ...@@ -92,31 +95,22 @@ class Routes extends React.Component {
render() { render() {
let cache = sessionStorage.getItem('lang') || 'zh_CN'; let cache = sessionStorage.getItem('lang') || 'zh_CN';
// intl.init({
// // currentLocale: localStorage.getItem("lang") || "zh_CN",
// currentLocale: cache,
// locales: { [cache]: this.props.languageType },
// fallbackLocale: null
// });
intl.init({ intl.init({
// currentLocale: localStorage.getItem("lang") || "zh_CN",
currentLocale: 'zh_CN', currentLocale: 'zh_CN',
locales: { zh_CN: zh_CN}, locales: { zh_CN: zh_CN},
fallbackLocale: null fallbackLocale: null
}); });
let languageBag = sessionStorage.getItem('lang') || 'zh_CN' let languageBag = sessionStorage.getItem('lang') || 'zh_CN'
// antd 语言包
// let localeLangage = require("antd/es/locale/" + this.props.langage + ".js");
let localeLangage = require("antd/es/locale/" + languageBag + ".js"); let localeLangage = require("antd/es/locale/" + languageBag + ".js");
return ( return (
<ConfigProvider <ConfigProvider
csp={{ nonce: "d3ne7uWP43Bhr0e" }} csp={{ nonce: "d3ne7uWP43Bhr0e" }}
locale={localeLangage.default} locale={localeLangage.default}
> >
{/* 添加权限上下文包装 */}
<AuthProvider>
<Router history={history}> <Router history={history}>
<Suspense fallback={<div style={{ paddingTop: '50%', textAlign: 'center' }}><Spin tip="加载中..." /></div>}> <Suspense fallback={<div style={{ paddingTop: '50%', textAlign: 'center' }}><Spin tip="加载中..." /></div>}>
<Switch> <Switch>
...@@ -148,6 +142,7 @@ class Routes extends React.Component { ...@@ -148,6 +142,7 @@ class Routes extends React.Component {
</Switch> </Switch>
</Suspense> </Suspense>
</Router> </Router>
</AuthProvider>
</ConfigProvider> </ConfigProvider>
); );
} }
......
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