![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)
}
有疑问加站长微信联系(非本文作者)