engineercms增加工程相册和工程视频

2022-10-05 16:22:26 浏览数 (1)

工程相册的设计,主要是将小程序上传到服务端文件夹下的照片数据放到数据库中来。

首先扫描文件夹,根据给定的目录,利用go语言自带的文件夹递归函数。取出数据后,必须用gorm的批量插入功能CreateInBatches。而且批量插入似乎要设置为每块限制在100条。

代码语言:javascript复制
// 写入数据库
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

代码语言:javascript复制
type PhotoData struct {
	gorm.Model
	YearMonth    string
	YearMonthDay string
	Url          string `gorm:"unique"`
	Name         string
}

通过unique设置,那么数据相同的就不会存入了。用clauses功能,发生冲突,什么也不做。 

代码语言:javascript复制
Upsert 及冲突
GORM 为不同数据库提供了兼容的 Upsert 支持

import "gorm.io/gorm/clause"

// 在冲突时,什么都不做
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&user)

这样,之前已经存在数据库中的图片数据,不会重新存入。

更新可以设置为定时更新,或手动更新。

按月分组,按天分批。某一日有多张图片,进入某一天(点击图片),即可进入:

最后是设计上一篇和下一篇。

代码语言:javascript复制
// 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中的查询前一天和后一天:

代码语言:javascript复制
// 查找前一天的照片,降序排列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
}

0 人点赞