文章目录
9 项目实战准备
9-1 功能预览及介绍
9-2 功能点拆分
后端管理功能
代理服务器功能
9-3 开发流程及评审流程
9-4 功能点实现思考
后端管理功能
代理服务器功能
9-5 前端与后端如果开发不阻塞
第10章 项目实战之后台管理后端功能
10-1 数据表整理与创建
设计原则
- ER图
10-2 后端框架选型Gin框架
gin_scaffold 企业级脚手架
git clone https://github.com/e421083458/gin_scaffold.git
cd gin_scaffold
export GOPROXY=https://goproxy.io
go mod tidy
export GO111MODULE=on && export GOPROXY=https://goproxy.cn
go get -u -v github.com/kardianos/govendor
goproxy.io 这个开源项目帮我们实现好了我们想要的。该项目允许开发者一键构建自己的 GOPROXY 代理服务。同时,也提供了公用的代理服务 https://goproxy.io,我们只需设置该环境变量即可正常下载被墙的源码包了
安装swag工具
go get -u github.com/swaggo/swag/cmd/swag
执行完成后,需要将swag所在路径设置为PATH,设置方式如下(如果已经设置则跳过此步骤)
或者下载 https://github.com/swaggo/swag/releases 解压到go path/bin 的目录下,解压后会得到一个 可执行的文件
tar xzvf
验证安装
swag -v
基于之前的脚手架,删除一些dao、controller、router的一些文件,同时替换目录
10-9 登陆管理功能 - 登陆接口开发
测试:
curl 'http://127.0.0.1:8880/admin_login/login' -d 'username=111&password=222'
{"errno":0,"errmsg":"","data":"","trace_id":"c0a8076c5f1dba8df9602fca104dc7b0","stack":null}%
10-10 登陆管理功能 - 登陆、登出信息接口开发(session)
package controller
import (
"encoding/json"
"github.com/e421083458/go_gateway/dao"
"github.com/e421083458/go_gateway/dto"
"github.com/e421083458/go_gateway/middleware"
"github.com/e421083458/go_gateway/public"
"github.com/e421083458/go_gateway/golang_common/lib"
"github.com/gin-gonic/contrib/sessions"
"github.com/gin-gonic/gin"
"time"
)
type AdminLoginController struct{}
func AdminLoginRegister(group *gin.RouterGroup) {
adminLogin := &AdminLoginController{}
group.POST("/login", adminLogin.AdminLogin)
group.GET("/logout", adminLogin.AdminLoginOut)
}
// AdminLogin godoc
// @Summary 管理员登陆
// @Description 管理员登陆
// @Tags 管理员接口
// @ID /admin_login/login
// @Accept json
// @Produce json
// @Param body body dto.AdminLoginInput true "body"
// @Success 200 {object} middleware.Response{data=dto.AdminLoginOutput} "success"
// @Router /admin_login/login [post]
func (adminlogin *AdminLoginController) AdminLogin(c *gin.Context) {
params := &dto.AdminLoginInput{}
if err := params.BindValidParam(c); err != nil {
middleware.ResponseError(c, 2000, err)
return
}
//1. params.UserName 取得管理员信息 admininfo
//2. admininfo.salt + params.Password sha256 => saltPassword
//3. saltPassword==admininfo.password
tx, err := lib.GetGormPool("default")
if err != nil {
middleware.ResponseError(c, 2001, err)
return
}
admin := &dao.Admin{}
admin, err = admin.LoginCheck(c, tx, params)
if err != nil {
middleware.ResponseError(c, 2002, err)
return
}
//设置session
sessInfo := &dto.AdminSessionInfo{
ID: admin.Id,
UserName: admin.UserName,
LoginTime: time.Now(),
}
sessBts, err := json.Marshal(sessInfo)
if err != nil {
middleware.ResponseError(c, 2003, err)
return
}
sess := sessions.Default(c)
sess.Set(public.AdminSessionInfoKey, string(sessBts))
sess.Save()
out := &dto.AdminLoginOutput{Token: admin.UserName}
middleware.ResponseSuccess(c, out)
}
// AdminLogin godoc
// @Summary 管理员退出
// @Description 管理员退出
// @Tags 管理员接口
// @ID /admin_login/logout
// @Accept json
// @Produce json
// @Success 200 {object} middleware.Response{data=string} "success"
// @Router /admin_login/logout [get]
func (adminlogin *AdminLoginController) AdminLoginOut(c *gin.Context) {
sess := sessions.Default(c)
sess.Delete(public.AdminSessionInfoKey)
sess.Save()
middleware.ResponseSuccess(c, "")
}