ホームページ > バックエンド開発 > Golang > 宅配調理システムのGo言語開発:ユーザー配送先管理機能をどう実装するか?

宅配調理システムのGo言語開発:ユーザー配送先管理機能をどう実装するか?

WBOY
リリース: 2023-11-01 14:07:43
オリジナル
848 人が閲覧しました

宅配調理システムのGo言語開発:ユーザー配送先管理機能をどう実装するか?

人々の生活の質の向上に伴い、自宅で高品質のケータリング サービスを楽しむことを選択する家族が増えています。時代の要請に応じて登場した訪問調理システムは、便利で安全、そして健康的な食品選びの手段となりました。ネットで注文すると、プロの料理人が食材の下ごしらえから調理、自宅まで届けてくれるサービスです。 Go 言語は効率性、安定性、セキュリティが高いという特徴があるため、訪問調理システムで開発すると非常に良い結果が得られます。この記事では、宅配調理システムにユーザー配送先管理機能を導入する方法を紹介します。

1. ユーザー配送先管理機能の要件

宅配調理システムでは、確実に自宅に料理を届けるために、ユーザーは自分の配送先住所を入力する必要があります。間に合うように。ユーザーが自分の配送先住所をより適切に管理できるようにするには、次の機能を実装する必要があります:

  1. ユーザーは自分の住所情報を追加、削除、編集できます;
  2. ユーザーデフォルトの住所を設定でき、注文時にデフォルトの住所を使用できます。
  3. ユーザーはすべての住所情報を表示できます。

2. データベースの設計

上記の機能を実現するには、ユーザーの配送先住所のデータベースを設計する必要があります。 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='用户地址表'
ログイン後にコピー

3. 配送先住所管理機能の実装

  1. #ユーザーが住所を追加
#Add 住所関数は、荷受人の名前、携帯電話番号、州、市、地区/郡、詳細な住所などの情報をフロントエンドから取得し、エラーや悪意のあるデータを回避するためにバックグラウンドでデータ検証を実行する必要があります。

// 添加用户地址
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
}
ログイン後にコピー

    ユーザー編集アドレス
アドレス編集機能では、まず編集するアドレスをクエリし、保存する前にデータを確認する必要があります。

// 编辑用户地址
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
}
ログイン後にコピー

    ユーザー削除アドレス
ユーザー削除アドレスにはアドレス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
}
ログイン後にコピー

    ユーザーがデフォルト アドレスを設定します
デフォルト アドレスを設定するには、まず設定するアドレスが存在するかどうかを確認してから、元のデフォルト アドレスを設定する必要があります。デフォルト以外のアドレスを設定し、デフォルトアドレスとして設定する必要があるアドレスをデフォルトアドレスとして設定します。

// 设置用户默认地址
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
}
ログイン後にコピー

    ユーザー クエリ アドレス リスト
ユーザー クエリ アドレス リストは、デフォルトのアドレスを先頭にして、作成に従って他のアドレスを逆の順序で結果を並べ替える必要があります。時間。

// 查询用户地址列表
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
}
ログイン後にコピー

4. インターフェイス設計

インターフェイス設計では、追加、編集、削除、デフォルト アドレスの設定、アドレス リストの問い合わせの 5 つの機能を実現する必要があります。

// 添加用户地址接口
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,
    })
}
ログイン後にコピー
5. まとめ

ユーザー配送先管理機能は、宅配調理システムの重要な機能の一つです。この機能の実装には、データベースの設計、特定の機能の実装、インターフェイスの設計の 3 つの側面が必要であり、データの検証も必要です。この記事の導入により、読者は訪問調理システムにおけるユーザー配送先管理機能の実装方法を基本的に理解できると思います。

以上が宅配調理システムのGo言語開発:ユーザー配送先管理機能をどう実装するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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