工程相册的设计,主要是将小程序上传到服务端文件夹下的照片数据放到数据库中来。
首先扫描文件夹,根据给定的目录,利用go语言自带的文件夹递归函数。取出数据后,必须用gorm的批量插入功能CreateInBatches。而且批量插入似乎要设置为每块限制在100条。
// 写入数据库
func AddPhotoData(photodatas []PhotoData) error {
db := _db //GetDB()
// err := db.Create(&photodatas).Error //sqlite不能超过999条
err := db.Clauses(clause.OnConflict{DoNothing: true}).CreateInBatches(photodatas, 100).Error
// err := db.CreateInBatches(photodatas, 100).Error
// err = db.Where("user_id = ? AND temp_title = ?", userid, templetitle).FirstOrCreate(&usertemple).Error
return err
}
那么每次更新怎么弄呢?
我的解决方案全部文件夹递归出所有图片数据,直接丢给model里,用上述批量插入,只不过这个时候要用clauses哦。见gorm的文档。Upsert 及冲突
先要将数据库数据结构中的地址url设置为unique
type PhotoData struct {
gorm.Model
YearMonth string
YearMonthDay string
Url string `gorm:"unique"`
Name string
}
通过unique设置,那么数据相同的就不会存入了。用clauses功能,发生冲突,什么也不做。
Upsert 及冲突
GORM 为不同数据库提供了兼容的 Upsert 支持
import "gorm.io/gorm/clause"
// 在冲突时,什么都不做
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)
这样,之前已经存在数据库中的图片数据,不会重新存入。
更新可以设置为定时更新,或手动更新。
按月分组,按天分批。某一日有多张图片,进入某一天(点击图片),即可进入:
最后是设计上一篇和下一篇。
// key转成日期或用photodata[0].Create-1,后者不好减一天,因为有的时间并没有相隔24小时
var timeLayoutStr = "2006-01-02" //go中的时间格式化必须是这个时间
daytime, err := time.Parse(timeLayoutStr, keywords) //string转time
// logs.Info(daytime)
oneday, err := time.ParseDuration("24h")
if err != nil {
logs.Error(err)
}
nextdaytime := daytime.Add(oneday)
// logs.Info(nextdaytime)
prevphotodata, err := models.GetPrevPhotoData(daytime)
if err != nil {
logs.Error(err)
}
if len(prevphotodata) == 0 {
c.Data["prev"] = "没有了"
} else {
c.Data["prev"] = prevphotodata[0].YearMonthDay
}
nextphotodata, err := models.GetNextPhotoData(nextdaytime)
if err != nil {
logs.Error(err)
}
if len(nextphotodata) == 0 {
c.Data["next"] = "没有了"
} else {
c.Data["next"] = nextphotodata[0].YearMonthDay
}
model中的查询前一天和后一天:
// 查找前一天的照片,降序排列DATE_FORMAT(from_unixtime(art_time),'%Y-%m')
// from_unixtime(timestamp,'%Y-%m-%d %H:%i:%s')小写m是数字月份,大写M是英文月份
// to_date(,"yyyy-mm-dd")
// DATE_FORMAT(time,'%Y-%m-%d')
// date(created_at) > ?
func GetPrevPhotoData(createdat time.Time) (results []PhotoData, err error) {
db := _db
err = db.Limit(1).Offset(0).Order("created_at desc").Table("photo_data").Where("created_at < ?", createdat).Scan(&results).Error
return results, err
}
// 查找后一天的照片,升序排列
func GetNextPhotoData(createdat time.Time) (results []PhotoData, err error) {
db := _db
err = db.Limit(1).Offset(0).Order("created_at asc").Table("photo_data").Where("created_at > ?", createdat).Scan(&results).Error
return results, err
}