Files
XQKqueue/README.md
brother7 9948c23bef 支持项目编码访问单项目公示屏
需求:无需查询公示 Token,直接通过项目编码打开单项目公示页。

实现:规范化项目编码并按 code 查询,同时保留既有 Token 哈希查询;补充前后端及集成回归测试。
2026-07-31 17:11:21 +08:00

96 lines
4.8 KiB
Markdown
Raw Permalink 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.

# 景区排队叫号系统
这是一个面向景区多项目运营的轻量排队叫号系统。一个排队号码可绑定多名同行游客;项目可配置按号码叫号、按人数叫号或同时支持两种方式。系统包含员工独立 H5、游客取号与私密状态页、管理端运营概览/项目设置/大屏中心、实体公示大屏、设备模拟器和审计基础。
产品与交互基线见:
- [产品与技术规划](docs/scenic-queue-system-plan.md)
- [UI/UX 设计范式](docs/scenic-queue-design-paradigm.md)
- [登录持久化设计](docs/login-persistence-design.md)
- [游客端小程序对接文档](docs/visitor-mini-program-integration.md)
## 技术架构
- 前端React、TypeScript、Vite员工、游客、公示屏和管理端使用同一前端工程的独立路由。
- 后端Go、标准库 HTTP 路由、GORM。
- 数据库PostgreSQL 17版本化 SQL 迁移。
- 实时更新REST 写入、SSE 推送,客户端轮询降级。
- 部署:模块化单体;中心服务是唯一写入权威。
## 本地开发
已验证的工具版本Go 1.26、Node.js 22、pnpm 10、PostgreSQL 17。
```bash
make install
make db-init
cp server/.env.example server/.env
```
`server/.env.example` 只包含本地示例密钥。正式环境必须替换两把 32 字节密钥;本地长期使用也建议运行两次 `openssl rand -base64 32` 后替换。
启动 API、初始化演示数据和启动前端
```bash
make api
make seed
make web
```
- API`http://localhost:8080`
- 前端:`http://localhost:5173`
- 本地超级管理员账号:`xqkwljtadmin`(密码由 `SUPER_ADMIN_PASSWORD` 设置)
- 本地演示员工:`staff` / `ChangeMe123!`
`make seed` 会注入一套可直接演示的基础数据:
- `DEMO` 云栖观光车:运行中,同时支持按号码与按人数叫号,包含 110 人/号的多人数测试数据。
- `RAFT` 峡谷漂流:暂停中,仅按人数叫号,包含 16 人/号的候场队列。
- `CABLE` 云顶索道:未开放,仅按号码叫号,用于验证空队列和未开放态。
命令会在终端输出公示屏与游客页的本地路径。它可重复执行:每次只重置上述演示项目,不会删除其他项目。本地演示员工账号和固定演示令牌禁止用于生产。
设置本地超级管理员密码:
```bash
SUPER_ADMIN_PASSWORD='至少 12 位的本地密码' make bootstrap-admin
```
没有 Homebrew PostgreSQL 时,也可以使用:
```bash
docker compose up -d postgres
```
## 核心页面
- `/staff/login`:员工 H5 独立登录,只接受员工账号。
- `/admin/login`:管理端独立登录,只接受管理员账号。
- 两端使用独立会话 Cookie可在同一浏览器同时登录不会互相覆盖。
- `/staff`:员工 H5 叫号页;同时支持两种方式的项目会并列显示“按号码叫号”和“按人数叫号”操作栏,队列逐号显示绑定人数。
- `/staff/tickets`:员工 H5 取号页;同行人数必填且创建后不可修改,取值范围由项目配置。
- 按号码叫号取队首连续 N 个号码;按人数叫号取合计人数不超过目标值的最长连续队首,不拆号、不跳号。队首单号人数大于目标时拒绝操作。
- `/visitor`:游客自助取号与手机号查询入口,通过页面顶部的“取号 / 查号” Tab 切换;手机号查询仍是运营测试入口,正式上线前需替换为验证码或外部身份接口。
- `/visitor/phone`:手机号查询后的游客号码状态页,不再显示手机号输入框。
- `/visitor/:token`:游客私密状态页。
- `/display/:projectCode`:按项目编码打开单项目只读公示屏,例如 `/display/RAFT`;已有公示 Token 地址继续兼容。
- `/admin`:管理端运营概览。
- `/admin/projects`:配置项目支持的叫号方式、单号人数范围、两种方式各自的默认值与防误触单次上限,以及按单人间隔计算的预计等待时间。
- `/admin/display`:无需登录的多项目只读大屏中心,可全屏展示公开运行状态。
## 质量检查
```bash
make test
make test-db
make check
make build
make smoke-real
```
`make smoke-real` 会创建一个临时 PostgreSQL 数据库并启动独立 Go API验证多人取号、人数模式不超过目标的连续 FIFO 选择、号码模式、号码数/人数双统计,以及员工全号、游客尾四位、管理端全号、公屏零手机号的隐私边界;结束后自动关闭测试 API 并删除临时数据库。它不使用前端 mock也不会改动日常开发数据库。
核心叫号写操作必须由服务端事务、行锁、幂等键和队列修订号共同保护;前端按钮禁用不能替代这些约束。
生产交接说明见 [后端与数据库上线交接](docs/backend-production-handoff.md)。生产环境先运行独立迁移命令,再启动 API不得运行 `make seed`