commit
This commit is contained in:
@@ -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>© 2025 武汉地大三思科技有限公司. 保留所有权利.</p>
|
<p>© 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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user