go语言实现订单管理系统

写此系统的初衷实为加强对所学部分东西的理解与掌握,简洁的同时达到目的,本文代码/项目的形成正是一个学习和加强实践的过程。

基于macaron+viper+gorm框架(关于macaron、gorm可移步:https://blog.csdn.net/HYZX_9987/article/details/100022849

https://blog.csdn.net/HYZX_9987/article/details/99681632

目录

项目结构

配置文件部分

路由控制器部分

对象关系映射部分


项目结构

配置文件部分

1、配置文件内容及其存放路径

2、配置文件的解析与内容的注入

结构体

注入配置

提示:启动项目时也可以刻意不写配置文件,viper读取配置时会加载路径,如果没有文件会提示在xx路径下找不到config.yaml

这时你再把文件放到xx路径也行。

路由控制器部分

1、初始化马卡龙组件


    
    
  1. m := macaron.Classic()
  2. m.Use(macaron.Renderer())
  3. m.Use(macaron.Recovery())
  4. //test
  5. m.Get( "/", func(ctx *macaron.Context) macaron.ReturnStruct {
  6. return macaron.ReturnStruct{Msg: "Hello world!", Data: "Your macaron."}
  7. })

2、分组路由使用

本系统不需要太复杂的逻辑,暂定实体为客户、订单、订单项,因此分三组路由,前缀以/api开始

3、各模块路由控制器(以Customer部分为例)

路由定义:


    
    
  1. /*
  2. 马卡龙数据绑定:go get github.com/go-macaron/binding,移入pkg包
  3. */
  4. func CusRoute(m *macaron.Macaron) {
  5. //http://localhost:8081/api/cus
  6. m.Get( "/cus", ListCustomer)
  7. //http://localhost:8081/api/cus/1
  8. m.Get( "/cus/:ID", GetCustomer)
  9. m.Post( "/cus", binding.Bind(model.Customer{}), CreateCustomer)
  10. m.Delete( "/cus/:ID", DeleteCustomer)
  11. m.Put( "/cus", binding.Bind(model.Customer{}), UpdateCustomer)
  12. }

对应处理器:


    
    
  1. func CusRoute(m *macaron.Macaron) {
  2. //http://localhost:8081/api/cus
  3. m.Get( "/cus", ListCustomer)
  4. //http://localhost:8081/api/cus/1
  5. m.Get( "/cus/:ID", GetCustomer)
  6. m.Post( "/cus", binding.Bind(model.Customer{}), CreateCustomer)
  7. m.Delete( "/cus/:ID", DeleteCustomer)
  8. m.Put( "/cus", binding.Bind(model.Customer{}), UpdateCustomer)
  9. }
  10. func ListCustomer(ctx *macaron.Context) macaron.ReturnStruct {
  11. var err error
  12. cusList, err := service.ListCustomerInternal()
  13. if err != nil {
  14. errMsg := "list customer err:" + err.Error()
  15. ctx.Resp.Header().Set( "error-info", errMsg)
  16. log.Fatal(errMsg)
  17. return macaron.ReturnStruct{Msg: errMsg}
  18. }
  19. return macaron.ReturnStruct{Data: cusList, Code: http.StatusOK}
  20. }
  21. func GetCustomer(ctx *macaron.Context) macaron.ReturnStruct {
  22. cus, err := service.GetCustomerByIDInternal(ctx.Params( "ID"))
  23. if err != nil {
  24. errMsg := "get customer err:" + err.Error()
  25. ctx.Resp.Header().Set( "error-info", errMsg)
  26. log.Fatal(errMsg)
  27. return macaron.ReturnStruct{Msg: errMsg}
  28. }
  29. return macaron.ReturnStruct{Data: cus, Code: http.StatusOK}
  30. }
  31. func CreateCustomer(customer model.Customer, ctx *macaron.Context) macaron.ReturnStruct {
  32. err := service.CreateCustomerInternal(customer)
  33. if err != nil {
  34. errMsg := "create customer err:" + err.Error()
  35. ctx.Resp.Header().Set( "error-info", errMsg)
  36. log.Fatal(errMsg)
  37. return macaron.ReturnStruct{Msg: errMsg}
  38. }
  39. return macaron.ReturnStruct{Code: http.StatusOK}
  40. }
  41. func DeleteCustomer(ctx *macaron.Context) macaron.ReturnStruct {
  42. err := service.DeleteCustomerByIDInternal(ctx.Params( "ID"))
  43. if err != nil {
  44. errMsg := "del customer err:" + err.Error()
  45. ctx.Resp.Header().Set( "error-info", errMsg)
  46. log.Fatal(errMsg)
  47. return macaron.ReturnStruct{Msg: errMsg}
  48. }
  49. return macaron.ReturnStruct{Code: http.StatusOK}
  50. }
  51. func UpdateCustomer(customer model.Customer, ctx *macaron.Context) macaron.ReturnStruct {
  52. err := service.UpdateCustomerInternal(customer)
  53. if err != nil {
  54. errMsg := "update customer err:" + err.Error()
  55. ctx.Resp.Header().Set( "error-info", errMsg)
  56. log.Fatal(errMsg)
  57. return macaron.ReturnStruct{Msg: errMsg}
  58. }
  59. return macaron.ReturnStruct{Code: http.StatusOK}
  60. }

Service层(非必须,web层可直接与持久层交互):


    
    
  1. func ListCustomerInternal() (cusList []model.Customer, err error) {
  2. cusList, err = dao.ListCustomerByDB()
  3. return cusList, err
  4. }
  5. func GetCustomerByIDInternal(ID string) (cus model.Customer, err error) {
  6. cus, err = dao.GetCustomerByIDByDB(ID)
  7. return cus, err
  8. }
  9. func DeleteCustomerByIDInternal(ID string) (err error) {
  10. err = dao.DeleteCustomerByIDByDB(ID)
  11. return err
  12. }
  13. func CreateCustomerInternal(cus model.Customer) (err error) {
  14. err = dao.CreateCustomerByDB(cus)
  15. return err
  16. }
  17. func UpdateCustomerInternal(cus model.Customer) (err error) {
  18. err = dao.UpdateCustomerByDB(cus)
  19. return err
  20. }

对象关系映射部分

1、gorm开启连接、初始化配置

2、表初始化

3、各模块db操作(持久层)


    
    
  1. func ListCustomerByDB() (list []model.Customer, err error) {
  2. db := config.Connection()
  3. err = db.Find(&list).Error
  4. return list, err
  5. }
  6. func GetCustomerByIDByDB(ID string) (cus model.Customer, err error) {
  7. db := config.Connection()
  8. err = db.Where( "id = ?", ID).Find(&cus).Error
  9. return cus, err
  10. }
  11. func DeleteCustomerByIDByDB(ID string) (err error) {
  12. db := config.Connection()
  13. err = db.Where( "id = ?", ID).Delete(&model.Customer{}).Error
  14. return err
  15. }
  16. func CreateCustomerByDB(cus model.Customer) (err error) {
  17. db := config.Connection()
  18. err = db.Save(&cus).Error
  19. return err
  20. }
  21. func UpdateCustomerByDB(cus model.Customer) (err error) {
  22. db := config.Connection()
  23. err = db.Update(&cus).Error
  24. return err
  25. }

一切就绪后,启动项目:

调接口看效果:

控制台日志:

访问控制

实际项目中往往都加了登录控制以及token校验之类的东西,我们在这模拟一下:


    
    
  1. m.Group( "/api", func() {
  2. m.Group( "", func() {
  3. controller.CusRoute(m)
  4. })
  5. m.Group( "", func() {
  6. controller.OrderRoute(m)
  7. })
  8. m.Group( "", func() {
  9. controller.ItemRoute(m)
  10. })
  11. },CheckToken)

让所有进来的请求都得执行CheckToken函数,函数如下:


    
    
  1. func CheckToken(ctx *macaron.Context) {
  2. if auth := ctx.Req.Header.Get( "auth"); auth == "123" {
  3. log.Println( "token success.")
  4. return
  5. }
  6. ctx.JSON(http.StatusUnauthorized, macaron.ReturnStruct{Code: http.StatusUnauthorized, Msg: "invalid Token."})
  7. }

此时如果继续按刚才的请求访问,那么会被校验住:

如果加了token的验证,那么将一路顺风:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是一种简洁、高效并且具有并发支持的编程语言,特别适合于构建高并发和网络密集型系统。创建一个物流管理系统项目,你可以使用Go来开发的原因包括: 1. **并发友好**:Go的goroutine和channel机制使得处理大量并发请求变得简单,这对于实时追踪订单状态、调度运输任务等场景非常合适。 2. **高效的性能**:由于Go的内存管理优秀,以及编译后的执行效率高,物流系统的后台计算和数据库操作可以快速响应。 3. **易于部署**:Go的可移植性和跨平台能力意味着你的系统可以在多个环境轻松运行,包括常见的服务器集群。 4. **模块化设计**:Go语言支持包管理,这有助于将复杂的物流系统拆分为独立、易于维护的部分,如订单处理、库存管理、路由规划等。 项目实施步骤可能包括: - **需求分析**:明确系统功能,比如订单录入、派送跟踪、路线优化、数据分析等。 - **设计架构**:确定服务端与客户端的交互接口,可能涉及API的设计和RESTful原则。 - **数据库设计**:选择合适的数据库技术(如MySQL或MongoDB),设计数据模型。 - **编写代码**:使用Go编写核心业务逻辑、网络通信和错误处理部分。 - **测试优化**:编写单元测试和集成测试,确保系统稳定性和性能。 - **部署监控**:设置监控体系,以便及时发现并解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值