fix(vip): preserve safe HTML in VIP copy

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Opus 5 committed 2026-10-19 12:52:23 +08:00
1 parent 7a0445fc4a
commit 573040381d
15 files changed
+155 -118

No files matched your search

+9 -13
View File
@@ -17,8 +17,7 @@
return el;
}
// 服务端已按 post 级 HTML 净化的富文本字段(more / 卡密说明)走 innerHTML;
// node() 的 textContent 会把标签当字面文本显示。
// Server-side schema sanitization limits these configured rich-text fields to post-safe HTML.
function htmlNode(tag, className, value) {
var el = document.createElement(tag);
if (className) el.className = className;
@@ -70,7 +69,7 @@
if (levelInfo && levelInfo.img_icon) {
var img = node("img", "img-icon");
img.src = text(levelInfo.img_icon);
img.alt = text(levelInfo.name || "");
img.alt = text(levelInfo.name_text || levelInfo.name || "");
img.decoding = "async";
return img;
}
@@ -125,7 +124,7 @@
// (右上 tag + 价格行 + 时长 badge,无标题行)。
var product = node("div", "zib-widget vip-product relative text-center product-box");
// 标签颜色取后台「标签颜色」配置,未配置时回退参考主题默认的 jb-yellow。
if (item.discount_tag) append(product, node("div", "abs-right vip-tag badg " + (item.tag_class || "jb-yellow"), item.discount_tag));
if (item.discount_tag) append(product, htmlNode("div", "abs-right vip-tag badg " + (item.tag_class || "jb-yellow"), item.discount_tag));
append(product, priceRow(mark, item.price_label || "", item.show_price_label || ""));
if (item.days_label) append(product, node("div", "muted-2-color c-blue em09 p2-10 badg radius", item.days_label));
append(label, product);
@@ -408,7 +407,7 @@
} else if (member.state === "expired") {
append(userInfo, node("div", "muted-2-color em09", "已过期"));
} else if (catalog.desc) {
append(userInfo, node("div", "muted-2-color em09", catalog.desc));
append(userInfo, htmlNode("div", "muted-2-color em09", catalog.desc));
}
append(userBox, userInfo);
append(modal, userBox);
@@ -444,8 +443,8 @@
append(miniIcon, vipIcon(levelInfo));
append(miniIconbox, miniIcon);
var miniInfo = node("div", "v-info");
append(miniInfo, node("div", "v-name", actionLabel(action) + (levelInfo.name || group.name || "VIP" + level)));
append(miniInfo, node("div", "v-desc em09", levelInfo.desc || ""));
append(miniInfo, htmlNode("div", "v-name", actionLabel(action) + (levelInfo.name || group.name || "VIP" + level)));
append(miniInfo, htmlNode("div", "v-desc em09", levelInfo.desc || ""));
append(miniIconbox, miniInfo);
append(miniCard, miniIconbox);
append(tab, miniCard);
@@ -471,15 +470,12 @@
append(vicon, vipIcon(levelInfo));
append(iconbox, vicon);
var vinfo = node("div", "v-info");
append(vinfo, node("div", "v-name", levelInfo.name || group.name || "VIP" + level));
append(vinfo, node("div", "v-desc em09", levelInfo.desc || ""));
append(vinfo, htmlNode("div", "v-name", levelInfo.name || group.name || "VIP" + level));
append(vinfo, htmlNode("div", "v-desc em09", levelInfo.desc || ""));
append(iconbox, vinfo);
append(info, iconbox);
if (levelInfo.equity) {
var equity = document.createElement("ul");
equity.className = "v-equity";
equity.innerHTML = text(levelInfo.equity);
append(info, equity);
append(info, htmlNode("div", "", levelInfo.equity));
}
var infoBa = node("div", "abs-center vip-baicon");
append(infoBa, vipIcon(levelInfo));