今天要完成的任务是使用 go 来开发一个后台管理的框架系统,我们初步评估一下需求,要实现一个简单的后端管理框架,可能需要有一下几个方面需要考虑:
另外,作为一个会使用 docker 的前端开发,哦不,全栈开发,我们肯定是需要用 Docker 来部署的,而且为了极大的降低开发难度,我们还需要提供一个 docker-compose ,这样开发人员只需要 一个 docker-compose up
命令,就可以专注于开发了,根本就不用关心怎么配置环境,只需要关注与自身的业务逻辑开发。
比如,写几个 model,建几个数据库的表,如果哪里查询性能出现问题,考虑增加下 redis,当然,我们的 docker-compse 就不要过于大而全了,点到为止,我们之走到 MySQL 把,剩下的,如微服务监控,健康监测,消息队列,Kafka 之类的,等你觉得有必要了,在慢慢的往上面堆吧,一个大而全的项目,往往不一定是最适合你的项目,你应该做的事情是先选型,选型!!!好了,废话少说,准备开始了
为了对于没有接触过后端的,比如3 年前的我(而且大概率,用 go 多年的人也懒得看这些基础的文章),理解是怎么创建一个 go 项目并且 run 起来的,还是多废一些口舌,你得先到 Go 官网去安装 Go 的环境,注意你的系统和 cpu 架构。
创建项目结构
在你的工作目录中创建一个新的文件夹作为项目的根目录。
mkdir my-admin-system
cd my-admin-system
Go模块
go mod init my-admin-system
这个过程会生成一个文件,go.mod,去检查下有没有,没有请自行 Google,一般这个过程不会出现问题。
安装依赖
主要是 web 框架,orm 库和 数据库driver
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,用来查询用户信息吧,简化点,这里之给出主要代码
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
# 使用官方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
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,又不是不能用。。
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 操作没有什么大的问题了,而且,部署开发起来简直不要太方便,因为篇幅有限,这地方实现登录、权限控制就交给读者了,要做成一个大而全的管理系统,通过一篇文章打透就有点贪多了,总体来讲,本文算是起一个头,带一个思路罢了。
思考环节:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。