go博客系统可用net/http+database/sql+html/template快速搭建,关键在路由设计(如gorilla/mux正则约束id)、sqlite开发转postgresql上线、slug字段seo优化、bluemonday过滤xss、status单字段管理草稿与发布、author_id权限校验及部署三检查。

Go 本身不提供开箱即用的“博客发布系统”,但用 net/http + database/sql + 模板(html/template)就能快速搭出生产可用的最小闭环——关键不是轮子多大,而是路由怎么分、文章数据怎么存、编辑状态怎么管。
用 net/http 实现带路径参数的文章详情页
用户访问 /post/123 时,需要解析 ID 并查数据库。别手写字符串切割,用 http.ServeMux 不支持路径参数,直接上 http.HandleFunc 手动匹配,或更稳妥地用 gorilla/mux(轻量、无依赖):
router := mux.NewRouter()
router.HandleFunc("/post/{id:[0-9]+}", handlePostDetail).Methods("GET")
注意:{id:[0-9]+} 这种正则约束能防 SQL 注入前置风险;ID 解析后必须用 strconv.Atoi 转整型再传给查询,不能直接拼进 SQL 字符串。
文章存储选 SQLite 还是 PostgreSQL?
开发阶段用 sqlite3 省事,但上线前必须换 postgres——否则并发写入会锁表,且全文搜索、时间范围查询等能力弱。两者驱动初始化差异明显:
立即学习“go语言免费学习笔记(深入)”;
- SQLite:打开文件即可,
sql.Open("sqlite3", "./blog.db"),首次运行要db.Exec("CREATE TABLE IF NOT EXISTS posts...") - PostgreSQL:需完整连接串,
sql.Open("pgx", "host=localhost user=blog password=xxx dbname=blog sslmode=disable"),推荐用pgx驱动(比lib/pq性能高、上下文支持好)
字段设计别漏掉 slug(用于 SEO 友好的 URL,如 /post/how-to-use-go),它得唯一且由标题自动生成(用 strings.ToValidUTF8 + 正则替换空格为短横),不能只靠 ID。
米歌_实用企业网站管理系统 Mixge Web Manage (简称:米歌MWM),我们的与众不同在于:彻底颠覆了传统网站的固定模式变成可操控模式。米歌WMW简单,实用,灵活,为非专业人士而设计开发。正如, 第一步添加栏目,第二步发布内容,剩下的就是一些设置。新增功能:1.增加了右侧的联系方式(包括电话、QQ、MSN和旺旺);2.自动缩略图功能,在首页提取和栏目提取自动显示缩略图,并且在文章插入大
富文本编辑与安全渲染必须分开处理
前端用 tiptap 或 quill 提交 HTML 内容,后端绝不能原样存库——XSS 风险极高。正确做法是:
- 入库前用
bluemonday库白名单过滤:policy := bluemonday.UGCPolicy(); cleanHTML := policy.Sanitize(inputHTML) - 模板中用
{{.Content | safeHTML}}渲染(safeHTML是html/template内置函数),禁止用{{.Content}}直接输出 - 如果后续要支持 Markdown,就另存一个
content_md字段,渲染时再转 HTML,别混存
别信“前端校验就够了”,所有输入都当恶意处理。
发布动作要区分草稿与上线,用单字段控制状态
别建 drafts 和 posts 两张表。统一用 posts 表,加 status 字段(tinyint 或 varchar(10)),值为 "draft" / "published"。好处是:
- 列表页查
WHERE status = 'published' ORDER BY created_at DESC LIMIT 10,逻辑清晰 - 编辑页加载时查
WHERE id = ? AND (status = 'published' OR author_id = ?),作者可看自己未发布的草稿 - 发布按钮实际只是 UPDATE
status = 'published',事务里顺带更新published_at时间戳
很多人卡在权限判断上:没做 author_id 校验,导致 A 用户能删 B 的草稿——这个字段必须出现在每条写操作的 WHERE 条件里。
真正难的不是写完功能,而是每次部署前检查三件事:数据库迁移是否执行、静态资源路径是否硬编码、Content-Security-Policy 响应头有没有配。这些地方一漏,线上就出内容错乱或 XSS 漏洞。









