package services import ( "server/models" "time" "github.com/beego/beego/v2/client/orm" ) // GetArticlesList 获取文章列表 func GetArticlesList(tenant_id int, user_id int, page, pageSize int, keyword string, cate int, status int8) ([]*models.Articles, int64, error) { o := orm.NewOrm() qs := o.QueryTable(new(models.Articles)) // 过滤已删除的文章 qs = qs.Filter("delete_time__isnull", true) // 关键词搜索 if keyword != "" { cond := orm.NewCondition() cond1 := cond.Or("title__icontains", keyword).Or("content__icontains", keyword).Or("desc__icontains", keyword) qs = qs.SetCond(cond1) } // 分类筛选 if cate > 0 { qs = qs.Filter("cate", cate) } // 状态筛选 if status >= 0 { qs = qs.Filter("status", status) } // 获取总数 total, err := qs.Count() if err != nil { return nil, 0, err } // 分页查询 if page <= 0 { page = 1 } if pageSize <= 0 { pageSize = 10 } offset := (page - 1) * pageSize var articles []*models.Articles _, err = qs.OrderBy("-create_time").Limit(pageSize, offset).All(&articles) return articles, total, err } // GetArticleById 根据ID获取文章 func GetArticleById(id int) (*models.Articles, error) { o := orm.NewOrm() article := &models.Articles{Id: id} err := o.Read(article) if err != nil { return nil, err } // 检查是否已删除 if article.DeleteTime != nil { return nil, nil // 返回nil表示文章不存在或已删除 } return article, nil } // CreateArticle 创建文章 func CreateArticle(article *models.Articles) (*models.Articles, error) { o := orm.NewOrm() id, err := o.Insert(article) if err != nil { return nil, err } // 获取创建后的文章 article.Id = int(id) return article, nil } // UpdateArticle 更新文章 func UpdateArticle(article *models.Articles) error { o := orm.NewOrm() _, err := o.Update(article, "title", "cate", "image", "desc", "author", "content", "publisher", "publishdate", "sort", "status", "is_trans", "transurl", "push", "update_time") return err } // DeleteArticle 删除文章(软删除) func DeleteArticle(id int) error { o := orm.NewOrm() // 获取文章 article := &models.Articles{Id: id} err := o.Read(article) if err != nil { return err } // 设置删除时间 now := time.Now() article.DeleteTime = &now _, err = o.Update(article, "delete_time") return err } // UpdateArticleStatus 更新文章状态 func UpdateArticleStatus(id int, status int8) error { o := orm.NewOrm() article := &models.Articles{Id: id} err := o.Read(article) if err != nil { return err } article.Status = status now := time.Now() article.UpdateTime = &now _, err = o.Update(article, "status", "update_time") return err } // IncrementArticleViews 增加文章浏览量 func IncrementArticleViews(id int) error { o := orm.NewOrm() article := &models.Articles{Id: id} err := o.Read(article) if err != nil { return err } article.Views++ now := time.Now() article.UpdateTime = &now _, err = o.Update(article, "views", "update_time") return err } // IncrementArticleLikes 增加文章点赞量 func IncrementArticleLikes(id int) error { o := orm.NewOrm() article := &models.Articles{Id: id} err := o.Read(article) if err != nil { return err } article.Likes++ now := time.Now() article.UpdateTime = &now _, err = o.Update(article, "likes", "update_time") return err } // GetPublishedArticles 获取已发布的文章列表(用于前台展示) func GetPublishedArticles(page, pageSize int, cate int) ([]*models.Articles, int64, error) { return GetArticlesList(0, 0, page, pageSize, "", cate, 2) // status=2 表示已发布,tenant_id=0, user_id=0 } // GetArticleStats 获取文章统计信息 func GetArticleStats() (map[string]int64, error) { o := orm.NewOrm() stats := make(map[string]int64) // 总文章数 total, err := o.QueryTable(new(models.Articles)).Filter("delete_time__isnull", true).Count() if err != nil { return nil, err } stats["total"] = total // 草稿数 draft, err := o.QueryTable(new(models.Articles)).Filter("delete_time__isnull", true).Filter("status", 0).Count() if err != nil { return nil, err } stats["draft"] = draft // 待审核数 pending, err := o.QueryTable(new(models.Articles)).Filter("delete_time__isnull", true).Filter("status", 1).Count() if err != nil { return nil, err } stats["pending"] = pending // 已发布数 published, err := o.QueryTable(new(models.Articles)).Filter("delete_time__isnull", true).Filter("status", 2).Count() if err != nil { return nil, err } stats["published"] = published // 隐藏数 hidden, err := o.QueryTable(new(models.Articles)).Filter("delete_time__isnull", true).Filter("status", 3).Count() if err != nil { return nil, err } stats["hidden"] = hidden return stats, nil }