GoFly框架快速新增接口/上手写代码

拿到一个新框架大家可能无从下手,因为你对框架设计思路、结构不了解,从而产生恐惧,所以我们框架是通过简单可视化界面安装,安装后即可看到效果,然后点击先点点看各个功能,看现有的功能是怎么写的,这个现成功能作为参考,最好再自己写新的功能,下面我们就带大家如何写新的功能。

通过开发文档的必看章节,我猜您已经在您电脑成功安装并成功运行项目了,通过“开发必看”文档,您已经对哦框架有所了解,现在我们教你如何开发新的功能,对应我们前后端分离框架来说,后端写的功能都是提供给各个前端调用的api接口,所以我们往后开发功能都称为新增“接口”。

新增一个模块

我们在app目录下新加一个模块,当你下载新的代码安装后,app目录下只有admin、business、common三个文件夹和controller.go一个文件,其中controller.go是主控制器可以引入app下模块和设置全局路由拦截及请求前处理。我们用增加wxapp(微信应用模块)举例子,开发步骤如下:

第1.新增一个目录

在app下新建一个名称为 wxapp 的目录,这名称就是这个模块的名称,接口请求就是从wxapp开始也就是域名+wxapp/,例如:https://goflys.cn/wxapp

第2.在目录下添加控制器

wxapp 的目录中新建controller.go一个文件,这个就是整个wxapp 模块的控制器,代码如下:

package wxapp/**
* 引入控制器
* 请把您使用包用 _ "gofly/app/wxapp/XX"导入您编写的包 自动生成路由
* 不是使用则注释掉*/
import ("gofly/utils/gf"
)// 路由中间件/路由钩子
func RouterHandler(c *gf.GinCtx, IsCtr bool) {if IsCtr { //在这里面处理拦截操作c.Next()}
}

新建好的控制器文件后,要不这个模块添加到app下的controller.go主控制中并且引入模块路由中间件(如果模块不需拦截则可以不引入),代码如下:

package controller/**
* app路由引入口《引入模块控制器》
*
* 请把您使用包用 _ "gofly/app/xx"导入您编写的包 自动生成路由
* 不需要使用的模块则注释掉 例如home模块暂时用不到就注释掉,这样不占用资源,使用是取消注释即可。
* 路由规则:包路径“business/article” + 包中结构体“Cate”转小写+方法名(首字母转小写_ "gofly/app/business"
* 有控制的模块请在RouterHandler添加模块的路由钩子*/
import ("gofly/app/admin""gofly/app/business"_ "gofly/app/common""gofly/app/wxapp" //新增的wxapp模块"gofly/utils/gf"
)// 路由中间件/路由钩子
func RouterHandler(c *gf.GinCtx) {business.RouterHandler(c, gf.IsModelPath(c.FullPath(), "business"))admin.RouterHandler(c, gf.IsModelPath(c.FullPath(), "admin"))wxapp.RouterHandler(c, gf.IsModelPath(c.FullPath(), "wxapp"))//新增的wxapp模块
}

第3.在wxapp目录下创建接口文件夹

我们在wxapp模块创建名称user的用户相关接口类,和用户相关的接口将在user目录下添加,比如user中常见的用户基本操作(登录,获取用户信息)、用户订单等,我们下面从用户操作和用户订单给大家举例。这个类名user也会生成路由路径,到这里路由为:/wxapp/user,加上域名则为:https://goflys.cn/wxapp/user。我们框架会自动根据目录层级生成接口请求路径,这样路由就不用你手动编写,且不会出现路由重复、命名更规则、可以根据请求的接口路径快速定位代码位置方便更新代码。

第4.在user目录下创建接口文件

我们创建index.go来写用户常见操作,创建order.go来写用户订单相关功能,我们通过index.go和order.go两个给大家讲解接口,index,go中比较特殊框架为了减少路由层级框架对index命名的文件,在生成路由是会忽略index这一级生成路由为:/wxapp/user/+接口名称。其他命名路由会添加文件名,例如order.go生成路由为:/wxapp/user/order/+接口名称。index常用在与类名意义相同的功能上,类型本例user类的用户登录、获取用户信息等是和User类名称对应的功能,所以我们把用户登录、获取用户信息等用户操作功能放到index.go中,这样生成路由基于没有index这一层。

创建接口文件后我们在把user类在wxapp模块控制器引入,就是在app/wxapp/controller.go中import一下user,引入类的代码如下:

package wxapp/**
* 引入控制器
* 请把您使用包用 _ "gofly/app/wxapp/XX"导入您编写的包 自动生成路由
* 不是使用则注释掉*/
import (_ "gofly/app/wxapp/user" //这个就是新引入的 user类"gofly/utils/gf"
)// 路由中间件/路由钩子
func RouterHandler(c *gf.GinCtx, IsCtr bool) {if IsCtr { //在这里面处理拦截操作c.Next()}
}
4.1 新增index.go文件:

示例我只写接口方法,接口业务这里就不详细展开,您自己根据业务编写,index.go示例代码如下:

package userimport "gofly/utils/gf"// 用户
type Index struct{}func init() {fpath := Index{}gf.Register(&fpath, fpath)
}// 获取用户信息
func (api *Index) GetInfo(c *gf.GinCtx) {user_id, _ := c.Get("userID") //当前用户IDuserdata, err := gf.Model("business_user").Fields("id,businessID,name,nickname,mobile,email,avatar,status,createtime").Where("id", user_id).Find()if err != nil {gf.Failed().SetMsg("查找用户数据!").Regin(c)} else {gf.Success().SetMsg("获取用户信息").SetData(userdata).Regin(c)}
}// 用户登录
func (api *Index) Login(c *gf.GinCtx) {//更具登录业务写登录功能gf.Success().SetMsg("用户登录").Regin(c)
}

到这里我们就看到终端看到GetInfo和Login两个接口注册到路由中了,您可以通过:域名(服务端地址)+/wxapp/user/getInfo请求接口了。例如下图,大家可能疑问为什么GetInfo会生成为GET请求、Login又会是POST请已经为何首字母变小写,这问题请去:接口开发规范 这一节了解。

4.2 新增order.go文件:

在user目录下创建order.go文件,package包名是类目录名user个必须规范,order.go基本代码如下:

package userimport "gofly/utils/gf"// 用户订单
type Order struct{}func init() {fpath := Order{}gf.Register(&fpath, fpath)
}

其中代码的结构体type Order struct{} 的Order名称要和order.go文件名一致,并且把首字母变大写。init函数中fpath := Order{} 的Order就是是=结构体名称,每个文件要写成和文件名称一样。

下面在order中添加功能接口,我们就添加一个获取订单列表GetList、获取订单详情GetDetail和修改订单状态UpStatus(取消订单、确认订单)3个接口做演示。代码如下:

package userimport ("gofly/utils/gf""gofly/utils/tools/gmap"
)// 用户订单
type Order struct{}func init() {fpath := Order{}gf.Register(&fpath, fpath)
}// 获取订单列表
func (Order) GetList(c *gf.GinCtx) {pageNo := gf.Int(c.DefaultQuery("page", "1"))pageSize := gf.Int(c.DefaultQuery("pageSize", "10"))//搜索添条件param, _ := gf.RequestParam(c)whereMap := gmap.New()if gf.DbHaseField("business_ordermanage", "businessID") {whereMap.Set("businessID", c.GetHeader("Businessid"))}user, err := gf.ParseTokenGetInfo(c)if err != nil {gf.Failed().SetMsg("登录失效请重新登录!").SetCode(401).SetData(err).Regin(c)}whereMap.Set("uid", user.ID)if title, ok := param["title"]; ok && title != "" {whereMap.Set("title like ?", "%"+gf.String(title)+"%")}MDB := gf.Model("business_order").Where(whereMap)totalCount, _ := MDB.Clone().Count()list, err := MDB.Fields("id,uid,title,status,createtime,updatetime").Page(pageNo, pageSize).Order("id desc").Select()if err != nil {gf.Failed().SetMsg(err.Error()).Regin(c)} else {gf.Success().SetMsg("获取全部列表").SetData(gf.Map{"page":     pageNo,"pageSize": pageSize,"total":    totalCount,"items":    list}).Regin(c)}
}// 获取订单详情
func (Order) GetDetail(c *gf.GinCtx) {id := c.DefaultQuery("id", "")if id == "" {gf.Failed().SetMsg("请传参数订单id").Regin(c)} else {data, err := gf.Model("business_order").Where("id", id).Fields("id,uid,title,status,createtime,updatetime").Find()if err != nil {gf.Failed().SetMsg("获取内容失败").SetData(err).Regin(c)} else {gf.Success().SetMsg("获取订单详情").SetData(data).Regin(c)}}
}// 更新订单状态
func (Order) UpStatus(c *gf.GinCtx) {param, _ := gf.RequestParam(c)res, err := gf.Model("business_order").Where("id", param["id"]).Data(gf.Map{"status": param["status"]}).Update()if err != nil {gf.Failed().SetMsg("更新失败!").SetData(err).Regin(c)} else {msg := "更新成功!"if res == nil {msg = "暂无数据更新"}gf.Success().SetMsg(msg).SetData(res).Regin(c)}
}

我们会在终端看到GetList、GetDetail、UpStatus生成请求路由了,也就是可以调用这些接口,如下图:

我们细心的朋友可能发现,func 的函数前有个括号index和order两个写法不一样,这样我们和大家说明一下,func (Order) GetList(c *gf.GinCtx) {}中(Order)可以写成func (api *Order) GetList(c *gf.GinCtx) {}这种。func (Order)和func (api *Order)两种在我们示例都可以正常运行,写成func (Order)可以减少点代码,如果您写的业务有连锁操作需求再func (api *Order)这样通api去操作结构体内的变量值等操作。所以用不到api是可以省略,当然你留着也没有影响。

到此您就学会了使用框架新增功能了,同样的需要再现有的admin和business模块新增类或者一个接口也是同样操作,您就自己举一反三自己动手试试,反复写几次让自己对框架有深入了解,千万别急躁慢慢来,要自己多去探索,形成自学习惯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19132.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…

ABB 控制柜

1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴计算机板的接口、连接安全面板的接口、不同的现场总线卡接口(比…

OrangePi AIpro测评

文章目录 1、外观部分2、系统初探3、AI性能体验4、总结 首先非常感谢csdn以及香橙派能够提供这样一个平台,可以测试OrangePi AIpro这样一块开发板,这块板子给我的感觉还是非常不错的,非常适合用来作为嵌入式学习的板子,性能也达到…

什么是边缘计算网关?工业方向应用有哪些?天拓四方

在数字化时代,信息的传输与处理变得愈发重要,而其中的关键节点之一便是边缘计算网关。这一先进的网络设备,不仅扩展了云端功能至本地边缘设备,还使得边缘设备能够自主、快速地响应本地事件,提供了低延时、低成本、隐私…

matlab工具使用记录-编辑器和命令行窗口分开还原

工具:matlab2021b 场景:在使用软件的过程中,我们误操作将matlab的编辑器单独出来了。这时候对软件进行各种操作都还原不回去。 matlab中编辑器和命令行窗口分开了如下图所示。 这时候只需要使用快捷键在编辑器窗口按CtrlshiftD,…

linux Inodes满导致数据库宕机

项目经理反馈集群环境中有个节点无法使用了需要支援下,同时发过来截图说明磁盘还是有空的。 登录系统后直接发现问题 orcl2:/home/oracledb2> sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed May 29 13:59:21 2024 Copyright (c) 1982,…

摩尔线程MTT S4000 AI GPU助力30亿参数大模型训练,性能比肩英伟达同类解决方案

中国国产GPU制造商摩尔线程(Moore Threads)在AI加速器领域取得了显著进展,其最新推出的MTT S4000 AI GPU在训练大规模语言模型时表现突出,据称相较于其前代产品有着显著的性能提升。根据cnBeta的报道,搭载S4000 GPU的全新“酷鹅千卡智能计算集…

装机必备——截图工具Snipaste安装教程

装机必备——截图工具Snipaste安装教程 软件下载 软件名称:Snipaste2.7 软件语言:简体中文 软件大小:15.37M 系统要求:Windows7或更高, 32/64位操作系统 硬件要求:CPU2GHz ,RAM2G或更高 下载通…

探索AES对称加密:Python代码实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:从非对称到对称 二、AES加密机制概述 三、Python实现AES加密与解密 …

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象,new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

Llama改进之——RoPE旋转位置编码

引言 旋转位置编码(Rotary Position Embedding, RoPE)将绝对相对位置依赖纳入自注意力机制中,以增强Transformer架构的性能。目前很火的大模型LLaMA、QWen等都应用了旋转位置编码。 之前在[论文笔记]ROFORMER中对旋转位置编码的原始论文进行了解析,重点…

数据与结构——红黑树

目录 红黑树的概念 性质 结点的定义 插入 验证 查找 删除 红黑树与AVL树的比较 红黑树的概念 红黑树是一种自平衡二叉搜索树(Binary Search Tree, BST),其每个节点带有颜色属性,可以是红色或黑色。红黑树通过约束节点颜色…

未来已来:Facebook的数字革命与社交转型

在当今数字化时代,Facebook作为全球最大的社交网络之一,不仅扮演着连接人们的桥梁,更是引领着社交行业的数字革命与转型。本文将深入探讨Facebook如何通过创新技术、改变用户体验以及应对挑战,塑造了未来社交的面貌,以…

ozon卖家精灵,ozon卖家怎么使用

在跨境电商的浪潮中,OZON作为俄罗斯领先的电商平台,吸引了众多卖家争相入驻。然而,面对日益激烈的市场竞争,如何提升店铺的运营效果,成为卖家们迫切需要解决的问题。而OZON卖家精灵作为一款专为OZON卖家打造的辅助工具…

java高级——Collection集合之List探索(包含ArrayList、LinkedList、Vector底层实现及区别,非常详细哦)

java高级——Collection集合之List探索 前情提要文章介绍提前了解的知识点1. 数组2. 单向链表3. 双向链表4. 为什么单向链表使用的较多5. 线程安全和线程不安全的概念 ArrayList介绍1. 继承结构解析1.1 三个标志性接口1.2 AbstractList和AbstractCollection 2. ArrayList底层代…

民国漫画杂志《时代漫画》第32期.PDF

时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

去除字符串中的空格和特殊字符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用户在输入数据时,可能会无意中输入多余的空格,或在一些情况下,字符串前后不允许出现空格和特殊字符,…

Beego 使用教程 7:Web 文件上传下载和错误处理

beego 是一个用于Go编程语言的开源、高性能的 web 框架 beego 被用于在Go语言中企业应用程序的快速开发,包括RESTful API、web应用程序和后端服务。它的灵感来源于Tornado, Sinatra 和 Flask beego 官网:http://beego.gocn.vip/ 上面的 bee…

「清新题精讲」Skiers

更好的阅读体验 Skiers Description 给定 n n n 个点的有向无环平面图,求最少多少条从 1 1 1 到 n n n 的路径能覆盖原图的所有边? 1 ≤ n ≤ 5 1 0 3 1\le n\le 5\times10^3 1≤n≤5103 Solution 考虑从 1 1 1 到 n n n 的路径其实是边的链覆…

如何让你的网站能通过域名访问

背景 当我们租一台云服务器,并在上面运行了一个Web服务,我们可以使用云服务器的公网IP地址进行访问,如下: 本文主要记录如何 实现让自己的网站可以通过域名访问。 买域名 可以登录腾讯云等主流公有云平台的,购买域名…