开源⼀个golang⼩程序商城后台系统(moshopserver)
开源⼀个golang⼩程序商城后台(moshopserver)
golang和c/c++⽐起来是⼀门新的语⾔,⼀直想学,⽹上搜集了⼀些资料,有些⼈说很容易上⼿,确实是这样,和C/C++⽐起来,少了很多乱七⼋糟的语法。学⼀门新的语⾔,最好的⽅法就是动⼿写⼀些东西,最近⼩程序也⽐较⽕,也想学⼀下,⽹络上搜索的⼀些开源项⽬,基本上没有golang实现的,⼤部分都是nodejs和java写的,那么我就来实现⼀个golang版的吧,⼀⽯⼆鸟。
开发⼩程序前后端都需要开发,⾃⼰的前端经验很少,搜索了⼀些开源代码,有⼀个⼩程序项⽬让⼈眼前⼀亮,,界⾯做的不错,代码结构也清晰,⽽且前后端都实现了,⾃⼰的⽬标是学习golang和⼩程序,⼲脆⽤golang重写nideshop吧。
Web框架的选择
nodejs和java已经⼀些很成熟的框架了,⽐如nodejs的thinkjs,java的spring框架。golang最近⼏年才⽕起来,有⼀些web框架也⽐较新,有下⾯⼀些框架:
Beego:开源的⾼性能 Go 语⾔ Web 框架。
Buffalo:使⽤ Go 语⾔快速构建 Web 应⽤。
Echo:简约的⾼性能 Go 语⾔ Web 框架。
Gin:Go 语⾔编写的 Web 框架,以更好的性能实现类似 Martini 框架的 API。
Iris:全宇宙最快的 Go 语⾔ Web 框架。完备 MVC ⽀持,未来尽在掌握。
Revel:Go 语⾔的⾼效、全栈 Web 框架。
Beego是国⼈写的框架,⽂档很全,例⼦也不少,⽤的⼈也多,最后决定⽤这个框架。
使⽤xorm⽣成数据库model
数据库采⽤的是mysql,使⽤golang读写mysql beego已经实现了orm框架。但是数据库表需要⽣成对应的struct,beego的orm貌似没有⾃动⽣成的功能。采⽤了⼀个开源库,最后⽣成的数据库表像下⾯这样,奇怪的是没有json标签,⽽且这个xorm标签,最后golang不认报了错。还有⼀个问题是有些字段类型xorm⽣成错了。⽐如,数据库中的DECIMAL字段,xorm⽣成的结构体中的字段类型为string,这个显然是错误的。
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框架结构
moshopserver的框架结构很清晰也很简单。
前端⼩程序发起HTTP请求到Router(router转发请求的各个阶段能做⼀些过滤,这个后⾯要说⼀下),router识别出请求链接,将其转发到相应的controller上⾯。还有三个底层的package:
models
单纯和数据库打交道的接⼝都放在这个package下⾯。
services
主要实现了三类功能,和交互的接⼝,快递查询接⼝和token⽣成,检测接⼝。
Utils
⼀些基本的功能函数放在这个package下⾯。
Token验证
token的⽣成验证使⽤了这个第三⽅库,使⽤这个库通过token来解析出userID,创建和验证token是否过期,整个交互流程是下⾯这样⼦:
1. ⼩程序打开的时候默认不登录,调⽤后台接⼝,因为没有token,解析不出来userid,返回⼩程序段
提⽰⽤户登录。
2. ⼩程序调⽤后台服务获取userinfo,调⽤moshopserver后台登录接⼝。
3. 后台接⼝调⽤后台,解密userInfo中的相关字段,⽣成⼀条⽤户信息插⼊moshopserver数据库中。然后从数据库中取出
userid,⽣成带过期时间的token。返回给⼩程序。
4. ⼩程序调⽤后台接⼝,将token存储到服务端。接下来每次调⽤moshopserver后台,都要从后台取出token,然后传递
到moshopsever后台。
5. 如果token过期或者⽆效,后端解析不出userid,返回给⼩程序,让其再次登录。⽣成新的token。如此反复。
Router过滤器
Nideshop中做了⼀些设计,有些接⼝即使token过期也能访问,不需要提⽰⽤户再次登录。moshopserver中也实现了这个功能。采⽤了beego中的过滤器:
beego.InsertFilter("/api/*", beego.BeforeExec, services.FilterFunc, true, true)
go和java后端开发劣势使⽤的是BeforeExec参数,这个阶段Router已经识别出了Controller和Action的具体类型,我们可以⾃⼰加判断,到底哪些Controller和Action需要⽤户登录权限,这些Controller和action放在了配置⽂件f中:
[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,欢迎提问题。
客户端⼩程序界⾯截图
最后附⼏张截图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论