yunzer_go/server/services/articles.go
2026-01-05 17:38:34 +08:00

218 lines
4.7 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 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
}