技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-6.GO语言做通用CRUD接口-1
相关文章:
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-1.工具和本地环境
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-2.启动项目
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-3.接收json数据
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-4.连接mongodb数据库
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-5.跨域并跨域传输数据
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-6.GO语言做通用CRUD接口-1
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-7.GO语言做通用CRUD接口-2
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-8.模型的关联——无限层级分类
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-9.管理员及登录注册功能的实现
技能学习:学习使用golang(gin框架) + vue.js,开发前端全栈网站-10.生产环境编译
1.什么是CRUD
CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。
目的是我们将常用的增、删、改、查操作封装在一套接口组件中,在多个功能中重复调用这一套接口组件,从而使代码更精简,同时提升开发效率。
2.接口优化准备
(1)数据模型:
这是两个表的数据机构的定义,当我们需要传输user表时,就要使用user结构封装传过来的form;当我们需要传输category表时,就要使用category结构封装form。
实际上我们封装的数据结构就是所谓的数据模型,所以我们在正式优化接口之前,可以先将两个数据库模型封装到models文件夹,使接口文件内更简洁易查。
先封装user模型:
接口文件中删除user表接口,同时引入命名空间:
下面使用到user结构的接口都把外部user的模型结构赋值给新的user,格式同样为type:
编译启动接口进行测试,外置模型导入成功:
以同样的方法外置category.go:
删除原定义的category结构模型:
使用到category模型的地方进行引入定义:
到此我们将全部的模型外置定义成功。
(2)比对文件中两个数据表的接口:
比对中我们可以看出,两个接口的不同点就在于数据表的表名和模型名不同,而各自的表名和模型名都用得相同,所以我们目前需要解决的就只有category和user这两个值得传入。
3.接口优化,RESTFUL风格的接口
rest是一种接口设计风格,大家感兴趣的百度查一查。下面我们直接代码讲解。
(1)首先看一下GIN框架对restful风格接口的说明:
我在百度搜的中文文档,应该是一个GO大神自己写的,切一下他的内容:
分别使用增(POST)删(DELETE)改(PUT)查(GET)的方法,对一个接口函数进行操作。
(2)修改server端路由地址接口:
修改前,接口杂乱,每个接口都对应一个操作:
修改后,只用四个接口方法,并针对其进行路由地址定义:
// 配置路由
func Main(e *gin.Engine) {// 全局使用中间件e.Use(Cors())// 定义路由,调用接口函数// 增e.POST("/admin/api/rest/:resource", insert)// 删e.DELETE("/admin/api/rest/:resource/*id", delete)// 改e.PUT("/admin/api/rest/:resource/*id", update)// 查e.GET("/admin/api/rest/:resource", findAll)// 根据id查某数据e.GET("/admin/api/rest/:resource/*id", find)
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
其中,使用到gin框架中的API接口参数的路由方法,冒号后传值,传入的第一个值resource为我们需要的表名(模型名),第二个值id(做到根据数据的id对数据进行删、改、查)。
接口路由路径解释:admin 端的接口 api 下面的 rest ful 风格api,携带参数资源 resource ,某些操作需要再加一个id。
(3)修改路由方法:
将之前新定义的category方法都删掉,只留下增、删、改和两个查的方法,函数名分别对应配置好的路由接口中的函数名insert,delete,update,find,find_all。
先对insert方法进行修改:
// 插入数据 func insert(ctx *gin.Context){
<span class="token comment">// 解析api参数</span> resource <span class="token operator">:=</span> ctx<span class="token punctuation">.</span><span class="token function">Param</span><span class="token punctuation">(</span><span class="token string">"resource"</span><span class="token punctuation">)</span><span class="token comment">// 连接mongodb服务</span> url <span class="token operator">:=</span> <span class="token string">"mongodb://127.0.0.1"</span> <span class="token comment">// 设置数据库一致性模式</span> <span class="token comment">// 连接数据库操作,该操作赋值给session</span> <span class="token comment">// err值必写,用于错误处理</span> session<span class="token punctuation">,</span> err <span class="token operator">:=</span> mgo<span class="token punctuation">.</span><span class="token function">Dial</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span> <span class="token comment">// 后边程序执行的err与go程序比对,若有错误则返回错误内容</span> <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span> <span class="token function">panic</span><span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{<!-- --></span><span class="token comment">// 若没有错误,则在页面返回字符串,显示插入成功</span>ctx<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusOK<span class="token punctuation">,</span> <span class="token string">"插入成功"</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// defer用法大家自行百度,我解释不清</span> <span class="token keyword">defer</span> session<span class="token punctuation">.</span><span class="token function">Close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token comment">// 设置数据库一致性模式,就当作打开数据库</span> session<span class="token punctuation">.</span><span class="token function">SetMode</span><span class="token punctuation">(</span>mgo<span class="token punctuation">.</span>Monotonic<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token comment">// 找到某数据库下的某数据表</span> c <span class="token operator">:=</span> session<span class="token punctuation">.</span><span class="token function">DB</span><span class="token punctuation">(</span><span class="token string">"db_go"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">C</span><span class="token punctuation">(</span>resource<span class="token punctuation">)</span> <span class="token comment">// 以上为连接数据库</span><span class="token keyword">if</span> resource <span class="token operator">==</span> <span class="token string">"user"</span> <span class="token punctuation">{<!-- --></span><span class="token keyword">type</span> modelName models<span class="token punctuation">.</span>User<span class="token comment">// 使用user数据模型</span><span class="token keyword">var</span> form modelName<span class="token comment">// 如果传值格式不符合上方定义的结构,则返回错误信息</span><span class="token keyword">if</span> err <span class="token operator">:=</span> ctx<span class="token punctuation">.</span><span class="token function">Bind</span><span class="token punctuation">(</span><span class="token operator">&</span>form<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span>ctx<span class="token punctuation">.</span><span class="token function">JSON</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusBadRequest<span class="token punctuation">,</span> gin<span class="token punctuation">.</span>H<span class="token punctuation">{<!-- --></span><span class="token string">"error"</span><span class="token punctuation">:</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token keyword">return</span><span class="token punctuation">}</span><span class="token comment">// 此时&form就继承了上方定义的结构格式</span><span class="token comment">// 插入数据,并将insert状态传值给err</span>err <span class="token operator">=</span> c<span class="token punctuation">.</span><span class="token function">Insert</span><span class="token punctuation">(</span><span class="token operator">&</span>form<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> resource <span class="token operator">==</span> <span class="token string">"category"</span> <span class="token punctuation">{<!-- --></span><span class="token keyword">type</span> modelName models<span class="token punctuation">.</span>Category<span class="token comment">// 使用user数据模型</span><span class="token keyword">var</span> form modelName<span class="token comment">// 如果传值格式不符合上方定义的结构,则返回错误信息</span><span class="token keyword">if</span> err <span class="token operator">:=</span> ctx<span class="token punctuation">.</span><span class="token function">Bind</span><span class="token punctuation">(</span><span class="token operator">&</span>form<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{<!-- --></span>ctx<span class="token punctuation">.</span><span class="token function">JSON</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusBadRequest<span class="token punctuation">,</span> gin<span class="token punctuation">.</span>H<span class="token punctuation">{<!-- --></span><span class="token string">"error"</span><span class="token punctuation">:</span> err<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token keyword">return</span><span class="token punctuation">}</span><span class="token comment">// 此时&form就继承了上方定义的结构格式</span><span class="token comment">// 插入数据,并将insert状态传值给err</span>err <span class="token operator">=</span> c<span class="token punctuation">.</span><span class="token function">Insert</span><span class="token punctuation">(</span><span class="token operator">&</span>form<span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token comment">// ctx.String(http.StatusOK, fmt.Sprintf(resource))</span>
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_728059.aspx
如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!