Files
jiu/web/register.njk
T
wangjia d256e7ac85 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
2026-07-03 20:40:21 +08:00

111 lines
6.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
layout: base.njk
title: 注册新门店
description: 几分钟创建你的酒水进销存门店,注册完成后获取门店编号用于登录。
permalink: /register/
---
{# 官网内注册(不跳 App):POST /api/v1/public/register,成功显示门店编号并引导登录。
版式与 App 注册页同款(App 真相源两栏卡片 + 三步时间线)。 #}
<div class="auth-wrap">
<div class="auth reg">
<div class="auth-brand">
<img class="mk" src="/assets/logo-mark.svg" alt="岩美酒库" style="width:60px;height:60px" />
<div class="bname">开通门店</div>
<div class="btag">几分钟创建你的酒水进销存门店,立即开始入库出库</div>
<div class="steps">
<div class="step done"><span class="si">1</span><div class="st"><b>填写门店信息</b><span>店名、地址与联系人</span></div></div>
<div class="step"><span class="si">2</span><div class="st"><b>创建管理员账号</b><span>用于登录与管理成员</span></div></div>
<div class="step"><span class="si">3</span><div class="st"><b>激活授权</b><span>先享 30 天试用,兑换券随时续期</span></div></div>
</div>
</div>
<div class="auth-form">
<div id="regForm">
<h1>注册新门店</h1>
<p class="alead">已有门店账号?<a href="/login/" style="font-weight:600">直接登录 →</a></p>
<div class="auth-alert" id="regErr"></div>
<div class="field"><label>门店名称<span class="req">*</span></label>
<input class="input" id="shop_name" placeholder="例如 强朋友名酒行" autocomplete="organization" />
<div class="hint">酒行正式名称,将显示在单据与商品标签上</div></div>
<div class="grid2f">
<div class="field"><label>联系电话<span class="req">*</span></label>
<input class="input" id="phone" type="tel" placeholder="手机或座机" autocomplete="tel" /></div>
<div class="field"><label>负责人姓名<span class="req">*</span></label>
<input class="input" id="manager_name" placeholder="例如 王经理" autocomplete="name" /></div>
</div>
<div class="field"><label>门店地址<span class="req">*</span></label>
<input class="input" id="address" placeholder="省 / 市 / 区 详细地址" autocomplete="street-address" /></div>
<div class="field"><label>店铺简介</label>
<textarea class="input" id="description" maxlength="200" placeholder="选填,最多 200 字;顾客扫商品码时可见"></textarea></div>
<div style="height:1px;background:var(--border-subtle);margin:6px 0 16px"></div>
<div class="field"><label>登录账号<span class="req">*</span></label>
<input class="input" id="username" placeholder="330 位字母/数字/下划线" autocomplete="username" />
<div class="hint">创建后不可修改</div></div>
<div class="grid2f">
<div class="field"><label>登录密码<span class="req">*</span></label>
<input class="input" id="password" type="password" placeholder="至少 6 位" autocomplete="new-password" /></div>
<div class="field"><label>确认密码<span class="req">*</span></label>
<input class="input" id="password_confirm" type="password" placeholder="再次输入" autocomplete="new-password" /></div>
</div>
<button class="btn primary lg" id="reg-btn" style="margin-top:8px">创建门店并开始试用</button>
<div class="auth-foot">创建即代表你将成为该门店的管理员,并同意<a href="/terms/">服务条款</a>与<a href="/privacy/">隐私政策</a></div>
</div>
<div id="regDone" style="display:none">
<h1>门店创建成功 🎉</h1>
<p class="alead">请记下你的门店编号,登录时需要用到。</p>
<div class="auth-ok">
门店编号:<code id="done-code">—</code><br/>
<span style="color:var(--muted);font-size:var(--fs-sm)" id="done-detail"></span>
</div>
<a class="btn primary lg" href="/login/">前往登录</a>
<div class="auth-foot">已自动开通 30 天全功能试用 · 到期可在 系统设置 → 授权兑换券 续期</div>
</div>
</div>
</div>
</div>
<script>
(function () {
var API = '{{ site.appBaseUrl }}';
function $(id) { return document.getElementById(id); }
function showErr(msg) { var el = $('regErr'); el.textContent = msg; el.classList.add('show'); }
function val(id) { return $(id).value.trim(); }
function submit() {
$('regErr').classList.remove('show');
if (!val('shop_name')) return showErr('请填写门店名称');
if (!val('phone')) return showErr('请填写联系电话');
if (!val('manager_name')) return showErr('请填写负责人姓名');
if (!val('address')) return showErr('请填写门店地址');
if (!/^[A-Za-z0-9_]{3,30}$/.test(val('username'))) return showErr('登录账号需 330 位字母/数字/下划线');
if ($('password').value.length < 6) return showErr('密码至少 6 位');
if ($('password').value !== $('password_confirm').value) return showErr('两次密码不一致');
var btn = $('reg-btn'); btn.disabled = true; btn.textContent = '创建中…';
fetch(API + '/api/v1/public/register', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
shop_name: val('shop_name'), phone: val('phone'), manager_name: val('manager_name'),
address: val('address'), description: val('description'),
username: val('username'), password: $('password').value,
}),
})
.then(function (r) { return r.json().then(function (j) { return { ok: r.ok, j: j }; }); })
.then(function (res) {
if (!res.ok) throw new Error((res.j && res.j.error) || '注册失败,请稍后重试');
var d = res.j.data || {};
$('done-code').textContent = d.shop_code || '—';
$('done-detail').textContent = '门店「' + (d.shop_name || val('shop_name')) + '」已创建,管理员账号 ' + (d.username || val('username'));
$('regForm').style.display = 'none';
$('regDone').style.display = 'block';
window.scrollTo(0, 0);
})
.catch(function (e) {
showErr(e && e.message ? e.message : '无法连接服务器,请稍后重试');
btn.disabled = false; btn.textContent = '创建门店并开始试用';
});
}
$('reg-btn').addEventListener('click', submit);
})();
</script>