GoFly快速开发框架的utils-plugin扩展包开发演示教程

说明

本插件是教大家如何开发框架utils->plugin下扩展插件包,在开发时可安装本插件,参考本插件代码结构写你插件,这样可以达到规范插件代码,同时也也是为了兼容你安装其他人在代码仓通过扩展插件包,如果不规范可能发生在utils->plugin包下函数命名冲突,代码规范也是方便在app业务代码中调用和代码维护。 

扩展插件开发规范

这里我们用demo名称作为演示教程扩展插件包名称,下面都以demo名称讲,在你实际开发你的扩展插件包是替换成你取包名,下面将按照开流程讲述开发过程。

1.扩展插件包取名

名称建议用英文字母,结果可以使用驼峰名称法。取好名称后在你使用前,先到后端的开发者工具->代码仓的右上角的“检测包名”,输入你取的包名,检测通过在点“立即占用”来占用你取的包名,如下图:

2.创建扩展包文件及目录

在utils->plugin目录下创建一个xx.go文件和xx文件夹,切记这文件和文件夹命名必须一样,否则打包选择xx.go时不能把它对应的xx文件夹一同打包到zip压缩包里,其中xx是你要开发扩展包名称,例如我们当前演示名称为demo 

目录机构如下:

├─ utils                  # 框架核心代码及工具包
│ ├─ plugin              # 框架扩展目录
│ │ ├─ demo             # 扩展插件功能文件目录
│ │ │ ├─ example.go    # 插件功能函数
│ │ │ └─ util.go       # 通用工具函数
│ │ └─ demo.go          # 扩展插件入口文件(主文件)

3.util.go文件

util.go是给demo目录下插件功能函数公共调用函数,比如统一或插件配置文件内容,公用处理某个功能函数等,本例演示的demo是读取配置文件并配件请求地址,代码如下:

// ---
// @title 通用工具函数
// @des util就是用于编写插件公用的工具函数,如果没有公用函数就不用创建util.go
// 下面给的GetUrl和RequestHttp两个是为了演示用的,在开发是大家更加业务自己编写
package demoimport ("fmt""gofly/utils/gf""gofly/utils/tools/gconv"
)// 这获取resource/config下名称和plugin扩展插件名字一样配置文件,本例就是获取demo.yaml配置数据
var (cosdata, _ = gf.GetConfByFile("demo")CosConf    = gconv.Map(gconv.Map(cosdata)["data"])
)// 获取完整请求地址
func GetUrl(path string) string {return fmt.Sprintf("%v%v", CosConf["url"], path)
}

4.插件的功能函数(example.go)

这是编写具体功能函数文件,每个文件编写同一类型功能(这个经典例子可以安用Zinc全文搜索引擎这个插件就按照Index.go索引,Doc.go文档分类)。演示插件是在example.go中写业务代码,文件创建一个名称和文件名一样的结构体,但是名字首字母必须是大写,如:Example 还有把(api *Example)结构添加到函数前面,这样我们在调用时就可以链式操作了。演示代码中的GetData和GetList是功能函数,它就是处理指定的功能。好有后面的Page和FindTitle是给结构体内变量赋值,在调用功能函数(GetData和GetList)前调用Page和FindTitle类设置PageNum、PageSize、Title的值。

代码如下:

// ---
// @title 实现功能
// @des 这里是实现具体功能,我们某一分类的功能放在一起,如果多个类型功能我们就创建多个文件。
// 这里的example.go是给大家演示功能用的,所以我们取名example,在开发中更加实际业务取名。
package demoimport ("fmt"
)
// 插件功能类名称
type Example struct {PageNum  int    //页数PageSize int    //条数Title    string //通过标题进行模糊查询
}// 测试获取单条数据
// 参数:devcode=传给接口数据
func (api *Example) GetData(devcode interface{}) (res string, err error) {weburl := GetUrl(fmt.Sprintf("/business/cronjob/getTest?dev_code=%v", devcode))res, err = RequestHttp("GET", weburl, "")return
}// 测试获取列表数据
func (api *Example) GetList() (res string, err error) {weburl := GetUrl(fmt.Sprintf("/business/createcode/product/getList?page=%v&pageSize=%v&title=%v", api.PageNum, api.PageSize, api.Title))res, err = RequestHttp("GET", weburl, "")return
}// -------------------------这里写接口的属性链式操作--------------------------
// 设置分页数据
func (api *Example) Page(page, pagesize int) *Example {api.PageNum = pageapi.PageSize = pagesizereturn api
}// 设置查询的标题内容
func (api *Example) FindTitle(title string) *Example {api.Title = titlereturn api
}

5.扩展插件入口文件(主文件)

这里是让app下业务代码可以用plugin去调用插件函数,在这里我们把插件做统一调用实例化,这样在使用时可以直接通过扩展插件名去调用函数。如果你的插件功能简单代码不复杂则可以直接在这个文件写完,不需要再创建一个同名称的文件夹来写写具体功能函数。在下面的演示代码我们看到NewDemo是给插件统一实例化入口函数,func (*Demo) Example() *demo.Example{}是把插件对应目录下功能类文件关联到Demo插件下,这样可以用Demo.Example调用具体函数了,并且在实例Example同时可给他结构体内变量的默认值。

演示插件代码如下:

// ---
// @title Demo扩展插件的入口文件
// @des
package pluginimport ("gofly/utils/plugin/demo"
)// 创建插件结构-要求与文件名一致,首字母必须大写,不然app下的应用无法调用
type Demo struct{}// Demo接口实例
func NewDemo() *Demo {return &Demo{}
}// 把demo下的功能函数example
func (*Demo) Example() *demo.Example {return &demo.Example{PageNum: 1, PageSize: 10}
}

到这里我们扩展插件就开发好了,下面我们在讲如何在app下的业务代码中调用扩展插件。

在app的业务代码中调用示例

我们测试模块app/business/createcode中创建一个demo.go文件来测试调用扩展插件接口,测试代码中我们先import导入"gofly/utils/plugin"扩展包,然后用plugin.扩展插件实例函数.功能文件名.功能函数,即:pluginplugin.NewDemo().Example().GetData(),之间还根据需求添加属性设置函数如Page(1, 10)设置分页数据,这样我们就可以格式清晰的使用扩展插件功能了。

测试调用代码如下:

package createcodeimport ("gofly/utils/gf""gofly/utils/plugin"
)// 测试demo演示插件接口
type Demo struct{}func init() {fpath := Demo{}gf.Register(&fpath, fpath)
}// 测试获取单条数据
func (api *Demo) GetData(c *gf.GinCtx) {param, _ := gf.RequestParam(c)res, err := plugin.NewDemo().Example().GetData(param["title"])if err != nil {gf.Failed().SetMsg("测试获取单条数据失败").SetData(err).Regin(c)return}gf.Success().SetMsg("测试获取单条数据成功").SetData(res).Regin(c)
}// 测试获取数据列表
func (api *Demo) GetList(c *gf.GinCtx) {param, _ := gf.RequestParam(c)res, err := plugin.NewDemo().Example().Page(1, 10).FindTitle(gf.String(param["title"])).GetList()if err != nil {gf.Failed().SetMsg("测试获取数据列表失败").SetData(err).Regin(c)return}gf.Success().SetMsg("测试获取数据列表成功").SetData(res).Regin(c)
}

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

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

相关文章

Bolt 一款AI 全栈 Web 在线开发工具

参考: https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入,比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

eUSB2规范介绍

一、说明 eUSB的全称是Embedded USB2,也支持低速、全速和高速三个速率,不过降低了电压幅值,从而使SOC更小、功耗更低,主要应用在芯片间互联,如需应用在设备间传输,一般需要加中继器。 eUSB2还支持USB2.0协议,仅物理层要求不同。 eUSB2支持2个模式:原生模式(native m…

深度学习基础知识-02 数据预处理

深度学习的数据预处理通常包括: 1.数据清洗:去除错误或不完整的数据。 2.归一化:调整数据范围,如将像素值缩放到0-1。 3.数据增强:通过旋转、缩放等方法增加数据多样性。 4.数据划分:将数据分为训练集、验证…

Flume面试整理-Flume与其他数据收集工具的比较

Apache Flume 是一个流行的数据收集工具,但在大数据领域,还有许多其他工具可用于数据收集和传输,如 Apache Kafka、Logstash、Filebeat 等。每个工具都有其独特的优势和使用场景。下面是 Flume 与其他常见数据收集工具的详细比较,包括功能、性能、扩展性等多个方面。 1. Fl…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎,使用CPU进行推理,适合有显卡或者没有显卡windows x64系统均可,不支持macOS和Linux系统,不支持x86的windows操作系统。由于采用CPU推理,要比GPU慢。…

Turn-it:调整它:优化线材重构雕塑制造

🐨文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略,通过调整目标形状以适应电线弯曲机,然后由人工将其弯曲回目标形状。(机器弯曲人工弯曲) 该方法通过两阶段弯曲策略实现&a…

矩阵相关算法

矩阵旋转90度 给定一个 n n 的二维矩阵 matrix 表示一个图像&#xff0c;请你将图像顺时针旋转 90 度。 #include <iostream> #include <vector>using namespace std;void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 第一步…

tsp 车联网功GB32960

https://github.com/zhengyishan/tsp 基于GB32960协议数据接入网关 dyy-gateway-server 功能:车联网数据接入网关主要技术:Netty,Kafka,内存Redis二级缓存/订阅发布特点:高性能,高并发,高可用,支持K8S同POD多副本集群部署,横向拓展扩容测试简介:基于4c8g云虚拟主机,IO密集型机…

王爽汇编语言第三版实验2

实验任务 (1)使用Debug&#xff0c;将下面的程序段写 入程序&#xff0c;逐条进行&#xff0c;根据指令执行后的实际运行情况填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;axC0EAH add ax,[2] ;axCOFCH mov bx,[4] ;bx30F0H add …

Flink消费Kafka实时写入Doris

本文模拟实际生产环境&#xff0c;通过FileBeat采集日志信息到Kafka&#xff0c;再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种&#xff1a;Flume、Logstash和…

基于SpringBoot+Vue+uniapp微信小程序的校园反诈骗微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Python 爬虫实战与技巧分享--urllib

Python 爬虫实战与技巧分享–urllib 在当今信息时代&#xff0c;数据的价值日益凸显。Python 爬虫作为一种强大的数据获取工具&#xff0c;能够帮助我们从互联网上抓取各种有价值的信息。本文将结合具体代码示例&#xff0c;深入探讨 Python 爬虫的相关知识和关键要点。 一、…

Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇

Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 开始撰写 从基础分析篇我们得到了三个类&#xff0c;面板基类&#xff0c;管理类和面板子类 那就从面板基类开始&#xff0c;定义其基本行为 面板基类 基本方法都很简单&#xff0c;分别是首次加载并打开…

[含文档+PPT+源码等]精品基于springboot实现的原生微信小程序小区兼职系统

基于Spring Boot实现的原生微信小程序小区兼职系统背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、技术背景 移动互联网的普及&#xff1a;随着移动互联网的快速发展&#xff0c;微信小程序作为一种轻量级应用&#xff0c;因其无需下载安装、即用即走的特点&am…

基于STM32设计的智能婴儿床(华为云IOT)(244)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成【4】ESP8266工作模式配置1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要1.4 开发工具的选择【1…

SSD |(七)FTL详解(中)

文章目录 &#x1f4da;垃圾回收&#x1f407;垃圾回收原理&#x1f407;写放大&#x1f407;垃圾回收实现&#x1f407;垃圾回收时机 &#x1f4da;解除映射关系&#x1f4da;磨损均衡 &#x1f4da;垃圾回收 &#x1f407;垃圾回收原理 ✋设定一个迷你SSD空间&#xff1a; 假…

解决ImageIO无法读取部分JPEG格式图片问题

解决ImageIO无法读取部分JPEG格式图片问题 问题描述 我最近对在线聊天功能进行了一些内存优化&#xff0c;结果在回归测试时&#xff0c;突然发现有张图片总是发送失败。测试同事把问题转到我这儿来看&#xff0c;我仔细检查了一下&#xff0c;发现是上传文件的接口报错&#…

获取非加密邮件协议中的用户名和密码——安全风险演示

引言 在当今的数字时代,网络安全变得越来越重要。本文将演示如何通过抓包工具获取非加密邮件协议中的用户名和密码,以此说明使用非加密协议的潜在安全风险。通过这个演示,我们希望能提高读者的安全意识,促使大家采取更安全的通信方式。 注意: 本文仅用于教育目的,旨在提高安全…

每日一题学习笔记——移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出…

Android开发蒙版引导操作功能

Android开发蒙版引导操作功能 复杂的功能&#xff0c;往往需要在上面加一层蒙版引导用户操作 一、思路&#xff1a; 堆积布局方式 二、效果图&#xff1a; 三、关键代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <FrameLayout x…