spleen1334/bookings-monolith
GitHub: spleen1334/bookings-monolith
这是一个基于 Go 的单体架构客房预订 Web 应用学习项目,用于实践和展示完整的 Web 开发流程。
Stars: 0 | Forks: 0
# Bookings(单体架构)
Bookings 是一个个人学习项目:一个用于客房预订和后台预订管理的服务端渲染单体 Web 应用。它并非生产级软件。
部分后台静态资源似乎来自 BootstrapDash / RoyalUI 模板,应将其视为第三方课程/模板资料。
## 学习目标
- 在单体架构中实践 Go Web 应用结构
- 学习路由、middleware、sessions、CSRF 和模板渲染
- 使用 PostgreSQL、SQL migrations 和 repository 风格的数据访问
- 探索认证流程、后台工作流和邮件通知
- 保持小型项目井然有序,以便未来的重构和学习
## 技术栈
- Go `1.18`
- Chi router
- PostgreSQL
- SCS sessions
- Nosurf CSRF 保护
- pgx PostgreSQL 驱动
- bcrypt 密码哈希
- go-simple-mail (用于 SMTP)
- `static/admin` 下基于可选 npm/gulp 的后台资源工具
## 应用领域
- 客房可用性搜索与预订
- 为后台用户提供预订管理
- 在日历上锁定客房/日期
- 受登录保护的后台操作
## 架构概述
- 单体架构:一个 Go 二进制文件处理路由、业务逻辑、HTML 渲染、session 状态、认证、后台工作流和数据库访问
- 没有独立的前端/后端可部署单元
- 入口点:`cmd/web/main.go`
- 路由与 middleware:`cmd/web/routes.go` 中的 Chi router
- 请求处理器:`internal/handlers`
- 数据访问抽象:`internal/repository` 接口
- PostgreSQL 实现:`internal/repository/dbrepo/postgres.go`
- 渲染层:`internal/render`
- Session/认证助手:SCS sessions + 自定义 middleware
- 模板:`templates/*.page.tmpl` + `*.layout.tmpl`
- 静态资源:`static/`
- Migrations:`migrations/`(Soda/Pop 风格)
## 项目结构
```
bookings/
├── cmd/web/ # main, routes, middleware, mail listener
├── internal/
│ ├── config/ # app config container
│ ├── handlers/ # HTTP handlers and flow orchestration
│ ├── repository/ # DB interface + implementations
│ ├── render/ # template cache/rendering + default template data
│ ├── forms/ # form validation helpers
│ ├── helpers/ # auth + error helpers
│ └── models/ # domain and template models
├── templates/ # public/admin page templates
├── static/ # CSS/JS/images/admin assets
├── email-templates/ # email HTML templates
├── migrations/ # SQL/Fizz migrations and seeds
├── database.yml.example # DB config template for migration tool
└── run.sh # local build/run script
```
## 主要请求流程
### 1) 可用性搜索与预订
1. 用户打开 `/search-availability`。
2. 用户提交日期(`POST /search-availability` 或 JSON 变体)。
3. 应用通过 repository 方法查询客房可用性。
4. 可用客房将在 `/choose-room/{id}` 流程中渲染。
5. 提交并验证预订表单(`/make-reservation`)。
6. 预订及客房限制被持久化到数据库中。
7. 确认邮件和所有者通知邮件被加入队列并发送。
8. 用户被重定向至 `/reservation-summary`。
### 2) 基于 session 的预订状态
- 进行中的预订数据存储在 session 中(`reservation` 键)。
- 诸如 `choose-room -> make-reservation -> summary` 的步骤依赖于 session 状态,并在数据缺失时进行安全重定向。
### 3) 认证与后台访问
1. 用户通过 `/user/login` 登录。
2. 根据存储的 bcrypt 密码哈希验证凭据。
3. 成功后设置 session 键 `user_id`。
4. `/admin/*` 路由受 `Auth` middleware 保护。
5. 管理员可以查看、编辑、处理、删除预订以及管理锁定日历。
### 4) 后台预订日历/锁定
- 日历视图(`/admin/reservations-calendar`)构建按客房划分的预订/锁定映射。
- POST 操作通过添加/删除 `room_restrictions` 记录来更新手动客房锁定。
## 本地运行
1. 配置数据库/运行时标志。
2. 构建并运行:
```
go build -o build/bookings cmd/web/*.go
./build/bookings \
-db-name=bookings \
-db-user= \
-db-pass= \
-db-host=localhost \
-db-port=5432 \
-db-ssl=disable \
-cache=false \
-production=false
```
服务器监听 `:8080`。
## 测试
- 使用 `go test ./...` 运行 Go 测试
- 使用仓库中已有的包级别测试(如果存在)
## 配置 / 密钥
来自 `cmd/web/main.go`:
- `-production` bool
- `-cache` bool
- `-db-name` string(必填)
- `-db-host` string
- `-db-user` string(必填)
- `-db-pass` string
- `-db-port` string
- `-db-ssl` string
将本地密钥排除在版本控制之外。`database.yml.example` 是示例配置;`database.yml` 仅限本地使用。
## 未来学习笔记
- 将此单体架构与拆分的服务架构进行比较
- 审查 middleware、sessions 和 CSRF 在 Go 中如何交互
- 研究模板组合和可重用的布局模式
- 评估后台资源 pipeline 是否仍然必要
- 随着项目的发展,重新审视 repository 边界和测试覆盖率
## Git / 远程发布
- 此仓库用于个人学习和在 GitHub 上发布
- 使用普通的 GitHub 远程仓库,按原样推送学习项目
- 适当保留模板/课程资源的出处说明,并将其与原创作品明确区分
- 避免将此项目视为生产部署候选对象
## 建议的 GitHub 主题
- go
- golang
- chi-router
- postgresql
- web-application
- monolith
- sessions
- csrf
- authentication
- reservations
- booking-system
- learning-project
- bootstrapdash
- royalui
## 状态
- 活跃的学习项目
- 单体 Go 预订应用
- 尚未达到生产可用状态
## 按区域划分的文档
- Web 入口点 + 路由:[`cmd/web/README.md`](./cmd/web/README.md)
- 内部架构:[`internal/README.md`](./internal/README.md)
- 后台资源/工具:[`static/admin/README.md`](./static/admin/README.md)
标签:Go语言, PostgreSQL, Syscall, Web开发, 单体架构, 学习项目, 客房预订系统, 测试用例, 程序破解