前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >engineercms增加工程相册和工程视频

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

作者头像
hotqin888
发布2022-10-05 16:22:26
5930
发布2022-10-05 16:22:26
举报
文章被收录于专栏:hotqin888的专栏hotqin888的专栏

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

首先扫描文件夹,根据给定的目录,利用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
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档