yunzer_go/server/models/knowledge.go
2025-10-28 16:08:40 +08:00

319 lines
10 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 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
}