更新知识库功能

This commit is contained in:
2025-10-31 17:34:14 +08:00
parent 931b999e1d
commit 186dcb86d9
5 changed files with 326 additions and 320 deletions
+12 -2
View File
@@ -19,11 +19,13 @@ func (c *KnowledgeController) List() {
// 获取查询参数
page, _ := c.GetInt("page", 1)
pageSize, _ := c.GetInt("pageSize", 10)
status, _ := c.GetInt8("status", -1) // -1表示查询所有
status, _ := c.GetInt8("status", 1) // -1表示查询所有
categoryId, _ := c.GetInt("categoryId", 0)
share, _ := c.GetInt8("share", -1) // Default -1 to query all
keyword := c.GetString("keyword", "")
knowledges, total, err := models.GetAllKnowledge(page, pageSize, status, categoryId, keyword)
// Use share in the query
knowledges, total, err := models.GetAllKnowledge(page, pageSize, status, categoryId, share, keyword)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -107,6 +109,10 @@ func (c *KnowledgeController) Create() {
return
}
// Add share parsing (default 0 for personal)
share, _ := c.GetInt8("share", 0)
knowledge.Share = share
id, err := models.AddKnowledge(&knowledge)
if err != nil {
c.Data["json"] = map[string]interface{}{
@@ -153,6 +159,10 @@ func (c *KnowledgeController) Update() {
return
}
// Add share parsing
share, _ := c.GetInt8("share", 0) // Default 0 if not provided
knowledge.Share = share
err = models.UpdateKnowledge(knowledge.Id, &knowledge)
if err != nil {
c.Data["json"] = map[string]interface{}{
+56 -80
View File
@@ -18,6 +18,7 @@ type Knowledge struct {
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"`
Share int8 `orm:"column(share);default(0)" json:"share"`
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"`
@@ -139,103 +140,78 @@ func GetKnowledgeById(id int) (*Knowledge, error) {
return knowledge, err
}
// GetAllKnowledge 获取所有知识(支持分页和筛选)
func GetAllKnowledge(page, pageSize int, status int8, categoryId int, keyword string) ([]*Knowledge, int64, error) {
// LightKnowledge for limited fields (with orm and json tags for direct mapping)
type LightKnowledge struct {
Id int `orm:"column(knowledge_id)" json:"id"`
Title string `orm:"column(title)" json:"title"`
CategoryId int `orm:"column(category_id)" json:"categoryId"`
CategoryName string `orm:"column(category_name)" json:"categoryName"`
Tags string `orm:"column(tags)" json:"tags"`
Author string `orm:"column(author)" json:"author"`
Share int8 `orm:"column(share)" json:"share"`
ViewCount int `orm:"column(view_count)" json:"viewCount"`
LikeCount int `orm:"column(like_count)" json:"likeCount"`
CreateTime time.Time `orm:"column(create_time)" json:"createTime"`
UpdateTime time.Time `orm:"column(update_time)" json:"updateTime"`
}
// Helper to add conditions (reduces repetition)
func addCondition(where *string, params *[]interface{}, cond string, val interface{}) {
if val != nil {
*where += " AND " + cond
*params = append(*params, val)
}
}
// GetAllKnowledge (simplified: direct mapping to LightKnowledge, no separate struct or loop)
func GetAllKnowledge(page, pageSize int, status int8, categoryId int, share int8, keyword string) ([]*LightKnowledge, int64, error) {
o := orm.NewOrm()
// 构建 WHERE 条件(只查询未删除的记录)
whereSQL := "delete_time IS NULL"
params := []interface{}{}
// 状态筛选
if status >= 0 {
whereSQL += " AND status = ?"
params = append(params, status)
}
addCondition(&whereSQL, &params, "status = ?", func() interface{} {
if status >= 0 {
return status
}
return nil
}())
addCondition(&whereSQL, &params, "category_id = ?", func() interface{} {
if categoryId > 0 {
return categoryId
}
return nil
}())
addCondition(&whereSQL, &params, "share = ?", func() interface{} {
if share >= 0 {
return share
}
return nil
}())
addCondition(&whereSQL, &params, "title LIKE ?", func() interface{} {
if keyword != "" {
return "%" + keyword + "%"
}
return nil
}())
// 分类筛选
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)
err := o.Raw("SELECT COUNT(*) FROM yz_knowledge WHERE "+whereSQL, 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 ?
`
querySQL := `SELECT k.knowledge_id, k.title, k.category_id, c.category_name, k.tags, k.author, k.share, k.view_count, k.like_count, k.create_time, k.update_time
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)
var knowledges []*LightKnowledge
_, err = o.Raw(querySQL, params).QueryRows(&knowledges)
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
}