Maison développement back-end Golang Go développement linguistique du système de cuisine porte-à-porte : comment mettre en œuvre la fonction de gestion des adresses de livraison des utilisateurs ?

Go développement linguistique du système de cuisine porte-à-porte : comment mettre en œuvre la fonction de gestion des adresses de livraison des utilisateurs ?

Nov 01, 2023 pm 02:07 PM
go语言开发 Cuisine maison Gestion des adresses de livraison des utilisateurs

Go développement linguistique du système de cuisine porte-à-porte : comment mettre en œuvre la fonction de gestion des adresses de livraison des utilisateurs ?

Avec l’amélioration de la qualité de vie des gens, de plus en plus de familles choisissent de bénéficier de services de restauration de qualité à domicile. Le système de cuisson en porte-à-porte est apparu au fur et à mesure que les temps l'exigent et est devenu un moyen pratique, sûr et sain de choisir ses aliments. Dans le cadre d'un tel service, les utilisateurs peuvent passer une commande en ligne et des chefs professionnels viendront préparer les ingrédients, cuisiner les aliments et les livrer au domicile de l'utilisateur pour en profiter. Le langage Go présente les caractéristiques d'une efficacité, d'une stabilité et d'une sécurité élevées, il peut donc obtenir de très bons résultats lorsqu'il est développé avec un système de cuisson porte-à-porte. Cet article présentera comment implémenter la fonction de gestion des adresses de livraison des utilisateurs dans le système de cuisson porte-à-porte.

1. Exigences relatives à la fonction de gestion de l'adresse de livraison des utilisateurs

Dans le système de cuisson porte-à-porte, les utilisateurs doivent renseigner leur adresse de livraison pour garantir que les aliments peuvent être livrés à leur domicile à temps. Afin de permettre aux utilisateurs de mieux gérer leurs propres adresses de livraison, les fonctions suivantes doivent être mises en œuvre :

  1. Les utilisateurs peuvent ajouter, supprimer et modifier leurs propres informations d'adresse 
  2. Les utilisateurs peuvent définir une adresse par défaut et utiliser l'adresse par défaut ; lors de la passation de commandes ;
  3. Les utilisateurs peuvent consulter toutes leurs informations d'adresse.

2. Concevoir une base de données

Afin de réaliser les fonctions ci-dessus, nous devons concevoir une base de données d'adresses de livraison des utilisateurs. En supposant que nous utilisons une base de données MySQL, nous pouvons concevoir la structure de table suivante :

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='用户地址表'
Copier après la connexion

3. Implémenter la fonction de gestion des adresses de réception

  1. Adresse ajoutée par l'utilisateur

La fonction d'ajout d'adresse nécessite le nom, le numéro de téléphone portable et le destinataire. province à obtenir à partir du front-end, ville, district/comté, adresse détaillée et autres informations, et effectuer une vérification des données en arrière-plan pour éviter les erreurs ou les données malveillantes.

// 添加用户地址
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
}
Copier après la connexion
  1. Modifier l'adresse utilisateur

La fonction de modification de l'adresse nécessite d'abord d'interroger l'adresse qui doit être modifiée, puis de vérifier les données avant de les enregistrer.

// 编辑用户地址
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
}
Copier après la connexion
  1. Adresse de suppression de l'utilisateur

L'utilisateur qui supprime une adresse doit spécifier l'identifiant de l'adresse, et si l'adresse par défaut est supprimée, une autre adresse doit être définie comme adresse par défaut. Les données doivent être vérifiées avant la suppression pour éviter les opérations malveillantes.

// 删除用户地址
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
}
Copier après la connexion
  1. L'utilisateur définit l'adresse par défaut

Pour définir l'adresse par défaut, l'utilisateur doit d'abord vérifier si l'adresse à définir existe, puis définir l'adresse par défaut d'origine sur une adresse autre que celle par défaut, puis définir l'adresse qui doit être définie comme adresse par défaut comme adresse par défaut.

// 设置用户默认地址
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
}
Copier après la connexion
  1. Liste d'adresses de requête utilisateur

La liste d'adresses de requête utilisateur doit trier les résultats, mettre l'adresse par défaut en premier et les autres adresses dans l'ordre inverse en fonction de l'heure de création.

// 查询用户地址列表
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
}
Copier après la connexion

4. Conception de l'interface

La conception de l'interface doit implémenter les cinq fonctions d'ajout, de modification, de suppression, de définition d'adresse par défaut et d'interrogation de la liste d'adresses.

// 添加用户地址接口
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,
    })
}
Copier après la connexion

5. Résumé

La fonction de gestion des adresses de livraison des utilisateurs est l'une des fonctions importantes du système de cuisson porte-à-porte. La mise en œuvre de cette fonction nécessite trois aspects : la conception de la base de données, la mise en œuvre de fonctions spécifiques et la conception de l'interface, et nécessite également une vérification des données. Grâce à l'introduction de cet article, je pense que les lecteurs peuvent fondamentalement comprendre comment mettre en œuvre la fonction de gestion des adresses de livraison des utilisateurs dans le système de cuisson porte-à-porte.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment effectuer des tests unitaires et des tests d'intégration dans le développement du langage Go Comment effectuer des tests unitaires et des tests d'intégration dans le développement du langage Go Jun 29, 2023 am 11:58 AM

Comment effectuer des tests unitaires et des tests d'intégration dans le développement du langage Go Résumé : Dans le développement de logiciels, les tests unitaires et les tests d'intégration sont des moyens importants pour garantir la qualité du code et la stabilité fonctionnelle. Dans le langage Go, il existe également un ensemble complet d'outils de prise en charge, rendant les tests unitaires et les tests d'intégration plus faciles et plus efficaces. Cet article présentera comment effectuer des tests unitaires et des tests d'intégration dans le développement du langage Go, et le démontrera à travers quelques exemples de codes. Introduction Le langage Go est un langage de programmation open source privilégié par de plus en plus de développeurs en raison de sa simplicité et de ses fonctionnalités puissantes.

Comment utiliser le langage Go pour développer la fonction de gestion des membres du système de commande Comment utiliser le langage Go pour développer la fonction de gestion des membres du système de commande Nov 01, 2023 am 09:41 AM

Comment utiliser le langage Go pour développer la fonction de gestion des membres du système de commande 1. Introduction Avec la popularité de l'Internet mobile, le système de commande est devenu un élément indispensable du secteur de la restauration. En tant qu'élément important du système de commande, la fonction de gestion des membres joue un rôle important dans l'amélioration de l'expérience utilisateur et la fidélisation des utilisateurs. Cet article expliquera comment utiliser le langage Go pour développer la fonction de gestion des membres du système de commande et fournira des exemples de code spécifiques. 2. Analyse de la demande des fonctions de gestion des membres Inscription des membres : les utilisateurs peuvent s'inscrire en tant que membres via un numéro de téléphone mobile, un e-mail, etc. Connexion membre

Aller au partage d'expériences de projets de travail de développement linguistique Aller au partage d'expériences de projets de travail de développement linguistique Nov 02, 2023 am 09:14 AM

Avec le développement d’Internet, le domaine de l’informatique a également ouvert la voie à de nombreux nouveaux langages de programmation. Parmi eux, le langage Go est progressivement devenu le premier choix de nombreux développeurs en raison de sa concurrence et de sa syntaxe concise. En tant qu'ingénieur engagé dans le développement de logiciels, j'ai eu la chance de participer à un projet de travail basé sur le langage Go et d'accumuler des expériences et des leçons précieuses au cours du processus. Premièrement, choisir les bons frameworks et bibliothèques est crucial. Avant de démarrer le projet, nous avons mené des recherches détaillées, essayé différents frameworks et bibliothèques, et finalement choisi le framework Gin comme notre

Comment utiliser le langage Go pour rédiger le module de feedback utilisateur dans le système de cuisson en porte-à-porte ? Comment utiliser le langage Go pour rédiger le module de feedback utilisateur dans le système de cuisson en porte-à-porte ? Nov 01, 2023 pm 04:36 PM

Comment utiliser le langage Go pour rédiger le module de feedback utilisateur dans le système de cuisson en porte-à-porte ? Avec l’essor des services de plats à emporter et de porte-à-porte, de plus en plus d’utilisateurs choisissent de déguster de délicieux plats à la maison. Pour les services de cuisine en porte-à-porte, les commentaires des utilisateurs sont particulièrement importants, car ils peuvent contribuer à améliorer la qualité du service et la satisfaction des utilisateurs. Cet article explique comment utiliser le langage Go pour écrire le module de commentaires des utilisateurs dans le système de cuisson porte-à-porte et fournit des exemples de code spécifiques. Conception et création d'une base de données Tout d'abord, nous devons concevoir une base de données pour stocker les informations des commentaires des utilisateurs. Supposons que nous ayons un flux appelé

Conseils de développement du langage Go : partage des pratiques d'accueil de l'interface Alibaba Cloud Conseils de développement du langage Go : partage des pratiques d'accueil de l'interface Alibaba Cloud Jul 05, 2023 pm 11:49 PM

Conseils de développement du langage Go : partage des pratiques d'accueil de l'interface Alibaba Cloud Préface : De nos jours, le cloud computing est devenu l'une des technologies de base pour la construction d'informations d'entreprise, et Alibaba Cloud, en tant que fournisseur de services de cloud computing bien connu en Chine, propose une riche gamme de produits et services cloud. Cet article partagera une partie de l'expérience pratique de l'auteur dans l'utilisation du langage Go pour se connecter aux interfaces Alibaba Cloud, et l'expliquera sous forme d'exemples de code. 1. Introduction d'Alibaba Cloud GoSDK Avant d'utiliser le langage Go pour se connecter à l'interface Alibaba Cloud, nous devons d'abord introduire le Alibaba Cloud GoSDK correspondant afin que

Avantages et défis du développement d'applications multiplateformes à l'aide du langage Go Avantages et défis du développement d'applications multiplateformes à l'aide du langage Go Jul 03, 2023 pm 05:25 PM

Avantages et défis de l'utilisation du langage Go pour développer des applications multiplateformes Avec le développement rapide de l'Internet mobile, les applications multiplateformes sont devenues une compétence essentielle pour les développeurs. Langage simple et efficace doté d’excellentes performances de concurrence, le langage Go est progressivement privilégié par les développeurs en raison de ses caractéristiques uniques. Cet article explorera les avantages et les défis du développement d'applications multiplateformes à l'aide du langage Go et fournira des exemples de code correspondants. 1. Avantages 1. Fonctionnalités complètes du langage : le langage Go fournit une riche bibliothèque standard, couvrant diverses fonctions courantes, telles que les opérations sur les fichiers, la communication réseau, etc.

Comment développer une plateforme d'éducation en ligne simple en utilisant le langage Go Comment développer une plateforme d'éducation en ligne simple en utilisant le langage Go Nov 20, 2023 pm 03:32 PM

Comment développer une plateforme simple d'éducation en ligne en utilisant le langage Go Introduction : Aujourd'hui, le développement d'Internet a pénétré tous les horizons, et le domaine de l'éducation ne fait pas exception. L’émergence des plateformes d’éducation en ligne a rendu l’apprentissage plus flexible et plus pratique, et a été favorisée par les étudiants et les parents. Cet article présentera comment utiliser le langage Go pour développer une plate-forme simple d'éducation en ligne, y compris la construction de plate-forme, le développement de fonctions et la conception de bases de données. 1. Construction de la plateforme Tout d'abord, nous devons installer l'environnement de développement du langage Go. Vous pouvez télécharger et installer la dernière version depuis le site officiel

Comment optimiser la sécurité de la transmission réseau dans le développement du langage Go Comment optimiser la sécurité de la transmission réseau dans le développement du langage Go Jun 29, 2023 am 09:41 AM

Comment optimiser la sécurité des transmissions réseau dans le développement du langage Go Avec le développement rapide d'Internet, la sécurité des transmissions réseau est devenue de plus en plus importante. Dans le développement du langage Go, nous pouvons prendre certaines mesures pour optimiser la sécurité de la transmission réseau. Cet article présentera quelques méthodes et technologies courantes pour vous aider à améliorer la sécurité de la transmission réseau en langue Go. 1. Utilisez le protocole HTTPS HTTPS est un protocole de transmission réseau sécurisé basé sur le protocole SSL/TLS. Il peut fournir des fonctions de cryptage et d'authentification et peut empêcher efficacement l'écoute et la transmission réseau.

See all articles