Files
m2pool_web_frontend/mining-pool/src/components/MoveHead.vue
yaoqin 915fc3d7a6 1.添加alph币种(矿池分配及转账规则页面、费率页面、挖矿教程页面、起付额度限制、最新报块跳转、支付id跳转) 完成
2.api文档页面修改8个接口请求方式为post
3.优化代码币种添加通用币种信息及挖矿教程页面跳转通用
4.m2pool断网重连 60秒内重连  处理中
5.收益计算器显示值修改  取消四舍五入 直接保留10位小数 添加千位符分隔显示
6.coinbus 添加seo相关配置及站点地图 处理中
2025-04-11 10:31:26 +08:00

684 lines
17 KiB
Vue

<template>
<div class="MoveMain">
<header class="headerMove">
<img
@click="handelJump(`/`)"
src="../assets/mobile/login/LOGO.svg"
alt="logo"
/>
<!-- 页面名称 -->
<span style="font-size: 0.9rem">{{ $t(key) }}</span>
<!-- 菜单 -->
<el-dropdown trigger="click" :hide-on-click="false">
<span
class="el-dropdown-link"
style="font-size: 0.9rem; color: rgba(0, 0, 0, 1)"
>
<img src="../assets/mobile/login/menu.svg" alt="menu" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)">
<div class="menuItem" @click="handelJump(`/`)">
<img src="../assets/mobile/home/homeMenu.svg" alt="home" />
<span> {{ $t(`home.home`) }}</span>
</div>
</el-dropdown-item>
<!-- 最新报块 -->
<el-dropdown-item
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
@click.native="handelJump(`/reportBlock`)"
>
<div class="menuItem">
<img
src="../assets/mobile/home/reportBlock.svg"
alt="reportBlock"
/>
<span> {{ $t(`home.reportBlock`) }}</span>
</div>
</el-dropdown-item>
<el-dropdown-item style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)">
<el-collapse v-model="activeNames">
<el-collapse-item name="1">
<!-- 挖矿账户 -->
<template slot="title">
<div class="menuItem2">
<img src="../assets/mobile/home/mining.svg" alt="account" />
<span>{{ $t(`home.accountCenter`) }}</span>
</div>
</template>
<div
class="accountBox"
@click="handelJumpAccount(item)"
v-for="item in newMiningAccountList"
:key="item.id"
>
<div class="coinBox">
<img :src="item.img" alt="coin" />
<span class="coin">{{ item.coin }}</span>
</div>
<span class="account">{{ item.account }}</span>
</div>
</el-collapse-item>
</el-collapse>
</el-dropdown-item>
<!-- 个人中心 -->
<el-dropdown-item
@click.native="handelJump(`/personalCenter`)"
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
>
<div class="menuItem">
<img
src="../assets/mobile/home/personal.svg"
alt="personalCenter"
/>
<span> {{ $t(`home.personalCenter`) }}</span>
</div>
</el-dropdown-item>
<!-- 工单记录 -->
<el-dropdown-item
@click.native="handelJump(`/workOrderRecords`)"
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
>
<div class="menuItem">
<img
src="../assets/mobile/home/workRecord.svg"
alt="workRecord"
/>
<span> {{ $t(`personal.workOrderRecord`) }}</span>
</div>
</el-dropdown-item>
<!-- 工单管理 -->
<el-dropdown-item
v-show="ManagementShow"
@click.native="handelJump(`/workOrderBackend`)"
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
>
<div class="menuItem">
<img
src="../assets/mobile/home/workAdministration.svg"
alt="Work Order Management"
/>
<span> {{ $t(`work.WorkOrderManagement`) }}</span>
</div>
</el-dropdown-item>
<el-dropdown-item
@click.native="handelSignOut"
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
>
<div class="menuItem">
<img src="../assets/mobile/home/lgout.svg" alt="sign out" />
<span> {{ $t(`user.signOut`) }}</span>
</div>
</el-dropdown-item>
<el-dropdown-item style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)">
<div class="langBox">
<el-radio
fill="red"
@input="handelRadio"
v-model="radio"
label="zh"
>简体中文</el-radio
>
<el-radio
fill="#fff"
@input="handelRadio"
v-model="radio"
label="en"
>English</el-radio
>
</div>
</el-dropdown-item>
<el-dropdown-item
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
v-show="!isLogin"
>
<div class="menuLogin">
<el-button class="lgBTH" @click="handelJump(`/login`)">{{
$t(`home.MLogin`)
}}</el-button>
<el-button class="reBTH" @click="handelJump(`/register`)">{{
$t(`home.MRegister`)
}}</el-button>
</div>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</header>
</div>
</template>
<script>
import { getLogout, getAccountGradeList } from "../api/login";
export default {
data() {
return {
radio: "en",
data: [
{
label: "一级 1",
children: [
{
label: "二级 1-1",
children: [
{
label: "三级 1-1-1",
},
],
},
],
},
{
label: "一级 2",
children: [
{
label: "二级 2-1",
children: [
{
label: "三级 2-1-1",
},
],
},
{
label: "二级 2-2",
children: [
{
label: "三级 2-2-1",
},
],
},
],
},
{
label: "一级 3",
children: [
{
label: "二级 3-1",
children: [
{
label: "三级 3-1-1",
},
],
},
{
label: "二级 3-2",
children: [
{
label: "三级 3-2-1",
},
],
},
],
},
],
defaultProps: {
children: "children",
label: "label",
},
currencyList: [],
miningAccountList: [],
newMiningAccountList: [],
activeNames: "",
titleList: [
{
path: "/",
label: "home.home",
},
{
path: "/reportBlock",
label: "home.reportBlock",
},
{
//挖矿账户
path: "/miningAccount",
label: "home.accountCenter",
},
{
//只读页面
path: "/readOnlyDisplay",
label: "personal.readOnlyPage",
},
{
//个人中心
path: "/personalCenter",
label: "home.personalCenter",
},
{
//挖矿账户设置
path: "/personalCenter/personalMining",
label: "home.accountSettings",
},
{
//只读页面
path: "/personalCenter/readOnly",
label: "personal.readOnlyPage",
},
{
//安全设置
path: "/personalCenter/securitySetting",
label: "personal.securitySetting",
},
{
//API
path: "/personalCenter/personalAPI",
label: "home.API",
},
],
token: "",
isLogin: false,
jurisdiction: {
roleKey: "",
},
ManagementShow: false,
};
},
computed: {
key() {
let obj = this.titleList.find((item) => item.path == this.$route.path);
if (obj) {
return obj.label;
} else {
return "";
}
},
},
watch: {
token: {
handler(val) {
if (val) {
this.isLogin = true;
} else {
this.isLogin = false;
}
},
immediate: true,
deep: true,
},
},
mounted() {
this.radio = localStorage.getItem("lang")
? localStorage.getItem("lang")
: "en";
this.currencyList = JSON.parse(localStorage.getItem("currencyList"));
let miningAccountList = localStorage.getItem("miningAccountList");
this.miningAccountList = JSON.parse(miningAccountList);
let valueTaking = localStorage.getItem("token");
this.token = JSON.parse(valueTaking);
let jurisdiction = localStorage.getItem("jurisdiction");
this.jurisdiction = JSON.parse(jurisdiction);
window.addEventListener("setItem", () => {
this.currencyList = JSON.parse(localStorage.getItem("currencyList"));
let miningAccountList = localStorage.getItem("miningAccountList");
this.miningAccountList = JSON.parse(miningAccountList);
let valueTaking = localStorage.getItem("token");
this.token = JSON.parse(valueTaking);
if (this.miningAccountList[0]) {
this.newMiningAccountList = this.flattenArray(this.miningAccountList);
}
let jurisdiction = localStorage.getItem("jurisdiction");
this.jurisdiction = JSON.parse(jurisdiction);
if (this.jurisdiction && this.jurisdiction.roleKey == `admin`) {
console.log(565656);
this.ManagementShow = true;
} else {
this.ManagementShow = false;
}
});
if (this.miningAccountList[0]) {
this.newMiningAccountList = this.flattenArray(this.miningAccountList);
}
if (this.jurisdiction && this.jurisdiction.roleKey == `admin`) {
this.ManagementShow = true;
} else {
this.ManagementShow = false;
}
},
methods: {
handelJump(url) {
console.log(url, "及附件");
try {
const lang = this.$i18n.locale;
// 移除开头的斜杠
const cleanPath = url.startsWith("/") ? url.slice(1) : url;
// 处理根路径特殊情况
const path = cleanPath === "" ? `/${lang}` : `/${lang}/${cleanPath}`;
this.$router.push(path).catch((err) => {
if (err.name !== "NavigationDuplicated") {
console.error("Navigation failed:", err);
}
});
} catch (error) {
console.error("Navigation error:", error);
}
},
toggleDropdown() {
this.showDropdown = !this.showDropdown;
},
handelRadio(val) {
const oldLang = this.$i18n.locale;
this.$i18n.locale = val;
localStorage.setItem("lang", val);
// 更新当前路径的语言部分
const currentPath = this.$route.path;
const newPath = currentPath.replace(`/${oldLang}`, `/${val}`);
const query = this.$route.query;
this.$router
.push({
path: newPath,
query: query,
})
.catch((err) => {
if (err.name !== "NavigationDuplicated") {
console.error("Navigation failed:", err);
}
});
},
selectItem(item) {
this.selectedItem = item;
this.showDropdown = false;
// 更新菜单项的高亮状态
this.menuItems.forEach((menuItem) => {
menuItem.isHighlighted = menuItem.text === item;
});
},
handelJumpAccount(item) {
const lang = this.$i18n.locale;
let obj = {
ma: item.account,
coin: item.coin,
id: item.id,
img: item.img,
};
this.$addStorageEvent(1, "accountItem", JSON.stringify(obj));
this.$router.push({
path: `/${lang}/miningAccount`,
query: { ma: item.account + item.coin },
});
},
async fetchSignOut() {
const lang = this.$i18n.locale;
const data = await getLogout();
if (data && data.code == 200) {
this.$router.push(`/${lang}/login`);
}
},
handelSignOut() {
this.fetchSignOut();
localStorage.removeItem(`token`);
localStorage.removeItem("username");
this.$addStorageEvent(1, `miningAccountList`, JSON.stringify(""));
this.isLogin = false;
this.isDropdownVisible = false;
},
//扁平化数组币种数组
flattenArray(arr) {
console.log(arr, "进来的数组");
if (arr[0]) {
return arr.reduce((flat, item) => {
return flat.concat(
item.children.map((child) => ({
...child,
coin: item.coin,
img: item.img,
title: item.title,
}))
);
}, []);
}
},
},
};
</script>
<style scoped lang="scss">
.MoveMain {
width: 100%;
height: 100%;
position: relative;
z-index: 9999;
}
.headerMove {
width: 100%;
min-height: 60px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0px 20px;
z-index: 999;
img {
width: 30px;
}
.title {
font-weight: 600;
}
.menu {
width: 15%;
height: 100%;
display: flex;
align-items: center;
justify-content: right;
}
}
.menuItem {
background: #d2c4e8;
// padding: 0% 8%;
padding-left: 5%;
border-radius: 5px;
margin-top: 20px;
display: flex;
align-items: center;
justify-content: left;
img {
width: 15px;
margin-right: 5px;
}
}
.menuItem2 {
background: #d2c4e8;
padding-left: 5%;
border-radius: 5px;
display: flex;
align-items: center;
img {
width: 15px;
margin-right: 5px;
}
}
.menuLogin {
display: flex;
margin-top: 10px;
justify-content: space-around;
margin-bottom: 20px;
}
.langBox {
width: 100%;
display: flex;
font-size: 0.6em;
margin-top: 18px;
justify-content: space-around;
}
::v-deep .el-collapse-item__content {
max-height: 300px;
overflow-y: auto;
}
.el-radio {
margin: 0 !important;
margin-left: 2px !important;
font-size: 0.6em !important;
}
.lgBTH {
background: #651efe;
color: #fff;
padding: 8px 23px;
}
.reBTH {
padding: 8px 23px;
color: #fff;
background: #ff4181;
}
::v-deep.el-dropdown-menu {
left: 40% !important;
top: 48px !important;
padding-bottom: 30px;
}
.el-popper[x-placement^="bottom"] {
min-width: 60% !important;
}
::v-deep .el-collapse-item__header {
border: none !important;
height: 36px !important;
line-height: 36px !important;
background: #d2c4e8 !important;
margin-top: 20px;
border-radius: 5px;
}
::v-deep.el-dropdown-menu__item:focus,
.el-dropdown-menu__item:not(.is-disabled):hover {
padding: 0;
}
::v-deep.el-collapse {
border: none !important;
}
::v-deep .el-collapse-item__wrap {
border: none !important;
}
.currencyBox {
margin: 0;
padding: 0;
width: 88%;
display: flex;
min-height: 200px;
flex-wrap: wrap;
padding: 10px 20px;
margin: 0 auto;
li {
list-style: none;
// width: calc(100% / 5);
display: flex;
flex-direction: column;
align-items: center !important;
margin-left: 10px;
// background: #D2C4E8;
// align-items: center;
// overflow: hidden;
padding: 5px 5px;
box-sizing: border-box;
// background: palegoldenrod;
img {
width: 25px;
}
p {
min-width: 50px;
margin-top: 8px;
font-size: 0.85rem;
word-wrap: break-word;
word-break: break-all;
text-align: center;
text-transform: capitalize;
}
}
}
.accountBox {
display: flex;
align-items: center;
padding: 8px 12px;
font-size: 0.8rem;
justify-content: space-between;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
.coinBox {
display: flex;
align-items: center;
img {
width: 20px;
}
.coin {
margin-left: 5px;
}
}
.coin {
text-transform: capitalize;
}
}
.el-menu--horizontal > .el-submenu .el-submenu__title {
color: #000;
}
.el-menu--horizontal {
background: transparent;
}
.el-submenu:hover {
background-color: transparent !important; /* 例如,更改背景颜色 */
}
.el-submenu.is-active:after {
border-bottom: none !important;
border-bottom-color: transparent !important;
border: none !important;
outline: none !important;
background: transparent;
}
</style>
<style lang="scss">
.el-submenu__title:hover {
background-color: transparent !important;
background: transparent !important;
color: #6e3edb !important;
}
.el-menu-item.is-active:not(.is-index) {
border-bottom: none !important;
}
.el-submenu__title {
border: none !important;
border-bottom: none !important;
border-bottom-color: transparent !important;
}
.el-submenu.is-active {
border: none !important;
border-bottom: none !important;
border-bottom-color: transparent !important;
}
.el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
border-bottom: 0px !important;
}
.el-submenu.is-active .el-submenu__title {
border-bottom-color: transparent !important;
}
.el-menu.el-menu--horizontal {
border-bottom: 0px !important;
}
.el-dropdown-menu__item,
.el-menu-item {
padding: 0px 10px !important;
}
</style>