Go Fiber 无后台系统,需自建路由、权限、CRUD等;参数获取须分清c.Query/c.Params/c.FormValue/c.BodyParser;GORM更新慎用Updates避免零值丢失;删除必加Where;权限校验应基于perms标识而非路径匹配。

Go Fiber 本身不提供后台管理系统,它只是个高性能 Web 框架;你要的「后台系统」得靠自己组织路由、中间件、CRUD 接口、权限校验和数据库操作逻辑 —— 这不是开箱即用的功能,而是工程结构问题。
接收前端参数时别混用 c.Query 和 c.Params
常见错误是把路径参数当查询参数用,比如请求 /sys/user/getById/123,却写成 c.Query("id"),结果拿不到值,返回空或 panic。
-
c.Params("id")才是对的,前提是路由定义里写了占位符:app.Get("/sys/user/getById/:id", handler) -
c.Query("name")只能取 URL 中问号后的参数,如/sys/user/list?name=admin&pageNum=1 - 表单提交(
application/x-www-form-urlencoded)用c.FormValue("field"),不是Query - JSON 请求体必须用
c.BodyParser(&struct{}),且 struct 字段要带 JSON tag,否则字段全为零值
用 GORM 做 CRUD 要小心零值覆盖
Updates() 和 UpdateColumns() 不会更新 struct 中的零值(比如 ""、0、false),这在编辑用户资料时容易丢数据 —— 比如把手机号从 "138xxxx" 改成空字符串,结果数据库字段根本没变。
- 想更新零值,用
Save()(按主键插入或更新)或UpdateColumn()配合map[string]interface{} - 批量更新指定字段,优先用
Select("name", "email").Updates(...),避免意外改到其他列 - 删除前务必加
Where(),Delete()直接调用会删整张表(GORM v1.25+ 默认行为) - 查询分页别手写
LIMIT OFFSET,用Limit(pageSize).Offset((pageNum-1)*pageSize)更安全
权限控制不能只靠中间件拦截路径
单纯在中间件里检查 c.Path() 是否在白名单里,无法对应到「菜单按钮级权限」。因为菜单表存的是 perms="user:add" 这类标识,而接口路径是 /api/v1/user,两者没有直接映射关系。
- 推荐做法:登录后把用户拥有的
perms列表查出来,缓存到 context 或 JWT claims 中 - 每个需要鉴权的 handler 开头手动校验:
if !hasPerm(c, "user:delete") { return c.Status(403).SendString("no permission") } - 不要试图在路由注册时绑定权限标识 —— Fiber 的
app.Post()不支持传额外元数据 - 按钮级显示控制(前端是否渲染“删除”按钮)也得依赖同一套
perms列表,前后端保持一致
真正卡住人的地方,往往不是某个函数怎么写,而是「权限标识如何与接口绑定」「空字符串要不要入库」「分页参数校验放哪层」这些边界决策 —— 它们不会报错,但上线后会悄悄漏数据或越权。


















