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