Go言語で開発した料理注文システムにおける予約注文機能の実装方法

WBOY
リリース: 2023-11-01 17:47:02
オリジナル
496 人が閲覧しました

Go言語で開発した料理注文システムにおける予約注文機能の実装方法

デジタル時代の到来に伴い、さまざまな業界でデジタルトランスフォーメーションが加速しており、ケータリング業界も例外ではありません。より便利で効率的な食事体験を顧客に提供するために、ますます多くのレストランが注文システムを使用し始めています。中でも予約注文は、来店前に注文・決済を済ませることができるため、お客様の待ち時間が短縮され、店舗の収益向上につながる人気の注文方法です。

この記事では、Go 言語を使用して予約注文システムを開発する方法を紹介します。主にデータベース設計、インターフェイス設計、コード例が含まれます。

1. データベース設計

システムのデータベースには次の情報を保存する必要があります:

  1. ユーザー情報 (user_info): ユーザー名、パスワード、携帯電話など電話番号、電子メールなどの情報;
  2. レシピ情報 (menu_info): 料理名、価格、写真、その他の情報を含む;
  3. 注文情報 (order_info): 注文番号、予約時刻を含む、食事時間、食事の人数、その他の情報 ;
  4. 料理の注文情報 (menu_order_info): 注文番号、料理 ID、数量、その他の情報が含まれます。

2. インターフェイスの設計

  1. ユーザー ログイン インターフェイス
    func login(username string, password string) bool {
        // 在数据库中查询是否存在该用户,密码是否正确
        // 如果存在,则返回true,否则返回false
    }
ログイン後にコピー
  1. メニュー リスト インターフェイスの取得
    type Menu struct {
        Id int
        Name string
        Price float64
        Image string
    }

    func getMenuList() []Menu {
        // 查询数据库,获取菜品列表信息
        // 将信息封装为Menu类型的slice返回
    }
ログイン後にコピー
  1. 予約インターフェイス
    type MenuOrder struct {
        MenuId int
        Count int
    }

    func reserve(username string, orderTime string, eatTime string, eatNumber int, menuOrder []MenuOrder) bool {
        // 生成订单编号
        // 在订单表中新增一条订单信息
        // 在菜品订单表中新增相关信息
        // 返回预约结果(成功或失败)
    }
ログイン後にコピー
  1. クエリ注文インターフェイス
    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返回
    }
ログイン後にコピー

3. コード例

  1. ユーザー ログイン インターフェイス
    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
        }
    }
ログイン後にコピー
    #メニュー リスト インターフェイスの取得
  1. ##
        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
        }
    ログイン後にコピー
  2. #予約インターフェイス
##
    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
    }
ログイン後にコピー
    #クエリ注文インターフェイス
  1.     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
        }
    ログイン後にコピー
    4. 概要
    1. この記事では、Go 言語を使用して予約注文システムを開発する方法を紹介し、詳細なコード例を示します。この記事を読むことで、読者は予約注文システムの基本原理と実装方法を習得し、同様のシステムの開発に対する技術サポートを提供することができます。さらに、SQL インジェクション、認証、その他のセキュリティ問題の防止など、システムの安定性とセキュリティの維持にも注意を払う必要があります。

    以上がGo言語で開発した料理注文システムにおける予約注文機能の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート