Go语言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请已经为何首字母变小写,这问题请去:接口开发规范 这一节了解。

3aefed12497540b98ec06efd74f1cb93.png

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生成请求路由了,也就是可以调用这些接口,如下图:

a5a6d01683f4469e883ee0e2c76ae2ae.png

我们细心的朋友可能发现,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/19188.shtml

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

相关文章

存储器和CPU的连接与TCP的流量控制

存储器与CPU的连接 存储容量的拓展 (1)位拓展:增加存储字长 (2)字拓展 增加存储器字的数量 例题:设CPU有16根地址线,8根数据线,并用MREQ作为访问存储控制信号(低电平有效),WR作为…

CyberLink ColorDirector Ultra v12 解锁版安装教程 (视频后期调色软件)

前言 CyberLink ColorDirector Ultra 是一款视频后期调色处理软件,可以给视频进行专业色彩调整,让视频看起来焕然一新。它支持的格式视频非常多,流行的格式全都可以添加到里面进行调色处理,主要是使用关键帧控件进行颜色替换&…

【论文解读】OpenMix+: Revisiting Data Augmentation for Open Set Recognition

1、摘要 开集识别要求模型识别训练集中学习到的已知类样本,同时拒绝未学习到的未知类。与封闭集问题的结构风险最小化理论相比,开放集任务中的结构风险研究较少。本文指出结构风险与开放空间风险的平衡是开集识别的关键,并将其转化为开集结构…

12.可视化实现

时间过的很快,不知不觉已到第十二章。经过前面教程的讲解和实践,数据接入服务的功能已初步完成。 此章节将通过可视化的实现,对设备接入进行监控,实时监听设备的接入情况及设备的在线时长。 并且可以通过订阅按钮、取消订阅按钮、查看数据按钮,对上报数据进行实时的跟踪…

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧!!! 破电脑有吧!!! 那恭喜你,这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…

4月平板电脑行业线上销售数据分析

由于全球科技发展趋势,如AI技术的应用,以及厂商新品发布计划;同时,平板电脑作为个人电脑的延伸产品,其便携性和生产力相较于手机具有明显优势,这也为行业的进一步发展提供了动力。 据鲸参谋数据统计&#…

美团拼好饭小程序mtgsig1.2分析(补环境分析)

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未…

【高频】redis快的原因

相关问题: 1.为什么Redis能够如此快速地进行数据存储和检索? 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构,例如字符串、哈希表、列表、集合、有…

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/ │ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── tests/ │ ├── __init__.py │ ├── conftest.p…

【Linux】centos7编写C语言程序,补充:使用yum安装软件包组

确保已安装gcc编译器 C语言程序,一般使用gcc进行编译,需确保已安装gcc。 若没有,可以使用yum安装gcc(版本4.8.5),也可以使用SCL源安装gcc(例如:版本9.3)。 安装gcc&am…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

Linux网络编程: udp,tcp协议原理

Linux网络编程: udp,tcp协议原理 一.udp和tcp的介绍1.udp介绍1.udp的特点2.udp的适用场景3.udp效率分析 2.tcp介绍1.tcp的特点2.tcp的适用场景 二.udp协议原理1.udp协议段格式2.udp的缓冲区和全双工通信 三.tcp协议段1.tcp协议段格式2.发送接收缓冲区3.确认应答ACK机制,窗口大小…

C语言---文件操作

【C语言详解】——文件操作&#xff08;建议收藏&#xff09;_c语言 写文件原理-CSDN博客 一、文件的读取 # define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<errno.h> #include<string.h>int main() {FILE * pffopen("C:\\Users\\zhw\\De…

Java设计模式 _行为型模式_观察者模式

一、观察者模式 1、观察者模式 观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象。 2、实现思路 &#xff08;1&#xff09;、定义被观察者的行为&…

Python Selenium 详解:实现高效的UI自动化测试

落日余辉&#xff0c;深情不及久伴。大家好&#xff0c;在当今软件开发的世界中&#xff0c;自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中&#xff0c;UI自动化测试是不可或缺的一部分&#xff0c;它可以帮助测试团队快速验证用户界面的正确性…

Django学习

1.pycharm社区版创建django PyCharm社区版如何创建Django项目并运行_pycharm社区版打开django-CSDN博客 2.Django TemplateDoesNotExist: rest_framework 当我们使用djangorestframework框架时&#xff0c;首先下载pip install djangorestframework 参考博文Django Templat…

MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

算法思路介绍&#xff1a; 1. 数据准备阶段&#xff1a; 生成一个合成数据集 X&#xff0c;其中包含三个簇&#xff0c;每个簇分布在不同的区域。 定义聚类层数 L 和每个层次的子集数量 l。 2. 聚类阶段&#xff1a; 使用K均值聚类算法将初始数据集 X 分成 l 个簇。…

Marin说PCB之如何在主板上补偿链路中的走线的等长误差?

一场雨把我困在这里&#xff0c;你冷漠地看我没有穿雨衣淋成落汤鸡。今天刚刚出门时候看天气预报没有雨&#xff0c;于是我就没有带雨衣骑电动车去公司了&#xff0c;谁知道回来的路上被淋成狗了。天气预报就像是女人的脾气那样&#xff0c;不能完全相信的。 好了&#xff0c;我…

编译安装MySQL服务(LAMP2)

目录 1.初始化设置&#xff0c;将安装mysql 所需软件包传到/opt目录下 &#xff08;1&#xff09;关闭防火墙 &#xff08;2&#xff09;上传软件包到/opt目录 2.安装环境依赖包 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目…

JavaScript-JavaWeb

目录 什么是JavaScript? js引入方式 js基础语法 书写语法 变量 数据据类型 运算符 类型转换 流程语句 js函数 js对象 1.Array 2.String 3.JSON js事件监听 什么是JavaScript? ● JavaScript(简称:JS)是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能…