本文记录一个 Go 后台管理系统从 0 到上线的完整过程,适合正在从 PHP/Java 转 Go,或者准备搭建企业内部管理后台的开发者参考。重点包括数据库设计、CRUD 生成、RBAC 权限、Vue3 管理端页面和上线前检查。

一、需求背景

本次示例是一个内部工单管理系统,第一版只保留最小可上线功能:

  • 工单分类管理
  • 工单列表、新增、编辑、删除
  • 工单状态流转
  • 用户、角色、菜单权限
  • 操作日志

二、数据库表设计

CREATE TABLE work_order (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(120) NOT NULL,
  category_id BIGINT NOT NULL,
  status TINYINT NOT NULL DEFAULT 0,
  priority TINYINT NOT NULL DEFAULT 1,
  owner_id BIGINT DEFAULT NULL,
  remark TEXT,
  created_at DATETIME,
  updated_at DATETIME
);

三、技术选型对比

方案 适合场景 优点 不足
Gin + GORM 轻量 API 服务 灵活、生态成熟 后台基建需要自己搭
GoFrame 工程化 Web 项目 配置、日志、ORM、分层较完整 需要接受框架约定
GoFrame + 后台骨架 中后台管理系统 RBAC、CRUD、前端页面可复用 需要理解生成代码结构

四、开发耗时记录

模块 手写方式 使用后台骨架
项目初始化 2 小时 0.5 小时
RBAC 权限 4 小时 1 小时
CRUD 接口 6 小时 1.5 小时
Vue3 页面 5 小时 1.5 小时
日志和字典 3 小时 1 小时

五、业务逻辑示例:状态流转

代码生成器适合生成通用 CRUD,但业务规则仍然建议手写,例如工单状态流转:

func ChangeStatus(ctx context.Context, id int64, next int) error {
    order, err := dao.WorkOrder.Ctx(ctx).WherePri(id).One()
    if err != nil {
        return err
    }
    if order.IsEmpty() {
        return gerror.New("工单不存在")
    }

    current := order["status"].Int()
    if !canTransfer(current, next) {
        return gerror.New("非法状态流转")
    }

    _, err = dao.WorkOrder.Ctx(ctx).WherePri(id).Update(g.Map{
        "status": next,
        "updated_at": gtime.Now(),
    })
    return err
}

六、使用的后台项目

本次示例中,我使用的是 XYGo Admin,技术栈为 GoFrame v2 + Vue3 + TypeScript + Element Plus。它内置了 RBAC 权限、菜单管理、代码生成器等后台常用能力。

七、上线前检查清单

  • 登录过期是否正确跳转
  • 普通角色是否无法访问管理员菜单
  • 列表分页、搜索、重置是否正常
  • 新增/编辑表单是否有必填校验
  • 删除操作是否有二次确认
  • 关键状态变更是否写入操作日志
  • 生产环境配置是否与本地环境隔离

总结

Go 后台管理系统开发效率的关键,不是所有代码都自己写,而是把通用层和业务层分开:CRUD、权限、菜单、表单这类通用能力可以复用,状态流转、审批规则、通知策略等业务逻辑必须自己设计。这样一个小型后台项目在一个周末内上线是可行的。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐