GoZero 是一个 Go 语言实现的高性能微服务框架,它提供了各种功能,如路由、RPC、Web 服务、消息队列等,适用于构建高并发、低延迟的分布式应用。以下是一个基于 GoZero 框架来实现“霸王茶姬”门店系统的设计思路与代码示例。
设计思路
“霸王茶姬”是一个茶饮门店品牌,我们可以通过 GoZero 来构建一个门店管理系统,主要实现以下功能:
- 门店管理:门店的新增、删除、修改、查询功能。
- 订单管理:用户可以通过系统进行下单、支付,门店可以查询订单并进行配送。
- 商品管理:门店管理商品的库存、价格、折扣等信息。
- 用户管理:用户的注册、登录、信息更新等。
- 数据统计:统计门店的销售数据、订单情况等。
系统模块
- 用户模块:用户注册、登录、查看订单等。
- 门店模块:门店的增、删、改、查操作。
- 订单模块:用户下单、支付、查询订单等。
- 商品模块:管理商品信息,库存等。
- 统计模块:根据门店的销售情况、订单数据生成报表。
技术栈
- GoZero:作为核心框架,处理 HTTP 和 RPC 请求。
- MySQL:存储数据,使用 GoZero 自带的 ORM。
- Redis:用于缓存,提升查询效率。
- Nacos/Zookeeper:做服务注册与发现。
基本目录结构
/tea-store
|-- api
| |-- user.api // 用户模块
| |-- store.api // 门店模块
| |-- order.api // 订单模块
|-- service
| |-- user
| |-- store
| |-- order
|-- handler
| |-- user_handler.go
| |-- store_handler.go
| |-- order_handler.go
|-- model
| |-- user.go
| |-- store.go
| |-- order.go
|-- config
| |-- config.yaml // 配置文件
|-- main.go // 启动文件
1. 定义用户模块
首先在 api/user.api
中定义接口规范:
syntax = "proto3";
package user;
service UserService {
// 用户注册
rpc Register (RegisterRequest) returns (RegisterResponse);
// 用户登录
rpc Login (LoginRequest) returns (LoginResponse);
// 查看订单
rpc GetOrders (GetOrdersRequest) returns (GetOrdersResponse);
}
message RegisterRequest {
string username = 1;
string password = 2;
}
message RegisterResponse {
bool success = 1;
}
message LoginRequest {
string username = 1;
string password = 2;
}
message LoginResponse {
string token = 1;
}
message GetOrdersRequest {
string user_id = 1;
}
message GetOrdersResponse {
repeated string orders = 1;
}
然后在 handler/user_handler.go
中编写实现:
package handler
import (
"context"
"github.com/zeromicro/go-zero/core/logx"
"user/rpc/user"
)
type UserHandler struct {
logx.Logger
}
func (h *UserHandler) Register(ctx context.Context, req *user.RegisterRequest) (*user.RegisterResponse, error) {
// 实现用户注册逻辑
return &user.RegisterResponse{Success: true}, nil
}
func (h *UserHandler) Login(ctx context.Context, req *user.LoginRequest) (*user.LoginResponse, error) {
// 实现用户登录逻辑
return &user.LoginResponse{Token: "mockToken123"}, nil
}
func (h *UserHandler) GetOrders(ctx context.Context, req *user.GetOrdersRequest) (*user.GetOrdersResponse, error) {
// 实现查询用户订单逻辑
orders := []string{"order1", "order2", "order3"}
return &user.GetOrdersResponse{Orders: orders}, nil
}
2. 门店模块
在 api/store.api
中定义门店相关接口:
syntax = "proto3";
package store;
service StoreService {
// 创建门店
rpc CreateStore (CreateStoreRequest) returns (CreateStoreResponse);
// 获取门店信息
rpc GetStoreInfo (GetStoreInfoRequest) returns (GetStoreInfoResponse);
}
message CreateStoreRequest {
string name = 1;
string location = 2;
}
message CreateStoreResponse {
bool success = 1;
}
message GetStoreInfoRequest {
string store_id = 1;
}
message GetStoreInfoResponse {
string name = 1;
string location = 2;
}
在 handler/store_handler.go
中编写实现:
package handler
import (
"context"
"github.com/zeromicro/go-zero/core/logx"
"store/rpc/store"
)
type StoreHandler struct {
logx.Logger
}
func (h *StoreHandler) CreateStore(ctx context.Context, req *store.CreateStoreRequest) (*store.CreateStoreResponse, error) {
// 实现创建门店逻辑
return &store.CreateStoreResponse{Success: true}, nil
}
func (h *StoreHandler) GetStoreInfo(ctx context.Context, req *store.GetStoreInfoRequest) (*store.GetStoreInfoResponse, error) {
// 获取门店信息
return &store.GetStoreInfoResponse{Name: "霸王茶姬", Location: "上海"}, nil
}
3. 订单模块
在 api/order.api
中定义订单接口:
syntax = "proto3";
package order;
service OrderService {
// 创建订单
rpc CreateOrder (CreateOrderRequest) returns (CreateOrderResponse);
// 获取订单信息
rpc GetOrderInfo (GetOrderInfoRequest) returns (GetOrderInfoResponse);
}
message CreateOrderRequest {
string user_id = 1;
string store_id = 2;
repeated string items = 3;
}
message CreateOrderResponse {
string order_id = 1;
}
message GetOrderInfoRequest {
string order_id = 1;
}
message GetOrderInfoResponse {
string status = 1;
repeated string items = 2;
}
在 handler/order_handler.go
中编写实现:
package handler
import (
"context"
"github.com/zeromicro/go-zero/core/logx"
"order/rpc/order"
)
type OrderHandler struct {
logx.Logger
}
func (h *OrderHandler) CreateOrder(ctx context.Context, req *order.CreateOrderRequest) (*order.CreateOrderResponse, error) {
// 创建订单逻辑
return &order.CreateOrderResponse{OrderId: "order123"}, nil
}
func (h *OrderHandler) GetOrderInfo(ctx context.Context, req *order.GetOrderInfoRequest) (*order.GetOrderInfoResponse, error) {
// 获取订单信息
return &order.GetOrderInfoResponse{Status: "Completed", Items: []string{"item1", "item2"}}, nil
}
4. 启动文件 main.go
在 main.go
中启动 GoZero 服务:
package main
import (
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/zrpc"
"log"
"user/rpc/user"
"store/rpc/store"
"order/rpc/order"
)
func main() {
var c conf.Config
err := conf.Load("config.yaml", &c)
if err != nil {
log.Fatal(err)
}
userService := user.NewUserService(zrpc.MustNewClient(c.RpcClientConf))
storeService := store.NewStoreService(zrpc.MustNewClient(c.RpcClientConf))
orderService := order.NewOrderService(zrpc.MustNewClient(c.RpcClientConf))
go userService.Start()
go storeService.Start()
go orderService.Start()
select {} // 阻塞主线程
}
结语
通过以上设计,可以实现一个简单的基于 GoZero 框架的“霸王茶姬”门店系统,涵盖了用户、门店、订单等基本功能模块。这个系统也可以进一步扩展,加入更多复杂的功能,如支付集成、实时库存管理、门店动态调度等。