feat(site): 官网全新重建(App 真相源风格)+ 四档套餐 + 在线购买流

- tokens.css/site.css 逐值对齐原型设计系统,icons 雪碧图,零外链;首页/下载/帮助/法务全站重皮肤,真实截图
- 注册与登录在官网内完成(写 shared_preferences_web 兼容 localStorage,不再跳 App)
- 价格区四档:免费/标准 299/高级 599/定制;登录后标准/高级按钮变「购买 / 续费」
- 新增 /checkout/(套餐+月付年付切换)与 /license/result/(支付回跳轮询到账)
- 登录页支持 ?next= 站内回跳;二维码措辞改「扫码看详情可分享」
- 下载页构建期真实下载链接+运行时 release 刷新;旧 features 页/死 CSS/dist 产物清理

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
This commit is contained in:
wangjia
2026-07-03 20:40:21 +08:00
parent 18925d7d15
commit d256e7ac85
24 changed files with 1313 additions and 1977 deletions
+77
View File
@@ -0,0 +1,77 @@
---
layout: base.njk
title: 支付结果
description: 支付宝支付完成后的到账确认页。
permalink: /license/result/
---
{# pay 回跳页(return_urlpay 拼 out_trade_no):轮询购买单状态,到账以 webhook 续期为准。 #}
<div class="container" style="padding:64px 24px 96px">
<div class="result" id="waiting">
<div class="ring wait"><svg class="ic"><use href="#i-ic11"/></svg></div>
<h2>确认到账中…</h2>
<p>支付完成后到账通常在数秒内确认,请稍候。<br/>本页会自动刷新结果,无需手动操作。</p>
</div>
<div class="result" id="ok" style="display:none">
<div class="ring good"><svg class="ic"><use href="#i-check"/></svg></div>
<h2>支付成功,授权已续期</h2>
<p id="okDetail">门店授权已更新。</p>
<div class="ono">订单号 <b id="orderNo">—</b></div>
<div class="acts">
<a class="btn primary lg" href="/app/">进入系统</a>
<a class="btn ghost lg" href="/#pricing">返回套餐</a>
</div>
</div>
<div class="result" id="slow" style="display:none">
<div class="ring wait"><svg class="ic"><use href="#i-ic11"/></svg></div>
<h2>到账确认中</h2>
<p>付款已提交,但到账确认比平时慢一些。<br/>授权会在到账后自动续期——稍后可在 App「系统设置 → 授权」查看,无需重复付款。</p>
<div class="acts">
<a class="btn primary lg" href="/app/">进入系统</a>
<a class="btn ghost lg" href="mailto:{{ site.support.email }}">联系支持</a>
</div>
</div>
</div>
<script>
(function () {
var API = '{{ site.appBaseUrl }}';
function $(id) { return document.getElementById(id); }
function token() {
var raw = localStorage.getItem('flutter.access_token');
if (!raw) return null;
try { return JSON.parse(raw); } catch (e) { return raw; }
}
var otn = new URLSearchParams(location.search).get('out_trade_no');
if (!otn || !token()) { $('waiting').style.display = 'none'; $('slow').style.display = 'block'; return; }
var tries = 0, maxTries = 30; // 2s × 30 = 60s
function poll() {
tries++;
fetch(API + '/api/v1/license/purchase/' + encodeURIComponent(otn), {
headers: { 'Authorization': 'Bearer ' + token() },
})
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (j) {
var d = j && j.data;
if (d && d.status === 'paid') {
$('orderNo').textContent = otn;
if (d.expires_at) {
$('okDetail').textContent = '门店授权已续期至 ' + new Date(d.expires_at).toLocaleDateString('zh-CN') + '。';
}
$('waiting').style.display = 'none';
$('ok').style.display = 'block';
return;
}
next();
})
.catch(next);
}
function next() {
if (tries >= maxTries) { $('waiting').style.display = 'none'; $('slow').style.display = 'block'; return; }
setTimeout(poll, 2000);
}
poll();
})();
</script>