This commit is contained in:
2026-03-18 10:22:52 +08:00
parent 9eb1aa0568
commit 2b0a2a9926
3 changed files with 727 additions and 694 deletions
@@ -1,6 +1,6 @@
<!doctype html>
<html lang="${lang,escape}">
<head>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1" />
<meta name="description" content="${AppName!}" />
@@ -102,26 +102,26 @@
<script nonce="${cspNonce!}">
// 在加载 lodash 后、使用前插入
const originalDefaultsDeep = window._.defaultsDeep;
const originalDefaultsDeep = window._.defaultsDeep
window._.defaultsDeep = function(...args) {
// 先对所有参数做原型污染清洗
const cleanArgs = args.map(arg => sanitizeForPrototypePollution(arg));
return originalDefaultsDeep.apply(window._, cleanArgs);
};
const cleanArgs = args.map(arg => sanitizeForPrototypePollution(arg))
return originalDefaultsDeep.apply(window._, cleanArgs)
}
function sanitizeForPrototypePollution(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) return obj.map(sanitizeForPrototypePollution);
if (obj === null || typeof obj !== "object") return obj
if (Array.isArray(obj)) return obj.map(sanitizeForPrototypePollution)
const clean = {};
const clean = {}
for (const key in obj) {
if (!Object.hasOwn(obj, key)) continue;
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
continue;
if (!Object.hasOwn(obj, key)) continue
if (key === "__proto__" || key === "constructor" || key === "prototype") {
continue
}
clean[key] = sanitizeForPrototypePollution(obj[key]);
clean[key] = sanitizeForPrototypePollution(obj[key])
}
return clean;
return clean
}
</script>
@@ -131,8 +131,8 @@
ELEMENT.Dialog.props.closeOnClickModal.default = false
ELEMENT.Dialog.props.top.default = "50px"
ELEMENT.Table.props.border.default = true
ELEMENT.TableColumn.props.headerAlign.default = 'center'
ELEMENT.TableColumn.props.align.default = 'center'
ELEMENT.TableColumn.props.headerAlign.default = "center"
ELEMENT.TableColumn.props.align.default = "center"
ELEMENT.TableColumn.props.showOverflowTooltip = { type: Boolean, default: true }
Vue.use(ELEMENT, {
zIndex: 20000
@@ -221,7 +221,7 @@
// )
// 连接建立时不立即发送 join,等待订阅完成
this.ping()
console.info('websocket open success')
console.info("websocket open success")
}
}
@@ -353,13 +353,13 @@
Vue.prototype.$downLoad = commonUtil.downLoadService
Vue.prototype.$processStatusMap = {
10: {text: "进行中", class: "doing"},
20: {text: "已完成", class: "finished"},
30: {text: "已撤回", class: "withdraw"},
40: {text: "强行终止", class: "interrupt"},
45: {text: "已拒绝", class: "reject"},
50: {text: "挂起", class: "pending"},
99: {text: "已废弃", class: "abandon"}
10: { text: "进行中", class: "doing" },
20: { text: "已完成", class: "finished" },
30: { text: "已撤回", class: "withdraw" },
40: { text: "强行终止", class: "interrupt" },
45: { text: "已拒绝", class: "reject" },
50: { text: "挂起", class: "pending" },
99: { text: "已废弃", class: "abandon" }
}
</script>
@@ -529,7 +529,7 @@
display: flex;
align-items: center;
gap: 12px;
padding: 0 12px;
/*padding: 0 12px;*/
height: 100%;
border-radius: 0;
cursor: pointer;
@@ -559,6 +559,12 @@
white-space: nowrap;
}
.v4-about-name {
font-weight: 500;
color: #ffffff;
white-space: nowrap;
}
.v4-logout {
color: #ffffff;
cursor: pointer;
@@ -643,9 +649,9 @@
}
</style>
</head>
<body>
<header class="v4-header">
</head>
<body>
<header class="v4-header">
<div class="v4-left-section">
<div class="v4-logo-container">
<img src="${AppLogo!}" alt="Logo" class="v4-logo" />
@@ -680,37 +686,59 @@
<span class="v4-user-name">${@auth.getPrincipalProperty('username')} (${@auth.getPrincipalProperty('loginname')})</span>
<!-- <i class="fa fa-angle-down"></i> -->
</div>
<div id="aboutNameApp">
<a class="v4-about-name" href="javascript:;" @click="showAbout">
关于
</a>
</div>
<a class="v4-logout" href="/platform/login/logout">
<i class="fa fa-sign-out"></i>
退出
</a>
</div>
</header>
<div style="height: 64px"></div>
</header>
<div style="height: 64px"></div>
<main class="v4-content">
<main class="v4-content">
<!-- 页面内容区域 -->
<div class="ele-body" id="container">${layoutContent}</div>
</main>
</main>
<!-- 页脚 -->
<footer class="v4-footer" id="v4-footer" style="display: none;">
<!-- 页脚 -->
<footer class="v4-footer" id="v4-footer" style="display: none;">
<div class="v4-footer-bottom">
<div class="v4-footer-copyright">
<p>&copy; 2025 武汉地大三思科技有限公司. 保留所有权利.</p>
<p>ICP备案号:のICP备12345678号-1 | 版本v4.0.0</p>
<p>&copy; 2026 武汉地大三思科技有限公司. 保留所有权利.</p>
<p>软件版本:v2.0</p>
</div>
<div class="v4-footer-tech">
<span>技术支持:</span>
<a href="http://www.3sgo.cn/" target="_blank">武汉地大三思科技有限公司</a>
</div>
</div>
</footer>
</footer>
<script>
new Vue({
el: "#aboutNameApp", // ✅ 挂载到外层
methods: {
showAbout() {
this.$alert("系统名称:智慧工会<br>软件版本:V2.0<br>技术支持:武汉地大三思科技有限公司", "关于系统", {
confirmButtonText: "确定",
dangerouslyUseHTMLString: true,
callback: action => {
}
})
}
}
})
</script>
<script nonce="${cspNonce!}">
<script nonce="${cspNonce!}">
// 处理导航项的active状态
$(document).ready(function () {
$(document).ready(function() {
// 控制页脚显示的函数
function toggleFooter() {
var currentPath = getBaseSubAppPath()
@@ -727,7 +755,7 @@
function setActiveNavItem() {
var currentPath = getBaseSubAppPath()
$(".v4-nav-item").removeClass("active")
$(".v4-nav-item").each(function () {
$(".v4-nav-item").each(function() {
if ($(this).attr("href") === currentPath) {
$(this).addClass("active")
}
@@ -739,7 +767,7 @@
toggleFooter()
// 为导航项添加点击事件
$(".v4-nav-item").on("click", function () {
$(".v4-nav-item").on("click", function() {
$(".v4-nav-item").removeClass("active")
$(this).addClass("active")
})
@@ -753,11 +781,11 @@
})
// 使用pjax的事件来处理导航切换
$(document).on("pjax:complete", function () {
$(document).on("pjax:complete", function() {
setActiveNavItem()
toggleFooter()
})
})
</script>
</body>
</script>
</body>
</html>
@@ -327,9 +327,14 @@ layout("/layouts/platform.html"){
</div>
<!-- 人员类型图表 -->
<div class="card">
<!-- <div class="card">
<div class="card-title">人员类型统计</div>
<div class="chart-container" id="personTypeMemberChart" v-loading="loading.personTypeMember"></div>
</div>-->
<!-- 在职类型图表 -->
<div class="card">
<div class="card-title">人员类型统计</div>
<div class="chart-container" id="userStateMemberChart" v-loading="loading.userStateMember"></div>
</div>
</div>
@@ -887,8 +892,8 @@ layout("/layouts/platform.html"){
this.getMemberPercentage()
this.getMemberSexPercentage()
this.getUnionMember()
this.getPersonTypeMember()
// this.getUserStateMember()
// this.getPersonTypeMember()
this.getUserStateMember()
}
},
mounted() {
@@ -159,8 +159,8 @@ layout("/layouts/platform_h5.html"){
<div class="col-title">在职状态</div>
<div id="userStateMemberChart" style="width: 100%; height: 240px; box-sizing: border-box"></div>
<div class="col-title">人员类型</div>
<div id="personTypeMemberChart" style="width: 100%; height: 240px; box-sizing: border-box"></div>
<!-- <div class="col-title">人员类型</div>
<div id="personTypeMemberChart" style="width: 100%; height: 240px; box-sizing: border-box"></div>-->
</van-col>
</van-row>