首頁 後端開發 Golang 上門做菜系統的Go語言開發:如何實現使用者收貨地址管理功能?

上門做菜系統的Go語言開發:如何實現使用者收貨地址管理功能?

Nov 01, 2023 pm 02:07 PM
go語言開發 上門做菜 用戶收貨地址管理

上門做菜系統的Go語言開發:如何實現使用者收貨地址管理功能?

隨著人們生活品質的提高,越來越多的家庭開始選擇在家中享用優質的餐飲服務。而上門做菜系統應運而生,成為了一種便捷、安全、健康的飲食選擇方式。在這樣的服務下,使用者可以在網路下訂單,由專業廚師上門準備食材、烹飪美食,並送到用戶家中享用。 Go語言有著高效率、穩定、安全等特點,因此配合上門做菜系統進行開發可以得到非常好的效果。本文將介紹如何在上門做菜系統中實現使用者收貨地址管理功能。

一、用戶收貨地址管理功能的需求

在上門做菜系統中,用戶需要填寫自己的收貨地址以確保食物能​​夠及時送達到自己的家中。為了讓使用者更能管理自己的收貨地址,需要實現以下功能:

  1. 使用者可以新增、刪除、編輯自己的地址資訊;
  2. 使用者可以設定預設地址,在下單時使用預設位址;
  3. 使用者可以查看自己所有的位址資訊。

二、設計資料庫

為了實現上述功能,我們需要設計一個使用者收貨地址的資料庫。假設我們使用MySQL資料庫,則可以設計如下表結構:

CREATE TABLE `address` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` int(11) NOT NULL COMMENT '用户id',
  `name` varchar(50) NOT NULL COMMENT '收货人姓名',
  `mobile` varchar(20) NOT NULL COMMENT '收货人手机号',
  `province` varchar(50) NOT NULL COMMENT '省份',
  `city` varchar(50) NOT NULL COMMENT '城市',
  `district` varchar(50) NOT NULL COMMENT '区/县',
  `address` varchar(200) NOT NULL COMMENT '详细地址',
  `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否为默认地址,0表示不是,1表示是',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户地址表'
登入後複製

三、實作收貨地址管理功能

  1. 使用者新增位址

新增地址功能需要從前端獲取到收貨人姓名、手機號碼、省份、城市、區/縣、詳細地址等信息,並在後台進行數據校驗,避免出現錯誤或惡意數據。

// 添加用户地址
func AddAddress(userId int, addForm *forms.AddressAddForm) error {
    // 数据校验
    err := validateAddressForm(addForm)
    if err != nil {
        return err
    }

    // 插入数据库
    address := models.Address{
        UserId:     userId,
        Name:       addForm.Name,
        Mobile:     addForm.Mobile,
        Province:   addForm.Province,
        City:       addForm.City,
        District:   addForm.District,
        Address:    addForm.Address,
        IsDefault:  addForm.IsDefault,
        CreateTime: time.Now(),
        UpdateTime: time.Now(),
    }
    err = address.Insert()
    if err != nil {
        return err
    }

    return nil
}

// 数据校验
func validateAddressForm(addForm *forms.AddressAddForm) error {
    // 校验收货人姓名
    if addForm.Name == "" {
        return errors.New("收货人姓名不能为空")
    }
    if utf8.RuneCountInString(addForm.Name) > 50 {
        return errors.New("收货人姓名长度不能超过50个字符")
    }
    // 校验手机号码
    if addForm.Mobile == "" {
        return errors.New("手机号码不能为空")
    }
    if !regexp.MustCompile(`^[1][3,4,5,7,8][0-9]{9}$`).MatchString(addForm.Mobile) {
        return errors.New("手机号码格式不正确")
    }
    // 校验省份、城市、区/县、详细地址
    if addForm.Province == "" {
        return errors.New("省份不能为空")
    }
    if utf8.RuneCountInString(addForm.Province) > 50 {
        return errors.New("省份长度不能超过50个字符")
    }
    if addForm.City == "" {
        return errors.New("城市不能为空")
    }
    if utf8.RuneCountInString(addForm.City) > 50 {
        return errors.New("城市长度不能超过50个字符")
    }
    if addForm.District == "" {
        return errors.New("区/县不能为空")
    }
    if utf8.RuneCountInString(addForm.District) > 50 {
        return errors.New("区/县长度不能超过50个字符")
    }
    if addForm.Address == "" {
        return errors.New("详细地址不能为空")
    }
    if utf8.RuneCountInString(addForm.Address) > 200 {
        return errors.New("详细地址长度不能超过200个字符")
    }

    return nil
}
登入後複製
  1. 使用者編輯位址

編輯位址功能需要先查詢需要編輯的位址,然後在儲存前進行資料校驗。

// 编辑用户地址
func EditAddress(userId, addressId int, editForm *forms.AddressEditForm) error {
    // 根据地址id查询地址信息
    address, err := models.GetAddressById(userId, addressId)
    if err != nil {
        return err
    }
    if address.Id == 0 {
        return errors.New("地址不存在")
    }

    // 数据校验
    err = validateAddressForm(&forms.AddressAddForm{
        Name:     editForm.Name,
        Mobile:   editForm.Mobile,
        Province: editForm.Province,
        City:     editForm.City,
        District: editForm.District,
        Address:  editForm.Address,
    })
    if err != nil {
        return err
    }

    // 修改数据库
    address.Name = editForm.Name
    address.Mobile = editForm.Mobile
    address.Province = editForm.Province
    address.City = editForm.City
    address.District = editForm.District
    address.Address = editForm.Address
    address.IsDefault = editForm.IsDefault
    address.UpdateTime = time.Now()
    err = address.Update()
    if err != nil {
        return err
    }

    return nil
}
登入後複製
  1. 使用者刪除位址

使用者刪除位址需要指定位址id,且如果刪除的是預設位址,則需要將另一個位址設為預設位址。刪除前需要對資料進行校驗,避免惡意操作。

// 删除用户地址
func DeleteAddress(userId, addressId int) error {
    // 根据地址id查询地址信息
    address, err := models.GetAddressById(userId, addressId)
    if err != nil {
        return err
    }
    if address.Id == 0 {
        return errors.New("地址不存在")
    }

    // 判断是否默认地址
    defaultAddress, err := models.GetDefaultAddressByUserId(userId)
    if err != nil {
        return err
    }
    if address.IsDefault && defaultAddress.Id == address.Id {
        // 删除的是默认地址,需要将另一个地址设置为默认地址
        otherAddress, err := models.GetOtherAddressByUserIdAndAddressId(userId, address.Id)
        if err != nil {
            return err
        }
        if otherAddress.Id > 0 {
            otherAddress.IsDefault = true
            err = otherAddress.Update()
            if err != nil {
                return err
            }
        }
    }

    // 删除数据库
    err = address.Delete()
    if err != nil {
        return err
    }

    return nil
}
登入後複製
  1. 使用者設定預設位址

使用者設定預設位址需要先查詢出需要設定的位址是否存在,然後將原來的預設位址設為非預設位址,再將需要設定成預設位址的位址設定為預設位址。

// 设置用户默认地址
func SetDefaultAddress(userId, addressId int) error {
    // 查询需要设置为默认地址的地址是否存在,如果不存在则返回错误
    address, err := models.GetAddressById(userId, addressId)
    if err != nil {
        return err
    }
    if address.Id == 0 {
        return errors.New("地址不存在")
    }

    // 将原来的默认地址设置为非默认地址
    defaultAddress, err := models.GetDefaultAddressByUserId(userId)
    if err != nil {
        return err
    }
    if defaultAddress.Id > 0 {
        defaultAddress.IsDefault = false
        err = defaultAddress.Update()
        if err != nil {
            return err
        }
    }

    // 将需要设置为默认地址的地址设置为默认地址
    address.IsDefault = true
    err = address.Update()
    if err != nil {
        return err
    }

    return nil
}
登入後複製
  1. 使用者查詢位址清單

使用者查詢位址清單需要對結果進行排序,將預設位址排在前面,其他位址依照建立時間逆序排列。

// 查询用户地址列表
func GetAddressList(userId int) ([]models.Address, error) {
    addressList, err := models.GetAddressListByUserId(userId)
    if err != nil {
        return nil, err
    }

    // 对结果进行排序,将默认地址排在前面,其他地址按照创建时间逆序排列
    sort.SliceStable(addressList, func(i, j int) bool {
        if addressList[i].IsDefault {
            return true
        }
        if addressList[j].IsDefault {
            return false
        }
        return addressList[i].CreateTime.After(addressList[j].CreateTime)
    })

    return addressList, nil
}
登入後複製

四、介面設計

介面設計要實現新增、編輯、刪除、設定預設位址和查詢位址清單這五個功能。

// 添加用户地址接口
func AddAddress(c *gin.Context) {
    var addForm forms.AddressAddForm
    err := c.ShouldBindJSON(&addForm)
    if err != nil {
        ResponseError(c, CodeInvalidParams)
        return
    }

    userId, _ := getCurrentUserId(c)
    err = services.AddAddress(userId, &addForm)
    if err != nil {
        ResponseError(c, CodeServerBusy)
        return
    }

    ResponseSuccess(c, nil)
}

// 编辑用户地址接口
func EditAddress(c *gin.Context) {
    addressId, ok := getQueryInt(c, "address_id")
    if !ok {
        ResponseError(c, CodeInvalidParams)
        return
    }

    var editForm forms.AddressEditForm
    err := c.ShouldBindJSON(&editForm)
    if err != nil {
        ResponseError(c, CodeInvalidParams)
        return
    }

    userId, _ := getCurrentUserId(c)
    err = services.EditAddress(userId, addressId, &editForm)
    if err != nil {
        ResponseError(c, CodeServerBusy)
        return
    }

    ResponseSuccess(c, nil)
}

// 删除用户地址接口
func DeleteAddress(c *gin.Context) {
    addressId, ok := getQueryInt(c, "address_id")
    if !ok {
        ResponseError(c, CodeInvalidParams)
        return
    }

    userId, _ := getCurrentUserId(c)
    err := services.DeleteAddress(userId, addressId)
    if err != nil {
        ResponseError(c, CodeServerBusy)
        return
    }

    ResponseSuccess(c, nil)
}

// 设置用户默认地址接口
func SetDefaultAddress(c *gin.Context) {
    addressId, ok := getQueryInt(c, "address_id")
    if !ok {
        ResponseError(c, CodeInvalidParams)
        return
    }

    userId, _ := getCurrentUserId(c)
    err := services.SetDefaultAddress(userId, addressId)
    if err != nil {
        ResponseError(c, CodeServerBusy)
        return
    }

    ResponseSuccess(c, nil)
}

// 获取用户地址列表接口
func GetAddressList(c *gin.Context) {
    userId, _ := getCurrentUserId(c)
    addressList, err := services.GetAddressList(userId)
    if err != nil {
        ResponseError(c, CodeServerBusy)
        return
    }

    ResponseSuccess(c, gin.H{
        "list": addressList,
    })
}
登入後複製

五、總結

使用者收貨地址管理功能是上門做菜系統的重要功能之一。要實現這項功能需要從設計資料庫、實現特定功能和介面設計三個面向進行,還需要進行資料校驗。透過本文的介紹,相信讀者可以基本掌握如何在上門做菜系統中實現用戶收貨地址管理功能。

以上是上門做菜系統的Go語言開發:如何實現使用者收貨地址管理功能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何進行Go語言開發中的單元測試與整合測試 如何進行Go語言開發中的單元測試與整合測試 Jun 29, 2023 am 11:58 AM

如何進行Go語言開發中的單元測試和整合測試摘要:在軟體開發中,單元測試和整合測試是確保程式碼品質和功能穩定性的重要手段。而在Go語言中,也有一套完善的工具支持,使得單元測試和整合測試變得更加簡單和有效率。本文將介紹如何進行Go語言開發中的單元測試和整合測試,並透過一些範例程式碼進行示範。引言Go語言是一種開源的程式語言,因其簡潔而強大的特性而受到越來越多開發者的喜

如何利用Go語言開發點餐系統的會員管理功能 如何利用Go語言開發點餐系統的會員管理功能 Nov 01, 2023 am 09:41 AM

如何利用Go語言開發點餐系統的會員管理功能一、引言隨著行動互聯網的普及,點餐系統成為了餐飲業不可或缺的一部分。而會員管理功能作為點餐系統的重要組成部分,對於提升使用者體驗、增強使用者黏性具有重要作用。本文將介紹如何利用Go語言開發點餐系統的會員管理功能,並提供具體的程式碼範例。二、會員管理功能的需求分析會員註冊:使用者可透過手機號碼、信箱等方式註冊成為會員。會員登

Go語言開發工作專案經驗分享 Go語言開發工作專案經驗分享 Nov 02, 2023 am 09:14 AM

隨著網路的發展,電腦科學領域也迎來了許多全新的程式語言。其中,Go語言以其並發性和簡潔的語法,逐漸成為許多開發者的首選。作為一名從事軟體開發的工程師,我有幸參與了一個基於Go語言的工作項目,並在這個過程中積累了一些寶貴的經驗和教訓。首先,選擇適合的框架和函式庫是至關重要的。在開始專案之前,我們進行了詳細的研究,嘗試了不同的框架和函式庫,最後選擇了Gin框架作為我

如何使用Go語言編寫上門做菜系統中的使用者回饋模組? 如何使用Go語言編寫上門做菜系統中的使用者回饋模組? Nov 01, 2023 pm 04:36 PM

如何使用Go語言編寫上門做菜系統中的使用者回饋模組?隨著外送和上門服務的興起,越來越多的用戶選擇在家中享受美食。而對於上門做菜服務來說,使用者的回饋意見尤其重要,可以幫助提升服務品質和使用者滿意度。本文將介紹如何使用Go語言編寫上門做菜系統中的使用者回饋模組,並提供具體的程式碼範例。資料庫設計與創建首先,我們需要設計資料庫來儲存使用者的回饋資訊。假設我們有一個名為feed

Go語言開發小技巧:阿里雲介面對接實作分享 Go語言開發小技巧:阿里雲介面對接實作分享 Jul 05, 2023 pm 11:49 PM

Go語言開發小技巧:阿里雲端介面對接實務分享前言:現如今,雲端運算已成為了企業資訊化建置的核心技術之一,而阿里雲端作為國內知名的雲端運算服務供應商,擁有豐富的雲端產品和服務。本文將分享筆者在使用Go語言對接阿里雲介面時的一些實務經驗,並以程式碼範例的形式進行闡述。一、引進阿里雲GoSDK在使用Go語言對接阿里雲介面之前,首先我們需要引進對應的阿里雲GoSDK,以便

使用Go語言開發跨平台應用程式的優點和挑戰 使用Go語言開發跨平台應用程式的優點和挑戰 Jul 03, 2023 pm 05:25 PM

使用Go語言開發跨平台應用程式的優點和挑戰隨著行動互聯網的迅速發展,跨平台應用程式成為了開發者們的必備技能。 Go語言作為一門簡潔高效、並發性能出色的語言,因其獨特的特性而逐漸受到開發者的青睞。本文將探討使用Go語言開發跨平台應用程式的優點和挑戰,並提供相應的程式碼範例。一、優點1.語言特性齊備:Go語言提供了豐富的標準庫,涵蓋了各種常用功能,如文件操作、網絡通

如何用Go語言開發一個簡單的線上教育平台 如何用Go語言開發一個簡單的線上教育平台 Nov 20, 2023 pm 03:32 PM

如何用Go語言開發一個簡單的線上教育平台引言:如今,互聯網的發展已經滲透到了各行各業,教育領域也不例外。線上教育平台的出現,使學習變得更加靈活和便捷,得到了廣大學生和家長的青睞。本文將介紹如何使用Go語言開發一個簡單的線上教育平台,包括平台建置、功能開發及資料庫設計等方面的內容。一、平台建置首先,我們需要安裝Go語言開發環境。可從官方網站下載並安裝最新版

如何優化Go語言開發中的網路傳輸安全性 如何優化Go語言開發中的網路傳輸安全性 Jun 29, 2023 am 09:41 AM

如何優化Go語言開發中的網路傳輸安全性隨著網路的快速發展,網路傳輸的安全性變得越來越重要。在Go語言開發中,我們可以採取一些措施來優化網路傳輸的安全性。本文將介紹一些常見的方法和技術來幫助你提升Go語言網路傳輸的安全性。一、使用HTTPS協議HTTPS是基於SSL/TLS協定的安全網路傳輸協議,能夠提供加密和身份驗證的功能,可以有效防止網路傳輸被竊聽和

See all articles