随着数字化时代的到来,各个行业都在加速数字化转型,餐饮业也不例外。越来越多的餐厅开始使用点餐系统,为顾客提供更加便捷、高效的用餐体验。其中,预约点餐是一种很受欢迎的点餐方式,它可以让顾客在到店前就预先下单并付款,减少顾客等待时间,同时也能为餐厅带来更好的营收。
本文将介绍如何使用Go语言开发一个预约点餐系统,主要包括以下几个方面:数据库设计、接口设计以及代码示例。
一、数据库设计
系统的数据库需要保存以下信息:
- 用户信息(user_info):包括用户名、密码、手机号码、邮箱等信息;
- 菜谱信息(menu_info):包括菜品名称、价格、图片等信息;
- 订单信息(order_info):包括订单号、预约时间、就餐时间、就餐人数等信息;
- 菜品订单信息(menu_order_info):包括订单号、菜品ID、数量等信息。
二、接口设计
- 用户登录接口
func login(username string, password string) bool {
// 在数据库中查询是否存在该用户,密码是否正确
// 如果存在,则返回true,否则返回false
}
- 获取菜品列表接口
type Menu struct {
Id int
Name string
Price float64
Image string
}
func getMenuList() []Menu {
// 查询数据库,获取菜品列表信息
// 将信息封装为Menu类型的slice返回
}
- 预约接口
type MenuOrder struct {
MenuId int
Count int
}
func reserve(username string, orderTime string, eatTime string, eatNumber int, menuOrder []MenuOrder) bool {
// 生成订单编号
// 在订单表中新增一条订单信息
// 在菜品订单表中新增相关信息
// 返回预约结果(成功或失败)
}
- 查询订单接口
type OrderInfo struct {
OrderId int
OrderTime string
EatTime string
EatNumber int
MenuList []MenuOrder
Status int // 1表示预约成功,2表示已就餐,3表示已取消
}
func getOrderList(username string) []OrderInfo {
// 查询指定用户的订单信息
// 将信息封装为OrderInfo类型的slice返回
}
三、代码示例
- 用户登录接口
func login(username string, password string) bool {
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/restaurant")
if err != nil {
log.Fatal(err)
}
defer db.Close()
rows, err := db.Query("SELECT * FROM user_info WHERE username = ? AND password = ?", username, password)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
if rows.Next() {
return true
} else {
return false
}
}
- 获取菜品列表接口
type Menu struct {
Id int
Name string
Price float64
Image string
}
func getMenuList() []Menu {
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/restaurant")
if err != nil {
log.Fatal(err)
}
defer db.Close()
rows, err := db.Query("SELECT id, name, price, image FROM menu_info")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var menuList []Menu
for rows.Next() {
var id int
var name string
var price float64
var image string
err := rows.Scan(&id, &name, &price, &image)
if err != nil {
log.Fatal(err)
}
menu := Menu{
Id: id,
Name: name,
Price: price,
Image: image,
}
menuList = append(menuList, menu)
}
return menuList
}
- 预约接口
type MenuOrder struct {
MenuId int
Count int
}
func reserve(username string, orderTime string, eatTime string, eatNumber int, menuOrder []MenuOrder) bool {
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/restaurant")
if err != nil {
log.Fatal(err)
}
defer db.Close()
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
stmt1, err := tx.Prepare("INSERT INTO order_info(order_time, eat_time, eat_number, status) VALUES (?, ?, ?, ?)")
if err != nil {
tx.Rollback()
log.Fatal(err)
}
defer stmt1.Close()
res, err := stmt1.Exec(orderTime, eatTime, eatNumber, 1) // 预约成功
if err != nil {
tx.Rollback()
log.Fatal(err)
}
orderId, err := res.LastInsertId()
if err != nil {
tx.Rollback()
log.Fatal(err)
}
stmt2, err := tx.Prepare("INSERT INTO menu_order_info(order_id, menu_id, count) VALUES (?, ?, ?)")
if err != nil {
tx.Rollback()
log.Fatal(err)
}
defer stmt2.Close()
for _, menu := range menuOrder {
_, err := stmt2.Exec(orderId, menu.MenuId, menu.Count)
if err != nil {
tx.Rollback()
log.Fatal(err)
}
}
err = tx.Commit()
if err != nil {
tx.Rollback()
log.Fatal(err)
}
return true
}
- 查询订单接口
type OrderInfo struct {
OrderId int
OrderTime string
EatTime string
EatNumber int
MenuList []MenuOrder
Status int // 1表示预约成功,2表示已就餐,3表示已取消
}
func getOrderList(username string) []OrderInfo {
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/restaurant")
if err != nil {
log.Fatal(err)
}
defer db.Close()
rows, err := db.Query("SELECT order_info.id, order_time, eat_time, eat_number, status, menu_id, count FROM order_info INNER JOIN menu_order_info ON order_info.id = menu_order_info.order_id WHERE username = ?", username)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var orderList []OrderInfo
for rows.Next() {
var orderId int
var orderTime string
var eatTime string
var eatNumber int
var status int
var menuId int
var count int
err := rows.Scan(&orderId, &orderTime, &eatTime, &eatNumber, &status, &menuId, &count)
if err != nil {
log.Fatal(err)
}
var order *OrderInfo
for i, item := range orderList {
if item.OrderId == orderId {
order = &orderList[i]
break
}
}
if order == nil {
order = &OrderInfo{
OrderId: orderId,
OrderTime: orderTime,
EatTime: eatTime,
EatNumber: eatNumber,
Status: status,
MenuList: make([]MenuOrder, 0),
}
orderList = append(orderList, *order)
}
menuOrder := MenuOrder{
MenuId: menuId,
Count: count,
}
order.MenuList = append(order.MenuList, menuOrder)
}
return orderList
}
四、总结
本文介绍了使用Go语言开发预约点餐系统的方法,并提供了详细的代码示例。通过本文的学习,读者可以掌握预约点餐系统的基本原理和实现方法,为开发类似的系统提供技术支持。另外我们还需要注意保持系统的稳定性和安全性,例如防止SQL注入、鉴权等方面的安全问题。