Dengan peningkatan kualiti hidup orang ramai, semakin ramai keluarga memilih untuk menikmati perkhidmatan katering berkualiti tinggi di rumah. Sistem memasak dari pintu ke pintu muncul mengikut keperluan masa dan telah menjadi cara yang mudah, selamat dan sihat untuk memilih makanan. Di bawah perkhidmatan sedemikian, pengguna boleh membuat pesanan dalam talian, dan tukang masak profesional akan datang untuk menyediakan bahan-bahan, memasak makanan dan menghantarnya ke rumah pengguna untuk dinikmati. Bahasa Go mempunyai ciri kecekapan tinggi, kestabilan dan keselamatan, jadi ia boleh mencapai hasil yang sangat baik apabila dibangunkan dengan sistem memasak dari pintu ke pintu. Artikel ini akan memperkenalkan cara melaksanakan fungsi pengurusan alamat penghantaran pengguna dalam sistem memasak dari pintu ke pintu.
1. Keperluan untuk fungsi pengurusan alamat penghantaran pengguna
Dalam sistem memasak dari pintu ke pintu, pengguna perlu mengisi alamat penghantaran mereka untuk memastikan makanan dapat dihantar ke rumah mereka tepat pada masanya. Untuk membolehkan pengguna mengurus alamat penghantaran mereka sendiri dengan lebih baik, fungsi berikut perlu dilaksanakan:
2. Reka bentuk pangkalan data
Untuk merealisasikan fungsi di atas, kita perlu mereka bentuk pangkalan data alamat penghantaran pengguna. Dengan mengandaikan kami menggunakan pangkalan data MySQL, kami boleh mereka bentuk struktur jadual berikut:
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. Laksanakan fungsi pengurusan alamat penerima
Fungsi alamat tambah memerlukan nama penerima, nombor telefon bimbit, dan wilayah yang akan diperolehi daripada bahagian hadapan , bandar, daerah/daerah, alamat terperinci dan maklumat lain, dan lakukan pengesahan data di latar belakang untuk mengelakkan ralat atau data berniat jahat.
// 添加用户地址 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 }
Fungsi alamat edit memerlukan pertanyaan alamat yang perlu diedit dahulu, dan kemudian mengesahkan data sebelum menyimpan.
// 编辑用户地址 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 }
Pengguna yang memadamkan alamat perlu menyatakan id alamat, dan jika alamat lalai dipadamkan, alamat lain perlu ditetapkan sebagai alamat lalai. Data perlu disahkan sebelum pemadaman untuk mengelakkan operasi berniat jahat.
// 删除用户地址 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 }
Untuk menetapkan alamat lalai, pengguna perlu terlebih dahulu menyemak sama ada alamat yang perlu ditetapkan wujud, kemudian tetapkan alamat lalai asal kepada alamat bukan lalai, dan kemudian tetapkan alamat yang perlu ditetapkan sebagai alamat lalai sebagai alamat lalai.
// 设置用户默认地址 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 }
Senarai alamat pertanyaan pengguna perlu mengisih keputusan, meletakkan alamat lalai dahulu dan alamat lain dalam susunan terbalik mengikut masa penciptaan.
// 查询用户地址列表 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. Reka bentuk antara muka
Reka bentuk antara muka harus melaksanakan lima fungsi menambah, menyunting, memadam, menetapkan alamat lalai dan menyoal senarai alamat.
// 添加用户地址接口 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. Ringkasan
Fungsi pengurusan alamat penghantaran pengguna adalah salah satu fungsi penting sistem memasak dari pintu ke pintu. Melaksanakan fungsi ini memerlukan tiga aspek: mereka bentuk pangkalan data, melaksanakan fungsi tertentu dan reka bentuk antara muka, dan juga memerlukan pengesahan data. Melalui pengenalan artikel ini, saya percaya pembaca pada dasarnya dapat memahami cara melaksanakan fungsi pengurusan alamat penghantaran pengguna dalam sistem memasak dari pintu ke pintu.
Atas ialah kandungan terperinci Pergi pembangunan bahasa sistem memasak dari pintu ke pintu: Bagaimana untuk melaksanakan fungsi pengurusan alamat penghantaran pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!