|
|
1 mēnesi atpakaļ | |
|---|---|---|
| handler | 1 mēnesi atpakaļ | |
| model | 1 mēnesi atpakaļ | |
| repository | 1 mēnesi atpakaļ | |
| service | 1 mēnesi atpakaļ | |
| README.md | 1 mēnesi atpakaļ | |
| go.mod | 1 mēnesi atpakaļ | |
| go.sum | 1 mēnesi atpakaļ | |
| main.go | 1 mēnesi atpakaļ | |
| test.sh | 1 mēnesi atpakaļ |
简化的订单 HTTP 服务,支持创建订单、服务者接单、取消订单三个操作。
目录
Go 后端小测试,建议投入 1.5~2 小时,并在收到后 48 小时内提交。请实现一个可在本地运行的简化订单 HTTP 服务,数据保存在内存即可,无需数据库、登录、Docker、Swagger、支付、退款或线上部署。服务只需支持三个操作:创建订单(包含服务时间、时长和地址,初始状态为 pending)、服务者接单(提交 provider_id,仅 pending 订单可以接单)和取消订单(pending 或 accepted 状态可以取消,取消后变为 canceled)。重点验证两种情况:同一订单被两名服务者先后接单时,只允许第一次成功,第二次必须失败且不能覆盖原接单人;订单取消后再次接单或取消时,必须拒绝并返回容易理解的业务错误。有余力可任选自动化测试、并发接单处理或 SQLite 存储之一,但不做也不影响结果。
go mod download 自动拉取(Gin、go-sqlite3 等):8080)首次运行前安装依赖:
go mod download
# 启动服务(内存存储 — 默认)
go run main.go
# 启动服务(SQLite 存储)
STORAGE=sqlite go run main.go
服务启动在 http://localhost:8080
curl -X POST http://localhost:8080/orders \
-H "Content-Type: application/json" \
-d '{"service_time":"2025-08-01T14:00:00Z","duration":120,"address":"北京朝阳区xxx路xxx号"}'
curl -X PUT http://localhost:8080/orders/{id}/accept \
-H "Content-Type: application/json" \
-d '{"provider_id":"prov_001"}'
curl -X PUT http://localhost:8080/orders/{id}/cancel \
-H "Content-Type: application/json" \
-d '{}'
go test ./... -v -race
⚠️ 脚本使用 Bash,Windows 用户请使用 Git Bash 或 WSL 运行。
bash test.sh
运行后选择存储后端(memory/sqlite),自动启动服务并验证全部业务场景。
# 测试效果示例
$ bash test.sh
选择存储后端:
1) memory(默认)
2) sqlite
请选择 [1/2]: 1
========================================
订 单 服 务 — 一 键 测 试
存储: memory
========================================
1. 创建订单...
✅ PASS: 创建订单
2. 接单(首次)...
✅ PASS: 首次接单成功
...
========================================
🎉 全部 7 个测试通过!
========================================
pending 订单可接单pending 或 accepted 订单可取消canceled 订单不可再操作├── main.go # 入口,依赖注入,存储选择
├── model/order.go # 数据模型、状态常量、错误类型
├── repository/
│ ├── order.go # OrderRepository 接口
│ ├── memory.go # 内存实现(sync.RWMutex + CAS)
│ └── sqlite.go # SQLite 实现(行锁 + WHERE CAS)
├── service/order.go # 业务逻辑(状态机)
├── handler/order.go # HTTP handler(Gin)
└── */*_test.go # 单元测试 + 集成测试