main.go
package main
import (
"ginshop04/models"
"ginshop04/routers"
"html/template"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
//自定义模板函数 注意要把这个函数放在加载模板前
r.SetFuncMap(template.FuncMap{
"UnixToTime": models.UnixToTime,
})
//加载模板 放在配置路由前面
r.LoadHTMLGlob("templates/**/**/*")
//配置静态web目录 第一个参数表示路由, 第二个参数表示映射的目录
r.Static("/static", "./static")
// 创建基于 cookie 的存储引擎,secret11111 参数是用于加密的密钥
store := cookie.NewStore([]byte("secret111"))
//配置session的中间件 store是前面创建的存储引擎,我们可以替换成其他存储引擎
r.Use(sessions.Sessions("mysession", store))
routers.AdminRoutersInit(r)
routers.ApiRoutersInit(r)
routers.DefaultRoutersInit(r)
r.Run()
}
middlewares->adminAuth.go
package middlewares
import (
"encoding/json"
"fmt"
"ginshop04/models"
"strings"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
)
func InitAdminAuthMiddleware(c *gin.Context) {
fmt.Println("InitAdminAuthMiddleware")
//进行权限判断 没有登录的用户 不能进入后台管理中心
//1、获取Url访问的地址 /admin/captcha
//2、获取Session里面保存的用户信息
//3、判断Session中的用户信息是否存在,如果不存在跳转到登录页面(注意需要判断) 如果存在继续向下执行
//4、如果Session不存在,判断当前访问的URl是否是login doLogin captcha,如果不是跳转到登录页面,如果是不行任何操作
// 1、获取Url访问的地址 /admin/captcha?t=0.8706946438889653
pathname := strings.Split(c.Request.URL.String(), "?")[0]
// 2、获取Session里面保存的用户信息
session := sessions.Default(c)
userinfo := session.Get("userinfo")
//类型断言 来判断 userinfo是不是一个string
userinfoStr, ok := userinfo.(string)
if ok {
var userinfoStruct []models.Manager
err := json.Unmarshal([]byte(userinfoStr), &userinfoStruct)
if err != nil || !(len(userinfoStruct) > 0 && userinfoStruct[0].Username != "") {
if pathname != "/admin/login" && pathname != "/admin/doLogin" && pathname != "/admin/captcha" {
c.Redirect(302, "/admin/login")
}
}
} else { //没有登录
if pathname != "/admin/login" && pathname != "/admin/doLogin" && pathname != "/admin/captcha" {
c.Redirect(302, "/admin/login")
}
}
}
controllers->admin->login.go
package admin
import (
"encoding/json"
"fmt"
"ginshop04/models"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
)
type LoginController struct {
BaseController
}
func (con LoginController) Index(c *gin.Context) {
//验证md5是否正确
// fmt.Println(models.Md5("123456")) e10adc3949ba59abbe56e057f20f883e
c.HTML(http.StatusOK, "admin/login/login.html", gin.H{})
}
func (con LoginController) DoLogin(c *gin.Context) {
captchaId := c.PostForm("captchaId")
username := c.PostForm("username")
password := c.PostForm("password")
verifyValue := c.PostForm("verifyValue")
fmt.Println(username, password)
//1、验证验证码是否正确
if flag := models.VerifyCaptcha(captchaId, verifyValue); flag {
//2、查询数据库 判断用户以及密码是否存在
userinfoList := []models.Manager{}
password = models.Md5(password)
models.DB.Where("username=? AND password=?", username, password).Find(&userinfoList)
if len(userinfoList) > 0 {
//3、执行登录 保存用户信息 执行跳转
session := sessions.Default(c)
//注意:session.Set没法直接保存结构体对应的切片 把结构体转换成json字符串
userinfoSlice, _ := json.Marshal(userinfoList)
session.Set("userinfo", string(userinfoSlice))
session.Save()
con.success(c, "登录成功", "/admin")
} else {
con.error(c, "用户名或者密码错误", "/admin/login")
}
} else {
con.error(c, "验证码验证失败", "/admin/login")
}
}
func (con LoginController) Captcha(c *gin.Context) {
id, b64s, err := models.MakeCaptcha()
if err != nil {
fmt.Println(err)
}
c.JSON(http.StatusOK, gin.H{
"captchaId": id,
"captchaImage": b64s,
})
}
func (con LoginController) LoginOut(c *gin.Context) {
session := sessions.Default(c)
session.Delete("userinfo")
session.Save()
con.success(c, "退出登录成功", "/admin/login")
}
浙公网安备 33010602011771号