>  기사  >  백엔드 개발  >  방문 조리 시스템의 Go 언어 개발: 사용자 배달 주소 관리 기능을 구현하는 방법은 무엇입니까?

방문 조리 시스템의 Go 언어 개발: 사용자 배달 주소 관리 기능을 구현하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-11-01 14:07:43833검색

방문 조리 시스템의 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. 사용자 추가 주소

주소 추가 기능에는 수취인의 이름, 휴대폰 번호 및 프런트엔드에서 시, 구/군, 세부 주소 및 기타 정보를 획득하고 백그라운드에서 데이터 검증을 수행하여 오류나 악성 데이터를 방지합니다.

// 添加用户地址
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
}

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.