Files
jiu/web/docs.html
T
wangjia 30a8e791a3 feat: 扫码商品详情页重设计 + 宣传主页 + nginx 路由完善
- public_product_screen: 1:1 复刻设计稿,新增商品介绍、批次防伪(自定义圆形印章)、完整商品参数表、门店营业时间、页脚链接
- app_theme: 完整品牌色系(brand/gray/accent/semantic)
- shop model: 新增 business_hours 字段,public 接口同步返回
- nginx: 新增 /product/ → Flutter app 扫码入口,修复 /docs /download html 后缀兼容
- web/: 新增宣传主页、功能页、文档页、扫码 HTML 及设计资源
- app_shell: 界面优化

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 18:58:04 +08:00

205 lines
12 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>文档 — 岩美酒库管理系统</title>
<link rel="stylesheet" href="assets/colors_and_type.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&display=swap" rel="stylesheet">
<script src="https://unpkg.com/lucide@0.469.0/dist/umd/lucide.min.js"></script>
<style>
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; font-family: var(--font-sans); color: var(--fg-default); background: var(--bg-surface); -webkit-font-smoothing: antialiased; }
a { color: inherit; text-decoration: none; }
.container { max-width: 1200px; margin: 0 auto; padding: 0 32px; }
.btn { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 18px; border-radius: var(--radius-md); font-size: 14px; font-weight: 500; border: 1px solid transparent; cursor: pointer; transition: background 120ms; text-decoration: none; }
.btn-primary { background: var(--brand-500); color: #fff; }
.btn-primary:hover { background: var(--brand-600); }
.icon { width: 18px; height: 18px; }
.nav { position: sticky; top: 0; z-index: 50; background: rgba(255,255,255,0.88); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border-subtle); }
.nav-inner { height: 64px; display: flex; align-items: center; justify-content: space-between; max-width: 1200px; margin: 0 auto; padding: 0 32px; }
.nav-brand { display: flex; align-items: center; gap: 10px; font-size: 18px; font-weight: 700; color: var(--brand-900); }
.nav-brand img { height: 30px; }
.nav-links { display: flex; gap: 2px; }
.nav-links a { padding: 7px 14px; border-radius: var(--radius-md); font-size: 14px; color: var(--gray-700); transition: background 120ms; }
.nav-links a:hover { background: var(--gray-100); }
.nav-cta { display: flex; gap: 10px; }
.docs-layout { display: grid; grid-template-columns: 220px 1fr; gap: 0; min-height: calc(100vh - 64px); }
.docs-sidebar { border-right: 1px solid var(--border-default); padding: 32px 0; position: sticky; top: 64px; height: calc(100vh - 64px); overflow-y: auto; }
.sidebar-group { margin-bottom: 28px; }
.sidebar-group-title { font-size: 11px; font-weight: 600; letter-spacing: 0.1em; color: var(--fg-subtle); text-transform: uppercase; padding: 0 20px; margin-bottom: 8px; }
.sidebar-link { display: block; padding: 6px 20px; font-size: 14px; color: var(--gray-700); border-radius: 0; transition: background 100ms; }
.sidebar-link:hover { background: var(--gray-50); color: var(--brand-900); }
.sidebar-link.active { color: var(--brand-500); font-weight: 500; background: var(--brand-50); }
.docs-content { padding: 48px 64px; max-width: 800px; }
.docs-content h1 { font-size: 32px; font-weight: 700; color: var(--brand-900); margin: 0 0 8px; }
.docs-content .meta { font-size: 13px; color: var(--fg-muted); margin-bottom: 36px; }
.docs-content h2 { font-size: 22px; font-weight: 600; color: var(--brand-900); margin: 48px 0 16px; padding-top: 48px; border-top: 1px solid var(--border-subtle); }
.docs-content h2:first-of-type { border-top: none; }
.docs-content h3 { font-size: 16px; font-weight: 600; color: var(--gray-800); margin: 28px 0 10px; }
.docs-content p { font-size: 14px; line-height: 1.75; color: var(--fg-default); margin: 0 0 16px; }
.docs-content ul, .docs-content ol { padding-left: 20px; margin: 0 0 16px; }
.docs-content li { font-size: 14px; line-height: 1.75; color: var(--fg-default); margin-bottom: 6px; }
.docs-content code { font-family: var(--font-mono); font-size: 12px; background: var(--gray-100); padding: 2px 5px; border-radius: 3px; color: var(--brand-700); }
.tip { background: var(--brand-50); border-left: 3px solid var(--brand-400); border-radius: 0 6px 6px 0; padding: 12px 16px; margin: 20px 0; }
.tip p { margin: 0; font-size: 13px; color: var(--brand-800); }
.warn { background: var(--warning-50); border-left: 3px solid var(--warning-500); border-radius: 0 6px 6px 0; padding: 12px 16px; margin: 20px 0; }
.warn p { margin: 0; font-size: 13px; color: var(--warning-700); }
table { width: 100%; border-collapse: collapse; margin: 20px 0; font-size: 13px; }
th { background: var(--gray-50); padding: 8px 12px; text-align: left; font-weight: 600; color: var(--gray-700); border: 1px solid var(--border-default); }
td { padding: 8px 12px; border: 1px solid var(--border-default); color: var(--fg-default); vertical-align: top; }
footer { background: var(--gray-50); border-top: 1px solid var(--border-default); padding: 40px 0; }
.footer-inner { display: flex; align-items: center; justify-content: space-between; }
.footer-brand { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--brand-900); }
.footer-brand img { height: 24px; }
.footer-copy { font-size: 12px; color: var(--fg-subtle); }
</style>
</head>
<body>
<nav class="nav">
<div class="nav-inner">
<a href="/" class="nav-brand"><img src="assets/logo-full.svg" alt="岩美" /></a>
<div class="nav-links">
<a href="/features/inventory.html">功能</a>
<a href="/docs.html">文档</a>
<a href="/download.html">下载</a>
</div>
<div class="nav-cta">
<a href="/app/" class="btn btn-primary">进入管理端 <i data-lucide="arrow-right" class="icon"></i></a>
</div>
</div>
</nav>
<div class="docs-layout">
<aside class="docs-sidebar">
<div class="sidebar-group">
<div class="sidebar-group-title">快速开始</div>
<a href="#intro" class="sidebar-link active">系统介绍</a>
<a href="#login" class="sidebar-link">登录与权限</a>
<a href="#roles" class="sidebar-link">角色说明</a>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">核心模块</div>
<a href="#stock-in" class="sidebar-link">入库管理</a>
<a href="#stock-out" class="sidebar-link">出库管理</a>
<a href="#inventory" class="sidebar-link">库存管理</a>
<a href="#finance" class="sidebar-link">财务管理</a>
<a href="#products" class="sidebar-link">基础数据</a>
</div>
<div class="sidebar-group">
<div class="sidebar-group-title">其他功能</div>
<a href="#scan" class="sidebar-link">防伪溯源</a>
<a href="#settings" class="sidebar-link">系统设置</a>
</div>
</aside>
<main class="docs-content">
<h1>使用手册</h1>
<p class="meta">适用版本:v1.x · 更新于 2025 年</p>
<h2 id="intro">系统介绍</h2>
<p>岩美酒库管理系统是专为酒行、酒店 F&B 部门设计的一体化库存管理平台。系统涵盖入库、出库、库存盘点、财务对账、往来单位管理以及商品防伪溯源等核心功能。</p>
<p>系统采用多租户架构,每个门店(<code>shop</code>)的数据完全隔离,支持 Web 端与桌面端(macOS / Windows)同时使用。</p>
<div class="tip"><p><strong>提示:</strong>如果是初次使用,请让管理员先创建您的账号,然后使用门店编号 + 用户名 + 密码登录。</p></div>
<h2 id="login">登录与权限</h2>
<h3>登录方式</h3>
<p>在登录页输入:</p>
<ul>
<li><strong>门店编号</strong>(由管理员提供,如 <code>S001</code></li>
<li><strong>用户名</strong></li>
<li><strong>密码</strong></li>
</ul>
<p>登录成功后,系统会保存 Token,关闭浏览器后再次打开无需重新登录(Token 有效期 7 天)。</p>
<h2 id="roles">角色说明</h2>
<table>
<thead><tr><th>角色</th><th>权限范围</th></tr></thead>
<tbody>
<tr><td>管理员 (admin)</td><td>所有功能,包括用户管理、审批、系统设置</td></tr>
<tr><td>普通用户 (user)</td><td>创建/编辑单据,无法审批,无系统设置权限</td></tr>
<tr><td>只读用户 (readonly)</td><td>仅查看,不可创建或修改任何数据</td></tr>
</tbody>
</table>
<div class="warn"><p><strong>注意:</strong>只读用户尝试任何写操作时,系统将返回 403 拒绝提示。</p></div>
<h2 id="stock-in">入库管理</h2>
<h3>创建入库单</h3>
<ol>
<li>点击左侧「入库管理」,然后点击「新建入库单」</li>
<li>选择仓库、供应商(往来单位),填写入库日期</li>
<li>逐行添加商品,填写数量、单价、批次号、生产日期</li>
<li>保存为「草稿」或直接「提交审核」</li>
</ol>
<h3>审批入库</h3>
<p>状态为「待审核」的入库单,管理员可在列表中点击「审核通过」。审核通过后库存自动增加,且操作不可逆。</p>
<h2 id="stock-out">出库管理</h2>
<p>出库流程与入库类似:创建出库单 → 选择仓库和商品 → 提交审核 → 管理员审批。</p>
<p>系统在审批出库时会自动校验库存充足性,如果库存不足,审批将失败并给出提示。</p>
<table>
<thead><tr><th>出库类型</th><th>说明</th></tr></thead>
<tbody>
<tr><td>销售</td><td>对外销售,关联往来单位(客户)</td></tr>
<tr><td>领用</td><td>内部消耗,无对外客户</td></tr>
<tr><td>损耗</td><td>破损/过期等非正常消耗</td></tr>
</tbody>
</table>
<h2 id="inventory">库存管理</h2>
<p>库存列表按批次展示,每次入库产生一条库存记录。支持按商品名称、仓库、供应商筛选,并可导出 Excel。</p>
<h3>批次追溯</h3>
<p>每条库存记录保留了入库批次号、生产日期、供应商等信息,可完整追溯商品来源。</p>
<h2 id="finance">财务管理</h2>
<p>财务模块记录与入库/出库单据关联的应收应付账款。支持按往来单位、日期区间、状态(已收/待收)筛选,并可导出汇总报表。</p>
<h2 id="products">基础数据</h2>
<p>基础数据包含:</p>
<ul>
<li><strong>商品管理</strong>:SKU 信息、规格、品牌、系列、单位,以及商品图片上传</li>
<li><strong>仓库管理</strong>:门店下可配置多个仓库</li>
<li><strong>往来单位</strong>:供应商与客户统一管理</li>
<li><strong>编号规则</strong>:自定义入库单/出库单号前缀和格式</li>
</ul>
<h2 id="scan">防伪溯源</h2>
<p>为每件商品生成唯一防伪码(<code>public_id</code>),打印贴附于商品。消费者扫描二维码后跳转至 <code>jiu.51yanmei.com/scan/&lt;id&gt;</code>,可查看:</p>
<ul>
<li>商品基本信息(名称、品牌、规格)</li>
<li>批次信息(生产日期、批次号、入库日期)</li>
<li>出售门店信息</li>
<li>岩美防伪验证标记</li>
</ul>
<h2 id="settings">系统设置</h2>
<p>系统设置仅管理员可见,包括:</p>
<ul>
<li>用户管理:创建/删除用户,重置密码,调整角色</li>
<li>门店信息:更新门店名称、地址、电话等公开信息</li>
<li>数据导入:批量导入商品、历史库存数据(Excel 格式)</li>
</ul>
</main>
</div>
<footer>
<div class="container">
<div class="footer-inner">
<div class="footer-brand"><img src="assets/logo-mark.svg" alt="岩美" /> 岩美酒库管理系统</div>
<div class="footer-copy">© 2025 岩美。保留所有权利。</div>
</div>
</div>
</footer>
<script>lucide.createIcons();</script>
</body>
</html>