package main import ( "encoding/json" "fmt" "log" "github.com/wechat-crawler/pkg/database" ) func main() { fmt.Println("==============================================") fmt.Println(" 微信公众号文章数据库管理系统示例") fmt.Println("==============================================\n") // 1. 初始化数据库 db, err := database.InitDB("../data/wechat_articles.db") if err != nil { log.Fatal("数据库初始化失败:", err) } defer db.Close() // 2. 创建仓库实例 officialRepo := database.NewOfficialAccountRepository(db) articleRepo := database.NewArticleRepository(db) contentRepo := database.NewArticleContentRepository(db) // 3. 示例:添加公众号 fmt.Println("📝 示例1: 添加公众号信息") official := &database.OfficialAccount{ Biz: "MzI1NjEwMTM4OA==", Nickname: "研招网资讯", Homepage: "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI1NjEwMTM4OA==&scene=124", Description: "中国研究生招生信息网官方公众号", } // 检查是否已存在 existing, err := officialRepo.GetByBiz(official.Biz) if err != nil { log.Fatal("查询公众号失败:", err) } var officialID int64 if existing == nil { // 不存在,创建新记录 officialID, err = officialRepo.Create(official) if err != nil { log.Fatal("创建公众号失败:", err) } fmt.Printf("✅ 成功创建公众号: %s (ID: %d)\n\n", official.Nickname, officialID) } else { // 已存在 officialID = existing.ID fmt.Printf("ℹ️ 公众号已存在: %s (ID: %d)\n\n", existing.Nickname, officialID) } // 4. 示例:添加文章 fmt.Println("📝 示例2: 添加文章信息") article := &database.Article{ OfficialID: officialID, Title: "专家分析2026年考研报名人数", Author: "研招网资讯", Link: "https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651232405&idx=1", PublishTime: "2024-11-27 10:00:00", CreateTime: "2024-11-27 15:30:00", CommentID: "2247491372", ReadNum: 15234, LikeNum: 456, ShareNum: 123, ContentPreview: "根据最新统计数据显示,2026年全国硕士研究生报名人数预计将达到新高...", ParagraphCount: 15, } // 检查文章是否已存在 existingArticle, err := articleRepo.GetByLink(article.Link) if err != nil { log.Fatal("查询文章失败:", err) } var articleID int64 if existingArticle == nil { articleID, err = articleRepo.Create(article) if err != nil { log.Fatal("创建文章失败:", err) } fmt.Printf("✅ 成功创建文章: %s (ID: %d)\n\n", article.Title, articleID) } else { articleID = existingArticle.ID fmt.Printf("ℹ️ 文章已存在: %s (ID: %d)\n\n", existingArticle.Title, articleID) } // 5. 示例:添加文章内容 fmt.Println("📝 示例3: 添加文章详细内容") paragraphs := []string{ "根据最新统计数据显示,2026年全国硕士研究生报名人数预计将达到新高。", "教育部相关负责人表示,随着社会对高层次人才需求的增加,考研热度持续上升。", "专家建议考生理性选择,注重提升自身综合素质。", } images := []string{ "https://mmbiz.qpic.cn/mmbiz_jpg/xxx1.jpg", "https://mmbiz.qpic.cn/mmbiz_jpg/xxx2.jpg", } content := &database.ArticleContent{ ArticleID: articleID, HtmlContent: "
文章HTML内容
", TextContent: "文章纯文本内容...", Paragraphs: database.StringsToJSON(paragraphs), Images: database.StringsToJSON(images), } // 检查内容是否已存在 existingContent, err := contentRepo.GetByArticleID(articleID) if err != nil { log.Fatal("查询文章内容失败:", err) } if existingContent == nil { contentID, err := contentRepo.Create(content) if err != nil { log.Fatal("创建文章内容失败:", err) } fmt.Printf("✅ 成功添加文章内容 (ID: %d)\n\n", contentID) } else { fmt.Printf("ℹ️ 文章内容已存在 (ID: %d)\n\n", existingContent.ID) } // 6. 示例:查询文章列表 fmt.Println("📋 示例4: 查询文章列表") articles, total, err := articleRepo.List(officialID, 1, 10) if err != nil { log.Fatal("查询文章列表失败:", err) } fmt.Printf("共找到 %d 篇文章:\n", total) for i, item := range articles { fmt.Printf("%d. %s (👁️ %d | 👍 %d)\n", i+1, item.Title, item.ReadNum, item.LikeNum) } fmt.Println() // 7. 示例:获取文章详情 fmt.Println("📖 示例5: 获取文章详情") detail, err := contentRepo.GetArticleDetail(articleID) if err != nil { log.Fatal("获取文章详情失败:", err) } if detail != nil { fmt.Printf("标题: %s\n", detail.Title) fmt.Printf("作者: %s\n", detail.Author) fmt.Printf("公众号: %s\n", detail.OfficialName) fmt.Printf("发布时间: %s\n", detail.PublishTime) fmt.Printf("阅读数: %d | 点赞数: %d\n", detail.ReadNum, detail.LikeNum) fmt.Printf("段落数: %d\n", len(detail.Paragraphs)) fmt.Printf("图片数: %d\n", len(detail.Images)) if len(detail.Paragraphs) > 0 { fmt.Printf("第一段: %s\n", detail.Paragraphs[0]) } } fmt.Println() // 8. 示例:搜索文章 fmt.Println("🔍 示例6: 搜索文章") searchResults, searchTotal, err := articleRepo.Search("考研", 1, 10) if err != nil { log.Fatal("搜索文章失败:", err) } fmt.Printf("搜索\"考研\"找到 %d 篇文章:\n", searchTotal) for i, item := range searchResults { fmt.Printf("%d. %s\n", i+1, item.Title) } fmt.Println() // 9. 示例:获取统计信息 fmt.Println("📊 示例7: 获取统计信息") stats, err := db.GetStatistics() if err != nil { log.Fatal("获取统计信息失败:", err) } fmt.Printf("公众号总数: %d\n", stats.TotalOfficials) fmt.Printf("文章总数: %d\n", stats.TotalArticles) fmt.Printf("总阅读数: %d\n", stats.TotalReadNum) fmt.Printf("总点赞数: %d\n", stats.TotalLikeNum) fmt.Println() // 10. 示例:批量插入文章 fmt.Println("📦 示例8: 批量插入文章") batchArticles := []*database.Article{ { OfficialID: officialID, Title: "教育部:2026年全国硕士研究生报名人数为343万", Author: "研招网资讯", Link: "https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651232406", PublishTime: "2024-11-26 09:00:00", ReadNum: 8965, LikeNum: 234, ContentPreview: "教育部公布2026年研究生招生数据...", ParagraphCount: 12, }, { OfficialID: officialID, Title: "研考网上确认成功后,需重点关注四件事", Author: "研招网资讯", Link: "https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651232407", PublishTime: "2024-11-25 15:30:00", ReadNum: 6543, LikeNum: 189, ContentPreview: "网上确认通过后,考生还需要注意以下事项...", ParagraphCount: 8, }, } err = articleRepo.BatchInsertArticles(batchArticles) if err != nil { log.Fatal("批量插入文章失败:", err) } fmt.Printf("✅ 成功批量插入 %d 篇文章\n\n", len(batchArticles)) // 11. 示例:导出JSON数据 fmt.Println("💾 示例9: 导出文章列表为JSON") allArticles, _, err := articleRepo.List(0, 1, 100) if err != nil { log.Fatal("查询文章列表失败:", err) } jsonData, err := json.MarshalIndent(allArticles, "", " ") if err != nil { log.Fatal("JSON序列化失败:", err) } fmt.Println("文章列表JSON (前200字符):") if len(jsonData) > 200 { fmt.Println(string(jsonData[:200]) + "...") } else { fmt.Println(string(jsonData)) } fmt.Println() fmt.Println("==============================================") fmt.Println(" 数据库操作示例演示完成!") fmt.Println("==============================================") }