Go 语言实战:构建一个企微外部群“技术贴收藏夹”小程序后端

QiWe开放平台 · 个人名片

API驱动企微自动化,让开发更高效

核心能力:为开发者提供标准化接口、快速集成工具,助力产品高效拓展功能场景

官方站点:https://www.qiweapi.com

团队定位:专注企微API生态的技术服务团队

对接通道:搜「QiWe 开放平台」联系客服

核心理念:合规赋能,让企微开发更简单、更高效


这个系统的逻辑非常清晰:每当你的系统通过企微 API 成功发出一条消息,同时也将该内容持久化到数据库,小程序端则负责展示和搜索。

1. 系统架构图

  • 数据源:来自于之前的群发逻辑。

  • 存储层:MySQL 记录标题、链接、分类;Redis 负责热门内容的缓存。

  • 展示层:微信小程序,通过 Go 提供的 RESTful API 获取数据。

2. 数据库设计 (MySQL)

为了支持搜索和分类,我们需要一个简洁高效的表结构:

sql 复制代码
CREATE TABLE `tech_posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL COMMENT '帖子标题',
  `summary` text COMMENT '摘要',
  `url` varchar(512) NOT NULL COMMENT '原文链接',
  `category` varchar(50) DEFAULT 'General' COMMENT '分类:Java/Python/Go',
  `msgid` varchar(128) UNIQUE COMMENT '对应企微任务ID',
  `created_at` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  INDEX `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3. Go 实现:提供收藏列表 API

我们使用 Gin 框架快速实现一个支持分类筛选的分页接口。

Go 复制代码
package main

import (
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"net/http"
	"strconv"
)

type TechPost struct {
	ID       uint   `json:"id"`
	Title    string `json:"title"`
	Summary  string `json:"summary"`
	Url      string `json:"url"`
	Category string `json:"category"`
}

var db *gorm.DB

func initDB() {
	dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	var err error
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("数据库连接失败")
	}
}

func getPosts(c *gin.Context) {
	category := c.Query("category")
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize := 10

	var posts []TechPost
	query := db.Model(&TechPost{})
	
	if category != "" {
		query = query.Where("category = ?", category)
	}

	// 分页查询
	query.Offset((page - 1) * pageSize).Limit(pageSize).Order("created_at desc").Find(&posts)

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"data": posts,
	})
}

func main() {
	initDB()
	r := gin.Default()
	r.GET("/api/v1/posts", getPosts)
	r.Run(":8081")
}

4. 关键:如何打通"发送"与"存储"?

在执行上一篇提到的 SendExternalGroupMsg 函数时,我们需要在 err == nil 的分支里加入一行:

Go 复制代码
// 发送成功后同步到数据库
go func() {
    newPost := TechPost{
        Title:    task.Title,
        Url:      task.Url,
        Category: task.Category,
        // ... 其他字段
    }
    db.Create(&newPost)
}()

5. 进阶:如何增加"互动"?

既然是收藏夹,可以利用 Go 轻松扩展:

  • 点击统计:小程序跳转 URL 前先请求 Go 后端进行计数,分析哪类技术帖最受欢迎。

  • 搜索增强 :如果帖子多了,可以引入 Elasticsearch 或简单的 Bleve(Go 原生全文检索库)来实现模糊搜索。


相关推荐
小二·2 小时前
Go 语言系统编程与云原生开发实战(第12篇)云原生部署实战:Helm Chart × GitOps × 多环境管理(生产级落地)
开发语言·云原生·golang
小二·2 小时前
Go 语言系统编程与云原生开发实战(第13篇)工程效能实战:Monorepo × 依赖治理 × 构建加速(10万行代码实测)
开发语言·云原生·golang
暴躁小师兄数据学院2 小时前
【WEB3.0零基础转行笔记】Golang编程篇-第4讲:Go语言中的流程控制
开发语言·后端·golang·web3·区块链
梦想的旅途22 小时前
如何优雅地实现企微外部群消息自动化(Java/Python/Go 多语言版)
java·自动化·企业微信
菜鸟una2 小时前
【微信小程序+Taro 3+NutUI 3】input (nut-input) 、 textarea (nut-texteare)类型使用避坑
前端·vue.js·微信小程序·小程序·taro
计算机毕设指导62 小时前
基于微信小程序的校园二手交易系统【源码文末联系】
java·spring boot·spring·微信小程序·小程序·tomcat·maven
Jiaberrr2 小时前
小程序setData性能优化指南:避开坑点,让页面丝滑如飞
前端·javascript·vue.js·性能优化·小程序
Code王2 小时前
【课程设计/毕业设计】基于springboot +微信小程序的家政服务平台系统基于小程序的家政服务系统安全开发【附源码、数据库、万字文档】
spring boot·小程序·课程设计
CHU7290352 小时前
旧物回收小程序前端功能版块解析:便捷赋能闲置循环
小程序