前言
新春佳节到来了,各种 APP 的开启首页图片和皮肤样式都会发生变化,它们都将会更新成和新春有关系的图片广告或者新春相关的背景图片。当一个运营负责这项工作时,只需要开发一个可配置的功能,运营只需进行设置就可以完成新春首页替换和新年红皮肤更新。
详细设计
接口
整体的需求只有2个,首页图片的替换和皮肤样式的更新,那么可以提供2个接口给前端,前端通过调用接口来完成相应的工作:
- 前端获取首页图片接口然后完成显示 /api/v1/ad/pics
- 前端获取皮肤样式然后渲染样式 /api/v1/skin
数据库
首页图片表
像有些节假日或者活动是重复的。所以考虑复用性,直接使用旧的配置就可以完成功能,所以考虑将图片信息存储室增加一个标识 is_show 用来标识是否显示在首页。这样在获取首页图片时只需过滤 is_show = true 的图片进行显示。
Create table app_pic (
ID VARCHAR(32) NOT NULL COMMENT 'ID' ,
Code VARCHAR(255) COMMENT '标识' ,
Name VARCHAR(255) COMMENT '图片名称' ,
FilePath VARCHAR(255) COMMENT '图片路径' ,
IsShow tinyint
)
这里假设图片都存储在 OSS 上,这里只需存储图片文件所在的地址即可。当然也是支持以文件流的格式进行存储,主要是根据自己的场景来判断。如果整个项目的图片比较少,也支持存储在服务器上,然后地址存储为本地服务器的相对地址。
皮肤样式表
这里也是和图片一样的设计,增加标识用于后续切换,只要开启就返回给前端。
Create table StyleCss (
ID VARCHAR(32) NOT NULL COMMENT 'ID' ,
Code VARCHAR(255) COMMENT '标识' ,
Name VARCHAR(255) COMMENT '样式名称' ,
StyleContent VARCHAR(255) COMMENT '样式' ,
Is_Show tinyint
)
详细业务逻辑
实体类
这里使用 gorm 通过实例对象的语法,完成关系型数据库的操作。
// appPic 表
type AppPic struct {
Id int `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
FileName string `json:"fileName"`
IsShow string `json:"isShow"`
}
func(AppPic)TableName string {
return "appPic"
}
// styleCss 表
type StyleCss struct {
Id int `json:"id"`
Code string `json:"code"`
Name string `json:"name"`
StyleContent string `json:"styleContent"`
IsShow string `json:"isShow"`
}
func(StyleCss)TableName string {
return "StyleCss"
}
详细实现
使用 gin 框架,然后实现基本的接口功能
c := gin.Default()
c.GET("/api/v1/ad/pics", func(ctx *gin.Context) {
var data []entities.AppPic
result := db.Where("isshow=true").Find(&data)
return ctx.JSON(http.StatusOK,gin.H{"code":200,message: "success","data":result})
})
结论
通过通用配置的方式可以让 app 的一些固定的东西变的更灵活,只需要更新内容就可以完成功能变更,无需重新发版解决,提高了工作效率。