[完结19章]SpringBoot开发双11商品服务系统

kuanmdboss · · 443 次点击 · 开始浏览    置顶

![1.png](https://static.golangjob.cn/231122/8d9af6901cc7d9b31e670a42161c35b9.png) 如何使用SpringBoot开发一款关于双11商品服务的系统?今天就给大家说道说道,希望对大家的学习有所帮助! 1.什么是SpringBoot? Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。 Spring Boot是由Pivotal团队提供的基于Spring的框架,该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。Spring Boot集成了绝大部分目前流行的开发框架,就像Maven集成了所有的JAR包一样,Spring Boot集成了几乎所有的框架,使得开发者能快速搭建Spring项目。 2.SpringBoot的优点 快速集成框架,Spring Boot 提供了启动添加依赖的功能,⽤于秒级集成各种框架。 内置运⾏容器,⽆需配置 Tomcat 等 Web 容器,直接运⾏和部署程序。 快速部署项⽬,⽆需外部容器即可启动并运⾏项⽬。 可以完全抛弃繁琐的 XML,使⽤注解和配置的⽅式进⾏开发。 ⽀持更多的监控的指标,可以更好的了解项⽬的运⾏情况 后端配置 1.1创建Springboot工程 打开idea->file->new->project 选择spring Initializer进行配置,java版本选择8,点击next - internal 应用代码 - controllers 控制器模块 - admin 后端控制器 - front 前端控制器 - listen redis监听器 - models 模型模块 - service 服务模块 - product_serive 商品服务 - wechat_menu_serive 微信公众号菜单服务 ...... - conf 公共配置 -config.yml yml配置文件 -config.go 配置解析,转化成对应的结构体 - middleware 中间件 - AuthCheck.go jwt接口权限校验 - cors.go 跨域处理 ...... - pkg 程序应用包 - app - base - casbin - jwt - qrcode - wechat ..... - routere 路由 - logs 日志存放 - runtime 资源目录 首先,我仔细分析了需求,并且根据业务逻辑设计了合适的接口。 对于多表关联查询,我使用了MyBatis的注解来编写SQL语句,并通过@One和@Many等注解来实现结果集的映射。 对于数据分页,我使用了MyBatis-Plus提供的Page对象,并结合相关方法来实现数据分页查询。 2. 上课中的优秀项目 在课堂上,我完成了一个优秀的项目,主要是学生实体类的增删改查功能。通过这个项目,我巩固了对Spring Boot框架的理解和掌握。 具体实现如下: //初始化redis err := cache.InitRedis(cache.DefaultRedisClient, &redis.Options{ Addr: global.CONFIG.Redis.Host, Password: global.CONFIG.Redis.Password, IdleTimeout: global.CONFIG.Redis.IdleTimeout, }, nil) if err != nil { if err != nil { global.LOG.Error("InitRedis error ", err, "client", cache.DefaultRedisClient) panic(err) } panic(err) } //初始化mysql err = db.InitMysqlClient(db.DefaultClient, global.CONFIG.Database.User, global.CONFIG.Database.Password, global.CONFIG.Database.Host, global.CONFIG.Database.Name) if err != nil { global.LOG.Error("InitMysqlClient error ", err, "client", db.DefaultClient) panic(err) } global.Db = db.GetMysqlClient(db.DefaultClient).DB 开发步骤 SpringBoot 开发起来特别简单,分为如下几步: 创建新模块,选择Spring初始化,并配置模块相关基础信息 选择当前模块需要使用的技术集 开发控制器类 运行自动生成的Application类 知道了 SpringBoot 的开发步骤后,接下来我们进行具体的操作 shutdown.NewHook().Close( //关闭http server func() { ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() if err := server.Shutdown(ctx); err != nil { logging.Error("http server shutdown err", err) } }, func() { //关闭kafka producer(特别是异步生产者,强制关闭会导致丢消息) if err := mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close(); err != nil { logging.Error("kafka shutdown err", err) } }, func() { //关闭mysql if err := db.CloseMysqlClient(db.DefaultClient); err != nil { logging.Error("mysql shutdown err", err) } }, func() { //关闭redis if err := cache.GetRedisClient(cache.DefaultRedisClient).Close(); err != nil { logging.Error("redis shutdown err", err) } }, ) //也可以自己实现优雅关闭 //signals := make(chan os.Signal, 0) //signal.Notify(signals, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) //s := <-signals //global.LOG.Warn("shop receive system signal:", s) //ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) //defer cancel() //err := server.Shutdown(ctx) //if err != nil { // global.LOG.Error("http server error", err) //} //mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Close() 选择 Spring Initializr ,用来创建 SpringBoot 工程 以前我们选择的是 Maven ,今天选择 Spring Initializr 来快速构建 SpringBoot 工程。而在 Module SDK 这一项选择我们安装的 JDK 版本。 type StoreProduct struct { Image string `json:"image" valid:"Required;"` SliderImage string `json:"slider_image" valid:"Required;"` StoreName string `json:"store_name" valid:"Required;"` StoreInfo string `json:"store_info" valid:"Required;"` Keyword string `json:"keyword" valid:"Required;"` CateId int `json:"cate_id" valid:"Required;"` ProductCate *StoreCategory `json:"product_cate" gorm:"foreignKey:CateId;association_autoupdate:false;association_autocreate:false"` Price float64 `json:"price" valid:"Required;"` VipPrice float64 `json:"vip_price" valid:"Required;"` OtPrice float64 `json:"ot_price" valid:"Required;"` Postage float64 `json:"postage" valid:"Required;"` UnitName string `json:"unit_name" valid:"Required;"` Sort int16 `json:"sort" valid:"Required;"` Sales int `json:"sales" valid:"Required;"` Stock int `json:"stock" valid:"Required;"` IsShow *int8 `json:"is_show" valid:"Required;"` IsHot *int8 `json:"is_hot" valid:"Required;"` IsBenefit *int8 `json:"is_benefit" valid:"Required;"` IsBest *int8 `json:"is_best" valid:"Required;"` IsNew *int8 `json:"is_new" valid:"Required;"` Description string `json:"description" valid:"Required;"` IsPostage *int8 `json:"is_postage" valid:"Required;"` GiveIntegral int `json:"give_integral" valid:"Required;"` Cost float64 `json:"cost" valid:"Required;"` IsGood *int8 `json:"is_good" valid:"Required;"` Ficti int `json:"ficti" valid:"Required;"` Browse int `json:"browse" valid:"Required;"` IsSub *int8 `json:"is_sub" valid:"Required;"` TempId int64 `json:"temp_id" valid:"Required;"` SpecType int8 `json:"spec_type" valid:"Required;"` IsIntegral *int8 `json:"isIntegral" valid:"Required;"` Integral int32 `json:"integral" valid:"Required;"` BaseModel } //定义商品消息结构 type ProductMsg struct { Operation string `json:"operation"` *StoreProduct } 切换web服务器 现在我们启动工程使用的是 tomcat 服务器,那能不能不使用 tomcat 而使用 jetty 服务器,jetty 在我们 maven 高级时讲 maven 私服使用的服务器。而要切换 web 服务器就需要将默认的 tomcat 服务器给排除掉,怎么排除呢?使用 exclusion 标签 func (e *StoreProductController) Post(c *gin.Context) { var ( dto dto2.StoreProduct appG = app.Gin{C: c} ) httpCode, errCode := app.BindAndValid(c, &dto) if errCode != constant.SUCCESS { appG.Response(httpCode, errCode, nil) return } productService := product_service.Product{ Dto: dto, } model, err := productService.AddOrSaveProduct() if err != nil { appG.Response(http.StatusInternalServerError, constant.FAIL_ADD_DATA, nil) return } //发消息队列 defer func() { operation := product.OperationCreate if dto.Id > 0 { operation = product.OperationUpdate } productMsg := models.ProductMsg{ operation, &model, } msg, _ := json.Marshal(productMsg) p, o, e := mq.GetKafkaSyncProducer(mq.DefaultKafkaSyncProducer).Send(&sarama.ProducerMessage{ Topic: product.Topic, Key: mq.KafkaMsgValueStrEncoder(strconv.FormatInt(dto.Id, 10)), Value: mq.KafkaMsgValueEncoder(msg), }, ) if e != nil { global.LOG.Error("send product msg error ", e, "partition :", p, "offset :", o, "id :", dto.Id) } }() appG.Response(http.StatusOK, constant.SUCCESS, nil) }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

443 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传