This commit is contained in:
lijing
2026-08-12 17:19:37 +08:00
commit e73d22744e
131 changed files with 66997 additions and 0 deletions
+251
View File
@@ -0,0 +1,251 @@
<template>
<div class="layout-wrap">
<header class="header-container fix">
<div class="fl align-middle icon-box">
<div :class="['icon-btn', isPanel ? 'active' : '']" @click="showPanel">
<svg width="22" height="22" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0)">
<path d="M24 0.972656H0V24.9727H24V0.972656Z" fill="white" fill-opacity="0.01" />
<path
d="M9 2.97266H3C2.44772 2.97266 2 3.42037 2 3.97266V9.97266C2 10.5249 2.44772 10.9727 3 10.9727H9C9.55228 10.9727 10 10.5249 10 9.97266V3.97266C10 3.42037 9.55228 2.97266 9 2.97266Z"
stroke="white"
stroke-width="1.6"
stroke-linejoin="round"
/>
<path
d="M9 14.9727H3C2.44772 14.9727 2 15.4204 2 15.9727V21.9727C2 22.5249 2.44772 22.9727 3 22.9727H9C9.55228 22.9727 10 22.5249 10 21.9727V15.9727C10 15.4204 9.55228 14.9727 9 14.9727Z"
stroke="white"
stroke-width="1.6"
stroke-linejoin="round"
/>
<path
d="M21 2.97266H15C14.4477 2.97266 14 3.42037 14 3.97266V9.97266C14 10.5249 14.4477 10.9727 15 10.9727H21C21.5523 10.9727 22 10.5249 22 9.97266V3.97266C22 3.42037 21.5523 2.97266 21 2.97266Z"
stroke="white"
stroke-width="1.6"
stroke-linejoin="round"
/>
<path
d="M14 14.9727H22"
stroke="white"
stroke-width="1.6"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M18 18.9727H22"
stroke="white"
stroke-width="1.6"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M14 22.9727H22"
stroke="white"
stroke-width="1.6"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<defs>
<clipPath id="clip0">
<rect width="24" height="24" fill="white" transform="translate(0 0.972656)" />
</clipPath>
</defs>
</svg>
</div>
</div>
<div class="delimiter fl align-middle"></div>
<h4 class="fl align-middle">{{ appName }}</h4>
<div class="school-bg"></div>
<div class="header-aside fr">
<img :src="userInfo.avatar" class="fl align-middle" @click="linkUserInfo" />
<a class="name fl align-middle text-ellipsis" href="javascript:void(0);" @click="linkUserInfo">
{{ userInfo.name }}
</a>
<div class="delimiter fl align-middle"></div>
<a href="javascript:;" @click="logout" class="logout fl align-middle" title="退出登陆">
<svg
t="1615536538850"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="3048"
width="18"
height="18"
>
<path
d="M554.666667 426.666667a42.666667 42.666667 0 0 1-85.333334 0V128a42.666667 42.666667 0 0 1 85.333334 0v298.666667z m101.973333-133.376a42.666667 42.666667 0 0 1 41.429333-74.581334 384 384 0 1 1-372.138666 0 42.666667 42.666667 0 0 1 41.386666 74.581334 298.666667 298.666667 0 1 0 289.365334 0z"
p-id="3049"
fill="#ffffff"
></path>
</svg>
</a>
</div>
</header>
<div class="left-menu" v-if="!isAlone">
<div class="menu-top-box"></div>
<ul>
<li
:class="item.page == currPath ? 'active' : ''"
v-for="(item, index) in modList"
:key="'menu_li_' + index"
>
<a href="javascript:;" @click="linkMenu(item.page)">
<div v-if="item.icon" :class="['icon-box fl', item.icon]"></div>
<div v-else class="icon-box fl">
<svg
t="1615860353141"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6624"
width="14"
height="14"
>
<path
d="M0 102.4h307.2v307.2H0zM0 614.4h307.2v307.2H0zM409.6 102.4h614.4v102.4H409.6zM409.6 307.2h614.4v102.4H409.6zM409.6 614.4h614.4v102.4H409.6zM409.6 819.2h614.4v102.4H409.6z"
p-id="6625"
fill="#656667"
></path>
</svg>
</div>
{{ item.name }}
</a>
</li>
</ul>
<div class="clear-box"></div>
</div>
<template v-if="!isAlone">
<div class="path-nav">
<Breadcrumb separator=">">
<a :href="baseHost + '/BschHome/front/index.html'">
<BreadcrumbItem>
<Icon type="ios-home-outline" size="14"></Icon>
首页
</BreadcrumbItem>
</a>
<BreadcrumbItem to="/">{{ appName }}</BreadcrumbItem>
<BreadcrumbItem v-if="typeof navPath === 'string'">{{ navPath }}</BreadcrumbItem>
<template v-else v-for="(item, index) in navPath">
<BreadcrumbItem v-if="index != navPath.length - 1" :to="item.page">
{{ item.name }}
</BreadcrumbItem>
<BreadcrumbItem v-else>{{ item.name }}</BreadcrumbItem>
</template>
</Breadcrumb>
</div>
<!-- <div class="path-nav" v-else>
{{ navPath }}
</div> -->
</template>
<transition name="fade_apps">
<div class="app-panel" ref="appPanel" v-if="isPanel">
<div class="tips-box"></div>
<ul class="fix">
<li class="fl" v-for="item in appList">
<a :href="item.url" target="_bank" rel="noopener noreferrer">
<div class="icon-box">
<img :src="item.icon" alt="" />
</div>
<p class="text-ellipsis">{{ item.name }}</p>
</a>
</li>
</ul>
<div class="link-panel">
<a :href="baseHost + '/BschHome/front/index.html#/apps'" target="_bank" rel="noopener noreferrer">
全部应用
<i>→</i>
</a>
</div>
</div>
</transition>
</div>
</template>
<script>
export default {
inject: ["reload"],
props: {
layoutData: {
appName: String,
appList: Array,
modList: Array,
userInfo: Object,
ssoHost: String,
baseHost: String,
isAlone: Boolean, //是否只有一个选项卡
},
},
data() {
return {
color: "#fff",
isPanel: false,
themeColor: [],
currPath: "/layout",
navPath: "默认列表",
};
},
created() {
const _this = this;
for (const key in _this.layoutData) _this[key] = _this.layoutData[key];
_this.routeChange(_this.$route); //初次加载时手动触发route的change
this.$watch("$route", _this.routeChange);
},
mounted() {},
methods: {
showPanel() {
const _this = this;
if (_this.appList.length == 0) {
_this.$Message.info("暂无常用应用!");
return;
}
_this.isPanel = false;
setTimeout(() => {
_this.isPanel = true;
setTimeout(showPanel, 0);
}, 0);
var showPanel = () => {
_this.$refs["appPanel"].onclick = e => e.stopPropagation();
document.onclick = () => (_this.isPanel = false);
};
},
routeChange(router) {
const _this = this;
window.document.title = router.meta.title || "弘育云平台";
let currentMod = router.meta.modId;
//时间有限,仅支持一层.暂时写死,有需求再改
_this.modList.forEach(element => {
let childIndex = element.children.findIndex(x => x.modId == currentMod);
if (currentMod == element.modId || childIndex > -1) {
_this.currPath = element.page;
if (childIndex > -1) {
let navArr = [];
navArr.push({ name: element.name, page: element.page });
navArr.push({
name: element.children[childIndex].name,
page: element.children[childIndex].page,
});
_this.navPath = navArr;
} else _this.navPath = element.name;
}
});
},
linkMenu(page) {
const path = this.$route.path;
if (page === path) this.reload();
else this.$router.push(page);
},
linkUserInfo() {
top.location.href = this.baseHost + "/v/userinfo";
},
logout() {
let url = window.location.href;
url = "/logout?service=" + url;
top.location.href = this.ssoHost + url;
},
},
};
</script>
+305
View File
@@ -0,0 +1,305 @@
<template>
<div class="layout-wrap">
<header class="header-container fix">
<div class="fl align-middle icon-box">
<div
:class="['icon-btn', isPanel ? 'active' : '']"
@click="showPanel"
>
<svg
t="1615518122113"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="1276"
width="18"
height="18"
>
<path
d="M710.54933333 68.11733334a64 64 0 0 1 90.496 0l165.504 165.504a64 64 0 0 1 0 90.496l-165.504 165.504a64 64 0 0 1-90.496 0l-165.504-165.504a64 64 0 0 1 0-90.496l165.504-165.504zM165.33333333 69.33333334a96 96 0 0 0-96 96v224a96 96 0 0 0 96 96h224a96 96 0 0 0 96-96V165.33333334a96 96 0 0 0-96-96H165.33333333zM165.33333333 549.33333334a96 96 0 0 0-96 96v224a96 96 0 0 0 96 96h224a96 96 0 0 0 96-96v-224a96 96 0 0 0-96-96H165.33333333zM645.33333333 549.33333334a96 96 0 0 0-96 96v224a96 96 0 0 0 96 96h224a96 96 0 0 0 96-96v-224a96 96 0 0 0-96-96h-224z"
p-id="1277"
:fill="color"
></path>
</svg>
</div>
</div>
<div class="delimiter fl align-middle"></div>
<h4 class="fl align-middle">{{ appName }}</h4>
<div class="school-bg"></div>
<div class="header-aside fr">
<img
:src="userInfo.avatar"
class="fl align-middle"
@click="linkUserInfo"
/>
<a
class="name fl align-middle text-ellipsis"
href="javascript:void(0);"
@click="linkUserInfo"
>{{ userInfo.name }}</a
>
<div class="delimiter fl align-middle"></div>
<a
href="javascript:;"
@click="logout"
class="logout fl align-middle"
title="退出登陆"
>
<svg
t="1615536538850"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="3048"
width="18"
height="18"
>
<path
d="M554.666667 426.666667a42.666667 42.666667 0 0 1-85.333334 0V128a42.666667 42.666667 0 0 1 85.333334 0v298.666667z m101.973333-133.376a42.666667 42.666667 0 0 1 41.429333-74.581334 384 384 0 1 1-372.138666 0 42.666667 42.666667 0 0 1 41.386666 74.581334 298.666667 298.666667 0 1 0 289.365334 0z"
p-id="3049"
fill="#ffffff"
></path>
<!-- d5defe -->
</svg>
</a>
</div>
</header>
<div class="left-menu" v-if="!isAlone">
<div class="menu-top-box"></div>
<ul>
<template v-for="(item, index) in modArr">
<template v-if="item.children && item.children.length > 0">
<li>
<a href="javascript:;" @click="childChange(index)">
<i
:class="
item.childState
? 'arrow-down'
: 'arrow-up'
"
></i>
<div
v-if="item.icon"
:class="['icon-box fl', item.icon]"
></div>
<div v-else class="icon-box fl">
<svg
t="1615860353141"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6624"
width="14"
height="14"
>
<path
d="M0 102.4h307.2v307.2H0zM0 614.4h307.2v307.2H0zM409.6 102.4h614.4v102.4H409.6zM409.6 307.2h614.4v102.4H409.6zM409.6 614.4h614.4v102.4H409.6zM409.6 819.2h614.4v102.4H409.6z"
p-id="6625"
fill="#656667"
></path>
</svg>
</div>
{{ item.name }}
</a>
</li>
<transition name="fade_child_ul">
<div
class="child-item-wrap"
v-show="item.childState"
>
<li
:class="
citem.page == currPath
? 'active child-item'
: 'child-item'
"
v-for="citem in item.children"
>
<a
href="javascript:;"
@click="linkMenu(citem.page)"
>
{{ citem.name }}
</a>
</li>
</div>
</transition>
</template>
<li
v-else
:class="item.page == currPath ? 'active' : ''"
:key="'menu_li_' + index"
>
<a href="javascript:;" @click="linkMenu(item.page)">
<div
v-if="item.icon"
:class="['icon-box fl', item.icon]"
></div>
<div v-else class="icon-box fl">
<svg
t="1615860353141"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6624"
width="14"
height="14"
>
<path
d="M0 102.4h307.2v307.2H0zM0 614.4h307.2v307.2H0zM409.6 102.4h614.4v102.4H409.6zM409.6 307.2h614.4v102.4H409.6zM409.6 614.4h614.4v102.4H409.6zM409.6 819.2h614.4v102.4H409.6z"
p-id="6625"
fill="#656667"
></path>
</svg>
</div>
{{ item.name }}
</a>
</li>
</template>
</ul>
<div class="clear-box"></div>
</div>
<template v-if="!isAlone">
<div
class="path-nav"
v-if="navPath instanceof Array && navPath.length > 1"
>
<Breadcrumb separator=">">
<template v-for="(item, index) in navPath">
<BreadcrumbItem>{{ item.name }}</BreadcrumbItem>
</template>
</Breadcrumb>
</div>
<div class="path-nav" v-else>
{{ navPath }}
</div>
</template>
<transition name="fade_apps">
<div class="app-panel" ref="appPanel" v-if="isPanel">
<div class="tips-box"></div>
<ul class="fix">
<li class="fl" v-for="item in appList">
<a
:href="item.url"
target="_bank"
rel="noopener noreferrer"
>
<div class="icon-box">
<img :src="item.icon" alt="" />
</div>
<p class="text-ellipsis">{{ item.name }}</p>
</a>
</li>
</ul>
<div class="link-panel">
<a
:href="baseHost + '/BschHome/front/index.html#/apps'"
target="_bank"
rel="noopener noreferrer"
>全部应用<i>→</i></a
>
</div>
</div>
</transition>
</div>
</template>
<script>
export default {
inject: ["reload"],
props: {
layoutData: {
appName: String,
appList: Array,
modList: Array,
userInfo: Object,
ssoHost: String,
baseHost: String,
isAlone: Boolean, //是否只有一个选项卡
},
},
data() {
return {
color: "#fff",
isPanel: false,
themeColor: [],
currPath: "",
navPath: null,
modArr: [],
};
},
created() {
const _this = this;
for (const key in _this.layoutData) _this[key] = _this.layoutData[key];
_this.routeChange(_this.$route); //初次加载时手动触发route的change
this.$watch("$route", _this.routeChange);
this.modList.forEach((element) => {
element.childState = true;
this.modArr.push(element);
});
},
mounted() {},
methods: {
showPanel() {
const _this = this;
if (_this.appList.length == 0) {
_this.$Message.info("暂无常用应用!");
return;
}
_this.isPanel = false;
setTimeout(() => {
_this.isPanel = true;
setTimeout(showPanel, 0);
}, 0);
var showPanel = () => {
_this.$refs["appPanel"].onclick = (e) => e.stopPropagation();
document.onclick = () => (_this.isPanel = false);
};
},
routeChange(router) {
const _this = this;
window.document.title = router.meta.title || "弘育云平台";
let currentMod = router.meta.modId;
_this.currPath = router.path;
//时间有限,仅支持一层.暂时写死,有需求再改
_this.modList.forEach((element) => {
let childIndex = element.children.findIndex(
(x) => x.modId == currentMod
);
if (currentMod == element.modId || childIndex > -1) {
if (childIndex > -1) {
let navArr = [];
navArr.push({ name: element.name, page: element.page });
navArr.push({
name: element.children[childIndex].name,
page: element.children[childIndex].page,
});
_this.navPath = navArr;
} else _this.navPath = element.name;
}
});
},
linkMenu(page) {
const path = this.$route.path;
if (page === path) this.reload();
else this.$router.push(page);
},
linkUserInfo() {
top.location.href = this.baseHost + "/v/userinfo";
},
childChange(index) {
this.modArr[index].childState = !this.modArr[index].childState;
},
logout() {
let url = window.location.href;
url = "/logout?service=" + url;
top.location.href = this.ssoHost + url;
},
},
};
</script>
+263
View File
@@ -0,0 +1,263 @@
<template>
<div class="layout-wrap">
<header class="header-container fix">
<div class="fl align-middle icon-box">
 <div title="常用应用" :class="['icon-btn', isPanel ? 'active' : '']" @click="showPanel">
                    <i class="iconfont icon-apps"></i>
                </div>
</div>
<div class="delimiter fl align-middle"></div>
<h4 class="fl align-middle">{{ appName }}</h4>
<div class="school-bg"></div>
<div class="header-aside fr">
<img :src="userInfo.avatar" class="fl align-middle" @click="linkUserInfo" />
<a class="name fl align-middle text-ellipsis" href="javascript:void(0);" @click="linkUserInfo">
{{ userInfo.name }}
</a>
<div class="delimiter fl align-middle"></div>
<a href=" " @click="logout" class="logout fl align-middle" title="退出登陆">
                    <i class="iconfont icon-logout"></i>
                </a>
</div>
</header>
<div class="left-menu" v-if="!isAlone">
<div class="menu-top-box"></div>
<ul>
<template v-for="(item, index) in modArr">
<template v-if="item.children && item.children.length > 0">
<li>
<a href="javascript:;" @click="childChange(index)">
<i :class="item.childState ? 'arrow-down' : 'arrow-up'"></i>
<div v-if="item.icon" :class="['icon-box fl', item.icon]"></div>
<div v-else class="icon-box fl">
<svg
t="1615860353141"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6624"
width="14"
height="14"
>
<path
d="M0 102.4h307.2v307.2H0zM0 614.4h307.2v307.2H0zM409.6 102.4h614.4v102.4H409.6zM409.6 307.2h614.4v102.4H409.6zM409.6 614.4h614.4v102.4H409.6zM409.6 819.2h614.4v102.4H409.6z"
p-id="6625"
fill="#656667"
></path>
</svg>
</div>
{{ item.name }}
</a>
</li>
<transition name="fade_child_ul">
<div class="child-item-wrap" v-show="item.childState">
<li
:class="citem.page == currPath ? 'active child-item' : 'child-item'"
v-for="citem in item.children"
>
<a href="javascript:;" @click="linkMenu(citem.page)">
{{ citem.name }}
</a>
</li>
</div>
</transition>
</template>
<li v-else :class="item.page == currPath ? 'active' : ''" :key="'menu_li_' + index">
<a href="javascript:;" @click="linkMenu(item.page)">
<div v-if="item.icon" :class="['icon-box fl', item.icon]"></div>
<div v-else class="icon-box fl">
<svg
t="1615860353141"
class="icon"
viewBox="0 0 1024 1024"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
p-id="6624"
width="14"
height="14"
>
<path
d="M0 102.4h307.2v307.2H0zM0 614.4h307.2v307.2H0zM409.6 102.4h614.4v102.4H409.6zM409.6 307.2h614.4v102.4H409.6zM409.6 614.4h614.4v102.4H409.6zM409.6 819.2h614.4v102.4H409.6z"
p-id="6625"
fill="#656667"
></path>
</svg>
</div>
{{ item.name }}
</a>
</li>
</template>
</ul>
<div class="clear-box"></div>
</div>
<div class="path-nav" v-if="!isAlone">
<Breadcrumb separator=">">
<a :href="baseHost + '/BschHome/front/index.html'">
<BreadcrumbItem>
<i class="iconfont icon-category"></i>
首页
</BreadcrumbItem>
</a>
<BreadcrumbItem to="/">{{ appName }}</BreadcrumbItem>
<BreadcrumbItem v-if="typeof navPath == 'string'">{{ navPath }}</BreadcrumbItem>
<template v-else v-for="(item, index) in navPath">
<BreadcrumbItem v-if="index != navPath.length - 1" :to="item.page">{{ item.name }}</BreadcrumbItem>
<BreadcrumbItem v-else>{{ item.name }}</BreadcrumbItem>
</template>
</Breadcrumb>
</div>
<transition name="fade_apps">
<div class="app-panel" ref="appPanel" v-if="isPanel">
<div class="tips-box"></div>
<ul class="fix">
<li class="fl" v-for="item in appList">
<a :href="item.url" target="_bank" rel="noopener noreferrer">
<div class="icon-box">
<img :src="item.icon" alt="" />
</div>
<p class="text-ellipsis">{{ item.name }}</p>
</a>
</li>
</ul>
<div class="link-panel">
<a :href="baseHost + '/BschHome/front/index.html#/apps'" target="_bank" rel="noopener noreferrer">
全部应用
<i>→</i>
</a>
</div>
</div>
</transition>
</div>
</template>
<script>
export default {
inject: ["reload"],
props: {
layoutData: {
appName: String,
appList: Array,
modList: Array,
userInfo: Object,
ssoHost: String,
baseHost: String,
isAlone: Boolean //是否只有一个选项卡
}
},
data() {
return {
color: "#fff",
isPanel: false,
themeColor: [],
currPath: "",
navPath: null,
modArr: [],
menuArr: []
};
},
created() {
const _this = this;
for (const key in _this.layoutData) _this[key] = _this.layoutData[key];
this.menuArr = this.flaten(this.modList);
_this.routeChange(_this.$route); //初次加载时手动触发route的change
this.$watch("$route", _this.routeChange);
this.modList.forEach(element => {
element.childState = true; //此处修改结点状态,默认打开
this.modArr.push(element);
});
this.$bus.$on("setNavPath", arr => (_this.navPath = arr));
this.$bus.$on("setMenuPath", modId => {
let find = this.menuArr.find(x => x.modId == modId);
!!find && (this.currPath = find.page);
});
},
mounted() {},
methods: {
showPanel() {
const _this = this;
if (_this.appList.length == 0) {
_this.$Message.info("暂无常用应用!");
return;
}
_this.isPanel = false;
setTimeout(() => {
_this.isPanel = true;
setTimeout(showPanel, 0);
}, 0);
var showPanel = () => {
_this.$refs["appPanel"].onclick = e => e.stopPropagation();
document.onclick = () => (_this.isPanel = false);
};
},
routeChange(router) {
const _this = this;
let { modId, title, parentId: routerPId } = router.meta,
navArr = [];
window.document.title = title || "弘育云平台";
var find = this.menuArr.find(x => x.modId == modId);
if (!find) {
let parentFind = this.menuArr.find(x => x.modId == routerPId);
if (!parentFind) {
// this.$router.push("/");
// throw "路由错误!";
let newmenuArr = this.menuArr.filter(x => x.pid>0);
if(newmenuArr.length>0){
if(newmenuArr.findIndex(x => x.page == this.$route.path)==-1){
this.$router.push(newmenuArr[0].page);
}
}else{
if(this.menuArr.findIndex(x => x.page == this.$route.path)==-1){
this.$router.push(this.menuArr[0].page);
}
}
parentFind=this.menuArr[0];
}
find = parentFind;
setTimeout(() => {
this.navPath.push({ name: title });
}, 0);
}
let { name, page, pid } = find;
this.currPath = page;
let pfind = this.menuArr.find(x => x.id == pid);
if (!!pfind) {
navArr.push({ name: pfind.name });
}
navArr.push({ name, page });
this.navPath = navArr;
},
linkMenu(page) {
const path = this.$route.path;
if (page === path) this.reload();
else this.$router.push(page);
},
linkUserInfo() {
top.location.href = this.baseHost + "/v/userinfo";
},
childChange(index) {
this.modArr[index].childState = !this.modArr[index].childState;
},
logout() {
let url = window.location.href;
url = "/logout?service=" + url;
top.location.href = this.ssoHost + url;
},
flaten(tree, pid = 0) {
var arr = [];
tree.forEach(element => {
let { id, name, page, modId } = element;
arr.push({ id, name, page, modId, pid });
if (element.children) {
arr.push(...this.flaten(element.children, id));
}
});
return arr;
}
}
};
</script>
+306
View File
@@ -0,0 +1,306 @@
<template>
<div class="layout_old">
<!-- 头部 -->
<header class="header">
<div class="header-logo">
<div class="header-logo-title">
<img :src="logoUrl" />
</div>
</div>
<div class="header-aside">
<div class="aside-box clearfix">
<p>
你好,
<a>{{ username }}</a>
</p>
<p class="aside-btn-list">
<Tooltip content="个人信息" placement="bottom-start">
<Button type="ghost" icon="android-happy" @click="linkUser()"></Button>
</Tooltip>
<Tooltip content="应用列表" placement="bottom">
<Button type="ghost" icon="android-apps" @click="linkApp()"></Button>
</Tooltip>
<Tooltip content="退出登录" placement="bottom-end">
<Button type="ghost" icon="power" @click="logout"></Button>
</Tooltip>
<!-- 如果是3.0.icon改成 -->
<!--
md-happy
md-apps
md-power
-->
</p>
</div>
</div>
</header>
<!-- 标题 -->
<div class="path-nav">
<h1>{{ pathName }}</h1>
</div>
<!-- 侧边 -->
<div class="leftmenu">
<div class="" style="height: 100%">
<div class="title-top">{{ appName }}</div>
<ul class="title-box">
<li
v-for="(item, index) in modList"
:key="index"
:class="{
active: item.page.toLowerCase() == currPath.toLowerCase(),
}"
>
<!-- <router-link :to="item.page" >{{item.name}}</router-link> -->
<a href="javascript:;" @click="flushCom(item.page)">{{ item.name }}</a>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
inject: ["reload"],
props: {
layoutData: {
appName: String,
appList: Array,
modList: Array,
userInfo: Object,
ssoHost: String,
baseHost: String,
isAlone: Boolean, //是否只有一个选项卡
},
},
data() {
return {
username: "",
pathName: "",
logoUrl: "",
currPath: "",
};
},
computed: {
listNumber: function () {
return this.pathList.sort(function (a, b) {
return a.modId - b.modId;
});
},
},
mounted() {
const _this = this;
for (const key in _this.layoutData) _this[key] = _this.layoutData[key];
this.username = this.userInfo.name;
this.logoUrl = this.baseHost + "/img/logo.png";
_this.routeChange(_this.$route); //初次加载时手动触发route的change
this.$watch("$route", _this.routeChange);
$(".base-wrap-main").css("padding-top", "145px");
},
methods: {
logout() {
//退出登陆
let url = window.location.href;
url = "/logout?service=" + url;
top.location.href = this.ssoHost + url;
},
routeChange(router) {
const _this = this;
window.document.title = router.meta.title || "弘育云平台";
let currentMod = router.meta.modId;
//时间有限,仅支持一层.暂时写死,有需求再改
_this.modList.forEach(element => {
let childIndex = element.children.findIndex(x => x.modId == currentMod);
if (currentMod == element.modId || childIndex > -1) {
_this.currPath = element.page;
_this.pathName = element.name;
}
});
},
linkApp() {
location.href = this.baseHost + "/v/home";
},
linkUser() {
location.href = this.baseHost + "/v/userinfo";
},
flushCom(page) {
//return;
const path = this.$route.path;
// console.log(page,path);
if (page === path) {
this.reload();
//this.$root.$children[0].reload()
} else {
this.$router.push(page);
}
},
},
};
</script>
<style lang="scss" >
.layout_old {
.header {
width: 100%;
height: 70px;
position: fixed;
top: 0;
left: 0;
z-index: 22;
background-color: #fff;
background-image: linear-gradient(143deg, #6c91f0 45%, #7863b4 81%, #7a5aa9);
.header-logo {
width: 200px;
height: 100%;
float: left;
position: relative;
}
.header-logo-title {
margin-left: 32px;
position: relative;
top: 20px;
.logo-box {
background: url(/static/image/logo.png) no-repeat;
width: 450px;
height: 70px;
}
}
.header-aside {
float: right;
margin: 0 30px 0 0;
position: relative;
color: #fff;
font-size: 14px;
.aside-box {
margin: 26px 0 22px 0;
.icon-box {
width: 34px;
font-size: 18px;
color: #fff;
text-align: center;
}
a {
color: #fff;
&:hover {
color: #2d8cf0;
}
}
}
.aside-btn-list {
.ivu-btn {
padding: 0px;
border: 0px;
width: 35px;
i {
color: #fff;
font-size: 18px;
}
}
}
p {
float: left;
color: #ffffff;
padding-right: 10px;
font-size: 14px;
}
}
}
.path-nav {
position: fixed;
z-index: 21;
top: 70px;
height: 54px;
left: 200px;
box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
background: #fff;
width: 100%;
padding: 0 15px;
box-sizing: border-box;
min-width: 767px;
h1 {
float: left;
font-size: 16px;
color: #464c5b;
margin: auto;
line-height: 56px;
font-weight: 400;
}
}
.leftmenu {
position: fixed;
z-index: 20;
-moz-overflow: auto;
overflow: auto\9;
overflow: overlay;
overflow-x: hidden;
background: #8791a5 !important;
height: 100%;
width: 200px;
padding-top: 70px;
box-sizing: border-box;
& > div {
overflow-y: auto;
}
.title-top {
height: 54px;
line-height: 54px;
background: #3e485a;
font-size: 16px;
font-weight: 400;
text-align: center;
width: 200px;
color: #ffffff;
}
.title-box {
background: #eaedf2;
width: 200px;
overflow: overlay;
border-right: 0px;
display: block;
margin: 0;
padding: 0;
outline: 0;
list-style: none;
color: #495060;
font-size: 14px;
position: relative;
li {
text-align: center;
background: #8791a5;
padding: 0px !important;
border-bottom: 1px solid #a5adbf;
transition: all 200ms;
&:hover {
border-left: 4px solid #6c8fed;
background: #f3f3f3;
}
&.active {
background: #f3f3f3;
a {
color: #333;
}
}
a {
color: #ffffff;
display: block;
padding: 16px 0px 14px 34px;
text-align: left;
color: #ffffff;
}
a:hover {
color: rgb(51, 51, 51);
}
}
a {
color: #495060;
}
}
}
.wrap-main {
padding: 124px 0 0 200px;
}
.nav-btn-wrap {
top: 78px;
}
}
</style>