Revel框架不提供现成博客系统,但借助CRUD生成器、模板继承和MVC结构,1–2天即可搭建含用户登录、文章CRUD及后台管理的完整博客;需注意模型定义、路由配置、权限双校验、静态资源路径映射及数据库表手动创建等关键细节。

Revel 框架本身不提供现成的博客系统,但用它从零搭一个功能完整的博客(含用户登录、文章 CRUD、后台管理),实际只需 1–2 天,关键在于别重复造轮子,而是用好它的约定和生成器。
revel gen -t crud 能直接生成文章管理骨架
你不需要手动写 User.List、Article.Edit 这类控制器方法——Revel 的代码生成器能批量产出。前提是模型定义清晰:
-
app/models/article.go必须包含字段如ID、Title、Content、CreatedAt,且类型明确(int64、string、time.Time) - 运行前确认
conf/routes已启用自动生成路由:确保有*.Routes行,否则生成的控制器不会被路由识别 - 生成命令是
revel gen -t crud -m Article,不是revel generate或其他变体;生成后要手动在app/controllers/app.go中导入新控制器包 - 模板默认渲染纯 HTML,若需 Markdown 支持,得在
views/Article/View.html里调用自定义函数(如{{markdown .Article.Content}}),并在app/views/helper.go中注册该函数
登录态和权限控制必须前后端双校验
Revel 的 Session 默认存于加密 Cookie,但菜单隐藏 ≠ 权限生效。常见错误是只在模板里用 {{if eq .CurrentRole "admin"}} 控制按钮显示,却没拦截后端请求。
- 拦截器必须注册在
app/init.go的init()函数中,用revel.InterceptFunc(checkPermission, revel.BEFORE, &Application{}) -
checkPermission函数里不能只读c.Session.Get("role"),还要检查c.Request.URL.Path是否匹配白名单(例如/admin/*) - 前端跳转到
/admin/articles时,服务端仍可能返回 200 页面但内容为空——这不是 bug,是拦截器没触发,因为路径未匹配到任何控制器方法,需确认conf/routes中该路径是否已声明为GET /admin/articles - 生产环境务必设置
session.cookie.secure = true和session.cookie.httpOnly = true,否则 Cookie 可被 XSS 窃取
静态资源 404 的根因几乎全是路径映射错位
开发时访问 /public/css/app.css 返回 404,99% 不是文件没放对位置,而是 Revel 默认把 app/public/ 映射到了 /assets/ 而非 /public/。
- 静态文件必须放在
app/public/css/app.css,但浏览器 URL 必须是http://localhost:9000/assets/css/app.css - 模板中引用必须写成
<link rel="stylesheet" href="/assets/css/app.css">,写/public/或相对路径都会 404 - 修改
app/public/下文件不会触发热重载,需手动刷新浏览器;改控制器或模板才会自动编译 - 如果用了 Nginx 反向代理,注意 Nginx 的
location /assets/配置要指向 Revel 应用的public/目录,而不是让 Revel 自己处理
最易被忽略的是数据库迁移——Revel 不内置 migrate 工具,revel gen -t crud 生成的代码假定表已存在。你得自己用 sqlite3 命令或 gorm 手动建表,否则 Article.List() 会直接 panic 报 no such table: articles。

















