首页 > 其他分享 >go的GF框架

go的GF框架

时间:2024-12-10 15:59:33浏览次数:9  
标签:err service 框架 GF 参数 JsonExit go data string

GF框架:https://www.topgoer.cn/docs/goframe

如果是业务类型项目,GoFrame官方推荐的Go项目目录结构如下:

/
├── app
│   ├── api
│   ├── model
│   └── service
├── boot
├── config
├── docker
├── document
├── i18n
├── library
├── packed
├── public
├── router
├── template
├── vendor
├── Dockerfile
├── go.mod
└── main.go

 

说明描述
app 业务逻辑层 所有的业务逻辑存放目录。
api 业务接口 接收/解析用户输入参数的入口/接口层。
model 数据模型 数据管理层,仅用于操作管理数据,如数据库操作。
service 逻辑封装 业务逻辑封装层,实现特定的业务需求,可供不同的包调用。
boot 初始化包 用于项目初始化参数设置,往往作为main.go中第一个被import的包。
config 配置管理 所有的配置文件存放目录。
docker 镜像文件 Docker镜像相关依赖文件,脚本文件等等。
document 项目文档 Documentation项目文档,如: 设计文档、帮助文档等等。
i18n I18N国际化 I18N国际化配置文件目录。
library 公共库包 公共的功能封装包,往往不包含业务需求实现。
packed 打包目录 将资源文件打包的Go文件存放在这里,boot包初始化时会自动调用。
public 静态目录 仅有该目录下的文件才能对外提供静态服务访问。
router 路由注册 用于路由统一的注册管理。
template 模板文件 MVC模板文件存放的目录。
vendor 第三方包 第三方依赖包存放目录(可选, 未来会被淘汰)。
Dockerfile 镜像描述 云原生时代用于编译生成Docker镜像的描述文件。
go.mod 依赖管理 使用Go Module包管理的依赖描述文件。
main.go 入口文件 程序入口文件。
GF官方推荐的项目目录结构采用的是MVC设计模式,准确的说是”MVCS“模式。
  • 控制器代码位于/app/api。控制器负责接收并响应客户端的输入与输出,包括对输入参数的过滤、转换、校验,对输出数据结构的维护,并调用service实现业务逻辑处理。 app/api就是对应php的Yii框架的Controller层。
  • 逻辑封装的代码位于/app/service。业务逻辑是需要封装的,特别是一些可复用的业务逻辑,并被控制器调用实现业务逻辑处理。
  • 数据模型的代码位于/app/model。数据模型负责维护所有的数据操作,特别是对数据库的访问控制。数据模型往往是被service调用,不推荐通过控制器直接访问数据模型。
  • 模板解析是可选的,模板文件的存放于/template。在实践中往往可以采用MVVM的模式,例如使用vue/react等框架实现模板解析。如果使用经典的模板解析,可以通过GF框架强大的模板引擎实现模板解析。这个/template相当于是view层。
开发约束:
  • 包名定义,言简意赅,且推荐通过不同的import路径来区分相同包名的包引入。
  • 控制器。
    • 结构体定义用来约束控制器的输入输出,比如虽然仅有一个参数,但也采用了结构化定义,我们直接查看该结构体便可得知该接口的输入参数格式,而不用进入代码中去分析,从而极大提高维护效率。结构体转换可以使用GetStruct或者Parse方法,其中Parse同时可以执行数据校验。结构体转换方法的参数都可以给定一个结构体的空指针,内部会自动初始化结构体对象,转换失败(例如提交参数不存在)不会执行初始化。可以通过给结构体绑定v的标签进行设定校验规则以及定义的错误提示。例如:
      // 账号唯一性检测请求参数,用于前后端交互参数格式约定
      type CheckPassportRequest struct {
          Passport string
      }

      // 结构体转换
      var data *SignUpRequest
      // 这里没有使用Parse而是仅用GetStruct获取对象,
      // 数据校验交给后续的service层统一处理。
      if err := r.GetStruct(&data); err != nil {
          response.JsonExit(r, 1, err.Error())
      }
      
      
      // 登录请求参数,用于前后端交互参数格式约定。 这个就是提示下吧?会直接拦截校验空了吗?
      type SignInRequest struct {
          Passport string `v:"required#账号不能为空"`
          Password string `v:"required#密码不能为空"`
      }
    • 控制器负责接收、转换、校验、处理请求参数后,将所需的参数传递给调用的service层一个或者多个包方法,而不是直接将Request对象传递给service。例如:
      // 用户登录接口
      func (c *C) SignIn(r *ghttp.Request) {
          var data *SignInRequest
          if err := r.Parse(&data); err != nil {   //请求参数解析到结构化对象data中
              response.JsonExit(r, 1, err.Error())
          }
      
          //仅仅把service层需要的参数传递给service,注意这里Session也是通过控制器传过去的
          if err := user.SignIn(data.Passport, data.Password, r.Session); err != nil {
              response.JsonExit(r, 1, err.Error())   
          } else {
              response.JsonExit(r, 0, "ok")
          }
      }



      .......api层和service层,请求参数输入结构体以及简单的校验规则的放置于控制器api中管理,然后往往通过gconv.Struct方法转换为service对应方法需要的输入参数
      .......api的输入参数与service的输入参数数据结构往往比较类似,但不是完全一致,但两者相同属性的数据类型往往需要一一对应,以方便转换。

       api层请求输入参数:

      // 注册请求参数,用于前后端交互参数格式约定
      type SignUpRequest struct {
          Passport  string `v:"required|length:6,16#账号不能为空|账号长度应当在:min到:max之间"`
          Password  string `v:"required|length:6,16#请输入确认密码|密码长度应当在:min到:max之间"`
          Password2 string `v:"required|length:6,16|same:Password#密码不能为空|密码长度应当在:min到:max之间|两次密码输入不相等"`
          Nickname  string
      }

      service层对应方法输入参数:
      // 注册输入参数
      type SignUpParam struct {
          Passport  string
          Password  string
          Password2 string
          Nickname  string
      }
      api请求参数到service输入参数的转换:
      func (c *C) SignUp(r *ghttp.Request) {
          var (
              data        *SignUpRequest
              signUpParam *user.SignUpParam
          )
          if err := r.Parse(&data); err != nil {
              response.JsonExit(r, 1, err.Error())
          }
          if err := gconv.Struct(data, &signUpParam); err != nil {
              response.JsonExit(r, 1, err.Error())
          }
          if err := user.SignUp(signUpParam); err != nil {
              response.JsonExit(r, 1, err.Error())
          } else {
              response.JsonExit(r, 0, "ok")
          }
      }
       

      Go的HTTP请求流程中,不存在”全局变量”获取请求参数的方式,只有根据service的需要按需传递参数。

    • 中间件使用,middleware?   https://www.topgoer.cn/docs/goframe/goframe-1cm3sofvosh6l        ???看视频再学习下
    • 基础类库,主要固定返回数据格式及数据结构。其中JsonExitJson的区别在于,JsonExit调用时会输出JSON数据后直接退出当前的路由方法;而Json在执行输出后会继续执行后续的路由方法逻辑。JsonExit 会多出来r.Exit()的逻辑。
    • 启动执行,引入包。boot包、router包需要在最开始引入,可以在包前加上_ 。https://www.topgoer.cn/docs/goframe/goframe-1cm3spkv6ak16
    • 路由注册https://www.topgoer.cn/docs/goframe/goframe-1cm3spemitknf       ???看视频再学习下
    • 配置文件config.toml。在boot包中执行代码层级的初始化,比如一些组件模块的设置。
    •  

       

    • 任何时候,您都可以通过g.Server()方法获得一个默认的Server对象,该方法采用单例模式设计,也就是说,多次调用该方法,返回的是同一个Server对象。通过Run()方法执行Server的监听运行,在没有任何额外设置的情况下,它默认监听80端口。
  • 一些web操作等,看

标签:err,service,框架,GF,参数,JsonExit,go,data,string
From: https://www.cnblogs.com/lebudian/p/18597525

相关文章

  • go json
    在Go语言中,当爬虫返回JSON数据时,可以通过encoding/json包解析JSON数据并提取其中的值。以下是两种常见方法来解析JSON数据并获取特定字段(如code)。示例JSON数据假设你爬取到的JSON数据如下:json复制代码{"code":200,"message":"成功","data":{......
  • 基于SpringBoot和Vue框架的学生德育成绩管理系统的设计与实现-毕业设计源码00782
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 系统......
  • 在 MongoDB 分片集群上检查索引的一致性
     在MongoDB分片集群中,各分片之间索引分布不一致的情况比你想象的要常见,这是因为用户不使用MongoS而是直接在分片中创建索引。 在块迁移过程中,由于索引不匹配,系统无法在分片间传输数据,从而导致迁移失败。 发生这种情况时,分片日志中的典型错误信息可能如下所示:{"t":{"......
  • Django 中的数据库update() 和 save() 方法的机制的不同
    1.save()方法•机制:•调用save()方法时,会先对模型实例的字段进行验证(如字段类型、长度约束等)。•如果模型定义了clean()或者字段设置了验证规则(如validators),这些规则也会被执行。•验证通过后,Django才会将数据保存到数据库中。•触发的逻辑:•触发模型的......
  • 前端跨框架组件解决方案
    跨框架组件的开发,是一个兼顾用户体验(UX)和开发者体验(DX)的重要问题。随着前端技术生态的快速发展,如何开发能够适配不同框架的组件已成为UI一致性、业务多技术栈需求以及渐进式重构中的重要挑战。一、跨框架组件的使用场景1.大型业务的多技术栈需求大型业务企业的前端团队可能......
  • MongoDB
    应用场景评论区TODO  docker部署MongoDBversion:'3'services:mongo:image:mongo:6.0.4container_name:mongoDBrestart:alwaysports:-27017:27017volumes:-/data/mongodb/data:/data/dbenvironment:MONG......
  • NET任务调度框架Hangfire使用指南
    Hangfire是一个开源的.NET任务调度框架,它允许开发人员轻松地将长时间运行的任务、定时任务和其他后台处理从主线程中分离出来,以提高应用程序的响应速度和性能1.安装Hangfire首先,需要一个ASP.NETCore项目。通过NuGet安装Hangfire:Install-PackageHangfire同时,根据......
  • PHP版谷歌验证 (Google Authenticator)
    地址https://github.com/PHPGangsta/GoogleAuthenticator示例index.php<?phprequire_once'PHPGangsta/GoogleAuthenticator.php';$ga=newPHPGangsta_GoogleAuthenticator();//创建一个新的"安全密匙SecretKey"//把本次的"安全密匙SecretKey"入库,和账户关......
  • mongodb数据同步到hive
    背景用户需求:需要将mongodb的数据同步到hive表,共2亿+条数据,总数据量约30G查阅一些博客后,大致同步方法有以下几种手动+离线对于比较小的数据,可以先通过mongoexport将数据导出到本地json文件,再将json直接上传到hdfs,创建hive表关联到这个文件即可这种方式非......
  • WxPython跨平台开发框架之参数配置管理界面的设计和实现
    我曾经在2014年在随笔《Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建》介绍过基于.NET开发的参数配置管理界面,本篇随笔基于类似的效果,介绍在WxPython跨平台开发框架上使用LabelBook控件实现配置管理界面的效果。1、参数配置管理界面的特点和.NET实......