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