Compare commits

..

3 Commits

Author SHA1 Message Date
c2b740a191 Merge pull request 'main' (#49) from main into prod
Reviewed-on: #49
2025-11-25 15:57:38 +08:00
hrx
649f93e02a updata 2025-11-25 15:53:20 +08:00
hrx
b7f234f613 updata 2025-11-25 15:52:13 +08:00
6 changed files with 67 additions and 184 deletions

View File

@ -171,7 +171,7 @@ Vue.use(HappyScroll)
// });
// console.log(element);
// console.clear(); // 清除测试日志
// console.clear(); // 清除测试日志
// }
// // 方法4: 检查Eruda等移动端调试工具
@ -270,7 +270,7 @@ Vue.use(HappyScroll)
// console.log('防调试保护已启用');
// }
// ==================== 防 F12 和右键检查功能结束 ====================
// ==================== 防F12和右键检查功能结束 ====================
Vue.use(Element, {
size: Cookies.get('size') || 'medium' // set element-ui default size

View File

@ -21,7 +21,7 @@ import CreateEip from "@/views/product/productHome/capitalOnline/Net/Eip/createE
import { getHomePath } from '@/views/setting/tools'
Vue.use(Router);
/**
* Note: sub-menu only appear when route children.length >= 1
* Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html

View File

@ -13,8 +13,8 @@
<div class="nav-list">
<!-- 首页 -->
<p :class="{ active: $route.path.includes('/index') }">
<a @click="$router.push('/homePage/index')">{{ translations[language].home }}</a>
<!-- 动态判断域名跳转首页 -->
<a @click="goHome">{{ translations[language].home }}</a>
</p>
<!-- 产品与服务鼠标移入显示子菜单 -->
<p @mouseleave="sildeOut" @mouseenter="sildeIn(product_service)">
@ -35,18 +35,13 @@
<!-- 用户区域登录/注册按钮和用户下拉菜单 -->
<div class="user-area">
<!-- 中英互译 -->
<!-- <div class="language-toggle" @click="toggleLanguage">
<span class="iconfont icon-ditu_diqiu_o"></span>
<span class="language-text">{{ language === 'zh' ? 'English' : '中文' }}</span>
</div> -->
<!-- AI -->
<i class="iconfont icon-AIzhushou functions" @click="handleAIClick"></i>
<!-- 客服 -->
<i class="iconfont icon-kefu functions" @click="handleServiceClick"></i>
<!-- 控制台按钮已登录 -->
<a @click="goB" v-if="loginState" class="login-btn">{{ translations[language].console }}</a>
<!-- 消息 - 修改这里点击时打开消息中心 -->
<!-- 消息 -->
<i class="iconfont icon-xiaoxi functions" @click="handleMessageClick"></i>
<!-- 登录按钮未登录 -->
<a @click="$router.push({
@ -62,29 +57,25 @@
<!-- 用户下拉菜单已登录 -->
<el-dropdown v-if="loginState" @visible-change="handleShow"
class="avatar-container right-menu-item hover-effect nick-name-style" style="margin-right: 0" trigger="click">
<div class="avatar-wrapper">
<!-- 显示用户名首字母头像和用户名 -->
<!-- 头像区域添加点击事件 -->
<div class="avatar-wrapper" @click="goHome">
<i
style="font-size: 18px; color: #262626;font-weight: 400;cursor: pointer;display: flex;justify-content: flex-end;align-items: center">
<div class="imgUser"><img src="../../../../assets/image/user.png" alt=""></div>
{{ nick_name }}
<!-- 下拉箭头图标 -->
<i id="resverIcon" class="el-icon-arrow-up el-icon--right resverIcon"></i>
</i>
</div>
<!-- 用户信息下拉菜单内容 -->
<el-dropdown-menu slot="dropdown" style="width: 230px;font-size: 16px;" divided>
<!-- 用户信息头部 -->
<div style="display: flex;flex-direction: column;padding:15px 15px;background-color: #f0f2f5">
<span style="font-weight: bold;font-size: 20px;margin-bottom: 5px;color: #333333">{{ nick_name }}</span>
<span style="font-size: 12px;color:#666;display: flex;justify-content:flex-start;align-items: center"> ID:
<!-- 用户ID点击复制按钮可复制 -->
<span ref="contentToCopy">
{{
userId
}}
</span>
<!-- 复制按钮 -->
<svg @click="copyBtn" class="copy-btn" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg"
width="12" height="12" style="fill: #1019ab;">
<path
@ -93,9 +84,7 @@
</svg>
</span>
</div>
<!-- 分割线 -->
<el-divider style="margin: 0!important;"></el-divider>
<!-- 客户角色余额和充值按钮 -->
<div v-if="role.includes('客户')"
style="padding: 0 18px; width: 100%;height: 60px;display: flex;justify-content: space-between;align-items: center">
<span style="color:#666;display: block;font-size: 14px;" class="moneyNow"><span
@ -107,11 +96,9 @@
{{ translations[language].recharge }}
</el-button>
</div>
<!-- 个人中心菜单项 -->
<el-dropdown-item v-if="role.includes('客户')" @click.native="$router.push('/customer/customerInformation')">
<span style="display: block">{{ translations[language].personalCenter }}</span>
</el-dropdown-item>
<!-- 退出登录菜单项 -->
<el-dropdown-item @click.native="logout">
<span style="display: block">{{ translations[language].logout }}</span>
</el-dropdown-item>
@ -120,10 +107,9 @@
</div>
</div>
<!-- 悬浮面板显示生态与合作的详细子菜单 -->
<!-- 悬浮面板 -->
<div @mouseleave="sildeOut" @mouseenter="keepPanel" v-show="isShowPanel" class="panel">
<div class="inPanel">
<!-- 左侧面板一级和二级菜单 -->
<div class="panelLeft">
<ul class="outUl">
<li style="cursor: default" class="outLi" v-for="item in showPanelData" :key="item.firTitle">
@ -141,9 +127,7 @@
</li>
</ul>
</div>
<!-- 分隔线 -->
<span class="ge"></span>
<!-- 左侧面板三级菜单如果存在且不等于二级菜单标题 -->
<div
v-if="secMenuData.length > 0 && secMenuData[0].thrMenu && secMenuData[0].thrMenu.length > 0 && secMenuData[0].thrMenu[0].thrTitle != null && secMenuData[0].secTitle !== secMenuData[0].thrMenu[0].thrTitle"
class="panelLeft">
@ -154,11 +138,9 @@
</li>
</ul>
</div>
<!-- 分隔线 -->
<span
v-if="secMenuData.length > 0 && secMenuData[0].thrMenu && secMenuData[0].thrMenu.length > 0 && secMenuData[0].thrMenu[0].thrTitle != null && secMenuData[0].secTitle !== secMenuData[0].thrMenu[0].thrTitle"
class="ge"></span>
<!-- 右侧面板最细粒度的菜单项 -->
<div class="panelRight"
v-if="showPanelRightData.length > 0 && showPanelRightData[0] && showPanelRightData[0].value">
<ul class="leastMenu inBox">
@ -169,7 +151,6 @@
</li>
</ul>
</div>
<!-- 当没有数据时显示空状态 -->
<div class="panelRight" v-else>
<div style="text-align: center; color: #999; padding: 20px;">
{{ translations[language].noData }}
@ -190,23 +171,14 @@
<script>
import Vue from 'vue'
//
import { computingData, networkData, storageData, testData } from "@/views/homePage/components/topBox/testData";
// API
import { reqNavList, reqNewHomeFestival, reqNewHomeSync } from "@/api/newHome";
// Vuex
import { mapGetters, mapState } from "vuex";
// API
import { getLogoAPI, getUserInfoAPI } from "@/api/login";
import { reqApplyChannel } from "@/api/customer/channel";
// store
import store from "@/store";
//
import { getHomePath } from '@/views/setting/tools'
//
import { languageStore, languageBus } from '@/utils/language'
//
import MessageCenter from '@/components/MessageCenter/MessageCenter.vue'
export default Vue.extend({
@ -216,25 +188,25 @@ export default Vue.extend({
},
data() {
return {
messageCenterVisible: false, //
homePath: getHomePath(), //
isShowKbossCharge: false, // Kboss
role: sessionStorage.getItem("jueseNew") == "admin" ? [] : sessionStorage.getItem("jueseNew"), //
userId: sessionStorage.getItem("userId"), // ID
firId: "", // ID
secId: "", // ID
nick_name: "", //
showTimer: null, //
hideTimer: null, //
showPanelData: [], //
secMenuData: [], //
showPanelRightData: [], //
threeData: [], //
fourData: [], // 使
product_service: [], //
language: 'zh', //
languageChangedHandler: null, //
messageCount: 0, //
messageCenterVisible: false,
homePath: getHomePath(),
isShowKbossCharge: false,
role: sessionStorage.getItem("jueseNew") == "admin" ? [] : sessionStorage.getItem("jueseNew"),
userId: sessionStorage.getItem("userId"),
firId: "",
secId: "",
nick_name: "",
showTimer: null,
hideTimer: null,
showPanelData: [],
secMenuData: [],
showPanelRightData: [],
threeData: [],
fourData: [],
product_service: [],
language: 'zh',
languageChangedHandler: null,
messageCount: 0,
translations: {
zh: {
home: '首页',
@ -253,17 +225,14 @@ export default Vue.extend({
aiAssistant: 'AI助手',
customerService: '在线客服',
featureComingSoon: '功能即将上线,敬请期待!',
//
'云': '云',
'算': '算',
'网': '网',
'用': '用',
//
'百度云': '百度云',
'智算': '智算',
'算力网络': '算力网络',
'AI应用': 'AI应用',
//
'计算': '计算',
'网络': '网络',
'存储': '存储',
@ -279,7 +248,6 @@ export default Vue.extend({
'智能短信': '智能短信',
'智慧医疗': '智慧医疗',
'智慧客服': '智慧客服',
//
'云服务器_GPU': '云服务器_GPU',
'云服务器_BCC': '云服务器_BCC',
'专属服务器': '专属服务器',
@ -368,17 +336,14 @@ export default Vue.extend({
aiAssistant: 'AI Assistant',
customerService: 'Customer Service',
featureComingSoon: 'Feature coming soon, stay tuned!',
//
'云': 'Cloud',
'算': 'Computing',
'网': 'Network',
'用': 'Application',
//
'百度云': 'Baidu Cloud',
'智算': 'Intelligent Computing',
'算力网络': 'Computing Power Network',
'AI应用': 'AI Application',
//
'计算': 'Compute',
'网络': 'Network',
'存储': 'Storage',
@ -394,7 +359,6 @@ export default Vue.extend({
'智能短信': 'Smart SMS',
'智慧医疗': 'Smart Healthcare',
'智慧客服': 'Smart Customer Service',
//
'云服务器_GPU': 'Cloud Server GPU',
'云服务器_BCC': 'Cloud Server BCC',
'专属服务器': 'Dedicated Server',
@ -470,30 +434,19 @@ export default Vue.extend({
}
},
created() {
// homePath
this.homePath = getHomePath()
// sessionStorageuserIdtrue
if (sessionStorage.getItem('userId')) {
this.$store.commit('setLoginState', true); // Vuex
this.$store.commit('setLoginState', true);
}
//
!this.showRegisterButton && this.getUserInfo();
//
this.init()
//
this.initLanguage()
//
this.initData()
},
mounted() {
// sessionStorage
if (sessionStorage.getItem("username")) {
this.nick_name = sessionStorage.getItem("username");
}
//
this.$nextTick(() => {
const topContainer = document.getElementById('topContainer');
if (topContainer) {
@ -505,40 +458,37 @@ export default Vue.extend({
});
},
beforeDestroy() {
//
if (this.languageChangedHandler) {
languageBus.$off('language-changed', this.languageChangedHandler)
}
},
computed: {
// Vuexgetters
...mapGetters(["sidebar", "avatar", "device"]),
// Vuexstate
...mapState({
isShowPanel: (state) => state.product.showHomeNav, //
navIndex: (state) => state.product.navIndex, //
gridObj: state => state.operationAnalysis.gridObj, // 使
mybalance: state => state.user.mybalance, //
logoutUrl: state => state.login.logoutUrl, // 退URL
loginStateVuex: state => state.login.loginState, // Vuex
logoInfoNew: state => state.product.logoInfoNew, // Logo
isShowPanel: (state) => state.product.showHomeNav,
navIndex: (state) => state.product.navIndex,
gridObj: state => state.operationAnalysis.gridObj,
mybalance: state => state.user.mybalance,
logoutUrl: state => state.login.logoutUrl,
loginStateVuex: state => state.login.loginState,
logoInfoNew: state => state.product.logoInfoNew,
}),
// VuexsessionStorageuserId
loginState() {
const userId = sessionStorage.getItem('userId');
return this.loginStateVuex || (userId !== null && userId !== 'null' && userId !== '');
},
//
showRegisterButton() {
const orgType = window.sessionStorage.getItem('org_type');
const userId = window.sessionStorage.getItem('userId');
console.log("此时是:", orgType !== '2' && orgType !== '3' && userId !== null)
return orgType !== '2' && orgType !== '3' && userId === null;
},
//
username() {
return sessionStorage.getItem('username') || '';
},
// ncmatch.cn
isNcmatchDomain() {
return window.location.hostname.includes('ncmatch.cn');
}
},
methods: {
// AI
@ -548,7 +498,6 @@ export default Vue.extend({
duration: 3000,
showClose: true
});
},
//
@ -563,14 +512,11 @@ export default Vue.extend({
//
handleMessageClick() {
if (this.loginState) {
//
this.messageCenterVisible = true;
//
if (this.$refs.messageCenter) {
this.$refs.messageCenter.open();
}
} else {
//
this.handleGoLogin()
}
},
@ -582,51 +528,26 @@ export default Vue.extend({
//
initLanguage() {
// store
this.language = languageStore.getLanguage()
console.log('topBox初始化语言:', this.language)
// 便
this.languageChangedHandler = (lang) => {
console.log('topBox接收到语言变化:', lang)
this.language = lang
}
//
languageBus.$on('language-changed', this.languageChangedHandler)
},
// - 使
//
toggleLanguage() {
const newLanguage = this.language === 'zh' ? 'en' : 'zh';
console.log('topBox切换语言到:', newLanguage);
// 使
languageStore.setLanguage(newLanguage);
//
setTimeout(() => {
console.log('切换后验证 - topBox语言:', this.language);
console.log('切换后验证 - store语言:', languageStore.getLanguage());
}, 200);
},
//
//
getTranslation(key) {
if (!key) return ''
return this.translations[this.language]?.[key] || key
},
//
debugLanguage() {
console.log('=== topBox语言调试信息 ===');
console.log('当前语言:', this.language);
console.log('languageStore状态:', languageStore.getLanguage());
console.log('localStorage状态:', localStorage.getItem('language'));
languageStore.debug();
},
//
//
goB() {
if (sessionStorage.getItem('jueseNew').includes('客户')) {
this.$router.push('/product/productHome')
@ -638,7 +559,6 @@ export default Vue.extend({
// Logo
init() {
let remoteUrl = ''
// APIURL
if (window.location.href.includes("dev")) {
remoteUrl = 'https://www.kaiyuancloud.cn/dev/reseller/get_ipc_logo.dspy'
} else if (window.location.href.includes("localhost")) {
@ -648,13 +568,10 @@ export default Vue.extend({
}
let params = {
url_link: window.location.href.split("#")[0] // URL
url_link: window.location.href.split("#")[0]
}
getLogoAPI(params).then((res) => {
console.log("获取接口触发了")
if (res.status == true && res.data && res.data.length) {
console.log("res.data[0].additional_msg", res.data[0].additional_msg)
// LogoVuex
this.$store.commit('setLogoInfoNew', res.data[0].additional_msg);
this.isShow = true
if (res.data[0].orgname == '中关村数智人工智能产业联盟') {
@ -665,7 +582,6 @@ export default Vue.extend({
if (this.photosUrl.orgname != '业主机构') {
this.isLogo = true
this.logoImg = this.photosUrl.logo;
this.$store.commit('setLogo', this.photosUrl.logo)
this.logoText = this.photosUrl.orgname;
} else {
@ -673,7 +589,6 @@ export default Vue.extend({
}
} else {
this.$message({
// message: res.msg,
message: "获取ipc失败~",
type: "error",
});
@ -683,24 +598,19 @@ export default Vue.extend({
// 退
async logout() {
this.$store.commit('setLoginState', false) // Vuexfalse
//
this.$store.commit('setLoginState', false)
store.commit('tagsView/resetBreadcrumbState');
sessionStorage.removeItem("auths");
sessionStorage.removeItem("routes");
sessionStorage.removeItem("user");
sessionStorage.removeItem("userId");
sessionStorage.removeItem("org_type")
localStorage.removeItem("auths");
localStorage.removeItem("routes");
localStorage.removeItem("user");
localStorage.removeItem("userId");
localStorage.removeItem("org_type")
localStorage.removeItem('userId')
//
if (!window.location.href.includes('homePage/index')) {
await this.$router.push(getHomePath());
}
@ -724,7 +634,7 @@ export default Vue.extend({
})
},
// sessionStorage
//
initMybalance() {
return sessionStorage.getItem('mybalance')
},
@ -742,10 +652,8 @@ export default Vue.extend({
//
async getUserInfo() {
if (!this.userId) return;
getUserInfoAPI({ id: this.userId }).then((res) => {
if (res.status) {
// this.nick_name = res.data[0].nick_name;
this.userInfoList = res.data;
sessionStorage.setItem("orgid", res.data[0].orgid);
} else {
@ -760,21 +668,18 @@ export default Vue.extend({
// /
handleShow(isShow) {
let resverNode = document.getElementById('resverIcon')
if (isShow) {
if (this.role.includes('客户')) {
this.$store.dispatch('user/getCustmoersMoney') //
this.$store.dispatch('user/getCustmoersMoney')
}
resverNode.style.transform = 'rotate(180deg)' //
resverNode.style.transform = 'rotate(180deg)'
} else {
resverNode.style.transform = 'rotate(0)' //
resverNode.style.transform = 'rotate(0)'
}
},
//
sildeThrMenu(item) {
console.log("it", item)
let res = []
res.push(item)
this.showPanelRightData = res
@ -782,15 +687,12 @@ export default Vue.extend({
//
clickGo(item) {
this.$store.commit('setShowHomeNav', false) //
console.log("电机的item是", item)
this.$store.commit('setShowHomeNav', false)
let userId = sessionStorage.getItem('userId')
const orgType = window.sessionStorage.getItem('org_type');
let isKehu = orgType === '2' || orgType === '3';
console.log("userId", userId)
if (item.type === '百度云') {
if (this.loginState) {
//
this.$store.commit('setRedirectUrl', item.url)
localStorage.setItem('redirectUrl', item.url)
localStorage.setItem('userRescourseUrl', item.listUrl)
@ -814,12 +716,11 @@ export default Vue.extend({
}
} else if (item.type === '阿里云') {
if (this.loginState) {
//
reqNewHomeSync().then(response => {
if (response.status) {
reqNewHomeFestival().then(res => {
if (res.status) {
window.open(res.data) //
window.open(res.data)
} else {
this.$message.warning(res.msg)
}
@ -868,16 +769,10 @@ export default Vue.extend({
//
changeData(data) {
this.showPanelData = data || []
//
this.secMenuData = data?.[0]?.secMenu || []
// threeDatashowPanelRightData
if (this.secMenuData.length > 0) {
const firstSecMenu = this.secMenuData[0]
this.threeData = firstSecMenu.thrMenu || []
// thrTitlenull
if (this.threeData.length > 0) {
this.showPanelRightData = this.threeData.map(item => ({
...item,
@ -898,14 +793,12 @@ export default Vue.extend({
//
initData() {
reqNavList({ url_link: window.location.href }).then(res => {
console.log("res", res.data.product_service)
if (res.status) {
this.product_service = this.buildData(res.data.product_service) //
this.product_service = this.buildData(res.data.product_service)
this.changeData(this.product_service)
}
}).catch(error => {
console.error("获取导航数据失败:", error)
//
this.product_service = []
this.changeData([])
})
@ -921,7 +814,7 @@ export default Vue.extend({
secItem.thrMenu.forEach(thrItem => {
if (thrItem.value && Array.isArray(thrItem.value)) {
thrItem.value.forEach(valueItem => {
valueItem.type = secItem.secTitle; // typesecTitle
valueItem.type = secItem.secTitle;
});
}
});
@ -929,15 +822,12 @@ export default Vue.extend({
});
}
});
return data; //
return data;
},
//
sildeSecMenu(item) {
console.log("获取的item时", item)
this.secId = item.id
// thrMenuthrTitlenull
if (!item.thrMenu || item.thrMenu.length === 0) {
this.threeData = []
this.showPanelRightData = [{
@ -946,13 +836,10 @@ export default Vue.extend({
}]
return
}
// thrTitlenull
this.threeData = item.thrMenu.map(menu => ({
...menu,
thrTitle: menu.thrTitle || item.secTitle
}))
this.showPanelRightData = this.threeData
},
@ -971,7 +858,6 @@ export default Vue.extend({
sildeItemIn(item) {
this.firId = item.id
this.secId = item.secMenu[0].id
console.log("获取的item时", item)
this.secMenuData = item.secMenu || []
this.showPanelRightData = this.secMenuData[0].thrMenu || []
},
@ -981,12 +867,10 @@ export default Vue.extend({
//
sildeIn(item) {
console.log("sildeIn", item)
this.changeData(item)
if (this.hideTimer) {
clearTimeout(this.hideTimer)
}
//
this.showTimer = setTimeout(() => {
this.$store.commit('setShowHomeNav', true)
}, 100)
@ -997,7 +881,6 @@ export default Vue.extend({
if (this.showTimer) {
clearTimeout(this.showTimer)
}
//
this.hideTimer = setTimeout(() => {
this.$store.commit('setShowHomeNav', false)
}, 200)
@ -1014,13 +897,19 @@ export default Vue.extend({
handleGoLogin() {
let token = this.$store.getters.token;
if (!token) {
//
this.$message.warning('请先登录哦~');
this.$router.push({
path: '/login'
});
} else {
}
},
//
goHome() {
if (this.isNcmatchDomain) {
this.$router.push('/ncmatchHome/index');
} else {
this.$router.push('/homePage/index');
}
}
},
@ -1118,7 +1007,6 @@ export default Vue.extend({
.language-toggle {
cursor: pointer;
margin-right: 20px;
// width: 60px;
text-align: center;
border-radius: 4px;
font-size: 14px;
@ -1140,11 +1028,9 @@ export default Vue.extend({
}
a {
// padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
text-decoration: none;
// margin-left: 10px;
transition: all 0.3s;
}
@ -1158,7 +1044,6 @@ export default Vue.extend({
}
.register-btn {
// height: 50px;
display: flex;
justify-content: center;
align-items: center;
@ -1231,7 +1116,6 @@ export default Vue.extend({
li {
padding: 10px;
//cursor: pointer;
transition: background-color 0.3s;
&:hover {
@ -1350,7 +1234,6 @@ export default Vue.extend({
}
.clickItem {
//margin: 30px 0 !important;
margin-bottom: 15px !important;
&:hover {

View File

@ -536,7 +536,7 @@ export default Vue.extend({
}
}
/* 功能项图标样式 */
/* 功能项图标样式 */
.function-icon-wrapper {
border-radius: 50%;
width: 60px;

View File

@ -1022,7 +1022,7 @@ $light_gray: #eee;
$dark_gray: #889aa4;
.main-box {
background: url('/static/img/banner.0798e703.png') no-repeat center center;
background: url('/static/img/banner.png') no-repeat center center;
background-size: cover;
width: 100vw;
height: 100vh;

View File

@ -357,9 +357,9 @@ export default {
this.isDisabled1 = false;
this.dialogVisible = false;
that.SendCode_text1 = "获取验证码";
clearInterval(that.timer1);
that.timer1 = null;
that.time_count1 = 60;
clearInterval(this.timer1);
this.timer1 = null;
this.time_count1 = 60;
this.$refs.form.resetFields();
} else {
this.$message({