这里尽量简单化一点。包含一个获取openid的功能。以及保存用户信息到数据库的功能。
技术点的话就是数据库,参数校验,以及第三方接口调用。
只有简单的两个文件。若是有bug,大家多切磋。
这里有一个问题。如果是设置json,把这个结构体的属性转成小写开头。从前端向后端传递属性的时候,ParseForm还是需要大写。不知道有没有一种办法,可以全部使用小写开头?
package models
import (
"fmt"
"github.com/astaxie/beego/orm"
_ "github.com/go-sql-driver/mysql"
"github.com/astaxie/beego"
// "github.com/astaxie/beego/orm"
"time"
)
var (
mysqluser=beego.AppConfig.String("mysqluser")
mysqlpass=beego.AppConfig.String("mysqlpass")
mysqlurls=beego.AppConfig.String("mysqlurls")
mysqldb=beego.AppConfig.String("mysqldb")
)
type Param map[string]interface{}
type StringParam map[string]string
type Resp struct{
Code int //`json:"code"//`
Msg string //`json:"msg"//`
Data interface{} //`json:"data"//`//map[string]interface{}
}
type Customer struct{//如果需要json化的时候转成小写可以这样写。 `orm:"auto;pk" json:"id"`中间用空格分开。
Id int `orm:"auto;pk" `//json:"id"`
AliasName string `orm:"null" `//json:"aliasName"`
UnionId string `orm:"null" `//json:"unionId"`
OpenId string `orm:"unique" `//json:"openId"`
Phone string `orm:"unique;null" `//json:"phone"`
Money float32 `orm:"default(0)" `//json:"money"`
CarLicence string `orm:"null" `//json:"carLicence"`
}
func init() {
// orm.RegisterDriver("mysql", orm.DR_MySQL)
orm.DefaultTimeLoc = time.Local
orm.RegisterDataBase("default", "mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",mysqluser,mysqlpass,mysqlurls,mysqldb), 30)
orm.RegisterModel(new(Customer))
beego.Info("orm模块初始化完成。")
}
// weixinCtrl
package controllers
/**
设置代理。
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=on # 必须是小写on
下载好了这个资源包。就需要把这个模块关掉
设置off。
go env -w GO111MODULE=off
//自动路由的时候用纯小写来访问。/weixinminiprogram/get
*/
import (
"fmt"
"github.com/astaxie/beego"
// "net/http"
// "encoding/xml"
"weixin_public_plateform/models"
// "strings"
// "time"
// "reflect"
// // "github.com/astaxie/beego/context"
// "regexp"
"github.com/astaxie/beego/validation"
"github.com/astaxie/beego/httplib"
"github.com/astaxie/beego/orm"
"strconv"
)
var (
weixinminiprogramappid=beego.AppConfig.String("weixinminiprogramappid")
weixinminiprogramappsecret=beego.AppConfig.String("weixinminiprogramappsecret")
jscode2sessionUrl="https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
valid = validation.Validation{}
o = orm.NewOrm()
)
func CheckValid(valid *validation.Validation,c interface{}) bool{
var msg string
if valid.HasErrors() {
// 如果有错误信息,证明验证没通过
// 打印错误信息
// for _, err := range valid.Errors {
// beego.Error("参数校验未能通过。",err.Key, err.Message)
// }
err:=valid.Errors[0]
msg= fmt.Sprintf("参数校验未能通过。%s:%s",err.Key, err.Message)
}else{
msg =""
}
//要进行复用,必须在每次验证之后进行清除。要注意,为了清除,必须传指针。
valid.Clear()
if msg!=""{
c.(*beego.Controller).Data["json"]=models.Resp{500,msg,nil}
c.(*beego.Controller).ServeJSON()
// (*beego.Controller)(c).Data["json"]=models.Resp{500,msg,nil}
// (*beego.Controller)(c).ServeJSON()
panic(msg)//通过这个来阻断函数的执行,不需要再处理返回值了。
return false
}
return true
}
type WeixinMiniprogramController struct {
beego.Controller
}
func (c *WeixinMiniprogramController) Get() {
//参考文档。https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
//GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
js_code:=c.GetString("js_code")
valid.Required(js_code,"js_code")
CheckValid(&valid,(*beego.Controller)(&c.Controller))
// if !chk {
// return
// }
// beego.Error("错误信息。是否有阻断?",chk)
var result map[string]interface{}
httplib.Get(fmt.Sprintf(jscode2sessionUrl,weixinminiprogramappid,weixinminiprogramappsecret,js_code)).ToJSON(&result)
beego.Info("jscode2session返回结果。",result)
c.Data["json"]=&models.Resp{Data:result} //这里需要注意。返回结果是设置到c.Data["json"]而不是c.Data。
if result["errcode"].(float64)==0{
// cu := models.Customer{}
// cu.
// o.Insert()
c.Data["json"].(*models.Resp).Code=200
}else{
c.Data["json"].(*models.Resp).Code=500
// c.Data["json"].(map[string]interface{})["add"]= map[string]interface{}{
// "msg":"出现错误。",
// }
}
c.ServeJSON()
}
type CustomerController struct {
beego.Controller
}
func (c *CustomerController) Prepare(){
beego.Debug("请求参数为:",c.Input())
beego.Debug("请求体为:",c.Ctx.Input.RequestBody)
}
func (c *CustomerController) Get() {
id:= c.GetString("id")
openId:= c.GetString("openId")
valid.Required(id+ openId,"id或openId")
CheckValid(&valid,(*beego.Controller)(&c.Controller))
u := models.Customer{}
if id!=""{
v,_:=strconv.Atoi(id)
u.Id=v
o.Read(&u)
}else{
o.QueryTable("customer").Filter("openId",openId).One(&u)
}
c.Data["json"]= models.Resp{200,"",u}
c.ServeJSON()
}
func (c *CustomerController) Post() {//上传的参数首字母需要是大写的。否则执行ParseForm之后是空。
u := models.Customer{}
if err := c.ParseForm(&u); err != nil {
//handle error
beego.Error("参数错误。",u)
}
// qs:=o.QueryTable(u)
// for k,v:= range u{}
// for f:=range reflect.ValueOf(&t).Elem()
// .Filter()
//首先进行查询openId,如果已经存在就进行更新,如果不存在就成了。
var (id int64
err error
)
if u.Id==0{
id, err =o.Insert(&u)
}else{
id, err =o.Update(&u)
}
beego.Debug("插入客户信息。",u,id, err )//o.Insert(u))
c.Data["json"]=&models.Resp{Data:err}
if err==nil{
c.Data["json"].(*models.Resp).Code=200
}else{
c.Data["json"].(*models.Resp).Code=500
}
c.ServeJSON()
}