golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了不少乱七八糟的语法。学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟。前端
开发小程序先后端都须要开发,本身的前端经验不多,搜索了一些开源代码,有一个小程序项目让人眼前一亮,Nideshop,界面作的不错,代码结构也清晰,并且先后端都实现了,本身的目标是学习golang和小程序,干脆用golang重写nideshop吧。java
nodejs和java已经一些很成熟的框架了,好比nodejs的thinkjs,java的spring框架。golang最近几年才火起来,有一些web框架也比较新,有下面一些框架:node
Beego是国人写的框架,文档很全,例子也很多,用的人也多,最后决定用这个框架。mysql
数据库采用的是mysql,使用golang读写mysql beego已经实现了orm框架。可是数据库表须要生成对应的struct,beego的orm貌似没有自动生成的功能。采用了一个开源库go-xorm/cmd,最后生成的数据库表像下面这样,奇怪的是没有json标签,并且这个xorm标签,最后golang不认报了错。还有一个问题是有些字段类型xorm生成错了。好比,数据库中的DECIMAL字段,xorm生成的结构体中的字段类型为string,这个显然是错误的。c++
type NideshopAd struct { AdPositionId int `xorm:"not null default 0 index SMALLINT(5)"` Content string `xorm:"not null default '' VARCHAR(255)"` Enabled int `xorm:"not null default 1 index TINYINT(3)"` EndTime int `xorm:"not null default 0 INT(11)"` Id int `xorm:"not null pk autoincr SMALLINT(5)"` ImageUrl string `xorm:"not null TEXT"` Link string `xorm:"not null default '' VARCHAR(255)"` MediaType int `xorm:"not null default 0 TINYINT(3)"` Name string `xorm:"not null default '' VARCHAR(60)"` }
moshopserver的框架结构很清晰也很简单。git
前端小程序发起HTTP请求到Router(router转发请求的各个阶段能作一些过滤,这个后面要说一下),router识别出请求连接,将其转发到相应的controller上面。还有三个底层的package:github
modelsgolang
单纯和数据库打交道的接口都放在这个package下面。web
servicesspring
主要实现了三类功能,和微信交互的接口,快递查询接口和token生成,检测接口。
Utils
一些基本的功能函数放在这个package下面。
token的生成验证使用了jwt-go这个第三方库,使用这个库经过token来解析出userID,建立和验证token是否过时,整个交互流程是下面这样子:
Nideshop中作了一些设计,有些接口即便token过时也能访问,不须要提示用户再次登陆。moshopserver中也实现了这个功能。采用了beego中的过滤器:
beego.InsertFilter("/api/*", beego.BeforeExec, services.FilterFunc, true, true)
使用的是BeforeExec参数,这个阶段Router已经识别出了Controller和Action的具体类型,咱们能够本身加判断,到底哪些Controller和Action须要用户登陆权限,这些Controller和action放在了配置文件api.conf中:
[controller] publicController= {'index','catalog','topic','auth','goods','brand','search','region'} [action] publicAction={'comment/list','comment/count','cart/index','cart/add','cart/checked','cart/update','cart/delete','cart/goodscount','pay/notify'}
若是HTTP请求连接的Controller和Action都不在配置文件中,则跳过接口调用,直接返回小程序提示其进行从新登陆。
moshopserver仍是有一些bug,由于测试不够充分,应该也还存在一些未知的bug,之后慢慢修复。
已经问题:
欢迎Star,欢迎提问题。
https://github.com/harlanc/moshopserver
最后附几张截图