319 lines
10 KiB
Go
319 lines
10 KiB
Go
package models
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/beego/beego/v2/client/orm"
|
||
)
|
||
|
||
// Knowledge 知识库模型
|
||
type Knowledge struct {
|
||
Id int `orm:"column(knowledge_id);pk;auto" json:"id"`
|
||
Title string `orm:"column(title);size(200)" json:"title"`
|
||
CategoryId int `orm:"column(category_id);default(0);null" json:"categoryId"`
|
||
CategoryName string `orm:"-" json:"categoryName"` // 不映射到数据库,从联查获取
|
||
Tags string `orm:"column(tags);type(text);null" json:"tags"`
|
||
Author string `orm:"column(author);size(50)" json:"author"`
|
||
Content string `orm:"column(content);type(longtext)" json:"content"`
|
||
Summary string `orm:"column(summary);size(500);null" json:"summary"`
|
||
CoverUrl string `orm:"column(cover_url);size(500);null" json:"coverUrl"`
|
||
Status int8 `orm:"column(status);default(0)" json:"status"`
|
||
ViewCount int `orm:"column(view_count);default(0)" json:"viewCount"`
|
||
LikeCount int `orm:"column(like_count);default(0)" json:"likeCount"`
|
||
IsRecommend int8 `orm:"column(is_recommend);default(0)" json:"isRecommend"`
|
||
IsTop int8 `orm:"column(is_top);default(0)" json:"isTop"`
|
||
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"createTime"`
|
||
UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"updateTime"`
|
||
CreateBy string `orm:"column(create_by);size(50);null" json:"createBy"`
|
||
UpdateBy string `orm:"column(update_by);size(50);null" json:"updateBy"`
|
||
DeleteTime time.Time `orm:"column(delete_time);type(datetime);null" json:"deleteTime"`
|
||
DeleteBy string `orm:"column(delete_by);size(50);null" json:"deleteBy"`
|
||
}
|
||
|
||
// TableName 设置表名
|
||
func (k *Knowledge) TableName() string {
|
||
return "yz_knowledge"
|
||
}
|
||
|
||
// KnowledgeCategory 知识库分类模型
|
||
type KnowledgeCategory struct {
|
||
CategoryId int `orm:"column(category_id);pk;auto" json:"categoryId"`
|
||
CategoryName string `orm:"column(category_name);size(100)" json:"categoryName"`
|
||
CategoryDesc string `orm:"column(category_desc);size(500);null" json:"categoryDesc"`
|
||
ParentId int `orm:"column(parent_id);default(0)" json:"parentId"`
|
||
SortOrder int `orm:"column(sort_order);default(0)" json:"sortOrder"`
|
||
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"createTime"`
|
||
UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"updateTime"`
|
||
}
|
||
|
||
// TableName 设置表名
|
||
func (kc *KnowledgeCategory) TableName() string {
|
||
return "yz_knowledge_category"
|
||
}
|
||
|
||
// KnowledgeTag 知识库标签模型
|
||
type KnowledgeTag struct {
|
||
TagId int `orm:"column(tag_id);pk;auto" json:"tagId"`
|
||
TagName string `orm:"column(tag_name);size(50);unique" json:"tagName"`
|
||
TagColor string `orm:"column(tag_color);size(20);null" json:"tagColor"`
|
||
UsageCount int `orm:"column(usage_count);default(0)" json:"usageCount"`
|
||
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"createTime"`
|
||
UpdateTime time.Time `orm:"column(update_time);auto_now;type(datetime)" json:"updateTime"`
|
||
}
|
||
|
||
// TableName 设置表名
|
||
func (kt *KnowledgeTag) TableName() string {
|
||
return "yz_knowledge_tags"
|
||
}
|
||
|
||
// AddKnowledge 创建知识
|
||
func AddKnowledge(k *Knowledge) (int64, error) {
|
||
o := orm.NewOrm()
|
||
id, err := o.Insert(k)
|
||
return id, err
|
||
}
|
||
|
||
// GetKnowledgeById 根据ID获取知识详情(使用联查获取分类名称)
|
||
func GetKnowledgeById(id int) (*Knowledge, error) {
|
||
o := orm.NewOrm()
|
||
|
||
// 使用联查获取分类名称(只查询未删除的记录)
|
||
querySQL := `
|
||
SELECT k.*, c.category_name
|
||
FROM yz_knowledge k
|
||
LEFT JOIN yz_knowledge_category c ON k.category_id = c.category_id
|
||
WHERE k.knowledge_id = ? AND k.delete_time IS NULL
|
||
`
|
||
|
||
var result struct {
|
||
Id int `orm:"column(knowledge_id)"`
|
||
Title string `orm:"column(title)"`
|
||
CategoryId int `orm:"column(category_id)"`
|
||
CategoryName string `orm:"column(category_name)"`
|
||
Tags string `orm:"column(tags)"`
|
||
Author string `orm:"column(author)"`
|
||
Content string `orm:"column(content)"`
|
||
Summary string `orm:"column(summary)"`
|
||
CoverUrl string `orm:"column(cover_url)"`
|
||
Status int8 `orm:"column(status)"`
|
||
ViewCount int `orm:"column(view_count)"`
|
||
LikeCount int `orm:"column(like_count)"`
|
||
IsRecommend int8 `orm:"column(is_recommend)"`
|
||
IsTop int8 `orm:"column(is_top)"`
|
||
CreateTime time.Time `orm:"column(create_time)"`
|
||
UpdateTime time.Time `orm:"column(update_time)"`
|
||
CreateBy string `orm:"column(create_by)"`
|
||
UpdateBy string `orm:"column(update_by)"`
|
||
}
|
||
|
||
err := o.Raw(querySQL, id).QueryRow(&result)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
knowledge := &Knowledge{
|
||
Id: result.Id,
|
||
Title: result.Title,
|
||
CategoryId: result.CategoryId,
|
||
CategoryName: result.CategoryName,
|
||
Tags: result.Tags,
|
||
Author: result.Author,
|
||
Content: result.Content,
|
||
Summary: result.Summary,
|
||
CoverUrl: result.CoverUrl,
|
||
Status: result.Status,
|
||
ViewCount: result.ViewCount,
|
||
LikeCount: result.LikeCount,
|
||
IsRecommend: result.IsRecommend,
|
||
IsTop: result.IsTop,
|
||
CreateTime: result.CreateTime,
|
||
UpdateTime: result.UpdateTime,
|
||
CreateBy: result.CreateBy,
|
||
UpdateBy: result.UpdateBy,
|
||
}
|
||
|
||
// 增加查看次数
|
||
knowledge.ViewCount++
|
||
_, err = o.Raw("UPDATE yz_knowledge SET view_count = ? WHERE knowledge_id = ?", knowledge.ViewCount, id).Exec()
|
||
|
||
return knowledge, err
|
||
}
|
||
|
||
// GetAllKnowledge 获取所有知识(支持分页和筛选)
|
||
func GetAllKnowledge(page, pageSize int, status int8, categoryId int, keyword string) ([]*Knowledge, int64, error) {
|
||
o := orm.NewOrm()
|
||
|
||
// 构建 WHERE 条件(只查询未删除的记录)
|
||
whereSQL := "delete_time IS NULL"
|
||
params := []interface{}{}
|
||
|
||
// 状态筛选
|
||
if status >= 0 {
|
||
whereSQL += " AND status = ?"
|
||
params = append(params, status)
|
||
}
|
||
|
||
// 分类筛选
|
||
if categoryId > 0 {
|
||
whereSQL += " AND category_id = ?"
|
||
params = append(params, categoryId)
|
||
}
|
||
|
||
// 关键词搜索
|
||
if keyword != "" {
|
||
whereSQL += " AND title LIKE ?"
|
||
params = append(params, "%"+keyword+"%")
|
||
}
|
||
|
||
// 获取总数
|
||
var total int64
|
||
countSQL := "SELECT COUNT(*) FROM yz_knowledge WHERE " + whereSQL
|
||
err := o.Raw(countSQL, params...).QueryRow(&total)
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
// 联查获取分类名称
|
||
querySQL := `
|
||
SELECT k.*, c.category_name
|
||
FROM yz_knowledge k
|
||
LEFT JOIN yz_knowledge_category c ON k.category_id = c.category_id
|
||
WHERE ` + whereSQL + `
|
||
ORDER BY k.is_top DESC, k.create_time DESC
|
||
LIMIT ? OFFSET ?
|
||
`
|
||
params = append(params, pageSize, (page-1)*pageSize)
|
||
|
||
var knowledges []*Knowledge
|
||
var results []struct {
|
||
Id int `orm:"column(knowledge_id)"`
|
||
Title string `orm:"column(title)"`
|
||
CategoryId int `orm:"column(category_id)"`
|
||
CategoryName string `orm:"column(category_name)"`
|
||
Tags string `orm:"column(tags)"`
|
||
Author string `orm:"column(author)"`
|
||
Content string `orm:"column(content)"`
|
||
Summary string `orm:"column(summary)"`
|
||
CoverUrl string `orm:"column(cover_url)"`
|
||
Status int8 `orm:"column(status)"`
|
||
ViewCount int `orm:"column(view_count)"`
|
||
LikeCount int `orm:"column(like_count)"`
|
||
IsRecommend int8 `orm:"column(is_recommend)"`
|
||
IsTop int8 `orm:"column(is_top)"`
|
||
CreateTime time.Time `orm:"column(create_time)"`
|
||
UpdateTime time.Time `orm:"column(update_time)"`
|
||
CreateBy string `orm:"column(create_by)"`
|
||
UpdateBy string `orm:"column(update_by)"`
|
||
}
|
||
|
||
_, err = o.Raw(querySQL, params...).QueryRows(&results)
|
||
if err != nil {
|
||
return nil, 0, err
|
||
}
|
||
|
||
// 转换结果
|
||
for _, r := range results {
|
||
k := &Knowledge{
|
||
Id: r.Id,
|
||
Title: r.Title,
|
||
CategoryId: r.CategoryId,
|
||
CategoryName: r.CategoryName,
|
||
Tags: r.Tags,
|
||
Author: r.Author,
|
||
Content: r.Content,
|
||
Summary: r.Summary,
|
||
CoverUrl: r.CoverUrl,
|
||
Status: r.Status,
|
||
ViewCount: r.ViewCount,
|
||
LikeCount: r.LikeCount,
|
||
IsRecommend: r.IsRecommend,
|
||
IsTop: r.IsTop,
|
||
CreateTime: r.CreateTime,
|
||
UpdateTime: r.UpdateTime,
|
||
CreateBy: r.CreateBy,
|
||
UpdateBy: r.UpdateBy,
|
||
}
|
||
knowledges = append(knowledges, k)
|
||
}
|
||
|
||
return knowledges, total, nil
|
||
}
|
||
|
||
// UpdateKnowledge 更新知识
|
||
func UpdateKnowledge(id int, k *Knowledge) error {
|
||
o := orm.NewOrm()
|
||
knowledge := &Knowledge{Id: id}
|
||
err := o.Read(knowledge)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 更新字段(不包含category_name,因为它是从联查获取的)
|
||
knowledge.Title = k.Title
|
||
knowledge.CategoryId = k.CategoryId
|
||
knowledge.Tags = k.Tags
|
||
knowledge.Author = k.Author
|
||
knowledge.Content = k.Content
|
||
knowledge.Summary = k.Summary
|
||
knowledge.CoverUrl = k.CoverUrl
|
||
knowledge.Status = k.Status
|
||
knowledge.IsRecommend = k.IsRecommend
|
||
knowledge.IsTop = k.IsTop
|
||
knowledge.UpdateBy = k.UpdateBy
|
||
|
||
_, err = o.Update(knowledge, "title", "category_id", "tags", "author", "content", "summary", "cover_url", "status", "is_recommend", "is_top", "update_by", "update_time")
|
||
return err
|
||
}
|
||
|
||
// DeleteKnowledge 软删除知识
|
||
func DeleteKnowledge(id int, deleteBy string) error {
|
||
o := orm.NewOrm()
|
||
knowledge := &Knowledge{Id: id}
|
||
err := o.Read(knowledge)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 执行软删除:设置 delete_time 和 delete_by
|
||
_, err = o.Raw("UPDATE yz_knowledge SET delete_time = ?, delete_by = ? WHERE knowledge_id = ?", time.Now(), deleteBy, id).Exec()
|
||
return err
|
||
}
|
||
|
||
// GetAllCategories 获取所有分类
|
||
func GetAllCategories() ([]*KnowledgeCategory, error) {
|
||
o := orm.NewOrm()
|
||
var categories []*KnowledgeCategory
|
||
_, err := o.QueryTable("yz_knowledge_category").OrderBy("sort_order").All(&categories)
|
||
return categories, err
|
||
}
|
||
|
||
// GetCategoryById 根据ID获取分类
|
||
func GetCategoryById(id int) (*KnowledgeCategory, error) {
|
||
o := orm.NewOrm()
|
||
category := &KnowledgeCategory{CategoryId: id}
|
||
err := o.Read(category)
|
||
return category, err
|
||
}
|
||
|
||
// GetAllTags 获取所有标签
|
||
func GetAllTags() ([]*KnowledgeTag, error) {
|
||
o := orm.NewOrm()
|
||
var tags []*KnowledgeTag
|
||
_, err := o.QueryTable("yz_knowledge_tags").All(&tags)
|
||
return tags, err
|
||
}
|
||
|
||
// AddCategory 添加分类
|
||
func AddCategory(category *KnowledgeCategory) (int64, error) {
|
||
o := orm.NewOrm()
|
||
id, err := o.Insert(category)
|
||
return id, err
|
||
}
|
||
|
||
// AddTag 添加标签
|
||
func AddTag(tag *KnowledgeTag) (int64, error) {
|
||
o := orm.NewOrm()
|
||
id, err := o.Insert(tag)
|
||
return id, err
|
||
}
|