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
+31 -123
View File
@@ -1,134 +1,42 @@
(function() {
var KEYS = ['access_token','refresh_token','username','real_name','shop_no','shop_id','role'];
/* 官网导航交互:汉堡菜单 + 登录态感知(Web 版 App 与官网同域时,
localStorage['flutter.*'] 有登录信息 → CTA 变「进入系统」)。零依赖。 */
(function () {
function getAuthUser() {
var token = localStorage.getItem('flutter.access_token');
var token = localStorage.getItem('flutter.access_token');
var username = localStorage.getItem('flutter.username');
if (!token || !username) return null;
return {
username: username,
realName: localStorage.getItem('flutter.real_name') || '',
role: localStorage.getItem('flutter.role') || '',
shopNo: localStorage.getItem('flutter.shop_no') || '',
shopNo: localStorage.getItem('flutter.shop_no') || '',
};
}
function doLogout() {
KEYS.forEach(function(k) { localStorage.removeItem('flutter.' + k); });
location.reload();
}
function toggleUserMenu() {
var el = document.getElementById('userDropdown');
if (el) el.classList.toggle('open');
}
function toggleMobileMenu() {
var menu = document.getElementById('nav-mobile-menu');
var btn = document.getElementById('nav-hamburger');
if (!menu) return;
var isOpen = menu.classList.toggle('open');
if (btn) btn.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
}
// 点击外部关闭 dropdown 和 mobile menu
document.addEventListener('click', function(e) {
var userMenu = document.getElementById('userDropdown');
if (userMenu) {
var navUser = userMenu.closest('.nav-user');
if (navUser && !navUser.contains(e.target)) userMenu.classList.remove('open');
}
var mobileMenu = document.getElementById('nav-mobile-menu');
var hamburger = document.getElementById('nav-hamburger');
if (mobileMenu && hamburger) {
var topnav = mobileMenu.closest('nav');
if (topnav && !topnav.contains(e.target)) {
mobileMenu.classList.remove('open');
hamburger.setAttribute('aria-expanded', 'false');
}
}
});
function renderNav() {
var cta = document.getElementById('nav-cta');
var mobileCta = document.getElementById('nav-mobile-cta');
if (!cta) return;
var user = getAuthUser();
if (user) {
var display = user.realName || user.username;
var initial = display.charAt(0).toUpperCase();
var roleMap = { admin: '管理员', user: '成员', readonly: '只读' };
var roleLabel = roleMap[user.role] || user.role;
cta.innerHTML =
'<div class="nav-user">'
+ '<button class="nav-user-btn" onclick="toggleUserMenu()">'
+ '<div class="nav-avatar">' + initial + '</div>'
+ '<span>' + display + '</span>'
+ '<i data-lucide="chevron-down" class="icon"></i>'
+ '</button>'
+ '<div class="nav-dropdown" id="userDropdown">'
+ '<div style="padding:10px 14px 6px;border-bottom:1px solid var(--border-subtle);margin-bottom:4px">'
+ '<div style="font-size:13px;font-weight:600;color:var(--brand-900)">' + display + '</div>'
+ '<div style="font-size:11px;color:var(--fg-muted);margin-top:2px">'
+ (user.shopNo ? user.shopNo + ' · ' : '') + roleLabel
+ '</div>'
+ '</div>'
+ '<a href="/app/"><i data-lucide="layout-dashboard" class="icon"></i>进入管理端</a>'
+ '<div class="nav-dropdown-divider"></div>'
+ '<button class="logout" onclick="doLogout()"><i data-lucide="log-out" class="icon"></i>退出登录</button>'
+ '</div></div>';
if (mobileCta) {
mobileCta.innerHTML =
'<a href="/app/" class="btn btn-ghost">进入管理端</a>'
+ '<button class="btn btn-ghost" onclick="doLogout()">退出登录</button>';
}
} else {
cta.innerHTML =
'<a href="/app/" class="btn btn-ghost">登录</a>'
+ '<a href="/app/" class="btn btn-primary">免费试用</a>';
if (mobileCta) {
mobileCta.innerHTML =
'<a href="/app/" class="btn btn-ghost">登录</a>'
+ '<a href="/register/" class="btn btn-primary">注册门店</a>';
}
}
if (window.lucide) lucide.createIcons();
}
// 暴露给 onclick 调用
window.toggleUserMenu = toggleUserMenu;
window.toggleMobileMenu = toggleMobileMenu;
window.doLogout = doLogout;
document.addEventListener('DOMContentLoaded', function() {
renderNav();
if (window.lucide) lucide.createIcons();
var hamburger = document.getElementById('nav-hamburger');
if (hamburger) hamburger.addEventListener('click', toggleMobileMenu);
// 点击 mobile menu 链接后自动收起
var mobileMenu = document.getElementById('nav-mobile-menu');
if (mobileMenu) {
mobileMenu.querySelectorAll('a').forEach(function(a) {
a.addEventListener('click', function() {
mobileMenu.classList.remove('open');
if (hamburger) hamburger.setAttribute('aria-expanded', 'false');
});
});
}
// 页内锚点平滑滚动
document.querySelectorAll('a[href^="#"]').forEach(function(a) {
a.addEventListener('click', function(e) {
var id = a.getAttribute('href');
if (!id || id.length < 2) return;
var target = document.querySelector(id);
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
// 汉堡菜单
var burger = document.getElementById('nav-burger');
var mobile = document.getElementById('nav-mobile-menu');
if (burger && mobile) {
burger.addEventListener('click', function (e) {
e.stopPropagation();
var open = mobile.classList.toggle('open');
burger.setAttribute('aria-expanded', open ? 'true' : 'false');
});
});
document.addEventListener('click', function (e) {
if (!mobile.contains(e.target) && e.target !== burger) {
mobile.classList.remove('open');
}
});
}
// 登录态:CTA 换成「进入系统」
var user = getAuthUser();
if (user) {
var cta = document.getElementById('nav-cta');
if (cta) {
cta.innerHTML =
'<a class="btn primary" href="/app/">进入系统 · ' +
(user.realName || user.username).replace(/[<>&"]/g, '') +
'</a>';
}
}
})();