127 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package model
import (
"catface/app/global/variable"
"catface/app/utils/data_bind"
"log"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"gorm.io/gorm"
)
func CreateEncounterFactory(sqlType string) *Encounter {
return &Encounter{BaseModel: BaseModel{DB: UseDbConn(sqlType)}}
}
type Encounter struct { // Encounter 或者称为 post指的就是 Human 单次的记录。
BaseModel
// TAG 外键关联
UsersModelId int64 `gorm:"column:user_id" json:"user_id"`
UsersModel *UsersModel `json:"users_model,omitempty"` // INFO 由于 Detail 返回空子段有些麻烦,先尝试采用指针。
AnimalsId string `gorm:"size:20" json:"animals_id"` // TODO 关联对象存在上限
Title string `gorm:"size:20;column:title" json:"title"`
Content string `json:"content"`
Level uint8 `json:"level" gorm:"column:level;default:1"`
Tags string `json:"tags,omitempty" gorm:"column:tags;size:50"`
TagsSlice []string `gorm:"-" json:"tags_list,omitempty"`
// TAG Avatar 最好是压缩后的备份图像
Avatar string `gorm:"type:varchar(50)" json:"avatar,omitempty"` // 缩略图 url为 Go 获取 Photo 之后压缩处理后的图像,单独存储。
AvatarHeight uint16 `json:"avatar_height,omitempty"` // 为了方便前端在加载图像前的骨架图 & 瀑布流展示。
AvatarWidth uint16 `json:"avatar_width,omitempty"`
Photos string `gorm:"type:varchar(100)" json:"photos,omitempty"` // 图片数组
PhotosSlice []string `gorm:"-" json:"photos_list,omitempty"` // TIP GORM 忽略
// POI
Latitude float64 `json:"latitude,omitempty"` // POI 位置相关
Longitude float64 `json:"longitude,omitempty"`
// TODO Comment Num 然后去统计?
}
func (e *Encounter) TableName() string {
return "encounters"
}
func (e *Encounter) InsertDate(c *gin.Context) bool {
var tmp Encounter
if err := data_bind.ShouldBindFormDataToModel(c, &tmp); err == nil {
if res := e.Create(&tmp); res.Error == nil {
return true
} else {
variable.ZapLog.Error("Encounter 数据新增出错", zap.Error(res.Error))
}
} else {
variable.ZapLog.Error("Encounter 数据绑定出错", zap.Error(err))
}
return false
}
func (e *Encounter) Show(num, skip, user_id int) (temp []EncounterList) {
sql := `
SELECT e.id, e.user_id, title, avatar, avatar_height, avatar_width, e.updated_at, user_name, user_avatar,
EXISTS (
SELECT 1
FROM encounter_likes l
WHERE l.user_id = ? AND l.encounter_id = e.id AND l.is_del = 0
) AS ue_like
FROM encounters e
JOIN tb_users u ON e.user_id = u.id
LIMIT ? OFFSET ?
`
// err := e.Raw(sql, user_id, num, skip).Scan(&temp).Error
// fmt.Println(err)
var rows *gorm.DB
if rows = e.Raw(sql, user_id, num, skip); rows.Error != nil {
log.Println("查询失败:", rows.Error)
return nil
}
// 获取底层的 sql.Rows 对象
sqlRows, err := rows.Rows()
if err != nil {
log.Println("获取 sql.Rows 失败:", err)
return nil
}
defer sqlRows.Close()
for sqlRows.Next() {
var item EncounterList
var ueLikeInt int
dest := []interface{}{
&item.Id, &item.UserId, &item.Title, &item.Avatar, &item.AvatarHeight, &item.AvatarWidth, &item.UpdatedAt, &item.UserName, &item.UserAvatar, &ueLikeInt,
}
if err := sqlRows.Scan(dest...); err != nil {
log.Println("扫描失败:", err)
continue
}
item.Like = ueLikeInt == 1
temp = append(temp, item)
}
return
}
func (e *Encounter) ShowByID(id int64) (temp *Encounter, err error) {
// 1. search encounter
if err = e.Where("id = ?", id).First(&temp).Error; err != nil {
return
}
return
// // 2. search user data
// user := UsersModel{BaseModel: BaseModel{Id: encounter.UsersModelId}}
// if err := user.Select("user_name", "user_avatar").First(&user).Error; err != nil {
// return
// }
// // 3. search animals data
// animals_id := query_handler.StringToint64Array(encounter.AnimalsId)
// var animals []Animal
// if err := e.Model(&animals).Select("id", "avatar", "name").Where("id in (?)", animals_id).Find(&animals).Error; err != nil {
// return
// }
// // TODO 4. 然后整合
// return
}