前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于go语言,手把手教你实现后端管系统框架

基于go语言,手把手教你实现后端管系统框架

原创
作者头像
brzhang
发布2023-12-23 14:23:00
5190
发布2023-12-23 14:23:00
举报
文章被收录于专栏:玩转全栈玩转全栈

今天要完成的任务是使用 go 来开发一个后台管理的框架系统,我们初步评估一下需求,要实现一个简单的后端管理框架,可能需要有一下几个方面需要考虑:

  • 上手开发简单,最好是专注于业务,别让我做什么配置,我很懒的。
  • 数据持久化,因为需要涉及到数据的管理方面。
  • 权限管理,资源的访问需要有一定的访问权限控制,否则,一些敏感信息泄露了都不知怎么搞的。
  • 一个轻量化的 http 服务框架,当然,自己从零开始来就不是太有必要了,直接是一个 gin 吧,又不是不能用

另外,作为一个会使用 docker 的前端开发,哦不,全栈开发,我们肯定是需要用 Docker 来部署的,而且为了极大的降低开发难度,我们还需要提供一个 docker-compose ,这样开发人员只需要 一个 docker-compose up 命令,就可以专注于开发了,根本就不用关心怎么配置环境,只需要关注与自身的业务逻辑开发。

比如,写几个 model,建几个数据库的表,如果哪里查询性能出现问题,考虑增加下 redis,当然,我们的 docker-compse 就不要过于大而全了,点到为止,我们之走到 MySQL 把,剩下的,如微服务监控,健康监测,消息队列,Kafka 之类的,等你觉得有必要了,在慢慢的往上面堆吧,一个大而全的项目,往往不一定是最适合你的项目,你应该做的事情是先选型,选型!!!好了,废话少说,准备开始了

开始动手

为了对于没有接触过后端的,比如3 年前的我(而且大概率,用 go 多年的人也懒得看这些基础的文章),理解是怎么创建一个 go 项目并且 run 起来的,还是多废一些口舌,你得先到 Go 官网去安装 Go 的环境,注意你的系统和 cpu 架构。

创建项目结构

在你的工作目录中创建一个新的文件夹作为项目的根目录。

代码语言:javascript
复制
mkdir my-admin-system
cd my-admin-system

Go模块

代码语言:javascript
复制
go mod init my-admin-system

这个过程会生成一个文件,go.mod,去检查下有没有,没有请自行 Google,一般这个过程不会出现问题。

安装依赖

主要是 web 框架,orm 库和 数据库driver

代码语言:javascript
复制
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

这里会在你的项目下产生另外一个文件,go.sum ,你会好奇,你安装的这些库都跑哪里去了,问得好,但我也懒得解释太多,安装到你go 环境所在的目录那里了,这些是可以给到其他项目复用的,和 node.js 不同 ,项目下面会安装到 node_modules 下面,每个项目独立,有点像是自己的沙箱一样。总之各有各的好,不能说哪种更加科学。整个项目的结构如下图所示:

注意,再次强调:不要把你的数据库密码直接写到项目里面,请使用.env 的方式,这是一个好的习惯

写一个 main.go,作为入口,和一个 user.go,用来查询用户信息吧,简化点,这里之给出主要代码

代码语言:javascript
复制
func main() {
	// 从环境变量获取数据库连接信息
	dbHost := os.Getenv("DB_HOST")
	dbUser := os.Getenv("DB_USER")
	dbPassword := os.Getenv("DB_PASSWORD")
	dbName := os.Getenv("DB_NAME")

	// 初始化数据库连接
	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbName)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database")
	}

	// 迁移 schema
	db.AutoMigrate(&models.User{})

	// 设置路由
	r := gin.Default()

	// 用户路由
	r.POST("/users", func(c *gin.Context) {
		var user models.User
		if err := c.ShouldBindJSON(&user); err != nil {
			c.JSON(400, gin.H{"error": err.Error()})
			return
		}
		db.Create(&user)
		c.JSON(201, user)
	})

	r.GET("/users", func(c *gin.Context) {
		var users []models.User
		db.Find(&users)
		c.JSON(200, users)
	})

	// 启动服务器
	r.Run() // 默认监听并在 0.0.0.0:8080 上启动服务
}

编写 Dockerfile

代码语言:javascript
复制
# 使用官方Go镜像作为构建环境
FROM golang:1.21.5 as builder

# 设置工作目录
WORKDIR /app

# 复制go.mod和go.sum文件
COPY go.mod go.sum ./

# 下载所有依赖
RUN go mod download

# 复制源代码
COPY . .

# 构建可执行文件
RUN CGO_ENABLED=0 GOOS=linux go build -v -a -installsuffix cgo -o my-admin-system .

# 使用scratch作为运行环境
FROM scratch

# 从构建器中复制可执行文件
COPY --from=builder /app/my-admin-system .

# 运行可执行文件
CMD ["./my-admin-system"]

然后是 docker-compose.yml

代码语言:javascript
复制
version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      - DB_HOST=${DB_HOST}
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_NAME=${DB_NAME}
  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

项目启动起来

docker-compose up --build,走你,如下,项目就启动起来了:

本来,我们是需要使用 React或者Vue这样的框架来写前端页面来展示对用户的一系列管理,这里也偷懒了,直接使用 postman,或者,也懒得使用 postman 了,直接curl命令行搞起增加一个 user,又不是不能用。。

代码语言:javascript
复制
curl -X POST -H "Content-Type: application/json" -d '{"name":"brzhang","email":"brzhang@example.com","password":"secret"}' <http://localhost:8080/users>

如下,手起刀落,我们看到好像是 ok 了。

命令行的返回我们看到插入成功了,那么 /users 接口的 get 方法来验证下,我们刚才增加的用户有没有呢,浏览器直接输入 http://localhost:8080/users 走你。

总结

我们实现了一个后端管理系统的架子,基本上实现基本的 CURD 操作没有什么大的问题了,而且,部署开发起来简直不要太方便,因为篇幅有限,这地方实现登录、权限控制就交给读者了,要做成一个大而全的管理系统,通过一篇文章打透就有点贪多了,总体来讲,本文算是起一个头,带一个思路罢了。

思考环节:

  • 你知道有那些后端代码框架适合做后端管理系统的吗?strapi.io 可以了解一下。
  • 实现权限管理的经典工具有哪些?https://github.com/casbin/casbin 了解一下,经典的 RBAC 实现

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始动手
    • 项目启动起来
      • 总结
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档