Compare commits
3 Commits
Author | SHA1 | Date |
---|---|---|
|
c6f765f858 | |
|
62260e8483 | |
|
2111eedabb |
mining-pool
.env.development.env.stagingdist.zip
src
test.ziptest
css
app-113c6c50.1696c00b.cssapp-113c6c50.1696c00b.css.gzapp-113c6c50.5229e45e.cssapp-113c6c50.5229e45e.css.gzapp-113c6c50.59d737ac.cssapp-113c6c50.59d737ac.css.gzapp-189e7968.9dadb641.cssapp-189e7968.9dadb641.css.gzapp-189e7968.abee2a01.cssapp-189e7968.abee2a01.css.gzapp-189e7968.dab6fbf8.cssapp-189e7968.dab6fbf8.css.gzapp-45954fd3.605105ff.cssapp-45954fd3.605105ff.css.gzapp-45954fd3.86c0fd20.cssapp-45954fd3.86c0fd20.css.gzapp-45954fd3.ebaa14f6.cssapp-45954fd3.ebaa14f6.css.gzapp-7023e5b0.87f1eef9.cssapp-7023e5b0.87f1eef9.css.gzapp-72600b29.6fce1895.cssapp-72600b29.6fce1895.css.gzapp-72600b29.8bee31b9.cssapp-72600b29.8bee31b9.css.gzapp-b4c4f6ec.6e507abe.cssapp-b4c4f6ec.6e507abe.css.gzapp-b4c4f6ec.b7a26d39.cssapp-b4c4f6ec.b7a26d39.css.gz
index.htmljs
app-113c6c50.3dff300c.jsapp-113c6c50.3dff300c.js.gzapp-113c6c50.6af405db.jsapp-113c6c50.6af405db.js.gzapp-113c6c50.bce0e5a7.jsapp-113c6c50.bce0e5a7.js.gzapp-42f9d7e6.2598fd7a.jsapp-42f9d7e6.2598fd7a.js.gzapp-42f9d7e6.7d4ad37d.jsapp-42f9d7e6.7d4ad37d.js.gzapp-42f9d7e6.d6c55a75.jsapp-42f9d7e6.d6c55a75.js.gzapp-45954fd3.470dc9c3.jsapp-45954fd3.470dc9c3.js.gzapp-45954fd3.508cc9ca.jsapp-45954fd3.508cc9ca.js.gzapp-45954fd3.53c0df94.jsapp-45954fd3.53c0df94.js.gzapp-5c551db8.89b85533.jsapp-5c551db8.89b85533.js.gzapp-5c551db8.89dc18d2.jsapp-5c551db8.89dc18d2.js.gzapp-5c551db8.baf3658a.jsapp-5c551db8.baf3658a.js.gzapp-7023e5b0.a956a90d.jsapp-7023e5b0.a956a90d.js.gzapp-72600b29.3e7e0df2.jsapp-72600b29.3e7e0df2.js.gzapp-72600b29.7a20ccca.jsapp-72600b29.7a20ccca.js.gzapp-72600b29.ee6f16e3.jsapp-72600b29.ee6f16e3.js.gzapp-b4c4f6ec.699d67bf.jsapp-b4c4f6ec.699d67bf.js.gz
|
@ -6,7 +6,7 @@ ENV = 'development'
|
||||||
|
|
||||||
#开发环境
|
#开发环境
|
||||||
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
||||||
# VUE_APP_BASE_API = 'http://10.168.2.150:8101/'
|
# VUE_APP_BASE_API = 'http://18.183.240.108:8080/api/'
|
||||||
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
||||||
# 路由懒加载
|
# 路由懒加载
|
||||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
||||||
|
|
|
@ -7,6 +7,7 @@ NODE_ENV = production
|
||||||
ENV = 'staging'
|
ENV = 'staging'
|
||||||
|
|
||||||
# 测试环境
|
# 测试环境
|
||||||
|
# VUE_APP_BASE_API = 'http://18.183.240.108:8080/api/'
|
||||||
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
VUE_APP_BASE_API = 'https://test.m2pool.com/api/'
|
||||||
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
VUE_APP_BASE_URL = 'https://test.m2pool.com/'
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -1,58 +1,98 @@
|
||||||
<template>
|
<template>
|
||||||
<div id="app">
|
<div id="app">
|
||||||
<router-view class="page" />
|
<router-view class="page" />
|
||||||
<ChatWidget v-if="!$route.path.includes('/customerService') && !$isMobile" />
|
<ChatWidget v-if="!$route.path.includes('/customerService') && !$isMobile && jurisdiction.roleKey !== 'back_admin'" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script >
|
<script >
|
||||||
import ChatWidget from '../src/components/ChatWidget.vue';
|
import ChatWidget from "../src/components/ChatWidget.vue";
|
||||||
import { Debounce, throttle } from '@/utils/publicMethods';
|
import { Debounce, throttle } from "@/utils/publicMethods";
|
||||||
import Vue from 'vue'
|
import Vue from "vue";
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: "App",
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
ChatWidget
|
ChatWidget,
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
flag: false,
|
flag: false,
|
||||||
isMobile: false,
|
isMobile: false,
|
||||||
|
jurisdiction: {
|
||||||
|
roleKey: "",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
window.addEventListener("resize", Debounce(this.updateWindowWidth, 10));
|
window.addEventListener("resize", Debounce(this.updateWindowWidth, 10));
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction ? JSON.parse(jurisdiction) : { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction
|
||||||
|
? JSON.parse(jurisdiction)
|
||||||
|
: { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction ? JSON.parse(jurisdiction) : { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction
|
||||||
|
? JSON.parse(jurisdiction)
|
||||||
|
: { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
window.removeEventListener("resize", this.updateWindowWidth); // 移除监听器
|
window.removeEventListener("resize", this.updateWindowWidth); // 移除监听器
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
updateWindowWidth() {
|
updateWindowWidth() {
|
||||||
console.log(window.innerWidth ||
|
console.log(
|
||||||
|
window.innerWidth ||
|
||||||
document.documentElement.clientWidth ||
|
document.documentElement.clientWidth ||
|
||||||
document.body.clientWidth)
|
document.body.clientWidth
|
||||||
|
);
|
||||||
//取到了屏幕宽度
|
//取到了屏幕宽度
|
||||||
|
|
||||||
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
const screenWidth =
|
||||||
|
window.innerWidth ||
|
||||||
|
document.documentElement.clientWidth ||
|
||||||
|
document.body.clientWidth;
|
||||||
const isNarrowScreen = screenWidth < 1280;
|
const isNarrowScreen = screenWidth < 1280;
|
||||||
Vue.prototype.$isMobile = isNarrowScreen
|
Vue.prototype.$isMobile = isNarrowScreen;
|
||||||
location.reload();
|
location.reload();
|
||||||
|
},
|
||||||
}
|
},
|
||||||
|
};
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--background-color: #ffffff;
|
--background-color: #ffffff;
|
||||||
--text-color: #000000;
|
--text-color: #000000;
|
||||||
|
@ -67,16 +107,14 @@ import Vue from 'vue'
|
||||||
padding: 0;
|
padding: 0;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
html,body{
|
html,
|
||||||
|
body {
|
||||||
//隐藏滚动条
|
//隐藏滚动条
|
||||||
scrollbar-width: none;
|
scrollbar-width: none;
|
||||||
-ms-overflow-style: none;
|
-ms-overflow-style: none;
|
||||||
border-right: none;
|
border-right: none;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#app {
|
#app {
|
||||||
// font-family: Avenir, Helvetica, Arial, sans-serif;
|
// font-family: Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
@ -90,16 +128,14 @@ html,body{
|
||||||
/* 滚动条整体部分 */
|
/* 滚动条整体部分 */
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
::-webkit-scrollbar {
|
::-webkit-scrollbar {
|
||||||
width: 5PX; /* 宽度 */
|
width: 5px; /* 宽度 */
|
||||||
height: 6px; /* 高度 */
|
height: 6px; /* 高度 */
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 滚动条滑块 */
|
/* 滚动条滑块 */
|
||||||
::-webkit-scrollbar-thumb {
|
::-webkit-scrollbar-thumb {
|
||||||
background-color: #D2C3E9; /* 滑块颜色 */
|
background-color: #d2c3e9; /* 滑块颜色 */
|
||||||
border-radius: 20PX; /* 圆角 */
|
border-radius: 20px; /* 圆角 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 滚动条轨道 */
|
/* 滚动条轨道 */
|
||||||
|
@ -115,15 +151,12 @@ input::-webkit-inner-spin-button {
|
||||||
input[type="number"] {
|
input[type="number"] {
|
||||||
-moz-appearance: textfield;
|
-moz-appearance: textfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.el-message {
|
||||||
.el-message{ //提示信息的层级设置
|
//提示信息的层级设置
|
||||||
|
|
||||||
z-index: 99999 !important;
|
z-index: 99999 !important;
|
||||||
min-width: 300px !important;
|
min-width: 300px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
import request from '../utils/request'
|
||||||
|
|
||||||
|
//用于获取m2pool广播数据 主页循环播放
|
||||||
|
export function getBroadcast(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/find/data/by/id`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//新增广播
|
||||||
|
export function getAddBroadcast(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/add`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//删除广播
|
||||||
|
export function DeleteBroadcast(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/delete`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//分页查询所有广播信息
|
||||||
|
export function listBroadcast(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/get/list/by/page`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//修改广播内容
|
||||||
|
export function updateBroadcast(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/update`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//修改查看通知详情
|
||||||
|
export function dataInfo(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/broadcast/find/data/info`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
import request from '../utils/request'
|
||||||
|
|
||||||
|
//根据条件 查询注册用户列表
|
||||||
|
export function getUserList(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/user/list/info`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//发送邮件给用户
|
||||||
|
export function sendMail(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/user/send/text/mail/message`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//获取单个用户详情
|
||||||
|
export function getUserDetails(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/user/get/user/info`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//用户详情曲线图
|
||||||
|
export function getUserLineChart(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/user/getMiningPowerInfo`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//用户离线柱状图
|
||||||
|
export function getUserOnlineStatus(data) {
|
||||||
|
return request({
|
||||||
|
url: `manage/user/getMinerUserOnlineStatus`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,275 @@
|
||||||
|
<template>
|
||||||
|
<el-container class="back-admin-layout" style="height: 100vh">
|
||||||
|
<!-- 顶部导航栏 -->
|
||||||
|
<el-header height="10vh" class="admin-header">
|
||||||
|
<div class="logo">
|
||||||
|
<img src="@/assets/img/logo.png" alt="logo" class="logo-img" />
|
||||||
|
<div class="logo-title">
|
||||||
|
<div>{{ $t("backendSystem.title") }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="admin-header-right">
|
||||||
|
<el-dropdown>
|
||||||
|
<span
|
||||||
|
class="el-dropdown-link"
|
||||||
|
style="font-size: 0.9rem; color: rgba(0, 0, 0, 1)"
|
||||||
|
>
|
||||||
|
<img style="width: 20px" src="../assets/img/lang.svg" alt="lang" />
|
||||||
|
<i class="el-icon-caret-bottom el-icon--right"></i>
|
||||||
|
</span>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item
|
||||||
|
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
|
||||||
|
@click.native="handelLang(`zh`)"
|
||||||
|
>简体中文</el-dropdown-item
|
||||||
|
>
|
||||||
|
<el-dropdown-item
|
||||||
|
style="font-size: 0.8rem; color: rgba(0, 0, 0, 1)"
|
||||||
|
@click.native="handelLang(`en`)"
|
||||||
|
>English</el-dropdown-item
|
||||||
|
>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
<el-dropdown>
|
||||||
|
<span class="el-dropdown-link"
|
||||||
|
>{{ userEmail }}<i class="el-icon-arrow-down el-icon--right"></i
|
||||||
|
></span>
|
||||||
|
<el-dropdown-menu slot="dropdown">
|
||||||
|
<el-dropdown-item @click.native="handelSignOut"
|
||||||
|
index="999999">{{
|
||||||
|
$t("backendSystem.logout")
|
||||||
|
}}</el-dropdown-item>
|
||||||
|
</el-dropdown-menu>
|
||||||
|
</el-dropdown>
|
||||||
|
</div>
|
||||||
|
</el-header>
|
||||||
|
|
||||||
|
<el-container>
|
||||||
|
<!-- 侧边栏 -->
|
||||||
|
<comAside></comAside>
|
||||||
|
|
||||||
|
<!-- 主体内容 -->
|
||||||
|
<el-main class="admin-main">
|
||||||
|
|
||||||
|
<router-view v-if="key !== '/zh' && key !== '/en' &&key !== '/zh/login' && key !== '/en/login' && key !== '/zh/register' && key !== '/en/register'" :key="key" />
|
||||||
|
<div v-else style="color: #333;font-size: 16px;text-align: center;line-height: 100vh;">
|
||||||
|
{{ $t("backendSystem.leftNavigation") }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</el-main>
|
||||||
|
</el-container>
|
||||||
|
</el-container>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getLogout } from "../api/login";
|
||||||
|
export default {
|
||||||
|
computed: {
|
||||||
|
key() {
|
||||||
|
return this.$route.path;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
components: {
|
||||||
|
comAside: () => import("./comAside.vue"),
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
filters: {
|
||||||
|
emailOrOrderNo: "",
|
||||||
|
status: "",
|
||||||
|
minAmount: null,
|
||||||
|
maxAmount: null,
|
||||||
|
dateRange: [],
|
||||||
|
},
|
||||||
|
activeTab: "all",
|
||||||
|
tableData: [
|
||||||
|
// 示例数据
|
||||||
|
{
|
||||||
|
index: 1,
|
||||||
|
email: "user@example.com",
|
||||||
|
orderNo: "20230601001",
|
||||||
|
type: "技术支持",
|
||||||
|
machineCode: "K9-001",
|
||||||
|
createTime: "2023-06-01",
|
||||||
|
fault: "无法启动",
|
||||||
|
status: "处理中",
|
||||||
|
amount: 844.01,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
totalAmount: 844.01,
|
||||||
|
userEmail: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
|
try {
|
||||||
|
userEmail = userEmail ? JSON.parse(userEmail) : "";
|
||||||
|
} catch (e) {
|
||||||
|
userEmail = "";
|
||||||
|
}
|
||||||
|
this.userEmail = userEmail;
|
||||||
|
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
|
try {
|
||||||
|
userEmail = userEmail ? JSON.parse(userEmail) : "";
|
||||||
|
} catch (e) {
|
||||||
|
userEmail = "";
|
||||||
|
}
|
||||||
|
this.userEmail = userEmail;
|
||||||
|
});
|
||||||
|
|
||||||
|
//网络变化
|
||||||
|
window.addEventListener("online", this.handleNetworkChange);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async fetchSignOut() {
|
||||||
|
const data = await getLogout();
|
||||||
|
if (data && data.code == 200) {
|
||||||
|
|
||||||
|
// 调用 Vuex 的 logout action 清除前端状态
|
||||||
|
await this.$store.dispatch('logout')
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handelSignOut() {
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
this.$router.push(`/${lang}/login`);
|
||||||
|
localStorage.removeItem(`token`);
|
||||||
|
localStorage.removeItem("username");
|
||||||
|
localStorage.removeItem("jurisdiction");
|
||||||
|
this.$addStorageEvent(1, `miningAccountList`, JSON.stringify(""));
|
||||||
|
this.fetchSignOut();
|
||||||
|
|
||||||
|
},
|
||||||
|
handelLang(lang) {
|
||||||
|
try {
|
||||||
|
const currentPath = this.$route.path;
|
||||||
|
const oldLang = this.$i18n.locale;
|
||||||
|
const currentQuery = this.$route.query; // 获取当前的查询参数
|
||||||
|
|
||||||
|
// 检查是否是支持的语言
|
||||||
|
if (!["zh", "en"].includes(lang)) {
|
||||||
|
throw new Error("Unsupported language");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新语言设置
|
||||||
|
this.$i18n.locale = lang;
|
||||||
|
localStorage.setItem("lang", lang || "en");
|
||||||
|
|
||||||
|
// 构造新的路由配置
|
||||||
|
const newPath = currentPath.replace(`/${oldLang}`, `/${lang}`);
|
||||||
|
|
||||||
|
// 保持原有查询参数
|
||||||
|
this.$router
|
||||||
|
.push({
|
||||||
|
path: newPath,
|
||||||
|
query: currentQuery, // 保留原有的查询参数
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
if (err.name !== "NavigationDuplicated") {
|
||||||
|
console.error("路由更新失败:", err);
|
||||||
|
this.$message.error(this.$t("common.langChangeFailed"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 更新HTML的lang属性
|
||||||
|
document.documentElement.lang = lang;
|
||||||
|
} catch (error) {
|
||||||
|
console.error("语言切换失败:", error);
|
||||||
|
this.$message.error(this.$t("common.langChangeFailed"));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 处理网络状态变化
|
||||||
|
handleNetworkChange() {
|
||||||
|
|
||||||
|
if (navigator.onLine) {
|
||||||
|
// === 强制重置状态,兜底 ===
|
||||||
|
location.reload(); // 重新加载当前页面
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
window.removeEventListener("online", this.handleNetworkChange);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
*{
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.back-admin-layout {
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
background: #f5f6fa;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.admin-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
height: 15vh;
|
||||||
|
background: #fff;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding: 0 32px;
|
||||||
|
}
|
||||||
|
.logo {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.logo-img {
|
||||||
|
width: 6vw;
|
||||||
|
height: auto;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
.logo-title {
|
||||||
|
font-size: 1vw;
|
||||||
|
font-weight: bold;
|
||||||
|
color: rgba(0, 0, 0, 0.6);
|
||||||
|
}
|
||||||
|
.logo-sub {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
.admin-header-right {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 24px;
|
||||||
|
}
|
||||||
|
.lang {
|
||||||
|
color: #333;
|
||||||
|
font-size: 14px;
|
||||||
|
margin-left: 16px;
|
||||||
|
}
|
||||||
|
.admin-main {
|
||||||
|
background: #fff;
|
||||||
|
margin: 24px;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 30px;
|
||||||
|
min-width: 0;
|
||||||
|
min-height: 0;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
/* background: palegoldenrod; */
|
||||||
|
height: 84vh ;
|
||||||
|
overflow: hidden;
|
||||||
|
/* overflow-y: auto; */
|
||||||
|
|
||||||
|
}
|
||||||
|
.main-title {
|
||||||
|
font-size: 22px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.main-filters {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------侧边栏----- */
|
||||||
|
</style>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,111 @@
|
||||||
|
<template>
|
||||||
|
<el-aside
|
||||||
|
style="height: 100vh; background: #202940;width: 280px;padding: 0;"
|
||||||
|
class="admin-sidebar"
|
||||||
|
>
|
||||||
|
<el-menu
|
||||||
|
style="border: none;width: 280px;"
|
||||||
|
:default-active="activeIndex"
|
||||||
|
class="el-menu-vertical-demo"
|
||||||
|
background-color="#202940"
|
||||||
|
text-color="#fff"
|
||||||
|
active-text-color="#ffd04b"
|
||||||
|
>
|
||||||
|
<div v-for="item in menuList" :key="item.id">
|
||||||
|
|
||||||
|
<el-menu-item @click="handleClick(item)" v-show="!item.children" :index="item.id" style="padding-left: 20px !important;">
|
||||||
|
<i :class="item.icon"></i>
|
||||||
|
<span slot="title">{{ $t(item.label)}}</span>
|
||||||
|
</el-menu-item>
|
||||||
|
|
||||||
|
|
||||||
|
<el-submenu :index="item.id" v-if="item.children" >
|
||||||
|
<template slot="title">
|
||||||
|
<i :class="item.icon"></i>
|
||||||
|
<span>{{$t(item.label)}}</span>
|
||||||
|
</template>
|
||||||
|
<el-menu-item @click="handleClick(child)" v-for="child in item.children" :key="child.id" :index="child.id" style="padding-left: 40px !important;">
|
||||||
|
<i :class="child.icon"></i>
|
||||||
|
<span slot="title">{{$t(child.label)}}</span>
|
||||||
|
</el-menu-item>
|
||||||
|
</el-submenu>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</el-menu>
|
||||||
|
</el-aside>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
menuList:[
|
||||||
|
{//广播
|
||||||
|
path:"broadcast",
|
||||||
|
label:`backendSystem.broadcast`,
|
||||||
|
icon:"el-icon-bell",
|
||||||
|
id:"1",
|
||||||
|
|
||||||
|
},
|
||||||
|
{//用户管理
|
||||||
|
path:"userManagement",
|
||||||
|
label:`backendSystem.userManagement`,
|
||||||
|
icon:"el-icon-user",
|
||||||
|
id:"2",
|
||||||
|
|
||||||
|
},
|
||||||
|
{//工单管理
|
||||||
|
path:"workOrderBackend",
|
||||||
|
label:`backendSystem.workOrder`,
|
||||||
|
icon:"el-icon-document-copy",
|
||||||
|
id:"3",
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
],
|
||||||
|
activeIndex: "0",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
const currentPath = this.$route.path.replace(`/${lang}/`, '');
|
||||||
|
// 优先根据当前路由匹配菜单项
|
||||||
|
const matchedMenu = this.menuList.find(item => item.path === currentPath);
|
||||||
|
if (matchedMenu) {
|
||||||
|
this.activeIndex = matchedMenu.id;
|
||||||
|
this.$addStorageEvent(1, "activeIndex", matchedMenu.id);
|
||||||
|
} else {
|
||||||
|
// 如果localStorage有值,优先用localStorage
|
||||||
|
const savedIndex = localStorage.getItem("activeIndex");
|
||||||
|
if(savedIndex){
|
||||||
|
this.activeIndex = savedIndex;
|
||||||
|
} else {
|
||||||
|
this.$addStorageEvent(1, "activeIndex", this.activeIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods:{
|
||||||
|
handleClick(item){
|
||||||
|
console.log(item,'item');
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
this.$router.push(`/${lang}/${item.path}`);
|
||||||
|
this.activeIndex = item.id;
|
||||||
|
this.$addStorageEvent(1, "activeIndex", item.id);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
beforeDestroy(){
|
||||||
|
localStorage.removeItem("activeIndex");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
|
||||||
|
.el-submenu .el-menu-item{
|
||||||
|
padding-left: 40px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
|
@ -175,8 +175,8 @@
|
||||||
<span class="line"></span>
|
<span class="line"></span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
<!-- 工单管理 -->
|
||||||
<li
|
<!-- <li
|
||||||
v-show="ManagementShow"
|
v-show="ManagementShow"
|
||||||
class="personalCenter"
|
class="personalCenter"
|
||||||
:class="{
|
:class="{
|
||||||
|
@ -193,7 +193,7 @@
|
||||||
<span class="circular"></span>
|
<span class="circular"></span>
|
||||||
<span class="line"></span>
|
<span class="line"></span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li> -->
|
||||||
|
|
||||||
<li class="langBox">
|
<li class="langBox">
|
||||||
<div class="LangLine"></div>
|
<div class="LangLine"></div>
|
||||||
|
|
|
@ -45,7 +45,7 @@ export const ChatWidget_zh = {
|
||||||
readImage:"读取图片失败,请重试",
|
readImage:"读取图片失败,请重试",
|
||||||
processingFailed:"图片处理失败,请重试",
|
processingFailed:"图片处理失败,请重试",
|
||||||
Disconnected:"连接已断开",
|
Disconnected:"连接已断开",
|
||||||
reconnecting:"正在重连...",
|
reconnecting:"正在连接...",
|
||||||
contactList:"联系列表",
|
contactList:"联系列表",
|
||||||
search:"搜索最近联系人",
|
search:"搜索最近联系人",
|
||||||
tourist:"游客",
|
tourist:"游客",
|
||||||
|
@ -107,6 +107,7 @@ export const ChatWidget_zh = {
|
||||||
serviceAddressUnavailable:"服务地址不可用,请稍后重试",
|
serviceAddressUnavailable:"服务地址不可用,请稍后重试",
|
||||||
connectionFailedService:"无法连接到服务器,请稍后重试",
|
connectionFailedService:"无法连接到服务器,请稍后重试",
|
||||||
connectionFailedCustomer:"连接客服系统失败,请检查网络或稍后重试",
|
connectionFailedCustomer:"连接客服系统失败,请检查网络或稍后重试",
|
||||||
|
logoutSyncNotice:"检测到您已在其他窗口退出登录,当前窗口将自动跳转",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,7 +141,7 @@ export const ChatWidget_en = {
|
||||||
subscriptionFailed: "Message subscription failed",
|
subscriptionFailed: "Message subscription failed",
|
||||||
break: "Connection lost",
|
break: "Connection lost",
|
||||||
retry: "Retry in seconds",
|
retry: "Retry in seconds",
|
||||||
disconnectWaiting: "Reconnecting...",
|
disconnectWaiting: "connecting...",
|
||||||
sendFailed: "Send failed, please retry",
|
sendFailed: "Send failed, please retry",
|
||||||
noHistory: "No history",
|
noHistory: "No history",
|
||||||
historicalFailure: "Failed to load history",
|
historicalFailure: "Failed to load history",
|
||||||
|
|
|
@ -0,0 +1,175 @@
|
||||||
|
export const backendSystem_zh = {
|
||||||
|
backendSystem: {
|
||||||
|
title: "后台管理系统",
|
||||||
|
broadcast: "广播",
|
||||||
|
userManagement: "用户管理",
|
||||||
|
workOrder: "工单管理",
|
||||||
|
workOrderRecord: "工单记录",
|
||||||
|
userComputingPower: "用户算力",
|
||||||
|
addBroadcast: "新增广播",
|
||||||
|
editBroadcast: "修 改",
|
||||||
|
publishedBroadcast: "已发布广播",
|
||||||
|
createTime: "创建时间",
|
||||||
|
content: "内容",
|
||||||
|
createUser: "创建人",
|
||||||
|
updateTime: "修改时间",
|
||||||
|
updateUser: "修改人",
|
||||||
|
operation: "操作",
|
||||||
|
edit: "编辑",
|
||||||
|
exceedingInput:"超出输入最大限制",
|
||||||
|
deleteRemind:"确定删除该广播吗?",
|
||||||
|
deleteSuccess:"删除成功",
|
||||||
|
editSuccess:"修改成功",
|
||||||
|
addSuccess:"发布成功",
|
||||||
|
cancel:"取 消",
|
||||||
|
publish:"发 布",
|
||||||
|
logout:"退出",
|
||||||
|
editContent:"修改广播内容",
|
||||||
|
dialogTitle:"新增广播内容",
|
||||||
|
pleaseInputContent:"请输入广播内容",
|
||||||
|
newlineInvalid:"广播内容输入换行符无效",
|
||||||
|
onlineUserNum:"在线数量",
|
||||||
|
offlineUserNum:"离线数量",
|
||||||
|
userPower:"用户算力",
|
||||||
|
chartTitle:"用户算力及在离线状态图",
|
||||||
|
noData:"无数据",
|
||||||
|
startDate:"开始日期",
|
||||||
|
endDate:"结束日期",
|
||||||
|
to:"至",
|
||||||
|
userDetails:"用户详情",
|
||||||
|
return:"返回",
|
||||||
|
coin:"币种:",
|
||||||
|
user:"挖矿账户:",
|
||||||
|
amount:"交易金额:",
|
||||||
|
createDate:"收益分配日期",
|
||||||
|
maxHeight:"最大高度",
|
||||||
|
shouldOutDate:"实际转账日期",
|
||||||
|
address:"转账地址",
|
||||||
|
historyAddress:"历史支付地址:",
|
||||||
|
|
||||||
|
userManagementTitle:"注册用户管理",
|
||||||
|
pleaseInput:"请输入",
|
||||||
|
email:"邮箱:",
|
||||||
|
email2:"邮箱",
|
||||||
|
query:"查询",
|
||||||
|
coin2:"币种",
|
||||||
|
amount2:"最小起付金额",
|
||||||
|
status2:"用户状态",
|
||||||
|
minerUser2:"挖矿账号",
|
||||||
|
balance2:"支付地址",
|
||||||
|
active2:"是否自动提现",
|
||||||
|
normal:"正常",
|
||||||
|
delete:"删除",
|
||||||
|
yes:"是",
|
||||||
|
no:"否",
|
||||||
|
Details:"详情",
|
||||||
|
sendEmail:"发送邮件",
|
||||||
|
sendSuccess:"发送成功",
|
||||||
|
sendFail:"发送失败",
|
||||||
|
sendRemind:"确定发送邮件吗?",
|
||||||
|
recipient:"收件人",
|
||||||
|
subject:"邮件主题",
|
||||||
|
text:"邮件内容",
|
||||||
|
send:"发送",
|
||||||
|
emailRemind:"可输入多个邮箱,用逗号隔开",
|
||||||
|
|
||||||
|
pleaseInputCorrectEmail:"请输入正确的邮箱地址",
|
||||||
|
pleaseInputSubject:"请输入邮件主题",
|
||||||
|
pleaseInputText:"请输入邮件内容",
|
||||||
|
pleaseInputCorrectEmail2:"请输入正确的邮箱地址,多个邮箱用逗号分隔",
|
||||||
|
existDuplicateEmail:"存在重复邮箱,请检查",
|
||||||
|
pleaseInputQueryConditions:"请输入查询条件(挖矿账号、邮箱)",
|
||||||
|
emailContent:"邮件内容",
|
||||||
|
leftNavigation:"选择左侧导航栏查看页面",
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const backendSystem_en = {
|
||||||
|
backendSystem: {
|
||||||
|
title: "Backend System",
|
||||||
|
broadcast: "Broadcast",
|
||||||
|
userManagement: "User Management",
|
||||||
|
workOrder: "Work Order Management",
|
||||||
|
workOrderRecord: "Work Order Record",
|
||||||
|
userComputingPower: "User Computing Power",
|
||||||
|
addBroadcast: "Add Broadcast",
|
||||||
|
editBroadcast: "Modify",
|
||||||
|
publishedBroadcast: "Published Broadcast",
|
||||||
|
createTime: "Create Time",
|
||||||
|
content: "Content",
|
||||||
|
createUser: "Create User",
|
||||||
|
updateTime: "Update Time",
|
||||||
|
updateUser: "Update User",
|
||||||
|
operation: "Operation",
|
||||||
|
edit: "Edit",
|
||||||
|
exceedingInput:"Exceeding Input Maximum Limit",
|
||||||
|
deleteRemind:"Are you sure you want to delete this broadcast?",
|
||||||
|
deleteSuccess:"Delete Success",
|
||||||
|
editSuccess:"Edit Success",
|
||||||
|
addSuccess:"Add Success",
|
||||||
|
cancel:"Cancel",
|
||||||
|
publish:"Publish",
|
||||||
|
logout:"Logout",
|
||||||
|
editContent:"Edit Broadcast Content",
|
||||||
|
dialogTitle:"Add Broadcast Content",
|
||||||
|
pleaseInputContent:"Please input broadcast content",
|
||||||
|
newlineInvalid:"Invalid line break for broadcasting content input",
|
||||||
|
onlineUserNum:"Online Number",
|
||||||
|
offlineUserNum:"Offline Number",
|
||||||
|
userPower:"User Power",
|
||||||
|
chartTitle:"User Power and Online/Offline Status Chart",
|
||||||
|
noData:"No Data",
|
||||||
|
startDate:"Start Date",
|
||||||
|
endDate:"End Date",
|
||||||
|
to:"To",
|
||||||
|
userDetails:"User Details",
|
||||||
|
return:"Return",
|
||||||
|
coin:"Coin:",
|
||||||
|
user:"Mining account:",
|
||||||
|
amount:"Amount:",
|
||||||
|
createDate:"Create Date",
|
||||||
|
maxHeight:"Max Height",
|
||||||
|
shouldOutDate:"Should Out Date",
|
||||||
|
address:"Address",
|
||||||
|
historyAddress:"History Payment Address:",
|
||||||
|
userManagementTitle:"User Management",
|
||||||
|
pleaseInput:"Please Input",
|
||||||
|
email:"Email:",
|
||||||
|
email2:"Email",
|
||||||
|
query:"Query",
|
||||||
|
coin2:"Coin",
|
||||||
|
amount2:"Minimum Payout Amount",
|
||||||
|
status2:"User Status",
|
||||||
|
minerUser2:"Miner User",
|
||||||
|
balance2:"Payment Address",
|
||||||
|
active2:"Automatic Withdrawal",
|
||||||
|
normal:"Normal",
|
||||||
|
delete:"Delete",
|
||||||
|
yes:"Yes",
|
||||||
|
no:"No",
|
||||||
|
Details:"Details",
|
||||||
|
sendEmail:"Send Email",
|
||||||
|
sendSuccess:"Send Success",
|
||||||
|
sendFail:"Send Fail",
|
||||||
|
sendRemind:"Are you sure you want to send an email?",
|
||||||
|
recipient:"Recipient",
|
||||||
|
subject:"Email Subject",
|
||||||
|
text:"Email Content",
|
||||||
|
send:"Send",
|
||||||
|
emailRemind:"Multiple emails can be entered, separated by commas",
|
||||||
|
pleaseInputCorrectEmail:"Please enter a valid email address",
|
||||||
|
pleaseInputSubject:"Please enter an email subject",
|
||||||
|
pleaseInputText:"Please enter an email content",
|
||||||
|
pleaseInputCorrectEmail2:"Please enter a valid email address, multiple emails separated by commas",
|
||||||
|
existDuplicateEmail:"Duplicate email exists, please check",
|
||||||
|
pleaseInputQueryConditions:"Please enter the query conditions (miner account, email)",
|
||||||
|
|
||||||
|
emailContent:"Email Content",
|
||||||
|
leftNavigation:"Select the left navigation bar to view the page",
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ import {alerts_zh,alerts_en} from'./alerts'
|
||||||
import {seo_zh,seo_en} from'./seo'
|
import {seo_zh,seo_en} from'./seo'
|
||||||
import {chooseUs_zh,chooseUs_en} from'./dataDisplay'
|
import {chooseUs_zh,chooseUs_en} from'./dataDisplay'
|
||||||
import {ChatWidget_zh,ChatWidget_en} from'./ChatWidget'
|
import {ChatWidget_zh,ChatWidget_en} from'./ChatWidget'
|
||||||
|
import {backendSystem_zh,backendSystem_en} from'./backendSystem'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,6 +34,7 @@ export default {
|
||||||
...seo_zh,
|
...seo_zh,
|
||||||
...chooseUs_zh,
|
...chooseUs_zh,
|
||||||
...ChatWidget_zh,
|
...ChatWidget_zh,
|
||||||
|
...backendSystem_zh,
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
|
@ -52,6 +55,7 @@ export default {
|
||||||
...seo_en,
|
...seo_en,
|
||||||
...chooseUs_en,
|
...chooseUs_en,
|
||||||
...ChatWidget_en,
|
...ChatWidget_en,
|
||||||
|
...backendSystem_en,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,8 @@ export const seo_zh = {
|
||||||
allocationExplanation: "M2Pool 矿池分配及转账说明页面,详细介绍各币种的成熟条件、出块间隔及预估时间,何时将挖矿收益分配及转账至用户账户,提供用户清晰的了解分配及转账指南。",
|
allocationExplanation: "M2Pool 矿池分配及转账说明页面,详细介绍各币种的成熟条件、出块间隔及预估时间,何时将挖矿收益分配及转账至用户账户,提供用户清晰的了解分配及转账指南。",
|
||||||
enxAccess: "Entropyx(enx) 接入页面,详细介绍如何接入 M2Pool 矿池进行 enx 币种挖矿,提供用户便捷的接入指南,轻松开启挖矿之旅。",
|
enxAccess: "Entropyx(enx) 接入页面,详细介绍如何接入 M2Pool 矿池进行 enx 币种挖矿,提供用户便捷的接入指南,轻松开启挖矿之旅。",
|
||||||
alphAccess: "Alephium(alph) 接入页面,详细介绍如何接入 M2Pool 矿池进行 Alephium(alph) 币种挖矿,提供用户便捷的接入指南,轻松开启挖矿之旅。",
|
alphAccess: "Alephium(alph) 接入页面,详细介绍如何接入 M2Pool 矿池进行 Alephium(alph) 币种挖矿,提供用户便捷的接入指南,轻松开启挖矿之旅。",
|
||||||
|
broadcast: "M2Pool 矿池广播页面,管理员可在此查看已发布的广播信息,包括广播内容、发布时间、发布者等。",
|
||||||
|
userManagement: "M2Pool 矿池用户管理页面,管理员可在此查看所有用户信息,包括用户名、邮箱、注册时间、登录时间等。",
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,5 +55,9 @@ export const seo_en = {
|
||||||
allocationExplanation: "The M2Pool mining pool allocation and transfer instructions page provides detailed information on the maturity conditions, block interval, and estimated time of each currency, as well as when to allocate and transfer mining profits to user accounts, providing users with a clear understanding of allocation and transfer guidelines.",
|
allocationExplanation: "The M2Pool mining pool allocation and transfer instructions page provides detailed information on the maturity conditions, block interval, and estimated time of each currency, as well as when to allocate and transfer mining profits to user accounts, providing users with a clear understanding of allocation and transfer guidelines.",
|
||||||
enxAccess: "Entropyx (enx) access page provides detailed instructions on how to access the M2Pool mining pool for enx currency mining, offering users a convenient access guide to easily start their mining journey.",
|
enxAccess: "Entropyx (enx) access page provides detailed instructions on how to access the M2Pool mining pool for enx currency mining, offering users a convenient access guide to easily start their mining journey.",
|
||||||
alphAccess: "The M2Pool Alephium(alph) access page provides detailed instructions on how to access the M2Pool mining pool for Alephium(alph) currency mining, offering users a convenient access guide to easily start their mining journey.",
|
alphAccess: "The M2Pool Alephium(alph) access page provides detailed instructions on how to access the M2Pool mining pool for Alephium(alph) currency mining, offering users a convenient access guide to easily start their mining journey.",
|
||||||
|
broadcast: "M2Pool mining pool broadcast page, where administrators can view published broadcast information, including broadcast content, release time, publisher, etc.",
|
||||||
|
userManagement: "M2Pool mining pool user management page, where administrators can view all user information, including user name, email, registration time, login time, etc.",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<el-container style="width: 100vw;height: 100vh;" class="containerApp" >
|
|
||||||
|
<BackAdminLayout v-if="jurisdiction && jurisdiction.roleKey === 'back_admin'"> </BackAdminLayout>
|
||||||
|
<el-container v-else style="width: 100vw;height: 100vh;" class="containerApp" >
|
||||||
<el-header class="el-header" >
|
<el-header class="el-header" >
|
||||||
<MoveHead v-if="$isMobile"></MoveHead>
|
<MoveHead v-if="$isMobile"></MoveHead>
|
||||||
<comHeard v-else></comHeard>
|
<comHeard v-else></comHeard>
|
||||||
|
@ -7,7 +9,6 @@
|
||||||
<el-main>
|
<el-main>
|
||||||
<appMain></appMain>
|
<appMain></appMain>
|
||||||
</el-main>
|
</el-main>
|
||||||
|
|
||||||
</el-container>
|
</el-container>
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +20,35 @@ export default {
|
||||||
comHeard: () => import("../components/header.vue"),
|
comHeard: () => import("../components/header.vue"),
|
||||||
appMain: () => import("../components/content.vue"),
|
appMain: () => import("../components/content.vue"),
|
||||||
MoveHead: () => import("../components/MoveHead.vue"),
|
MoveHead: () => import("../components/MoveHead.vue"),
|
||||||
|
BackAdminLayout: () => import("../components/BackAdminLayout.vue"),
|
||||||
},
|
},
|
||||||
|
data(){
|
||||||
|
return {
|
||||||
|
jurisdiction: {
|
||||||
|
roleKey: "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted(){
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction ? JSON.parse(jurisdiction) : { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
let jurisdiction = localStorage.getItem("jurisdiction");
|
||||||
|
try {
|
||||||
|
jurisdiction = jurisdiction ? JSON.parse(jurisdiction) : { roleKey: "" };
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = { roleKey: "" };
|
||||||
|
}
|
||||||
|
this.jurisdiction = jurisdiction;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -28,14 +28,18 @@ Vue.prototype.$axios = axios
|
||||||
|
|
||||||
console.log = ()=>{} //全局关闭打印
|
console.log = ()=>{} //全局关闭打印
|
||||||
// 全局注册混入
|
// 全局注册混入
|
||||||
Vue.mixin(loadingStateMixin);
|
Vue.mixin(loadingStateMixin);//loading状态管理
|
||||||
Vue.mixin(networkRecoveryMixin);
|
Vue.mixin(networkRecoveryMixin);//网络恢复后数据刷新
|
||||||
|
|
||||||
Vue.prototype.$baseApi = process.env.VUE_APP_BASE_URL //图片base路径
|
Vue.prototype.$baseApi = process.env.VUE_APP_BASE_URL //图片base路径
|
||||||
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
||||||
const isNarrowScreen = screenWidth < 1280;
|
const isNarrowScreen = screenWidth < 1280;
|
||||||
Vue.prototype.$isMobile = isNarrowScreen
|
Vue.prototype.$isMobile = isNarrowScreen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 在路由守卫中设置
|
// 在路由守卫中设置
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach((to, from, next) => {
|
||||||
// 从路由中获取语言参数
|
// 从路由中获取语言参数
|
||||||
|
|
|
@ -30,9 +30,10 @@ const childrenRoutes = [
|
||||||
path: 'miningAccount',
|
path: 'miningAccount',
|
||||||
name: 'MiningAccount',
|
name: 'MiningAccount',
|
||||||
component: () => import('../views/miningAccount/index.vue'),
|
component: () => import('../views/miningAccount/index.vue'),
|
||||||
meta: {title: '挖矿账户页面',
|
meta: {
|
||||||
|
title: '挖矿账户页面',
|
||||||
description: i18n.t(`seo.miningAccount`),
|
description: i18n.t(`seo.miningAccount`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控'
|
// keywords: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控',
|
en: 'M2Pool mining account, crypto mining stats, mining rewards, hashrate monitor, 矿池账户, 挖矿收益, 算力监控',
|
||||||
|
@ -44,7 +45,8 @@ const childrenRoutes = [
|
||||||
path: 'readOnlyDisplay',
|
path: 'readOnlyDisplay',
|
||||||
name: 'ReadOnlyDisplay',
|
name: 'ReadOnlyDisplay',
|
||||||
component: () => import('../views/readOnlyDisplay/index.vue'),
|
component: () => import('../views/readOnlyDisplay/index.vue'),
|
||||||
meta: {title: '只读页面展示页',
|
meta: {
|
||||||
|
title: '只读页面展示页',
|
||||||
description: i18n.t(`seo.readOnlyDisplay`),
|
description: i18n.t(`seo.readOnlyDisplay`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,只读页面,收益状况,矿工信息,Read only page,Revenue situation,Mining Pool,Miner information'
|
// keywords: 'M2Pool 矿池,只读页面,收益状况,矿工信息,Read only page,Revenue situation,Mining Pool,Miner information'
|
||||||
|
@ -61,9 +63,10 @@ const childrenRoutes = [
|
||||||
path: 'reportBlock',
|
path: 'reportBlock',
|
||||||
name: 'ReportBlock',
|
name: 'ReportBlock',
|
||||||
component: () => import('../views/reportBlock/index.vue'),
|
component: () => import('../views/reportBlock/index.vue'),
|
||||||
meta: {title: '报块页面',
|
meta: {
|
||||||
|
title: '报块页面',
|
||||||
description: i18n.t(`seo.reportBlock`),
|
description: i18n.t(`seo.reportBlock`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,报块页面,幸运值,区块高度,Block page,Lucky Value,block height,Mining Pool'
|
// keywords: 'M2Pool 矿池,报块页面,幸运值,区块高度,Block page,Lucky Value,block height,Mining Pool'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Block page,Lucky Value,block height,Mining Pool',
|
en: 'Block page,Lucky Value,block height,Mining Pool',
|
||||||
|
@ -73,11 +76,58 @@ const childrenRoutes = [
|
||||||
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{//报块页面
|
||||||
|
path: 'broadcast',
|
||||||
|
name: 'Broadcast',
|
||||||
|
component: () => import('../views/broadcast/index.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '广播页面',
|
||||||
|
description: i18n.t(`seo.broadcast`),
|
||||||
|
allAuthority: [`back_admin`],
|
||||||
|
keywords: {
|
||||||
|
en: 'broadcast',
|
||||||
|
zh: '广播'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{//用户管理
|
||||||
|
path: 'userManagement',
|
||||||
|
name: 'UserManagement',
|
||||||
|
component: () => import('../views/userManagement/index.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '用户管理',
|
||||||
|
description: i18n.t(`seo.userManagement`),
|
||||||
|
allAuthority: [`back_admin`],
|
||||||
|
keywords: {
|
||||||
|
en: 'userManagement',
|
||||||
|
zh: '用户管理'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
{//用户详情
|
||||||
|
path: 'userDetails',
|
||||||
|
name: 'UserDetails',
|
||||||
|
component: () => import('../views/userDetails/index.vue'),
|
||||||
|
meta: {
|
||||||
|
title: '用户详情',
|
||||||
|
description: i18n.t(`seo.userManagement`),
|
||||||
|
allAuthority: [`back_admin`],
|
||||||
|
keywords: {
|
||||||
|
en: 'userDetails',
|
||||||
|
zh: '用户详情'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{//费率
|
{//费率
|
||||||
path: 'rate',
|
path: 'rate',
|
||||||
name: 'Rate',
|
name: 'Rate',
|
||||||
component: () => import('../views/rate/index.vue'),
|
component: () => import('../views/rate/index.vue'),
|
||||||
meta: {title: '费率页面',
|
meta: {
|
||||||
|
title: '费率页面',
|
||||||
description: i18n.t(`seo.rate`),
|
description: i18n.t(`seo.rate`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,费率页面,挖矿费率,收益计算,Mining Pool,Rate,Mining fee rate,Profit calculation'
|
// keywords: 'M2Pool 矿池,费率页面,挖矿费率,收益计算,Mining Pool,Rate,Mining fee rate,Profit calculation'
|
||||||
|
@ -93,7 +143,8 @@ const childrenRoutes = [
|
||||||
path: 'allocationExplanation',
|
path: 'allocationExplanation',
|
||||||
name: 'AllocationExplanation',
|
name: 'AllocationExplanation',
|
||||||
component: () => import('../views/allocationExplanation/index.vue'),
|
component: () => import('../views/allocationExplanation/index.vue'),
|
||||||
meta: {title: '分配说明页面',
|
meta: {
|
||||||
|
title: '分配说明页面',
|
||||||
description: i18n.t(`seo.rate`),
|
description: i18n.t(`seo.rate`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: '分配、转账说明,矿池分配,转账说明,Allocation,Transfer,Mining Pool,Pool allocation,Transfer instructions'
|
// keywords: '分配、转账说明,矿池分配,转账说明,Allocation,Transfer,Mining Pool,Pool allocation,Transfer instructions'
|
||||||
|
@ -107,7 +158,8 @@ const childrenRoutes = [
|
||||||
path: 'apiFile',
|
path: 'apiFile',
|
||||||
name: 'ApiFile',
|
name: 'ApiFile',
|
||||||
component: () => import('../views/apiFile/index.vue'),
|
component: () => import('../views/apiFile/index.vue'),
|
||||||
meta: {title: 'API文档页面',
|
meta: {
|
||||||
|
title: 'API文档页面',
|
||||||
description: i18n.t(`seo.apiFile`),
|
description: i18n.t(`seo.apiFile`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,API 文档,认证 token,接口调用,API file,authentication token,Interface call'
|
// keywords: 'M2Pool 矿池,API 文档,认证 token,接口调用,API file,authentication token,Interface call'
|
||||||
|
@ -122,9 +174,10 @@ const childrenRoutes = [
|
||||||
path: 'customerService',
|
path: 'customerService',
|
||||||
name: 'CustomerService',
|
name: 'CustomerService',
|
||||||
component: () => import('../views/customerService/index.vue'),
|
component: () => import('../views/customerService/index.vue'),
|
||||||
meta: {title: '在线客服',
|
meta: {
|
||||||
|
title: '在线客服',
|
||||||
description: i18n.t(`seo.apiFile`),
|
description: i18n.t(`seo.apiFile`),
|
||||||
allAuthority:[`customer_service`],//客服权限
|
allAuthority: [`customer_service`, `admin`,],//客服权限
|
||||||
// keywords: 'M2Pool 矿池,API 文档,认证 token,接口调用,API file,authentication token,Interface call'
|
// keywords: 'M2Pool 矿池,API 文档,认证 token,接口调用,API file,authentication token,Interface call'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'API file,authentication token,Interface call',
|
en: 'API file,authentication token,Interface call',
|
||||||
|
@ -138,7 +191,8 @@ const childrenRoutes = [
|
||||||
path: '/:lang/AccessMiningPool',
|
path: '/:lang/AccessMiningPool',
|
||||||
name: 'AccessMiningPool',
|
name: 'AccessMiningPool',
|
||||||
component: () => import('../views/AccessMiningPool/index.vue'),
|
component: () => import('../views/AccessMiningPool/index.vue'),
|
||||||
meta: {title: '接入矿池页面',
|
meta: {
|
||||||
|
title: '接入矿池页面',
|
||||||
description: i18n.t(`seo.allocationExplanation`),
|
description: i18n.t(`seo.allocationExplanation`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,接入矿池,币种接入,挖矿指南,Access to Mining Pools,Coin Access,Mining Guide'
|
// keywords: 'M2Pool 矿池,接入矿池,币种接入,挖矿指南,Access to Mining Pools,Coin Access,Mining Guide'
|
||||||
|
@ -153,7 +207,8 @@ const childrenRoutes = [
|
||||||
path: 'nexaAccess',
|
path: 'nexaAccess',
|
||||||
name: 'NexaAccess',
|
name: 'NexaAccess',
|
||||||
component: () => import('../views/AccessMiningPool/nexaAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/nexaAccess/index.vue'),
|
||||||
meta: {title: 'nexa 挖矿页面',
|
meta: {
|
||||||
|
title: 'nexa 挖矿页面',
|
||||||
description: i18n.t(`seo.nexaAccess`),
|
description: i18n.t(`seo.nexaAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
keepAlive: true,
|
keepAlive: true,
|
||||||
|
@ -169,7 +224,8 @@ const childrenRoutes = [
|
||||||
path: 'rxdAccess',
|
path: 'rxdAccess',
|
||||||
name: 'RxdAccess',
|
name: 'RxdAccess',
|
||||||
component: () => import('../views/AccessMiningPool/rxdAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/rxdAccess/index.vue'),
|
||||||
meta: {title: 'rxd 挖矿页面',
|
meta: {
|
||||||
|
title: 'rxd 挖矿页面',
|
||||||
description: i18n.t(`seo.rxdAccess`),
|
description: i18n.t(`seo.rxdAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'rxd,挖矿教程,Radiant接入,rxd Access,Radiant Access,Mining Tutorial,radiant'
|
// keywords: 'rxd,挖矿教程,Radiant接入,rxd Access,Radiant Access,Mining Tutorial,radiant'
|
||||||
|
@ -183,7 +239,8 @@ const childrenRoutes = [
|
||||||
path: 'monaAccess',
|
path: 'monaAccess',
|
||||||
name: 'MonaAccess',
|
name: 'MonaAccess',
|
||||||
component: () => import('../views/AccessMiningPool/monaAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/monaAccess/index.vue'),
|
||||||
meta: {title: 'mona 挖矿页面',
|
meta: {
|
||||||
|
title: 'mona 挖矿页面',
|
||||||
description: i18n.t(`seo.monaAccess`),
|
description: i18n.t(`seo.monaAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'mona,挖矿教程,mona接入,Mona Access,MONA Access,Mining Tutorial'
|
// keywords: 'mona,挖矿教程,mona接入,Mona Access,MONA Access,Mining Tutorial'
|
||||||
|
@ -198,7 +255,8 @@ const childrenRoutes = [
|
||||||
path: 'grsAccess',
|
path: 'grsAccess',
|
||||||
name: 'GrsAccess',
|
name: 'GrsAccess',
|
||||||
component: () => import('../views/AccessMiningPool/grsAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/grsAccess/index.vue'),
|
||||||
meta: {title: 'grs 挖矿页面',
|
meta: {
|
||||||
|
title: 'grs 挖矿页面',
|
||||||
description: i18n.t(`seo.grsAccess`),
|
description: i18n.t(`seo.grsAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'GRS,Grs接入,GRS Access,grs Access,Mining Tutorial'
|
// keywords: 'GRS,Grs接入,GRS Access,grs Access,Mining Tutorial'
|
||||||
|
@ -213,7 +271,8 @@ const childrenRoutes = [
|
||||||
path: 'dgbqAccess',
|
path: 'dgbqAccess',
|
||||||
name: 'DgbqAccess',
|
name: 'DgbqAccess',
|
||||||
component: () => import('../views/AccessMiningPool/dgbqAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/dgbqAccess/index.vue'),
|
||||||
meta: {title: 'Dgbq 挖矿页面',
|
meta: {
|
||||||
|
title: 'Dgbq 挖矿页面',
|
||||||
description: i18n.t(`seo.dgbAccess`),
|
description: i18n.t(`seo.dgbAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'Dgbq,dgb(qubit)接入,Dgb(qubit) Access,DGB(qubit) Access,Mining Tutorial,DGB'
|
// keywords: 'Dgbq,dgb(qubit)接入,Dgb(qubit) Access,DGB(qubit) Access,Mining Tutorial,DGB'
|
||||||
|
@ -228,7 +287,8 @@ const childrenRoutes = [
|
||||||
path: 'dgboAccess',
|
path: 'dgboAccess',
|
||||||
name: 'DgboAccess',
|
name: 'DgboAccess',
|
||||||
component: () => import('../views/AccessMiningPool/dgboAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/dgboAccess/index.vue'),
|
||||||
meta: {title: 'Dgbo 挖矿页面',
|
meta: {
|
||||||
|
title: 'Dgbo 挖矿页面',
|
||||||
description: i18n.t(`seo.dgbAccess`),
|
description: i18n.t(`seo.dgbAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'dgbo,dgb(odocrypt)接入,Dgb(odocrypt) Access,DGB(odocrypt) Access,Mining Tutorial,DGB'
|
// keywords: 'dgbo,dgb(odocrypt)接入,Dgb(odocrypt) Access,DGB(odocrypt) Access,Mining Tutorial,DGB'
|
||||||
|
@ -243,7 +303,8 @@ const childrenRoutes = [
|
||||||
path: 'dgbsAccess',
|
path: 'dgbsAccess',
|
||||||
name: 'DgbsAccess',
|
name: 'DgbsAccess',
|
||||||
component: () => import('../views/AccessMiningPool/dgbsAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/dgbsAccess/index.vue'),
|
||||||
meta: {title: 'Dgbs 挖矿页面',
|
meta: {
|
||||||
|
title: 'Dgbs 挖矿页面',
|
||||||
description: i18n.t(`seo.dgbAccess`),
|
description: i18n.t(`seo.dgbAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'dgbs,dgb(skein)接入,Dgb(skein) Access,DGB(skein) Access,Mining Tutorial,DGB'
|
// keywords: 'dgbs,dgb(skein)接入,Dgb(skein) Access,DGB(skein) Access,Mining Tutorial,DGB'
|
||||||
|
@ -258,7 +319,8 @@ const childrenRoutes = [
|
||||||
path: 'enxAccess',
|
path: 'enxAccess',
|
||||||
name: 'EnxAccess',
|
name: 'EnxAccess',
|
||||||
component: () => import('../views/AccessMiningPool/enxAccess/index.vue'),
|
component: () => import('../views/AccessMiningPool/enxAccess/index.vue'),
|
||||||
meta: {title: ' Entropyx(enx) 挖矿页面',
|
meta: {
|
||||||
|
title: ' Entropyx(enx) 挖矿页面',
|
||||||
description: i18n.t(`seo.enxAccess`),
|
description: i18n.t(`seo.enxAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'Entropyx(Enx), Entropyx(enx)接入,enx,ENX,Mining Tutorial'
|
// keywords: 'Entropyx(Enx), Entropyx(enx)接入,enx,ENX,Mining Tutorial'
|
||||||
|
@ -273,7 +335,8 @@ const childrenRoutes = [
|
||||||
path: 'alphminingPool',
|
path: 'alphminingPool',
|
||||||
name: 'AlphminingPool',
|
name: 'AlphminingPool',
|
||||||
component: () => import('../views/AccessMiningPool/alphminingPool/index.vue'),
|
component: () => import('../views/AccessMiningPool/alphminingPool/index.vue'),
|
||||||
meta: {title: ' alephium 挖矿页面',
|
meta: {
|
||||||
|
title: ' alephium 挖矿页面',
|
||||||
description: i18n.t(`seo.alphAccess`),
|
description: i18n.t(`seo.alphAccess`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'Entropyx(Enx), Entropyx(enx)接入,enx,ENX,Mining Tutorial'
|
// keywords: 'Entropyx(Enx), Entropyx(enx)接入,enx,ENX,Mining Tutorial'
|
||||||
|
@ -292,7 +355,8 @@ const childrenRoutes = [
|
||||||
path: 'ServiceTerms',
|
path: 'ServiceTerms',
|
||||||
name: 'ServiceTerms',
|
name: 'ServiceTerms',
|
||||||
component: () => import('../views/ServiceTerms/index.vue'),
|
component: () => import('../views/ServiceTerms/index.vue'),
|
||||||
meta: {title: '服务条款页面',
|
meta: {
|
||||||
|
title: '服务条款页面',
|
||||||
description: i18n.t(`seo.ServiceTerms`),
|
description: i18n.t(`seo.ServiceTerms`),
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,服务条款,用户权益,权利义务,Terms of Service, User Rights, Rights and Obligations'
|
// keywords: 'M2Pool 矿池,服务条款,用户权益,权利义务,Terms of Service, User Rights, Rights and Obligations'
|
||||||
|
@ -306,9 +370,10 @@ const childrenRoutes = [
|
||||||
path: 'submitWorkOrder',
|
path: 'submitWorkOrder',
|
||||||
name: 'SubmitWorkOrder',
|
name: 'SubmitWorkOrder',
|
||||||
component: () => import('../views/submitWorkOrder/index.vue'),
|
component: () => import('../views/submitWorkOrder/index.vue'),
|
||||||
meta: {title: '提交工单页面',
|
meta: {
|
||||||
|
title: '提交工单页面',
|
||||||
description: i18n.t(`seo.submitWorkOrder`),
|
description: i18n.t(`seo.submitWorkOrder`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,提交工单,技术支持,问题处理,Mining Pool,Work Order Submission, Technical Support, Troubleshooting'
|
// keywords: 'M2Pool 矿池,提交工单,技术支持,问题处理,Mining Pool,Work Order Submission, Technical Support, Troubleshooting'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Mining Pool,Work Order Submission, Technical Support, Troubleshooting',
|
en: 'Mining Pool,Work Order Submission, Technical Support, Troubleshooting',
|
||||||
|
@ -320,9 +385,10 @@ const childrenRoutes = [
|
||||||
path: 'workOrderRecords',
|
path: 'workOrderRecords',
|
||||||
name: 'WorkOrderRecords',
|
name: 'WorkOrderRecords',
|
||||||
component: () => import('../views/workOrderRecords/index.vue'),
|
component: () => import('../views/workOrderRecords/index.vue'),
|
||||||
meta: {title: '工单记录页面(用户)',
|
meta: {
|
||||||
|
title: '工单记录页面(用户)',
|
||||||
description: i18n.t(`seo.workOrderRecords`),
|
description: i18n.t(`seo.workOrderRecords`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,用户工单记录,处理状态,问题进度,User Work Order Records, Processing Status, Issue Progress'
|
// keywords: 'M2Pool 矿池,用户工单记录,处理状态,问题进度,User Work Order Records, Processing Status, Issue Progress'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'User Work Order Records, Processing Status, Issue Progress',
|
en: 'User Work Order Records, Processing Status, Issue Progress',
|
||||||
|
@ -334,9 +400,10 @@ const childrenRoutes = [
|
||||||
path: 'userWorkDetails',
|
path: 'userWorkDetails',
|
||||||
name: 'UserWorkDetails',
|
name: 'UserWorkDetails',
|
||||||
component: () => import('../views/userWorkDetails/index.vue'),
|
component: () => import('../views/userWorkDetails/index.vue'),
|
||||||
meta: {title: '工单详情页面(用户)',
|
meta: {
|
||||||
|
title: '工单详情页面(用户)',
|
||||||
description: i18n.t(`seo.userWorkDetails`),
|
description: i18n.t(`seo.userWorkDetails`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,用户工单详情,问题描述,补充提交,User Work Order Details, Problem Description, Additional Submissions'
|
// keywords: 'M2Pool 矿池,用户工单详情,问题描述,补充提交,User Work Order Details, Problem Description, Additional Submissions'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'User Work Order Details, Problem Description, Additional Submissions',
|
en: 'User Work Order Details, Problem Description, Additional Submissions',
|
||||||
|
@ -348,9 +415,10 @@ const childrenRoutes = [
|
||||||
path: 'workOrderBackend',
|
path: 'workOrderBackend',
|
||||||
name: 'WorkOrderBackend',
|
name: 'WorkOrderBackend',
|
||||||
component: () => import('../views/workOrderBackend/index.vue'),
|
component: () => import('../views/workOrderBackend/index.vue'),
|
||||||
meta: {title: '工单管理页面(后台)',
|
meta: {
|
||||||
|
title: '工单管理页面(后台)',
|
||||||
description: "M2Pool 矿池后台工单管理页面,供 M2Pool 管理员查看和管理用户提交的工单记录,确保问题及时处理,提升用户体验。",
|
description: "M2Pool 矿池后台工单管理页面,供 M2Pool 管理员查看和管理用户提交的工单记录,确保问题及时处理,提升用户体验。",
|
||||||
allAuthority:[`admin`],
|
allAuthority: [`back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,后台工单管理,用户工单,及时处理,Back-office work order management, user work orders, timely processing'
|
// keywords: 'M2Pool 矿池,后台工单管理,用户工单,及时处理,Back-office work order management, user work orders, timely processing'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Back-office work order management, user work orders, timely processing',
|
en: 'Back-office work order management, user work orders, timely processing',
|
||||||
|
@ -362,9 +430,10 @@ const childrenRoutes = [
|
||||||
path: 'BKWorkDetails',
|
path: 'BKWorkDetails',
|
||||||
name: 'BKWorkDetails',
|
name: 'BKWorkDetails',
|
||||||
component: () => import('../views/BKWorkDetails/index.vue'),
|
component: () => import('../views/BKWorkDetails/index.vue'),
|
||||||
meta: {title: '工单详情页面(后台)',
|
meta: {
|
||||||
|
title: '工单详情页面(后台)',
|
||||||
description: "M2Pool 矿池后台工单详情页面,管理员可在此查看提交工单的详细情况,包括提交时间、详细问题描述以及处理过程,并通过本页面对该工单进行回复处理。",
|
description: "M2Pool 矿池后台工单详情页面,管理员可在此查看提交工单的详细情况,包括提交时间、详细问题描述以及处理过程,并通过本页面对该工单进行回复处理。",
|
||||||
allAuthority:[`admin`],
|
allAuthority: [`back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,后台工单详情,问题处理,回复工单,Backend Work Order Details, Problem Handling, Responding to Work Orders'
|
// keywords: 'M2Pool 矿池,后台工单详情,问题处理,回复工单,Backend Work Order Details, Problem Handling, Responding to Work Orders'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Backend Work Order Details, Problem Handling, Responding to Work Orders',
|
en: 'Backend Work Order Details, Problem Handling, Responding to Work Orders',
|
||||||
|
@ -376,7 +445,8 @@ const childrenRoutes = [
|
||||||
path: 'dataDisplay',
|
path: 'dataDisplay',
|
||||||
name: 'DataDisplay',
|
name: 'DataDisplay',
|
||||||
component: () => import('../views/dataDisplay/index.vue'),
|
component: () => import('../views/dataDisplay/index.vue'),
|
||||||
meta: {title: '数据展示页面',
|
meta: {
|
||||||
|
title: '数据展示页面',
|
||||||
description: "M2Pool 矿池数据展示页面",
|
description: "M2Pool 矿池数据展示页面",
|
||||||
allAuthority: [`all`],
|
allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,数据展示,Mining Pool,Data Display'
|
// keywords: 'M2Pool 矿池,数据展示,Mining Pool,Data Display'
|
||||||
|
@ -390,9 +460,10 @@ const childrenRoutes = [
|
||||||
path: 'alerts',
|
path: 'alerts',
|
||||||
name: 'Alerts',
|
name: 'Alerts',
|
||||||
component: () => import('../views/alerts/index.vue'),
|
component: () => import('../views/alerts/index.vue'),
|
||||||
meta: {title: '警报通知',
|
meta: {
|
||||||
|
title: '警报通知',
|
||||||
description: i18n.t(`seo.alerts`),
|
description: i18n.t(`seo.alerts`),
|
||||||
allAuthority:[`admin`,`registered`],
|
allAuthority: [`admin`, `registered`, `back_admin`],
|
||||||
// keywords: 'M2Pool, 矿池,离线告警设置,矿机离线,Mining Pool,Offline Alarm Setting,Mining Machine Offline'
|
// keywords: 'M2Pool, 矿池,离线告警设置,矿机离线,Mining Pool,Offline Alarm Setting,Mining Machine Offline'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Mining Pool,Offline Alarm Setting,Mining Machine Offline',
|
en: 'Mining Pool,Offline Alarm Setting,Mining Machine Offline',
|
||||||
|
@ -406,9 +477,10 @@ const childrenRoutes = [
|
||||||
name: 'PersonalCenter',
|
name: 'PersonalCenter',
|
||||||
// redirect: "/personalCenter/personalMining",
|
// redirect: "/personalCenter/personalMining",
|
||||||
component: () => import('../views/personalCenter/index.vue'),
|
component: () => import('../views/personalCenter/index.vue'),
|
||||||
meta: {title: '个人中心页面',
|
meta: {
|
||||||
|
title: '个人中心页面',
|
||||||
description: i18n.t(`seo.personalCenter`),
|
description: i18n.t(`seo.personalCenter`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿账户,只读页面设置,安全设置,API密钥生成,Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿账户,只读页面设置,安全设置,API密钥生成,Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation',
|
en: 'Personal Center,Mining Account,Read-Only Page Setup,Security Settings,API Key Generation',
|
||||||
|
@ -420,9 +492,10 @@ const childrenRoutes = [
|
||||||
path: 'personalMining',
|
path: 'personalMining',
|
||||||
name: 'PersonalMining',
|
name: 'PersonalMining',
|
||||||
component: () => import('../views/personalCenter/personalMining/index.vue'),
|
component: () => import('../views/personalCenter/personalMining/index.vue'),
|
||||||
meta: {title: '挖矿账户设置页面',
|
meta: {
|
||||||
|
title: '挖矿账户设置页面',
|
||||||
description: i18n.t(`seo.personalMining`),
|
description: i18n.t(`seo.personalMining`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿账户设置,币种账户,Personal Center,Mining Account Settings,Coin Accounts'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿账户设置,币种账户,Personal Center,Mining Account Settings,Coin Accounts'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Personal Center,Mining Account Settings,Coin Accounts',
|
en: 'Personal Center,Mining Account Settings,Coin Accounts',
|
||||||
|
@ -434,9 +507,10 @@ const childrenRoutes = [
|
||||||
path: 'readOnly',
|
path: 'readOnly',
|
||||||
name: 'ReadOnly',
|
name: 'ReadOnly',
|
||||||
component: () => import('../views/personalCenter/readOnly/index.vue'),
|
component: () => import('../views/personalCenter/readOnly/index.vue'),
|
||||||
meta: {title: '只读页面设置',
|
meta: {
|
||||||
|
title: '只读页面设置',
|
||||||
description: i18n.t(`seo.readOnly`),
|
description: i18n.t(`seo.readOnly`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,只读页面设置,矿池分享,Personal Center,Read-Only Page Setting,Mining Pool Sharing'
|
// keywords: 'M2Pool 矿池,个人中心,只读页面设置,矿池分享,Personal Center,Read-Only Page Setting,Mining Pool Sharing'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Personal Center,Read-Only Page Setting,Mining Pool Sharing',
|
en: 'Personal Center,Read-Only Page Setting,Mining Pool Sharing',
|
||||||
|
@ -448,9 +522,10 @@ const childrenRoutes = [
|
||||||
path: 'securitySetting',
|
path: 'securitySetting',
|
||||||
name: 'SecuritySetting',
|
name: 'SecuritySetting',
|
||||||
component: () => import('../views/personalCenter/securitySetting/index.vue'),
|
component: () => import('../views/personalCenter/securitySetting/index.vue'),
|
||||||
meta: {title: '安全设置页面',
|
meta: {
|
||||||
|
title: '安全设置页面',
|
||||||
description: i18n.t(`seo.securitySetting`),
|
description: i18n.t(`seo.securitySetting`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,安全设置,密码修改,Security settings, password change'
|
// keywords: 'M2Pool 矿池,安全设置,密码修改,Security settings, password change'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Security settings, password change',
|
en: 'Security settings, password change',
|
||||||
|
@ -462,9 +537,10 @@ const childrenRoutes = [
|
||||||
path: 'personal',
|
path: 'personal',
|
||||||
name: 'personal',
|
name: 'personal',
|
||||||
component: () => import('../views/personalCenter/personal/index.vue'),
|
component: () => import('../views/personalCenter/personal/index.vue'),
|
||||||
meta: {title: '个人信息页面',
|
meta: {
|
||||||
|
title: '个人信息页面',
|
||||||
description: i18n.t(`seo.personal`),
|
description: i18n.t(`seo.personal`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人信息,登录历史,Personal Information, Login History'
|
// keywords: 'M2Pool 矿池,个人信息,登录历史,Personal Information, Login History'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Personal Information, Login History',
|
en: 'Personal Information, Login History',
|
||||||
|
@ -476,9 +552,10 @@ const childrenRoutes = [
|
||||||
path: 'miningReport',
|
path: 'miningReport',
|
||||||
name: 'MiningReport',
|
name: 'MiningReport',
|
||||||
component: () => import('../views/personalCenter/miningReport/index.vue'),
|
component: () => import('../views/personalCenter/miningReport/index.vue'),
|
||||||
meta: {title: '挖矿报告页面',
|
meta: {
|
||||||
|
title: '挖矿报告页面',
|
||||||
description: i18n.t(`seo.miningReport`),
|
description: i18n.t(`seo.miningReport`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,挖矿报告,订阅服务,Mining Report, Subscription Service'
|
// keywords: 'M2Pool 矿池,个人中心,挖矿报告,订阅服务,Mining Report, Subscription Service'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'Mining Report, Subscription Service',
|
en: 'Mining Report, Subscription Service',
|
||||||
|
@ -491,9 +568,10 @@ const childrenRoutes = [
|
||||||
path: 'personalAPI',
|
path: 'personalAPI',
|
||||||
name: 'PersonalAPI',
|
name: 'PersonalAPI',
|
||||||
component: () => import('../views/personalCenter/personalAPI/index.vue'),
|
component: () => import('../views/personalCenter/personalAPI/index.vue'),
|
||||||
meta: {title: 'API页面',
|
meta: {
|
||||||
|
title: 'API页面',
|
||||||
description: i18n.t(`seo.personalAPI`),
|
description: i18n.t(`seo.personalAPI`),
|
||||||
allAuthority:[`admin`,`registered`,`customer_service`],
|
allAuthority: [`admin`, `registered`, `customer_service`, `back_admin`],
|
||||||
// keywords: 'M2Pool 矿池,个人中心,API 页面,API密钥生成,API Page,API Key Generation'
|
// keywords: 'M2Pool 矿池,个人中心,API 页面,API密钥生成,API Page,API Key Generation'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'API Page,API Key Generation',
|
en: 'API Page,API Key Generation',
|
||||||
|
@ -529,7 +607,8 @@ const staticRoutes = [
|
||||||
path: '/:lang/register',
|
path: '/:lang/register',
|
||||||
name: 'Register',
|
name: 'Register',
|
||||||
component: () => import('../views/register/register.vue'),
|
component: () => import('../views/register/register.vue'),
|
||||||
meta: {title: '注册页面',description:"M2Pool 矿池注册页面,新用户可在此便捷注册账号,加入 M2Pool 矿池大家庭。",allAuthority:[`all`],
|
meta: {
|
||||||
|
title: '注册页面', description: "M2Pool 矿池注册页面,新用户可在此便捷注册账号,加入 M2Pool 矿池大家庭。", allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,注册页面,新用户注册,账号创建'
|
// keywords: 'M2Pool 矿池,注册页面,新用户注册,账号创建'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'M2Pool Mining Pool,register page,new user registration,account creation',
|
en: 'M2Pool Mining Pool,register page,new user registration,account creation',
|
||||||
|
@ -541,7 +620,8 @@ const staticRoutes = [
|
||||||
path: '/:lang/simulation',
|
path: '/:lang/simulation',
|
||||||
name: 'simulation',
|
name: 'simulation',
|
||||||
component: () => import('../views/simulation.vue'),
|
component: () => import('../views/simulation.vue'),
|
||||||
meta: {title: '测试页面',description:"M2Pool 矿池测试页面,用于进行系统功能的模拟和测试,确保矿池稳定运行",allAuthority:[`all`],
|
meta: {
|
||||||
|
title: '测试页面', description: "M2Pool 矿池测试页面,用于进行系统功能的模拟和测试,确保矿池稳定运行", allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,测试页面,系统测试,稳定运行'
|
// keywords: 'M2Pool 矿池,测试页面,系统测试,稳定运行'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'M2Pool Mining Pool,test page,system test,stable operation',
|
en: 'M2Pool Mining Pool,test page,system test,stable operation',
|
||||||
|
@ -556,7 +636,8 @@ const staticRoutes = [
|
||||||
path: '/:lang/resetPassword',
|
path: '/:lang/resetPassword',
|
||||||
name: 'ResetPassword',
|
name: 'ResetPassword',
|
||||||
component: () => import('../views/resetPassword/index.vue'),
|
component: () => import('../views/resetPassword/index.vue'),
|
||||||
meta: {title: '重置密码页面',description:"M2Pool 矿池重置密码页面,用户可在此修改矿池网站账号密码,保障账户安全。",allAuthority:[`all`],
|
meta: {
|
||||||
|
title: '重置密码页面', description: "M2Pool 矿池重置密码页面,用户可在此修改矿池网站账号密码,保障账户安全。", allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,重置密码,修改密码,账户安全'
|
// keywords: 'M2Pool 矿池,重置密码,修改密码,账户安全'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'M2Pool Mining Pool,reset password,modify password,account security',
|
en: 'M2Pool Mining Pool,reset password,modify password,account security',
|
||||||
|
@ -567,7 +648,8 @@ const staticRoutes = [
|
||||||
{//404
|
{//404
|
||||||
path: '/:lang/404',
|
path: '/:lang/404',
|
||||||
component: () => import('../views/page404.vue'),
|
component: () => import('../views/page404.vue'),
|
||||||
meta: {title: '404页面',description:"M2Pool 矿池 404 页面,当 URL 错误时将跳转至此页面,提示用户页面不存在。",allAuthority:[`all`],
|
meta: {
|
||||||
|
title: '404页面', description: "M2Pool 矿池 404 页面,当 URL 错误时将跳转至此页面,提示用户页面不存在。", allAuthority: [`all`],
|
||||||
// keywords: 'M2Pool 矿池,404 页面,页面不存在,错误跳转'
|
// keywords: 'M2Pool 矿池,404 页面,页面不存在,错误跳转'
|
||||||
keywords: {
|
keywords: {
|
||||||
en: 'M2Pool Mining Pool,404 page,page not found,error redirect',
|
en: 'M2Pool Mining Pool,404 page,page not found,error redirect',
|
||||||
|
@ -634,88 +716,165 @@ const router = new VueRouter({
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach((to, from, next) => {
|
||||||
// 检查语言参数
|
const lang = to.params.lang || (localStorage.getItem('lang') || 'en');
|
||||||
const lang = to.params.lang;
|
let token = null;
|
||||||
const supportedLanguages = ['zh', 'en'];
|
|
||||||
|
|
||||||
// 如果路径以斜杠结尾且不是根路径,则重定向
|
|
||||||
if (to.path.endsWith('/') && to.path.length > 1) {
|
|
||||||
const path = to.path.slice(0, -1);
|
|
||||||
return next({
|
|
||||||
path,
|
|
||||||
query: to.query,
|
|
||||||
hash: to.hash,
|
|
||||||
params: to.params
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lang && to.path !== '/') {
|
|
||||||
const defaultLang = localStorage.getItem('lang') || 'en';
|
|
||||||
return next(`/${defaultLang}${to.path}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
let data = localStorage.getItem("jurisdiction");
|
|
||||||
let jurisdiction =JSON.parse(data);
|
|
||||||
console.log(jurisdiction,"权限");
|
|
||||||
|
|
||||||
localStorage.setItem('superReportError',"")
|
|
||||||
let element = document.getElementsByClassName('el-main')[0];
|
|
||||||
if(element){
|
|
||||||
element.scrollTop = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
let token
|
|
||||||
try {
|
try {
|
||||||
token =JSON.parse(localStorage.getItem('token'))
|
token = JSON.parse(localStorage.getItem('token'));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
token = null;
|
||||||
|
}
|
||||||
|
// 权限判断
|
||||||
|
let jurisdiction = null;
|
||||||
|
try {
|
||||||
|
jurisdiction = JSON.parse(localStorage.getItem("jurisdiction"));
|
||||||
|
} catch (e) {
|
||||||
|
jurisdiction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (token) {
|
|
||||||
|
// if (jurisdiction && jurisdiction.roleKey == `back_admin`) {
|
||||||
|
// if (to.name == 'Login' || to.name == 'Register' || jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey)) {
|
||||||
|
// return next();
|
||||||
|
// } else {
|
||||||
|
// // 无权限
|
||||||
|
// Message({
|
||||||
|
// showClose: true,
|
||||||
|
// message: `当前身份只能访问后台管理系统`,
|
||||||
|
// type: 'error'
|
||||||
|
// });
|
||||||
|
// localStorage.setItem("activeIndex", `1`);
|
||||||
|
// return next({ path: `/${lang}/broadcast` });
|
||||||
|
|
||||||
|
|
||||||
if (to.path === `/${lang}/login`|| to.path === `/${lang}/register`) {
|
// }
|
||||||
next({ path: `/${lang}` })
|
// } else {
|
||||||
}else if(to.meta.allAuthority && to.meta.allAuthority[0] ==`all`){
|
// // 未登录
|
||||||
next()
|
// if (!token) {
|
||||||
}else if(jurisdiction.roleKey && to.meta.allAuthority&&to.meta.allAuthority.some(item=>item == jurisdiction.roleKey )){
|
// console.log(`未登录`);
|
||||||
next()
|
// if (
|
||||||
|
// to.meta.allAuthority &&
|
||||||
|
// (
|
||||||
|
// to.meta.allAuthority[0] === 'all' ||
|
||||||
|
// (jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey))
|
||||||
|
// )
|
||||||
|
// ) {
|
||||||
|
// return next();
|
||||||
|
// } else {
|
||||||
|
|
||||||
|
|
||||||
|
// // 无权限
|
||||||
|
// Message({
|
||||||
|
// showClose: true,
|
||||||
|
// message: i18n.t(`mining.jurisdiction`),
|
||||||
|
// type: 'error'
|
||||||
|
// });
|
||||||
|
// return next({ path: `/${lang}/login` });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// } else {
|
||||||
|
// if (to.name === 'Login' || to.name === 'Register') {
|
||||||
|
// return next({ path: `/${lang}` });
|
||||||
|
// } else if (to.meta.allAuthority &&
|
||||||
|
// (
|
||||||
|
// to.meta.allAuthority[0] === 'all' ||
|
||||||
|
// (jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey))
|
||||||
|
// )
|
||||||
|
// ) {
|
||||||
|
// return next();
|
||||||
|
// } else {
|
||||||
|
// // 无权限
|
||||||
|
// Message({
|
||||||
|
// showClose: true,
|
||||||
|
// message: i18n.t(`mining.jurisdiction`),
|
||||||
|
// type: 'error'
|
||||||
|
// });
|
||||||
|
// return next({ path: `/${lang}/login` });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// --------------------------
|
||||||
|
// 未登录
|
||||||
|
if (!token) {
|
||||||
|
console.log(`未登录`);
|
||||||
|
if (
|
||||||
|
to.meta.allAuthority &&
|
||||||
|
(
|
||||||
|
to.meta.allAuthority[0] === 'all' ||
|
||||||
|
(jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return next();
|
||||||
} else {
|
} else {
|
||||||
console.log(to.meta.allAuthority,to.path,"权限");
|
|
||||||
|
|
||||||
Message({//权限不足
|
|
||||||
|
// 无权限
|
||||||
|
Message({
|
||||||
showClose: true,
|
showClose: true,
|
||||||
message: i18n.t(`mining.jurisdiction`),
|
message: i18n.t(`mining.jurisdiction`),
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
|
return next({ path: `/${lang}/login` });
|
||||||
next({ path: `/${lang}` }) // 添加这行,重定向到首页
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
||||||
let paths = [`/${lang}/miningAccount`,`/${lang}/workOrderRecords`,`/${lang}/userWorkDetails`,`/${lang}/submitWorkOrder`,`/${lang}/workOrderBackend`,`/${lang}/BKWorkDetails`]
|
if (jurisdiction && jurisdiction.roleKey == `back_admin`) {
|
||||||
if (paths.includes(to.path) || to.path.includes(`personalCenter`) ) {
|
if (to.name == 'Login' || to.name == 'Register' || to.path == `/${lang}` || jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey)) {
|
||||||
|
return next();
|
||||||
Message({//权限不足
|
} else {
|
||||||
|
// 无权限
|
||||||
|
Message({
|
||||||
showClose: true,
|
showClose: true,
|
||||||
message:i18n.t(`mining.logInFirst`),
|
message: `当前身份只能访问后台管理系统`,
|
||||||
type: 'error'
|
type: 'error'
|
||||||
});
|
});
|
||||||
|
localStorage.setItem("activeIndex", `1`);
|
||||||
|
return next({ path: `/${lang}/broadcast` });
|
||||||
|
|
||||||
next({ path: `/${lang}/login` })
|
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
next()
|
if (to.name === 'Login' || to.name === 'Register') {
|
||||||
|
return next({ path: `/${lang}` });
|
||||||
|
} else if (to.meta.allAuthority &&
|
||||||
|
(
|
||||||
|
to.meta.allAuthority[0] === 'all' ||
|
||||||
|
(jurisdiction && jurisdiction.roleKey && to.meta.allAuthority.includes(jurisdiction.roleKey))
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return next();
|
||||||
|
} else {
|
||||||
|
// 无权限
|
||||||
|
Message({
|
||||||
|
showClose: true,
|
||||||
|
message: i18n.t(`mining.jurisdiction`),
|
||||||
|
type: 'error'
|
||||||
|
});
|
||||||
|
return next({ path: `/${lang}/login` });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
export default {
|
export default {
|
||||||
'401': '认证失败,无法访问系统资源,请重新登录',
|
// '401': '认证失败,无法访问系统资源,请重新登录',
|
||||||
'403': '当前操作没有权限',
|
'403': '当前操作没有权限',
|
||||||
'404': '访问资源不存在',
|
'404': '访问资源不存在',
|
||||||
'default': '系统未知错误,请反馈给管理员'
|
'default': '系统未知错误,请反馈给管理员'
|
||||||
|
|
|
@ -91,7 +91,7 @@ export const getImageUrl = (path) => {
|
||||||
const baseUrl = process.env.VUE_APP_BASE_URL;
|
const baseUrl = process.env.VUE_APP_BASE_URL;
|
||||||
if (!path) return '';
|
if (!path) return '';
|
||||||
if (path.startsWith('http')) {
|
if (path.startsWith('http')) {
|
||||||
return path.replace('https://test.m2pool.com', baseUrl);
|
return path.replace('http://test.m2pool.com', baseUrl);
|
||||||
}
|
}
|
||||||
return `${baseUrl}${path.startsWith('/') ? '' : '/'}${path}`;
|
return `${baseUrl}${path.startsWith('/') ? '' : '/'}${path}`;
|
||||||
};
|
};
|
||||||
|
|
|
@ -130,7 +130,7 @@ window.addEventListener('online', () => {
|
||||||
// 常见的加载状态
|
// 常见的加载状态
|
||||||
const commonLoadingProps = [
|
const commonLoadingProps = [
|
||||||
'minerChartLoading', 'reportBlockLoading', 'apiPageLoading',
|
'minerChartLoading', 'reportBlockLoading', 'apiPageLoading',
|
||||||
'MiningLoading', 'miniLoading'
|
'MiningLoading', 'miniLoading', 'bthLoading', 'editLoading'
|
||||||
];
|
];
|
||||||
|
|
||||||
commonLoadingProps.forEach(prop => {
|
commonLoadingProps.forEach(prop => {
|
||||||
|
@ -138,6 +138,15 @@ window.addEventListener('online', () => {
|
||||||
window.vm[prop] = false;
|
window.vm[prop] = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 重置所有以Loading结尾的状态
|
||||||
|
Object.keys(window.vm).forEach(key => {
|
||||||
|
if (key.endsWith('Loading')) {
|
||||||
|
window.vm[key] = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发网络重试完成事件
|
// 触发网络重试完成事件
|
||||||
|
@ -267,10 +276,10 @@ service.interceptors.response.use(res => {
|
||||||
type: 'warning'
|
type: 'warning'
|
||||||
}
|
}
|
||||||
).then(() => {
|
).then(() => {
|
||||||
window.vm.$router.push("/login")
|
window.vm.$router.push(`/${window.vm.$i18n.locale}/login`)
|
||||||
localStorage.removeItem('token')
|
localStorage.removeItem('token')
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
window.vm.$router.push("/")
|
window.vm.$router.push(`/${window.vm.$i18n.locale}/`)
|
||||||
localStorage.removeItem('token')
|
localStorage.removeItem('token')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -308,10 +317,20 @@ service.interceptors.response.use(res => {
|
||||||
|
|
||||||
},
|
},
|
||||||
error => {
|
error => {
|
||||||
if (error.message && error.message.includes('canceled') || error.message.includes('Request aborted')) {
|
|
||||||
// 主动取消的请求,直接忽略,不提示
|
// 主动取消的请求,直接忽略,不提示
|
||||||
return Promise.reject(error);
|
if (
|
||||||
|
error.code === 'ERR_CANCELED' ||
|
||||||
|
(error.message && error.message.includes('canceled')) ||
|
||||||
|
error.message?.includes('Request aborted')
|
||||||
|
) {
|
||||||
|
// 静默处理,不提示,不冒泡
|
||||||
|
return new Promise(() => {}); // 返回pending Promise,阻止控制台报错
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 请求异常也要移除 处理Request aborted 错误
|
// 请求异常也要移除 处理Request aborted 错误
|
||||||
if (error.config) {
|
if (error.config) {
|
||||||
const requestKey = getRequestKey(error.config);
|
const requestKey = getRequestKey(error.config);
|
||||||
|
|
|
@ -326,8 +326,8 @@ export default {
|
||||||
|
|
||||||
if (!this.activeCoin) {
|
if (!this.activeCoin) {
|
||||||
this.activeCoin = "nexa"
|
this.activeCoin = "nexa"
|
||||||
this.imgUrl = `https://test.m2pool.com/img/nexa.png`
|
this.imgUrl = `${this.$baseApi}/img/nexa.png`
|
||||||
this.currencyPath = `https://test.m2pool.com/img/nexa.png`
|
this.currencyPath = `${this.$baseApi}/img/nexa.png`
|
||||||
this.params.coin = "nexa"
|
this.params.coin = "nexa"
|
||||||
this.$addStorageEvent(1, `activeCoin`, JSON.stringify(this.activeCoin))
|
this.$addStorageEvent(1, `activeCoin`, JSON.stringify(this.activeCoin))
|
||||||
this.openAPI = true
|
this.openAPI = true
|
||||||
|
|
|
@ -73,13 +73,12 @@ export default {
|
||||||
this.activeCoin= JSON.parse(activeCoin)
|
this.activeCoin= JSON.parse(activeCoin)
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(this.activeCoin,"鸡脚低端局");
|
|
||||||
|
|
||||||
|
|
||||||
if ( !this.activeCoin ) {
|
if ( !this.activeCoin ) {
|
||||||
this.activeCoin ="nexa"
|
this.activeCoin ="nexa"
|
||||||
this.imgUrl = `https://test.m2pool.com/img/nexa.png`
|
this.imgUrl = `${this.$baseApi}/img/nexa.png`
|
||||||
this.currencyPath= `https://test.m2pool.com/img/nexa.png`
|
this.currencyPath= `${this.$baseApi}/img/nexa.png`
|
||||||
this.params.coin ="nexa"
|
this.params.coin ="nexa"
|
||||||
this.$addStorageEvent(1,`activeCoin`,JSON.stringify(this.activeCoin))
|
this.$addStorageEvent(1,`activeCoin`,JSON.stringify(this.activeCoin))
|
||||||
this.openAPI =true
|
this.openAPI =true
|
||||||
|
|
|
@ -422,21 +422,26 @@ export default {
|
||||||
}
|
}
|
||||||
.main {
|
.main {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
|
||||||
background: #fff;
|
background: #fff;
|
||||||
background-image: url(../../assets/img/miningAccount/top.png);
|
// background-image: url(../../assets/img/miningAccount/top.png);
|
||||||
background-size: 100% 50%;
|
// background-size: 100% 50%;
|
||||||
background-repeat: no-repeat;
|
// background-repeat: no-repeat;
|
||||||
background-position: 30% -15%;
|
// background-position: 30% -15%;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-top: 60PX;
|
// padding-top: 60PX;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
.content{
|
.content{
|
||||||
width: 50%;
|
width: 100%;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
}
|
}
|
||||||
.elBtn{
|
.elBtn{
|
||||||
background: #661FFB;
|
background: #661FFB;
|
||||||
|
|
|
@ -1962,7 +1962,7 @@ a{
|
||||||
transition: 0.3s all;
|
transition: 0.3s all;
|
||||||
}
|
}
|
||||||
.rateBox {
|
.rateBox {
|
||||||
width: 75%;
|
width: 90%;
|
||||||
height: 830px;
|
height: 830px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -2063,13 +2063,16 @@ a{
|
||||||
height: 35px;
|
height: 35px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
div {
|
div {
|
||||||
width: 75%;
|
box-sizing: border-box;
|
||||||
|
width: 95%;
|
||||||
display: flex;
|
display: flex;
|
||||||
height: 120px;
|
height: 120px;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
span {
|
span {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
import { listBroadcast, getAddBroadcast, updateBroadcast, DeleteBroadcast, getBroadcast,dataInfo } from '../../api/broadcast'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tableData: [
|
||||||
|
// {
|
||||||
|
// id: 1,
|
||||||
|
// createTime: "2025-06-24 10:00:00",
|
||||||
|
// content: "内isjisjfidjfjfjffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff容",
|
||||||
|
// createUser: "创建人",
|
||||||
|
// updateTime: "2025-06-24 10:00:00",
|
||||||
|
// updateUser: "修改人",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// id: 2,
|
||||||
|
// createTime: "2025-06-24 10:00:00",
|
||||||
|
// content: "内容",
|
||||||
|
// createUser: "创建人",
|
||||||
|
// updateTime: "2025-06-24 10:00:00",
|
||||||
|
// updateUser: "修改人",
|
||||||
|
// },
|
||||||
|
],
|
||||||
|
listParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 50
|
||||||
|
},
|
||||||
|
addParams: {
|
||||||
|
content: "",
|
||||||
|
},
|
||||||
|
editParams: {
|
||||||
|
content: "",
|
||||||
|
id: "",
|
||||||
|
},
|
||||||
|
dialogVisible: false,
|
||||||
|
bthLoading: false,
|
||||||
|
broadcastLoading: false,
|
||||||
|
editDialogVisible: false,
|
||||||
|
editLoading: false,
|
||||||
|
byteCount: "",
|
||||||
|
isOverLimit: false,
|
||||||
|
total: 0,
|
||||||
|
pageSizes: [50, 100, 300],
|
||||||
|
currentPage: 1,
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
|
||||||
|
let token
|
||||||
|
try{
|
||||||
|
token =JSON.parse(localStorage.getItem('token'))
|
||||||
|
}catch(e){
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
if (token) {
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async fetchList(params) {
|
||||||
|
|
||||||
|
this.setLoading('broadcastLoading', true);
|
||||||
|
const res = await listBroadcast(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.tableData = res.rows
|
||||||
|
this.total = res.total
|
||||||
|
}
|
||||||
|
this.setLoading('broadcastLoading', false);
|
||||||
|
},
|
||||||
|
async addBroadcast(params) {
|
||||||
|
this.setLoading('bthLoading', true);
|
||||||
|
const res = await getAddBroadcast(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.$message.success(this.$t("backendSystem.addSuccess"))
|
||||||
|
this.dialogVisible = false;
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
}
|
||||||
|
this.setLoading('bthLoading', false);
|
||||||
|
},
|
||||||
|
async getBroadcast(params) {
|
||||||
|
this.setLoading('editLoading', true);
|
||||||
|
const res = await dataInfo(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.editParams = res.data
|
||||||
|
this.editDialogVisible = true;
|
||||||
|
}
|
||||||
|
this.setLoading('editLoading', false);
|
||||||
|
},
|
||||||
|
async editBroadcast(params) {
|
||||||
|
this.setLoading('editLoading', true);
|
||||||
|
const res = await updateBroadcast(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.$message.success(this.$t("backendSystem.editSuccess"))
|
||||||
|
this.editDialogVisible = false;
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
}
|
||||||
|
this.setLoading('editLoading', false);
|
||||||
|
},
|
||||||
|
async deleteBroadcast(params) {
|
||||||
|
const res = await DeleteBroadcast(params)
|
||||||
|
if (res.code === 200) {
|
||||||
|
this.$message.success(this.$t("backendSystem.deleteSuccess"))
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handelAddBroadcast() {
|
||||||
|
this.dialogVisible = true;
|
||||||
|
},
|
||||||
|
handleClose() {
|
||||||
|
this.dialogVisible = false;
|
||||||
|
this.addParams.content = ""
|
||||||
|
this.setLoading('bthLoading', false);
|
||||||
|
},
|
||||||
|
sureAddBroadcast() {
|
||||||
|
|
||||||
|
this.addParams.content = this.addParams.content.trim()
|
||||||
|
this.addParams.content = this.addParams.content.replace(/[\r\n]/g, '');
|
||||||
|
if (!this.addParams.content) {
|
||||||
|
this.$message.warning(this.$t("backendSystem.pleaseInputContent"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.addBroadcast(this.addParams);
|
||||||
|
},
|
||||||
|
sureEditBroadcast() {
|
||||||
|
this.editParams.content=this.editParams.content.trim()
|
||||||
|
this.editParams.content = this.editParams.content.replace(/[\r\n]/g, '');
|
||||||
|
if (!this.editParams.content) {
|
||||||
|
this.$message.warning(this.$t("backendSystem.pleaseInputContent"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.editBroadcast(this.editParams);
|
||||||
|
},
|
||||||
|
handleEdit(row) {
|
||||||
|
|
||||||
|
this.getBroadcast({ id: row.id });
|
||||||
|
},
|
||||||
|
handleEditClose() {
|
||||||
|
this.editDialogVisible = false;
|
||||||
|
this.editParams.content = ""
|
||||||
|
this.setLoading('editLoading', false);
|
||||||
|
},
|
||||||
|
handelDelete(row) {
|
||||||
|
this.deleteBroadcast({ id: row.id });
|
||||||
|
},
|
||||||
|
getUtf8Bytes(str) {
|
||||||
|
let bytes = 0;
|
||||||
|
for (let i = 0; i < str.length; i++) {
|
||||||
|
const code = str.charCodeAt(i);
|
||||||
|
if (code <= 0x7f) bytes += 1;
|
||||||
|
else if (code <= 0x7ff) bytes += 2;
|
||||||
|
else if (code <= 0xffff) bytes += 3;
|
||||||
|
else bytes += 4;
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
},
|
||||||
|
|
||||||
|
handleInput(val, type = 'add') {
|
||||||
|
let bytes = this.getUtf8Bytes(val);
|
||||||
|
if (bytes > 100) {
|
||||||
|
this.isOverLimit = true;
|
||||||
|
// 截断到100字节
|
||||||
|
let newVal = '';
|
||||||
|
let total = 0;
|
||||||
|
for (let ch of val) {
|
||||||
|
let chBytes = this.getUtf8Bytes(ch);
|
||||||
|
if (total + chBytes > 100) break;
|
||||||
|
newVal += ch;
|
||||||
|
total += chBytes;
|
||||||
|
}
|
||||||
|
if (type === 'add') {
|
||||||
|
this.addParams.content = newVal;
|
||||||
|
} else {
|
||||||
|
this.editParams.content = newVal;
|
||||||
|
}
|
||||||
|
bytes = total;
|
||||||
|
} else {
|
||||||
|
this.isOverLimit = false;
|
||||||
|
if (type === 'add') {
|
||||||
|
this.addParams.content = val;
|
||||||
|
} else {
|
||||||
|
this.editParams.content = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.byteCount = bytes;
|
||||||
|
},
|
||||||
|
|
||||||
|
handelTime(time) {
|
||||||
|
return `${time.split("T")[0]} ${time.split("T")[1]}`
|
||||||
|
},
|
||||||
|
handleSizeChange(val) {
|
||||||
|
console.log(`每页 ${val} 条`);
|
||||||
|
this.listParams.pageSize = val
|
||||||
|
this.listParams.pageNum = 1
|
||||||
|
this.currentPage = 1
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
|
||||||
|
},
|
||||||
|
handleCurrentChange(val) {
|
||||||
|
console.log(`当前页: ${val}`);
|
||||||
|
this.listParams.pageNum = val
|
||||||
|
this.fetchList(this.listParams);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,234 @@
|
||||||
|
<template>
|
||||||
|
<div v-loading="broadcastLoading">
|
||||||
|
<div class="main-title-box">
|
||||||
|
<div class="main-title">{{ $t("backendSystem.publishedBroadcast") }}</div>
|
||||||
|
<el-button class="add-btn" @click="handelAddBroadcast"
|
||||||
|
>{{ $t("backendSystem.addBroadcast") }}
|
||||||
|
<i class="iconfont icon-youjiantou1 arrow"></i
|
||||||
|
></el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
border
|
||||||
|
style="width: 100%; margin-bottom: 18px"
|
||||||
|
:header-cell-style="{ 'text-align': 'center' }"
|
||||||
|
:cell-style="{ 'text-align': 'center' }"
|
||||||
|
height="60vh"
|
||||||
|
>
|
||||||
|
<el-table-column prop="id" label="ID" width="60" show-overflow-tooltip />
|
||||||
|
<el-table-column
|
||||||
|
prop="createTime"
|
||||||
|
:label="$t('backendSystem.createTime')"
|
||||||
|
width="160"
|
||||||
|
show-overflow-tooltip
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ handelTime(scope.row.createTime) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="content"
|
||||||
|
:label="$t('backendSystem.content')"
|
||||||
|
show-overflow-tooltip
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="createUser"
|
||||||
|
:label="$t('backendSystem.createUser')"
|
||||||
|
width="160"
|
||||||
|
show-overflow-tooltip
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="updateTime"
|
||||||
|
:label="$t('backendSystem.updateTime')"
|
||||||
|
width="160"
|
||||||
|
show-overflow-tooltip
|
||||||
|
>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
{{ handelTime(scope.row.updateTime) }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
prop="updateUser"
|
||||||
|
:label="$t('backendSystem.updateUser')"
|
||||||
|
width="160"
|
||||||
|
show-overflow-tooltip
|
||||||
|
/>
|
||||||
|
|
||||||
|
<el-table-column :label="$t('backendSystem.operation')" width="160">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button size="mini" @click="handleEdit(scope.row)">{{
|
||||||
|
$t("backendSystem.edit")
|
||||||
|
}}</el-button>
|
||||||
|
|
||||||
|
<el-popconfirm
|
||||||
|
:confirm-button-text="$t(`work.confirm`)"
|
||||||
|
:cancel-button-text="$t(`work.cancel`)"
|
||||||
|
icon="el-icon-info"
|
||||||
|
icon-color="red"
|
||||||
|
:title="$t(`alerts.deleteRemind`)"
|
||||||
|
@confirm="handelDelete(scope.row)"
|
||||||
|
>
|
||||||
|
<el-button class="elBtn" size="mini" slot="reference">{{
|
||||||
|
$t(`personal.delete`)
|
||||||
|
}}</el-button>
|
||||||
|
</el-popconfirm>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24" style="display: flex; justify-content: center">
|
||||||
|
<el-pagination
|
||||||
|
style="margin: 0 auto; margin-top: 10px"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:current-page.sync="currentPage"
|
||||||
|
:page-sizes="pageSizes"
|
||||||
|
:page-size="listParams.pageSize"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="total"
|
||||||
|
>
|
||||||
|
</el-pagination>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<!-- 新增广播弹窗 -->
|
||||||
|
<el-dialog
|
||||||
|
:title="$t('backendSystem.dialogTitle')"
|
||||||
|
:visible.sync="dialogVisible"
|
||||||
|
width="50%"
|
||||||
|
:before-close="handleClose"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form :model="addParams">
|
||||||
|
<!-- v-if="isOverLimit" -->
|
||||||
|
<el-form-item>
|
||||||
|
<el-input
|
||||||
|
resize="none"
|
||||||
|
v-model="addParams.content"
|
||||||
|
type="textarea"
|
||||||
|
:rows="5"
|
||||||
|
@input="(val) => handleInput(val, 'add')"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
color: #999;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 4px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<span v-if="isOverLimit">
|
||||||
|
{{ $t("backendSystem.exceedingInput") }}</span
|
||||||
|
>
|
||||||
|
<span> {{ $t("backendSystem.newlineInvalid") }}</span>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="handleClose">{{
|
||||||
|
$t("backendSystem.cancel")
|
||||||
|
}}</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
:loading="bthLoading"
|
||||||
|
@click="sureAddBroadcast"
|
||||||
|
>{{ $t("backendSystem.publish") }}</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
<!-- 修改广播弹窗 -->
|
||||||
|
<el-dialog
|
||||||
|
:title="$t('backendSystem.editContent')"
|
||||||
|
:visible.sync="editDialogVisible"
|
||||||
|
width="50%"
|
||||||
|
:before-close="handleEditClose"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form :model="editParams">
|
||||||
|
<el-form-item>
|
||||||
|
<el-input
|
||||||
|
resize="none"
|
||||||
|
v-model="editParams.content"
|
||||||
|
type="textarea"
|
||||||
|
:rows="5"
|
||||||
|
@input="(val) => handleInput(val, 'edit')"
|
||||||
|
/>
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
color: #999;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 4px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<span v-if="isOverLimit">
|
||||||
|
{{ $t("backendSystem.exceedingInput") }}</span
|
||||||
|
>
|
||||||
|
<span> {{ $t("backendSystem.newlineInvalid") }}</span>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="handleEditClose">{{
|
||||||
|
$t("backendSystem.cancel")
|
||||||
|
}}</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
:loading="editLoading"
|
||||||
|
@click="sureEditBroadcast"
|
||||||
|
>{{ $t("backendSystem.editBroadcast") }}</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Index from "./index";
|
||||||
|
export default {
|
||||||
|
mixins: [Index],
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.main-title-box {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
.add-btn {
|
||||||
|
background: #661ffb;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
margin-left: 28px;
|
||||||
|
border-radius: 20px;
|
||||||
|
padding: 10px 20px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
.arrow {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.add-btn:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.elBtn {
|
||||||
|
background: #e60751;
|
||||||
|
color: #fff;
|
||||||
|
border: none;
|
||||||
|
margin-left: 18px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -123,6 +123,7 @@
|
||||||
v-else-if="currentContact"
|
v-else-if="currentContact"
|
||||||
size="small"
|
size="small"
|
||||||
type="info"
|
type="info"
|
||||||
|
style="cursor: pointer;"
|
||||||
@click="
|
@click="
|
||||||
toggleImportant(
|
toggleImportant(
|
||||||
currentContact.roomId,
|
currentContact.roomId,
|
||||||
|
@ -279,6 +280,7 @@
|
||||||
:rows="3"
|
:rows="3"
|
||||||
:maxlength="400"
|
:maxlength="400"
|
||||||
:disabled="!currentContact"
|
:disabled="!currentContact"
|
||||||
|
resize="none"
|
||||||
:placeholder="
|
:placeholder="
|
||||||
$t(`chat.inputMessage`) ||
|
$t(`chat.inputMessage`) ||
|
||||||
`请输入消息,按Enter键发送,按Ctrl+Enter键换行`
|
`请输入消息,按Enter键发送,按Ctrl+Enter键换行`
|
||||||
|
@ -431,7 +433,7 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
async created() {
|
created() {
|
||||||
try {
|
try {
|
||||||
let userEmail = localStorage.getItem("userEmail");
|
let userEmail = localStorage.getItem("userEmail");
|
||||||
this.userEmail = JSON.parse(userEmail);
|
this.userEmail = JSON.parse(userEmail);
|
||||||
|
@ -441,11 +443,11 @@ export default {
|
||||||
});
|
});
|
||||||
|
|
||||||
// 获取聊天室列表
|
// 获取聊天室列表
|
||||||
await this.fetchRoomList();
|
this.fetchRoomList();
|
||||||
// 在组件创建时加载手动创建的聊天室
|
// 在组件创建时加载手动创建的聊天室
|
||||||
this.loadManualCreatedRooms();
|
this.loadManualCreatedRooms();
|
||||||
|
|
||||||
console.log(this.userEmail, "初始化的时候");
|
console.log("mounted userEmail=", userEmail, "parsed=", this.userEmail);
|
||||||
// 初始化 WebSocket 连接
|
// 初始化 WebSocket 连接
|
||||||
this.initWebSocket();
|
this.initWebSocket();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -453,6 +455,8 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
|
|
||||||
|
|
||||||
// 获取聊天室列表
|
// 获取聊天室列表
|
||||||
await this.fetchRoomList();
|
await this.fetchRoomList();
|
||||||
|
|
||||||
|
@ -575,6 +579,9 @@ export default {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log("走这里了嘛 家电节爱哦都觉得久啊是哦大点击");
|
||||||
|
|
||||||
|
|
||||||
// 防止重复初始化
|
// 防止重复初始化
|
||||||
if (this.stompClient && this.stompClient.state !== "DISCONNECTED") {
|
if (this.stompClient && this.stompClient.state !== "DISCONNECTED") {
|
||||||
console.log("WebSocket正在连接中,跳过初始化");
|
console.log("WebSocket正在连接中,跳过初始化");
|
||||||
|
@ -642,11 +649,12 @@ export default {
|
||||||
this.subscribeToMessages();
|
this.subscribeToMessages();
|
||||||
this.updateLastActivityTime();
|
this.updateLastActivityTime();
|
||||||
|
|
||||||
// === 启动心跳检测 ===
|
// === 暂时禁用心跳和连接检查,避免误判 ===
|
||||||
this.startHeartbeat();
|
// this.startHeartbeat();
|
||||||
|
// this.startConnectionCheck();
|
||||||
|
|
||||||
// === 启动连接状态检查 ===
|
// 只依赖 STOMP 内置心跳和订阅成功状态
|
||||||
this.startConnectionCheck();
|
console.log("✅ 连接成功,只使用 STOMP 内置心跳机制");
|
||||||
|
|
||||||
// === 注意:不在这里启动验证,而是在订阅成功后 ===
|
// === 注意:不在这里启动验证,而是在订阅成功后 ===
|
||||||
console.log("⚡ 客服连接成功,等待订阅完成后验证");
|
console.log("⚡ 客服连接成功,等待订阅完成后验证");
|
||||||
|
@ -707,11 +715,10 @@ export default {
|
||||||
console.log("📢 客服订阅成功,立即标记连接已验证");
|
console.log("📢 客服订阅成功,立即标记连接已验证");
|
||||||
this.markConnectionVerified();
|
this.markConnectionVerified();
|
||||||
|
|
||||||
// 确保连接状态正确
|
// 强制确保连接状态正确
|
||||||
if (this.connectionStatus !== "connected") {
|
this.isWebSocketConnected = true;
|
||||||
console.log("📡 修正客服连接状态为connected");
|
|
||||||
this.connectionStatus = "connected";
|
this.connectionStatus = "connected";
|
||||||
}
|
console.log("✅ 强制设置连接状态为已连接");
|
||||||
} else {
|
} else {
|
||||||
console.error("❌ 客服订阅失败,返回空subscription");
|
console.error("❌ 客服订阅失败,返回空subscription");
|
||||||
// 如果订阅失败,启动验证机制等待超时重连
|
// 如果订阅失败,启动验证机制等待超时重连
|
||||||
|
@ -1727,6 +1734,10 @@ export default {
|
||||||
this.updateLastActivityTime(); // 收到消息也是一种活动
|
this.updateLastActivityTime(); // 收到消息也是一种活动
|
||||||
this.lastHeartbeatTime = Date.now(); // 更新心跳时间
|
this.lastHeartbeatTime = Date.now(); // 更新心跳时间
|
||||||
|
|
||||||
|
// 强制确保连接状态正确(收到消息说明连接肯定是好的)
|
||||||
|
this.isWebSocketConnected = true;
|
||||||
|
this.connectionStatus = "connected";
|
||||||
|
|
||||||
const msg = JSON.parse(message.body);
|
const msg = JSON.parse(message.body);
|
||||||
console.log("客服收到的消息", msg);
|
console.log("客服收到的消息", msg);
|
||||||
|
|
||||||
|
@ -3657,14 +3668,45 @@ export default {
|
||||||
localStorage.setItem(key, String(count));
|
localStorage.setItem(key, String(count));
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* 监听storage事件,实现多窗口未读同步
|
* 监听storage事件,实现多窗口未读同步和登录状态同步
|
||||||
*/
|
*/
|
||||||
handleStorageChange(e) {
|
handleStorageChange(e) {
|
||||||
|
// 监听未读消息同步
|
||||||
if (e.key && e.key.startsWith("cs_unread_")) {
|
if (e.key && e.key.startsWith("cs_unread_")) {
|
||||||
const roomId = e.key.replace("cs_unread_", "");
|
const roomId = e.key.replace("cs_unread_", "");
|
||||||
const count = parseInt(e.newValue, 10) || 0;
|
const count = parseInt(e.newValue, 10) || 0;
|
||||||
const contact = this.contacts.find((c) => c.roomId == roomId);
|
const contact = this.contacts.find((c) => c.roomId == roomId);
|
||||||
if (contact) contact.unread = count;
|
if (contact) contact.unread = count;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 监听登录状态同步 - 当userEmail被清除时表示用户已退出登录
|
||||||
|
if (e.key === "userEmail" && e.oldValue && (!e.newValue || e.newValue === "null")) {
|
||||||
|
this.handleLogoutSync();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理多窗口登录状态同步
|
||||||
|
*/
|
||||||
|
handleLogoutSync() {
|
||||||
|
try {
|
||||||
|
// 断开WebSocket连接
|
||||||
|
this.forceDisconnectAll();
|
||||||
|
|
||||||
|
// 清除本地数据
|
||||||
|
this.userEmail = "";
|
||||||
|
this.currentContactId = null;
|
||||||
|
this.contacts = [];
|
||||||
|
this.messages = {};
|
||||||
|
this.inputMessage = "";
|
||||||
|
this.isWebSocketConnected = false;
|
||||||
|
this.connectionStatus = "disconnected";
|
||||||
|
|
||||||
|
// 跳转到首页
|
||||||
|
this.$router.replace("/");
|
||||||
|
} catch (error) {
|
||||||
|
this.$router.replace("/");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
import { watch } from "vue";
|
import { watch } from "vue";
|
||||||
import { getCoinInfo, getPoolPower, getMinerCount, getLuck, getBlockInfo, getNetPower, getParam } from "../../api/home"
|
import { getCoinInfo, getPoolPower, getMinerCount, getLuck, getBlockInfo, getNetPower, getParam } from "../../api/home"
|
||||||
|
import { listBroadcast,getBroadcast} from "../../api/broadcast"
|
||||||
import { line } from "../../utils/echarts";
|
import { line } from "../../utils/echarts";
|
||||||
import * as echarts from "echarts";
|
import * as echarts from "echarts";
|
||||||
import { Debounce, throttle } from "../../utils/publicMethods";
|
import { Debounce, throttle } from "../../utils/publicMethods";
|
||||||
|
@ -768,13 +768,29 @@ export default {
|
||||||
|
|
||||||
},
|
},
|
||||||
isInternalChange: false,
|
isInternalChange: false,
|
||||||
|
broadcastList: [
|
||||||
|
{ id: `b1`, content: this.$t(`home.describe`) },
|
||||||
|
|
||||||
|
],
|
||||||
|
currentBroadcastIndex: 0,
|
||||||
|
scrollTimer: null,
|
||||||
|
isTransition: true,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
// 末尾加一条"克隆的第一条"用于无缝滚动
|
||||||
|
broadcastListForLoop() {
|
||||||
|
if (this.broadcastList.length === 0) return [];
|
||||||
|
if (this.broadcastList.length === 1) return this.broadcastList;
|
||||||
|
return [...this.broadcastList, this.broadcastList[0]];
|
||||||
|
},
|
||||||
|
scrollStyle() {
|
||||||
|
return {
|
||||||
|
transform: `translateY(-${this.currentBroadcastIndex * 30}px)`,
|
||||||
|
transition: this.isTransition ? 'transform 0.5s cubic-bezier(.4,0,.2,1)' : 'none',
|
||||||
|
};
|
||||||
|
},
|
||||||
|
},
|
||||||
watch: {
|
watch: {
|
||||||
"$i18n.locale": (val) => {
|
"$i18n.locale": (val) => {
|
||||||
location.reload();//刷新页面 刷新echarts
|
location.reload();//刷新页面 刷新echarts
|
||||||
|
@ -792,9 +808,6 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.lang = this.$i18n.locale; // 初始化语言值
|
this.lang = this.$i18n.locale; // 初始化语言值
|
||||||
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(this.currencyList[0]))
|
this.$addStorageEvent(1, `activeItemCoin`, JSON.stringify(this.currencyList[0]))
|
||||||
this.minerChartLoading = true
|
this.minerChartLoading = true
|
||||||
|
@ -889,7 +902,7 @@ export default {
|
||||||
|
|
||||||
this.$addStorageEvent(1, `currencyList`, JSON.stringify(this.currencyList))
|
this.$addStorageEvent(1, `currencyList`, JSON.stringify(this.currencyList))
|
||||||
if (this.$refs.select) {
|
if (this.$refs.select) {
|
||||||
this.$refs.select.$el.children[0].children[0].setAttribute('style', "background:url(https://test.m2pool.com/img/nexa.png) no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 30PX;");
|
this.$refs.select.$el.children[0].children[0].setAttribute('style', `background:url(${this.$baseApi}/img/nexa.png) no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 30PX;`);
|
||||||
|
|
||||||
}
|
}
|
||||||
this.fetchParam({ coin: this.params.coin })
|
this.fetchParam({ coin: this.params.coin })
|
||||||
|
@ -903,11 +916,38 @@ export default {
|
||||||
this.activeItemCoin = JSON.parse(value)
|
this.activeItemCoin = JSON.parse(value)
|
||||||
|
|
||||||
});
|
});
|
||||||
|
// this.getBroadcastList({pageNum:1,pageSize:100})
|
||||||
|
|
||||||
|
this.getBroadcastList({lang:this.$i18n.locale})
|
||||||
|
this.startScroll();
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
|
||||||
|
this.startScroll();
|
||||||
|
});
|
||||||
|
window.addEventListener('resize', this.setItemHeight);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
//获取广播列表
|
||||||
|
async getBroadcastList(params){
|
||||||
|
// const data = await listBroadcast(params)
|
||||||
|
const data = await getBroadcast(params)
|
||||||
|
|
||||||
|
if (data && data.code == 200) {
|
||||||
|
this.broadcastList =[...this.broadcastList,...data.data]
|
||||||
|
this.currentBroadcastIndex = 0; // 新数据时重置索引
|
||||||
|
if(this.broadcastList.length > 1){
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.startScroll();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
handelOptionYAxis(option){
|
handelOptionYAxis(option){
|
||||||
const yAxis = option.yAxis[0]; // 第一个 Y 轴
|
const yAxis = option.yAxis[0]; // 第一个 Y 轴
|
||||||
|
@ -1100,6 +1140,8 @@ export default {
|
||||||
// let leftYMaxData = Math.max(...pvData);
|
// let leftYMaxData = Math.max(...pvData);
|
||||||
// this.option.yAxis[0].max =leftYMaxData*2
|
// this.option.yAxis[0].max =leftYMaxData*2
|
||||||
this.option.xAxis.data = xData
|
this.option.xAxis.data = xData
|
||||||
|
|
||||||
|
this.option.yAxis[0].name = chartData[0].unit
|
||||||
this.option.series[0].data = pvData
|
this.option.series[0].data = pvData
|
||||||
// this.option.series[1].data = rejectRate
|
// this.option.series[1].data = rejectRate
|
||||||
this.option.series[1].data = price
|
this.option.series[1].data = price
|
||||||
|
@ -1159,6 +1201,7 @@ export default {
|
||||||
|
|
||||||
|
|
||||||
this.minerOption.xAxis.data = xData
|
this.minerOption.xAxis.data = xData
|
||||||
|
this.minerOption.yAxis[0].name = MinerCount[0].unit
|
||||||
this.minerOption.series[0].data = pvData
|
this.minerOption.series[0].data = pvData
|
||||||
this.minerOption.series[1].data = price
|
this.minerOption.series[1].data = price
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
@ -1683,10 +1726,31 @@ scrollRight() {
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
startScroll() {
|
||||||
|
if (this.scrollTimer) clearInterval(this.scrollTimer);
|
||||||
|
// 只有多于1条才滚动
|
||||||
|
if (this.broadcastList.length <= 1) return;
|
||||||
|
this.scrollTimer = setInterval(this.nextScroll, 3000);
|
||||||
|
},
|
||||||
|
stopScroll() {
|
||||||
|
if (this.scrollTimer) clearInterval(this.scrollTimer);
|
||||||
|
this.scrollTimer = null;
|
||||||
|
},
|
||||||
|
nextScroll() {
|
||||||
|
if (this.broadcastList.length <= 1) return;
|
||||||
|
this.isTransition = true;
|
||||||
|
this.currentBroadcastIndex += 1;
|
||||||
|
// 如果到"克隆的第一条",0.5s后瞬间跳回真正的第一条
|
||||||
|
if (this.currentBroadcastIndex === this.broadcastList.length) {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.isTransition = false;
|
||||||
|
this.currentBroadcastIndex = 0;
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
if (this.scrollTimer) clearInterval(this.scrollTimer);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,16 +1,17 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<section v-if="$isMobile">
|
<section v-if="$isMobile">
|
||||||
|
|
||||||
<div class="imgTop">
|
<div class="imgTop">
|
||||||
<img src="../../assets/mobile/home/home.png" alt="mining" loading="lazy" />
|
<img
|
||||||
|
src="../../assets/mobile/home/home.png"
|
||||||
|
alt="mining"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
<!--
|
<!--
|
||||||
<img v-if="lang == 'zh'" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
<img v-if="lang == 'zh'" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
||||||
<img v-else src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
<img v-else src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="currencySelect">
|
<div class="currencySelect">
|
||||||
<el-menu class="el-menu-demo" mode="horizontal">
|
<el-menu class="el-menu-demo" mode="horizontal">
|
||||||
<el-submenu index="1" style="background: transparent">
|
<el-submenu index="1" style="background: transparent">
|
||||||
|
@ -22,20 +23,21 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<ul class="moveCurrencyBox">
|
<ul class="moveCurrencyBox">
|
||||||
<li @click="clickCurrency(item)" v-for="item in currencyList" :key="item.value">
|
<li
|
||||||
|
@click="clickCurrency(item)"
|
||||||
|
v-for="item in currencyList"
|
||||||
|
:key="item.value"
|
||||||
|
>
|
||||||
<img :src="item.img" alt="coin" loading="lazy" />
|
<img :src="item.img" alt="coin" loading="lazy" />
|
||||||
<p>{{ item.label }}</p>
|
<p>{{ item.label }}</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
|
||||||
</el-submenu>
|
</el-submenu>
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="miningPoolLeft" v-loading="minerChartLoading">
|
<div class="miningPoolLeft" v-loading="minerChartLoading">
|
||||||
<div class="interval">
|
<div class="interval">
|
||||||
|
|
||||||
<div class="chartBth">
|
<div class="chartBth">
|
||||||
<div class="slideBox">
|
<div class="slideBox">
|
||||||
<span
|
<span
|
||||||
|
@ -70,11 +72,32 @@
|
||||||
<div
|
<div
|
||||||
id="minerChart"
|
id="minerChart"
|
||||||
v-if="!powerActive"
|
v-if="!powerActive"
|
||||||
style="width: 100%; height: 100%;min-width: 200px;min-height: 380px;"
|
style="width: 100%; height: 100%; min-width: 200px; min-height: 380px"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
<section class="describeBox2">
|
<section class="describeBox">
|
||||||
<p> <i class="iconfont icon-tishishuoming "></i><span class="describeTitle">{{ $t(`home.describeTitle`) }}</span>{{ $t(`home.describe`) }} <span class="view" @click="handelJump(`/allocationExplanation`)"> {{ $t(`home.view`) }} </span> </p>
|
<p class="describe-row">
|
||||||
|
<i class="iconfont icon-tishishuoming"></i>
|
||||||
|
<span class="describeTitle">{{ $t(`home.describeTitle`) }}</span>
|
||||||
|
<span class="broadcast-scroll-wrap">
|
||||||
|
<div
|
||||||
|
class="broadcast-scroll-list"
|
||||||
|
:style="scrollStyle"
|
||||||
|
ref="scrollList"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="(item, idx) in broadcastListForLoop"
|
||||||
|
:key="item.id + '-' + idx"
|
||||||
|
class="broadcast-scroll-item"
|
||||||
|
>
|
||||||
|
{{ item.content }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</span>
|
||||||
|
<span class="view" @click="handelJump(`/allocationExplanation`)">
|
||||||
|
{{ $t(`home.view`) }}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
</section>
|
</section>
|
||||||
<div class="miningPoolRight">
|
<div class="miningPoolRight">
|
||||||
<ul class="dataBlockBox">
|
<ul class="dataBlockBox">
|
||||||
|
@ -86,7 +109,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/power1.svg" alt="power" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/power1.svg"
|
||||||
|
alt="power"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
||||||
|
@ -99,7 +126,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/算力.svg" alt="Computing power" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/算力.svg"
|
||||||
|
alt="Computing power"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
||||||
|
@ -112,7 +143,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/难度.svg" alt="difficulty" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/难度.svg"
|
||||||
|
alt="difficulty"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<!-- <li>
|
<!-- <li>
|
||||||
|
@ -147,7 +182,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/高度资源 26.svg" alt="height" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/高度资源 26.svg"
|
||||||
|
alt="height"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -161,7 +200,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/币价资源 19.svg" alt="Currency price" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/币价资源 19.svg"
|
||||||
|
alt="Currency price"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -174,7 +217,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/费率.svg" alt="Currency price" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/费率.svg"
|
||||||
|
alt="Currency price"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
|
@ -188,7 +235,11 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/计算器.svg" alt="Profit Calculator" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/计算器.svg"
|
||||||
|
alt="Profit Calculator"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
|
@ -202,7 +253,11 @@
|
||||||
<p class="content"></p>
|
<p class="content"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/接入矿池.svg" alt="Connect to the mining pool" loading="lazy"/>
|
<img
|
||||||
|
src="../../assets/img/接入矿池.svg"
|
||||||
|
alt="Connect to the mining pool"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -237,7 +292,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- 收益计算器 -->
|
<!-- 收益计算器 -->
|
||||||
<section class="Calculator" v-show="showCalculator">
|
<section class="Calculator" v-show="showCalculator">
|
||||||
<div class="prop">
|
<div class="prop">
|
||||||
|
@ -273,7 +327,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="content2">
|
<div class="content2">
|
||||||
|
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<p class="power">{{ $t(`home.Power`) }}:</p>
|
<p class="power">{{ $t(`home.Power`) }}:</p>
|
||||||
<el-input
|
<el-input
|
||||||
|
@ -293,7 +346,6 @@
|
||||||
<el-option label="TH/s" value="TH/s"></el-option>
|
<el-option label="TH/s" value="TH/s"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-input>
|
</el-input>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<p class="time">{{ $t(`home.time`) }}:</p>
|
<p class="time">{{ $t(`home.time`) }}:</p>
|
||||||
|
@ -319,22 +371,21 @@
|
||||||
:placeholder="$t(`mining.profit`)"
|
:placeholder="$t(`mining.profit`)"
|
||||||
></el-input>
|
></el-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
<div class="content" v-else v-loading="minerChartLoading">
|
<div class="content" v-else v-loading="minerChartLoading">
|
||||||
|
|
||||||
<div class="bgBox">
|
<div class="bgBox">
|
||||||
<!--
|
<!--
|
||||||
<img v-if="lang == 'zh'" class="bgBoxImg2Img" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
<img v-if="lang == 'zh'" class="bgBoxImg2Img" src="../../assets/img/enx推广.png" alt="mining" loading="lazy"/>
|
||||||
<img v-else class="bgBoxImg2Img" src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
<img v-else class="bgBoxImg2Img" src="../../assets/img/enx英文推广.png" alt="mining" loading="lazy"/> -->
|
||||||
<img class="bgImg" src="../../assets/img/home.png" alt="mining" loading="lazy"/>
|
<img
|
||||||
|
class="bgImg"
|
||||||
|
src="../../assets/img/home.png"
|
||||||
|
alt="mining"
|
||||||
|
loading="lazy"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
||||||
|
@ -365,9 +416,33 @@
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
<!-- 广播 -->
|
||||||
<section class="describeBox">
|
<section class="describeBox">
|
||||||
<p> <i class="iconfont icon-tishishuoming "></i><span class="describeTitle">{{ $t(`home.describeTitle`) }}</span>{{ $t(`home.describe`) }} <span class="view" @click="handelJump(`/allocationExplanation`)"> {{ $t(`home.view`) }} </span> </p>
|
<div class="describe-row">
|
||||||
|
|
||||||
|
<div class="broadcast-scroll-wrap">
|
||||||
|
<div class="broadcast-scroll-list" @mouseenter="stopScroll"
|
||||||
|
@mouseleave="startScroll" :style="scrollStyle">
|
||||||
|
<div
|
||||||
|
v-for="item in broadcastList"
|
||||||
|
:key="item.id"
|
||||||
|
class="broadcast-scroll-item"
|
||||||
|
>
|
||||||
|
|
||||||
|
<i class="iconfont icon-tishishuoming"></i>
|
||||||
|
<span class="describeTitle">{{ $t(`home.describeTitle`) }}</span>
|
||||||
|
<span :title="item.content"> {{ item.content }}</span>
|
||||||
|
<span
|
||||||
|
class="view"
|
||||||
|
v-show="item.id == 'b1'"
|
||||||
|
@click="handelJump(`/allocationExplanation`)"
|
||||||
|
>
|
||||||
|
{{ $t(`home.view`) }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
<div class="contentBox">
|
<div class="contentBox">
|
||||||
<!-- 算力图 -->
|
<!-- 算力图 -->
|
||||||
|
@ -375,10 +450,16 @@
|
||||||
<div class="currencyDescription2">
|
<div class="currencyDescription2">
|
||||||
<section class="miningPoolBox">
|
<section class="miningPoolBox">
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
||||||
<div class="miningPoolLeft" v-loading="minerChartLoading" v-loading-recovery="{ loading: 'minerChartLoading', recovery: ['getPoolPowerData', 'fetchNetPower'] }">
|
<div
|
||||||
|
class="miningPoolLeft"
|
||||||
|
v-loading="minerChartLoading"
|
||||||
|
v-loading-recovery="{
|
||||||
|
loading: 'minerChartLoading',
|
||||||
|
recovery: ['getPoolPowerData', 'fetchNetPower'],
|
||||||
|
}"
|
||||||
|
>
|
||||||
<div class="interval">
|
<div class="interval">
|
||||||
<div class="chartBth">
|
<div class="chartBth">
|
||||||
|
|
||||||
<div class="slideBox">
|
<div class="slideBox">
|
||||||
<span
|
<span
|
||||||
@click="handelPower"
|
@click="handelPower"
|
||||||
|
@ -391,12 +472,16 @@
|
||||||
>{{ $t(`home.networkPower`) }}</span
|
>{{ $t(`home.networkPower`) }}</span
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="timeBox" style="text-align: right;padding-right: 35px;margin-bottom: 8px;">
|
<div
|
||||||
|
class="timeBox"
|
||||||
|
style="
|
||||||
|
text-align: right;
|
||||||
|
padding-right: 35px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
"
|
||||||
|
>
|
||||||
<span
|
<span
|
||||||
:class="{ timeActive: timeActive == item.value }"
|
:class="{ timeActive: timeActive == item.value }"
|
||||||
class="times"
|
class="times"
|
||||||
|
@ -423,7 +508,7 @@
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
||||||
<div class="miningPoolRight">
|
<div class="miningPoolRight">
|
||||||
<ul class="dataBlockBox">
|
<ul class="dataBlockBox">
|
||||||
<li :class="{'dataBlock': this.params.coin !== 'enx'}">
|
<li :class="{ dataBlock: this.params.coin !== 'enx' }">
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p :title="$t(`home.power`)">{{ $t(`home.power`) }}</p>
|
<p :title="$t(`home.power`)">{{ $t(`home.power`) }}</p>
|
||||||
<p class="content" :title="CoinData.poolPower">
|
<p class="content" :title="CoinData.poolPower">
|
||||||
|
@ -444,7 +529,10 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/算力.svg" alt="Computing power" />
|
<img
|
||||||
|
src="../../assets/img/算力.svg"
|
||||||
|
alt="Computing power"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
<li class="dataBlock" v-if="this.params.coin !== 'enx'">
|
||||||
|
@ -481,7 +569,10 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/算法资源 24.svg" alt="algorithm" />
|
<img
|
||||||
|
src="../../assets/img/算法资源 24.svg"
|
||||||
|
alt="algorithm"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="this.params.coin !== 'enx'">
|
<li v-if="this.params.coin !== 'enx'">
|
||||||
|
@ -494,7 +585,10 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/高度资源 26.svg" alt="height" />
|
<img
|
||||||
|
src="../../assets/img/高度资源 26.svg"
|
||||||
|
alt="height"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -504,10 +598,14 @@
|
||||||
{{ $t(`home.coinValue`) }}
|
{{ $t(`home.coinValue`) }}
|
||||||
</p>
|
</p>
|
||||||
<p :title="CoinData.price" class="content">
|
<p :title="CoinData.price" class="content">
|
||||||
{{ CoinData.price }} </p>
|
{{ CoinData.price }}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/币价资源 19.svg" alt="Currency price" />
|
<img
|
||||||
|
src="../../assets/img/币价资源 19.svg"
|
||||||
|
alt="Currency price"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
|
@ -515,12 +613,19 @@
|
||||||
<p :title="$t(`home.mode`)">
|
<p :title="$t(`home.mode`)">
|
||||||
{{ $t(`home.mode`) }}
|
{{ $t(`home.mode`) }}
|
||||||
</p>
|
</p>
|
||||||
<p :title="CoinData.price" class="content" style="font-size: 0.8rem;margin-right: 5px;">
|
<p
|
||||||
{{ CoinData.model }} / {{ CoinData.fee }}%</p>
|
:title="CoinData.price"
|
||||||
|
class="content"
|
||||||
|
style="font-size: 0.8rem; margin-right: 5px"
|
||||||
|
>
|
||||||
|
{{ CoinData.model }} / {{ CoinData.fee }}%
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/费率.svg" alt="Profit Calculator" />
|
<img
|
||||||
|
src="../../assets/img/费率.svg"
|
||||||
|
alt="Profit Calculator"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
|
@ -534,7 +639,10 @@
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/计算器.svg" alt="Profit Calculator" />
|
<img
|
||||||
|
src="../../assets/img/计算器.svg"
|
||||||
|
alt="Profit Calculator"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li
|
<li
|
||||||
|
@ -548,7 +656,10 @@
|
||||||
<p class="content"></p>
|
<p class="content"></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="imgIcon">
|
<div class="imgIcon">
|
||||||
<img src="../../assets/img/接入矿池.svg" alt="Connect to the mining pool" />
|
<img
|
||||||
|
src="../../assets/img/接入矿池.svg"
|
||||||
|
alt="Connect to the mining pool"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -602,7 +713,14 @@
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
||||||
<div class="reportBlock">
|
<div class="reportBlock">
|
||||||
<div class="reportBlockBox" v-loading="reportBlockLoading" v-loading-recovery="{ loading: 'reportBlockLoading', recovery: ['getBlockInfoData'] }">
|
<div
|
||||||
|
class="reportBlockBox"
|
||||||
|
v-loading="reportBlockLoading"
|
||||||
|
v-loading-recovery="{
|
||||||
|
loading: 'reportBlockLoading',
|
||||||
|
recovery: ['getBlockInfoData'],
|
||||||
|
}"
|
||||||
|
>
|
||||||
<div class="belowTable">
|
<div class="belowTable">
|
||||||
<ul>
|
<ul>
|
||||||
<li class="table-title">
|
<li class="table-title">
|
||||||
|
@ -616,7 +734,9 @@
|
||||||
$t(`home.blockHash`)
|
$t(`home.blockHash`)
|
||||||
}}</span>
|
}}</span>
|
||||||
<div class="blockRewards" :title="$t(`home.blockRewards`)">
|
<div class="blockRewards" :title="$t(`home.blockRewards`)">
|
||||||
{{ $t(`home.blockRewards`) }} ({{ handelLabel2(params.coin) }})
|
{{ $t(`home.blockRewards`) }} ({{
|
||||||
|
handelLabel2(params.coin)
|
||||||
|
}})
|
||||||
<!-- <div
|
<!-- <div
|
||||||
id="boxTitle2"
|
id="boxTitle2"
|
||||||
class="reward"
|
class="reward"
|
||||||
|
@ -647,7 +767,9 @@
|
||||||
<span>{{ item.height }}</span>
|
<span>{{ item.height }}</span>
|
||||||
<span>{{ item.date }}</span>
|
<span>{{ item.date }}</span>
|
||||||
<span class="hash" :title="item.hash">{{ item.hash }}</span>
|
<span class="hash" :title="item.hash">{{ item.hash }}</span>
|
||||||
<span :title="item.reward" class="reward">{{ item.reward }}</span>
|
<span :title="item.reward" class="reward">{{
|
||||||
|
item.reward
|
||||||
|
}}</span>
|
||||||
<!-- <span v-show="FeeShow">{{ item.fees }}</span> -->
|
<!-- <span v-show="FeeShow">{{ item.fees }}</span> -->
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -748,14 +870,15 @@ export default {
|
||||||
metaInfo: {
|
metaInfo: {
|
||||||
meta: [
|
meta: [
|
||||||
{
|
{
|
||||||
name: 'keywords',
|
name: "keywords",
|
||||||
content: 'M2Pool 矿池,首页,热门币种挖矿,稳定收益,Home,Popular Coins Mining,Stable Income Permission Levels,Account Privileges,Member Level Rates'
|
content:
|
||||||
|
"M2Pool 矿池,首页,热门币种挖矿,稳定收益,Home,Popular Coins Mining,Stable Income Permission Levels,Account Privileges,Member Level Rates",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'description',
|
name: "description",
|
||||||
content:window.vm.$t(`seo.Home`)
|
content: window.vm.$t(`seo.Home`),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
mixins: [IndexJs],
|
mixins: [IndexJs],
|
||||||
|
@ -786,7 +909,6 @@ export default {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
|
|
||||||
}
|
}
|
||||||
i {
|
i {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
|
@ -844,8 +966,6 @@ export default {
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
.moveCurrencyBox li:hover {
|
.moveCurrencyBox li:hover {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
|
@ -876,10 +996,8 @@ export default {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.miningPoolLeft {
|
.miningPoolLeft {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 95%;
|
width: 95%;
|
||||||
|
@ -891,15 +1009,12 @@ export default {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
|
|
||||||
.interval {
|
.interval {
|
||||||
|
|
||||||
padding: 0px 8px;
|
padding: 0px 8px;
|
||||||
font-size: 0.7rem;
|
font-size: 0.7rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
.timeBox {
|
.timeBox {
|
||||||
|
|
||||||
padding: 0px 10px;
|
padding: 0px 10px;
|
||||||
|
|
||||||
}
|
}
|
||||||
.times {
|
.times {
|
||||||
// background: #D2C3E9;
|
// background: #D2C3E9;
|
||||||
|
@ -916,7 +1031,6 @@ export default {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
}
|
}
|
||||||
.chartBth {
|
.chartBth {
|
||||||
|
|
||||||
.slideBox {
|
.slideBox {
|
||||||
// width: 30%;
|
// width: 30%;
|
||||||
|
|
||||||
|
@ -1140,7 +1254,6 @@ export default {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.currency-list2 {
|
.currency-list2 {
|
||||||
|
@ -1185,8 +1298,6 @@ export default {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.prop {
|
.prop {
|
||||||
width: 98%;
|
width: 98%;
|
||||||
height: 98%;
|
height: 98%;
|
||||||
|
@ -1262,8 +1373,6 @@ export default {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1278,7 +1387,6 @@ export default {
|
||||||
// .monitor-list{
|
// .monitor-list{
|
||||||
// width: 100% !important;
|
// width: 100% !important;
|
||||||
|
|
||||||
|
|
||||||
// .left{
|
// .left{
|
||||||
// width: 25px !important;
|
// width: 25px !important;
|
||||||
// }
|
// }
|
||||||
|
@ -1297,9 +1405,6 @@ export default {
|
||||||
// font-size: 0.75rem !important;
|
// font-size: 0.75rem !important;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@media screen and (min-width: 800px) and (max-width: 1279px) {
|
@media screen and (min-width: 800px) and (max-width: 1279px) {
|
||||||
.imgTop {
|
.imgTop {
|
||||||
|
@ -1324,7 +1429,6 @@ export default {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
|
|
||||||
}
|
}
|
||||||
i {
|
i {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
|
@ -1343,8 +1447,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.moveCurrencyBox {
|
.moveCurrencyBox {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
@ -1384,10 +1486,8 @@ export default {
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.moveCurrencyBox li:hover {
|
.moveCurrencyBox li:hover {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
}
|
}
|
||||||
|
@ -1416,7 +1516,6 @@ export default {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
.miningPoolLeft {
|
.miningPoolLeft {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
@ -1429,7 +1528,6 @@ export default {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
|
|
||||||
.interval {
|
.interval {
|
||||||
|
|
||||||
padding: 0px 8px;
|
padding: 0px 8px;
|
||||||
font-size: 0.7rem;
|
font-size: 0.7rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -1452,7 +1550,6 @@ export default {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
}
|
}
|
||||||
.chartBth {
|
.chartBth {
|
||||||
|
|
||||||
.slideBox {
|
.slideBox {
|
||||||
// width: 30%;
|
// width: 30%;
|
||||||
|
|
||||||
|
@ -1675,7 +1772,6 @@ export default {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.currency-list2 {
|
.currency-list2 {
|
||||||
|
@ -1720,8 +1816,6 @@ export default {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.prop {
|
.prop {
|
||||||
width: 98%;
|
width: 98%;
|
||||||
height: 98%;
|
height: 98%;
|
||||||
|
@ -1797,8 +1891,6 @@ export default {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1813,7 +1905,6 @@ export default {
|
||||||
// .monitor-list{
|
// .monitor-list{
|
||||||
// width: 100% !important;
|
// width: 100% !important;
|
||||||
|
|
||||||
|
|
||||||
// .left{
|
// .left{
|
||||||
// width: 25px !important;
|
// width: 25px !important;
|
||||||
// }
|
// }
|
||||||
|
@ -1832,13 +1923,9 @@ export default {
|
||||||
// font-size: 0.75rem !important;
|
// font-size: 0.75rem !important;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 500px) and (max-width: 800px) {
|
@media screen and (min-width: 500px) and (max-width: 800px) {
|
||||||
|
|
||||||
.Calculator {
|
.Calculator {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
|
@ -1852,9 +1939,6 @@ export default {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.prop {
|
.prop {
|
||||||
width: 80%;
|
width: 80%;
|
||||||
background: #fafbff;
|
background: #fafbff;
|
||||||
|
@ -1929,16 +2013,12 @@ export default {
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*修改提示框*/
|
/*修改提示框*/
|
||||||
#boxTitle2[data-title] {
|
#boxTitle2[data-title] {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
@ -2096,7 +2176,6 @@ export default {
|
||||||
// background-position: 50% 28%;
|
// background-position: 50% 28%;
|
||||||
// background-size: cover;
|
// background-size: cover;
|
||||||
|
|
||||||
|
|
||||||
position: relative;
|
position: relative;
|
||||||
// background: palegoldenrod;
|
// background: palegoldenrod;
|
||||||
// background-image: url(../../assets/img/enx推广.png) !important;
|
// background-image: url(../../assets/img/enx推广.png) !important;
|
||||||
|
@ -2193,7 +2272,6 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 220px) and (max-width: 1279px) {
|
@media screen and (min-width: 220px) and (max-width: 1279px) {
|
||||||
|
|
||||||
::v-deep .el-input__inner {
|
::v-deep .el-input__inner {
|
||||||
height: 40px;
|
height: 40px;
|
||||||
}
|
}
|
||||||
|
@ -2364,7 +2442,8 @@ export default {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
min-width: 300px;
|
min-width: 300px;
|
||||||
.interval {//111
|
.interval {
|
||||||
|
//111
|
||||||
// background: fuchsia;
|
// background: fuchsia;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
@ -2417,7 +2496,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.times {
|
.times {
|
||||||
|
|
||||||
// background: #D2C3E9;
|
// background: #D2C3E9;
|
||||||
|
|
||||||
width: 15%;
|
width: 15%;
|
||||||
|
@ -2426,7 +2504,6 @@ export default {
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
// padding: 0PX 20PX;
|
// padding: 0PX 20PX;
|
||||||
line-height: 30px;
|
line-height: 30px;
|
||||||
|
|
||||||
}
|
}
|
||||||
.times:hover {
|
.times:hover {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
|
@ -2496,7 +2573,6 @@ export default {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
// white-space: nowrap;
|
// white-space: nowrap;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.imgIcon {
|
.imgIcon {
|
||||||
|
@ -2916,7 +2992,7 @@ export default {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-size: 0.95em;
|
font-size: 0.95em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
margin-left: 1%
|
margin-left: 1%;
|
||||||
}
|
}
|
||||||
.transactionFee {
|
.transactionFee {
|
||||||
width: 18%;
|
width: 18%;
|
||||||
|
@ -3252,7 +3328,6 @@ export default {
|
||||||
// }
|
// }
|
||||||
.timeActive {
|
.timeActive {
|
||||||
color: #5721e4;
|
color: #5721e4;
|
||||||
|
|
||||||
}
|
}
|
||||||
.describeBox {
|
.describeBox {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
@ -3274,10 +3349,10 @@ export default {
|
||||||
align-items: start;
|
align-items: start;
|
||||||
.describeTitle {
|
.describeTitle {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #6E3EDB;
|
color: #6e3edb;
|
||||||
}
|
}
|
||||||
i {
|
i {
|
||||||
color: #6E3EDB;
|
color: #6e3edb;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
}
|
}
|
||||||
|
@ -3285,16 +3360,94 @@ export default {
|
||||||
.view {
|
.view {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
color: #6E3EDB;
|
color: #6e3edb;
|
||||||
// background: palegoldenrod;
|
// background: palegoldenrod;
|
||||||
|
|
||||||
}
|
}
|
||||||
.view:hover {
|
.view:hover {
|
||||||
|
|
||||||
color: #000;
|
color: #000;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.describeBox {
|
||||||
|
margin: 16px 0;
|
||||||
|
// padding: 8px 16px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 15px;
|
||||||
|
color: #333;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 40px;
|
||||||
|
// background: pink;
|
||||||
|
}
|
||||||
|
.describe-row {
|
||||||
|
width: 73%;
|
||||||
|
margin: 0 auto;
|
||||||
|
background: #e7dff3;
|
||||||
|
border-radius: 8px;
|
||||||
|
// padding: 8px 20px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: left;
|
||||||
|
// align-items: center;
|
||||||
|
// overflow: hidden;
|
||||||
|
padding: 5px 0px;
|
||||||
|
}
|
||||||
|
.describeTitle {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 8px;
|
||||||
|
color: #5721e4;
|
||||||
|
}
|
||||||
|
.broadcast-scroll-wrap {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 0;
|
||||||
|
|
||||||
|
height: 30px; /* 必须和JS一致 */
|
||||||
|
// overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
// background: palegoldenrod;
|
||||||
|
}
|
||||||
|
.broadcast-scroll-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
// background: paleturquoise;
|
||||||
|
// height: 28px;
|
||||||
|
text-align: left;
|
||||||
|
padding: 0;
|
||||||
|
// margin-left: 8px;
|
||||||
|
padding-left: 18px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
.broadcast-scroll-item {
|
||||||
|
width: 100%;
|
||||||
|
display: inline-block;
|
||||||
|
height: 30px;
|
||||||
|
line-height: 30px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
// background: papayawhip;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.describeTitle {
|
||||||
|
font-weight: 600;
|
||||||
|
color: #6e3edb;
|
||||||
|
}
|
||||||
|
i {
|
||||||
|
color: #6e3edb;
|
||||||
|
margin-right: 5px;
|
||||||
|
line-height: 18px;
|
||||||
|
}
|
||||||
|
// letter-spacing: 2px;
|
||||||
|
.view {
|
||||||
|
cursor: pointer;
|
||||||
|
margin-left: 8px;
|
||||||
|
color: #6e3edb;
|
||||||
|
// background: palegoldenrod;
|
||||||
|
}
|
||||||
|
.view:hover {
|
||||||
|
color: #000;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
@ -3307,10 +3460,5 @@ export default {
|
||||||
.el-menu--horizontal {
|
.el-menu--horizontal {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
|
@ -270,6 +270,16 @@ export default {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
'$route'(to) {
|
||||||
|
// 路由变化时自动同步语言和radio
|
||||||
|
const match = to.path.match(/^\/(zh|en)(\/|$)/);
|
||||||
|
if (match) {
|
||||||
|
this.radio = match[1];
|
||||||
|
this.lang = match[1];
|
||||||
|
this.$i18n.locale = match[1];
|
||||||
|
localStorage.setItem("lang", match[1]);
|
||||||
|
}
|
||||||
|
},
|
||||||
"$i18n.locale": function () {
|
"$i18n.locale": function () {
|
||||||
this.translate();
|
this.translate();
|
||||||
},
|
},
|
||||||
|
@ -290,10 +300,29 @@ export default {
|
||||||
// }
|
// }
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.lang = this.$i18n.locale; // 初始化语言值
|
// this.lang = this.$i18n.locale; // 初始化语言值
|
||||||
this.radio = localStorage.getItem("lang")
|
// this.radio = localStorage.getItem("lang")
|
||||||
? localStorage.getItem("lang")
|
// ? localStorage.getItem("lang")
|
||||||
: "en";
|
// : "en";
|
||||||
|
|
||||||
|
// 获取当前路由路径
|
||||||
|
const path = this.$route.path;
|
||||||
|
// 匹配 /zh/ 或 /en/ 作为语言前缀
|
||||||
|
const match = path.match(/^\/(zh|en)(\/|$)/);
|
||||||
|
if (match) {
|
||||||
|
this.radio = match[1];
|
||||||
|
this.lang = match[1];
|
||||||
|
this.$i18n.locale = match[1];
|
||||||
|
localStorage.setItem("lang", match[1]);
|
||||||
|
} else {
|
||||||
|
// fallback 到 localStorage 或 "en"
|
||||||
|
this.radio = localStorage.getItem("lang") || "en";
|
||||||
|
this.lang = this.radio;
|
||||||
|
this.$i18n.locale = this.radio;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
translate() {
|
translate() {
|
||||||
|
|
|
@ -333,15 +333,44 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
'$route'(to) {
|
||||||
|
// 路由变化时自动同步语言和radio
|
||||||
|
const match = to.path.match(/^\/(zh|en)(\/|$)/);
|
||||||
|
if (match) {
|
||||||
|
this.radio = match[1];
|
||||||
|
this.lang = match[1];
|
||||||
|
this.$i18n.locale = match[1];
|
||||||
|
localStorage.setItem("lang", match[1]);
|
||||||
|
}
|
||||||
|
},
|
||||||
"$i18n.locale": function () {
|
"$i18n.locale": function () {
|
||||||
this.translate();
|
this.translate();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.lang = this.$i18n.locale;
|
// this.lang = this.$i18n.locale;
|
||||||
this.radio = localStorage.getItem("lang")
|
// this.radio = localStorage.getItem("lang")
|
||||||
? localStorage.getItem("lang")
|
// ? localStorage.getItem("lang")
|
||||||
: "en";
|
// : "en";
|
||||||
|
|
||||||
|
// 获取当前路由路径
|
||||||
|
const path = this.$route.path;
|
||||||
|
// 匹配 /zh/ 或 /en/ 作为语言前缀
|
||||||
|
const match = path.match(/^\/(zh|en)(\/|$)/);
|
||||||
|
if (match) {
|
||||||
|
this.radio = match[1];
|
||||||
|
this.lang = match[1];
|
||||||
|
this.$i18n.locale = match[1];
|
||||||
|
localStorage.setItem("lang", match[1]);
|
||||||
|
} else {
|
||||||
|
// fallback 到 localStorage 或 "en"
|
||||||
|
this.radio = localStorage.getItem("lang") || "en";
|
||||||
|
this.lang = this.radio;
|
||||||
|
this.$i18n.locale = this.radio;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (const key in this.registerForm) {
|
for (const key in this.registerForm) {
|
||||||
this.registerForm[key] = "";
|
this.registerForm[key] = "";
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,541 @@
|
||||||
|
import { getUserDetails,getUserLineChart,getUserOnlineStatus } from '../../api/userManagement'
|
||||||
|
import * as echarts from "echarts";
|
||||||
|
import { Debounce, throttle } from "../../utils/publicMethods";
|
||||||
|
export default {
|
||||||
|
name: 'UserDetails',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userDetailsID: null,
|
||||||
|
userData: {
|
||||||
|
// address:"D7tviVPKtTd2qnkzJEVfZWQqzV6NyQqHxw",
|
||||||
|
// historyBalance:[
|
||||||
|
// {
|
||||||
|
// "balance": "testAddBalanceForgrD7tviVPKtTd2qnkzJEVfZWQqzV6NyQqHxws"
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "balance": "testAddBalancD7tviVPKtTd2qnkzJEVfZWQqzV6NyQqHxweForgrs"
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// "balance": "testAddBalancD7tviVPKtTd2qnkzJEVfZWQqzV6NyQqHxweForgrs"
|
||||||
|
// },
|
||||||
|
|
||||||
|
// ],
|
||||||
|
// maxHeight:"100000",
|
||||||
|
// createDate:"2025-06-16 00:00:00",
|
||||||
|
// amount:"273920.96662387",
|
||||||
|
// coin:"nexa",
|
||||||
|
// shouldOutDate:"2025-06-16 00:00:00",
|
||||||
|
// user:"ceshi1",
|
||||||
|
},
|
||||||
|
userDetailsLoading: false,
|
||||||
|
formInline: {
|
||||||
|
user: '',
|
||||||
|
region: ''
|
||||||
|
},
|
||||||
|
userDetailsParams:{
|
||||||
|
coin: '',
|
||||||
|
minerUser: '',
|
||||||
|
startDate:"",
|
||||||
|
endDate:"",
|
||||||
|
|
||||||
|
},
|
||||||
|
labelPosition: 'top',
|
||||||
|
noDataTip: false,
|
||||||
|
lineChartParams:{
|
||||||
|
minerUser: '',
|
||||||
|
endDate:"",
|
||||||
|
startDate:"",
|
||||||
|
coin:"",
|
||||||
|
|
||||||
|
},
|
||||||
|
onlineStatusParams:{
|
||||||
|
minerUser: '',
|
||||||
|
coin: '',
|
||||||
|
endDate:"",
|
||||||
|
startDate:"",
|
||||||
|
},
|
||||||
|
onlineStatusData:[
|
||||||
|
|
||||||
|
{
|
||||||
|
"date":"2024-11-28T11:00:00",
|
||||||
|
"offlineNum": 148,
|
||||||
|
"onlineNum": 15
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 17:00:00",
|
||||||
|
"offlineNum": 110,
|
||||||
|
"onlineNum": 156
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 17:30:00",
|
||||||
|
"offlineNum": 90,
|
||||||
|
"onlineNum": 152
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 18:00:00",
|
||||||
|
"offlineNum": 70,
|
||||||
|
"onlineNum": 152
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 18:00:00",
|
||||||
|
"offlineNum": 70,
|
||||||
|
"onlineNum": 152
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 18:00:00",
|
||||||
|
"offlineNum": 70,
|
||||||
|
"onlineNum": 152
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"date":"2025-06-27 18:00:00",
|
||||||
|
"offlineNum": 70,
|
||||||
|
"onlineNum": 152
|
||||||
|
},
|
||||||
|
],
|
||||||
|
lineChatTimes:[],
|
||||||
|
option: {
|
||||||
|
tooltip: {
|
||||||
|
trigger: "axis",
|
||||||
|
//解决tooltip显示不全问题1
|
||||||
|
confine: true,
|
||||||
|
|
||||||
|
// formatter: function (params) {
|
||||||
|
// var res
|
||||||
|
// res = params[0].axisValueLabel;
|
||||||
|
|
||||||
|
|
||||||
|
// for (let i = 0; i <= params.length - 1; i++) {
|
||||||
|
|
||||||
|
// if (params[i].seriesName == "Currency Price" || params[i].seriesName == "币价") {
|
||||||
|
// res += `</br>${params[i].marker} ${params[i].seriesName}      <span style="font-weight: bold">${params[i].value} USD</span>`
|
||||||
|
// } else {
|
||||||
|
// res += `</br>${params[i].marker} ${params[i].seriesName}      <span style="font-weight: bold">${params[i].value}</span>`
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// return res;
|
||||||
|
// },
|
||||||
|
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
right: "8%",
|
||||||
|
|
||||||
|
},
|
||||||
|
// grid: {//解决Y轴显示不全
|
||||||
|
// left: "10%",//10%
|
||||||
|
// containLabel: true
|
||||||
|
// },
|
||||||
|
grid: {
|
||||||
|
left: "8%",
|
||||||
|
right: "8%",
|
||||||
|
top: "10%",
|
||||||
|
bottom: "15%", // 增加底部空间,为旋转的X轴标签和滑动条留出空间
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
xAxis: {
|
||||||
|
// type: "time",
|
||||||
|
boundaryGap: true, // 让柱子不超出X轴
|
||||||
|
axisLabel: {
|
||||||
|
interval: 'auto', // 自动间隔显示标签,避免重叠
|
||||||
|
rotate: 45, // 旋转45度,避免标签重叠
|
||||||
|
formatter: function(value) {
|
||||||
|
// 格式化显示,只显示月-日 时:分
|
||||||
|
if (value.includes(' ')) {
|
||||||
|
const [date, time] = value.split(' ');
|
||||||
|
const [year, month, day] = date.split('-');
|
||||||
|
const [hour, minute] = time.split(':');
|
||||||
|
return `${month}-${day} ${hour}:${minute}`;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// axisTick: {
|
||||||
|
// //去除刻度
|
||||||
|
// show: false,
|
||||||
|
// },
|
||||||
|
// axisLine: {
|
||||||
|
// //去除轴线
|
||||||
|
// show: false,
|
||||||
|
// },
|
||||||
|
data: []
|
||||||
|
},
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
// position: "left",
|
||||||
|
type: "value",
|
||||||
|
name: "GH/s",
|
||||||
|
nameTextStyle: {
|
||||||
|
|
||||||
|
padding: [0, 0, 0, -40],
|
||||||
|
},
|
||||||
|
// min: `dataMin`,
|
||||||
|
// max: `dataMax`,
|
||||||
|
axisLabel: {
|
||||||
|
formatter: function (value) {
|
||||||
|
// let data
|
||||||
|
// if (value > 10000000) {
|
||||||
|
// data = `${(value / 10000000)} KW`
|
||||||
|
// } else if (value > 1000000) {
|
||||||
|
// data = `${(value / 1000000)} M`
|
||||||
|
// } else if (value / 10000) {
|
||||||
|
// data = `${(value / 10000)} W`
|
||||||
|
// }
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
|
||||||
|
position: "right",
|
||||||
|
// type: "log",
|
||||||
|
// splitNumber: "5",
|
||||||
|
show: true,
|
||||||
|
// min: 0,
|
||||||
|
// max: this.maxValue,
|
||||||
|
splitLine: {//不显示右侧Y轴横线
|
||||||
|
show: false
|
||||||
|
},
|
||||||
|
// name: "",
|
||||||
|
nameTextStyle: {
|
||||||
|
|
||||||
|
padding: [0, 0, 0, 40],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
],
|
||||||
|
dataZoom: [
|
||||||
|
{
|
||||||
|
type: "inside",
|
||||||
|
start: 50, // 默认显示后30%的数据,避免图表过于拥挤
|
||||||
|
end: 100,
|
||||||
|
maxSpan: 100,
|
||||||
|
minSpan: 2, // 最小显示5%的数据
|
||||||
|
animation: false,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "inside",
|
||||||
|
start: 50,
|
||||||
|
end: 100,
|
||||||
|
height: 20, // 滑动条高度
|
||||||
|
bottom: 0, // 滑动条位置
|
||||||
|
showDetail: false, // 不显示详细数值
|
||||||
|
},
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
|
||||||
|
{//在线数量
|
||||||
|
name: "Number of users online",
|
||||||
|
type: "bar",
|
||||||
|
data: [],
|
||||||
|
yAxisIndex: 1,
|
||||||
|
itemStyle: {
|
||||||
|
color: '#239342', // 这里设置柱子的主色为绿色
|
||||||
|
|
||||||
|
},
|
||||||
|
barWidth: '40%', // 使用百分比宽度,保持适当的柱子宽度
|
||||||
|
barGap: '10%', // 同类型柱子间的间隔
|
||||||
|
barCategoryGap: '20%', // 类目间的间隔
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Number of offline users",
|
||||||
|
type: "bar",
|
||||||
|
// smooth: false, //线条是否圆滑
|
||||||
|
// symbol: "circle",
|
||||||
|
// symbolSize: 5,
|
||||||
|
// showSymbol: false,
|
||||||
|
itemStyle: {
|
||||||
|
color: "#FE2E74",
|
||||||
|
borderColor: "rgba(221,220,107,0.1)",
|
||||||
|
|
||||||
|
},
|
||||||
|
barWidth: '40%', // 使用百分比宽度,保持适当的柱子宽度
|
||||||
|
barGap: '10%', // 同类型柱子间的间隔
|
||||||
|
barCategoryGap: '20%', // 类目间的间隔
|
||||||
|
|
||||||
|
data: [],
|
||||||
|
yAxisIndex: 1,
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "User computing power",
|
||||||
|
type: "line",
|
||||||
|
smooth: false, //线条是否圆滑
|
||||||
|
symbol: "circle",
|
||||||
|
symbolSize: 5,
|
||||||
|
showSymbol: false,
|
||||||
|
itemStyle: {
|
||||||
|
color: "#5721E4",
|
||||||
|
borderColor: "rgba(221,220,107,0.1)",
|
||||||
|
borderWidth: 12,
|
||||||
|
},
|
||||||
|
lineStyle: {
|
||||||
|
//线条样式
|
||||||
|
color: "#5721E4",
|
||||||
|
width: "2",
|
||||||
|
},
|
||||||
|
// areaStyle: {
|
||||||
|
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
// {
|
||||||
|
// offset: 0,
|
||||||
|
// color: 'rgb(210,195,234)'
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// offset: 1,
|
||||||
|
// color: 'rgb(255, 255, 255)'
|
||||||
|
// }
|
||||||
|
// ])
|
||||||
|
// },
|
||||||
|
zlevel: 1, z: 1,
|
||||||
|
data: [],
|
||||||
|
yAxisIndex: 0,
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
},
|
||||||
|
lineChartLoading:false,
|
||||||
|
lineChartData:[
|
||||||
|
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "8.00080",
|
||||||
|
"date": "2024-11-28T11:00:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "6.00060",
|
||||||
|
"date": "2024-11-28T11:30:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "0.05000",
|
||||||
|
"date": "2024-11-28T12:00:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "2.0000",
|
||||||
|
"date": "2024-11-28T12:30:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "0.3000",
|
||||||
|
"date": "2024-11-28T13:00:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "0.9000",
|
||||||
|
"date": "2024-11-28T13:30:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"minerUser": "miner",
|
||||||
|
"pv": "15.0000",
|
||||||
|
"date": "2024-11-28T14:00:00",
|
||||||
|
"unit":"GH/s"
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
chartShow:true,
|
||||||
|
tableData:[],
|
||||||
|
historyBalance:[],
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
let token
|
||||||
|
try{
|
||||||
|
token =JSON.parse(localStorage.getItem('token'))
|
||||||
|
}catch(e){
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
if (!token) {
|
||||||
|
this.$router.push({ path: `/${lang}/login` });
|
||||||
|
|
||||||
|
}
|
||||||
|
const params= this.$route.query || JSON.parse(localStorage.getItem("userDetailsParams"));
|
||||||
|
this.lineChartParams.minerUser=params.minerUser
|
||||||
|
this.lineChartParams.coin=params.coin
|
||||||
|
this.onlineStatusParams.minerUser=params.minerUser
|
||||||
|
this.onlineStatusParams.coin=params.coin
|
||||||
|
this.userDetailsParams.coin=params.coin
|
||||||
|
this.userDetailsParams.minerUser=params.minerUser
|
||||||
|
|
||||||
|
if (this.userDetailsParams.coin && this.userDetailsParams.minerUser) {
|
||||||
|
localStorage.setItem("userDetailsParams", JSON.stringify(params));
|
||||||
|
|
||||||
|
this.fetchUserDetails(this.userDetailsParams);
|
||||||
|
// 等待两个图表相关接口都完成后再调用inCharts
|
||||||
|
this.fetchChartData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
//初始化图表
|
||||||
|
inCharts() {
|
||||||
|
if (this.myChart == null) {
|
||||||
|
this.myChart = echarts.init(document.getElementById("lineChart"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this.option.series[0].name = this.$t(`backendSystem.onlineUserNum`)
|
||||||
|
this.option.series[1].name = this.$t(`backendSystem.offlineUserNum`)
|
||||||
|
this.option.series[2].name = this.$t(`backendSystem.userPower`)
|
||||||
|
|
||||||
|
this.myChart.setOption(this.option);
|
||||||
|
// 回调函数,在渲染完成后执行
|
||||||
|
this.myChart.on('finished', () => {
|
||||||
|
// 图表渲染完成
|
||||||
|
console.log('图表渲染完成');
|
||||||
|
});
|
||||||
|
|
||||||
|
window.addEventListener('resize', throttle(() => {
|
||||||
|
if (this.myChart) this.myChart.resize();
|
||||||
|
}, 200));
|
||||||
|
},
|
||||||
|
async fetchUserDetails(params) {
|
||||||
|
this.setLoading('userDetailsLoading', true);
|
||||||
|
// 获取用户详情逻辑
|
||||||
|
const res = await getUserDetails(params)
|
||||||
|
console.log(res)
|
||||||
|
|
||||||
|
if(res && res.code == 200){
|
||||||
|
if (!res.data) {
|
||||||
|
this.noDataTip = true
|
||||||
|
// this.userData.coin = this.userDetailsParams.coin
|
||||||
|
// this.userData.user = this.userDetailsParams.minerUser
|
||||||
|
}else{
|
||||||
|
this.userData = res.data
|
||||||
|
// this.userData.shouldOutDate=`${this.userData.shouldOutDate.split("T")[0]} ${this.userData.shouldOutDate.split("T")[1]}`
|
||||||
|
// this.userData.createDate=`${this.userData.createDate.split("T")[0]} ${this.userData.createDate.split("T")[1]}`
|
||||||
|
this.historyBalance=res.data.historyBalance
|
||||||
|
this.tableData = res.data.walletInInfo.sort((a, b) => new Date(b.createDate) - new Date(a.createDate));
|
||||||
|
this.noDataTip = false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
this.setLoading('userDetailsLoading', false);
|
||||||
|
},
|
||||||
|
async fetchUserLineChart(params) {
|
||||||
|
const res = await getUserLineChart(params)
|
||||||
|
console.log(res)
|
||||||
|
let xData = []
|
||||||
|
let pvData = []
|
||||||
|
if(res && res.code == 200){
|
||||||
|
|
||||||
|
if (!Array.isArray(res.data) || res.data.length === 0 || !res.data[0].unit) {
|
||||||
|
this.chartShow = false
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.chartShow = true
|
||||||
|
this.lineChartData = res.data
|
||||||
|
this.lineChartData.forEach(item => {
|
||||||
|
item.date = item.date.split("T")[0] + " " + item.date.split("T")[1].split(".")[0]
|
||||||
|
xData.push(item.date)
|
||||||
|
pvData.push(Number(item.pv).toFixed(6))
|
||||||
|
})
|
||||||
|
|
||||||
|
this.option.xAxis.data = xData
|
||||||
|
this.option.series[2].data = pvData
|
||||||
|
this.option.yAxis[0].name = this.lineChartData[0].unit
|
||||||
|
// this.inCharts()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async fetchUserOnlineStatus(params) {
|
||||||
|
const res = await getUserOnlineStatus(params)
|
||||||
|
console.log(res)
|
||||||
|
// let xData = []
|
||||||
|
let offlineNum = []
|
||||||
|
let onlineNum = []
|
||||||
|
if(res && res.code == 200){
|
||||||
|
if (!Array.isArray(res.data) || res.data.length === 0 ) {
|
||||||
|
this.chartShow = false
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.chartShow = true
|
||||||
|
this.onlineStatusData = res.data
|
||||||
|
|
||||||
|
this.onlineStatusData.forEach(item => {
|
||||||
|
offlineNum.push(item.offlineNum)
|
||||||
|
onlineNum.push(item.onlineNum)
|
||||||
|
})
|
||||||
|
this.option.series[0].data = onlineNum
|
||||||
|
this.option.series[1].data = offlineNum
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 获取图表数据 - 等待两个接口都完成后再渲染图表
|
||||||
|
*/
|
||||||
|
async fetchChartData() {
|
||||||
|
try {
|
||||||
|
this.setLoading('lineChartLoading', true);
|
||||||
|
|
||||||
|
// 并行调用两个接口,等待都完成
|
||||||
|
await Promise.all([
|
||||||
|
this.fetchUserLineChart(this.lineChartParams),
|
||||||
|
this.fetchUserOnlineStatus(this.onlineStatusParams)
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 两个接口都完成后,检查是否有数据再渲染图表
|
||||||
|
if (this.chartShow) {
|
||||||
|
this.inCharts();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取图表数据失败:', error);
|
||||||
|
} finally {
|
||||||
|
this.setLoading('lineChartLoading', false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
goBack(){
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
this.$router.push({
|
||||||
|
path: `/${lang}/userManagement`,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
handleLineChatTimesChange(val){
|
||||||
|
console.log(val,'val');
|
||||||
|
if(val){
|
||||||
|
this.lineChartParams.startDate=val[0]
|
||||||
|
this.lineChartParams.endDate=val[1]
|
||||||
|
this.onlineStatusParams.startDate=val[0]
|
||||||
|
this.onlineStatusParams.endDate=val[1]
|
||||||
|
this.userDetailsParams.startDate=val[0]
|
||||||
|
this.userDetailsParams.endDate=val[1]
|
||||||
|
|
||||||
|
}else{
|
||||||
|
this.lineChartParams.startDate=""
|
||||||
|
this.lineChartParams.endDate=""
|
||||||
|
this.onlineStatusParams.startDate=""
|
||||||
|
this.onlineStatusParams.endDate=""
|
||||||
|
this.userDetailsParams.startDate=""
|
||||||
|
this.userDetailsParams.endDate=""
|
||||||
|
}
|
||||||
|
this.fetchUserDetails(this.userDetailsParams);
|
||||||
|
// 等待两个图表相关接口都完成后再调用inCharts
|
||||||
|
this.fetchChartData();
|
||||||
|
},
|
||||||
|
handelTime(time){
|
||||||
|
return time.split("T")[0] + " " + time.split("T")[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,328 @@
|
||||||
|
<template>
|
||||||
|
<div v-loading="userDetailsLoading">
|
||||||
|
<div class="main-title">
|
||||||
|
{{$t('backendSystem.userDetails')}}
|
||||||
|
<span
|
||||||
|
@click="goBack"
|
||||||
|
style="color: #409eff; cursor: pointer; font-size: 16px;margin-left: 10px;"
|
||||||
|
>{{$t('backendSystem.return')}}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<section class="user-details-box">
|
||||||
|
<!-- <section class="user-details-form">
|
||||||
|
<el-form
|
||||||
|
:label-position="labelPosition"
|
||||||
|
:inline="true"
|
||||||
|
:model="userData"
|
||||||
|
class="demo-form-inline"
|
||||||
|
>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 80%"
|
||||||
|
:label="$t('backendSystem.coin')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="coin"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.coin"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 80%"
|
||||||
|
:label="$t('backendSystem.user')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="user"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.user"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 80%"
|
||||||
|
:label="$t('backendSystem.amount')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="amount"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.amount"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
:label="$t('backendSystem.createDate')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="createDate"
|
||||||
|
style="width: 80%"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.createDate"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 80%"
|
||||||
|
:label="$t('backendSystem.maxHeight')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="maxHeight"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.maxHeight"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="8">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 80%"
|
||||||
|
:label="$t('backendSystem.shouldOutDate')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="shouldOutDate"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.shouldOutDate"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 55%"
|
||||||
|
:label="$t('backendSystem.address')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="address"
|
||||||
|
>
|
||||||
|
<el-input disabled v-model="userData.address"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<el-form-item
|
||||||
|
style="width: 55%; max-height: 300px; overflow-y: auto"
|
||||||
|
:label="$t('backendSystem.historyAddress')"
|
||||||
|
label-width="100px"
|
||||||
|
prop="address"
|
||||||
|
>
|
||||||
|
<p
|
||||||
|
class="history-balance-item"
|
||||||
|
v-for="item in userData.historyBalance"
|
||||||
|
:key="item.balance"
|
||||||
|
>
|
||||||
|
{{ item.balance }}
|
||||||
|
</p>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</el-form>
|
||||||
|
</section> -->
|
||||||
|
|
||||||
|
|
||||||
|
<el-date-picker
|
||||||
|
v-model="lineChatTimes"
|
||||||
|
type="daterange"
|
||||||
|
:range-separator="$t('backendSystem.to')"
|
||||||
|
:start-placeholder="$t('backendSystem.startDate')"
|
||||||
|
:end-placeholder="$t('backendSystem.endDate')"
|
||||||
|
@change="handleLineChatTimesChange"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
size="small"
|
||||||
|
style="margin-bottom: 18px;"
|
||||||
|
>
|
||||||
|
</el-date-picker>
|
||||||
|
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
border
|
||||||
|
|
||||||
|
:header-cell-style="{ 'text-align': 'center' }"
|
||||||
|
:cell-style="{ 'text-align': 'center' }"
|
||||||
|
height="42vh"
|
||||||
|
>
|
||||||
|
<el-table-column prop="createDate" :label="$t('backendSystem.createDate')" width="160" >
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ handelTime(scope.row.createDate ) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="shouldOutDate" :label="$t('backendSystem.shouldOutDate')" width="180" show-overflow-tooltip >
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ handelTime(scope.row.shouldOutDate ) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="coin" :label="$t('backendSystem.coin2')" width="100" show-overflow-tooltip>
|
||||||
|
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="amount" :label="$t('backendSystem.amount2')" width="200" show-overflow-tooltip/>
|
||||||
|
|
||||||
|
<el-table-column prop="user" :label="$t('backendSystem.minerUser2')" width="180" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="address" :label="$t('backendSystem.address')" show-overflow-tooltip />
|
||||||
|
|
||||||
|
<el-table-column prop="maxHeight" :label="$t('backendSystem.maxHeight')" width="180" show-overflow-tooltip />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
|
||||||
|
<section class="chartBox">
|
||||||
|
<div class="lineChartBox">
|
||||||
|
<div class="lineChartBox-header">
|
||||||
|
<div class="lineChartBox-title">{{$t('backendSystem.chartTitle')}}</div>
|
||||||
|
<!-- <el-date-picker
|
||||||
|
v-model="lineChatTimes"
|
||||||
|
type="daterange"
|
||||||
|
:range-separator="$t('backendSystem.to')"
|
||||||
|
:start-placeholder="$t('backendSystem.startDate')"
|
||||||
|
:end-placeholder="$t('backendSystem.endDate')"
|
||||||
|
@change="handleLineChatTimesChange"
|
||||||
|
value-format="yyyy-MM-dd HH:mm:ss"
|
||||||
|
size="small"
|
||||||
|
:disabled="!chartShow"
|
||||||
|
>
|
||||||
|
</el-date-picker> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="lineChartBox-content"
|
||||||
|
style="width: 100%; height: 500px; margin-top: 35px;"
|
||||||
|
>
|
||||||
|
<div v-if="!chartShow" style="text-align: center;margin-top: 200px;color: #ccc;">{{$t('backendSystem.noData')}}</div>
|
||||||
|
<div v-else v-loading="lineChartLoading" id="lineChart" style="width: 100%; height: 100%"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24">
|
||||||
|
<div
|
||||||
|
style="width: 100%; max-height: 300px; overflow-y: auto;"
|
||||||
|
>
|
||||||
|
<h3 style="margin-bottom: 20px;">{{$t('backendSystem.historyAddress')}}</h3>
|
||||||
|
|
||||||
|
|
||||||
|
<p
|
||||||
|
class="history-balance-item"
|
||||||
|
v-for="item in historyBalance"
|
||||||
|
:key="item.balance"
|
||||||
|
>
|
||||||
|
{{ item.balance }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Index from "./index";
|
||||||
|
export default {
|
||||||
|
mixins: [Index],
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.main-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.user-details-box {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
height: 73vh;
|
||||||
|
overflow: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
// background: palegoldenrod;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-details-form {
|
||||||
|
width: 80%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
// background: palegoldenrod;
|
||||||
|
}
|
||||||
|
|
||||||
|
.no-data-tip {
|
||||||
|
width: 80%;
|
||||||
|
margin: 0 auto;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #999;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.history-balance-item {
|
||||||
|
display: inline-block; /* 让宽度随内容自适应 */
|
||||||
|
background: #e7dff3;
|
||||||
|
padding: 8px 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
color: rgba(0, 0, 0, 0.6);
|
||||||
|
/* width: auto; 其实可以省略,inline-block默认就是auto */
|
||||||
|
/* 防止flex布局下被拉伸 */
|
||||||
|
flex: none;
|
||||||
|
align-self: flex-start;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::v-deep .el-form-item__label {
|
||||||
|
// color: #409EFF; /* 例如设置为 Element UI 主色 */
|
||||||
|
font-weight: bold; /* 加粗 */
|
||||||
|
font-size: 16px; /* 字号 */
|
||||||
|
letter-spacing: 1px; /* 字间距 */
|
||||||
|
/* 你可以根据需要添加更多样式 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.chartBox {
|
||||||
|
width: 80vw;
|
||||||
|
box-sizing: border-box;
|
||||||
|
// background: palegoldenrod;
|
||||||
|
|
||||||
|
|
||||||
|
padding: 0;
|
||||||
|
margin: 30px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lineChartBox {
|
||||||
|
width: 97%;
|
||||||
|
height: 80%;
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
box-shadow: 0px 0px 1px 1px #ccc;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
.lineChartBox-title {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: rgba(0, 0, 0, 0.6);
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
.lineChartBox-header{
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
padding:1% 5%;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.el-date-editor .el-range-separator {
|
||||||
|
padding: 0 !important;
|
||||||
|
color: #333 !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -0,0 +1,250 @@
|
||||||
|
import { getUserList, sendMail, } from '../../api/userManagement'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
userList: [],
|
||||||
|
userListLoading: false,
|
||||||
|
userListParams: {
|
||||||
|
coin: "nexa",
|
||||||
|
minerUser: "",
|
||||||
|
user: "",
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 50
|
||||||
|
},
|
||||||
|
tableData: [],
|
||||||
|
userManagementLoading: false,
|
||||||
|
formInline: {
|
||||||
|
user: "",
|
||||||
|
region: "",
|
||||||
|
},
|
||||||
|
currencyList: [],
|
||||||
|
screenCurrency: 'nexa',
|
||||||
|
rules: {
|
||||||
|
user: [
|
||||||
|
{
|
||||||
|
type: 'email',
|
||||||
|
message: this.$t('backendSystem.pleaseInputCorrectEmail'),
|
||||||
|
trigger: ['blur', 'change']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
emailRules: {
|
||||||
|
subject: [
|
||||||
|
{ required: true, message: this.$t('backendSystem.pleaseInputSubject'), trigger: 'blur' }
|
||||||
|
],
|
||||||
|
text: [
|
||||||
|
{ required: true, message: this.$t('backendSystem.pleaseInputText'), trigger: 'blur' }
|
||||||
|
],
|
||||||
|
to: [
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 多邮箱校验+去重,支持中英文逗号分隔
|
||||||
|
* @param {Object} rule
|
||||||
|
* @param {string} value
|
||||||
|
* @param {Function} callback
|
||||||
|
*/
|
||||||
|
validator: (rule, value, callback) => {
|
||||||
|
if (!value) {
|
||||||
|
callback(); // 允许为空
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 以中英文逗号分隔,去除首尾空格
|
||||||
|
const emails = value.split(/[,,]/).map(e => e.trim()).filter(e => e);
|
||||||
|
// 邮箱正则
|
||||||
|
const emailReg = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
|
||||||
|
// 检查格式
|
||||||
|
for (let email of emails) {
|
||||||
|
if (!emailReg.test(email)) {
|
||||||
|
callback(new Error(this.$t('backendSystem.pleaseInputCorrectEmail2')));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 检查去重(忽略大小写)
|
||||||
|
const lowerSet = new Set();
|
||||||
|
for (let email of emails) {
|
||||||
|
const lower = email.toLowerCase();
|
||||||
|
if (lowerSet.has(lower)) {
|
||||||
|
callback(new Error(this.$t('backendSystem.existDuplicateEmail')));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lowerSet.add(lower);
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
},
|
||||||
|
trigger: ['blur', 'change']
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
dialogVisible: false,
|
||||||
|
senParams:{
|
||||||
|
subject:"",
|
||||||
|
text:"",
|
||||||
|
to:"",
|
||||||
|
},
|
||||||
|
sendEmailLoading: false,
|
||||||
|
total: 0,
|
||||||
|
pageSizes: [50, 100, 300],
|
||||||
|
currentPage: 1,
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
let token
|
||||||
|
try{
|
||||||
|
token =JSON.parse(localStorage.getItem('token'))
|
||||||
|
}catch(e){
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
if (!token) {
|
||||||
|
this.$router.push({ path: `/${lang}/login` });
|
||||||
|
|
||||||
|
}
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
||||||
|
window.addEventListener("setItem", () => {
|
||||||
|
this.currencyList = JSON.parse(localStorage.getItem("currencyList"))
|
||||||
|
});
|
||||||
|
this.changeScreen(this.screenCurrency);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
async fetchUserList(params) {
|
||||||
|
|
||||||
|
this.setLoading('userManagementLoading', true);
|
||||||
|
const data = await getUserList(params);
|
||||||
|
console.log(data,'data');
|
||||||
|
|
||||||
|
if (data && data.code == 200) {
|
||||||
|
this.tableData = data.rows;
|
||||||
|
this.total = data.total;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setLoading('userManagementLoading', false);
|
||||||
|
},
|
||||||
|
async fetchSendEmail(params) {
|
||||||
|
|
||||||
|
this.setLoading('sendEmailLoading', true);
|
||||||
|
const data = await sendMail(params);
|
||||||
|
|
||||||
|
|
||||||
|
if (data && data.code == 200) {
|
||||||
|
this.$message.success(this.$t('backendSystem.sendSuccess'));
|
||||||
|
this.dialogVisible = false;
|
||||||
|
for (const key in this.senParams) {
|
||||||
|
this.senParams[key] = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.setLoading('sendEmailLoading', false);
|
||||||
|
},
|
||||||
|
changeScreen(scope) {
|
||||||
|
let brand = scope
|
||||||
|
for (let index in this.currencyList) {
|
||||||
|
let aa = this.currencyList[index];
|
||||||
|
let value = aa.value;
|
||||||
|
if (brand === value) {
|
||||||
|
this.$refs.screen.$el.children[0].children[0].setAttribute('style', "background:url(" + aa.imgUrl + ") no-repeat 10PX;background-size: 20PX 20PX;color:#333;padding-left: 33PX;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.userListParams.coin = scope
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
|
||||||
|
},
|
||||||
|
handelImg(coin) {
|
||||||
|
if(this.currencyList &&this.currencyList.length > 0 && coin){
|
||||||
|
return this.currencyList.find(item => item.value === coin)?.imgUrl || '';
|
||||||
|
}else{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handelQuery() {
|
||||||
|
this.$refs.formRef.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
for (let key in this.userListParams) {
|
||||||
|
if (typeof this.userListParams[key] === 'string') {
|
||||||
|
this.userListParams[key] = this.userListParams[key].trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.userListParams.minerUser && !this.userListParams.user) {
|
||||||
|
this.$message.error(this.$t('backendSystem.pleaseInputQueryConditions'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
sendEmail(row) {
|
||||||
|
this.dialogVisible = true;
|
||||||
|
this.senParams.to = row.user;
|
||||||
|
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 输入框清除后自动重新查询
|
||||||
|
*/
|
||||||
|
handleInputClear() {
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
},
|
||||||
|
handleClose() {
|
||||||
|
this.dialogVisible = false;
|
||||||
|
},
|
||||||
|
handleInput(val, type) {
|
||||||
|
|
||||||
|
},
|
||||||
|
sureSendEmail(){
|
||||||
|
console.log(this.senParams,'this.senParams');
|
||||||
|
|
||||||
|
this.$refs.formRef.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.fetchSendEmail(this.senParams);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleDetails(row){
|
||||||
|
console.log(row,'row');
|
||||||
|
|
||||||
|
// 获取当前语言
|
||||||
|
const lang = this.$i18n.locale;
|
||||||
|
|
||||||
|
// 添加语言参数的路由跳转
|
||||||
|
this.$router.push({
|
||||||
|
path: `/${lang}/userDetails`,
|
||||||
|
query: { coin: row.coin,minerUser:row.minerUser, user: row.user,}
|
||||||
|
}).catch(err => {
|
||||||
|
if(err.name !== 'NavigationDuplicated') {
|
||||||
|
console.error('路由跳转失败:', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let obj ={
|
||||||
|
coin: row.coin,
|
||||||
|
minerUser: row.minerUser,
|
||||||
|
user: row.user,
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存ID到localStorage
|
||||||
|
localStorage.setItem("userDetailsParams",JSON.stringify(obj));
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSizeChange(val) {
|
||||||
|
console.log(`每页 ${val} 条`);
|
||||||
|
this.userListParams.pageSize = val
|
||||||
|
this.userListParams.pageNum = 1
|
||||||
|
this.currentPage = 1
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
|
||||||
|
},
|
||||||
|
handleCurrentChange(val) {
|
||||||
|
console.log(`当前页: ${val}`);
|
||||||
|
this.userListParams.pageNum = val
|
||||||
|
this.fetchUserList(this.userListParams);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
<template>
|
||||||
|
<div v-loading="userManagementLoading">
|
||||||
|
<div class="main-title">{{$t('backendSystem.userManagementTitle')}}</div>
|
||||||
|
|
||||||
|
<el-form :inline="true" :model="userListParams" class="demo-form-inline" :rules="rules" ref="formRef">
|
||||||
|
<el-form-item :label="$t('backendSystem.coin')" prop="coin">
|
||||||
|
<el-select
|
||||||
|
class="input"
|
||||||
|
|
||||||
|
size="middle"
|
||||||
|
ref="screen"
|
||||||
|
@change="changeScreen(screenCurrency)"
|
||||||
|
v-model="screenCurrency"
|
||||||
|
:placeholder="$t(`personal.screen`)"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in currencyList"
|
||||||
|
:key="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:value="item.value"
|
||||||
|
>
|
||||||
|
<div style="display: flex; align-items: center">
|
||||||
|
<img :src="item.imgUrl" style="float: left; width: 20px" />
|
||||||
|
<span style="float: left; margin-left: 5px">
|
||||||
|
{{ item.label }}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('backendSystem.user')" style="margin-left: 5vw" prop="minerUser">
|
||||||
|
<el-input v-model="userListParams.minerUser" :placeholder="$t('backendSystem.pleaseInput')" clearable @clear="handleInputClear"></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('backendSystem.email')" style="margin-left: 5vw" prop="user">
|
||||||
|
<el-input
|
||||||
|
v-model="userListParams.user"
|
||||||
|
type="email"
|
||||||
|
:placeholder="$t('backendSystem.pleaseInput')"
|
||||||
|
clearable
|
||||||
|
@clear="handleInputClear"
|
||||||
|
></el-input>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
<el-form-item style="margin-left: 1vw">
|
||||||
|
<el-button type="primary" @click="handelQuery">{{$t('backendSystem.query')}}</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
border
|
||||||
|
style="width: 100%; margin-bottom: 18px"
|
||||||
|
:header-cell-style="{ 'text-align': 'center' }"
|
||||||
|
:cell-style="{ 'text-align': 'center' }"
|
||||||
|
height="60vh"
|
||||||
|
>
|
||||||
|
<el-table-column prop="id" label="ID" width="60" />
|
||||||
|
<el-table-column prop="coin" :label="$t('backendSystem.coin2')" width="100" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope" >
|
||||||
|
<div style="display: flex; align-items: center;justify-content: center;">
|
||||||
|
<img :src="handelImg(scope.row.coin)" style="width: 20px" />
|
||||||
|
<span style="margin-left: 5px">{{ scope.row.coin }}</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="user" :label="$t('backendSystem.email2')" width="200" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="amount" :label="$t('backendSystem.amount2')" width="150" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="status" :label="$t('backendSystem.status2')" width="100">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="scope.row.status === '1' ? 'success' : 'danger'">{{
|
||||||
|
scope.row.status == "0" ? $t('backendSystem.normal') : $t('backendSystem.delete')
|
||||||
|
}}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="minerUser" :label="$t('backendSystem.minerUser2')" width="180" show-overflow-tooltip/>
|
||||||
|
<el-table-column prop="balance" :label="$t('backendSystem.balance2')" show-overflow-tooltip />
|
||||||
|
<el-table-column prop="active" :label="$t('backendSystem.active2')" width="100" show-overflow-tooltip>
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag :type="scope.row.active === '1' ? 'success' : 'danger'">{{
|
||||||
|
scope.row.active == "0" ? $t('backendSystem.yes') : $t('backendSystem.no')
|
||||||
|
}}</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
|
<el-table-column :label="$t('backendSystem.operation')" width="200">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button size="mini" @click="handleDetails(scope.row)" type="primary" plain>{{$t('backendSystem.Details')}}</el-button>
|
||||||
|
<el-button size="mini" @click="sendEmail(scope.row)" style="color: #651fff; border: 1px solid #651fff"
|
||||||
|
>{{$t('backendSystem.sendEmail')}}</el-button
|
||||||
|
>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="24" style="display: flex; justify-content: center;">
|
||||||
|
<el-pagination
|
||||||
|
style="margin:0 auto;margin-top: 10px;"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
:current-page.sync="currentPage"
|
||||||
|
:page-sizes="pageSizes"
|
||||||
|
:page-size="userListParams.pageSize"
|
||||||
|
layout="total, sizes, prev, pager, next, jumper"
|
||||||
|
:total="total">
|
||||||
|
</el-pagination>
|
||||||
|
</el-col>
|
||||||
|
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 发送邮箱弹窗-->
|
||||||
|
<el-dialog
|
||||||
|
:title="$t('backendSystem.emailContent')"
|
||||||
|
:visible.sync="dialogVisible"
|
||||||
|
width="50%"
|
||||||
|
:before-close="handleClose"
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<el-form :model="senParams" ref="formRef" :rules="emailRules">
|
||||||
|
<el-form-item :label="$t('backendSystem.recipient')" prop="to">
|
||||||
|
<el-input maxlength="500" resize="none" v-model="senParams.to" type="textarea" :rows="2" />
|
||||||
|
<div style="color: #999; font-size: 12px; margin-top: 4px;">{{$t('backendSystem.emailRemind')}}</div>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('backendSystem.subject')" prop="subject">
|
||||||
|
<el-input resize="none" maxlength="300" show-word-limit v-model="senParams.subject" type="textarea" :rows="3" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item :label="$t('backendSystem.text')" prop="text">
|
||||||
|
<el-input resize="none" maxlength="600" show-word-limit v-model="senParams.text" type="textarea" :rows="8" />
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="handleClose">{{$t("backendSystem.cancel")}}</el-button>
|
||||||
|
<el-button type="primary" :loading="sendEmailLoading" @click="sureSendEmail">{{$t("backendSystem.send")}}</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Index from "./index";
|
||||||
|
export default {
|
||||||
|
mixins: [Index],
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.main-title {
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: bold;
|
||||||
|
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -248,7 +248,7 @@
|
||||||
:cell-style="{ 'text-align': 'center' }"
|
:cell-style="{ 'text-align': 'center' }"
|
||||||
:data="from1"
|
:data="from1"
|
||||||
style="width: 100%; text-transform: none;"
|
style="width: 100%; text-transform: none;"
|
||||||
max-height="600"
|
max-height="550"
|
||||||
stripe
|
stripe
|
||||||
>
|
>
|
||||||
<el-table-column prop="id" :label="$t(`work.WorkID`)" > </el-table-column>
|
<el-table-column prop="id" :label="$t(`work.WorkID`)" > </el-table-column>
|
||||||
|
@ -290,7 +290,7 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 分页 -->
|
<!-- 分页 -->
|
||||||
<el-row type="flex" justify="center" style="margin-top: 15px;">
|
<el-row type="flex" justify="center" style="margin-top: 20px;margin-bottom: 10px;">
|
||||||
<el-col :span="10">
|
<el-col :span="10">
|
||||||
<el-pagination
|
<el-pagination
|
||||||
@size-change="handleSizeChange"
|
@size-change="handleSizeChange"
|
||||||
|
@ -686,19 +686,19 @@ export default {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
background-image: url(../../assets/img/miningAccount/top.png);
|
// background-image: url(../../assets/img/miningAccount/top.png);
|
||||||
background-size: 100% 50%;
|
// background-size: 100% 50%;
|
||||||
background-repeat: no-repeat;
|
// background-repeat: no-repeat;
|
||||||
background-position: 30% -15%;
|
// background-position: 30% -15%;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-top: 60PX;
|
// padding-top: 60PX;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
}
|
}
|
||||||
.workBKContent{
|
.workBKContent{
|
||||||
width: 60%;
|
width: 100%;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -1 +1 @@
|
||||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.f413248c.js></script><script defer src=/js/app-d363ae0c.ec582e15.js></script><script defer src=/js/app-5c551db8.6b412dd5.js></script><script defer src=/js/app-01dc9ae1.e746f05c.js></script><script defer src=/js/app-8e0489d9.3811f71f.js></script><script defer src=/js/app-72600b29.11174efb.js></script><script defer src=/js/app-f035d474.92e1d288.js></script><script defer src=/js/app-113c6c50.56b97e4e.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-189e7968.908e0479.css rel=stylesheet><link href=/css/app-01dc9ae1.04da7d85.css rel=stylesheet><link href=/css/app-8e0489d9.c5f430f0.css rel=stylesheet><link href=/css/app-72600b29.37eab263.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-113c6c50.dfa1d227.css rel=stylesheet></head><body><div id=app></div></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><meta name=google-site-verification content=pKAZogQ0NQ6L4j9-V58WJMjm7zYCFwkJXSJzWu9UDM8><meta name=robots content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"><meta name=googlebot content="index, follow"><meta name=googlebot-news content="index, follow"><meta name=bingbot content="index, follow"><link rel=alternate hreflang=zh href=https://m2pool.com/zh><link rel=alternate hreflang=en href=https://m2pool.com/en><link rel=alternate hreflang=x-default href=https://m2pool.com/en><meta property=og:title content="M2pool - Stable leading high-yield mining pool"><meta property=og:description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining"><meta property=og:url content=https://m2pool.com/en><meta property=og:site_name content=M2Pool><meta property=og:type content=website><meta property=og:image content=https://m2pool.com/logo.png><link rel=icon href=/favicon.ico><link rel=stylesheet href=//at.alicdn.com/t/c/font_4582735_7i8wfzc0art.css><title>M2pool - Stable leading high-yield mining pool</title><meta name=keywords content="M2Pool, cryptocurrency mining pool,Entropyx(enx),entropyx, bitcoin mining, DGB mining, mining pool service, 加密货币矿池, 比特币挖矿, DGB挖矿"><meta name=description content="M2Pool provides professional mining services, supporting multiple cryptocurrency mining, including nexa, grs, mona, dgb, rxd, enx"><meta name=format-detection content="telephone=no"><meta name=apple-mobile-web-app-capable content=yes><script defer src=/js/chunk-vendors-945ce2fe.648a91a9.js></script><script defer src=/js/chunk-vendors-aacc2dbb.d317c558.js></script><script defer src=/js/chunk-vendors-bc050c32.3f2f14d2.js></script><script defer src=/js/chunk-vendors-3003db77.d0b93d36.js></script><script defer src=/js/chunk-vendors-9d134daf.bb668c99.js></script><script defer src=/js/chunk-vendors-439af1fa.48a48f35.js></script><script defer src=/js/chunk-vendors-5c533fba.b9c00e08.js></script><script defer src=/js/chunk-vendors-96cecd74.a7d9b845.js></script><script defer src=/js/chunk-vendors-c2f7d60e.3710fdc2.js></script><script defer src=/js/chunk-vendors-89d5c698.2190b4ca.js></script><script defer src=/js/chunk-vendors-377fed06.159de137.js></script><script defer src=/js/chunk-vendors-5a805870.4cfc0ae8.js></script><script defer src=/js/chunk-vendors-cf2e0a28.c6e99da0.js></script><script defer src=/js/app-42f9d7e6.2598fd7a.js></script><script defer src=/js/app-d363ae0c.40a47f4f.js></script><script defer src=/js/app-5c551db8.89b85533.js></script><script defer src=/js/app-b4c4f6ec.94c0ddb2.js></script><script defer src=/js/app-45954fd3.508cc9ca.js></script><script defer src=/js/app-72600b29.ee6f16e3.js></script><script defer src=/js/app-f035d474.34668127.js></script><script defer src=/js/app-7023e5b0.a956a90d.js></script><script defer src=/js/app-113c6c50.3dff300c.js></script><link href=/css/chunk-vendors-5c533fba.6f97509c.css rel=stylesheet><link href=/css/app-189e7968.9dadb641.css rel=stylesheet><link href=/css/app-b4c4f6ec.6e507abe.css rel=stylesheet><link href=/css/app-45954fd3.ebaa14f6.css rel=stylesheet><link href=/css/app-72600b29.6fce1895.css rel=stylesheet><link href=/css/app-f035d474.0348646a.css rel=stylesheet><link href=/css/app-7023e5b0.87f1eef9.css rel=stylesheet><link href=/css/app-113c6c50.1696c00b.css rel=stylesheet></head><body><div id=app></div></body></html>
|
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue