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
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
|
|
}
|
|
}
|
|
|