vote-api/api/dao/Article.go
2024-09-11 10:28:09 +08:00

235 lines
6.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 dao
import (
"gorm.io/gorm"
"gorm.io/gorm/clause"
"vote-api/api/model"
"vote-api/api/requests"
"vote-api/global"
)
type ArticleDao struct {
}
// GetArticleById 获取数据-id
func (r *ArticleDao) GetArticleById(ArticleId int64) (m *model.Article, err error) {
err = global.Db.First(&m, ArticleId).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetArticlePreloadById 获取数据-加载全部关联-id
func (r *ArticleDao) GetArticlePreloadById(ArticleId int64) (m *model.Article, err error) {
err = global.Db.Preload(clause.Associations).First(&m, ArticleId).Error
if err != nil {
return nil, err
}
return m, nil
}
// DeleteArticle 删除
func (r *ArticleDao) DeleteArticle(tx *gorm.DB, maps interface{}) error {
err := tx.Where(maps).Delete(&model.Article{}).Error
if err != nil {
return err
}
return nil
}
// DeleteArticleById 删除-id
func (r *ArticleDao) DeleteArticleById(tx *gorm.DB, ArticleId int64) error {
if err := tx.Delete(&model.Article{}, ArticleId).Error; err != nil {
return err
}
return nil
}
// EditArticle 修改
func (r *ArticleDao) EditArticle(tx *gorm.DB, maps interface{}, data interface{}) error {
err := tx.Model(&model.Article{}).Where(maps).Updates(data).Error
if err != nil {
return err
}
return nil
}
// EditArticleById 修改-id
func (r *ArticleDao) EditArticleById(tx *gorm.DB, ArticleId int64, data interface{}) error {
err := tx.Model(&model.Article{}).Where("article_id = ?", ArticleId).Updates(data).Error
if err != nil {
return err
}
return nil
}
// GetArticleList 获取列表
func (r *ArticleDao) GetArticleList(maps interface{}) (m []*model.Article, err error) {
err = global.Db.Where(maps).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetArticleCount 获取数量
func (r *ArticleDao) GetArticleCount(maps interface{}) (total int64, err error) {
err = global.Db.Model(&model.Article{}).Where(maps).Count(&total).Error
if err != nil {
return 0, err
}
return total, nil
}
// GetArticleListRand 获取列表-随机
func (r *ArticleDao) GetArticleListRand(maps interface{}, limit int) (m []*model.Article, err error) {
err = global.Db.Where(maps).Order("rand()").Limit(limit).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// AddArticle 新增
func (r *ArticleDao) AddArticle(tx *gorm.DB, model *model.Article) (*model.Article, error) {
if err := tx.Create(model).Error; err != nil {
return nil, err
}
return model, nil
}
// GetArticle 获取
func (r *ArticleDao) GetArticle(maps interface{}) (m *model.Article, err error) {
err = global.Db.Where(maps).First(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// Inc 自增
func (r *ArticleDao) Inc(tx *gorm.DB, ArticleId int64, field string, numeral int) error {
err := tx.Model(&model.Article{}).Where("article_id = ?", ArticleId).UpdateColumn(field, gorm.Expr(field+" + ?", numeral)).Error
if err != nil {
return err
}
return nil
}
// Dec 自减
func (r *ArticleDao) Dec(tx *gorm.DB, ArticleId int64, field string, numeral int) error {
err := tx.Model(&model.Article{}).Where("article_id = ?", ArticleId).UpdateColumn(field, gorm.Expr(field+" - ?", numeral)).Error
if err != nil {
return err
}
return nil
}
// GetArticlePageSearch 获取图文列表-分页
func (r *ArticleDao) GetArticlePageSearch(req requests.GetArticlePage, page, pageSize int) (m []*model.Article, total int64, err error) {
var totalRecords int64
// 构建查询条件
query := global.Db.Model(&model.Article{})
// 作者
query = query.Preload("ArticleAuthor")
// 作者关联医院
query = query.Preload("ArticleAuthor.BaseHospital")
// 文章状态1:正常 2:禁用)
query = query.Where("article_status = ?", 1)
// 搜索关键字
if req.Keyword != "" {
keyword := "%" + req.Keyword + "%" //
// 标题
orQuery := global.Db.Model(&model.Article{}).Or("article_title LIKE ?", keyword)
// 编号
orQuery = orQuery.Or("article_number LIKE ?", keyword)
// 医院名称
hospitalSubQuery := global.Db.Model(&model.BaseHospital{}).
Select("hospital_id").
Where("hospital_name LIKE ?", keyword)
articleAuthorSubQuery := global.Db.Model(&model.ArticleAuthor{}).
Select("article_id").
Where(gorm.Expr("hospital_id IN (?)", hospitalSubQuery))
orQuery = orQuery.Or(gorm.Expr("article_id IN (?)", articleAuthorSubQuery))
// 作者姓名
subQuery := global.Db.Model(&model.ArticleAuthor{}).
Select("article_id").
Where("author_name LIKE ?", keyword)
orQuery = orQuery.Or(gorm.Expr("article_id IN (?)", subQuery))
// 执行组建
query = query.Where(orQuery)
}
// 排序
query = query.Order("created_at asc")
// 查询总数量
if err := query.Count(&totalRecords).Error; err != nil {
return nil, 0, err
}
err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error
if err != nil {
return nil, 0, err
}
return m, totalRecords, nil
}
// GetArticleOrderList 获取列表-排序
func (r *ArticleDao) GetArticleOrderList(maps interface{}, orderField string, limit int) (m []*model.Article, err error) {
err = global.Db.Where(maps).Preload(clause.Associations).Order(orderField).Limit(limit).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetArticleRankList 获取文章排名列表
func (r *ArticleDao) GetArticleRankList(maps interface{}, orderField string, limit int) (m []*model.Article, err error) {
err = global.Db.Where(maps).
Preload("ArticleAuthor").
Preload("ArticleAuthor.BaseHospital").
Order(orderField).Limit(limit).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetArticleRank 获取某一条数据的排名
func (r *ArticleDao) GetArticleRank(articleID int64) (int, error) {
var rank int
// 定义子查询
subQuery := global.Db.Model(&model.Article{}).
Select("article_id, vote_num, (@rank := @rank + 1) AS rank").
Where("article_status = ?", 1).
Order("vote_num DESC").
Joins(", (SELECT @rank := 0) AS r")
// 将子查询作为命名子查询的一部分进行查询
err := global.Db.Table("(?) AS sub", subQuery).
Where("sub.article_id = ?", articleID).
Pluck("sub.rank", &rank).Error
if err != nil {
return 0, err
}
return rank, nil
}