资料
  • 资料
  • 专题
[完结19章]SpringBoot开发双11商品服务系统教程下载
推荐星级:
类别: 软件/EDA/IP
时间:2023-11-22
大小:3.92KB
阅读数:204
上传用户:学习菜鸟小弟弟
查看他发布的资源
下载次数
0
所需E币
0
ebi
新用户注册即送 300 E币
更多E币赚取方法,请查看
close
资料介绍
如何使用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)

}


版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或 联系我们 删除。
PARTNER CONTENT
相关评论 (下载后评价送E币 我要评论)
没有更多评论了
  • 可能感兴趣
  • 关注本资料的网友还下载了
  • 技术白皮书