项目初始

This commit is contained in:
yxh
2021-07-20 11:11:30 +08:00
parent bc9d508eec
commit f7a750ff89
143 changed files with 12272 additions and 0 deletions
+228
View File
@@ -0,0 +1,228 @@
package api
import (
"gfast/app/common/api"
comModel "gfast/app/common/model"
commonService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"gfast/library"
"github.com/goflyfox/gtoken/gtoken"
"github.com/gogf/gf/crypto/gmd5"
"github.com/gogf/gf/encoding/gjson"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gcache"
"github.com/gogf/gf/os/genv"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/gvalid"
"github.com/mssola/user_agent"
"strings"
)
type auth struct {
api.CommonBase
}
var (
Auth = new(auth)
MultiLogin = g.Cfg().GetBool("gToken.system.MultiLogin")
GfToken = &gtoken.GfToken{
CacheMode: g.Cfg().GetInt8("gToken.system.CacheMode"),
CacheKey: g.Cfg().GetString("gToken.system.CacheKey"),
Timeout: g.Cfg().GetInt("gToken.system.Timeout"),
MaxRefresh: g.Cfg().GetInt("gToken.system.MaxRefresh"),
TokenDelimiter: g.Cfg().GetString("gToken.system.TokenDelimiter"),
EncryptKey: g.Cfg().GetBytes("gToken.system.EncryptKey"),
AuthFailMsg: g.Cfg().GetString("gToken.system.AuthFailMsg"),
MultiLogin: MultiLogin,
LoginPath: "/login",
LoginBeforeFunc: Auth.login,
LoginAfterFunc: Auth.loginAfter,
LogoutPath: "/logout",
AuthExcludePaths: g.SliceStr{"/login"},
AuthAfterFunc: Auth.authAfterFunc,
LogoutBeforeFunc: Auth.loginOut,
}
)
//后台用户登陆验证
func (c *auth) login(r *ghttp.Request) (string, interface{}) {
var ctx = r.GetCtx()
var apiReq *model.LoginParamsReq
if err := r.Parse(&apiReq); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
//判断验证码是否正确
debug := genv.GetWithCmd("gf.debug")
if debug.Int() != 1 {
if !commonService.Captcha.VerifyString(apiReq.VerifyKey, apiReq.VerifyCode) {
c.FailJson(true, r, "验证码输入错误")
}
}
ip := library.GetClientIp(r)
userAgent := r.Header.Get("User-Agent")
if user, err := service.SysUser.GetAdminUserByUsernamePassword(ctx, apiReq); err != nil {
//保存日志(异步)
service.SysLoginLog.Invoke(&model.LoginLogParams{
Status: 0,
Username: apiReq.Username,
Ip: ip,
UserAgent: userAgent,
Msg: err.Error(),
Module: "系统后台",
})
c.FailJsonExit(r, err.Error())
} else if user != nil {
r.SetParam("userInfo", user)
//更新用户登录记录 写入日志信息
service.SysUser.UpdateLoginInfo(user.Id, apiReq.Username, ip, userAgent, "登录成功", "系统后台")
var keys string
if MultiLogin {
keys = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip)
} else {
keys = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword)
}
return keys, user
}
return "", nil
}
//登录成功返回
func (c *auth) loginAfter(r *ghttp.Request, respData gtoken.Resp) {
if !respData.Success() {
r.Response.WriteJson(respData)
} else {
token := respData.GetString("token")
uuid := respData.GetString("uuid")
var userInfo *model.LoginUserRes
r.GetParamVar("userInfo").Struct(&userInfo)
//保存用户在线状态token到数据库
userAgent := r.Header.Get("User-Agent")
ua := user_agent.New(userAgent)
os := ua.OS()
explorer, _ := ua.Browser()
onlineData := &model.SysUserOnline{
Uuid: uuid,
Token: token,
CreateTime: gtime.Now(),
UserName: userInfo.UserName,
Ip: library.GetClientIp(r),
Explorer: explorer,
Os: os,
}
//保存用户在线状态(异步)
service.Online.Invoke(onlineData)
c.SusJsonExit(r, g.Map{
"token": token,
})
}
}
//gToken验证后返回
func (c *auth) authAfterFunc(r *ghttp.Request, respData gtoken.Resp) {
if r.Method == "OPTIONS" || respData.Success() {
r.Middleware.Next()
} else {
c.JsonExit(r, respData.Code, "用户信息验证失败")
}
}
//后台退出登陆
func (c *auth) loginOut(r *ghttp.Request) bool {
//删除在线用户状态
authHeader := r.Header.Get("Authorization")
if authHeader != "" {
parts := strings.SplitN(authHeader, " ", 2)
if len(parts) == 2 && parts[0] == "Bearer" && parts[1] != "" {
//删除在线用户状态操作
service.Online.DeleteOnlineByToken(parts[1])
}
}
authHeader = r.GetString("token")
if authHeader != "" {
//删除在线用户状态操作
service.Online.DeleteOnlineByToken(authHeader)
}
return true
}
// CheckUserOnline 检查在线用户
func (c *auth) CheckUserOnline() {
param := &model.SysUserOnlineSearchReq{
PageReq: comModel.PageReq{
PageNum: 1,
PageSize: 50,
},
}
var total int
for {
var (
list []*model.SysUserOnline
err error
)
total, _, list, err = service.Online.GetOnlineListPage(param, true)
if err != nil {
g.Log().Error(err)
break
}
if list == nil {
break
}
for _, v := range list {
if b := c.UserIsOnline(v.Token); !b {
service.Online.DeleteOnlineByToken(v.Token)
}
}
if param.PageNum*param.PageSize >= total {
break
}
param.PageNum++
}
}
// UserIsOnline 判断用户是否在线
func (c *auth) UserIsOnline(token string) bool {
uuid, userKey := c.GetUuidUserKeyByToken(token)
cacheKey := GfToken.CacheKey + userKey
switch GfToken.CacheMode {
case gtoken.CacheModeCache:
userCacheValue, _ := gcache.Get(cacheKey)
if userCacheValue == nil {
return false
}
return true
case gtoken.CacheModeRedis:
var userCache g.Map
userCacheJson, err := g.Redis().Do("GET", cacheKey)
if err != nil {
g.Log().Error("[GToken]cache get error", err)
return false
}
if userCacheJson == nil {
return false
}
err = gjson.DecodeTo(userCacheJson, &userCache)
if err != nil {
g.Log().Error("[GToken]cache get json error", err)
return false
}
if uuid != userCache["uuid"] {
return false
}
return true
}
return false
}
// GetUuidUserKeyByToken 通过token获取uuid和userKey
func (c *auth) GetUuidUserKeyByToken(token string) (uuid, userKey string) {
decryptToken := GfToken.DecryptToken(token)
if !decryptToken.Success() {
return
}
userKey = decryptToken.GetString("userKey")
uuid = decryptToken.GetString("uuid")
return
}
+158
View File
@@ -0,0 +1,158 @@
package api
import (
"gfast/app/common/global"
CommService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type authRule struct {
systemBase
}
var AuthRule = new(authRule)
func (c *authRule) MenuList(r *ghttp.Request) {
var (
req *model.SysAuthRuleReqSearch
listEntities []*model.SysAuthRuleInfoRes
err error
)
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.Error())
}
listEntities, err = service.Rule.GetMenuListSearch(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
list := make([]*model.SysAuthRuleTreeRes, 0, len(listEntities))
if !req.IsEmpty() {
for _, menu := range listEntities {
list = append(list, &model.SysAuthRuleTreeRes{
SysAuthRuleInfoRes: menu,
})
}
} else {
list = service.Rule.GetMenuListTree(0, listEntities)
}
c.SusJsonExit(r, g.Map{
"list": list,
})
}
func (c *authRule) GetMenus(r *ghttp.Request) {
listEntities, err := service.Rule.GetIsMenuList()
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"parentList": listEntities,
})
}
func (c *authRule) AddMenuPost(r *ghttp.Request) {
var menu *model.MenuReq
if err := r.Parse(&menu); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
//判断菜单规则是否存在
if !service.Rule.CheckMenuNameUnique(menu.Name, 0) {
c.FailJsonExit(r, "菜单规则名称已经存在")
}
//判断路由是否已经存在
if !service.Rule.CheckMenuPathUnique(menu.Path, 0) {
c.FailJsonExit(r, "路由地址已经存在")
}
err, _ := service.Rule.AddMenu(menu)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "添加菜单失败")
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "添加菜单成功")
}
func (c *authRule) ModelOptions(r *ghttp.Request) {
module := r.GetString("module")
models, err := service.Rule.ModelOptions(module)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, models)
}
func (c *authRule) GetMenu(r *ghttp.Request) {
id := r.GetUint64("menuId")
menuEntity, err := service.Rule.One(id)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, err.Error())
}
listEntities, err := service.Rule.GetIsMenuList()
if err != nil {
c.FailJsonExit(r, err.Error())
}
list := service.Rule.ParentSonSort(listEntities, 0)
var models []*model.SysModelInfo
if menuEntity.ModuleType != "" {
models, err = service.Rule.ModelOptions(menuEntity.ModuleType)
if err != nil {
c.FailJsonExit(r, err.Error())
}
}
c.SusJsonExit(r, g.Map{
"parentList": list,
"menu": menuEntity,
"modelOptions": models,
})
}
func (c *authRule) EditPost(r *ghttp.Request) {
id := r.GetInt("menuId")
menu := new(model.MenuReq)
if err := r.Parse(menu); err != nil {
c.FailJsonExit(r, err.Error())
}
//判断菜单规则是否存在
if !service.Rule.CheckMenuNameUnique(menu.Name, id) {
c.FailJsonExit(r, "菜单规则名称已经存在")
}
//判断路由是否已经存在
if !service.Rule.CheckMenuPathUnique(menu.Path, id) {
c.FailJsonExit(r, "路由地址已经存在")
}
err, _ := service.Rule.EditMenu(menu, id)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "修改菜单失败")
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "修改菜单成功")
}
func (c *authRule) DeleteMenu(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) == 0 {
c.FailJsonExit(r, "删除失败,参数错误")
}
err := service.Rule.DeleteMenuByIds(ids)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "删除失败")
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "删除成功")
}
+18
View File
@@ -0,0 +1,18 @@
package api
import (
"context"
"gfast/app/common/api"
"gfast/app/system/dao"
"gfast/app/system/service"
)
type systemBase struct {
api.CommonBase
}
// GetCurrentUser 获取当前登陆用户信息
func (c *systemBase) GetCurrentUser(ctx context.Context) *dao.CtxUser {
context := service.Context.Get(ctx)
return context.User
}
+109
View File
@@ -0,0 +1,109 @@
/*
* @desc:系统配置
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/5 17:46
*/
package api
import (
"gfast/app/common/global"
"gfast/app/common/model"
"gfast/app/common/service"
commonService "gfast/app/common/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysConfig struct {
systemBase
}
var SysConfig = new(sysConfig)
// List 系统参数配置列表
func (c *sysConfig) List(r *ghttp.Request) {
var req *model.SysConfigSearchReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.Ctx = r.GetCtx()
total, page, list, err := service.SysConfig.SelectListByPage(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
// Add 添加
func (c *sysConfig) Add(r *ghttp.Request) {
var req *model.SysConfigAddReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
err := service.SysConfig.CheckConfigKeyUniqueAll(req.ConfigKey)
if err != nil {
c.FailJsonExit(r, err.Error())
}
req.CreateBy = c.GetCurrentUser(r.GetCtx()).GetUserId() //获取登陆用户id
err = service.SysConfig.AddSave(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
commonService.Cache.New().Remove(global.SysConfigTag + req.ConfigKey)
c.SusJsonExit(r, "添加参数成功")
}
// Get 获取参数信息
func (c *sysConfig) Get(r *ghttp.Request) {
id := r.GetInt("id")
params, err := service.SysConfig.GetById(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, params)
}
// Edit 修改系统参数
func (c *sysConfig) Edit(r *ghttp.Request) {
var req *model.SysConfigEditReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
err := service.SysConfig.CheckConfigKeyUnique(req.ConfigKey, req.ConfigId)
if err != nil {
c.FailJsonExit(r, err.Error())
}
req.UpdateBy = c.GetCurrentUser(r.Context()).GetUserId()
err = service.SysConfig.EditSave(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
commonService.Cache.New().Remove(global.SysConfigTag + req.ConfigKey)
c.SusJsonExit(r, "修改参数成功")
}
// Delete 删除参数
func (c *sysConfig) Delete(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) == 0 {
c.FailJsonExit(r, "删除失败")
}
err := service.SysConfig.DeleteByIds(ids)
if err != nil {
c.FailJsonExit(r, "删除失败")
}
commonService.Cache.New().RemoveByTag(global.SysConfigTag)
c.SusJsonExit(r, "删除成功")
}
+124
View File
@@ -0,0 +1,124 @@
package api
import (
"gfast/app/common/global"
CommService "gfast/app/common/service"
"gfast/app/system/dao"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type dept struct {
systemBase
}
var Dept = new(dept)
// List 部门列表
func (c *dept) List(r *ghttp.Request) {
var searchParams *dao.SysDeptSearchParams
if err := r.Parse(&searchParams); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
if list, err := service.Dept.GetList(searchParams); err != nil {
c.FailJsonExit(r, err.Error())
} else {
if list != nil {
c.SusJsonExit(r, list)
} else {
c.SusJsonExit(r, []*model.SysDept{})
}
}
}
func (c *dept) Add(r *ghttp.Request) {
var addParams *dao.SysDeptAddParams
if err := r.Parse(&addParams); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
addParams.CreatedBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.Dept.AddDept(addParams); err != nil {
c.FailJsonExit(r, err.Error())
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "添加成功")
}
func (c *dept) Get(r *ghttp.Request) {
id := r.GetUint64("id")
if id == 0 {
c.FailJsonExit(r, "参数错误")
}
if dept, err := service.Dept.GetDeptById(id); err != nil {
c.FailJsonExit(r, err.Error())
} else {
c.SusJsonExit(r, dept)
}
}
func (c *dept) Edit(r *ghttp.Request) {
var editParams *dao.EditParams
if err := r.Parse(&editParams); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
editParams.UpdatedBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.Dept.EditDept(editParams); err != nil {
c.FailJsonExit(r, err.Error())
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "编辑成功")
}
func (c *dept) Delete(r *ghttp.Request) {
id := r.GetInt64("id")
if id == 0 {
c.FailJsonExit(r, "删除失败")
}
err := service.Dept.DelDept(id)
if err != nil {
c.FailJsonExit(r, "删除失败")
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "删除成功")
}
func (c *dept) RoleDeptTreeSelect(r *ghttp.Request) {
id := r.GetInt64("roleId")
if id == 0 {
c.FailJsonExit(r, "参数错误")
}
list, err := service.Dept.GetList(&dao.SysDeptSearchParams{
Status: "1",
})
if err != nil {
c.FailJsonExit(r, err.Error())
}
//获取关联的角色数据权限
checkedKeys, err := service.Dept.GetRoleDepts(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
dList := service.Dept.GetDeptListTree(0, list)
res := g.Map{
"depts": dList,
"checkedKeys": checkedKeys,
}
c.SusJsonExit(r, res)
}
func (c *dept) TreeSelect(r *ghttp.Request) {
//获取正常状态部门数据
list, err := service.Dept.GetList(&dao.SysDeptSearchParams{Status: "1"})
if err != nil {
c.FailJsonExit(r, err.Error())
}
dList := service.Dept.GetDeptListTree(0, list)
res := g.Map{
"depts": dList,
}
c.SusJsonExit(r, res)
}
+119
View File
@@ -0,0 +1,119 @@
/*
* @desc:字典数据
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/4/3 11:52
*/
package api
import (
"gfast/app/common/global"
commonService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type dictData struct {
systemBase
}
var DictData = new(dictData)
// List 字典列表
func (c *dictData) List(r *ghttp.Request) {
var req *model.SelectDictPageReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.Ctx = r.GetCtx()
total, page, list, err := service.SysDictData.DictDataList(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
// Add 添加字典数据
func (c *dictData) Add(r *ghttp.Request) {
var req *model.DictDataAddReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.CreateBy = c.GetCurrentUser(r.GetCtx()).GetUserId() //获取登陆用户id
_, err := service.SysDictData.AddSave(req)
if err != nil {
g.Log().Error(err.Error())
c.FailJsonExit(r, "字典数据添加失败")
}
//清除tag缓存
commonService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r, "添加字典数据成功")
}
// Get 获取字典数据信息
func (c *dictData) Get(r *ghttp.Request) {
dictCode := r.GetInt("dictCode")
data, err := service.SysDictData.GetDictDataById(dictCode)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, data)
}
// Edit 修改字典数据
func (c *dictData) Edit(r *ghttp.Request) {
var req *model.EditDictDataReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.UpdateBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
err := service.SysDictData.EditSaveData(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
//清除tag缓存
commonService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r, "修改字典数据成功")
}
// Delete 删除字典数据
func (c *dictData) Delete(r *ghttp.Request) {
dictCodes := r.GetInts("ids")
if len(dictCodes) == 0 {
c.FailJsonExit(r, "删除失败")
}
err := service.SysDictData.DeleteDictDataByIds(dictCodes)
if err != nil {
c.FailJsonExit(r, "删除失败")
}
//清除tag缓存
commonService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r, "删除成功")
}
// GetDictData 获取字典数据
func (c *dictData) GetDictData(r *ghttp.Request) {
var req *model.GetDictReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.Ctx = r.GetCtx()
dict, err := service.SysDictData.GetDictWithDataByType(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, dict)
}
+96
View File
@@ -0,0 +1,96 @@
package api
import (
"gfast/app/common/global"
comService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type dictType struct {
systemBase
}
var DictType = new(dictType)
func (c *dictType) List(r *ghttp.Request) {
var req *model.ListSysDictTypeReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
req.Ctx = r.GetCtx()
total, page, list, err := service.SysDictType.SelectList(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"total": total,
"page": page,
"list": list,
})
}
func (c *dictType) Get(r *ghttp.Request) {
id := r.GetInt("dictId")
entity, err := service.SysDictType.GetDictById(id)
if err != nil {
c.FailJsonExit(r, "字典数据获取失败")
}
c.SusJsonExit(r, entity)
}
func (c *dictType) Add(r *ghttp.Request) {
var req *model.SysDictTypeAddReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
if service.SysDictType.ExistsDictType(req.DictType) {
c.FailJsonExit(r, "字典类型已经存在")
}
req.CreateBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
err := service.SysDictType.Add(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
//清除缓存
comService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r)
}
func (c *dictType) Edit(r *ghttp.Request) {
var req *model.SysDictTypeEditReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
if service.SysDictType.ExistsDictType(req.DictType, req.DictId) {
c.FailJsonExit(r, "字典类型已经存在")
}
ctx := r.GetCtx()
req.UpdateBy = c.GetCurrentUser(ctx).Id
err := service.SysDictType.Edit(ctx, req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
//清除缓存
comService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r)
}
func (c *dictType) Delete(r *ghttp.Request) {
dictIds := r.GetInts("dictIds")
if len(dictIds) == 0 {
c.FailJsonExit(r, "参数错误")
}
if err := service.SysDictType.Delete(r.GetCtx(), dictIds); err != nil {
c.FailJsonExit(r, "删除失败")
}
//清除缓存
comService.Cache.New().RemoveByTag(global.SysDictTag)
c.SusJsonExit(r)
}
+116
View File
@@ -0,0 +1,116 @@
/*
* @desc:定时任务
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/14 9:02
*/
package api
import (
"gfast/app/system/dao"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysJob struct {
systemBase
}
var SysJob = new(sysJob)
// List 任务列表
func (c *sysJob) List(r *ghttp.Request) {
var req *dao.SysJobSearchReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
total, page, list, err := service.SysJob.JobList(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
func (c *sysJob) Add(r *ghttp.Request) {
var req *dao.SysJobAddReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
req.CreateBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
err := service.SysJob.AddJob(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "任务添加成功")
}
func (c *sysJob) Get(r *ghttp.Request) {
id := r.GetInt64("id")
job, err := service.SysJob.GetJobInfoById(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, job)
}
func (c *sysJob) Edit(r *ghttp.Request) {
var req *dao.SysJobEditReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
req.UpdateBy = c.GetCurrentUser(r.GetCtx()).GetUserId() //获取登陆用户id
err := service.SysJob.EditJob(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "修改任务成功")
}
// Start 启动任务
func (c *sysJob) Start(r *ghttp.Request) {
id := r.GetInt64("id")
job, err := service.SysJob.GetJobInfoById(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
err = service.SysJob.JobStart(job)
if err != nil {
c.FailJsonExit(r, "定时任务管理启动"+err.Error())
}
c.SusJsonExit(r, "定时任务管理启动成功")
}
// Stop 停止任务
func (c *sysJob) Stop(r *ghttp.Request) {
id := r.GetInt64("id")
job, err := service.SysJob.GetJobInfoById(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
err = service.SysJob.JobStop(job)
if err != nil {
c.FailJsonExit(r, "定时任务管理停止"+err.Error())
}
c.SusJsonExit(r, "定时任务管理停止成功")
}
// Delete 删除任务
func (c *sysJob) Delete(r *ghttp.Request) {
ids := r.GetInts("ids")
err := service.SysJob.DeleteJobByIds(ids)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "删除成功")
}
+60
View File
@@ -0,0 +1,60 @@
/*
* @desc:登录日志
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/19 10:21
*/
package api
import (
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysLoginLog struct {
systemBase
}
var SysLoginLog = new(sysLoginLog)
// List 获取日志列表
func (c sysLoginLog) List(r *ghttp.Request) {
var req *model.SysLoginLogSearchReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
total, page, list, err := service.SysLoginLog.LoginLogListByPage(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
// Delete 删除日志
func (c *sysLoginLog) Delete(r *ghttp.Request) {
ids := r.GetInts("ids")
err := service.SysLoginLog.DeleteLoginLogByIds(ids)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "删除成功")
}
// Clear 清空日志
func (c *sysLoginLog) Clear(r *ghttp.Request) {
err := service.SysLoginLog.ClearLoginLog()
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "清除成功")
}
+150
View File
@@ -0,0 +1,150 @@
/*
* @desc:系统服务信息
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/19 9:03
*/
package api
import (
"fmt"
"gfast/library"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/os/gtime"
"github.com/gogf/gf/util/gconv"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/host"
"github.com/shirou/gopsutil/load"
"github.com/shirou/gopsutil/mem"
"os"
"runtime"
"strconv"
"time"
)
type sysMonitor struct {
systemBase
startTime *gtime.Time
}
var SysMonitor = &sysMonitor{
startTime: gtime.Now(),
}
// Info 服务监控信息
func (c *sysMonitor) Info(r *ghttp.Request) {
cpuNum := runtime.NumCPU() //核心数
var cpuUsed float64 = 0 //用户使用率
var cpuAvg5 float64 = 0 //CPU负载5
var cpuAvg15 float64 = 0 //当前空闲率
cpuInfo, err := cpu.Percent(time.Duration(time.Second), false)
if err == nil {
cpuUsed, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", cpuInfo[0]), 64)
}
loadInfo, err := load.Avg()
if err == nil {
cpuAvg5, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64)
cpuAvg15, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", loadInfo.Load5), 64)
}
var memTotal uint64 = 0 //总内存
var memUsed uint64 = 0 //总内存 := 0 //已用内存
var memFree uint64 = 0 //剩余内存
var memUsage float64 = 0 //使用率
v, err := mem.VirtualMemory()
if err == nil {
memTotal = v.Total
memUsed = v.Used
memFree = memTotal - memUsed
memUsage, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", v.UsedPercent), 64)
}
var goTotal uint64 = 0 //go分配的总内存数
var goUsed uint64 = 0 //go使用的内存数
var goFree uint64 = 0 //go剩余的内存数
var goUsage float64 = 0 //使用率
var gomem runtime.MemStats
runtime.ReadMemStats(&gomem)
goUsed = gomem.Sys
goUsage = gconv.Float64(fmt.Sprintf("%.2f", gconv.Float64(goUsed)/gconv.Float64(memTotal)*100))
sysComputerIp := "" //服务器IP
ip, err := library.GetLocalIP()
if err == nil {
sysComputerIp = ip
}
sysComputerName := "" //服务器名称
sysOsName := "" //操作系统
sysOsArch := "" //系统架构
sysInfo, err := host.Info()
if err == nil {
sysComputerName = sysInfo.Hostname
sysOsName = sysInfo.OS
sysOsArch = sysInfo.KernelArch
}
goName := "GoLang" //语言环境
goVersion := runtime.Version() //版本
gtime.Date()
goStartTime := c.startTime //启动时间
goRunTime := gtime.Now().Timestamp() - c.startTime.Timestamp() //运行时长(秒)
goHome := runtime.GOROOT() //安装路径
goUserDir := "" //项目路径
curDir, err := os.Getwd()
if err == nil {
goUserDir = curDir
}
//服务器磁盘信息
diskList := make([]disk.UsageStat, 0)
diskInfo, err := disk.Partitions(true) //所有分区
if err == nil {
for _, p := range diskInfo {
diskDetail, err := disk.Usage(p.Mountpoint)
if err == nil {
diskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskDetail.UsedPercent), 64)
diskList = append(diskList, *diskDetail)
}
}
}
res := g.Map{
"cpuNum": cpuNum,
"cpuUsed": cpuUsed,
"cpuAvg5": cpuAvg5,
"cpuAvg15": cpuAvg15,
"memTotal": memTotal,
"goTotal": goTotal,
"memUsed": memUsed,
"goUsed": goUsed,
"memFree": memFree,
"goFree": goFree,
"memUsage": memUsage,
"goUsage": goUsage,
"sysComputerName": sysComputerName,
"sysOsName": sysOsName,
"sysComputerIp": sysComputerIp,
"sysOsArch": sysOsArch,
"goName": goName,
"goVersion": goVersion,
"goStartTime": goStartTime,
"goRunTime": goRunTime,
"goHome": goHome,
"goUserDir": goUserDir,
"diskList": diskList,
}
c.SusJsonExit(r, res)
}
+110
View File
@@ -0,0 +1,110 @@
/*
* @desc:操作日志管理
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/19 14:50
*/
package api
import (
"gfast/app/system/dao"
"gfast/app/system/model"
"gfast/app/system/service"
"gfast/library"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/util/gvalid"
)
type sysOperLog struct {
systemBase
}
var SysOperLog = new(sysOperLog)
// List 操作日志列表
func (c *sysOperLog) List(r *ghttp.Request) {
var req *dao.SysOperLogSearchReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
total, page, list, err := service.SysOperLog.OperationLogListByPage(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
// Detail 日志详细
func (c *sysOperLog) Detail(r *ghttp.Request) {
id := r.GetInt64("id")
log, err := service.SysOperLog.GetOperationLogById(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"info": log,
})
}
// Delete 删除
func (c *sysOperLog) Delete(r *ghttp.Request) {
ids := r.GetInts("ids")
err := service.SysOperLog.DeleteOperationLogByIds(ids)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "删除成功")
}
// Clear 清空
func (c *sysOperLog) Clear(r *ghttp.Request) {
err := service.SysOperLog.ClearOperationLog()
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "清除成功")
}
// OperationLog 操作日志记录
func (c *sysOperLog) OperationLog(r *ghttp.Request) {
user := c.GetCurrentUser(r.GetCtx())
if user == nil {
return
}
url := r.Request.URL //请求地址
//获取菜单
//获取地址对应的菜单id
menuList, err := service.Rule.GetMenuList()
if err != nil {
g.Log().Error(err)
return
}
var menu *model.SysAuthRuleInfoRes
path := gstr.TrimLeft(url.Path, "/")
for _, m := range menuList {
if gstr.Equal(m.Name, path) {
menu = m
break
}
}
data := &dao.SysOperLogAdd{
User: user,
Menu: menu,
Url: url,
Params: r.GetMap(),
Method: r.Method,
ClientIp: library.GetClientIp(r),
OperatorType: 1,
}
service.SysOperLog.Invoke(data)
}
+88
View File
@@ -0,0 +1,88 @@
/*
* @desc:岗位管理
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/12 10:32
*/
package api
import (
"gfast/app/system/dao"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysPost struct {
systemBase
}
var SysPost = new(sysPost)
func (c *sysPost) List(r *ghttp.Request) {
var req *dao.SysPostSearchParams
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
total, page, list, err := service.SysPost.List(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"total": total,
"list": list,
"page": page,
}
c.SusJsonExit(r, result)
}
func (c *sysPost) Add(r *ghttp.Request) {
var addParams *dao.SysPostAddParams
if err := r.Parse(&addParams); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
addParams.CreatedBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.SysPost.Add(addParams); err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "添加成功")
}
func (c *sysPost) Get(r *ghttp.Request) {
id := r.GetInt64("id")
if id == 0 {
c.FailJsonExit(r, "id必须")
}
if post, err := service.SysPost.GetOneById(id); err != nil {
c.FailJsonExit(r, err.Error())
} else {
c.SusJsonExit(r, post)
}
}
func (c *sysPost) Edit(r *ghttp.Request) {
var editParams *dao.SysPostEditParams
if err := r.Parse(&editParams); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
editParams.UpdatedBy = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.SysPost.Edit(editParams); err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "修改成功")
}
func (c *sysPost) Delete(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) == 0 {
c.FailJsonExit(r, "删除失败")
}
err := service.SysPost.Delete(ids)
if err != nil {
c.FailJsonExit(r, "删除失败")
}
c.SusJsonExit(r, "删除信息成功")
}
+138
View File
@@ -0,0 +1,138 @@
package api
import (
"gfast/app/common/global"
CommService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysRole struct {
systemBase
}
var SysRole = new(sysRole)
// RoleList 角色列表
func (c *sysRole) RoleList(r *ghttp.Request) {
var req *model.SelectPageReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
total, page, list, err := service.SysRole.GetRoleListSearch(req)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "获取数据失败")
}
c.SusJsonExit(r, g.Map{
"currentPage": page,
"total": total,
"list": list,
})
}
// GetRoleMenu GetRole 新增角色
func (c *sysRole) GetRoleMenu(r *ghttp.Request) {
mListEntities, err := service.Rule.GetMenuList()
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "获取数据失败")
}
mList := service.Rule.GetMenuListTree(0, mListEntities)
res := g.Map{
"menuList": mList,
}
c.SusJsonExit(r, res)
}
// AddRole 新增角色提交
func (c *sysRole) AddRole(r *ghttp.Request) {
res := r.GetFormMap()
if err := service.SysRole.AddRolePost(res); err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "添加角色成功")
}
// 获取修改的角色
func (c *sysRole) GetRole(r *ghttp.Request) {
id := r.GetRequestInt("roleId")
//获取角色信息
role, err := service.SysRole.One(id)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "获取角色数据失败")
}
//获取菜单信息
mListEntities, err := service.Rule.GetMenuList()
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "获取菜单数据失败")
}
mList := service.Rule.GetMenuListTree(0, mListEntities)
//获取角色关联的菜单规则
gpSlice, err := service.SysRole.GetFilteredNamedPolicy(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"menuList": mList,
"role": role,
"checkedRules": gpSlice,
})
}
// EditRole 编辑角色提交
func (c *sysRole) EditRole(r *ghttp.Request) {
id := r.GetRequestInt("roleId")
res := r.GetFormMap()
if err := service.SysRole.EditRolePost(res, id); err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "修改角色成功")
}
// StatusSetRole 设置角色状态
func (c *sysRole) StatusSetRole(r *ghttp.Request) {
var req *model.StatusSetReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
err := service.SysRole.StatusSetRole(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "状态设置成功")
}
// RoleDataScope 角色数据权限分配
func (c *sysRole) RoleDataScope(r *ghttp.Request) {
var req *model.DataScopeReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).Current().Error())
}
err := service.SysRole.RoleDataScope(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, req)
}
// DeleteRole 删除角色
func (c *sysRole) DeleteRole(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) == 0 {
c.FailJsonExit(r, "删除失败,参数错误")
}
err := service.SysRole.DeleteByIds(ids)
if err != nil {
c.FailJsonExit(r, err.Error())
}
CommService.Cache.New().RemoveByTag(global.SysAuthTag)
c.SusJsonExit(r, "删除成功")
}
+233
View File
@@ -0,0 +1,233 @@
package api
import (
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gconv"
"github.com/gogf/gf/util/gvalid"
)
type user struct {
systemBase
}
var User = new(user)
// UserList 获取用户列表
func (c *user) UserList(r *ghttp.Request) {
var req *model.SysUserSearchReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
if err := service.SysUser.WriteDeptIdsOfSearchReq(req); err != nil {
c.FailJsonExit(r, err.Error())
}
total, page, userList, err := service.SysUser.GetUserList(req)
if err != nil {
c.FailJsonExit(r, "获取用户列表数据失败")
}
users, err := service.SysUser.GetUsersRoleDept(userList)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"total": total,
"currentPage": page,
"userList": users,
})
}
// Get 获取添加用户信息
func (c *user) Get(r *ghttp.Request) {
roleListEntities, err := service.SysRole.GetRoleList()
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "获取角色数据失败")
}
posts, err := service.SysUser.GetUsedPost()
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, g.Map{
"roleList": roleListEntities,
"posts": posts,
})
}
// AddUser 添加用户提交
func (c *user) AddUser(r *ghttp.Request) {
var req *model.AddUserReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
err := service.SysUser.AddUser(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "添加管理员成功")
}
// GetEditUser 获取编辑的用户
func (c *user) GetEditUser(r *ghttp.Request) {
id := r.GetUint64("id")
res, err := service.SysUser.GetEditUser(id)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, res)
}
// EditUser 编辑用户提交
func (c *user) EditUser(r *ghttp.Request) {
var req *model.EditUserReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
err := service.SysUser.EditUser(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "修改管理员成功")
}
// GetInfo 获取登陆用户信息
func (c *user) GetInfo(r *ghttp.Request) {
userInfo := c.GetCurrentUser(r.Context())
rolesList := make([]string, 0, 10)
var permissions []string
userId := userInfo.Id
allRoles, err := service.SysRole.GetRoleList()
if err != nil {
c.FailJsonExit(r, err.Error())
}
roles, err := service.SysUser.GetAdminRole(userId, allRoles)
if err != nil {
c.FailJsonExit(r, err.Error())
}
name := make([]string, len(roles))
roleIds := make([]uint, len(roles))
for k, v := range roles {
name[k] = v.Name
roleIds[k] = v.Id
}
isSuperAdmin := false
service.SysUser.NotCheckAuthAdminIds.Iterator(func(v interface{}) bool {
if gconv.Uint64(v) == userId {
isSuperAdmin = true
return false
}
return true
})
if isSuperAdmin {
permissions = []string{"*/*/*"}
} else {
permissions, err = service.SysUser.GetPermissions(roleIds)
}
rolesList = name
c.SusJsonExit(r, g.Map{
"user": userInfo,
"roles": rolesList,
"permissions": permissions,
})
}
// GetRouters 获取用户菜单
func (c *user) GetRouters(r *ghttp.Request) {
//获取用户信息
userInfo := c.GetCurrentUser(r.Context())
//是否超管
isSuperAdmin := false
userId := userInfo.Id
//获取无需验证权限的用户id
service.SysUser.NotCheckAuthAdminIds.Iterator(func(v interface{}) bool {
if gconv.Uint64(v) == userId {
isSuperAdmin = true
return false
}
return true
})
//获取用户角色信息
allRoles, err := service.SysRole.GetRoleList()
if err != nil {
c.FailJsonExit(r, err.Error())
}
roles, e := service.SysUser.GetAdminRole(userId, allRoles)
if e != nil {
c.FailJsonExit(r, e.Error())
}
name := make([]string, len(roles))
roleIds := make([]uint, len(roles))
for k, v := range roles {
name[k] = v.Name
roleIds[k] = v.Id
}
var menuList []service.UserMenus
//获取菜单信息
if isSuperAdmin {
//超管获取所有菜单
menuList, err = service.SysUser.GetAllMenus()
} else {
menuList, err = service.SysUser.GetAdminMenusByRoleIds(roleIds)
}
if err != nil {
c.FailJsonExit(r, e.Error())
}
if menuList == nil {
menuList = make([]service.UserMenus, 0)
}
adminMenus := make([]service.UserMenus, 0, len(menuList))
//过滤非后台模块的菜单
for _, v := range menuList {
if v.ModuleType == "sys_admin" {
adminMenus = append(adminMenus, v)
}
}
c.SusJsonExit(r, adminMenus)
}
func (c *user) ResetUserPwd(r *ghttp.Request) {
var req *model.SysUserResetPwdReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
if err := service.SysUser.ResetUserPwd(req); err != nil {
c.FailJsonExit(r, err.Error())
} else {
c.SusJsonExit(r, "用户密码重置成功")
}
}
func (c *user) ChangeUserStatus(r *ghttp.Request) {
var req *model.SysUserStatusReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
if err := service.SysUser.ChangeUserStatus(req); err != nil {
c.FailJsonExit(r, err.Error())
} else {
c.SusJsonExit(r, "用户状态设置成功")
}
}
func (c *user) DeleteUser(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) > 0 {
err := service.SysUser.DeleteUser(r.GetCtx(), ids)
if err != nil {
g.Log().Error(err)
c.FailJsonExit(r, "删除失败")
}
} else {
c.FailJsonExit(r, "删除失败,参数错误")
}
c.SusJsonExit(r, "删除成功")
}
+57
View File
@@ -0,0 +1,57 @@
/*
* @desc:在线用户管理
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/13 15:10
*/
package api
import (
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysUserOnline struct {
systemBase
}
var SysUserOnline = new(sysUserOnline)
// List 在线用户列表
func (c *sysUserOnline) List(r *ghttp.Request) {
var req *model.SysUserOnlineSearchReq
//获取参数
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
total, page, list, err := service.Online.GetOnlineListPage(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
result := g.Map{
"currentPage": page,
"total": total,
"list": list,
}
c.SusJsonExit(r, result)
}
// ForceLogout 强退用户
func (c *sysUserOnline) ForceLogout(r *ghttp.Request) {
ids := r.GetInts("ids")
if len(ids) == 0 {
c.FailJsonExit(r, "参数错误")
}
tokens, err := service.Online.ForceLogout(ids)
if err != nil {
c.FailJsonExit(r, err.Error())
}
for _, token := range tokens {
GfToken.RemoveToken(token)
}
c.SusJsonExit(r, "用户已退出")
}
+45
View File
@@ -0,0 +1,45 @@
/*
* @desc:站点设置
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/6 15:41
*/
package api
import (
"gfast/app/common/global"
commonService "gfast/app/common/service"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type sysWebSet struct {
systemBase
}
var SysWebSet = new(sysWebSet)
func (c *sysWebSet) Update(r *ghttp.Request) {
var req *model.SysWebSetUpdateReq
err := r.Parse(&req)
if err != nil {
c.FailJson(true, r, err.(gvalid.Error).FirstString())
}
err = service.SysWebSet.UpdateSave(req)
if err != nil {
c.FailJsonExit(r, err.Error())
}
commonService.Cache.New().Remove(global.SysWebSet)
c.SusJsonExit(r, "更新成功!")
}
func (c *sysWebSet) Get(r *ghttp.Request) {
data, err := service.SysWebSet.Get()
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, data)
}
+33
View File
@@ -0,0 +1,33 @@
/*
* @desc:后台上传
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/7 15:10
*/
package api
import (
"gfast/app/common/adapter"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
)
type upload struct {
systemBase
}
var Upload = new(upload)
// UpImg 单图上传
func (c *upload) UpImg(r *ghttp.Request) {
upFile := r.GetUploadFile("file")
info, err := adapter.Upload.UpImg(upFile)
if err != nil {
c.FailJsonExit(r, "上传失败,"+err.Error())
}
res := g.Map{
"fileInfo": info,
}
c.SusJsonExit(r, res)
}
+82
View File
@@ -0,0 +1,82 @@
/*
* @desc:个人中心
* @company:云南省奇讯科技有限公司
* @Author: yixiaohu
* @Date: 2021/7/12 22:14
*/
package api
import (
"gfast/app/common/adapter"
"gfast/app/system/model"
"gfast/app/system/service"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/gogf/gf/util/gvalid"
)
type userProfile struct {
systemBase
}
var UserProfile = new(userProfile)
// Profile 获取个人信息
func (c *userProfile) Profile(r *ghttp.Request) {
//获取用户信息
user, err := service.SysUser.GetUserInfoById(c.GetCurrentUser(r.GetCtx()).GetUserId())
if err != nil {
c.FailJsonExit(r, err.Error())
}
userInfo, err := service.SysUser.GetUserRoleDeptPost(user)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, userInfo)
}
// Avatar 修改头像
func (c *userProfile) Avatar(r *ghttp.Request) {
upFile := r.GetUploadFile("avatarfile")
info, err := adapter.Upload.UpImg(upFile)
if err != nil {
c.FailJsonExit(r, "上传失败,"+err.Error())
}
res := g.Map{
"fileInfo": info,
}
userId := c.GetCurrentUser(r.GetCtx()).GetUserId()
err = service.SysUser.SetAvatar(userId, info.FileUrl)
if err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, res)
}
// Edit 修改个人信息
func (c *userProfile) Edit(r *ghttp.Request) {
var req *model.ProfileUpReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
req.UserId = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.SysUser.ProfileEdit(req); err != nil {
c.FailJsonExit(r, err.Error())
}
c.SusJsonExit(r, "修改成功")
}
// UpdatePwd 修改密码
func (c *userProfile) UpdatePwd(r *ghttp.Request) {
var req *model.ProfileUpdatePwdReq
if err := r.Parse(&req); err != nil {
c.FailJsonExit(r, err.(gvalid.Error).FirstString())
}
req.UserId = c.GetCurrentUser(r.GetCtx()).GetUserId()
if err := service.SysUser.ProfileUpdatePwd(req); err != nil {
c.FailJsonExit(r, err.Error())
} else {
c.SusJsonExit(r, "修改成功")
}
}