Tidak Ada Deskripsi

b bf88e3733e docs: fix section structure - move requirements text under correct heading 1 bulan lalu
handler 31c4b86c50 feat: add Gin handlers with integration tests 1 bulan lalu
model f79fb48740 fix: add GetOrder, fix ErrConflict code to match spec 1 bulan lalu
repository 42d599cb1c feat: add SQLite repository with CAS update, wire storage selection in main.go 1 bulan lalu
service f79fb48740 fix: add GetOrder, fix ErrConflict code to match spec 1 bulan lalu
README.md bf88e3733e docs: fix section structure - move requirements text under correct heading 1 bulan lalu
go.mod 42d599cb1c feat: add SQLite repository with CAS update, wire storage selection in main.go 1 bulan lalu
go.sum 42d599cb1c feat: add SQLite repository with CAS update, wire storage selection in main.go 1 bulan lalu
main.go 42d599cb1c feat: add SQLite repository with CAS update, wire storage selection in main.go 1 bulan lalu
test.sh bf7d6579d1 chore: add one-click test script with interactive storage selection 1 bulan lalu

README.md

订单服务

简化的订单 HTTP 服务,支持创建订单、服务者接单、取消订单三个操作。

目录

需求

Go 后端小测试,建议投入 1.5~2 小时,并在收到后 48 小时内提交。请实现一个可在本地运行的简化订单 HTTP 服务,数据保存在内存即可,无需数据库、登录、Docker、Swagger、支付、退款或线上部署。服务只需支持三个操作:创建订单(包含服务时间、时长和地址,初始状态为 pending)、服务者接单(提交 provider_id,仅 pending 订单可以接单)和取消订单(pending 或 accepted 状态可以取消,取消后变为 canceled)。重点验证两种情况:同一订单被两名服务者先后接单时,只允许第一次成功,第二次必须失败且不能覆盖原接单人;订单取消后再次接单或取消时,必须拒绝并返回容易理解的业务错误。有余力可任选自动化测试、并发接单处理或 SQLite 存储之一,但不做也不影响结果。

运行环境

  • Go 1.21+
  • 依赖管理go mod download 自动拉取(Gin、go-sqlite3 等)
  • 端口:8080(可修改 main.go 中的 :8080
  • 系统:Linux / macOS / Windows(推荐 Git Bash 或 WSL)

首次运行前安装依赖:

go mod download

快速启动

# 启动服务(内存存储 — 默认)
go run main.go

# 启动服务(SQLite 存储)
STORAGE=sqlite go run main.go

服务启动在 http://localhost:8080

API

创建订单

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 订单可接单
  • 同一订单只能被一名服务者接单(并发安全,CAS 乐观锁保证)
  • pendingaccepted 订单可取消
  • 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          # 单元测试 + 集成测试

技术栈

  • 语言: Go
  • 框架: Gin
  • 存储: 内存 / SQLite(mattn/go-sqlite3)
  • 测试: testing + httptest