755 lines
22 KiB
Vue
755 lines
22 KiB
Vue
<template>
|
|
<div class="header_max">
|
|
|
|
<header class="header_component">
|
|
<div class="header_right_content">
|
|
<div class="header_user_icon"></div>
|
|
<!-- <div class="header_icon icon iconfont icon-touxiang3"></div> -->
|
|
<div class="header_user_content">
|
|
<div v-if="isTest" class="username"><span>/</span> {{$t('Header.hello')}}@{{ $t('isTest.userName') }}</div>
|
|
<div v-else class="username"><span>/</span> {{$t('Header.hello')}}@{{ userInfo?.userName }}</div>
|
|
<div
|
|
:class="[
|
|
'icon',
|
|
'iconfont',
|
|
'icon-xiala',
|
|
isShowOperate ? 'icon_rotate' : '',
|
|
]"
|
|
@click.stop="changeShowOperateContent()"
|
|
></div>
|
|
|
|
</div>
|
|
<div class="header_user_content marLeft2">
|
|
<!-- <span class="icon iconfont icon-yuyan"></span> -->
|
|
<span class="username">{{$t('Header.language')}}</span>
|
|
<div
|
|
:class="[
|
|
'icon',
|
|
'iconfont',
|
|
'icon-xiala',
|
|
isLanguage ? 'icon_rotate' : '',
|
|
]"
|
|
@click.stop="changeLanguage()"
|
|
></div>
|
|
</div>
|
|
<div
|
|
v-if="userInfo.userId == 83"
|
|
class="trialApproval button_second"
|
|
@click="turnToPage('trialApproval')"
|
|
>
|
|
Trial Approval
|
|
</div>
|
|
</div>
|
|
<nav class="header_nav_content">
|
|
<div
|
|
:class="[
|
|
'nav_item',
|
|
$route.name === 'home' ? 'select_nav' : '',
|
|
]"
|
|
@click="turnToPage('home')"
|
|
>
|
|
{{$t('Header.HOME')}}
|
|
</div>
|
|
<div
|
|
:class="[
|
|
'nav_item',
|
|
$route.name === 'library' ? 'select_nav' : '',
|
|
]"
|
|
@click="turnToPage('library')"
|
|
>
|
|
{{$t('Header.LIBRARY')}}
|
|
</div>
|
|
<div
|
|
:class="[
|
|
'nav_item',
|
|
$route.name === 'history' ? 'select_nav' : '',
|
|
]"
|
|
@click="turnToPage('history')"
|
|
>
|
|
{{$t('Header.HISTORY')}}
|
|
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="header_right">
|
|
<img
|
|
class="header_logo"
|
|
@click="turnToNewPage('https://www.aidlab.hk/en/')"
|
|
src="@/assets/images/loginPage/aida_logo.png"
|
|
/>
|
|
<Habit></Habit>
|
|
|
|
</div>
|
|
</header>
|
|
<nav class="select_block" v-show="isShowOperate">
|
|
<!-- <div class="select_item" @click="showBindEmailModal()">
|
|
<span class="icon iconfont icon-youxiang"></span><span class="select_item_des">{{$t('Header.bindEmail')}}</span>
|
|
</div> -->
|
|
<!-- <div class="select_item" @click.stop="isLanguage = !isLanguage">
|
|
<span class="icon iconfont icon-yuyan"></span>
|
|
<span class="select_item_des">{{$t('Header.language')}}</span>
|
|
</div> -->
|
|
<div class="select_item" @click="logout()">
|
|
<span class="icon iconfont icon-tuichu"></span
|
|
><span class="select_item_des">{{$t('Header.logOff')}}</span>
|
|
</div>
|
|
|
|
</nav>
|
|
<ul class="select_block select_list" v-show="isLanguage">
|
|
<li class="select_item" v-for="item in language" @click="setLocale(item.value)">
|
|
<span class="select_item_des">{{ item.name }}</span>
|
|
</li>
|
|
</ul>
|
|
<a-modal
|
|
class="modal_component"
|
|
v-model:visible="bindEmailVisible"
|
|
:footer="null"
|
|
title="Mailbox binding"
|
|
width="56rem"
|
|
:maskClosable="false"
|
|
:keyboard="false"
|
|
:centered="true"
|
|
>
|
|
<template #closeIcon v-if="!isHaveBindEmail && bindEmailStep === 1">
|
|
<div class="skip_content">{{$t('Header.skip')}}</div>
|
|
</template>
|
|
<div class="bind_email_content" v-if="isHaveBindEmail">
|
|
<div class="bind_email_tip">{{$t('Header.emailContent')}}</div>
|
|
<div class="bind_email">{{ userInfo.email }}</div>
|
|
</div>
|
|
<div class="bind_email_content" v-else>
|
|
<!-- 绑定邮箱第一步 start -->
|
|
<div v-show="bindEmailStep === 1">
|
|
<div class="bind_email_form_content">
|
|
<div class="bind_email_form_title">{{$t('Header.Email')}}</div>
|
|
<input
|
|
class="bind_email_form_input"
|
|
placeholder="Enter a new email"
|
|
v-model="email"
|
|
@keydown.enter="emailNextStepFun()"
|
|
/>
|
|
</div>
|
|
<div
|
|
class="bind_email_submit_button"
|
|
@click="emailNextStepFun()"
|
|
>
|
|
{{$t('Header.NextStep')}}
|
|
</div>
|
|
</div>
|
|
<!-- 绑定邮箱第一步 end -->
|
|
|
|
<!-- 绑定邮箱第二步 start -->
|
|
<div v-show="bindEmailStep === 2">
|
|
<div @click="emailLastStepFun()">
|
|
<span class="icon iconfont icon--shangyibu"></span
|
|
><span class="email_last_step_content"
|
|
>{{$t('Header.verification')}}</span
|
|
>
|
|
</div>
|
|
<div class="email_last_step_des">
|
|
<div class="sent_email_content">
|
|
{{$t('Header.SentTo')}} {{ email }}
|
|
</div>
|
|
<div class="tip_content">
|
|
<span v-show="time">{{ time }}s</span>
|
|
<span v-show="!time" @click="emailNextStepFun()"
|
|
>{{$t('Header.Resend')}}Resend</span
|
|
>
|
|
</div>
|
|
</div>
|
|
<VerificationCodeInput
|
|
:ct="emailCode"
|
|
@sendCaptcha="submitBindEmail($event)"
|
|
></VerificationCodeInput>
|
|
</div>
|
|
<!-- 绑定邮箱第一步 end -->
|
|
</div>
|
|
</a-modal>
|
|
</div>
|
|
</template>
|
|
<script >
|
|
import { defineComponent, createVNode, ref } from "vue";
|
|
import { isEmail } from "@/tool/util";
|
|
import { setCookie, getCookie, WriteCookie } from "@/tool/cookie";
|
|
import VerificationCodeInput from "@/component/LoginPage/verificationCodeInput.vue";
|
|
import Habit from "@/component/Detail/habit.vue";
|
|
import { Https } from "@/tool/https";
|
|
import { Modal, message } from "ant-design-vue";
|
|
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
|
|
import { useStore } from "vuex";
|
|
import { useI18n } from "vue-i18n";
|
|
export default defineComponent({
|
|
components: {
|
|
VerificationCodeInput,
|
|
Habit,
|
|
},
|
|
setup(){
|
|
const store = useStore();
|
|
const {t} = useI18n()
|
|
const {locale} = useI18n()
|
|
let isTest = ref()
|
|
return {
|
|
store,
|
|
t,
|
|
locale,
|
|
isTest,
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
isShowOperate: false,
|
|
bindEmailVisible: false,
|
|
isHaveBindEmail: false,
|
|
bindEmailStep: 1,
|
|
email: "",
|
|
emailCode: ["", "", "", "", "", ""], //邮箱验证码
|
|
time: 60, //60秒倒计时
|
|
timer: 0,
|
|
userInfo: {},
|
|
timerOperate: null,
|
|
numTime: 30,
|
|
timerSec: null,
|
|
modalWarning: null,
|
|
isLanguage: false,
|
|
language:[
|
|
{name:'English',value:'ENGLISH'},
|
|
{name:'中文',value:'CHINESE_SIMPLIFIED'},
|
|
// {name:'한국인',value:'KOREAN'},
|
|
// {name:'にほんご',value:'JAPANESE'},
|
|
// {name:'Русский',value:'RUSSIAN'},
|
|
// {name:'Français',value:'FRENCH'},
|
|
// {name:'แบบไทย',value:'THAI'},
|
|
// {name:'Tiếng Việt',value:'VIETNAMESE'},
|
|
// {name:'Italiano',value:'ITALIAN'},
|
|
]
|
|
};
|
|
},
|
|
mounted() {
|
|
let isTest = getCookie('isTest')
|
|
this.isTest =JSON.parse(isTest)
|
|
|
|
this.userInfo = JSON.parse(getCookie("userInfo"));
|
|
if (!this.userInfo) {
|
|
this.$router.replace("/login");
|
|
} else {
|
|
this.accountIsLogin(this.userInfo);
|
|
}
|
|
this.isHaveBindEmail = this.userInfo?.email ? true : false;
|
|
this.operateClick();
|
|
document.addEventListener("click", this.operateClick);
|
|
this.getLang('')
|
|
},
|
|
methods: {
|
|
turnToNewPage(url) {
|
|
window.open(url);
|
|
},
|
|
|
|
turnToPage(name) {
|
|
let noRefresh = name === "home" ? true : false;
|
|
this.$router.push({ name: name, params: { noRefresh: noRefresh } });
|
|
},
|
|
|
|
//点击下拉图标出现操作
|
|
changeShowOperateContent() {
|
|
this.isShowOperate = !this.isShowOperate;
|
|
document.addEventListener(
|
|
"click",
|
|
this.closeShowOperateContent,
|
|
false
|
|
);
|
|
},
|
|
changeLanguage(){
|
|
this.isLanguage = !this.isLanguage;
|
|
document.addEventListener(
|
|
"click",
|
|
this.closeShowOperateContent,
|
|
false
|
|
);
|
|
},
|
|
|
|
//关闭下拉图标
|
|
closeShowOperateContent() {
|
|
this.isShowOperate = false;
|
|
this.isLanguage = false
|
|
document.removeEventListener("click", this.closeShowOperateContent);
|
|
},
|
|
|
|
//打开绑定邮箱弹窗
|
|
showBindEmailModal() {
|
|
this.bindEmailVisible = true;
|
|
},
|
|
|
|
emailNextStepFun() {
|
|
if (!isEmail(this.email)) {
|
|
message.info(this.t('Header.jsContent1'));
|
|
return;
|
|
}
|
|
let data = {
|
|
email: this.email,
|
|
operationType: "BIND_MAILBOX",
|
|
};
|
|
const hide = message.loading("loading", 0);
|
|
Https.axiosPost(Https.httpUrls.accountSendEmail, data)
|
|
.then((rv) => {
|
|
if (rv) {
|
|
this.bindEmailStep = 2;
|
|
(this.emailCode = ["", "", "", "", "", ""]),
|
|
this.createTimer();
|
|
hide();
|
|
message.success(this.t('Header.jsContent2'));
|
|
}
|
|
})
|
|
.catch((res) => {
|
|
hide();
|
|
});
|
|
},
|
|
|
|
//绑定邮箱的上一步
|
|
emailLastStepFun() {
|
|
this.bindEmailStep = 1;
|
|
this.email = "";
|
|
(this.emailCode = ["", "", "", "", "", ""]), this.clearTimer();
|
|
},
|
|
|
|
//创建定时器
|
|
createTimer() {
|
|
this.timer = setInterval(() => {
|
|
this.time--;
|
|
if (!this.time) {
|
|
clearInterval(this.timer);
|
|
}
|
|
}, 1000);
|
|
},
|
|
|
|
//清除定时器
|
|
clearTimer() {
|
|
this.time = 60;
|
|
if (this.timer) {
|
|
clearInterval(this.timer);
|
|
}
|
|
},
|
|
|
|
//登出
|
|
async logout() {
|
|
let data = {
|
|
userId: this.userInfo.userId,
|
|
};
|
|
let isTest = getCookie('isTest')
|
|
// console.log(getCookie("token"));
|
|
if(JSON.parse(isTest)){
|
|
await Https.axiosGet(Https.httpUrls.trialUserLogout,).then((rv) => {
|
|
Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
|
|
this.$router.replace("/login");
|
|
WriteCookie("token");
|
|
});
|
|
})
|
|
}else{
|
|
await Https.axiosPost(Https.httpUrls.accountLogout, data).then((rv) => {
|
|
this.$router.replace("/login");
|
|
WriteCookie("token");
|
|
});
|
|
}
|
|
window.location.reload()
|
|
|
|
},
|
|
|
|
//绑定邮箱
|
|
submitBindEmail(emailVerifyCode) {
|
|
let data = {
|
|
userEmail: this.email,
|
|
userId: this.userInfo.userId,
|
|
emailVerifyCode: emailVerifyCode,
|
|
};
|
|
Https.axiosPost(Https.httpUrls.accountBindEmail, data).then(
|
|
(rv) => {
|
|
if (rv) {
|
|
this.userInfo.email = this.email;
|
|
setCookie("userInfo", JSON.stringify(this.userInfo));
|
|
(this.bindEmailVisible = false),
|
|
(this.bindEmailStep = 1);
|
|
this.clearTimer();
|
|
this.emailCode = ["", "", "", "", "", ""];
|
|
}
|
|
}
|
|
);
|
|
},
|
|
|
|
//判断是否登录
|
|
accountIsLogin(userInfo) {
|
|
let data = {
|
|
userId: userInfo.userId,
|
|
};
|
|
Https.axiosPost(Https.httpUrls.accountIsLogin, data).then((rv) => {
|
|
if (!rv) {
|
|
this.$router.replace("/login");
|
|
}
|
|
});
|
|
},
|
|
|
|
//点击重置判断是否长时间五操作
|
|
operateClick() {
|
|
if (this.timer) {
|
|
clearTimeout(this.timer);
|
|
}
|
|
let _this = this;
|
|
let timeNum = 1000 * 60 * 120;
|
|
this.timer = setTimeout(() => {
|
|
this.modalWarning = Modal.warning({
|
|
title: () =>
|
|
this.t('Header.jsContent3',{numTime:_this.numTime}),
|
|
icon: createVNode(ExclamationCircleOutlined),
|
|
okText: "Ok",
|
|
centered:true,
|
|
onOk() {
|
|
_this.numTime = 30;
|
|
clearInterval(_this.timerSec);
|
|
},
|
|
});
|
|
_this.numCounter();
|
|
}, timeNum);
|
|
},
|
|
|
|
numCounter() {
|
|
this.timerSec = setInterval(() => {
|
|
if (this.numTime > 0) {
|
|
this.numTime = this.numTime - 1;
|
|
} else {
|
|
clearTimeout(this.timer);
|
|
clearInterval(this.timerSec);
|
|
this.logout();
|
|
this.modalWarning.destroy();
|
|
}
|
|
}, 1000);
|
|
},
|
|
//获取当前语言
|
|
getLang(v){
|
|
let data
|
|
Https.axiosPost(Https.httpUrls.getUserLanguage, data).then(
|
|
(rv) => {
|
|
if (rv) {
|
|
this.locale = rv
|
|
}
|
|
}
|
|
);
|
|
},
|
|
setLang(v){
|
|
// let data = {
|
|
// language:v
|
|
// }
|
|
Https.axiosGet(Https.httpUrls.changeUserLanguage,{params:{language:v}}).then((rv) => {
|
|
if (rv) {
|
|
if (rv) {
|
|
let token = rv;
|
|
setCookie("token", token);
|
|
this.getLang('')
|
|
// if(this.$router.currentRoute._value.path == '/home'){
|
|
// this.$router.push("/home")
|
|
// }else{
|
|
// this.$router.push("/home")
|
|
// }
|
|
this.store.commit('clearAllData')
|
|
window.location.reload()
|
|
}
|
|
}
|
|
})
|
|
// Https.axiosPost(Https.httpUrls.changeUserLanguage, data).then(
|
|
// (rv) => {
|
|
// if (rv) {
|
|
// let token = rv;
|
|
// setCookie("token", token);
|
|
// this.getLang(v)
|
|
// }
|
|
// }
|
|
// );
|
|
},
|
|
|
|
setLocale(v){
|
|
// window.location.reload();
|
|
// let name = 'home'
|
|
// let noRefresh = true;
|
|
// this.$router.push({ name: name, params: { noRefresh: noRefresh } });
|
|
// this.locale = v
|
|
this.setLang(v)
|
|
// this.locale == 'zh-cn'?this.locale = 'en':this.locale = 'zh-cn'
|
|
}
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.header_max{
|
|
position: relative;
|
|
}
|
|
.header_component {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
// padding: 0 30px;
|
|
padding-left: 0;
|
|
width: 100%;
|
|
height: 7rem;
|
|
background: rgba(255, 255, 255, 0.2);
|
|
// border-bottom: 0.1rem solid rgba(3, 3, 3, 0.1);
|
|
position: relative;
|
|
align-items: center;
|
|
|
|
z-index: 1049;
|
|
background-color: #fff;
|
|
.header_right{
|
|
width: 33%;
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
align-items: center;
|
|
}
|
|
.header_logo {
|
|
width: 14.4rem;
|
|
height: 3.2rem;
|
|
margin: 2.1rem 2.8rem 0 ;
|
|
// position: absolute;
|
|
margin-top: 0;
|
|
}
|
|
|
|
.header_nav_content {
|
|
display: flex;
|
|
// margin-left: 28.9rem;
|
|
// margin-left: 46.2rem;
|
|
align-items: center;
|
|
|
|
.nav_item {
|
|
padding: 1.1rem 1rem;
|
|
border-bottom: 0.1rem solid transparent;
|
|
margin-right: 3.4rem;
|
|
font-size: 1.6rem;
|
|
line-height: 1.3rem;
|
|
// color: #333333;
|
|
color: #000;
|
|
cursor: pointer;
|
|
font-weight: 900;
|
|
&.nav_item:nth-child(3){
|
|
margin: 0;
|
|
}
|
|
&.nav_item::before {
|
|
position: absolute;
|
|
content: "";
|
|
display: block;
|
|
background: #000;
|
|
height: .3rem;
|
|
left: 50%;
|
|
transform: translateX(-50%);
|
|
bottom: .3rem;
|
|
width: 0px;
|
|
transition: 0.3s all;
|
|
}
|
|
&.select_nav {
|
|
color: #000;
|
|
transform: scale(1.15);
|
|
}
|
|
&.select_nav::before {
|
|
width: 80%;
|
|
}
|
|
}
|
|
}
|
|
|
|
.header_right_content {
|
|
// position: absolute;
|
|
top: 0;
|
|
// right: 3.2rem;
|
|
left: 0;
|
|
display: flex;
|
|
width: 33%;
|
|
height: 100%;
|
|
align-items: center;
|
|
overflow: hidden;
|
|
.header_icon {
|
|
font-size: 3.6rem;
|
|
position: relative;
|
|
top: 0.3rem;
|
|
}
|
|
.header_user_icon{
|
|
height: 4rem;
|
|
width: 4rem;
|
|
background-color: #000;
|
|
border-radius: 50%;
|
|
transform: translateX(-40%)scale(1.3);
|
|
}
|
|
.header_user_content {
|
|
// margin-left: 2rem;
|
|
display: flex;
|
|
align-items: center;
|
|
position: relative;
|
|
// top: 1.2rem;
|
|
height: 3.7rem;
|
|
&.marLeft2{
|
|
margin-left: 2rem;
|
|
}
|
|
.username {
|
|
font-size: 1.8rem;
|
|
color: #1a1a1a;
|
|
margin: 0 0.8rem;
|
|
font-weight: 900;
|
|
span{
|
|
margin: .7rem;
|
|
}
|
|
}
|
|
|
|
.icon-xiala {
|
|
font-size: 1.4rem;
|
|
cursor: pointer;
|
|
transition: .3s all;
|
|
}
|
|
|
|
.icon_rotate {
|
|
-moz-transform: rotate(180deg);
|
|
-webkit-transform: rotate(180deg);
|
|
transform: rotate(180deg);
|
|
animation-direction: 0.5s;
|
|
}
|
|
}
|
|
.trialApproval{
|
|
margin-left: 2rem;
|
|
}
|
|
}
|
|
|
|
}
|
|
.select_block {
|
|
z-index: 1050;
|
|
position: absolute;
|
|
left: 6.5rem;
|
|
top: 4.7rem;
|
|
width: 11.4rem;
|
|
background: #ffffff;
|
|
box-shadow: 0px 0.4rem 0.4rem 0px rgba(0, 0, 0, 0.1);
|
|
overflow: hidden;
|
|
border: 1px solid #000000;
|
|
&.select_list{
|
|
// display: none;
|
|
transform: translateX(120%);
|
|
}
|
|
.select_item {
|
|
padding-left: 1.5rem;
|
|
height: 4.1rem;
|
|
color: #4d4d4d;
|
|
display: flex;
|
|
align-items: center;
|
|
cursor: pointer;
|
|
user-select: none;
|
|
|
|
&:hover {
|
|
background: #f7f7f7;
|
|
}
|
|
|
|
.iconfont {
|
|
font-size: 1.4rem;
|
|
}
|
|
|
|
.select_item_des {
|
|
font-size: 1.3rem;
|
|
margin-left: 0.8rem;
|
|
}
|
|
}
|
|
}
|
|
.modal_component {
|
|
.skip_content {
|
|
width: 6rem;
|
|
height: 3rem;
|
|
line-height: 2.8rem;
|
|
border: 0.1rem solid #343579;
|
|
font-size: 1.4rem;
|
|
color: #343579;
|
|
position: absolute;
|
|
top: 1.8rem;
|
|
right: 1.8rem;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.bind_email_content {
|
|
padding: 4.8rem 9.2rem 6rem;
|
|
|
|
.bind_email_tip {
|
|
font-size: 1.8rem;
|
|
color: #a5b0c2;
|
|
line-height: 1.9rem;
|
|
text-align: center;
|
|
}
|
|
.bind_email {
|
|
margin-top: 2rem;
|
|
font-size: 2.2rem;
|
|
font-weight: 400;
|
|
color: #030303;
|
|
text-align: center;
|
|
}
|
|
|
|
.bind_email_form_content {
|
|
.bind_email_form_title {
|
|
font-size: 2.2rem;
|
|
font-weight: bold;
|
|
color: #030303;
|
|
line-height: 2.4rem;
|
|
}
|
|
|
|
.bind_email_form_input {
|
|
width: 100%;
|
|
height: 4.6rem;
|
|
margin-top: 1rem;
|
|
border: 0.1rem solid #b4bed7;
|
|
padding-left: 2.1rem;
|
|
line-height: 4.6rem;
|
|
font-size: 1.8rem;
|
|
box-sizing: border-box;
|
|
|
|
&::placeholder {
|
|
color: #a5b0c2;
|
|
}
|
|
}
|
|
}
|
|
|
|
.bind_email_submit_button {
|
|
height: 4.6rem;
|
|
line-height: 4.6rem;
|
|
background: #343579;
|
|
font-size: 1.6rem;
|
|
font-weight: 500;
|
|
color: #ffffff;
|
|
width: 12.8rem;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
margin: 3rem auto 0;
|
|
}
|
|
|
|
.icon--shangyibu {
|
|
font-size: 2.5rem;
|
|
font-weight: bold;
|
|
color: #030303;
|
|
}
|
|
|
|
.email_last_step_content {
|
|
margin-left: 1rem;
|
|
font-size: 2.2rem;
|
|
font-family: PingFang SC;
|
|
font-weight: bold;
|
|
color: #030303;
|
|
}
|
|
|
|
.tip_content {
|
|
font-size: 1.3rem;
|
|
font-weight: bold;
|
|
color: #343579;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.email_last_step_des {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-top: 2.5rem;
|
|
margin-bottom: 1.5rem;
|
|
|
|
.sent_email_content {
|
|
font-size: 1.8rem;
|
|
font-weight: bold;
|
|
color: #a5b0c2;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|