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
 | ||
| }
 |