欢迎光临散文网 会员登陆 & 注册

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

2023-11-22 15:15 作者:bili_48219728313  | 我要投稿

网盘地址:https://pan.baidu.com/s/1P5gnZrPoml2RY5csThM4zw 提取码: vd4p

腾讯微云下载地址:https://share.weiyun.com/o6TKslZV 密码:qn8bim


如何使用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)


}



[完结19章]SpringBoot开发双11商品服务系统的评论 (共 条)

分享到微博请遵守国家法律