chore(deploy): switch sub2api to local build; add static gpt-products page
This commit is contained in:
@@ -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:
|
||||
|
||||
386
static-products/gpt-products.html
Normal file
386
static-products/gpt-products.html
Normal 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>
|
||||
|
||||
Reference in New Issue
Block a user