电商前后台API系统接口官方示例|淘宝|京东|1688接口接入参数

 

官方示例

官方基于最新的v2.x版本提供了示例,从以下角度演示了如何快速搭建单体API Service:

  1. 接口定义

  2. 接口注册

  3. 常量管理

  4. 控制器定义

  5. 数据库访问

    • 驱动引入

    • 数据库配置

    • dao代码生成

  6. 创建业务模型

  7. 提供服务接口

  8. 业务实现

    • 依赖注入

    • 增加引用

  9. 接口测试

开始实战

提示:为了行文紧凑,方便大家理解。与核心知识点无关的代码会直接省略或用会三个竖着的.简化。文章最后会提供GitHub地址,开源项目。

1. GToken实现单点登录

1. 查看自己的版本

首先,我们要确定自己安装的gf版本,通过gf version命令就可以查看了。

查看版本

注意:gtoken v1.5.0全面适配GoFrame v2.0.0 ; GoFrame v1.X.X 请使用GfToken v1.4.X相关版本

根据自己的版本安装合适的gtoken

2. 安装最新版gtoken

go get github.com/goflyfox/gtoken

3. 安装指定版本gtoken

@指定的版本号就可以了:

go get github.com/goflyfox/gtoken@v1.4.1

2. 自定义中间件

我们以编写gtoken中间件为例,带大家写一个自己的中间件:

在我们的app/middleware目录下新建token.go文件

编写gtoken中间件的目的:

  1. 全局校验用户的登录状态

  2. 登录后的用户将用户名、id这类用户信息写入到Context上下中,方便全局调用

  3. 在中间件中统一进行账号判断,比如:是否被拉黑等判断操作

我们来看具体的实现:

package middleware

const (
   CtxAccountId     = "account_id"     //token获取
    .
    .
    .
)

type TokenInfo struct {
   Id         int
   Name       string
    .
    .
    .
}

var GToken *gtoken.GfToken

var MiddlewareGToken = tokenMiddleware{}

type tokenMiddleware struct{}

func (s *tokenMiddleware) GetToken(r *ghttp.Request) {
   var tokenInfo TokenInfo
   token := GToken.GetTokenData(r)
   err := gconv.Struct(token.GetString("data"), &tokenInfo)
   if err != nil {
      response.Auth(r)
      return
   }
   //账号被冻结拉黑
   if tokenInfo.Status == 2 {
      response.AuthBlack(r)
      return
   }
   r.SetCtxVar(CtxAccountId, tokenInfo.Id)
    .
    .
    .
   r.Middleware.Next()
}

3. 注册中间件

我们在app/system/frontend/ 目录下新建 router.go 文件,用来定义客户端的路由:

  1. 首先编写gtoken登录注册等方法

  2. 然后在路由文件中使用 group.Middleware() 把自定义的中间件注册到路由组中。

  3. 注意:不需要校验登录状态的接口写在 group.Middleware(middleware.MiddlewareGToken.GetToken) 之前,需要校验登录状态的写在之后。

package frontend

//前端项目登录
func Login() {
   // 启动gtoken
   middleware.GToken = &gtoken.GfToken{
      //都用默认的
      //Timeout:    gconv.Int(g.Cfg().Get("gtoken.timeout")) * gconv.Int(gtime.M),
      //MaxRefresh: 60 * 1000, //单位毫秒 登录1分钟后有请求操作则主动刷新token有效期
      CacheMode:  2,
      LoginPath:  "/frontend/sso/login",
      LogoutPath: "/frontend/sso/logout",
      AuthPaths:  g.SliceStr{},
      //AuthPaths:        g.SliceStr{"/backend"},
      AuthExcludePaths: g.SliceStr{},
      GlobalMiddleware: true, // 开启全局拦截
      //MultiLogin:       g.Config().GetBool("gtoken.multi-login"),
      LoginBeforeFunc: frontendLogin.FrontendLogin.Login,
      LoginAfterFunc:  frontendLogin.FrontendLogin.LoginAfterFunc,
      LogoutAfterFunc: frontendLogin.FrontendLogin.Logout,
      AuthAfterFunc:   frontendLogin.FrontendLogin.AuthAfterFunc,
   }
   middleware.GToken.Start()
}

func Init(s *ghttp.Server) {
   Login()
   s.Group("/frontend/", func(group *ghttp.RouterGroup) {
      //不需要登录的
      //上传文件
      group.Group("upload/", func(group *ghttp.RouterGroup) {
         group.POST("img/", upload.Upload.Img)
      })

      //以下是需要登录的
      group.Middleware(middleware.MiddlewareGToken.GetToken)
      //登录账号相关
      group.Group("sso/", func(group *ghttp.RouterGroup) {
         group.POST("password/update", frontendLogin.FrontendLogin.UpdatePassword)
      })
   })
}

4. 自定义服务

细心的小伙伴已经发现了问题:在路由文件中写的 frontendLogin.FrontendLogin.Login是在哪里定义的呢?

没错,我们定义成了服务。

我们可以把登录注册这类通用的功能抽取出来,定义成通用的服务:

我们创建 app/service/frontendLogin 目录,在这个目录下再依次创建:

  • define.go:用于定义登录注册需要的结构体

  • service.go:用于编写业务逻辑,比如校验登录密码是否正确

  • api.go:用于提供接口,比如frontendLogin.FrontendLogin.Login就是在这里定义的

define.go简化示例

package frontendLogin

type RegisterReq struct {
   Name         string `json:"name" v:"required#用户名必传"`
   PassWord     string `json:"password" v:"required-if:type,0|password#password必须传递|密码限定在6-18位之间"`
   Avatar       string `json:"avatar"`
   Sex          int    `json:"sex"`
   Sign         string `json:"sign"`
   SecretAnswer string `json:"secret_answer"`
   UserSalt     string `json:"user_salt,omitempty"`
}

type AccessTokenRes struct {
   AccessToken string `json:"access_token"` //获取到的凭证
   ExpiresIn   int    `json:"expires_in"`   //凭证有效时间,单位:秒
}

.
.
.

service.go简化示例

package frontendLogin

import (
   "context"
    .
    .
    .
)

var service = frontendLoginService{}

type frontendLoginService struct {
}

.
.
.

//注册
func (s *frontendLoginService) Register(ctx context.Context, req *RegisterReq) (err error) {
   //查询用户名是否存在
   count, err := dao.UserInfo.Ctx(ctx).Where("name", req.Name).Count()
   if err != nil || count > 0 {
      return gerror.New("用户名已存在,请换个用户名注册账号吧")
   }

   UserSalt := grand.S(10)
   req.PassWord = library.EncryptPassword(req.PassWord, UserSalt)
   req.UserSalt = UserSalt
   //添加新用户
   _, err = dao.UserInfo.Ctx(ctx).Insert(req)
   if err != nil {
      return err
   }
   return
}

.
.
.

api.go简化示例

package frontendLogin

import (
   "github.com/goflyfox/gtoken/gtoken"
    .
    .
    .
)

var FrontendLogin = new(frontendLogin)

type frontendLogin struct {
}

//注册
func (s *frontendLogin) Register(r *ghttp.Request) {
   var data *RegisterReq
   if err := r.Parse(&data); err != nil {
      response.ParamErr(r, err)
   }
   err := service.Register(r.Context(), data)
   if err != nil {
      response.JsonExit(r, 0, "注册失败")
   } else {
      response.SuccessWithData(r, nil)
   }
}
.
.
.

好了,到这里我们就完成了gtoken的集成,并且自己编写了中间件,编写了服务。

 

 

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值