如何在Golang中实现类似Django的强大管理面板?

如何在Golang中实现类似Django的强大管理面板? Django 管理面板是我选择它而非 Go 语言来开发初创公司项目的原因之一。每当我阅读任何关于初创公司的书籍时,总能在书中某个地方找到这样一句话:

“团队投入了大量精力来获取自己的分析报告,经过数周的艰苦努力,终于取得了回报。”

这就像是 Django 为我完成了所有这些艰苦的工作,而我唯一需要做的就是填充数据并设置一个简单的表单! 有没有办法让我在 Go 项目中获得同样出色的 Django 管理面板?

13 回复

为了论坛,请务必使用 Django 🙂

更多关于如何在Golang中实现类似Django的强大管理面板?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我想知道是否有任何库可以让我获得一个高度可定制的管理面板,就像 Django 中的那样。

学习任何编程语言的时间都不会被浪费。

我给你的最后建议是:试着倾听他人,而不是基于肤浅的理解仓促做出判断。

到目前为止,我连续冲刺了14天,能够在4天内构建出一个推特克隆版。

这让我今天很开心 :slight_smile:

你没有理解我的意思。大家来到这里都是为了互相帮助。如果你不经过适当的研究就把脑子里想到的一切都写出来,就会得到这类反应。这类反应应该促使你去阅读大量关于该主题的文章,而不是浪费那些真正在这里提供帮助的人的时间。

请检查他过去三周的所有帖子。那并非针对单个问题的反应。

拜托,你只需在谷歌上随便输入点什么,就能找到大量相关文章,比如我首次回复中的链接。没有适当的研究能力,你什么也学不到。

如果你认为他有权提出任何他想问的问题,那么我也有权做出任何反应,希望能引导他学会自主学习,成为一名更好的程序员。

ermanimer:

每个人都在这里互相帮助。如果你不进行适当的研究,就把脑子里想到的一切都写下来

是的,这个论坛真的很棒。尽管我有时问题表述不清,但我得到了很多帮助。但作为一个Go语言新手,我并不总是知道如何提问以及该搜索什么。我用了数十年的词汇,在Go语言上并不适用。所以,如果你不知道要搜索什么,就很难在谷歌上找到任何东西。常见的后台管理面板与例如PostgreSQL的PGAdmin是截然不同的东西。

你能用谷歌吗? 例如 https://www.google.com/search?q=highly+customizable+admin+panel+golang 或者你喜欢为脑海中冒出的每个简单问题而劫持论坛吗? 尝试自己先做些努力,而不是把这里的每个人都当成你付费的导师。

ermanimer:

与其把这里的每个人都当成你付费的导师,不如尝试自己去实现一些东西。

使用另一种语言多年后,我对在Go中如何开始或如何操作毫无头绪。因此,我在几个论坛上问了许多愚蠢的问题。但在StackOverflow上,我不问任何与Go相关的问题,因为在那里你总是会被毫无解释地踩。

关于管理面板,我认为Go没有现成的管理面板。你必须用困难的方式自己实现。如果有人能证明我错了,我会很高兴。

ermanimer:

请检查他过去三周的所有帖子。那并不是针对单个问题的反应。

提出的问题与我刚接触Go时本应提出的问题相同。从何开始?使用什么?如何使用?我个人喜欢基于观点的问题,比如X与Y的比较,但在某些论坛中,这类问题并不总是受欢迎。

从一门成熟知名的语言转向一门不那么成熟的新语言确实很难。有时你必须说服自己,投入时间进行转变是值得的。如果——(是的,我说的是如果)提问者认为Go值得投入时间,他肯定会成为这个社区的宝贵财富。

https://gowebstatic.tk/about

我完全同意你的观点——关于Golang,有大量可用的课程、书籍等资源。我开始逐渐熟悉这门语言,并且发现从在线资源中获取支持完全没有困难。

我认为Go社区比大多数社区更有能力,这就是为什么他们不常问愚蠢的问题。如果这位朋友无法回答他提出的问题,那么他应该做更多的研究和学习。

不过,我注意到的一件事是,大多数程序员似乎通过完成那些很容易通过谷歌搜索到的小型编码任务来学习。我不认为这是一种很好的学习方式。理解干净、可维护且架构良好的代码需要深厚的知识,而Golang由于其相对简单的结构,在这方面可以提供帮助——我不会认为它是一门简单的语言,因为它有许多微妙之处。但真的有所谓的简单语言吗?Go通过不过度使用语言结构来提供帮助。

我在亚马逊的一篇评论中看到有人抱怨Golang社区不友好。他来自微软背景,也在问一些非常愚蠢的问题,但据他自己说,他懂编程。我不确定他是否掌握了独立思考的艺术。

因为Django对我来说非常完美,不到一天就能构建并部署一个应用,管理面板有助于查看用户行为,默认提供高安全性,以及密码哈希功能。但是,一旦我有了10个活跃用户,应用现在发送一条文本消息需要4秒,图片需要10秒,视频则需要2到7分钟。这些明确的迹象表明我必须放弃Django了,但转向什么呢?

我很快就爱上了Golang。但作为自由职业者,我找不到任何相关的工作,关于它的文章也不多,官方文档虽然不是最好的但也还不错,学习资源也很少。

你怎么看?我应该花4个月时间来确定我学的东西是否值得,还是去问问已经这样做过的人?

“学习新的编程语言从来都不是坏事。”嗯,如果它没有帮助,那就不一定了。我宁愿去学PHP、Java,这些能为我带来很多自由职业的工作机会。或者学React Native,它能带我进入跨平台开发领域。Go呢?到目前为止,我发现Go唯一的好处就是它的速度。

我在两种语言(Python和Golang)之间进行了多次测试,结果在大多数情况下只有0.3秒的差异。我继续阅读更多关于“如何让Go代码执行得更快”的资料,结果发现我的Go代码性能比Python快了10秒,而不是0.5秒。

你怎么看?我应该花4个月学习Go,最终得到相同的结果,然后再花一个月左右的时间来找出如何获得更好的性能,还是去问问以前有过同样经历的人?

ermanimer: 为了能够自学并成为一名更好的程序员。

再说一次,网上没有好的Go资源,根本没有好的Web开发课程,我甚至无法在模板中做1+1运算,我唯一的资源就是文档和一些中文博客。

我已经做了一些谷歌搜索,没有找到能满足我需求的东西,所有方案都至少需要1天时间来设置管理面板,如果SQL代码设置不正确,它就无法正常工作。所以我来到这里问:“嘿,有没有人遇到过类似的情况?嘿,有没有人花了4个月用Go构建应用,并找到了一个库或工具,可以让我以最快的速度和最佳性能构建X,这样我就不会白学一门语言了?因为我刚刚在谷歌上搜索了一下,发现所有这些方案都需要大量的工作。”

在Django中,我只需在终端中输入一行命令就能构建一个生产就绪的应用。而在Go中,到目前为止,我匆忙花了14天,才在4天内构建了一个没有用户哈希功能的Twitter克隆,甚至无法上传它。即使我上传了,在我开始为我的创业公司使用它之前,我仍然需要知道应该配置哪些安全选项。

最后,我再重复一遍同样的问题: 花5分钟问问人们,他们是浪费了4个月学习Go,还是觉得值得,这比我自己花那4个月时间,最后可能惊讶地发现那完全是浪费要好吗?(当然,这是在谷歌上搜索了几个小时之后。)

在Go中实现类似Django Admin的完整管理面板确实需要一些工作,但有几个优秀的库可以帮你快速搭建。以下是主要方案:

1. GORM + 管理面板库

最接近Django Admin体验的是使用GORM配合专门的管理面板库:

// 使用GORM和Admin库的示例
package main

import (
    "github.com/go-admin-team/go-admin-core/sdk"
    "github.com/go-admin-team/go-admin/engine"
    "github.com/gin-gonic/gin"
    "gorm.io/gorm"
)

type Product struct {
    gorm.Model
    Name        string  `json:"name"`
    Price       float64 `json:"price"`
    Description string  `json:"description"`
    CategoryID  uint    `json:"category_id"`
}

func main() {
    r := gin.Default()
    
    // 初始化引擎
    eng := engine.Default()
    
    // 数据库配置
    cfg := config.Config{
        Database: config.Database{
            Driver: "mysql",
            Source: "user:pass@tcp(127.0.0.1:3306)/dbname",
        },
    }
    
    // 初始化
    if err := eng.AddConfig(&cfg).
        AddGenerators(products.Generators).
        Use(r); err != nil {
        panic(err)
    }
    
    r.Run(":8080")
}

2. 使用go-admin框架

go-admin是目前最完整的Go管理面板解决方案:

// go-admin完整示例
package main

import (
    "github.com/go-admin-team/go-admin-core/sdk"
    "github.com/go-admin-team/go-admin/engine"
    "github.com/go-admin-team/go-admin/modules/config"
    "github.com/go-admin-team/go-admin/plugins/admin"
    "github.com/go-admin-team/go-admin/template"
    "github.com/gin-gonic/gin"
)

func main() {
    gin.SetMode(gin.ReleaseMode)
    r := gin.New()
    
    // 创建引擎
    eng := engine.Default()
    
    // 全局配置
    cfg := config.Config{
        Databases: config.DatabaseList{
            "default": {
                Host:       "127.0.0.1",
                Port:       "3306",
                User:       "root",
                Pwd:        "123456",
                Name:       "go-admin",
                MaxIdleCon: 50,
                MaxOpenCon: 150,
                Driver:     config.DriverMysql,
            },
        },
        UrlPrefix: "admin",
        Store: config.Store{
            Path:   "./uploads",
            Prefix: "uploads",
        },
        Language: "cn",
    }
    
    // 初始化插件
    adminPlugin := admin.NewAdmin()
    
    // 添加生成器
    adminPlugin.AddGenerator("user", GetUserTable)
    
    // 启动引擎
    _ = eng.AddConfig(cfg).
        AddPlugins(adminPlugin).
        Use(r)
    
    r.Run(":9033")
}

// 定义模型生成器
func GetUserTable(ctx *context.Context) table.Table {
    tbl := table.NewDefaultTable(table.DefaultConfig())
    
    info := tbl.GetInfo()
    info.AddField("ID", "id", db.Int).FieldFilterable()
    info.AddField("用户名", "username", db.Varchar)
    info.AddField("邮箱", "email", db.Varchar)
    info.AddField("创建时间", "created_at", db.Datetime)
    
    return tbl
}

3. 使用GORM + 自定义CRUD

如果只需要基础功能,可以基于GORM快速构建:

// 快速CRUD管理面板
package main

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

type AdminHandler struct {
    DB *gorm.DB
}

func (h *AdminHandler) ListProducts(c *gin.Context) {
    var products []Product
    page := c.DefaultQuery("page", "1")
    limit := c.DefaultQuery("limit", "20")
    
    h.DB.Scopes(Paginate(page, limit)).Find(&products)
    c.JSON(http.StatusOK, gin.H{"data": products})
}

func (h *AdminHandler) CreateProduct(c *gin.Context) {
    var product Product
    if err := c.ShouldBindJSON(&product); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    
    h.DB.Create(&product)
    c.JSON(http.StatusOK, gin.H{"data": product})
}

func (h *AdminHandler) UpdateProduct(c *gin.Context) {
    id := c.Param("id")
    var product Product
    
    if err := h.DB.First(&product, id).Error; err != nil {
        c.JSON(http.StatusNotFound, gin.H{"error": "Product not found"})
        return
    }
    
    if err := c.ShouldBindJSON(&product); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    
    h.DB.Save(&product)
    c.JSON(http.StatusOK, gin.H{"data": product})
}

// 分页作用域
func Paginate(page, limit string) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        offset := (page - 1) * limit
        return db.Offset(offset).Limit(limit)
    }
}

4. 使用SQLBoiler + 自动生成

对于数据库优先的开发模式:

// SQLBoiler自动生成CRUD
package main

import (
    "github.com/volatiletech/sqlboiler/v4/boil"
    "github.com/volatiletech/sqlboiler/v4/queries/qm"
    "your_project/models" // 自动生成的模型
)

func AdminCRUDOperations() {
    // 查询所有用户
    users, err := models.Users().All(ctx, db)
    
    // 带条件查询
    activeUsers, err := models.Users(
        qm.Where("active = ?", true),
        qm.Limit(100),
        qm.Offset(0),
    ).All(ctx, db)
    
    // 创建新用户
    user := &models.User{
        Name:  "John Doe",
        Email: "john@example.com",
    }
    err = user.Insert(ctx, db, boil.Infer())
    
    // 更新用户
    user.Name = "Jane Doe"
    _, err = user.Update(ctx, db, boil.Infer())
    
    // 删除用户
    _, err = user.Delete(ctx, db)
}

5. 集成Vue/React前端

对于更复杂的管理界面,可以前后端分离:

// Go后端API + 前端管理面板
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/gin-contrib/cors"
    "gorm.io/gorm"
)

func SetupAdminAPI(db *gorm.DB) *gin.Engine {
    r := gin.Default()
    
    // CORS配置
    r.Use(cors.New(cors.Config{
        AllowOrigins:     []string{"http://localhost:3000"},
        AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
        AllowHeaders:     []string{"Origin", "Content-Type", "Authorization"},
        ExposeHeaders:    []string{"Content-Length"},
        AllowCredentials: true,
    }))
    
    // 管理API路由组
    admin := r.Group("/admin/api")
    admin.Use(AuthMiddleware()) // JWT认证
    
    {
        admin.GET("/products", ListProducts(db))
        admin.GET("/products/:id", GetProduct(db))
        admin.POST("/products", CreateProduct(db))
        admin.PUT("/products/:id", UpdateProduct(db))
        admin.DELETE("/products/:id", DeleteProduct(db))
        
        // 批量操作
        admin.POST("/products/batch-delete", BatchDeleteProducts(db))
        admin.POST("/products/export", ExportProducts(db))
    }
    
    return r
}

推荐方案

  1. 快速原型:使用go-admin框架,它提供了最接近Django Admin的体验
  2. 生产环境:GORM + 自定义Admin模块,灵活性更高
  3. 大型项目:前后端分离,Go提供API,使用Vue/React管理面板

go-admin框架提供了自动化的CRUD界面、权限管理、日志记录和数据分析功能,最接近Django Admin的"开箱即用"体验。对于初创公司项目,这可以显著减少开发管理后台的时间成本。

回到顶部