Maison > Article > développement back-end > 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 :
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='用户地址表'
3. Implémenter la fonction de gestion des adresses de réception
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 }
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 }
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 }
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 }
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 }
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, }) }
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!