사람들의 삶의 질이 향상됨에 따라 집에서 고품질 케이터링 서비스를 즐기기를 선택하는 가족이 점점 더 많아지고 있습니다. 시대의 요구에 따라 등장한 방문 조리 시스템은 편리하고 안전하며 건강한 음식 선택 방식이 되었습니다. 이 서비스는 사용자가 온라인으로 주문하면 전문 요리사가 와서 재료를 준비하고 음식을 조리한 후 사용자의 집까지 배달해 즐거움을 선사한다. Go 언어는 고효율, 안정성, 보안성 등의 특징을 갖고 있어, 방문 조리 시스템으로 개발하면 아주 좋은 결과를 얻을 수 있다. 본 글에서는 방문조리 시스템에서 사용자 배송주소 관리 기능을 구현하는 방법을 소개한다.
1. 사용자 배달 주소 관리 기능 요구사항
집집 조리 시스템에서는 음식이 집까지 제 시간에 배달될 수 있도록 사용자가 배달 주소를 입력해야 합니다. 사용자가 자신의 배송 주소를 더 잘 관리할 수 있도록 다음 기능이 구현되어야 합니다.
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. 수신 주소 관리 기능 구현
주소 추가 기능에는 수취인의 이름, 휴대폰 번호 및 프런트엔드에서 시, 구/군, 세부 주소 및 기타 정보를 획득하고 백그라운드에서 데이터 검증을 수행하여 오류나 악성 데이터를 방지합니다.
// 添加用户地址 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. 요약
사용자 배송지 관리 기능은 방문 조리 시스템의 중요한 기능 중 하나입니다. 이 기능을 구현하려면 데이터베이스 설계, 특정 기능 구현 및 인터페이스 설계의 세 가지 측면이 필요하며 데이터 검증도 필요합니다. 이 글의 소개를 통해 독자들은 방문 조리 시스템에서 사용자 배송 주소 관리 기능을 구현하는 방법을 기본적으로 이해할 수 있을 것이라고 생각합니다.
위 내용은 방문 조리 시스템의 Go 언어 개발: 사용자 배달 주소 관리 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!