Files
UNION_HUTB/target/classes/views/layouts/platform.html
T
2026-09-09 09:14:28 +08:00

523 lines
25 KiB
HTML

<!DOCTYPE html>
<html lang="${lang,escape}">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
<meta name="description" content="${AppName!}">
<title>${AppName!}</title>
<meta charset="UTF-8">
<!-- import CSS -->
<link rel="stylesheet" href="${base!}/assets/platform/plugins/myframe/css/myframe.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/element-ui/lib/theme-chalk/index.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/themify-icons.css">
<link rel="stylesheet" href="${base!}/assets/platform/fonts/font-awesome.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/common.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/main.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/elmain.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/panel.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wangeditor/wangEditor.css">
<link rel="stylesheet" type="text/css" href="${base!}/assets/platform/plugins/viewer/viewer.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wp-upload-vue/css/wpupload.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/wp-upload-vue/font/iconfont.css">
<link rel="stylesheet" href="${base!}/assets/platform/plugins/video/css/video-js.min.css">
<link rel="stylesheet" href="${base!}/assets/platform/css/vivify.min.css">
<link href="${base!}/assets/platform/plugins/vue-cron/vcrontab.css" rel="stylesheet"/>
<script src="${base!}/assets/platform/plugins/vue-cron/vcrontab.umd.min.js"></script>
<!-- import Vue before Element -->
<script src="${base!}/assets/platform/plugins/vue/vue.min.js"></script>
<!-- <script src="https://cdn.staticfile.org/vue/2.6.0/vue.js"></script>-->
<!-- vue-count-to -->
<script src="${base!}/assets/platform/plugins/vue-count-to/vue-count-to.min.js"></script>
<!-- wpupload -->
<script type="text/javascript" src="${base!}/assets/platform/plugins/wp-upload-vue/js/axios.min.js"></script>
<script type="text/javascript" src="${base!}/assets/platform/plugins/wp-upload-vue/font/iconfont.js"></script>
<script type="text/javascript" src="${base!}/assets/platform/plugins/wp-upload-vue/js/wpupload.js"></script>
<!-- import JavaScript -->
<script src="${base!}/assets/platform/plugins/element-ui/lib/index.js"></script>
<script src="${base!}/assets/platform/plugins/element-ui/lib/i18n/${lang,escape}.js"></script>
<script src="${base!}/assets/platform/plugins/jquery/jquery-1.11.1.min.js"></script>
<script src="${base!}/assets/platform/plugins/slimscroll/jquery.slimscroll.min.js"></script>
<!--后面就改这一段吧-->
<script src="${base!}/assets/platform/js/utils.js"></script>
<script src="${base!}/assets/platform/plugins/dd3s/dd3s.js"></script>
<script src="${base!}/assets/platform/plugins/video/js/video.min.js"></script>
<!--g2-->
<script src="/assets/platform/plugins/g2/g2.min.js?v=4.1.9"></script>
<script src="/assets/platform/plugins/g2/data-set.js"></script>
<script src="/assets/platform/plugins/g2/g2plot.js?v=1.0.0"></script>
<!--echars-->
<script src="${base!}/assets/platform/plugins/echarts/echarts.min.js"></script>
<script src="${base!}/assets/platform/plugins/echarts/infographic.js"></script><!--主题-->
<script src="${base!}/assets/platform/plugins/echarts/westeros.js"></script><!--主题-->
<script src="${base!}/assets/platform/plugins/echarts/walden.js"></script><!--主题-->
<script src="${base!}/assets/platform/plugins/echarts/macarons.js"></script><!--主题-->
<!-- <script src="https://cdn.staticfile.org/echarts/5.2.2/echarts.js"></script>
<script src="https://cdn.staticfile.org/echarts/5.2.2/i18n/langZH.js"></script>-->
<script src="${base!}/assets/platform/module/mixins/initTableMixins.js?v=1.0.3"></script>
<script src="${base!}/assets/platform/js/includeModel.js?v=1.0.5"></script>
<script src="${base!}/assets/platform/js/component.js?v=1.0.2"></script>
<script src="${base!}/assets/platform/js/v.js?v=1.0.5"></script>
<script src="${base!}/assets/platform/plugins/wangeditor/wangEditor.js"></script>
<!-- <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/wangeditor@4.6.15/dist/wangEditor.min.js"></script>-->
<script type="text/javascript"
src="https://webapi.amap.com/maps?v=1.4.15&key=6ab3452804ba35050880b5e047436853&plugin=AMap.PolyEditor,AMap.PlaceSearch"></script>
<!--viewer-->
<script src="${base!}/assets/platform/plugins/viewer/viewer.min.js"></script>
<script src="${base!}/assets/platform/plugins/viewer/jquery-viewer.min.js"></script>
<script src="${base!}/assets/platform/plugins/vue-loader/httpVueLoader.js"></script>
<script src="${base!}/assets/platform/plugins/vue-qrcode/vue-qrcode.min.js"></script>
<!-- pjax是异步加载html片段的工具,模拟前端路由机制 -->
<script src="${base!}/assets/platform/plugins/pjax/jquery.pjax.js"></script>
<script src="${base!}/assets/platform/plugins/myframe/js/myframe.js"></script>
<!-- Array数组增加findIndex等方法,TreeTable用得到,兼容IE8 -->
<script src="${base!}/assets/platform/plugins/polyfill/polyfill.js"></script>
<!-- 时间日期处理工具类 -->
<script src="${base!}/assets/platform/plugins/moment/moment.min.js"></script>
<!-- 浏览器通知 -->
<script src="${base!}/assets/platform/plugins/push/push.min.js"></script>
<script src="${base!}/assets/platform/js/main.js?v=1.0.0"></script>
<script src="${base!}/assets/platform/js/gh.js"></script>
<script src="${base!}/assets/platform/js/offscreen.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/vue-echarts@4.0.2"></script>-->
<script src="${base!}/assets/platform/plugins/vue-charts/echartTheme.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/css/skins/palette.3.css" id="skin">
<!--拖拽js-->
<script src="${base!}/assets/platform/js/directive/v-sticky.js"></script>
<script src="${base!}/assets/platform/js/jquery.qrcode.min.js"></script>
<!--字典混入-->
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="https://cdn.staticfile.org/xlsx/0.18.5/xlsx.full.min.js"></script>
<script type="text/javascript">
const base = "${base!}";
const APP_DOMAIN = "${AppDomain!}";
const FILE_DOMAIN = "${AppFileDomain!}";
const AppMapCenterPointX = "${config.AppMapCenterPointX!}";
const AppMapCenterPointY = "${config.AppMapCenterPointY!}";
const isDisPlayCode = "${config.isDisPlayCode!}" === 'true'
var loginPjax = "${@shiro.getPrincipalProperty('loginPjax')}";
const LOGO_URL = "${config.logoUrl!}"
ELEMENT.locale(ELEMENT.lang['${lang,escape}']);
Vue.component('vuedraggable', window.vuedraggable)
Vue.component('guava', httpVueLoader('/components/plugins/Guava.vue'))
Vue.component('sign', httpVueLoader('/components/sign/sign.vue?v=2.0.0'))
Vue.component('file-upload', httpVueLoader('/components/plugins/FileUpload.vue'))
Vue.component('image-upload', httpVueLoader('/components/plugins/ImageUpload.vue'))
Vue.component('dict-tag', httpVueLoader('/components/plugins/sysDict/DictTag.vue'))
Vue.component('text-editor', httpVueLoader('/components/plugins/textEditor.vue'))
Vue.use(httpVueLoader)
Vue.component(VueQrcode.name, VueQrcode)
const viewImage = function (filepath) {
let image = new Image();
image.src = APP_DOMAIN + FILE_STREAM_PREVIEW_ADDRESS + '?id=' + filepath;
let viewer = new Viewer(image);
viewer.show();
};
window.viewImage = viewImage;
Vue.prototype.$viewImage = viewImage
//防止用户快速重复点击造成数据混乱 提供vue指令和js节流函数两种方式
//控制此元素在一定时间内是否可成为鼠标的点击目标对象
Vue.directive('throttle', {
inserted(el, binding) {
el.addEventListener('click', () => {
if (el.style.pointerEvents !== 'none') {
el.style.pointerEvents = 'none'
window.setTimeout(() => {
el.style.pointerEvents = ''
}, 1200)
}
})
}
})
//提案初始化的值
proposal.getProposalAllStateCode()
proposal.getProposalEnableStateCode()
proposal.getProposalNeedSignStateCode()
</script>
</head>
<body>
<div class="gallery-loader" style="background-color:transparent;">
<div class="loader"></div>
</div>
<div id="mainApp" class="app">
<header class="header header-fixed navbar" id="headerNavbar">
<div class="brand">
<a href="javascript:;" data-pjax class="navbar-brand" @click="goHome">
<img src="${base!}/assets/platform/img/logo.png" alt=""
style="width: 60%;height: 80%"
class="o_img <!--#if(!@shiro.getPrincipalProperty('loginSidebar')){#-->o_hide<!--#}#-->">
<span class="heading-font o_img <!--#if(@shiro.getPrincipalProperty('loginSidebar')){#-->o_hide<!--#}#-->">
<img :src="LOGO_URL">
</span>
</a>
</div>
<ul class="nav navbar-nav">
<li style="padding:0 10px" class="vivify popIn duration-1500">
<el-popover
width="450"
popper-class="appCenterPopover"
placement="top-start"
v-model="menuPopover"
trigger="hover">
<el-card shadow="never" class="appCenterCard">
<template #header>
<el-row type="flex" justify="space-between">
<div>
<el-link :underline="false">应用中心</el-link>
<i class="el-icon-edit" style="cursor: pointer;color: #1867b0"
v-if="${@shiro.hasRole('sysadmin')}"
@click="goSetAppCenter"></i>
</div>
<div>
<el-link @click="goHome" type="primary" :underline="false">工作台</el-link>
<el-link @click="setUserDefaultEntranceModuleId" type="primary" :underline="false">
设置为默认模块
</el-link>
</div>
</el-row>
</template>
<el-row gutter="20">
<el-col v-for="item in entranceModules" :span="8" style="margin-bottom: 5px">
<div class="entranceDetail"
:class="item.id==selectEntranceModule.id?'entranceDetail-selected':''"
@click="enterEntranceModules(item)">
<div class="entranceIcon">
<el-image :src="APP_DOMAIN+FILE_STREAM_PREVIEW_ADDRESS+'?id='+item.icon[0].id"
style="height: 50px;width: 50px;border-radius: 50%"></el-image>
</div>
{{item.moduleName}}
</div>
</el-col>
</el-row>
<el-row type="flex" justify="end">
<el-button type="primary" size="mini" @click="menuPopover=!menuPopover">关闭</el-button>
</el-row>
</el-card>
<a href="javascript:" slot="reference" style="color: #FFFFFF;" @click="toggleMenuPopover">
<i class="fa fa-th-large" aria-hidden="true"></i>
{{selectEntranceModule ? selectEntranceModule.moduleName : '应用中心'}}
</a>
</el-popover>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="off-right">
<a href="javascript:;" data-toggle="dropdown">
<span class="hidden-xs ml10">${@shiro.getPrincipalProperty('username')}</span>
</a>
</li>
<li class="off-right">
<a href="${base!}/platform/login/logout">
<i class="ti-power-off"></i>
</a>
</li>
</ul>
</header>
<section class="layout">
<!-- sidebar menu -->
<aside class="sidebar offscreen-left" id="asideMenu">
<!-- main navigation -->
<nav class="main-navigation" data-height="auto" data-size="6px" data-distance="0" data-rail-visible="true"
data-wheel-step="10">
<ul id="leftMenu" class="nav leftMenu" style="display: initial;">
<li v-for="fm in headerNavBarVueApp.firstMenus">
<a :href="fm.href && fm.href.startsWith('/')?fm.href:'javascript:;'">
<i v-if="Object.keys(headerNavBarVueApp.secondMenus).includes(fm.path)"
class="toggle-accordion"></i>
<i :class="fm.icon?fm.icon:'ti-map'"></i>
<span>
{{fm.name}}
</span>
</a>
<ul class="sub-menu"
v-if="Object.keys(headerNavBarVueApp.secondMenus).includes(fm.path)">
<li v-for="sm in headerNavBarVueApp.secondMenus[fm.path]">
<a :href="sm.href && sm.href.startsWith('/')?sm.href:'javascript:;'">
<span>
<i class="toggle-accordion" v-if="headerNavBarVueApp.secondMenus[sm.path]"></i>
<i v-if="headerNavBarVueApp.secondMenus[sm.path]"
:class="sm.icon ? 'leftMenu__twoIcon ' + sm.icon : 'leftMenu__twoIcon ti-map'"
></i>
<i v-else class="leftMenu__twoIcon fa fa-circle-o"></i>
{{sm.name}}
</span>
</a>
<ul class="sub-menu" v-if="headerNavBarVueApp.secondMenus[sm.path]">
<li v-for="tm in headerNavBarVueApp.secondMenus[sm.path]">
<a :href="tm.href && tm.href.startsWith('/')?tm.href:'javascript:;'">
<span>
<i class="leftMenu__twoIcon fa fa-circle-o"></i>
{{tm.name}}
</span>
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</aside>
<!-- main content -->
<section class="main-content" id="container">
${layoutContent}
</section>
</section>
</div>
<script>
const headerNavBarVueApp = new Vue({
el: '#headerNavbar',
data() {
return {
entranceModules: [],
selectEntranceModule: null,
leftMenus: [],
firstMenus: [],
secondMenus: {},
userDefaultModuleId: null,
menuPopover: false
}
},
methods: {
async getEntranceModule() {
const resp = await $.get('/platform/sys/entranceModule/getEntranceModule')
if (resp.code === 0) {
this.entranceModules = resp.data
if (this.selectEntranceModule) {
if (this.entranceModules.some(v => v.id === this.selectEntranceModule.id)) {
this.selectEntranceModule = this.entranceModules.find(v => v.id === this.selectEntranceModule.id)
this.openFirstMenu()
return
}
}
if (this.entranceModules) {
if (this.userDefaultModuleId) {
this.selectEntranceModule = this.entranceModules.find(v => v.id === this.userDefaultModuleId)
} else {
this.selectEntranceModule = this.entranceModules[0]
}
this.openFirstMenu()
} else {
this.goSetAppCenter()
}
}
},
openFirstMenu() {
if (window.location.pathname === '/platform/home') {
setTimeout(() => {
this.$nextTick(() => {
const aTag = document.querySelector('#leftMenu li a')
if (aTag) {
aTag.click()
}
})
}, 500)
} else {
const pathname = window.location.pathname
const a_selector = "#leftMenu li a[href='" + pathname + "']"
const getCurrentMenu = () => {
const a = document.querySelector(a_selector)
if (a) {
$(a).attr('style', 'color: #1867b0')
$(a).parent().parents("li").addClass("open")
$(a).parent().parents('ul.sub-menu').attr('style', 'display:block')
$(a).find("i").addClass("fa-dot-circle-o")
clearInterval(getCurrentMenuInterval)
}
}
const getCurrentMenuInterval = setInterval(getCurrentMenu, 100)
}
},
async enterEntranceModules(item) {
window.sessionStorage.setItem('selectEntranceModule', JSON.stringify(item))
this.selectEntranceModule = item
await this.getFirstMenus(item.id)
this.goHome()
this.openFirstMenu()
this.menuPopover = false
},
async getSecondMenus() {
const resp = await $.get('/platform/sys/entranceModule/getSecondMenus')
if (resp.code === 0) {
this.secondMenus = resp.data
}
},
async getFirstMenus(entranceModuleId) {
const resp = await $.get('/platform/sys/entranceModule/getFirstMenus', {entranceModuleId})
if (resp.code === 0) {
this.firstMenus = resp.data
this.setAttr()
}
},
setAttr(afterFunc = () => {
}) {
this.$nextTick(() => {
const aTags = document.querySelectorAll('.main-navigation a')
aTags.forEach(v => {
if (v.href === 'javascript:;') {
v.removeAttribute("data-pjax")
} else {
v.setAttribute("data-pjax", "")
}
if (v.getAttribute('class') === 'active') {
v.setAttribute('class', '')
}
})
const openLiTags = document.querySelectorAll('.main-navigation li.open')
openLiTags.forEach(v => {
v.setAttribute('class', '')
const childNodes = v.childNodes
childNodes.forEach(c => {
if (c.nodeType === 1 && c.tagName && c.tagName.toUpperCase() === 'UL'.toUpperCase() && c.className === 'sub-menu') {
c.style.display = 'none'
}
})
})
afterFunc()
})
},
goHome() {
$.pjax({
url: '/platform/home',
container: '#container',
fragment: '#container',
timeout: 8000
});
this.setAttr()
this.closeAllMenu()
},
goSetAppCenter() {
$.pjax({
url: '/platform/sys/entranceModule',
container: '#container',
fragment: '#container',
timeout: 8000
});
this.setAttr()
},
closeAllMenu() {
const subMenus = document.querySelectorAll('ul.sub-menu')
subMenus.forEach(v => {
v.style.display = 'none'
})
const menus = document.querySelectorAll('.main-navigation li.open')
menus.forEach(v => {
v.setAttribute('class', '')
})
const aTags = document.querySelectorAll('.main-navigation a.active')
aTags.forEach(v => {
v.setAttribute('class', '')
})
},
async getUserDefaultEntranceModuleId() {
const resp = await $.get('/platform/sys/entranceModule/getUserDefaultEntranceModuleId')
if (resp.code === 0) {
this.userDefaultModuleId = resp.data
}
},
async setUserDefaultEntranceModuleId() {
const {id: moduleId, moduleName} = this.selectEntranceModule
const msg = '您确定要将' + moduleName + '设置为默认模块吗?'
const confirm = await this.$confirm(msg, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
if ('confirm' !== confirm) return
const resp = await $.get('/platform/sys/entranceModule/setUserDefaultEntranceModuleId', {moduleId})
if (resp.code === 0) {
this.$notify.success(resp.msg)
} else {
this.$notify.warning(resp.msg)
}
},
toggleMenuPopover() {
setTimeout(() => {
this.menuPopover = !this.menuPopover
}, 300)
},
async init() {
await this.getUserDefaultEntranceModuleId()
const selectEntranceModuleStr = window.sessionStorage.getItem('selectEntranceModule')
if (selectEntranceModuleStr) {
this.selectEntranceModule = JSON.parse(selectEntranceModuleStr)
}
await this.getEntranceModule()
await this.getFirstMenus(this.selectEntranceModule.id)
await this.getSecondMenus()
this.setAttr()
// let pjax_url = window.sessionStorage.getItem('pjax_url')
// pjax_url = pjax_url.replace(window.location.origin, '')
// $.pjax({
// url: pjax_url,
// container: '#container',
// fragment: '#container',
// timeout: 8000
// });
// const a_selector = '#leftMenu li a[href="' + pjax_url + '"]'
// const a = document.querySelector(a_selector)
// setTimeout(() => {
// $(a).parent().parents("li").addClass("open")
// $(a).parent().parents('ul.sub-menu').attr('style', 'display:block')
// }, 100)
}
},
watch: {},
created() {
this.init()
}
})
new Vue({
el: '#asideMenu',
data() {
return {}
}
})
</script>
</body>
</html>