|
|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
|
- <div class="header" ref="headerMenu">
|
|
|
+ <div class="header" v-show="showHeader" ref="headerMenu">
|
|
|
|
|
|
<el-dialog title="绑定邮箱" center width="450px" :visible.sync="bindEmailData.dialogShow">
|
|
|
<bindEmail
|
|
|
@@ -114,22 +114,26 @@
|
|
|
:class="{report:item.versions}"
|
|
|
:key="index"
|
|
|
>
|
|
|
+ <img :src="item.externalLink === activeMenuName ? item.iconCur : item.icon" class="menu_item_icon" v-if="padApp" />
|
|
|
<span class="menuName">{{ item.menuName }}</span>
|
|
|
<!-- <div class="versions" v-if="item.versions"><span>V</span><span>{{ item.versions }}</span></div> -->
|
|
|
</el-menu-item>
|
|
|
</el-menu>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="user_info">
|
|
|
+ <div :class="['user_info', {'pad_user_info': padApp}]">
|
|
|
<el-dropdown
|
|
|
@command="UserCommand"
|
|
|
placement="top-start"
|
|
|
trigger="click"
|
|
|
>
|
|
|
<span class="user_name">
|
|
|
- {{ studentName }}<i class="el-icon-arrow-down"></i>
|
|
|
+ <template v-if="!padApp">
|
|
|
+ {{ studentName }}<i class="el-icon-arrow-down"></i>
|
|
|
+ </template>
|
|
|
+ <img src="@/assets/tabbar/set.png" class="set_icon" v-else />
|
|
|
</span>
|
|
|
- <el-dropdown-menu slot="dropdown">
|
|
|
+ <el-dropdown-menu slot="dropdown" :class="{ 'custom_pad_set_dropdown': padApp }">
|
|
|
<!-- <el-dropdown-item command="bindUserEmail">绑定邮箱</el-dropdown-item> -->
|
|
|
<el-dropdown-item command="setPassWord">修改密码</el-dropdown-item>
|
|
|
<el-dropdown-item command="logout">退出登录</el-dropdown-item>
|
|
|
@@ -143,7 +147,14 @@
|
|
|
import { mapGetters } from "vuex";
|
|
|
import bindEmail from "@/views/userInfo/components/userSetting/bindEmail.vue";
|
|
|
import { encrypt } from "@/utils/jsencrypt";
|
|
|
-import { removeToken } from "@/utils/auth";
|
|
|
+import teachHomework from '@/assets/tabbar/teach_homework.png';
|
|
|
+import teachHomeworkCur from '@/assets/tabbar/teach_homework_cur.png';
|
|
|
+import report from '@/assets/tabbar/report.png';
|
|
|
+import reportCur from '@/assets/tabbar/report_cur.png';
|
|
|
+import target from '@/assets/tabbar/target.png';
|
|
|
+import targetCur from '@/assets/tabbar/target_cur.png';
|
|
|
+import personalCenter from '@/assets/tabbar/personal_center.png';
|
|
|
+import personalCenterCur from '@/assets/tabbar/personal_center_cur.png';
|
|
|
export default {
|
|
|
computed: {
|
|
|
...mapGetters(["userInfo"]),
|
|
|
@@ -158,7 +169,11 @@ export default {
|
|
|
|
|
|
schoolLogo() {
|
|
|
return this.$store.state.user.schoolLogo || "";
|
|
|
- }
|
|
|
+ },
|
|
|
+ // pad端-------侧边栏是否显示
|
|
|
+ showHeader() {
|
|
|
+ return this.$store.state.user.showHeader;
|
|
|
+ },
|
|
|
},
|
|
|
components: {
|
|
|
bindEmail,
|
|
|
@@ -192,12 +207,14 @@ export default {
|
|
|
},
|
|
|
rowsData: {},
|
|
|
menuList: [],
|
|
|
-
|
|
|
+ // App(pad)环境标识:true 时显示pad端样式
|
|
|
+ padApp: !!window.__IS_PAD_APP__,
|
|
|
|
|
|
};
|
|
|
},
|
|
|
created() {
|
|
|
-
|
|
|
+ //监听壳token就绪事件(覆盖Header先于setToken挂载、__IS_PAD_APP__尚未设置的时序)
|
|
|
+ window.addEventListener('padAppTokenReady', this.onPadTokenReady);
|
|
|
this.activeMenu();
|
|
|
|
|
|
//学生端默认菜单
|
|
|
@@ -205,29 +222,42 @@ export default {
|
|
|
{
|
|
|
menuName: "教辅作业",
|
|
|
externalLink: "/teachingHomework",
|
|
|
+ icon: teachHomework,
|
|
|
+ iconCur: teachHomeworkCur,
|
|
|
feature: "teachingHomework", // 生产环境隐藏的未完成模块
|
|
|
},
|
|
|
{
|
|
|
menuName: "分析报告",
|
|
|
+ icon: report,
|
|
|
+ iconCur: reportCur,
|
|
|
externalLink: "/jointStudentAnalysisReport/list",
|
|
|
},
|
|
|
{
|
|
|
menuName: "靶向提升",
|
|
|
+ icon: target,
|
|
|
+ iconCur: targetCur,
|
|
|
externalLink: "/targetImprove",
|
|
|
},
|
|
|
|
|
|
{
|
|
|
menuName: "个人中心",
|
|
|
+ icon: personalCenter,
|
|
|
+ iconCur: personalCenterCur,
|
|
|
externalLink: "/userInfo",
|
|
|
},
|
|
|
];
|
|
|
|
|
|
// 带 feature 标识的菜单(未完成模块),生产环境隐藏,测试/开发环境显示
|
|
|
this.menuList = baseMenuList.filter(item => !item.feature || this.$feature.isShow());
|
|
|
-
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ window.removeEventListener('padAppTokenReady', this.onPadTokenReady);
|
|
|
},
|
|
|
methods: {
|
|
|
-
|
|
|
+ //App(pad)端壳token就绪:更新pad环境标识,启用pad端样式
|
|
|
+ onPadTokenReady() {
|
|
|
+ this.padApp = true;
|
|
|
+ },
|
|
|
updateShowEmailSuccess(show) {
|
|
|
this.$refs.headerMenu.style.zIndex = 600;
|
|
|
this.bindEmailData.dialogShow = show;
|
|
|
@@ -311,13 +341,42 @@ export default {
|
|
|
|
|
|
// 退出登录
|
|
|
Logout() {
|
|
|
+ // 通知App壳端退出登录(仅APP环境生效)
|
|
|
+ this.notifyPadAppLogout('logout');
|
|
|
this.$store.dispatch("user/logout");
|
|
|
localStorage.clear();
|
|
|
- let url=process.env.VUE_APP_BASE+'/marking/#/login';//退出到考阅登录页
|
|
|
- window.location.replace(url)
|
|
|
- window.parent.location.href = `${process.env.VUE_APP_BASE}/marking/#/login`;//兼容父级iframe
|
|
|
+ if(!this.padApp){
|
|
|
+ let url=process.env.VUE_APP_BASE+'/marking/#/login';//退出到考阅登录页
|
|
|
+ window.location.replace(url)
|
|
|
+ window.parent.location.href = `${process.env.VUE_APP_BASE}/marking/#/login`;//兼容父级iframe
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //通知App(pad)端退出登录:
|
|
|
+ //H5环境:web端处于markPaper-pad H5的iframe中,通过postMessage通知父页面退出登录
|
|
|
+ notifyPadAppLogout(type) {
|
|
|
+ try {
|
|
|
+ if (window.plus && plus.webview) {
|
|
|
+ if (window.uni) {
|
|
|
+ this.PadLogoutSendMsg(type)
|
|
|
+ } else {
|
|
|
+ // 等待JS桥准备完成再发消息,防止路由守卫触发太早uni不存在
|
|
|
+ document.addEventListener('UniAppJSBridgeReady', () => { this.PadLogoutSendMsg(type)}, {once:true})
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // H5:通知父级iframe页面(markPaper-pad H5)退出登录
|
|
|
+ // const baseUrl = process.env.NODE_ENV === 'development' ? '*' : process.env.VUE_APP_BASE;
|
|
|
+ window.parent.postMessage({ type: type}, '*');
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('通知App端退出登录失败', e);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //通知App端退出登录
|
|
|
+ PadLogoutSendMsg(type) {
|
|
|
+ uni.postMessage({
|
|
|
+ data: {type: type}
|
|
|
+ })
|
|
|
},
|
|
|
-
|
|
|
//打开修改密码弹窗
|
|
|
OpenUpdatePassWord()
|
|
|
{
|
|
|
@@ -514,6 +573,15 @@ export default {
|
|
|
// background-color: red;
|
|
|
// margin-right: -10px;
|
|
|
line-height: 30px;
|
|
|
+ &.pad_user_info{
|
|
|
+ width: 100%;
|
|
|
+ height: 80px;
|
|
|
+ display: flex;
|
|
|
+ flex-shrink: 0;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ line-height: normal;
|
|
|
+ }
|
|
|
.user_name
|
|
|
{
|
|
|
font-size: 15px;
|
|
|
@@ -525,6 +593,10 @@ export default {
|
|
|
margin-left: 10px;
|
|
|
}
|
|
|
}
|
|
|
+ .set_icon {
|
|
|
+ width: 20px;
|
|
|
+ height: 20px;
|
|
|
+ }
|
|
|
}
|
|
|
.el-dropdown-menu {
|
|
|
left: auto !important; /* 取消默认左对齐 */
|
|
|
@@ -565,3 +637,43 @@ button.el-button {
|
|
|
}
|
|
|
}
|
|
|
</style>
|
|
|
+<style lang="scss">
|
|
|
+/* ============ App(pad)端:设置按钮触发的头部下拉弹框样式 ============
|
|
|
+ 原理:el-dropdown-menu 渲染出的 <ul> 由 popper 挂载到 document.body
|
|
|
+ (vue-popper 的 appendToBody 默认开启),它不在 .el-dropdown 外层容器内,
|
|
|
+ 所以 scoped 样式和「.custom_pad_set_dropdown 子孙选择器」都无法命中菜单。
|
|
|
+ 必须写成全局样式,并用「.el-dropdown-menu.custom_pad_set_dropdown」组合选择器
|
|
|
+ 只命中 pad 模式下加到菜单上的 class,避免影响其它页面的 el-dropdown。 */
|
|
|
+.el-dropdown-menu.custom_pad_set_dropdown {
|
|
|
+ top: auto !important; // 覆盖 popper 内联设置的 top
|
|
|
+ left: 76px !important; // 左侧栏宽66px,76px=贴着侧边栏右侧弹出
|
|
|
+ bottom: 8px !important; // 贴近屏幕底部,与设置按钮垂直位置对齐
|
|
|
+ width: 98px !important;
|
|
|
+ min-width: 98px !important;
|
|
|
+ padding: 4px 0 !important;
|
|
|
+ margin: 0 !important; // 去掉 popper 默认 5px 间隙,保证底部定位精确
|
|
|
+ border: 1px solid #EBEEF5 !important;
|
|
|
+ border-radius: 6px !important;
|
|
|
+ box-shadow: 2px 2px 8px 4px rgba(0,0,0,0.08) !important;
|
|
|
+ .popper__arrow{
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ .el-dropdown-menu__item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ height: 40px;
|
|
|
+ line-height: 40px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #666666;
|
|
|
+ padding: 0;
|
|
|
+ background-color: transparent;
|
|
|
+
|
|
|
+ &:hover,
|
|
|
+ &:focus {
|
|
|
+ background-color: #F5F7FA;
|
|
|
+ color: #666666;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|