feat: 会员中心 hgcloud 主题初始化 + drone 部署步骤
All checks were successful
continuous-integration/drone/push Build is passing

- 解压官方默认主题 default_yfMBA.tar.gz 到 clientarea/hgcloud/
- .gitignore 排除压缩包和临时解压目录
- drone 新增步骤: 同步 hgcloud 到 /clientarea/template/pc/
This commit is contained in:
yiqiu
2026-03-19 17:56:44 +08:00
parent 75756e5a64
commit 3b41cffbc9
381 changed files with 386825 additions and 1 deletions

View File

@@ -0,0 +1,38 @@
// css 样式依赖common.css
const aliAsideMenu = {
template: ` <el-aside width="220px">
<img class="ali-logo" :src="logo"></img>
<div class="menu-list-top">
<div class="menu-item" :class="item.id === menuActiveId ? 'menu-active':''" v-for="item in menu1" :key="item.id" @click="toPage(item)">
<img :src="item.icon" class="item-img">
<span class="item-text">{{item.text}}</span>
</div>
</div>
</el-aside>`,
data() {
return {
activeId: 1,
menu1: [
{ icon: `${url}/img/common/menu1.png`, text: lang.menu_1, url: "./index.htm", id: 1 },
{ icon: `${url}/img/common/menu2.png`, text: lang.menu_4, url: "./account.htm", id: 2 },
],
logo:`${url}/img/ali/logo.png`
}
},
created() {
console.log(location.href);
},
methods: {
// 页面跳转
toPage(e) {
location.href = e.url
},
},
props: {
menuActiveId: {
type: Number,
default: 1
}
},
}

View File

@@ -0,0 +1,304 @@
// css 样式依赖common.css
const asideMenu = {
template: `
<el-aside width="190px">
<a :href="commonData.clientarea_logo_url || '/home.htm'" onclick="return false" class="menu-alink">
<img class="ali-logo" :src="logo" @click="goHome" v-show="logo"></img>
</a>
<el-menu class="menu-top" :default-active="menuActiveId" @select="handleSelect" background-color="transparent"
text-color="var(--color-menu-text)" active-text-color="var(--color-menu-text-active)">
<template v-for="(item,index) in menu1">
<!-- 只有一级菜单 -->
<template v-if="!item.child || item.child?.length === 0">
<a :href="getMenuUrl(item.id || item.url)" onclick="return false" class="menu-alink">
<el-menu-item :key="item.id ? item.id : item.url" :index="item.id ? item.id + '' : item.url">
<i class="iconfont" :class="item.icon"></i>
<span class="aside-menu-text" slot="title">{{item.name}}</span>
</el-menu-item>
</a>
</template>
<!-- 有二级菜单 -->
<el-submenu v-else :key="item.id ? item.id : item.url" :index="item.id ? item.id + '' : item.url">
<template slot="title">
<i class="iconfont" :class="item.icon"></i>
<span class="aside-menu-text" slot="title">{{item.name}}</span>
</template>
<template v-for="child in item.child">
<a :href="getMenuUrl(child.id || child.url)" onclick="return false" class="menu-alink">
<el-menu-item :index="child.id + ''" :key="child.id">
{{child.name}}
</el-menu-item>
</a>
</template>
</el-submenu>
</template>
</el-menu>
<div class="line" v-if="hasSeparate"></div>
<el-menu class="menu-top" :default-active="menuActiveId" @select="handleSelect" background-color="transparent"
text-color="var(--color-menu-text)" active-text-color="#FFF">
<template v-for="(item,index) in menu2">
<!-- 只有一级菜单 -->
<template v-if="!item.child || item.child?.length === 0">
<a :href="getMenuUrl(item.id || item.url)" onclick="return false" class="menu-alink">
<el-menu-item :key="item.id ? item.id + '' : item.url" :index="item.id ? item.id + '' : item.url">
<i class="iconfont" :class="item.icon"></i>
<span class="aside-menu-text" slot="title">{{item.name}}</span>
</el-menu-item>
</a>
</template>
<!-- 有二级菜单 -->
<el-submenu v-else :key="item.id ? item.id : item.url" :index="item.id ? item.id + '' : item.url">
<template slot="title">
<i class="iconfont" :class="item.icon"></i>
<span class="aside-menu-text" slot="title">{{item.name}}</span>
</template>
<template v-for="child in item.child">
<a :href="getMenuUrl(child.id || child.url)" onclick="return false" class="menu-alink">
<el-menu-item :index="child.id + ''" :key="child.id">
{{child.name}}
</el-menu-item>
</a>
</template>
</el-submenu>
</template>
</el-menu>
</el-aside>
`,
// 云服务器 当前
// 物理服务器 dcim
// 通用产品
data() {
return {
activeId: 1,
menu1: [],
menu2: [],
logo: "",
menuActiveId: "",
iconsData: [],
commonData: {},
noRepeat: [],
hasSeparate: false,
originMenu: [],
};
},
mounted() {
this.doGetMenu();
// const mainLoading = document.getElementById("mainLoading");
// if (mainLoading) {
// mainLoading.style.display = "none";
// }
// if (document.getElementsByClassName("template")[0]) {
// document.getElementsByClassName("template")[0].style.display = "block";
// }
},
created() {
this.getCommonSetting();
},
beforeUpdate() {},
mixins: [mixin],
updated() {
// // 关闭loading
// document.getElementsByClassName('template')[0].style.display = 'block'
const mainLoading = document.getElementById("mainLoading");
if (mainLoading) {
mainLoading.style.display = "none";
}
if (document.getElementsByClassName("template")[0]) {
document.getElementsByClassName("template")[0].style.display = "block";
}
},
methods: {
// 页面跳转
// toPage(e) {
// // 获取 当前点击导航的id 存入本地
// const id = e.id
// localStorage.setItem('frontMenusActiveId', id)
// // 跳转到对应路径
// location.href = '/' + e.url
// },
// 获取通用配置
async getCommonSetting() {
try {
const res = await getCommon();
this.commonData = res.data.data;
localStorage.setItem(
"common_set_before",
JSON.stringify(res.data.data)
);
this.logo = this.commonData.system_logo;
} catch (error) {}
},
// 判断当前菜单激活
setActiveMenu() {
const originUrl = location.pathname.slice(1);
const allUrl = originUrl + location.search;
let flag = false;
this.originMenu.forEach((item) => {
// 当前url下存在和导航菜单对应的路径
if (!item.child && item.url) {
const url = String(item.url).split("?");
if (
(url.length > 1 && item.url == allUrl) ||
(url.length == 1 && item.url == originUrl)
) {
this.menuActiveId = item.id + "";
flag = true;
}
}
// 当前url下存在二级菜单
if (item.child && item.child.length > 0) {
item.child.forEach((child) => {
const url = String(child.url).split("?");
if (
(url.length > 1 && child.url == allUrl) ||
(url.length == 1 && child.url == originUrl)
) {
this.menuActiveId = child.id + "";
flag = true;
}
});
}
});
if (!flag) {
this.menuActiveId = localStorage.getItem("frontMenusActiveId") || "";
}
},
goHome() {
localStorage.frontMenusActiveId = "";
const openUrl = this.commonData.clientarea_logo_url || "/home.htm";
if (this.commonData.clientarea_logo_url_blank == 1) {
window.open(openUrl);
} else {
location.href = openUrl;
}
},
// 获取前台导航
doGetMenu() {
getMenu().then((res) => {
if (res.data.status === 200) {
res.data.data.menu.forEach((item) => {
if (item.child && item.child.length > 0) {
this.originMenu.push(...item.child);
} else {
this.originMenu.push(item);
}
});
const menu = res.data.data.menu;
localStorage.setItem("frontMenus", JSON.stringify(menu));
let index = menu.findIndex((item) => item.name == "分隔符");
if (index != -1) {
this.hasSeparate = true;
this.menu1 = menu.slice(0, index);
this.menu2 = menu.slice(index + 1);
} else {
this.hasSeparate = false;
this.menu1 = menu;
}
this.setActiveMenu();
}
});
// 获取详情
accountDetail()
.then((res) => {
if (res.data.status == 200) {
let obj = res.data.data.account;
let id = res.data.data.account.id;
localStorage.setItem(
"is_sub_account",
obj.customfield?.is_sub_account
);
if (obj.customfield?.is_sub_account == 1) {
// 子账户
accountPermissions(id).then((relust) => {
let rule = relust.data.data.rule;
this.$emit("getruleslist", rule);
});
} else {
// 主账户
this.$emit("getruleslist", "all");
}
}
})
.catch((err) => {
console.log(err, "err----->");
});
},
arrFun(n) {
for (var i = 0; i < n.length; i++) {
//用typeof判断是否是数组
if (n[i].child && typeof n[i].child == "object") {
let obj = JSON.parse(JSON.stringify(n[i]));
delete obj.child;
this.noRepeat.push(obj);
this.arrFun(n[i].child);
} else {
this.noRepeat.push(n[i]);
}
}
},
/*
* 获取菜单url
* @param {Number} id 菜单id 或者url
* @return {String} url 菜单url
*/
getMenuUrl(id) {
const temp =
this.originMenu.find((item) => item.id == id || item.url == id) || {};
const reg =
/^(((ht|f)tps?):\/\/)([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+[a-z]{2,6}\/?/;
let url = "/" + temp.url;
if (reg.test(temp.url)) {
if (temp?.second_reminder === 1) {
url = `/transfer.htm?target=${encodeURIComponent(temp.url)}`;
} else {
url = temp.url;
}
}
return url;
},
handleSelect(id) {
localStorage.setItem("frontMenusActiveId", id);
const temp =
this.originMenu.find((item) => item.id == id || item.url == id) || {};
const reg =
/^(((ht|f)tps?):\/\/)([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+[a-z]{2,6}\/?/;
if (reg.test(temp.url)) {
if (temp?.second_reminder === 1) {
return window.open(
`/transfer.htm?target=${encodeURIComponent(temp.url)}`
);
} else {
return window.open(temp.url);
}
}
location.href = "/" + temp.url;
},
getAllIcon() {
let url = "/upload/common/iconfont/iconfont.json";
let _this = this;
// 申明一个XMLHttpRequest
let request = new XMLHttpRequest();
// 设置请求方法与路径
request.open("get", url);
// 不发送数据到服务器
request.send(null);
//XHR对象获取到返回信息后执行
request.onload = function () {
// 解析获取到的数据
let data = JSON.parse(request.responseText);
_this.iconsData = data.glyphs;
_this.iconsData.map((item) => {
item.font_class = "icon-" + item.font_class;
});
};
},
},
};