网站 开发合同,浏览器app下载安装,做一个网站要注意什么,华为云和wordpress使用到的第三方库 gin Gin 框架viper 配置文件管理cors 跨域资源请求配置gorm ORM 库zap 日志记录 main 包 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数#xff0c;默认当前目录下使用 viper 读取 config.ini 配置文件初始化初始数据初始化随机数种子初… 使用到的第三方库 gin Gin 框架viper 配置文件管理cors 跨域资源请求配置gorm ORM 库zap 日志记录 main 包 Go 语言程序的入口点 main.go 文件 使用 flag 读取配置文件路径参数默认当前目录下使用 viper 读取 config.ini 配置文件初始化初始数据初始化随机数种子初始化数据库声明启动程序模式配置启动参数并启动服务 package mainimport (flaglogmath/randproject/daoproject/routerstimegithub.com/gin-gonic/gingithub.com/spf13/viper
)var (ServiceHost stringServicePort string
)func init() {var configPath stringflag.StringVar(configPath, config-path, ., path to config file)flag.Parse()viper.SetConfigName(config) // 设置配置文件名为“config”viper.SetConfigType(ini) // 设置配置文件类型为“ini”viper.AddConfigPath(configPath) // 设置在configPath中查找配置文件if err : viper.ReadInConfig(); err ! nil {if _, ok : err.(viper.ConfigFileNotFoundError); ok {// Config file not found; ignore error if desiredlog.Panic(没有找到配置文件)} else {// Config file was found but another error was producedlog.Panic(初始化配置出错, err.Error())}}ServiceHost viper.GetString(service.host)ServicePort viper.GetString(service.port)dao.DatabaseUser viper.GetString(database.user)dao.DatabasePwd viper.GetString(database.pwd)dao.DatabaseHost viper.GetString(database.host)dao.DatabasePort viper.GetString(database.port)dao.DatabaseName viper.GetString(database.name)
}
func main() {rand.Seed(time.Now().Unix())mode : releaseerr : dao.InitMySQL()if err ! nil {log.Println(初始化数据失败, err.Error())return}switch mode {case debug:gin.SetMode(gin.DebugMode)case release:gin.SetMode(gin.ReleaseMode)case test:gin.SetMode(gin.TestMode)}r : routers.SetupRouter()s : http.Server{Addr: ServiceHost : ServicePort,Handler: r,ReadTimeout: 5 * time.Second,WriteTimeout: 10 * time.Second,}err s.ListenAndServe()if err ! nil {panic(err)}
}dao 包 通常被用于数据存储层的实现可将底层数据库访问操作封装隐藏细节以简化数据库操作 mysql.go 文件 使用 gorm 初始化 MySQL 数据库连接 package daoimport (fmtloggorm.io/driver/mysqlgorm.io/gorm
)var (Db *gorm.DBDatabaseUser stringDatabasePwd stringDatabaseHost stringDatabasePort stringDatabaseName string
)func InitMySQL() (err error) {dsn : fmt.Sprintf(%v:%vtcp(%v:%v)/%v?charsetutf8mb4parseTimeTruelocLocal,DatabaseUser, DatabasePwd, DatabaseHost, DatabasePort, DatabaseName)Db, err gorm.Open(mysql.Open(dsn), gorm.Config{})if err ! nil {log.Panic(连接数据库失败, err.Error())}// 测试数据库连接err Db.Exec(SELECT 1).Errorif err ! nil {log.Panic(数据库连接失败, err.Error())}return
}routers 包 通常用于路由器配置这个包中包含的代码需要读取 HTTP 请求并将该请求发送到相应后端的处理程序然后从处理程序获取响应 routers.go 文件 创建日志记录器初始化 gin 引擎配置 cors 跨域请求设置一个默认路由及无请求到路由时返回的数据 package routersimport (net/httpproject/controllergithub.com/gin-contrib/corsgithub.com/gin-gonic/gingo.uber.org/zap
)func SetupRouter() *gin.Engine {// 创建一个生产级别的日志记录器logger, err : zap.NewProduction()if err ! nil {panic(err)}// 在函数结束后刷新缓冲区defer logger.Sync()r : gin.Default()// 将 logger 存储在 Gin 的中间件中r.Use(func(c *gin.Context) {c.Set(logger, logger)c.Next()})r.Use(cors.New(cors.Config{AllowOrigins: []string{*},AllowMethods: []string{POST, GET, PUT, DELETE, OPTIONS},AllowHeaders: []string{Content-Type, Content-Length},ExposeHeaders: []string{Access-Control-Allow-Headers},AllowCredentials: true,}))r.GET(/first, controller.FirstHandler)// 下面有两个配置// 如果将前端服务与后端服务同时启动可以设置第一种将前端打包的文件放到 public 文件夹内// 我这里设置的使用 vite 打包所以就下面这种设置可以自行更改// 当直接访问的时候就相当于请求/路由就会访问 index.html 页面// 设置静态文件服务目录r.Static(public, public)r.Static(assets, public/assets)r.GET(/, func(c *gin.Context) {c.File(public/index.html)})r.NoRoute(func(c *gin.Context) {c.File(public/index.html)})// 如果前后端分离模式可以设置为请求到没有的路由就返回 Not Foundr.NoRoute(func(c *gin.Context) {c.JSON(http.StatusNotFound, gin.H{msg: Not Found,})})return r
}controller 包 负责维护业务逻辑的实现同时调用 Dao 对象实现数据存储、检索等功能通常与用户交互并处理相关活动 controller.go 文件 创建初始默认路由函数使用 info 级别的日志记录并返回数据 package controllerimport (net/httpgithub.com/gin-gonic/gingo.uber.org/zap
)func FirstHandler(c *gin.Context) {c.MustGet(logger).(*zap.Logger).Info(这是一个Info日志)c.JSON(http.StatusOK, gin.H{code: 1,data: Hello World,msg: 成功,})
}config.ini 文件 外部配置文件 [service]
host127.0.0.1
port8000
[database]
userroot
pwd123456
host127.0.0.1
port3306
namedatabasenamebuild.bat 文件 打包脚本不用每次修改环境变量不用手动输入打包命令 脚本内容修改环境变量为 arm64 架构 Linux 系统打包还原为 amd64 架构 Windows 系统我这里使用 Windows 做开发需要部署到 arm64 架构的 Linux 服务器上所以这样写根据需要自行更改 echo offgo env -w CGO_ENABLED0
go env -w GOOSlinux
go env -w GOARCHarm64
go build -ldflags -w -s
go env -w CGO_ENABLED1
go env -w GOOSwindows
go env -w GOARCHamd64