zoukankan      html  css  js  c++  java
  • 用golang实现一个小程序商城后台系统(moshopserver)

    用golang实现一个小程序商城后台系统(moshopserver)

    golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一些资料,有些人说很容易上手,确实是这样,和C/C++比起来,少了很多乱七八糟的语法。学一门新的语言,最好的方法就是动手写一些东西,最近小程序也比较火,也想学一下,网络上搜索的一些开源项目,基本上没有golang实现的,大部分都是nodejs和java写的,那么我就来实现一个golang版的吧,一石二鸟。

    开发小程序前后端都需要开发,自己的前端经验很少,搜索了一些开源代码,有一个小程序项目让人眼前一亮,Nideshop,界面做的不错,代码结构也清晰,而且前后端都实现了,自己的目标是学习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貌似没有自动生成的功能。采用了一个开源库go-xorm/cmd,最后生成的数据库表像下面这样,奇怪的是没有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的生成验证使用了jwt-go这个第三方库,使用这个库通过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)
    

    使用的是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

    客户端小程序界面截图

    最后附几张截图

    首页

    专题

    分类

    商品列表

    商品详情

    购物车

  • 相关阅读:
    VS2008编写MFC程序--使用opencv2.4()
    November 02nd, 2017 Week 44th Thursday
    November 01st, 2017 Week 44th Wednesday
    October 31st, 2017 Week 44th Tuesday
    October 30th, 2017 Week 44th Monday
    October 29th, 2017 Week 44th Sunday
    October 28th, 2017 Week 43rd Saturday
    October 27th, 2017 Week 43rd Friday
    October 26th, 2017 Week 43rd Thursday
    October 25th, 2017 Week 43rd Wednesday
  • 原文地址:https://www.cnblogs.com/harlanc/p/10995253.html
Copyright © 2011-2022 走看看