Heim  >  Artikel  >  Backend-Entwicklung  >  Go-Sprachentwicklung des Tür-zu-Tür-Kochsystems: Wie implementiert man die Funktion zur Verwaltung der Benutzerlieferadresse?

Go-Sprachentwicklung des Tür-zu-Tür-Kochsystems: Wie implementiert man die Funktion zur Verwaltung der Benutzerlieferadresse?

WBOY
WBOYOriginal
2023-11-01 14:07:43790Durchsuche

Go-Sprachentwicklung des Tür-zu-Tür-Kochsystems: Wie implementiert man die Funktion zur Verwaltung der Benutzerlieferadresse?

Mit der Verbesserung der Lebensqualität der Menschen entscheiden sich immer mehr Familien dafür, hochwertige Catering-Dienste zu Hause zu genießen. Das Tür-zu-Tür-Kochsystem hat sich mit der Zeit entwickelt und ist zu einer bequemen, sicheren und gesunden Möglichkeit der Lebensmittelauswahl geworden. Im Rahmen eines solchen Dienstes können Benutzer online eine Bestellung aufgeben und professionelle Köche kommen, um die Zutaten zuzubereiten, das Essen zu kochen und es dem Benutzer zum Genießen nach Hause zu liefern. Die Go-Sprache zeichnet sich durch hohe Effizienz, Stabilität und Sicherheit aus und kann daher bei der Entwicklung mit einem Tür-zu-Tür-Kochsystem sehr gute Ergebnisse erzielen. In diesem Artikel wird erläutert, wie die Funktion zur Verwaltung der Benutzerlieferadresse im Tür-zu-Tür-Kochsystem implementiert wird.

1. Anforderungen für die Benutzer-Lieferadressenverwaltungsfunktion

Im Tür-zu-Tür-Kochsystem müssen Benutzer ihre Lieferadresse eingeben, um sicherzustellen, dass Lebensmittel rechtzeitig zu ihnen nach Hause geliefert werden können. Damit Benutzer ihre eigenen Lieferadressen besser verwalten können, müssen die folgenden Funktionen implementiert werden:

  1. Benutzer können ihre eigenen Adressinformationen hinzufügen, löschen und bearbeiten.
  2. Benutzer können eine Standardadresse festlegen und die Standardadresse verwenden beim Aufgeben von Bestellungen;
  3. Benutzer können alle ihre Adressinformationen einsehen.

2. Datenbank entwerfen

Um die oben genannten Funktionen zu realisieren, müssen wir eine Datenbank mit Benutzerversandadressen entwerfen. Unter der Annahme, dass wir eine MySQL-Datenbank verwenden, können wir die folgende Tabellenstruktur entwerfen:

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. Implementieren Sie die Funktion zur Verwaltung der Empfangsadresse Provinz, Stadt, Bezirk/Bezirk, detaillierte Adresse und andere Informationen, die vom Front-End abgerufen werden sollen, und Datenüberprüfung im Hintergrund durchführen, um Fehler oder böswillige Daten zu vermeiden.

// 添加用户地址
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. Benutzeradresse bearbeiten

Die Funktion „Adresse bearbeiten“ erfordert zunächst die Abfrage der Adresse, die bearbeitet werden muss, und dann die Überprüfung der Daten vor dem Speichern.

// 编辑用户地址
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. Benutzer löscht Adresse

Benutzer, der eine Adresse löscht, muss die Adress-ID angeben. Wenn die Standardadresse gelöscht wird, muss eine andere Adresse als Standardadresse festgelegt werden. Daten müssen vor dem Löschen überprüft werden, um böswillige Vorgänge zu verhindern.

// 删除用户地址
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. Benutzer legt die Standardadresse fest

Um die Standardadresse festzulegen, muss der Benutzer zunächst prüfen, ob die festzulegende Adresse vorhanden ist, dann die ursprüngliche Standardadresse auf eine nicht standardmäßige Adresse festlegen und diese dann festlegen Die Adresse, die als Standardadresse festgelegt werden muss.

// 设置用户默认地址
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. Benutzerabfrage-Adressliste

Die Benutzerabfrage-Adressliste muss die Ergebnisse sortieren, die Standardadresse an die erste Stelle setzen und andere Adressen in umgekehrter Reihenfolge entsprechend der Erstellungszeit.

// 查询用户地址列表
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. Schnittstellendesign
  1. Das Schnittstellendesign sollte die fünf Funktionen Hinzufügen, Bearbeiten, Löschen, Festlegen von Standardadressen und Abfragen von Adresslisten implementieren.
// 添加用户地址接口
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. Zusammenfassung

Die Funktion zur Verwaltung der Benutzerlieferadresse ist eine der wichtigen Funktionen des Tür-zu-Tür-Kochsystems. Die Implementierung dieser Funktion erfordert drei Aspekte: Entwurf der Datenbank, Implementierung spezifischer Funktionen und Schnittstellendesign sowie eine Datenüberprüfung. Durch die Einleitung dieses Artikels glaube ich, dass die Leser grundsätzlich verstehen können, wie die Funktion zur Verwaltung der Benutzerlieferadresse im Tür-zu-Tür-Kochsystem implementiert wird.

Das obige ist der detaillierte Inhalt vonGo-Sprachentwicklung des Tür-zu-Tür-Kochsystems: Wie implementiert man die Funktion zur Verwaltung der Benutzerlieferadresse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn