Initial commit
This commit is contained in:
@@ -0,0 +1,440 @@
|
||||
package adminApi
|
||||
|
||||
import (
|
||||
"encoding/base32"
|
||||
"fmt"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/skip2/go-qrcode"
|
||||
"stat/api/proto"
|
||||
"stat/common"
|
||||
"stat/common/googauth"
|
||||
"stat/common/stdLog"
|
||||
"stat/common/utils"
|
||||
"stat/models/adminMod"
|
||||
"stat/models/authorityMod"
|
||||
"stat/service/adminSer"
|
||||
"stat/service/opLogSer"
|
||||
)
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 管理员登录
|
||||
// @Description 传入用户信息登录
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param param body proto.AdminLoginReq true "参数"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Success 400 {string} string "失败"
|
||||
// @Router /api/stat/admin/login [POST]
|
||||
func AdminLogin(ctx *gin.Context) {
|
||||
var param struct {
|
||||
proto.AdminLoginReq
|
||||
}
|
||||
if err := ctx.ShouldBindJSON(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err)
|
||||
return
|
||||
}
|
||||
adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account)
|
||||
if err != nil || adminInfo.Account == "" {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err)
|
||||
return
|
||||
}
|
||||
if adminInfo.Secret == "" {
|
||||
secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10))))
|
||||
_ = adminMod.TwoStepSecretSet(ctx, adminInfo.Account, secret)
|
||||
}
|
||||
|
||||
// 通过验证,再次验证密码是否正确
|
||||
if adminInfo.Password != *param.Password || adminInfo.BlocRole == 1 {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminPasswordError, err)
|
||||
return
|
||||
}
|
||||
|
||||
qrCodePNG := make([]byte, 0)
|
||||
if !adminInfo.HasBind {
|
||||
url := googauth.New(adminInfo.Secret, adminInfo.Account+"@sc")
|
||||
qrCodePNG, err = qrcode.Encode(url, qrcode.Medium, 256)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, "Admin login get QRCodePNG error: "+err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
stdLog.ServerJSON(ctx, stdLog.Success, gin.H{
|
||||
"qrCodePNG": qrCodePNG,
|
||||
})
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 管理员登录
|
||||
// @Description 传入用户信息登录
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param param body proto.AdminLoginReq true "参数"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Success 400 {string} string "失败"
|
||||
// @Router /api/stat/adminbloc/login [POST]
|
||||
func AdminLoginBloc(ctx *gin.Context) {
|
||||
param := proto.AdminLoginReq{}
|
||||
if err := ctx.ShouldBindJSON(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err)
|
||||
return
|
||||
}
|
||||
|
||||
adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account)
|
||||
if err != nil || adminInfo.Account == "" {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err)
|
||||
return
|
||||
}
|
||||
|
||||
if adminInfo.Secret == "" {
|
||||
secret := base32.StdEncoding.EncodeToString([]byte(fmt.Sprintf("admin%s", common.RandStr(10))))
|
||||
_ = adminMod.TwoStepSecretSet(ctx, adminInfo.Account, secret)
|
||||
}
|
||||
|
||||
// 通过验证,再次验证密码是否正确
|
||||
if adminInfo.Password != *param.Password {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminPasswordError, err)
|
||||
return
|
||||
}
|
||||
|
||||
qrCodePNG := make([]byte, 0)
|
||||
if !adminInfo.HasBind {
|
||||
url := googauth.New(adminInfo.Secret, adminInfo.Account+"@sc")
|
||||
qrCodePNG, err = qrcode.Encode(url, qrcode.Medium, 256)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, "Admin login get QRCodePNG error: "+err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
stdLog.ServerJSON(ctx, stdLog.Success, gin.H{
|
||||
"qrCodePNG": qrCodePNG,
|
||||
})
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 管理员登录验证
|
||||
// @Description 谷歌验证
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param param body proto.AdminVerifyReq true "参数"
|
||||
// @Success 200 {object} proto.AdminLoginRes "成功"
|
||||
// @Success 400 {string} string "失败"
|
||||
// @Router /api/stat/admin/verify [POST]
|
||||
func AdminVerify(ctx *gin.Context) {
|
||||
param := proto.AdminVerifyReq{}
|
||||
if err := ctx.ShouldBindJSON(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err)
|
||||
return
|
||||
}
|
||||
|
||||
adminInfo, err := adminMod.FindOneByAccount(ctx, *param.Account)
|
||||
if err != nil || adminInfo.Account == "" {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminAccountNotExists, err)
|
||||
return
|
||||
}
|
||||
|
||||
//测试模式不使用两步验证
|
||||
if gin.Mode() == gin.ReleaseMode {
|
||||
ok, err := googauth.Verify(adminInfo.Secret, *param.VerifyCode)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.GoogleAuthFailed, "admin Verification 2-step error: "+err.Error())
|
||||
return
|
||||
}
|
||||
if !ok {
|
||||
stdLog.ServerJSON(ctx, stdLog.GoogleAuthFailed, "admin Verification 2-step verification failed")
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
code, adminInfo, err := adminSer.AdminLogin(ctx, param)
|
||||
if err != nil || code != stdLog.Success {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
roleInfo, err := authorityMod.GetAuthorityById(ctx, adminInfo.RoleId)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.AdminGetAuthorityFailed, err)
|
||||
return
|
||||
}
|
||||
|
||||
resp := proto.AdminLoginRes{
|
||||
Account: adminInfo.Account,
|
||||
Token: adminInfo.Token,
|
||||
Name: adminInfo.Name,
|
||||
RoleInfo: proto.RoleInfo{
|
||||
RoleId: roleInfo.Id,
|
||||
Role: roleInfo.Role,
|
||||
AuthJson: roleInfo.AuthJson,
|
||||
},
|
||||
}
|
||||
|
||||
stdLog.ServerJSON(ctx, code, resp)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 管理员列表
|
||||
// @Description 管理员列表
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.AdminListReq true "参数列表"
|
||||
// @Success 200 {object} proto.AdminListRes "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/admin/list [POST]
|
||||
func AdminList(ctx *gin.Context) {
|
||||
param := proto.AdminListReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
code, data, err := adminSer.AdminList(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 增加管理员
|
||||
// @Description 增加管理员
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.AddAdminReq true "参数"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Success 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/admin/add [POST]
|
||||
func AddAdmin(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.AddAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
code, data, err := adminSer.AddAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 修改管理员
|
||||
// @Description 修改管理员
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.UpdateAdminReq true "参数列表"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/admin/update [POST]
|
||||
func UpdateAdmin(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.UpdateAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
code, data, err := adminSer.UpdateAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 删除管理员
|
||||
// @Description 删除管理员
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.DelAdminReq true "参数列表"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/admin/del [DELETE]
|
||||
func DelAdmin(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.DelAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
code, data, err := adminSer.DelAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 管理员列表
|
||||
// @Description 管理员列表
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.AdminListReq true "参数列表"
|
||||
// @Success 200 {object} proto.AdminListRes "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/adminbloc/list [POST]
|
||||
func AdminListBloc(ctx *gin.Context) {
|
||||
param := proto.AdminListReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
blocRole := 1
|
||||
param.BlocRole = &blocRole
|
||||
code, data, err := adminSer.AdminList(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.AddAdminReq true "参数"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Success 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/adminbloc/add [POST]
|
||||
func AddAdminBloc(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.AddAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
blocRole := 1
|
||||
param.BlocRole = &blocRole
|
||||
|
||||
code, data, err := adminSer.AddAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 修改管理员
|
||||
// @Description 修改管理员
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.UpdateAdminReq true "参数列表"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/adminbloc/update [POST]
|
||||
func UpdateAdminBloc(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.UpdateAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
blocRole := 1
|
||||
param.BlocRole = &blocRole
|
||||
|
||||
code, data, err := adminSer.UpdateAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
|
||||
// @Tags 系统管理
|
||||
// @Summary 删除管理员
|
||||
// @Description 删除管理员
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Security ApiKeyAuth
|
||||
// @Param param body proto.DelAdminReq true "参数列表"
|
||||
// @Success 200 {string} string "成功"
|
||||
// @Failure 400 {string} string "失败"
|
||||
// @Security ApiKeyAuth
|
||||
// @Router /api/stat/adminbloc/del [DELETE]
|
||||
func DelAdminBloc(ctx *gin.Context) {
|
||||
account, err := utils.GetAdmin(ctx)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.NoToken, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
param := proto.DelAdminReq{}
|
||||
if err := ctx.ShouldBind(¶m); err != nil {
|
||||
stdLog.ServerJSON(ctx, stdLog.ParamError, err.Error())
|
||||
return
|
||||
}
|
||||
code, data, err := adminSer.DelAdmin(ctx, param)
|
||||
if err != nil {
|
||||
stdLog.ServerJSON(ctx, code, err)
|
||||
return
|
||||
}
|
||||
|
||||
// 增加操作日志
|
||||
opLogSer.AddOpLog(ctx, account, true, param)
|
||||
|
||||
stdLog.ServerJSON(ctx, code, data)
|
||||
}
|
||||
Reference in New Issue
Block a user