mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 10:58:35 +08:00
365 lines
10 KiB
Go
365 lines
10 KiB
Go
package api
|
|
|
|
import (
|
|
"github.com/PandaXGO/PandaKit/model"
|
|
"github.com/PandaXGO/PandaKit/token"
|
|
"github.com/dgrijalva/jwt-go"
|
|
"github.com/emicklei/go-restful/v3"
|
|
"github.com/kakuilan/kgo"
|
|
"github.com/mssola/user_agent"
|
|
"pandax/apps/system/api/form"
|
|
"pandax/apps/system/api/vo"
|
|
"pandax/apps/system/entity"
|
|
|
|
logEntity "pandax/apps/log/entity"
|
|
logServices "pandax/apps/log/services"
|
|
|
|
"github.com/PandaXGO/PandaKit/biz"
|
|
"github.com/PandaXGO/PandaKit/captcha"
|
|
filek "github.com/PandaXGO/PandaKit/file"
|
|
"github.com/PandaXGO/PandaKit/restfulx"
|
|
"github.com/PandaXGO/PandaKit/utils"
|
|
"pandax/apps/system/services"
|
|
"pandax/pkg/global"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type UserApi struct {
|
|
UserApp services.SysUserModel
|
|
MenuApp services.SysMenuModel
|
|
PostApp services.SysPostModel
|
|
RoleApp services.SysRoleModel
|
|
RoleMenuApp services.SysRoleMenuModel
|
|
OrganizationApp services.SysOrganizationModel
|
|
LogLogin logServices.LogLoginModel
|
|
}
|
|
|
|
// GenerateCaptcha 获取验证码
|
|
func (u *UserApi) GenerateCaptcha(request *restful.Request, response *restful.Response) {
|
|
id, image := captcha.Generate()
|
|
response.WriteEntity(vo.CaptchaVo{Base64Captcha: image, CaptchaId: id})
|
|
}
|
|
|
|
// RefreshToken 刷新token
|
|
func (u *UserApi) RefreshToken(rc *restfulx.ReqCtx) {
|
|
tokenStr := rc.Request.Request.Header.Get("X-TOKEN")
|
|
j := token.NewJWT("", []byte(global.Conf.Jwt.Key), jwt.SigningMethodHS256)
|
|
token, err := j.RefreshToken(tokenStr)
|
|
biz.ErrIsNil(err, "刷新token失败")
|
|
rc.ResData = vo.TokenVo{
|
|
Token: token,
|
|
Expire: time.Now().Unix() + global.Conf.Jwt.ExpireTime,
|
|
}
|
|
}
|
|
|
|
// Login 用户登录
|
|
func (u *UserApi) Login(rc *restfulx.ReqCtx) {
|
|
var l form.Login
|
|
restfulx.BindJsonAndValid(rc, &l)
|
|
biz.IsTrue(captcha.Verify(l.CaptchaId, l.Captcha), "验证码认证失败")
|
|
|
|
login := u.UserApp.Login(entity.Login{Username: l.Username, Password: l.Password})
|
|
role := u.RoleApp.FindOne(login.RoleId)
|
|
j := token.NewJWT("", []byte(global.Conf.Jwt.Key), jwt.SigningMethodHS256)
|
|
token, err := j.CreateToken(token.Claims{
|
|
UserId: login.UserId,
|
|
UserName: login.Username,
|
|
RoleId: login.RoleId,
|
|
RoleKey: role.RoleKey,
|
|
OrganizationId: login.OrganizationId,
|
|
PostId: login.PostId,
|
|
StandardClaims: jwt.StandardClaims{
|
|
NotBefore: time.Now().Unix() - 1000, // 签名生效时间
|
|
ExpiresAt: time.Now().Unix() + global.Conf.Jwt.ExpireTime, // 过期时间 7天 配置文件
|
|
Issuer: "PandaX", // 签名的发行者
|
|
},
|
|
})
|
|
biz.ErrIsNil(err, "生成Token失败")
|
|
|
|
rc.ResData = vo.TokenVo{
|
|
Token: token,
|
|
Expire: time.Now().Unix() + global.Conf.Jwt.ExpireTime,
|
|
}
|
|
go func() {
|
|
var loginLog logEntity.LogLogin
|
|
ua := user_agent.New(rc.Request.Request.UserAgent())
|
|
loginLog.Ipaddr = rc.Request.Request.RemoteAddr
|
|
loginLog.LoginLocation = utils.GetRealAddressByIP(rc.Request.Request.RemoteAddr)
|
|
loginLog.LoginTime = time.Now()
|
|
loginLog.Status = "0"
|
|
loginLog.Remark = rc.Request.Request.UserAgent()
|
|
browserName, browserVersion := ua.Browser()
|
|
loginLog.Browser = browserName + " " + browserVersion
|
|
loginLog.Os = ua.OS()
|
|
loginLog.Platform = ua.Platform()
|
|
loginLog.Username = login.Username
|
|
loginLog.Msg = "登录成功"
|
|
loginLog.CreateBy = login.Username
|
|
u.LogLogin.Insert(loginLog)
|
|
}()
|
|
}
|
|
|
|
// Auth 用户权限信息
|
|
func (u *UserApi) Auth(rc *restfulx.ReqCtx) {
|
|
userName := restfulx.QueryParam(rc, "username")
|
|
biz.NotEmpty(userName, "用户名必传")
|
|
var user entity.SysUser
|
|
user.Username = userName
|
|
userData := u.UserApp.FindOne(user)
|
|
role := u.RoleApp.FindOne(userData.RoleId)
|
|
//前端权限
|
|
permis := u.RoleMenuApp.GetPermis(role.RoleId)
|
|
menus := u.MenuApp.SelectMenuRole(role.RoleKey)
|
|
|
|
rc.ResData = vo.AuthVo{
|
|
User: *userData,
|
|
Role: *role,
|
|
Permissions: permis,
|
|
Menus: Build(*menus),
|
|
}
|
|
}
|
|
|
|
// LogOut 退出登录
|
|
func (u *UserApi) LogOut(rc *restfulx.ReqCtx) {
|
|
var loginLog logEntity.LogLogin
|
|
ua := user_agent.New(rc.Request.Request.UserAgent())
|
|
loginLog.Ipaddr = rc.Request.Request.RemoteAddr
|
|
loginLog.LoginTime = time.Now()
|
|
loginLog.Status = "0"
|
|
loginLog.Remark = rc.Request.Request.UserAgent()
|
|
browserName, browserVersion := ua.Browser()
|
|
loginLog.Browser = browserName + " " + browserVersion
|
|
loginLog.Os = ua.OS()
|
|
loginLog.Platform = ua.Platform()
|
|
loginLog.Username = rc.LoginAccount.UserName
|
|
loginLog.Msg = "退出成功"
|
|
u.LogLogin.Insert(loginLog)
|
|
}
|
|
|
|
// GetSysUserList 列表数据
|
|
func (u *UserApi) GetSysUserList(rc *restfulx.ReqCtx) {
|
|
pageNum := restfulx.QueryInt(rc, "pageNum", 1)
|
|
pageSize := restfulx.QueryInt(rc, "pageSize", 10)
|
|
status := restfulx.QueryParam(rc, "status")
|
|
username := restfulx.QueryParam(rc, "username")
|
|
phone := restfulx.QueryParam(rc, "phone")
|
|
|
|
organizationId := restfulx.QueryInt(rc, "organizationId", 0)
|
|
var user entity.SysUser
|
|
user.Status = status
|
|
user.Username = username
|
|
user.Phone = phone
|
|
user.OrganizationId = int64(organizationId)
|
|
|
|
list, total := u.UserApp.FindListPage(pageNum, pageSize, user)
|
|
|
|
rc.ResData = model.ResultPage{
|
|
Total: total,
|
|
PageNum: int64(pageNum),
|
|
PageSize: int64(pageSize),
|
|
Data: list,
|
|
}
|
|
}
|
|
|
|
// GetSysUserProfile 获取当前登录用户
|
|
func (u *UserApi) GetSysUserProfile(rc *restfulx.ReqCtx) {
|
|
|
|
sysUser := entity.SysUser{}
|
|
sysUser.UserId = rc.LoginAccount.UserId
|
|
user := u.UserApp.FindOne(sysUser)
|
|
|
|
//获取角色列表
|
|
roleList := u.RoleApp.FindList(entity.SysRole{RoleId: rc.LoginAccount.RoleId})
|
|
//岗位列表
|
|
postList := u.PostApp.FindList(entity.SysPost{PostId: rc.LoginAccount.PostId})
|
|
//获取组织列表
|
|
organizationList := u.OrganizationApp.FindList(entity.SysOrganization{OrganizationId: rc.LoginAccount.OrganizationId})
|
|
|
|
postIds := make([]int64, 0)
|
|
postIds = append(postIds, rc.LoginAccount.PostId)
|
|
|
|
roleIds := make([]int64, 0)
|
|
roleIds = append(roleIds, rc.LoginAccount.RoleId)
|
|
|
|
rc.ResData = vo.UserProfileVo{
|
|
Data: user,
|
|
PostIds: postIds,
|
|
RoleIds: roleIds,
|
|
Roles: *roleList,
|
|
Posts: *postList,
|
|
Organization: *organizationList,
|
|
}
|
|
}
|
|
|
|
// InsetSysUserAvatar 修改头像
|
|
func (u *UserApi) InsetSysUserAvatar(rc *restfulx.ReqCtx) {
|
|
form := rc.Request.Request.MultipartForm
|
|
|
|
files := form.File["upload[]"]
|
|
guid, _ := kgo.KStr.UuidV4()
|
|
filPath := "static/uploadfile/" + guid + ".jpg"
|
|
for _, file := range files {
|
|
global.Log.Info(file.Filename)
|
|
// 上传文件至指定目录
|
|
biz.ErrIsNil(filek.SaveUploadedFile(file, filPath), "保存头像失败")
|
|
}
|
|
sysuser := entity.SysUser{}
|
|
sysuser.UserId = rc.LoginAccount.UserId
|
|
sysuser.Avatar = "/" + filPath
|
|
sysuser.UpdateBy = rc.LoginAccount.UserName
|
|
|
|
u.UserApp.Update(sysuser)
|
|
}
|
|
|
|
// SysUserUpdatePwd 修改密码
|
|
func (u *UserApi) SysUserUpdatePwd(rc *restfulx.ReqCtx) {
|
|
var pws entity.SysUserPwd
|
|
restfulx.BindJsonAndValid(rc, &pws)
|
|
|
|
user := entity.SysUser{}
|
|
user.UserId = rc.LoginAccount.UserId
|
|
u.UserApp.SetPwd(user, pws)
|
|
}
|
|
|
|
// GetSysUser 获取用户
|
|
func (u *UserApi) GetSysUser(rc *restfulx.ReqCtx) {
|
|
userId := restfulx.PathParamInt(rc, "userId")
|
|
|
|
user := entity.SysUser{}
|
|
user.UserId = int64(userId)
|
|
result := u.UserApp.FindOne(user)
|
|
|
|
var role entity.SysRole
|
|
var post entity.SysPost
|
|
var organization entity.SysOrganization
|
|
|
|
rc.ResData = vo.UserVo{
|
|
Data: result,
|
|
PostIds: result.PostIds,
|
|
RoleIds: result.RoleIds,
|
|
Roles: *u.RoleApp.FindList(role),
|
|
Posts: *u.PostApp.FindList(post),
|
|
Organizations: u.OrganizationApp.SelectOrganization(organization),
|
|
}
|
|
}
|
|
|
|
// GetSysUserInit 获取添加用户角色和职位
|
|
func (u *UserApi) GetSysUserInit(rc *restfulx.ReqCtx) {
|
|
|
|
var role entity.SysRole
|
|
roles := u.RoleApp.FindList(role)
|
|
var post entity.SysPost
|
|
posts := u.PostApp.FindList(post)
|
|
rc.ResData = vo.UserRolePost{
|
|
Roles: *roles,
|
|
Posts: *posts,
|
|
}
|
|
}
|
|
|
|
// GetUserRolePost 获取添加用户角色和职位
|
|
func (u *UserApi) GetUserRolePost(rc *restfulx.ReqCtx) {
|
|
var user entity.SysUser
|
|
user.UserId = rc.LoginAccount.UserId
|
|
|
|
resData := u.UserApp.FindOne(user)
|
|
|
|
roles := make([]entity.SysRole, 0)
|
|
posts := make([]entity.SysPost, 0)
|
|
for _, roleId := range strings.Split(resData.RoleIds, ",") {
|
|
ro := u.RoleApp.FindOne(kgo.KConv.Str2Int64(roleId))
|
|
roles = append(roles, *ro)
|
|
}
|
|
for _, postId := range strings.Split(resData.PostIds, ",") {
|
|
po := u.PostApp.FindOne(kgo.KConv.Str2Int64(postId))
|
|
posts = append(posts, *po)
|
|
}
|
|
rc.ResData = vo.UserRolePost{
|
|
Roles: roles,
|
|
Posts: posts,
|
|
}
|
|
}
|
|
|
|
// InsertSysUser 创建用户
|
|
func (u *UserApi) InsertSysUser(rc *restfulx.ReqCtx) {
|
|
var sysUser entity.SysUser
|
|
restfulx.BindJsonAndValid(rc, &sysUser)
|
|
sysUser.CreateBy = rc.LoginAccount.UserName
|
|
u.UserApp.Insert(sysUser)
|
|
}
|
|
|
|
// UpdateSysUser 修改用户数据
|
|
func (u *UserApi) UpdateSysUser(rc *restfulx.ReqCtx) {
|
|
var sysUser entity.SysUser
|
|
restfulx.BindJsonAndValid(rc, &sysUser)
|
|
sysUser.CreateBy = rc.LoginAccount.UserName
|
|
u.UserApp.Update(sysUser)
|
|
}
|
|
|
|
// UpdateSysUserStu 修改用户状态
|
|
func (u *UserApi) UpdateSysUserStu(rc *restfulx.ReqCtx) {
|
|
var sysUser entity.SysUser
|
|
restfulx.BindJsonAndValid(rc, &sysUser)
|
|
sysUser.CreateBy = rc.LoginAccount.UserName
|
|
u.UserApp.Update(sysUser)
|
|
}
|
|
|
|
// DeleteSysUser 删除用户数据
|
|
func (u *UserApi) DeleteSysUser(rc *restfulx.ReqCtx) {
|
|
userIds := restfulx.PathParam(rc, "userId")
|
|
u.UserApp.Delete(utils.IdsStrToIdsIntGroup(userIds))
|
|
}
|
|
|
|
// ExportUser 导出用户
|
|
func (u *UserApi) ExportUser(rc *restfulx.ReqCtx) {
|
|
filename := restfulx.QueryParam(rc, "filename")
|
|
status := restfulx.QueryParam(rc, "status")
|
|
username := restfulx.QueryParam(rc, "username")
|
|
phone := restfulx.QueryParam(rc, "phone")
|
|
|
|
var user entity.SysUser
|
|
user.Status = status
|
|
user.Username = username
|
|
user.Phone = phone
|
|
|
|
list := u.UserApp.FindList(user)
|
|
fileName := utils.GetFileName(global.Conf.Server.ExcelDir, filename)
|
|
utils.InterfaceToExcel(*list, fileName)
|
|
rc.Download(fileName)
|
|
}
|
|
|
|
// Build 构建前端路由
|
|
func Build(menus []entity.SysMenu) []vo.RouterVo {
|
|
equals := func(a string, b string) bool {
|
|
if a == b {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
rvs := make([]vo.RouterVo, 0)
|
|
for _, ms := range menus {
|
|
var rv vo.RouterVo
|
|
rv.Name = ms.Path
|
|
rv.Path = ms.Path
|
|
rv.Component = ms.Component
|
|
auth := make([]string, 0)
|
|
if ms.Permission != "" {
|
|
auth = strings.Split(ms.Permission, ",")
|
|
}
|
|
rv.Meta = vo.MetaVo{
|
|
Title: ms.MenuName,
|
|
IsLink: ms.IsLink,
|
|
IsHide: equals("1", ms.IsHide),
|
|
IsKeepAlive: equals("0", ms.IsKeepAlive),
|
|
IsAffix: equals("0", ms.IsAffix),
|
|
IsIframe: equals("0", ms.IsIframe),
|
|
Auth: auth,
|
|
Icon: ms.Icon,
|
|
}
|
|
rv.Children = Build(ms.Children)
|
|
rvs = append(rvs, rv)
|
|
}
|
|
|
|
return rvs
|
|
}
|