You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
3.6 KiB

package admin
import (
"encoding/json"
"github.com/beego/beego/v2/core/logs"
"github.com/beego/beego/v2/server/web/context"
"github.com/mojocn/base64Captcha"
"image/color"
"time"
"viviman.top/controllers"
"viviman.top/dto"
"viviman.top/jwt"
"viviman.top/models"
"viviman.top/untils"
"viviman.top/vo"
)
// LoginController 登录api
type LoginController struct {
controllers.BaseController
}
type CaptchaResult struct {
Id string `json:"id"`
Base64Blob string `json:"base_64_blob"`
VerifyValue string `json:"code"`
}
// 设置自带的store
var store = base64Captcha.DefaultMemStore
func (c *LoginController) URLMapping() {
c.Mapping("Login", c.Login)
c.Mapping("Captcha", c.Captcha)
c.Mapping("Info", c.Info)
c.Mapping("Logout", c.Logout)
}
// Login @Title 登录验证
// @Description 登录
// @Success 200 {object} controllers.Result
// @router /login [post]
func (c *LoginController) Login() {
var authUser *dto.AuthUser
err := json.Unmarshal(c.Ctx.Input.RequestBody, &authUser)
logs.Info(authUser)
if err == nil {
currentUser, e := models.GetUserByUsername(authUser.Username)
//校验验证码
if !store.Verify(authUser.Id, authUser.Code, true) {
c.Data["json"] = controllers.ErrMsg("验证码不对")
_ = c.ServeJSON()
}
if e != nil {
c.Data["json"] = controllers.ErrMsg("用户不存在")
}
logs.Info("=======currentUser======")
logs.Info(currentUser)
if !untils.ComparePwd(currentUser.Password, []byte(authUser.Password)) {
c.Data["json"] = controllers.ErrMsg("密码错误")
} else {
token, _ := jwt.GenerateToken(currentUser, time.Hour*24*100)
var loginVO = new(vo.LoginVo)
loginVO.Token = token
loginVO.User = currentUser
c.Data["json"] = controllers.SuccessData(loginVO)
}
} else {
c.Data["json"] = controllers.ErrMsg(err.Error())
}
_ = c.ServeJSON()
}
// Info @Title获取用户信息
// @Description 获取用户信息
// @Success 200 {object} controllers.Result
// @router /info [get]
func (c *LoginController) Info() {
c.Data["json"] = controllers.SuccessData(jwt.GetAdminDetailUser(c.Ctx.Input))
_ = c.ServeJSON()
}
// Logout @Title退出登录
// @Description 退出登录
// @Success 200 {object} controllers.Result
// @router /logout [delete]
func (c *LoginController) Logout() {
err := jwt.RemoveUser(c.Ctx.Input)
if err != nil {
c.Data["json"] = controllers.ErrMsg("退出失败")
} else {
c.Data["json"] = controllers.SuccessData("退出成功")
}
_ = c.ServeJSON()
}
// Captcha @Title 获取验证码
// @Description 获取验证码
// @router /captcha [get]
func (c *LoginController) Captcha() {
GenerateCaptcha(c.Ctx)
_ = c.ServeJSON()
}
// GenerateCaptcha 生成图形化验证码 ctx *context.Context
func GenerateCaptcha(ctx *context.Context) {
var driver base64Captcha.Driver
var driverString base64Captcha.DriverMath
// 配置验证码信息
captchaConfig := base64Captcha.DriverMath{
Height: 38,
Width: 110,
NoiseCount: 0,
ShowLineOptions: 0,
BgColor: &color.RGBA{
R: 3,
G: 102,
B: 214,
A: 125,
},
Fonts: []string{"wqy-microhei.ttc"},
}
// 自定义配置,如果不需要自定义配置,则上面的结构体和下面这行代码不用写
driverString = captchaConfig
driver = driverString.ConvertFonts()
captcha := base64Captcha.NewCaptcha(driver, store)
id, b64s, err := captcha.Generate()
if err != nil {
logs.Error(err.Error())
}
captchaResult := CaptchaResult{
Id: id,
Base64Blob: b64s,
}
err = ctx.Output.JSON(controllers.SuccessData(captchaResult), true, true)
if err != nil {
logs.Error("输出时,发生异常!")
return
}
}