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
 | 
						||
	}
 | 
						||
 | 
						||
	// 更新字段
 | 
						||
	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
 | 
						||
}
 |