# 禾味小馆 · 三店营业登记台

> 活页公开模板 `sample-shop-daily-ledger` · 场景: 小工具 · 轻应用 · 行业: 餐饮茶饮 / 零售门店
> 任何人、任何 Agent 都可以读、照着改，不需要账号。示例内容均为虚构。
> 真页面: https://space.24haowan.com/s/WH0sKR6EIFLH · 详情: https://space.24haowan.com/examples/sample-shop-daily-ledger

## 这是什么

门店营业登记台 · 店长每晚登一条，老板看累计与分析

## 什么时候用

几家门店、档口或网点每天各自报一次营业数：店长在页面上直接登记，累计、目标进度、走势图和分析当场重算，链接不变、天天用。要由管理员一个人实时改数的业绩战报选 sample-sales-live；月底做复盘、投到大屏上讲的选 sample-ops-screen；要到店检查打分、拍照记问题的选 sample-store-patrol。

## 用户对助手说的原话

帮我做一个连锁小店的营业登记台网页，三家店的店长每晚在上面登记当天营业：页头是品牌名、「营业登记台」和今天的日期；最显眼的是本月累计营业额大数字（打开时滚动到位），下面一条目标进度条，标出时间进度刻度，并写还差多少、每天要做到多少；再一排小指标：今日已登记几家 / 共几家、日均、客单价、环比上周同期；然后是近 30 天每日营业额的堆叠柱状图（每家店一种颜色，虚线标目标日均，点某一天看三家店明细）；接着门店本月排名、两三条按数据自动算出来的大白话分析（周末比工作日高多少、哪家店客单价最高、哪天明显偏低）和一条周一到周日的热度条；登记表单选门店、填日期、营业额、订单数和备注，提交后存进一张数据表，页面马上把新的一条算进累计、图表和分析。页面里先放一个月的历史数据，表是空的时候也是满的。电脑上排成左边看板、右边登记的两栏，手机上一栏，底部有个「登记今天」按钮直接跳到表单。

如果你还没有活页连接器（MCP），先读 https://space.24haowan.com/for-agents.md ，照里面的说明接入，或不登录直接发布。

## 照着做一份

1. 读入口文件 https://space.24haowan.com/examples/sample-shop-daily-ledger/source/index.html（它引用的其他文件见下方列表）。
2. 保留结构、版式和交互，把内容**全部**换成用户自己的；模板里的公司、人名、数字都是虚构的，一样都别留。
3. 交付一个自包含的单文件 HTML：样式写在页面里，不引外部字体 / 脚本 / CDN；手机 375 宽和电脑 1440 宽都要好看，模板有暗色就保留暗色。
4. 要发成微信里能打开、改了链接不变的网页：接入活页（https://space.24haowan.com/for-agents.md）后发布；没有账号也可以让用户在 https://space.24haowan.com/quick 上传这个文件。
5. 没有活页工具、但能发 HTTPS 请求：把做好的 HTML 以 Content-Type: text/html POST 到 https://space.24haowan.com/api/quick?client=template-sample-shop-daily-ledger ，返回预览链接、7 天分享与认领链接（登录后保留、链接不变）。

## 页面结构

- 本月进度
- 每日营业额
- 门店排名
- 分析
- 星期规律
- 登记今天

## 文件（公开，纯文本）

- https://space.24haowan.com/examples/sample-shop-daily-ledger/source/index.html（入口）

## 发成活页之后还能做的

- 店长页内登记写回数据表（原生表单 POST ./_data/daily_entries）
- 读回 ./_data/daily_entries.json 与内置历史合并，累计、图表、排名、分析就地重算
- 同一链接每天用，内容随登记更新，不用重发页面

## 发之前要备好

- 数据表 daily_entries（列 store / date / revenue / orders / note，append_open=true）：店长的登记写进这里；store 的值要和表单下拉里的门店名一致，同店同日以后登的为准。只想让自己人登记就加 members_only=true

## 模板说明（README）

模板市场「营业登记台」一份。示例内容均为虚构（禾味小馆、三家门店、店长姓名、全部金额都是编的）。品质标准见 `core/space/examples/QUALITY.md`。

## 演示哪个特色

**店长在页面上登记，写回数据表；页面读回后当场重算累计、走势、排名和分析 —— 同一个链接天天用，不用重发。**

- 文末（电脑上是右栏顶部）是一张原生表单 `<form method="post" action="./_data/daily_entries">`：不跑脚本也能提交（平台 303 回到本页并带 `?space_submitted=daily_entries`）；
  脚本在时改成 `fetch` POST 一行 JSON，成功后这条立刻算进页面，再读一次表确认。
- 页面用 `fetch('./_data/daily_entries.json')` 读表，与 `<script>` 里内置的历史 `SEED` 合并：同一家店同一天以后登的那条为准。所以表是空的时候页面也是满的，登了真数就盖过内置数。
- 记忆点是「本月累计营业额」大数字（打开时滚到位，登记后从旧值滚到新值）+ 目标进度条上的时间刻度。
- 走势图是内联 SVG 堆叠柱（电脑 768 宽 / 手机 343 宽各一套坐标），虚线是目标日均；今天还没登的店按上周同一天画一个虚线框；点某一天在图下看三家店明细。
- 「分析」三条是脚本按数据现算的：周末比工作日高多少、客单价最高与最低的店、明显低于日均的日子（带店长备注）。
- 手机上底部有「登记今天」按钮，表单进入视野时自动隐藏。

## 改哪里变成我的

| 位置 | 改什么 |
|---|---|
| 页头 `.brand` / `.facts` | 品牌名、门店名单、登记时间、本月目标 |
| `<script>` 顶部常量 | `STORES`（门店名与店长，`name` 必须和表单下拉选项一致）、`TARGET` 月目标、`MONTH` / `MONTH_DAYS`、`TODAY`（营业日；自己用时改成取当天日期，例如 `new Date(Date.now()+8*3600e3).toISOString().slice(0,10)`） |
| `SEED` / `SEED_START` / `SEED_NOTES` | 内置历史：每家店每天 `[营业额, 单数]`，`null` = 没登。换成你们上个月的真数，或清空成 `{}` 只用数据表 |
| 表单 `select[name=store]` | 门店选项；多收一项就给表加一列、表单加一个同名输入框 |
| 页面里写死的数字（`#total`、`.stats`、`#rank` 等） | 只是脚本不跑时的回落，脚本会按数据覆盖；换成你们的大致数字即可 |
| 页脚 | 平台标志与名称（与 `core/space/src/theme.ts` 的 `MARK_SVG` / `PUBLIC_NAME` 逐字一致）+ 一句适用场景；发自己的页面时整段删掉 |
| `manifest.json` | `title` / `share.*`；节增减时 `sections` 与页里的 `id` / `data-track-section` 三处同改 |

纪律：开了写回的表，过审的行会出现在 `GET ./_data/daily_entries.json` 里，能看这页的人都读得到 —— 营业数敏感的话，页面用口令或仅成员可见，表加 `members_only=true`。

## 怎么发出去

```bash
# 1. 建页面（MCP create_proposal）→ proposal_id
# 2. 建表：
#    set_data proposal_id=<id> table="daily_entries" revision=0 rows=[] columns=["store","date","revenue","orders","note"] append_open=true
# 3. 推整个目录（带 _data/ 回落）：
node core/space/cli/space-cli.mjs push core/space/examples/sample-shop-daily-ledger \
  --proposal <proposal_id> --manifest core/space/examples/sample-shop-daily-ledger/manifest.json --hold
# 4. 预览确认后 publish_version；发到店长群用口令（set_visibility passcode），公开要本人明确同意
# 5. 验收：登一条 → 累计、今日已登记、图表、排名当场变化；list_data_rows table=daily_entries 能读回
```

本地 `space-cli serve` 会把提交写进包里的 `_data/daily_entries.json`，试完记得改回 `[]`。
验收截图：`node --import tsx examples/verify-shots.mjs sample-shop-daily-ledger --write-thumb --write-phone`（QUALITY.md §7）。
