diff --git a/docs/maintenance/HN_SHOP_PERIODS.md b/docs/maintenance/HN_SHOP_PERIODS.md new file mode 100644 index 0000000..5f6c7af --- /dev/null +++ b/docs/maintenance/HN_SHOP_PERIODS.md @@ -0,0 +1,9 @@ +# HN购买页周期显示 + +2026-10-28用户要求:套餐卡片里置灰的不可购买周期直接不显示。 + +仅在frontends/hn/vite.config.mjs的HN适配器中,对上游Shop.vue周期标签v-for数据过滤price===null;不修改锁定EZ源码或DPL主题/代码/数据。不改套餐价格、销售状态、周期定义或订单校验。 + +本地实际浏览器确认:标准与专业各只显示月付/季度/半年/一年,一次性只显示一次性,DOM中disabled周期标签0个。周期切换/分组正常,既有价格和介绍未变。截图在共享工作目录codex/output/hn-hide-periods-20261028/shop.png。 + +生产仅发布HN,Git提交/构建与验收收据在同任务忽略目录及服务器备份;部署完成记录由GemDocs HN项目档案维护。恢复时仅回退HN此适配器提交并重新构建,或从该次静态资源备份恢复;不变更DPL、数据库或共享EZ子仓库。 diff --git a/docs/maintenance/README.md b/docs/maintenance/README.md index 80b056a..8a0c39a 100644 --- a/docs/maintenance/README.md +++ b/docs/maintenance/README.md @@ -16,6 +16,7 @@ | 文件 | 用途 | | --- | --- | | HN_MAIL_GATEWAY.md | HN独立企业邮箱/Resend、辅助域名、订阅网关、验收及恢复 | +| HN_SHOP_PERIODS.md | HN购买页隐藏不可购买周期、隔离与验收 | | HN_PRODUCTION.md | HN生产版本、主域名/后台、独立运行服务、TLS、服务器验收与回退 | | SITE_PROFILES.md | dpl / hn 独立部署参数、主题选择、开发与发布隔离 | | THEME_DESIGNS.md | tpl-a 等可复用设计方案、定稿与绑定状态、预览和验证边界 | diff --git a/frontends/hn/vite.config.mjs b/frontends/hn/vite.config.mjs index 6ab43b8..792029b 100644 --- a/frontends/hn/vite.config.mjs +++ b/frontends/hn/vite.config.mjs @@ -17,6 +17,9 @@ export default defineConfig(({mode}) => ({ transform(code, id) { if (!id.startsWith(upstream + '/src/')) return; code = code.replaceAll('src="/images/logo.png"', ':src="hnLogo"').replaceAll('/images/logo.png', '/brand/hn/logo.svg'); + if (id === path.join(upstream,'src/views/shop/Shop.vue')) { + code = code.replace('v-for="(price, type) in getPlanPrices(plan)"', 'v-for="(price, type) in Object.fromEntries(Object.entries(getPlanPrices(plan)).filter(([, price]) => price !== null))"'); + } if (id === path.join(upstream,'src/i18n/locales/zh-CN.js')) code = code.replaceAll('商店', '购买套餐'); if (id === path.join(upstream,'src/appInit.js')) code = code.replace("app.mount('#app');", "app.config.globalProperties.hnLogo = window.settings?.logo || '/brand/hn/logo.svg'; app.mount('#app');"); if (id === path.join(upstream,'src/api/user.js')) code = code.replace(/export function getIpLocationInfo\(\)\s*\{[\s\S]*?\n\}/, 'export function getIpLocationInfo() { return Promise.resolve({data: null}); }');