chore(deploy): switch sub2api to local build; add static gpt-products page
Some checks failed
CI / test (push) Has been cancelled
CI / frontend (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
Security Scan / backend-security (push) Has been cancelled
Security Scan / frontend-security (push) Has been cancelled

This commit is contained in:
huangzhenpc
2026-05-12 15:06:56 +08:00
parent 62ccd0ff39
commit f136fe4f3c
2 changed files with 393 additions and 1 deletions

View File

@@ -16,7 +16,13 @@ services:
# Sub2API Application
# ===========================================================================
sub2api:
image: weishaw/sub2api:latest
# 本地源码编译DIY 部署)。线上从 git 仓库拉取后执行:
# docker compose -f deploy/docker-compose.yml up -d --build sub2api
# postgres/redis 服务及命名卷与官方镜像版本完全一致,复用现有数据。
build:
context: ..
dockerfile: Dockerfile
image: sub2api:local
container_name: sub2api
restart: unless-stopped
ulimits:

View File

@@ -0,0 +1,386 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="light" />
<title>精选商品</title>
<style>
:root {
--bg: #f7f9ff;
--card: rgba(255, 255, 255, 0.92);
--text: #172033;
--muted: #667085;
--line: rgba(23, 32, 51, 0.1);
--primary: #4f46e5;
--primary-dark: #3730a3;
--accent: #06b6d4;
--success: #16a34a;
--shadow: 0 22px 60px rgba(35, 49, 89, 0.14);
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
min-height: 100%;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
"Microsoft YaHei", Arial, sans-serif;
color: var(--text);
background: transparent;
}
body {
padding: 18px;
}
.shop-panel {
position: relative;
overflow: hidden;
width: min(980px, 100%);
margin: 0 auto;
border: 1px solid var(--line);
border-radius: 28px;
background:
radial-gradient(circle at 12% 10%, rgba(79, 70, 229, 0.18), transparent 30%),
radial-gradient(circle at 88% 22%, rgba(6, 182, 212, 0.2), transparent 26%),
linear-gradient(135deg, #ffffff 0%, var(--bg) 100%);
box-shadow: var(--shadow);
}
.shop-panel::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background-image:
linear-gradient(rgba(79, 70, 229, 0.055) 1px, transparent 1px),
linear-gradient(90deg, rgba(79, 70, 229, 0.055) 1px, transparent 1px);
background-size: 34px 34px;
mask-image: linear-gradient(to bottom, #000 0%, transparent 70%);
}
.content {
position: relative;
z-index: 1;
padding: clamp(22px, 4vw, 42px);
}
.hero {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 18px;
align-items: start;
margin-bottom: 26px;
}
.eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
width: fit-content;
padding: 7px 12px;
border: 1px solid rgba(79, 70, 229, 0.18);
border-radius: 999px;
color: var(--primary-dark);
background: rgba(79, 70, 229, 0.08);
font-size: 13px;
font-weight: 700;
}
.eyebrow span {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--success);
box-shadow: 0 0 0 5px rgba(22, 163, 74, 0.12);
}
h1 {
margin: 14px 0 10px;
font-size: clamp(26px, 4vw, 42px);
line-height: 1.12;
letter-spacing: -0.04em;
}
.hero p {
max-width: 620px;
margin: 0;
color: var(--muted);
font-size: 15px;
line-height: 1.8;
}
.support {
display: grid;
gap: 8px;
min-width: 190px;
padding: 16px;
border: 1px solid rgba(6, 182, 212, 0.18);
border-radius: 22px;
background: rgba(255, 255, 255, 0.72);
backdrop-filter: blur(14px);
}
.support strong {
font-size: 15px;
}
.support small {
color: var(--muted);
line-height: 1.6;
}
.products {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 18px;
}
.product-card {
position: relative;
display: flex;
flex-direction: column;
min-height: 360px;
overflow: hidden;
padding: 22px;
border: 1px solid rgba(23, 32, 51, 0.08);
border-radius: 26px;
background: var(--card);
box-shadow: 0 14px 34px rgba(35, 49, 89, 0.08);
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.product-card:hover {
transform: translateY(-4px);
border-color: rgba(79, 70, 229, 0.28);
box-shadow: 0 20px 46px rgba(35, 49, 89, 0.14);
}
.product-card.featured {
background:
linear-gradient(135deg, rgba(79, 70, 229, 0.1), rgba(6, 182, 212, 0.08)),
var(--card);
}
.badge {
width: fit-content;
padding: 6px 10px;
border-radius: 999px;
color: #fff;
background: linear-gradient(135deg, var(--primary), var(--accent));
font-size: 12px;
font-weight: 800;
letter-spacing: 0.02em;
}
.product-icon {
display: grid;
place-items: center;
width: 76px;
height: 76px;
margin: 20px 0 18px;
border-radius: 24px;
color: #fff;
background: linear-gradient(135deg, var(--primary), #8b5cf6);
box-shadow: 0 16px 32px rgba(79, 70, 229, 0.24);
font-size: 34px;
}
.product-card:nth-child(2) .product-icon {
background: linear-gradient(135deg, #0891b2, #22c55e);
box-shadow: 0 16px 32px rgba(8, 145, 178, 0.22);
}
h2 {
margin: 0 0 10px;
font-size: 23px;
letter-spacing: -0.02em;
}
.desc {
margin: 0 0 18px;
color: var(--muted);
font-size: 14px;
line-height: 1.75;
}
.features {
display: grid;
gap: 9px;
margin: 0 0 22px;
padding: 0;
list-style: none;
}
.features li {
display: flex;
gap: 9px;
align-items: center;
color: #344054;
font-size: 14px;
}
.features li::before {
content: "✓";
display: grid;
flex: 0 0 20px;
place-items: center;
width: 20px;
height: 20px;
border-radius: 50%;
color: var(--success);
background: rgba(22, 163, 74, 0.1);
font-size: 12px;
font-weight: 900;
}
.buy-row {
display: flex;
gap: 12px;
align-items: center;
justify-content: flex-end;
margin-top: auto;
padding-top: 18px;
border-top: 1px solid var(--line);
}
.price {
display: grid;
gap: 2px;
}
.price strong {
font-size: 24px;
line-height: 1;
}
.price small {
color: var(--muted);
}
.buy-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 128px;
min-height: 46px;
padding: 0 18px;
border-radius: 15px;
color: #fff;
background: linear-gradient(135deg, var(--primary), var(--primary-dark));
box-shadow: 0 12px 26px rgba(79, 70, 229, 0.26);
text-decoration: none;
font-size: 14px;
font-weight: 800;
transition: transform 0.18s ease, filter 0.18s ease;
}
.buy-button:hover {
transform: translateY(-2px);
filter: brightness(1.05);
}
.footer-note {
margin: 18px 0 0;
color: var(--muted);
text-align: center;
font-size: 12px;
line-height: 1.6;
}
@media (max-width: 760px) {
body {
padding: 12px;
}
.hero,
.products {
grid-template-columns: 1fr;
}
.support {
min-width: 0;
}
.product-card {
min-height: auto;
}
}
@media (max-width: 420px) {
.content {
padding: 20px;
}
.buy-row {
align-items: stretch;
flex-direction: column;
}
.buy-button {
width: 100%;
}
}
</style>
</head>
<body>
<main class="shop-panel" aria-label="精选商品介绍">
<section class="content">
<header class="hero">
<div>
<div class="eyebrow"><span></span> 官方推荐 · 即买即用</div>
<h1>选择适合你的服务套餐</h1>
<p>
为程序内嵌场景优化的商品展示页,简洁、响应式、加载快。你可以直接修改商品名称、介绍、价格和购买链接后单独部署。
</p>
</div>
<aside class="support" aria-label="售后保障">
<strong>购买保障</strong>
<small>自动跳转购买页面,支持在新窗口打开,适合 iframe 内嵌展示。</small>
</aside>
</header>
<section class="products" aria-label="商品列表">
<article class="product-card featured">
<div class="badge">热销推荐</div>
<div class="product-icon" aria-hidden="true">🚀</div>
<h2>GPT-Plus一个月代充</h2>
<p class="desc">
适合已有自己账号的用户,购买后为你的账号开通 GPT-Plus 一个月服务。
</p>
<ul class="features">
<li>代充到自己的账号</li>
<li>一个月 Plus 服务</li>
<li>购买后按页面说明操作</li>
</ul>
<div class="buy-row"><a class="buy-button" href="https://www.houfaka.com/liebiao/BD01D2378B09FAE7" target="_blank" rel="noopener noreferrer">立即购买</a>
</div>
</article>
<article class="product-card">
<div class="badge">进阶优选</div>
<div class="product-icon" aria-hidden="true">💎</div>
<h2>GPT-Plus-成品账号</h2>
<p class="desc">
适合不想使用自己账号的用户,购买后获取已配置好的 GPT-Plus 成品账号。
</p>
<ul class="features">
<li>无需自备账号</li>
<li>成品账号交付</li>
<li>适合快速上手使用</li>
</ul>
<div class="buy-row"><a class="buy-button" href="https://www.houfaka.com/liebiao/BD01D2378B09FAE7" target="_blank" rel="noopener noreferrer">立即购买</a>
</div>
</article>
</section>
<p class="footer-note">点击按钮后将在新窗口打开购买页面。</p>
</section>
</main>
</body>
</html>