From 5d7622f81f166e2a94a343fe5b85d3e0948c38dd Mon Sep 17 00:00:00 2001 From: yxh Date: Wed, 11 Mar 2020 23:41:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7gtoken,service=E4=B8=8Emodel?= =?UTF-8?q?=E6=95=B4=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/admin/index.go | 4 +- app/controller/admin/public.go | 4 +- app/model/admin/auth_rule/auth_rule.go | 83 ++++++ app/model/admin/cms_category/cms_category.go | 138 +++++++++ app/model/admin/role/role.go | 162 +++++++++++ app/model/admin/sys_config/sys_config.go | 150 ++++++++++ .../admin/sys_dict_data/sys_dict_data.go | 119 ++++++++ .../admin/sys_dict_type/sys_dict_type.go | 200 +++++++++++++ app/model/admin/sys_job/sys_job.go | 185 +++++++++++++ .../admin/sys_login_log/sys_login_log.go | 74 +++++ app/model/admin/sys_oper_log/sys_oper_log.go | 3 +- app/model/admin/user/user.go | 94 +++++++ app/model/admin/user_online/user_online.go | 40 +++ app/service/admin/auth_service/auth_rule.go | 262 +----------------- app/service/admin/cms_service/menu.go | 117 +------- app/service/admin/dict_service/dict_data.go | 117 +------- app/service/admin/dict_service/dict_type.go | 164 +---------- app/service/admin/monitor_service/job.go | 158 +---------- .../admin/monitor_service/login_log.go | 66 +---- app/service/admin/monitor_service/online.go | 30 +- app/service/admin/params_service/params.go | 125 +-------- app/service/admin/user_service/user.go | 28 +- boot/boot.go | 18 +- go.mod | 2 +- go.sum | 2 + .../{utils/function.go => service/service.go} | 38 +-- library/utils/tools.go | 31 +++ middleWare/middleware.go | 4 +- 28 files changed, 1361 insertions(+), 1057 deletions(-) create mode 100644 app/model/admin/role/role.go create mode 100644 app/model/admin/user/user.go rename library/{utils/function.go => service/service.go} (87%) diff --git a/app/controller/admin/index.go b/app/controller/admin/index.go index 8577126..d9937a9 100644 --- a/app/controller/admin/index.go +++ b/app/controller/admin/index.go @@ -4,7 +4,7 @@ import ( "gfast/app/service/admin/auth_service" "gfast/app/service/admin/user_service" "gfast/library/response" - "gfast/library/utils" + "gfast/library/service" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/util/gconv" @@ -25,7 +25,7 @@ func (c *Index) Index(r *ghttp.Request) { userId := userEntity.Id delete(userInfo, "user_password") //获取无需验证权限的用户id - for _, v := range utils.NotCheckAuthAdminIds { + for _, v := range service.NotCheckAuthAdminIds { if v == userId { isSuperAdmin = true break diff --git a/app/controller/admin/public.go b/app/controller/admin/public.go index b480da9..a36849e 100644 --- a/app/controller/admin/public.go +++ b/app/controller/admin/public.go @@ -2,7 +2,7 @@ package admin import ( "gfast/library/response" - "gfast/library/utils" + "gfast/library/service" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" ) @@ -11,6 +11,6 @@ type Public struct{} //获取验证码图片信息 func (p *Public) Verify(r *ghttp.Request) { - idKeyC, base64stringC := utils.GetVerifyImgString() + idKeyC, base64stringC := service.GetVerifyImgString() response.SusJson(true, r, "ok", g.MapStrStr{"idKeyC": idKeyC, "base64stringC": base64stringC}) } diff --git a/app/model/admin/auth_rule/auth_rule.go b/app/model/admin/auth_rule/auth_rule.go index c46563a..0c61f90 100644 --- a/app/model/admin/auth_rule/auth_rule.go +++ b/app/model/admin/auth_rule/auth_rule.go @@ -1,5 +1,13 @@ package auth_rule +import ( + "gfast/app/service/cache_service" + "gfast/library/utils" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" +) + //菜单对象 type MenuReq struct { IsMenu int `p:"ismenu" c:"ismenu" v:"min:0|max:1#菜单类型最小值为:min|菜单类型最大值为:max"` @@ -12,3 +20,78 @@ type MenuReq struct { Remark string `p:"remark" c:"remark"` Status int `p:"status" c:"status"` } + +//获取所有菜单 +func GetMenuList() (list []*Entity, err error) { + cache := cache_service.New() + //从缓存获取 + iList := cache.Get(cache_service.AdminAuthMenu) + if iList != nil { + list = iList.([]*Entity) + return + } + //从数据库获取 + list, err = Model.Order("weigh desc,id asc").FindAll() + if err != nil { + return + } + //缓存菜单 + cache.Set(cache_service.AdminAuthMenu, list, 0, cache_service.AdminAuthTag) + return +} + +//检查菜单规则是否存在 +func CheckMenuNameUnique(name string, id int) bool { + model := Model.Where("name=?", name) + if id != 0 { + model = model.And("id!=?", id) + } + c, err := model.Count() + if err != nil { + g.Log().Error(err) + return false + } + return c == 0 +} + +// 添加菜单操作 +func Add(req *MenuReq) (err error, insertId int64) { + menuMap := gconv.Map(req) + now := gtime.Timestamp() + menuMap["createtime"] = now + menuMap["updatetime"] = now + res, e := Model.Insert(menuMap) + err = e + insertId, _ = res.LastInsertId() + return +} + +//修改菜单操作 +func Edit(req *MenuReq, id int) (err error, rows int64) { + menuMap := gconv.Map(req) + now := gtime.Timestamp() + menuMap["updatetime"] = now + res, e := Model.Where("id=?", id).Update(menuMap) + err = e + rows, _ = res.RowsAffected() + return +} + +//删除菜单 +func DeleteByIds(ids []int) (err error) { + //获取菜单数据 + menus, err := GetMenuList() + if err != nil { + return + } + menuList := gconv.SliceMap(menus) + son := make(g.List, 0, len(menuList)) + for _, id := range ids { + son = append(son, utils.FindSonByParentId(menuList, id, "pid", "id")...) + } + for _, v := range son { + ids = append(ids, gconv.Int(v["id"])) + } + _, err = Model.Where("id in (?)", ids).Delete() + return +} diff --git a/app/model/admin/cms_category/cms_category.go b/app/model/admin/cms_category/cms_category.go index d1e54f9..9bc65df 100644 --- a/app/model/admin/cms_category/cms_category.go +++ b/app/model/admin/cms_category/cms_category.go @@ -1,5 +1,13 @@ package cms_category +import ( + "gfast/app/service/cache_service" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/text/gstr" + "github.com/gogf/gf/util/gconv" +) + // Fill with you ideas below. const ( ChannelCateType = 1 //频道类型 @@ -34,3 +42,133 @@ type ReqEdit struct { Id int `p:"id" v:"required|min:1#栏目id不能为空|栏目id参数错误"` ReqAdd } + +//获取所有菜单列表 +func GetList() (list []*Entity, err error) { + cache := cache_service.New() + //从缓存获取数据 + iList := cache.Get(cache_service.AdminCmsMenu) + if iList != nil { + list = iList.([]*Entity) + return + } + list, err = Model.Order("list_order ASC,id ASC").All() + if err != nil { + g.Log().Error() + err = gerror.New("获取菜单数据失败") + } + //缓存数据 + cache.Set(cache_service.AdminCmsMenu, list, 0, cache_service.AdminCmsTag) + return +} + +//获取频道列表 +func GetListChannel() (list []*Entity, err error) { + listAll, err := GetList() + if err != nil { + return + } + list = make([]*Entity, 0, len(listAll)) + for _, v := range listAll { + if v.Status == 1 && v.CateType == ChannelCateType { + list = append(list, v) + } + } + return +} + +//保存栏目操作 +func AddSave(req *ReqAdd) (id int64, err error) { + var entity Entity + entity.ParentId = req.ParentId + entity.CateType = req.CateType + entity.Status = req.Status + entity.Name = req.Name + entity.Description = req.Description + entity.SeoTitle = req.InputSeoTitle + entity.SeoKeywords = req.InputSeoKeywords + entity.SeoDescription = req.InputSeoDescription + entity.CateAddress = req.CateAddress + entity.CateContent = req.CateContent + res, err := entity.Insert() + if err != nil { + g.Log().Error(err) + err = gerror.New("保存失败") + return + } + id, err = res.LastInsertId() + if err != nil { + g.Log().Error(err) + err = gerror.New("保存失败") + return + } + return +} + +//根据栏目ID获取栏目信息 +func GetInfoById(id int) (menu *Entity, err error) { + menus, err := GetList() + if err != nil { + return + } + for _, entity := range menus { + if entity.Id == gconv.Uint64(id) { + menu = entity + break + } + } + return +} + +//修改栏目操作 +func EditSave(req *ReqEdit) (id int64, err error) { + entity, err := GetInfoById(req.Id) + if err != nil { + return + } + if entity == nil { + err = gerror.New("栏目信息不存在") + return + } + entity.Id = gconv.Uint64(req.Id) + entity.ParentId = req.ParentId + entity.CateType = req.CateType + entity.Status = req.Status + entity.Name = req.Name + entity.Description = req.Description + entity.SeoTitle = req.InputSeoTitle + entity.SeoKeywords = req.InputSeoKeywords + entity.SeoDescription = req.InputSeoDescription + entity.CateAddress = req.CateAddress + entity.CateContent = req.CateContent + res, err := entity.Update() + if err != nil { + g.Log().Error(err) + err = gerror.New("修改保存失败") + return + } + id, err = res.RowsAffected() + if err != nil { + g.Log().Error(err) + err = gerror.New("修改保存失败") + return + } + return +} + +//获取搜索栏目结果 +func GetListSearch(req *ReqSearchList) (menus []*Entity, err error) { + menus, err = GetList() + if req != nil { + searchMenus := make([]*Entity, 0, len(menus)) + if req.Name != "" { + for _, entity := range menus { + if gstr.Contains(entity.Name, req.Name) { + searchMenus = append(searchMenus, entity) + } + } + } + menus = searchMenus + } + return +} diff --git a/app/model/admin/role/role.go b/app/model/admin/role/role.go new file mode 100644 index 0000000..798e7fa --- /dev/null +++ b/app/model/admin/role/role.go @@ -0,0 +1,162 @@ +package role + +import ( + "database/sql" + "errors" + "fmt" + "gfast/app/service/cache_service" + "gfast/app/service/casbin_adapter_service" + "gfast/library/utils" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" + "github.com/gogf/gf/util/gvalid" +) + +//获取用户组(角色)列表 +func GetList() (list []*Entity, err error) { + cache := cache_service.New() + //从缓存获取 + iList := cache.Get(cache_service.AdminAuthRole) + if iList != nil { + list = iList.([]*Entity) + return + } + //从数据库获取 + list, err = Model.OrderBy("list_order asc,id asc").All() + //缓存数据 + cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag) + return +} + +func checkRoleData(params map[string]interface{}) error { + rules := []string{ + "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间", + "parent_id@integer|min:0#父级ID必须为整数|父级ID必须大于等于0", + } + + e := gvalid.CheckMap(params, rules) + if e != nil { + return e + } + return nil +} + +//保存角色信息并返回插入的id +func Add(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) { + if e := checkRoleData(data); e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + //保存角色信息 + now := gtime.Timestamp() + roleMap := gdb.Map{ + "parent_id": data["parent_id"], + "status": data["status"], + "name": data["name"], + "create_time": now, + "update_time": now, + "list_order": data["list_order"], + "remark": data["remark"], + } + var res sql.Result + res, err = tx.Table(Table).Data(roleMap).Save() + if err != nil { + return + } + InsId, _ = res.LastInsertId() + return +} + +//修改角色信息操作 +func Edit(tx *gdb.TX, data map[string]interface{}) (err error) { + if _, k := data["id"]; !k { + err = errors.New("缺少更新条件Id") + return + } + if e := checkRoleData(data); e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + //保存角色信息 + now := gtime.Timestamp() + roleMap := gdb.Map{ + "id": data["id"], + "parent_id": data["parent_id"], + "status": data["status"], + "name": data["name"], + "update_time": now, + "list_order": data["list_order"], + "remark": data["remark"], + } + _, err = tx.Table(Table).Data(roleMap).Save() + if err != nil { + return + } + return +} + +//删除角色权限操作 +func DeleteRoleRule(roleId int) (err error) { + enforcer, e := casbin_adapter_service.GetEnforcer() + if e != nil { + err = e + return + } + //查询当前权限 + gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId)) + //删除旧权限 + for _, v := range gp { + _, e = enforcer.RemovePolicy(v) + if e != nil { + err = e + return + } + } + return +} + +func DeleteByIds(ids []int) (err error) { + //查询所有子级id + roleAllEntity, err := GetList() + if err != nil { + g.Log().Debug(err) + err = gerror.New("删除失败,不存在角色信息") + return + } + roleAll := gconv.SliceMap(roleAllEntity) + sonList := make(g.List, 0, len(roleAll)) + for _, id := range ids { + sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...) + } + for _, role := range sonList { + ids = append(ids, gconv.Int(role["id"])) + } + tx, err := g.DB("default").Begin() //开启事务 + if err != nil { + g.Log().Error(err) + err = gerror.New("事务处理失败") + return + } + _, err = tx.Table(Table).Where("id in(?)", ids).Delete() + if err != nil { + g.Log().Error(err) + tx.Rollback() + err = gerror.New("删除失败") + return + } + //删除角色的权限 + for _, v := range ids { + err = DeleteRoleRule(v) + if err != nil { + g.Log().Error(err) + tx.Rollback() + err = gerror.New("删除失败") + return + } + } + tx.Commit() + return +} diff --git a/app/model/admin/sys_config/sys_config.go b/app/model/admin/sys_config/sys_config.go index 6781f2c..0c10836 100644 --- a/app/model/admin/sys_config/sys_config.go +++ b/app/model/admin/sys_config/sys_config.go @@ -1,5 +1,14 @@ package sys_config +import ( + "gfast/library/service" + "gfast/library/utils" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" +) + // Fill with you ideas below. //新增页面请求参数 type AddReq struct { @@ -26,3 +35,144 @@ type SelectPageReq struct { PageNum int `p:"page"` //当前页码 PageSize int `p:"pageSize"` //每页数 } + +//保存参数 +func AddSave(req *AddReq, userId int) (id int64, err error) { + var entity Entity + entity.ConfigName = req.ConfigName + entity.ConfigKey = req.ConfigKey + entity.ConfigType = req.ConfigType + entity.ConfigValue = req.ConfigValue + entity.Remark = req.Remark + entity.CreateTime = gconv.Uint64(gtime.Timestamp()) + entity.CreateBy = gconv.Uint(userId) + result, err := entity.Insert() + if err != nil { + g.Log().Error(err) + err = gerror.New("保存失败") + } + id, err = result.LastInsertId() + if err != nil { + g.Log().Error() + err = gerror.New("获取插入的主键ID失败") + } + return +} + +//修改保存 +func EditSave(req *EditReq, userId int) (int64, error) { + entity, err := GetParamsById(gconv.Int(req.ConfigId)) + if err != nil { + return 0, err + } + entity.ConfigName = req.ConfigName + entity.ConfigKey = req.ConfigKey + entity.ConfigType = req.ConfigType + entity.ConfigValue = req.ConfigValue + entity.Remark = req.Remark + entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) + entity.UpdateBy = gconv.Uint(userId) + result, err := entity.Update() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("修改失败") + } + rows, err := result.RowsAffected() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("修改失败") + } + return rows, nil +} + +//通过id查询参数数据 +func GetParamsById(id int) (entity *Entity, err error) { + entity, err = Model.FindOne("config_id", id) + if err != nil { + g.Log().Error(err) + err = gerror.New("查询参数数据出错") + } + if entity == nil { + err = gerror.New("未查询到参数数据") + } + return +} + +//验证参数键名是否存在 +func CheckConfigKeyUniqueAll(configKey string) error { + entity, err := Model.FindOne("config_key", configKey) + if err != nil { + g.Log().Error(err) + return gerror.New("校验数据失败") + } + if entity != nil { + return gerror.New("参数键名已经存在") + } + return nil +} + +//列表分页搜索查询 +func SelectListByPage(req *SelectPageReq) (total, page int, list []*Entity, err error) { + model := Model + if req != nil { + if req.ConfigName != "" { + model = model.Where("config_name like ?", "%"+req.ConfigName+"%") + } + if req.ConfigType != "" { + model.Where("status = ", gconv.Int(req.ConfigType)) + } + if req.ConfigKey != "" { + model.Where("config_key like ?", "%"+req.ConfigKey+"%") + } + if req.BeginTime != "" { + model = model.Where("create_time >= ? ", utils.StrToTimestamp(req.BeginTime)) + } + + if req.EndTime != "" { + model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime)) + } + } + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + if req.PageNum == 0 { + req.PageNum = 1 + } + page = req.PageNum + if req.PageSize == 0 { + req.PageSize = service.AdminPageNum + } + list, err = model.Page(page, req.PageSize).Order("config_id asc").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//检查键是否已经存在 +func CheckConfigKeyUnique(configKey string, configId int64) error { + entity, err := Model.FindOne("config_key=? and config_id!=?", configKey, configId) + if err != nil { + g.Log().Error(err) + return gerror.New("校验数据失败") + } + if entity != nil { + return gerror.New("参数键名已经存在") + } + return nil +} + +//删除参数 +func DeleteByIds(ids []int) error { + _, err := Model.Delete("config_id in (?)", ids) + if err != nil { + g.Log().Error(err) + return gerror.New("删除失败") + } + return nil +} diff --git a/app/model/admin/sys_dict_data/sys_dict_data.go b/app/model/admin/sys_dict_data/sys_dict_data.go index 24fc2cb..ab48007 100644 --- a/app/model/admin/sys_dict_data/sys_dict_data.go +++ b/app/model/admin/sys_dict_data/sys_dict_data.go @@ -1,5 +1,13 @@ package sys_dict_data +import ( + "gfast/library/service" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" +) + // Fill with you ideas below. //新增字典数据页面请求参数 @@ -28,3 +36,114 @@ type SelectDataPageReq struct { PageNum int `p:"page"` //当前页码 PageSize int `p:"pageSize"` //每页数 } + +//添加字典数据操作 +func AddSaveData(req *AddDataReq, userId int) (int64, error) { + var entity Entity + entity.DictType = req.DictType + entity.Status = req.Status + entity.DictLabel = req.DictLabel + entity.CssClass = req.CssClass + entity.DictSort = req.DictSort + entity.DictValue = req.DictValue + entity.IsDefault = req.IsDefault + entity.ListClass = req.ListClass + entity.Remark = req.Remark + entity.CreateTime = gconv.Uint64(gtime.Timestamp()) + entity.CreateBy = userId + result, err := entity.Insert() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("添加失败") + } + id, err := result.LastInsertId() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("添加失败") + } + return id, nil +} + +//通过字典数据主键获取数据 +func GetById(dictCode int) (*Entity, error) { + entity, err := Model.FindOne("dict_code", dictCode) + if err != nil { + g.Log().Error(err) + return nil, gerror.New("获取字典数据失败") + } + if entity == nil { + return nil, gerror.New("获取字典数据失败") + } + return entity, nil +} + +//修改字典数据操作 +func EditSaveData(req *EditDataReq, userId int) (int64, error) { + entity, err := GetById(req.DictCode) + if err != nil { + return 0, err + } + entity.DictType = req.DictType + entity.Status = req.Status + entity.DictLabel = req.DictLabel + entity.CssClass = req.CssClass + entity.DictSort = req.DictSort + entity.DictValue = req.DictValue + entity.IsDefault = req.IsDefault + entity.ListClass = req.ListClass + entity.Remark = req.Remark + entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) + entity.UpdateBy = userId + result, err := entity.Update() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("修改失败") + } + return result.RowsAffected() +} + +//字典数据列表查询分页 +func SelectDataListByPage(req *SelectDataPageReq) (total, page int, list []*Entity, err error) { + model := Model + if req != nil { + if req.DictLabel != "" { + model = model.Where("dict_label like ?", "%"+req.DictLabel+"%") + } + if req.Status != "" { + model = model.Where("status = ", gconv.Int(req.Status)) + } + if req.DictType != "" { + model = model.Where("dict_type = ?", req.DictType) + } + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + if req.PageNum == 0 { + req.PageNum = 1 + } + } + page = req.PageNum + if req.PageSize == 0 { + req.PageSize = service.AdminPageNum + } + list, err = model.Page(page, req.PageSize).Order("dict_sort asc,dict_code asc").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//删除字典数据 +func DeleteByIds(ids []int) error { + _, err := Model.Delete("dict_code in (?)", ids) + if err != nil { + g.Log().Error(err) + return gerror.New("删除失败") + } + return nil +} diff --git a/app/model/admin/sys_dict_type/sys_dict_type.go b/app/model/admin/sys_dict_type/sys_dict_type.go index 80db190..344c868 100644 --- a/app/model/admin/sys_dict_type/sys_dict_type.go +++ b/app/model/admin/sys_dict_type/sys_dict_type.go @@ -1,5 +1,16 @@ package sys_dict_type +import ( + "gfast/app/model/admin/sys_dict_data" + "gfast/library/service" + "gfast/library/utils" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/text/gstr" + "github.com/gogf/gf/util/gconv" +) + // Fill with you ideas below. //新增操作请求参数 @@ -26,3 +37,192 @@ type SelectPageReq struct { PageNum int `p:"page"` //当前页码 PageSize int `p:"pageSize"` //每页数 } + +//添加数据 +func AddSave(req *AddReq, userId int) (int64, error) { + var entity Entity + entity.Status = req.Status + entity.DictType = req.DictType + entity.DictName = req.DictName + entity.Remark = req.Remark + entity.CreateTime = gconv.Uint64(gtime.Timestamp()) + entity.CreateBy = gconv.Uint(userId) + + result, err := entity.Insert() + if err != nil { + return 0, err + } + id, err := result.LastInsertId() + if err != nil || id <= 0 { + return 0, err + } + return id, nil +} + +//通过id获取字典数据 +func GetDictById(id int) (dict *Entity, err error) { + dict, err = Model.FindOne("dict_id=?", id) + if err != nil { + g.Log().Error(err) + err = gerror.New("获取字典数据失败") + return + } + if dict == nil { + err = gerror.New("获取字典数据失败") + return + } + return +} + +//修改保存字典类型 +func EditSave(req *EditReq, userId int) (int64, error) { + entity, err := GetDictById(gconv.Int(req.DictId)) + if err != nil || entity == nil { + return 0, err + } + entity.DictType = req.DictType + entity.DictName = req.DictName + entity.Status = req.Status + entity.Remark = req.Remark + entity.UpdateBy = gconv.Uint(userId) + entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) + res, err := entity.Update() + if err != nil { + g.Log().Error(err) + return 0, gerror.New("更新失败") + } + return res.RowsAffected() +} + +//根据主键判断是否唯一 +func CheckDictTypeUnique(dictType *EditReq) bool { + dict, err := Model.FindOne("dict_type=? and dict_id!=?", dictType.DictType, dictType.DictId) + if err != nil { + g.Log().Error(err) + return false + } + if dict != nil { + return false + } + return true +} + +//检查字典类型是否唯一 +func CheckDictTypeUniqueAll(dictType string) bool { + dict, err := Model.FindOne("dict_type=?", dictType) + if err != nil { + g.Log().Error(err) + return false + } + if dict != nil { + return false + } + return true +} + +//字典列表查询分页 +func SelectListByPage(req *SelectPageReq) (total, page int, list []*Entity, err error) { + model := Model + if req != nil { + if req.DictName != "" { + model = model.Where("dict_name like ?", "%"+req.DictName+"%") + } + + if req.DictType != "" { + model = model.Where("dict_type like ?", "%"+req.DictType+"%") + } + + if req.Status != "" { + model = model.Where("status = ", gconv.Int(req.Status)) + } + + if req.BeginTime != "" { + model = model.Where("create_time >=?", utils.StrToTimestamp(req.BeginTime)) + } + + if req.EndTime != "" { + model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime)) + } + } + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + if req.PageNum == 0 { + req.PageNum = 1 + } + page = req.PageNum + if req.PageSize == 0 { + req.PageSize = service.AdminPageNum + } + list, err = model.Page(page, req.PageSize).Order("dict_id asc").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//通过字典键类型获取选项 +func GetDictWithDataByType(dictType, defaultValue, emptyLabel string) (dict g.Map, err error) { + dictEntity, err := Model.FindOne("dict_type", dictType) + if err != nil { + g.Log().Error(err) + err = gerror.New("获取字典选项失败") + return + } + var dictDataEntities []*sys_dict_data.Entity + if dictEntity != nil { + //获取字典数据 + dictDataEntities, err = sys_dict_data.Model.Where("dict_type", dictType). + Order("dict_sort ASC,dict_code ASC").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取字典选项失败") + return + } + values := make(g.List, len(dictDataEntities)) + for k, v := range dictDataEntities { + isDefault := 0 + if defaultValue != "" { + if gstr.Equal(defaultValue, v.DictValue) { + isDefault = 1 + } + } else if emptyLabel == "" { + isDefault = v.IsDefault + } + values[k] = g.Map{ + "key": v.DictValue, + "value": v.DictLabel, + "isDefault": isDefault, + } + } + if emptyLabel != "" { + values = append(g.List{g.Map{"isDefault": 0, "key": "", "value": emptyLabel}}, values...) + } + dict = g.Map{ + "dict_name": dictEntity.DictName, + "remark": dictEntity.Remark, + "values": values, + } + } + return +} + +//删除字典 +func DeleteDictByIds(ids []int) error { + discs, err := Model.Where("dict_id in(?)", ids).All() + if err != nil { + g.Log().Error(err) + return gerror.New("没有要删除的数据") + } + //删除字典下的数据 + for _, v := range discs { + sys_dict_data.Model.Delete("dict_type=?", v.DictType) + v.Delete() + } + return nil +} diff --git a/app/model/admin/sys_job/sys_job.go b/app/model/admin/sys_job/sys_job.go index eaaf368..fed6590 100644 --- a/app/model/admin/sys_job/sys_job.go +++ b/app/model/admin/sys_job/sys_job.go @@ -1,5 +1,16 @@ package sys_job +import ( + "gfast/app/task" + "gfast/library/service" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gcron" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" + "strings" +) + // Fill with you ideas below. //添加操作请求参数 @@ -29,3 +40,177 @@ type SelectPageReq struct { PageNum int `p:"page"` //当前页码 PageSize int `p:"pageSize"` //每页数 } + +func GetJobs() (jobs []*Entity, err error) { + jobs, err = Model.Where("status", 0).All() + return +} + +//添加计划任务 +func Add(req *ReqAdd, userId int) (id int64, err error) { + entity := new(Entity) + entity.JobName = req.JobName + entity.JobGroup = req.JobGroup + entity.InvokeTarget = req.InvokeTarget + entity.JobParams = req.JobParams + entity.CronExpression = req.CronExpression + entity.MisfirePolicy = req.MisfirePolicy + entity.Remark = req.Remark + entity.Status = req.Status + entity.CreateTime = gconv.Uint64(gtime.Timestamp()) + entity.CreateBy = gconv.Uint64(userId) + res, err := entity.Save() + if err != nil { + g.Log().Error(err) + err = gerror.New("添加任务失败") + } + id, err = res.LastInsertId() + if err != nil { + g.Log().Error(err) + err = gerror.New("添加任务失败") + } + return +} + +//通过id获取任务信息 +func GetJobInfoById(id int64) (job *Entity, err error) { + if id == 0 { + err = gerror.New("参数错误") + return + } + job, err = Model.FindOne("job_id", id) + if err != nil { + g.Log().Error(err) + } + if job == nil || err != nil { + err = gerror.New("获取任务信息失败") + return + } + return +} + +//修改计划任务 +func Edit(req *ReqEdit, userId int) (rows int64, err error) { + entity, err := GetJobInfoById(req.JobId) + if err != nil { + return + } + entity.JobName = req.JobName + entity.JobGroup = req.JobGroup + entity.InvokeTarget = req.InvokeTarget + entity.JobParams = req.JobParams + entity.CronExpression = req.CronExpression + entity.MisfirePolicy = req.MisfirePolicy + entity.Remark = req.Remark + entity.Status = req.Status + entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) + entity.UpdateBy = gconv.Uint64(userId) + res, err := entity.Update() + if err != nil { + g.Log().Error(err) + err = gerror.New("修改任务失败") + } + rows, err = res.RowsAffected() + if err != nil { + g.Log().Error(err) + err = gerror.New("修改任务失败") + } + return +} + +//任务列表 +func JobListByPage(req *SelectPageReq) (total, page int, list []*Entity, err error) { + model := Model + if req != nil { + if req.Status != "" { + model = model.Where("status", gconv.Int(req.Status)) + } + if req.JobGroup != "" { + model = model.Where("job_group", req.JobGroup) + } + if req.JobName != "" { + model = model.Where("job_name like ?", "%"+req.JobName+"%") + } + } + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + if req.PageNum == 0 { + req.PageNum = 1 + } + page = req.PageNum + if req.PageSize == 0 { + req.PageSize = service.AdminPageNum + } + list, err = model.Page(page, req.PageSize).Order("job_id asc").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//批量删除计划任务 +func DeleteJobByIds(ids []int) (err error) { + if len(ids) == 0 { + err = gerror.New("参数错误") + } + _, err = Model.Delete("job_id in (?)", ids) + if err != nil { + g.Log().Error(err) + err = gerror.New("删除失败") + } + return +} + +//启动任务 +func JobStart(job *Entity) error { + //可以task目录下是否绑定对应的方法 + f := task.GetByName(job.InvokeTarget) + if f == nil { + return gerror.New("当前task目录下没有绑定这个方法") + } + //传参 + paramArr := strings.Split(job.JobParams, "|") + task.EditParams(f.FuncName, paramArr) + rs := gcron.Search(job.InvokeTarget) + if rs == nil { + if job.MisfirePolicy == 1 { + task, err := gcron.Add(job.CronExpression, f.Run, job.InvokeTarget) + if err != nil || task == nil { + return err + } + } else { + task, err := gcron.AddOnce(job.CronExpression, f.Run, job.InvokeTarget) + if err != nil || task == nil { + return err + } + } + } + gcron.Start(job.InvokeTarget) + if job.MisfirePolicy == 1 { + job.Status = 0 + job.Update() + } + return nil +} + +//停止任务 +func JobStop(job *Entity) error { + //可以task目录下是否绑定对应的方法 + f := task.GetByName(job.InvokeTarget) + if f == nil { + return gerror.New("当前task目录下没有绑定这个方法") + } + rs := gcron.Search(job.InvokeTarget) + if rs != nil { + gcron.Stop(job.InvokeTarget) + } + job.Status = 1 + job.Update() + return nil +} diff --git a/app/model/admin/sys_login_log/sys_login_log.go b/app/model/admin/sys_login_log/sys_login_log.go index b9d1a16..9520d2b 100644 --- a/app/model/admin/sys_login_log/sys_login_log.go +++ b/app/model/admin/sys_login_log/sys_login_log.go @@ -1,5 +1,12 @@ package sys_login_log +import ( + "gfast/library/utils" + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/util/gconv" +) + // Fill with you ideas below. //查询列表请求参数 type SelectPageReq struct { @@ -13,3 +20,70 @@ type SelectPageReq struct { SortName string `p:"orderByColumn"` //排序字段 SortOrder string `p:"isAsc"` //排序方式 } + +func LoginLogListByPage(req *SelectPageReq) (total, page int, list []*Entity, err error) { + model := Model + page = req.PageNum + order := "login_time DESC" + + if req.LoginName != "" { + model = model.Where("login_name like ?", "%"+req.LoginName+"%") + } + if req.Status != "" { + model = model.Where("status", gconv.Int(req.Status)) + } + if req.Ipaddr != "" { + model = model.Where("ipaddr like ?", "%"+req.Ipaddr+"%") + } + if req.BeginTime != "" { + model = model.Where("login_time >=", utils.StrToTimestamp(req.BeginTime)) + } + if req.EndTime != "" { + model = model.Where("login_time <=", utils.StrToTimestamp(req.EndTime)) + } + if req.SortName != "" { + if req.SortOrder != "" { + order = req.SortName + " " + req.SortOrder + } else { + order = req.SortName + " DESC" + } + } + + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + list, err = model.Page(page, req.PageSize).Order(order).All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//删除登录日志 +func DeleteLoginLogByIds(ids []int) (err error) { + if len(ids) == 0 { + err = gerror.New("参数错误") + return + } + _, err = Model.Delete("info_id in (?)", ids) + if err != nil { + g.Log().Error(err) + err = gerror.New("删除失败") + } + return +} + +//清空日志 +func ClearLoginLog() (err error) { + _, err = g.DB().Exec("truncate " + Table) + if err != nil { + g.Log().Error(err) + err = gerror.New("清除失败") + } + return +} diff --git a/app/model/admin/sys_oper_log/sys_oper_log.go b/app/model/admin/sys_oper_log/sys_oper_log.go index d71ebfe..fe5516d 100644 --- a/app/model/admin/sys_oper_log/sys_oper_log.go +++ b/app/model/admin/sys_oper_log/sys_oper_log.go @@ -3,6 +3,7 @@ package sys_oper_log import ( "gfast/app/model/admin/auth_rule" "gfast/app/model/admin/user" + "gfast/library/service" "gfast/library/utils" "github.com/gogf/gf/encoding/gjson" "github.com/gogf/gf/errors/gerror" @@ -110,7 +111,7 @@ func ListByPage(req *SelectPageReq) (total, page int, list []*Entity, err error) } page = req.PageNum if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum + req.PageSize = service.AdminPageNum } list, err = model.Page(page, req.PageSize).FieldsEx("oper_param,json_result").Order(order).All() if err != nil { diff --git a/app/model/admin/user/user.go b/app/model/admin/user/user.go new file mode 100644 index 0000000..ea27e1e --- /dev/null +++ b/app/model/admin/user/user.go @@ -0,0 +1,94 @@ +package user + +import ( + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" + "github.com/gogf/gf/os/gtime" + "github.com/gogf/gf/util/gconv" + "github.com/gogf/gf/util/gvalid" +) + +//验证用户表单数据 +func checkUserData(params map[string]interface{}, t string) error { + rules := []string{ + "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0", + "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间", + "mobile@telephone#手机号码格式不正确", + "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间", + "user_email@email#邮箱格式错误", + } + if t == "add" { + rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间") + } else { + rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间") + } + e := gvalid.CheckMap(params, rules) + if e != nil { + return e + } + return nil +} + +//添加管理员操作 +func Add(data map[string]interface{}) (InsertId int64, err error) { + e := checkUserData(data, "add") + if e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + if i, _ := Model.Where("user_name=?", data["user_name"]).Count(); i != 0 { + err = gerror.New("用户名已经存在") + return + } + if i, _ := Model.Where("mobile=?", data["mobile"]).Count(); i != 0 { + err = gerror.New("手机号已经存在") + return + } + //保存管理员信息 + data["create_time"] = gtime.Timestamp() + res, err := Model.Filter().Data(data).Save() + if err != nil { + return + } + InsertId, _ = res.LastInsertId() + return +} + +//修改用户信息 +func Edit(data map[string]interface{}) (err error) { + e := checkUserData(data, "edit") + if e != nil { + err = gerror.New(e.(*gvalid.Error).FirstString()) + return + } + if i, _ := Model.Where("id!=? and user_name=?", data["id"], data["user_name"]).Count(); i != 0 { + err = gerror.New("用户名已经存在") + return + } + if i, _ := Model.Where("id!=? and mobile=?", data["mobile"]).Count(); i != 0 { + err = gerror.New("手机号已经存在") + return + } + //保存管理员信息 + _, err = Model.Filter().Data(data).Save() + if err != nil { + return + } + return +} + +//获取管理员列表 +func GetAdminList(where g.Map, page, pageNum int) (total int, userList []*Entity, err error) { + userModel := Model + if v, ok := where["keyWords"]; ok { + keyWords := gconv.String(v) + if keyWords != "" { + keyWords = "%" + keyWords + "%" + userModel = userModel.Where("user_name like ? or mobile like ? or user_nickname like ?", + keyWords, keyWords, keyWords) + } + } + total, err = userModel.Count() + userList, err = userModel.ForPage(page, pageNum).OrderBy("id asc").All() + return +} diff --git a/app/model/admin/user_online/user_online.go b/app/model/admin/user_online/user_online.go index a4814dc..edbfa90 100644 --- a/app/model/admin/user_online/user_online.go +++ b/app/model/admin/user_online/user_online.go @@ -1,5 +1,10 @@ package user_online +import ( + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" +) + // Fill with you ideas below. //列表搜索参数 type ReqListSearch struct { @@ -8,3 +13,38 @@ type ReqListSearch struct { PageNum int `p:"page"` //当前页码 PageSize int `p:"pageSize"` //每页数 } + +//获取在线用户列表 +func GetOnlineListPage(req *ReqListSearch) (total, page int, list []*Entity, err error) { + page = req.PageNum + model := Model + if req.Ip != "" { + model = model.Where("ip like ?", "%"+req.Ip+"%") + } + if req.Username != "" { + model = model.Where("user_name like ?", "%"+req.Username+"%") + } + total, err = model.Count() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取总行数失败") + return + } + + list, err = model.FieldsEx("token").Page(page, req.PageSize).Order("create_time DESC").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +func GetInfoById(id int) (entity *Entity, err error) { + entity, err = Model.FindOne("id", id) + if err != nil { + g.Log().Error(err) + err = gerror.New("获取在线用户信息失败") + } + return +} diff --git a/app/service/admin/auth_service/auth_rule.go b/app/service/admin/auth_service/auth_rule.go index e939832..d9f942b 100644 --- a/app/service/admin/auth_service/auth_rule.go +++ b/app/service/admin/auth_service/auth_rule.go @@ -1,21 +1,14 @@ package auth_service import ( - "database/sql" - "errors" "fmt" "gfast/app/model/admin/auth_rule" "gfast/app/model/admin/role" "gfast/app/model/admin/user" - "gfast/app/service/cache_service" "gfast/app/service/casbin_adapter_service" "gfast/library/utils" "github.com/gogf/gf/database/gdb" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/os/gtime" "github.com/gogf/gf/util/gconv" - "github.com/gogf/gf/util/gvalid" ) //获取isMenu==1菜单列表 @@ -65,100 +58,32 @@ func GetMenuIsStatusList() ([]*auth_rule.Entity, error) { //获取所有菜单 func GetMenuList() (list []*auth_rule.Entity, err error) { - cache := cache_service.New() - //从缓存获取 - iList := cache.Get(cache_service.AdminAuthMenu) - if iList != nil { - list = iList.([]*auth_rule.Entity) - return - } - //从数据库获取 - list, err = auth_rule.Model.Order("weigh desc,id asc").FindAll() - if err != nil { - return - } - //缓存菜单 - cache.Set(cache_service.AdminAuthMenu, list, 0, cache_service.AdminAuthTag) - return + return auth_rule.GetMenuList() } //检查菜单规则是否存在 func CheckMenuNameUnique(name string, id int) bool { - model := auth_rule.Model.Where("name=?", name) - if id != 0 { - model = model.And("id!=?", id) - } - c, err := model.Count() - if err != nil { - g.Log().Error(err) - return false - } - return c == 0 + return auth_rule.CheckMenuNameUnique(name, id) } // 添加菜单操作 func AddMenu(req *auth_rule.MenuReq) (err error, insertId int64) { - menuMap := gconv.Map(req) - now := gtime.Timestamp() - menuMap["createtime"] = now - menuMap["updatetime"] = now - res, e := auth_rule.Model.Insert(menuMap) - err = e - insertId, _ = res.LastInsertId() - return + return auth_rule.Add(req) } //修改菜单操作 func EditMenu(req *auth_rule.MenuReq, id int) (err error, rows int64) { - menuMap := gconv.Map(req) - now := gtime.Timestamp() - menuMap["updatetime"] = now - res, e := auth_rule.Model.Where("id=?", id).Update(menuMap) - err = e - rows, _ = res.RowsAffected() - return + return auth_rule.Edit(req, id) } //获取用户组(角色)列表 func GetRoleList() (list []*role.Entity, err error) { - cache := cache_service.New() - //从缓存获取 - iList := cache.Get(cache_service.AdminAuthRole) - if iList != nil { - list = iList.([]*role.Entity) - return - } - //从数据库获取 - list, err = role.Model.OrderBy("list_order asc,id asc").All() - //缓存数据 - cache.Set(cache_service.AdminAuthRole, list, 0, cache_service.AdminAuthTag) - return + return role.GetList() } //保存角色信息并返回插入的id func AddRole(tx *gdb.TX, data map[string]interface{}) (InsId int64, err error) { - if e := checkRoleData(data); e != nil { - err = gerror.New(e.(*gvalid.Error).FirstString()) - return - } - //保存角色信息 - now := gtime.Timestamp() - roleMap := gdb.Map{ - "parent_id": data["parent_id"], - "status": data["status"], - "name": data["name"], - "create_time": now, - "update_time": now, - "list_order": data["list_order"], - "remark": data["remark"], - } - var res sql.Result - res, err = tx.Table(role.Table).Data(roleMap).Save() - if err != nil { - return - } - InsId, _ = res.LastInsertId() - return + return role.Add(tx, data) } //添加角色授权规则 @@ -180,30 +105,7 @@ func AddRoleRule(iRule interface{}, roleId int64) (err error) { //修改角色信息操作 func EditRole(tx *gdb.TX, data map[string]interface{}) (err error) { - if _, k := data["id"]; !k { - err = errors.New("缺少更新条件Id") - return - } - if e := checkRoleData(data); e != nil { - err = gerror.New(e.(*gvalid.Error).FirstString()) - return - } - //保存角色信息 - now := gtime.Timestamp() - roleMap := gdb.Map{ - "id": data["id"], - "parent_id": data["parent_id"], - "status": data["status"], - "name": data["name"], - "update_time": now, - "list_order": data["list_order"], - "remark": data["remark"], - } - _, err = tx.Table(role.Table).Data(roleMap).Save() - if err != nil { - return - } - return + return role.Edit(tx, data) } //修改角色的授权规则 @@ -235,91 +137,25 @@ func EditRoleRule(iRule interface{}, roleId int64) (err error) { //删除角色权限操作 func DeleteRoleRule(roleId int) (err error) { - enforcer, e := casbin_adapter_service.GetEnforcer() - if e != nil { - err = e - return - } - //查询当前权限 - gp := enforcer.GetFilteredNamedPolicy("p", 0, fmt.Sprintf("g_%d", roleId)) - //删除旧权限 - for _, v := range gp { - _, e = enforcer.RemovePolicy(v) - if e != nil { - err = e - return - } - } - return -} - -func checkRoleData(params map[string]interface{}) error { - rules := []string{ - "name@required|length:1,20#请填写角色名称|名称应在:min到:max个字符之间", - "parent_id@integer|min:0#父级ID必须为整数|父级ID必须大于等于0", - } - - e := gvalid.CheckMap(params, rules) - if e != nil { - return e - } - return nil + return role.DeleteRoleRule(roleId) } //添加管理员操作 func AddUser(data map[string]interface{}) (InsertId int64, err error) { - e := checkUserData(data, "add") - if e != nil { - err = gerror.New(e.(*gvalid.Error).FirstString()) - return - } - if i, _ := user.Model.Where("user_name=?", data["user_name"]).Count(); i != 0 { - err = gerror.New("用户名已经存在") - return - } - if i, _ := user.Model.Where("mobile=?", data["mobile"]).Count(); i != 0 { - err = gerror.New("手机号已经存在") - return - } - //保存管理员信息 - data["create_time"] = gtime.Timestamp() //密码加密 data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey) - res, err := user.Model.Filter().Data(data).Save() - if err != nil { - return - } - InsertId, _ = res.LastInsertId() - return + return user.Add(data) } //修改用户信息 func EditUser(data map[string]interface{}) (err error) { - e := checkUserData(data, "edit") - if e != nil { - err = gerror.New(e.(*gvalid.Error).FirstString()) - return - } - if i, _ := user.Model.Where("id!=? and user_name=?", data["id"], data["user_name"]).Count(); i != 0 { - err = gerror.New("用户名已经存在") - return - } - if i, _ := user.Model.Where("id!=? and mobile=?", data["mobile"]).Count(); i != 0 { - err = gerror.New("手机号已经存在") - return - } - //保存管理员信息 //提交了密码?密码加密 if val, ok := data["user_password"]; ok && gconv.String(val) != "" { data["user_password"] = utils.EncryptCBC(gconv.String(data["user_password"]), utils.AdminCbcPublicKey) } else { delete(data, "user_password") } - _, err = user.Model.Filter().Data(data).Save() - if err != nil { - return - } - return + return user.Edit(data) } //添加用户角色信息 @@ -358,85 +194,11 @@ func EditUserRole(roleIds interface{}, userId int) (err error) { return } -//验证用户表单数据 -func checkUserData(params map[string]interface{}, t string) error { - rules := []string{ - "id@integer|min:1#管理员id必须为整数|管理员Id必须大于0", - "user_name@required|length:3,60#请填用户名|用户名应在:min到:max个字符之间", - "mobile@telephone#手机号码格式不正确", - "user_nickname@required|length:3,50#请填写姓名|姓名应在:min到:max个字符之间", - "user_email@email#邮箱格式错误", - } - if t == "add" { - rules = append(rules, "user_password@required|length:6,60#请填写密码|密码应在::min到:max个字符之间") - } else { - rules = append(rules, "user_password@length:6,60#密码应在::min到:max个字符之间") - } - e := gvalid.CheckMap(params, rules) - if e != nil { - return e - } - return nil -} - func DeleteRoleByIds(ids []int) (err error) { - //查询所有子级id - roleAllEntity, err := GetRoleList() - if err != nil { - g.Log().Debug(err) - err = gerror.New("删除失败,不存在角色信息") - return - } - roleAll := gconv.SliceMap(roleAllEntity) - sonList := make(g.List, 0, len(roleAll)) - for _, id := range ids { - sonList = append(sonList, utils.FindSonByParentId(roleAll, id, "parent_id", "id")...) - } - for _, role := range sonList { - ids = append(ids, gconv.Int(role["id"])) - } - tx, err := g.DB("default").Begin() //开启事务 - if err != nil { - g.Log().Error(err) - err = gerror.New("事务处理失败") - return - } - _, err = tx.Table(role.Table).Where("id in(?)", ids).Delete() - if err != nil { - g.Log().Error(err) - tx.Rollback() - err = gerror.New("删除失败") - return - } - //删除角色的权限 - for _, v := range ids { - err = DeleteRoleRule(v) - if err != nil { - g.Log().Error(err) - tx.Rollback() - err = gerror.New("删除失败") - return - } - } - tx.Commit() - return + return role.DeleteByIds(ids) } //删除菜单 func DeleteMenuByIds(ids []int) (err error) { - //获取菜单数据 - menus, err := GetMenuList() - if err != nil { - return - } - menuList := gconv.SliceMap(menus) - son := make(g.List, 0, len(menuList)) - for _, id := range ids { - son = append(son, utils.FindSonByParentId(menuList, id, "pid", "id")...) - } - for _, v := range son { - ids = append(ids, gconv.Int(v["id"])) - } - _, err = auth_rule.Model.Where("id in (?)", ids).Delete() - return + return auth_rule.DeleteByIds(ids) } diff --git a/app/service/admin/cms_service/menu.go b/app/service/admin/cms_service/menu.go index 40b8d20..e190f58 100644 --- a/app/service/admin/cms_service/menu.go +++ b/app/service/admin/cms_service/menu.go @@ -2,139 +2,34 @@ package cms_service import ( "gfast/app/model/admin/cms_category" - "gfast/app/service/cache_service" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/text/gstr" - "github.com/gogf/gf/util/gconv" ) //获取频道列表 func GetMenuListChannel() (list []*cms_category.Entity, err error) { - listAll, err := GetMenuList() - if err != nil { - return - } - list = make([]*cms_category.Entity, 0, len(listAll)) - for _, v := range listAll { - if v.Status == 1 && v.CateType == cms_category.ChannelCateType { - list = append(list, v) - } - } - return + return cms_category.GetListChannel() } //获取所有菜单列表 func GetMenuList() (list []*cms_category.Entity, err error) { - cache := cache_service.New() - //从缓存获取数据 - iList := cache.Get(cache_service.AdminCmsMenu) - if iList != nil { - list = iList.([]*cms_category.Entity) - return - } - list, err = cms_category.Model.Order("list_order ASC,id ASC").All() - if err != nil { - g.Log().Error() - err = gerror.New("获取菜单数据失败") - } - //缓存数据 - cache.Set(cache_service.AdminCmsMenu, list, 0, cache_service.AdminCmsTag) - return + return cms_category.GetList() } //保存栏目操作 func AddSave(req *cms_category.ReqAdd) (id int64, err error) { - var entity cms_category.Entity - entity.ParentId = req.ParentId - entity.CateType = req.CateType - entity.Status = req.Status - entity.Name = req.Name - entity.Description = req.Description - entity.SeoTitle = req.InputSeoTitle - entity.SeoKeywords = req.InputSeoKeywords - entity.SeoDescription = req.InputSeoDescription - entity.CateAddress = req.CateAddress - entity.CateContent = req.CateContent - res, err := entity.Insert() - if err != nil { - g.Log().Error(err) - err = gerror.New("保存失败") - return - } - id, err = res.LastInsertId() - if err != nil { - g.Log().Error(err) - err = gerror.New("保存失败") - return - } - return + return cms_category.AddSave(req) } //修改栏目操作 func EditSave(req *cms_category.ReqEdit) (id int64, err error) { - entity, err := GetMenuInfoById(req.Id) - if err != nil { - return - } - if entity == nil { - err = gerror.New("栏目信息不存在") - return - } - entity.Id = gconv.Uint64(req.Id) - entity.ParentId = req.ParentId - entity.CateType = req.CateType - entity.Status = req.Status - entity.Name = req.Name - entity.Description = req.Description - entity.SeoTitle = req.InputSeoTitle - entity.SeoKeywords = req.InputSeoKeywords - entity.SeoDescription = req.InputSeoDescription - entity.CateAddress = req.CateAddress - entity.CateContent = req.CateContent - res, err := entity.Update() - if err != nil { - g.Log().Error(err) - err = gerror.New("修改保存失败") - return - } - id, err = res.RowsAffected() - if err != nil { - g.Log().Error(err) - err = gerror.New("修改保存失败") - return - } - return + return cms_category.EditSave(req) } //获取搜索栏目结果 func GetMenuListSearch(req *cms_category.ReqSearchList) (menus []*cms_category.Entity, err error) { - menus, err = GetMenuList() - if req != nil { - searchMenus := make([]*cms_category.Entity, 0, len(menus)) - if req.Name != "" { - for _, entity := range menus { - if gstr.Contains(entity.Name, req.Name) { - searchMenus = append(searchMenus, entity) - } - } - } - menus = searchMenus - } - return + return cms_category.GetListSearch(req) } //根据栏目ID获取栏目信息 func GetMenuInfoById(id int) (menu *cms_category.Entity, err error) { - menus, err := GetMenuList() - if err != nil { - return - } - for _, entity := range menus { - if entity.Id == gconv.Uint64(id) { - menu = entity - break - } - } - return + return cms_category.GetInfoById(id) } diff --git a/app/service/admin/dict_service/dict_data.go b/app/service/admin/dict_service/dict_data.go index c97a675..f3d2d7f 100644 --- a/app/service/admin/dict_service/dict_data.go +++ b/app/service/admin/dict_service/dict_data.go @@ -2,136 +2,29 @@ package dict_service import ( "gfast/app/model/admin/sys_dict_data" - "gfast/app/model/admin/sys_dict_type" - "gfast/library/utils" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/os/gtime" - "github.com/gogf/gf/util/gconv" ) //添加字典数据操作 func AddSaveData(req *sys_dict_data.AddDataReq, userId int) (int64, error) { - var entity sys_dict_data.Entity - entity.DictType = req.DictType - entity.Status = req.Status - entity.DictLabel = req.DictLabel - entity.CssClass = req.CssClass - entity.DictSort = req.DictSort - entity.DictValue = req.DictValue - entity.IsDefault = req.IsDefault - entity.ListClass = req.ListClass - entity.Remark = req.Remark - entity.CreateTime = gconv.Uint64(gtime.Timestamp()) - entity.CreateBy = userId - result, err := entity.Insert() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("添加失败") - } - id, err := result.LastInsertId() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("添加失败") - } - return id, nil + return sys_dict_data.AddSaveData(req, userId) } //修改字典数据操作 func EditSaveData(req *sys_dict_data.EditDataReq, userId int) (int64, error) { - entity, err := GetDictDataById(req.DictCode) - if err != nil { - return 0, err - } - entity.DictType = req.DictType - entity.Status = req.Status - entity.DictLabel = req.DictLabel - entity.CssClass = req.CssClass - entity.DictSort = req.DictSort - entity.DictValue = req.DictValue - entity.IsDefault = req.IsDefault - entity.ListClass = req.ListClass - entity.Remark = req.Remark - entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) - entity.UpdateBy = userId - result, err := entity.Update() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("修改失败") - } - return result.RowsAffected() + return sys_dict_data.EditSaveData(req, userId) } //通过字典数据主键获取数据 func GetDictDataById(dictCode int) (*sys_dict_data.Entity, error) { - entity, err := sys_dict_data.Model.FindOne("dict_code", dictCode) - if err != nil { - g.Log().Error(err) - return nil, gerror.New("获取字典数据失败") - } - if entity == nil { - return nil, gerror.New("获取字典数据失败") - } - return entity, nil + return sys_dict_data.GetById(dictCode) } //字典数据列表查询分页 func SelectDataListByPage(req *sys_dict_data.SelectDataPageReq) (total, page int, list []*sys_dict_data.Entity, err error) { - model := sys_dict_data.Model - if req != nil { - if req.DictLabel != "" { - model = model.Where("dict_label like ?", "%"+req.DictLabel+"%") - } - if req.Status != "" { - model = model.Where("status = ", gconv.Int(req.Status)) - } - if req.DictType != "" { - model = model.Where("dict_type = ?", req.DictType) - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } - if req.PageNum == 0 { - req.PageNum = 1 - } - } - page = req.PageNum - if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum - } - list, err = model.Page(page, req.PageSize).Order("dict_sort asc,dict_code asc").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return -} - -//删除字典 -func DeleteDictByIds(ids []int) error { - discs, err := sys_dict_type.Model.Where("dict_id in(?)", ids).All() - if err != nil { - g.Log().Error(err) - return gerror.New("没有要删除的数据") - } - //删除字典下的数据 - for _, v := range discs { - sys_dict_data.Model.Delete("dict_type=?", v.DictType) - v.Delete() - } - return nil + return sys_dict_data.SelectDataListByPage(req) } //删除字典数据 func DeleteDictDataByIds(ids []int) error { - _, err := sys_dict_data.Model.Delete("dict_code in (?)", ids) - if err != nil { - g.Log().Error(err) - return gerror.New("删除失败") - } - return nil + return sys_dict_data.DeleteByIds(ids) } diff --git a/app/service/admin/dict_service/dict_type.go b/app/service/admin/dict_service/dict_type.go index 5c34f45..86eb509 100644 --- a/app/service/admin/dict_service/dict_type.go +++ b/app/service/admin/dict_service/dict_type.go @@ -1,186 +1,46 @@ package dict_service import ( - "gfast/app/model/admin/sys_dict_data" "gfast/app/model/admin/sys_dict_type" - "gfast/library/utils" - "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/os/gtime" - "github.com/gogf/gf/text/gstr" - "github.com/gogf/gf/util/gconv" ) //检查字典类型是否唯一 func CheckDictTypeUniqueAll(dictType string) bool { - dict, err := sys_dict_type.Model.FindOne("dict_type=?", dictType) - if err != nil { - g.Log().Error(err) - return false - } - if dict != nil { - return false - } - return true + return sys_dict_type.CheckDictTypeUniqueAll(dictType) } //根据主键判断是否唯一 func CheckDictTypeUnique(dictType *sys_dict_type.EditReq) bool { - dict, err := sys_dict_type.Model.FindOne("dict_type=? and dict_id!=?", dictType.DictType, dictType.DictId) - if err != nil { - g.Log().Error(err) - return false - } - if dict != nil { - return false - } - return true + return sys_dict_type.CheckDictTypeUnique(dictType) } //添加数据 func AddSave(req *sys_dict_type.AddReq, userId int) (int64, error) { - var entity sys_dict_type.Entity - entity.Status = req.Status - entity.DictType = req.DictType - entity.DictName = req.DictName - entity.Remark = req.Remark - entity.CreateTime = gconv.Uint64(gtime.Timestamp()) - entity.CreateBy = gconv.Uint(userId) - - result, err := entity.Insert() - if err != nil { - return 0, err - } - id, err := result.LastInsertId() - if err != nil || id <= 0 { - return 0, err - } - return id, nil + return sys_dict_type.AddSave(req, userId) } //修改保存字典类型 func EditSave(req *sys_dict_type.EditReq, userId int) (int64, error) { - entity, err := GetDictById(gconv.Int(req.DictId)) - if err != nil || entity == nil { - return 0, err - } - entity.DictType = req.DictType - entity.DictName = req.DictName - entity.Status = req.Status - entity.Remark = req.Remark - entity.UpdateBy = gconv.Uint(userId) - entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) - res, err := entity.Update() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("更新失败") - } - return res.RowsAffected() + return sys_dict_type.EditSave(req, userId) } //字典列表查询分页 func SelectListByPage(req *sys_dict_type.SelectPageReq) (total, page int, list []*sys_dict_type.Entity, err error) { - model := sys_dict_type.Model - if req != nil { - if req.DictName != "" { - model = model.Where("dict_name like ?", "%"+req.DictName+"%") - } - - if req.DictType != "" { - model = model.Where("dict_type like ?", "%"+req.DictType+"%") - } - - if req.Status != "" { - model = model.Where("status = ", gconv.Int(req.Status)) - } - - if req.BeginTime != "" { - model = model.Where("create_time >=?", utils.StrToTimestamp(req.BeginTime)) - } - - if req.EndTime != "" { - model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime)) - } - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } - if req.PageNum == 0 { - req.PageNum = 1 - } - page = req.PageNum - if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum - } - list, err = model.Page(page, req.PageSize).Order("dict_id asc").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return + return sys_dict_type.SelectListByPage(req) } //通过id获取字典数据 func GetDictById(id int) (dict *sys_dict_type.Entity, err error) { - dict, err = sys_dict_type.Model.FindOne("dict_id=?", id) - if err != nil { - g.Log().Error(err) - err = gerror.New("获取字典数据失败") - return - } - if dict == nil { - err = gerror.New("获取字典数据失败") - return - } - return + return sys_dict_type.GetDictById(id) } //通过字典键类型获取选项 func GetDictWithDataByType(dictType, defaultValue, emptyLabel string) (dict g.Map, err error) { - dictEntity, err := sys_dict_type.Model.FindOne("dict_type", dictType) - if err != nil { - g.Log().Error(err) - err = gerror.New("获取字典选项失败") - return - } - var dictDataEntities []*sys_dict_data.Entity - if dictEntity != nil { - //获取字典数据 - dictDataEntities, err = sys_dict_data.Model.Where("dict_type", dictType). - Order("dict_sort ASC,dict_code ASC").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取字典选项失败") - return - } - values := make(g.List, len(dictDataEntities)) - for k, v := range dictDataEntities { - isDefault := 0 - if defaultValue != "" { - if gstr.Equal(defaultValue, v.DictValue) { - isDefault = 1 - } - } else if emptyLabel == "" { - isDefault = v.IsDefault - } - values[k] = g.Map{ - "key": v.DictValue, - "value": v.DictLabel, - "isDefault": isDefault, - } - } - if emptyLabel != "" { - values = append(g.List{g.Map{"isDefault": 0, "key": "", "value": emptyLabel}}, values...) - } - dict = g.Map{ - "dict_name": dictEntity.DictName, - "remark": dictEntity.Remark, - "values": values, - } - } - return + return sys_dict_type.GetDictWithDataByType(dictType, defaultValue, emptyLabel) +} + +//删除字典 +func DeleteDictByIds(ids []int) error { + return sys_dict_type.DeleteDictByIds(ids) } diff --git a/app/service/admin/monitor_service/job.go b/app/service/admin/monitor_service/job.go index 8c00df1..52edc59 100644 --- a/app/service/admin/monitor_service/job.go +++ b/app/service/admin/monitor_service/job.go @@ -2,19 +2,12 @@ package monitor_service import ( "gfast/app/model/admin/sys_job" - "gfast/app/task" - "gfast/library/utils" - "github.com/gogf/gf/errors/gerror" "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/os/gcron" - "github.com/gogf/gf/os/gtime" - "github.com/gogf/gf/util/gconv" - "strings" ) func init() { //自动执行已开启的任务 - jobs, err := sys_job.Model.Where("status", 0).All() + jobs, err := sys_job.GetJobs() if err != nil { g.Log().Error(err) } @@ -25,170 +18,35 @@ func init() { //添加计划任务 func AddJob(req *sys_job.ReqAdd, userId int) (id int64, err error) { - entity := new(sys_job.Entity) - entity.JobName = req.JobName - entity.JobGroup = req.JobGroup - entity.InvokeTarget = req.InvokeTarget - entity.JobParams = req.JobParams - entity.CronExpression = req.CronExpression - entity.MisfirePolicy = req.MisfirePolicy - entity.Remark = req.Remark - entity.Status = req.Status - entity.CreateTime = gconv.Uint64(gtime.Timestamp()) - entity.CreateBy = gconv.Uint64(userId) - res, err := entity.Save() - if err != nil { - g.Log().Error(err) - err = gerror.New("添加任务失败") - } - id, err = res.LastInsertId() - if err != nil { - g.Log().Error(err) - err = gerror.New("添加任务失败") - } - return + return sys_job.Add(req, userId) } //修改计划任务 func EditJob(req *sys_job.ReqEdit, userId int) (rows int64, err error) { - entity, err := GetJobInfoById(req.JobId) - if err != nil { - return - } - entity.JobName = req.JobName - entity.JobGroup = req.JobGroup - entity.InvokeTarget = req.InvokeTarget - entity.JobParams = req.JobParams - entity.CronExpression = req.CronExpression - entity.MisfirePolicy = req.MisfirePolicy - entity.Remark = req.Remark - entity.Status = req.Status - entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) - entity.UpdateBy = gconv.Uint64(userId) - res, err := entity.Update() - if err != nil { - g.Log().Error(err) - err = gerror.New("修改任务失败") - } - rows, err = res.RowsAffected() - if err != nil { - g.Log().Error(err) - err = gerror.New("修改任务失败") - } - return + return sys_job.Edit(req, userId) } //任务列表 func JobListByPage(req *sys_job.SelectPageReq) (total, page int, list []*sys_job.Entity, err error) { - model := sys_job.Model - if req != nil { - if req.Status != "" { - model = model.Where("status", gconv.Int(req.Status)) - } - if req.JobGroup != "" { - model = model.Where("job_group", req.JobGroup) - } - if req.JobName != "" { - model = model.Where("job_name like ?", "%"+req.JobName+"%") - } - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } - if req.PageNum == 0 { - req.PageNum = 1 - } - page = req.PageNum - if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum - } - list, err = model.Page(page, req.PageSize).Order("job_id asc").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return + return sys_job.JobListByPage(req) } //通过id获取任务信息 func GetJobInfoById(id int64) (job *sys_job.Entity, err error) { - if id == 0 { - err = gerror.New("参数错误") - return - } - job, err = sys_job.Model.FindOne("job_id", id) - if err != nil { - g.Log().Error(err) - } - if job == nil || err != nil { - err = gerror.New("获取任务信息失败") - return - } - return + return sys_job.GetJobInfoById(id) } //批量删除计划任务 func DeleteJobByIds(ids []int) (err error) { - if len(ids) == 0 { - err = gerror.New("参数错误") - } - _, err = sys_job.Model.Delete("job_id in (?)", ids) - if err != nil { - g.Log().Error(err) - err = gerror.New("删除失败") - } - return + return sys_job.DeleteJobByIds(ids) } //启动任务 func JobStart(job *sys_job.Entity) error { - //可以task目录下是否绑定对应的方法 - f := task.GetByName(job.InvokeTarget) - if f == nil { - return gerror.New("当前task目录下没有绑定这个方法") - } - //传参 - paramArr := strings.Split(job.JobParams, "|") - g.Log().Debug(paramArr) - task.EditParams(f.FuncName, paramArr) - rs := gcron.Search(job.InvokeTarget) - if rs == nil { - if job.MisfirePolicy == 1 { - task, err := gcron.Add(job.CronExpression, f.Run, job.InvokeTarget) - if err != nil || task == nil { - return err - } - } else { - task, err := gcron.AddOnce(job.CronExpression, f.Run, job.InvokeTarget) - if err != nil || task == nil { - return err - } - } - } - gcron.Start(job.InvokeTarget) - if job.MisfirePolicy == 1 { - job.Status = 0 - job.Update() - } - return nil + return sys_job.JobStart(job) } //停止任务 func JobStop(job *sys_job.Entity) error { - //可以task目录下是否绑定对应的方法 - f := task.GetByName(job.InvokeTarget) - if f == nil { - return gerror.New("当前task目录下没有绑定这个方法") - } - rs := gcron.Search(job.InvokeTarget) - if rs != nil { - gcron.Stop(job.InvokeTarget) - } - job.Status = 1 - job.Update() - return nil + return sys_job.JobStop(job) } diff --git a/app/service/admin/monitor_service/login_log.go b/app/service/admin/monitor_service/login_log.go index d23ed06..1f9a001 100644 --- a/app/service/admin/monitor_service/login_log.go +++ b/app/service/admin/monitor_service/login_log.go @@ -2,81 +2,25 @@ package monitor_service import ( "gfast/app/model/admin/sys_login_log" - "gfast/library/utils" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/util/gconv" + "gfast/library/service" ) func LoginLogListByPage(req *sys_login_log.SelectPageReq) (total, page int, list []*sys_login_log.Entity, err error) { - model := sys_login_log.Model - order := "login_time DESC" - if req != nil { - if req.LoginName != "" { - model = model.Where("login_name like ?", "%"+req.LoginName+"%") - } - if req.Status != "" { - model = model.Where("status", gconv.Int(req.Status)) - } - if req.Ipaddr != "" { - model = model.Where("ipaddr like ?", "%"+req.Ipaddr+"%") - } - if req.BeginTime != "" { - model = model.Where("login_time >=", utils.StrToTimestamp(req.BeginTime)) - } - if req.EndTime != "" { - model = model.Where("login_time <=", utils.StrToTimestamp(req.EndTime)) - } - if req.SortName != "" { - if req.SortOrder != "" { - order = req.SortName + " " + req.SortOrder - } else { - order = req.SortName + " DESC" - } - } - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } if req.PageNum == 0 { req.PageNum = 1 } - page = req.PageNum if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum + req.PageSize = service.AdminPageNum } - list, err = model.Page(page, req.PageSize).Order(order).All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return + return sys_login_log.LoginLogListByPage(req) } //删除登录日志 func DeleteLoginLogByIds(ids []int) (err error) { - if len(ids) == 0 { - err = gerror.New("参数错误") - return - } - _, err = sys_login_log.Model.Delete("info_id in (?)", ids) - if err != nil { - g.Log().Error(err) - err = gerror.New("删除失败") - } - return + return sys_login_log.DeleteLoginLogByIds(ids) } //清空日志 func ClearLoginLog() (err error) { - _, err = g.DB().Exec("truncate " + sys_login_log.Table) - if err != nil { - g.Log().Error(err) - err = gerror.New("清除失败") - } - return + return sys_login_log.ClearLoginLog() } diff --git a/app/service/admin/monitor_service/online.go b/app/service/admin/monitor_service/online.go index 3543893..bf6301b 100644 --- a/app/service/admin/monitor_service/online.go +++ b/app/service/admin/monitor_service/online.go @@ -3,7 +3,7 @@ package monitor_service import ( "gfast/app/model/admin/user_online" "gfast/boot" - "gfast/library/utils" + "gfast/library/service" "github.com/goflyfox/gtoken/gtoken" "github.com/gogf/gf/encoding/gjson" "github.com/gogf/gf/errors/gerror" @@ -14,35 +14,13 @@ import ( //获取在线用户列表 func GetOnlineListPage(req *user_online.ReqListSearch) (total, page int, list []*user_online.Entity, err error) { - model := user_online.Model - if req != nil { - if req.Ip != "" { - model = model.Where("ip like ?", "%"+req.Ip+"%") - } - if req.Username != "" { - model = model.Where("user_name like ?", "%"+req.Username+"%") - } - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } if req.PageNum == 0 { req.PageNum = 1 } - page = req.PageNum if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum + req.PageSize = service.AdminPageNum } - list, err = model.FieldsEx("token").Page(page, req.PageSize).Order("create_time DESC").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return + return user_online.GetOnlineListPage(req) } //通过token获取登录用户数据 @@ -93,7 +71,7 @@ func GetUuidUserKeyByToken(token string) (uuid, userKey string) { //强制退出操作 func ForceLogout(ids []int) error { for _, id := range ids { - entity, err := user_online.Model.FindOne("id", id) + entity, err := user_online.GetInfoById(id) if err != nil { g.Log().Error(err) return gerror.New("获取在线用户信息失败") diff --git a/app/service/admin/params_service/params.go b/app/service/admin/params_service/params.go index aa0dd79..01c50f1 100644 --- a/app/service/admin/params_service/params.go +++ b/app/service/admin/params_service/params.go @@ -2,150 +2,39 @@ package params_service import ( "gfast/app/model/admin/sys_config" - "gfast/library/utils" - "github.com/gogf/gf/errors/gerror" - "github.com/gogf/gf/frame/g" - "github.com/gogf/gf/os/gtime" - "github.com/gogf/gf/util/gconv" ) //保存参数 func AddSave(req *sys_config.AddReq, userId int) (id int64, err error) { - var entity sys_config.Entity - entity.ConfigName = req.ConfigName - entity.ConfigKey = req.ConfigKey - entity.ConfigType = req.ConfigType - entity.ConfigValue = req.ConfigValue - entity.Remark = req.Remark - entity.CreateTime = gconv.Uint64(gtime.Timestamp()) - entity.CreateBy = gconv.Uint(userId) - result, err := entity.Insert() - if err != nil { - g.Log().Error(err) - err = gerror.New("保存失败") - } - id, err = result.LastInsertId() - if err != nil { - g.Log().Error() - err = gerror.New("获取插入的主键ID失败") - } - return + return sys_config.AddSave(req, userId) } //修改保存 func EditSave(req *sys_config.EditReq, userId int) (int64, error) { - entity, err := GetParamsById(gconv.Int(req.ConfigId)) - if err != nil { - return 0, err - } - entity.ConfigName = req.ConfigName - entity.ConfigKey = req.ConfigKey - entity.ConfigType = req.ConfigType - entity.ConfigValue = req.ConfigValue - entity.Remark = req.Remark - entity.UpdateTime = gconv.Uint64(gtime.Timestamp()) - entity.UpdateBy = gconv.Uint(userId) - result, err := entity.Update() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("修改失败") - } - rows, err := result.RowsAffected() - if err != nil { - g.Log().Error(err) - return 0, gerror.New("修改失败") - } - return rows, nil + return sys_config.EditSave(req, userId) } //验证参数键名是否存在 func CheckConfigKeyUniqueAll(configKey string) error { - entity, err := sys_config.Model.FindOne("config_key", configKey) - if err != nil { - g.Log().Error(err) - return gerror.New("校验数据失败") - } - if entity != nil { - return gerror.New("参数键名已经存在") - } - return nil + return sys_config.CheckConfigKeyUniqueAll(configKey) } //列表分页搜索查询 func SelectListByPage(req *sys_config.SelectPageReq) (total, page int, list []*sys_config.Entity, err error) { - model := sys_config.Model - if req != nil { - if req.ConfigName != "" { - model = model.Where("config_name like ?", "%"+req.ConfigName+"%") - } - if req.ConfigType != "" { - model.Where("status = ", gconv.Int(req.ConfigType)) - } - if req.ConfigKey != "" { - model.Where("config_key like ?", "%"+req.ConfigKey+"%") - } - if req.BeginTime != "" { - model = model.Where("create_time >= ? ", utils.StrToTimestamp(req.BeginTime)) - } - - if req.EndTime != "" { - model = model.Where("create_time<=?", utils.StrToTimestamp(req.EndTime)) - } - } - total, err = model.Count() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取总行数失败") - return - } - if req.PageNum == 0 { - req.PageNum = 1 - } - page = req.PageNum - if req.PageSize == 0 { - req.PageSize = utils.AdminPageNum - } - list, err = model.Page(page, req.PageSize).Order("config_id asc").All() - if err != nil { - g.Log().Error(err) - err = gerror.New("获取数据失败") - return - } - return + return sys_config.SelectListByPage(req) } //通过id查询参数数据 func GetParamsById(id int) (entity *sys_config.Entity, err error) { - entity, err = sys_config.Model.FindOne("config_id", id) - if err != nil { - g.Log().Error(err) - err = gerror.New("查询参数数据出错") - } - if entity == nil { - err = gerror.New("未查询到参数数据") - } - return + return sys_config.GetParamsById(id) } //检查键是否已经存在 func CheckConfigKeyUnique(configKey string, configId int64) error { - entity, err := sys_config.Model.FindOne("config_key=? and config_id!=?", configKey, configId) - if err != nil { - g.Log().Error(err) - return gerror.New("校验数据失败") - } - if entity != nil { - return gerror.New("参数键名已经存在") - } - return nil + return sys_config.CheckConfigKeyUnique(configKey, configId) } //删除参数 func DeleteByIds(ids []int) error { - _, err := sys_config.Model.Delete("config_id in (?)", ids) - if err != nil { - g.Log().Error(err) - return gerror.New("删除失败") - } - return nil + return sys_config.DeleteByIds(ids) } diff --git a/app/service/admin/user_service/user.go b/app/service/admin/user_service/user.go index bf7a6c5..2eda3ea 100644 --- a/app/service/admin/user_service/user.go +++ b/app/service/admin/user_service/user.go @@ -7,6 +7,7 @@ import ( "gfast/app/service/admin/auth_service" "gfast/app/service/casbin_adapter_service" "gfast/boot" + "gfast/library/service" "gfast/library/utils" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" @@ -32,18 +33,7 @@ func GetLoginAdminInfo(r *ghttp.Request) (userInfo *user.Entity) { //获取管理员列表 func GetAdminList(where g.Map, page int) (total int, userList []*user.Entity, err error) { - userModel := user.Model - if v, ok := where["keyWords"]; ok { - keyWords := gconv.String(v) - if keyWords != "" { - keyWords = "%" + keyWords + "%" - userModel = userModel.Where("user_name like ? or mobile like ? or user_nickname like ?", - keyWords, keyWords, keyWords) - } - } - total, err = userModel.Count() - userList, err = userModel.ForPage(page, utils.AdminPageNum).OrderBy("id asc").All() - return + return user.GetAdminList(where, page, service.AdminPageNum) } //获取管理员的角色信息 @@ -82,20 +72,6 @@ func GetAdminRoleIds(userId int) (roleIds []int, err error) { return } -//根据用户id获取用户信息 -func GetAdminInfoById(id int64) (userMap g.Map) { - //获取用户角色信息 - if id != 0 { - userInfo, err := user.Model.Where("id=?", id).One() - if err != nil { - g.Log().Error(err) - return - } - userMap = gconv.Map(userInfo) - } - return -} - //获取菜单 func GetAllMenus() (menus g.List, err error) { //获取所有开启的菜单 diff --git a/boot/boot.go b/boot/boot.go index 1ada848..94b4470 100644 --- a/boot/boot.go +++ b/boot/boot.go @@ -1,7 +1,7 @@ package boot import ( - "gfast/library/utils" + "gfast/library/service" "github.com/goflyfox/gtoken/gtoken" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/os/glog" @@ -20,16 +20,16 @@ func init() { func initAdmin() { //无需验证权限的用户id - utils.NotCheckAuthAdminIds = g.Cfg().GetInts("adminInfo.notCheckAuthAdminIds") + service.NotCheckAuthAdminIds = g.Cfg().GetInts("adminInfo.notCheckAuthAdminIds") //后端分页长度配置 - utils.AdminPageNum = g.Cfg().GetInt("adminInfo.pageNum") + service.AdminPageNum = g.Cfg().GetInt("adminInfo.pageNum") // 设置并启动后台gtoken处理 initAdminGfToken() } func initAdminGfToken() { //多端登陆配置 - utils.AdminMultiLogin = g.Cfg().GetBool("gToken.MultiLogin") + service.AdminMultiLogin = g.Cfg().GetBool("gToken.MultiLogin") AdminGfToken = >oken.GfToken{ CacheMode: g.Cfg().GetInt8("gToken.CacheMode"), CacheKey: g.Cfg().GetString("gToken.CacheKey"), @@ -38,14 +38,14 @@ func initAdminGfToken() { TokenDelimiter: g.Cfg().GetString("gToken.TokenDelimiter"), EncryptKey: g.Cfg().GetBytes("gToken.EncryptKey"), AuthFailMsg: g.Cfg().GetString("gToken.AuthFailMsg"), - MultiLogin: utils.AdminMultiLogin, + MultiLogin: service.AdminMultiLogin, LoginPath: "/sysLogin/login", - LoginBeforeFunc: utils.AdminLogin, - LoginAfterFunc: utils.AdminLoginAfter, + LoginBeforeFunc: service.AdminLogin, + LoginAfterFunc: service.AdminLoginAfter, LogoutPath: "/sysLogin/logout", AuthPaths: g.SliceStr{"/system/*"}, - AuthAfterFunc: utils.AuthAfterFunc, - LogoutBeforeFunc: utils.AdminLoginOut, + AuthAfterFunc: service.AuthAfterFunc, + LogoutBeforeFunc: service.AdminLoginOut, } AdminGfToken.Start() } diff --git a/go.mod b/go.mod index 0ee6651..d51256b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ require ( github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect github.com/casbin/casbin/v2 v2.1.2 github.com/go-ole/go-ole v1.2.4 // indirect - github.com/goflyfox/gtoken v1.3.11 + github.com/goflyfox/gtoken v1.3.12 github.com/gogf/gf v1.11.5 github.com/mojocn/base64Captcha v1.3.0 github.com/mssola/user_agent v0.5.1 diff --git a/go.sum b/go.sum index 098a03a..12b873d 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/goflyfox/gtoken v1.3.9 h1:9WSFlk0R9Fy8vmbjKqR33Yqfsce9TYfn2lMwZ9zVOPU github.com/goflyfox/gtoken v1.3.9/go.mod h1:AdsIiP+9xYazR69j4dN1nLYdBoC+Xh3UVUYjqOM8OJs= github.com/goflyfox/gtoken v1.3.11 h1:dttowT4XrxtDrmpNYCtF23mtpNW2keNR/Me5ULPsQjw= github.com/goflyfox/gtoken v1.3.11/go.mod h1:2oUK27DG/F+jVPCGtEWsKL5aM4zmCIg9/VREkGhIrw0= +github.com/goflyfox/gtoken v1.3.12 h1:ewet3ZzkfBIuOKkJ2T9uErheDAu/TxnyrmMmEaof2F8= +github.com/goflyfox/gtoken v1.3.12/go.mod h1:KPGDYrhvNzcfqFJz4/rE6x0SyURAuAxfRNhwMxGbFxk= github.com/gogf/gf v1.10.1 h1:mu1VWviGm8ucgFNODQnw8ourgvgNBBovbLFbot/70BY= github.com/gogf/gf v1.10.1/go.mod h1:/37gncPmuM06D4YSqiDze9GsasDtF2QnWkUfKeiGW/Q= github.com/gogf/gf v1.11.2/go.mod h1:/37gncPmuM06D4YSqiDze9GsasDtF2QnWkUfKeiGW/Q= diff --git a/library/utils/function.go b/library/service/service.go similarity index 87% rename from library/utils/function.go rename to library/service/service.go index 477a64b..6eac996 100644 --- a/library/utils/function.go +++ b/library/service/service.go @@ -1,4 +1,4 @@ -package utils +package service import ( "database/sql" @@ -7,10 +7,9 @@ import ( "gfast/app/model/admin/user" "gfast/app/model/admin/user_online" "gfast/library/response" + "gfast/library/utils" "github.com/goflyfox/gtoken/gtoken" - "github.com/gogf/gf/crypto/gaes" "github.com/gogf/gf/crypto/gmd5" - "github.com/gogf/gf/encoding/gbase64" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/os/gtime" @@ -21,8 +20,6 @@ import ( "strings" ) -const AdminCbcPublicKey = "HqmP1KLMuz09Q0Bu" - var ( AdminMultiLogin bool //是否允许后台管理员多端登陆 AdminPageNum = 20 //后台分页长度 @@ -89,7 +86,7 @@ func AdminLogin(r *ghttp.Request) (string, interface{}) { /*if !VerifyString(data["idKeyC"], data["idValueC"]) { response.JsonExit(r, response.ErrorCode, "验证码输入错误") }*/ - password := EncryptCBC(data["password"], AdminCbcPublicKey) + password := utils.EncryptCBC(data["password"], utils.AdminCbcPublicKey) var keys string if AdminMultiLogin { keys = data["username"] + password + gmd5.MustEncryptString(r.GetClientIp()) @@ -172,33 +169,6 @@ func AdminLoginOut(r *ghttp.Request) bool { return true } -//字符串加密 -func EncryptCBC(plainText, publicKey string) string { - key := []byte(publicKey) - b, e := gaes.EncryptCBC([]byte(plainText), key, key) - if e != nil { - g.Log().Error(e.Error()) - return "" - } - return gbase64.EncodeToString(b) -} - -//字符串解密 -func DecryptCBC(plainText, publicKey string) string { - key := []byte(publicKey) - plainTextByte, e := gbase64.DecodeString(plainText) - if e != nil { - g.Log().Error(e.Error()) - return "" - } - b, e := gaes.DecryptCBC(plainTextByte, key, key) - if e != nil { - g.Log().Error(e.Error()) - return "" - } - return gbase64.EncodeToString(b) -} - // 用户登录,成功返回用户信息,否则返回nil func signIn(username, password string, r *ghttp.Request) (error, *user.User) { user, err := user.Model.Where("user_name=? and user_password=?", username, password).One() @@ -225,7 +195,7 @@ func loginLog(status int, username, ip, userAgent, msg string) { var log sys_login_log.Entity log.LoginName = username log.Ipaddr = ip - log.LoginLocation = GetCityByIp(log.Ipaddr) + log.LoginLocation = utils.GetCityByIp(log.Ipaddr) ua := user_agent.New(userAgent) log.Browser, _ = ua.Browser() log.Os = ua.OS() diff --git a/library/utils/tools.go b/library/utils/tools.go index 96213de..2e6b18c 100644 --- a/library/utils/tools.go +++ b/library/utils/tools.go @@ -1,6 +1,8 @@ package utils import ( + "github.com/gogf/gf/crypto/gaes" + "github.com/gogf/gf/encoding/gbase64" "github.com/gogf/gf/encoding/gcharset" "github.com/gogf/gf/encoding/gjson" "github.com/gogf/gf/frame/g" @@ -10,6 +12,35 @@ import ( "time" ) +const AdminCbcPublicKey = "HqmP1KLMuz09Q0Bu" + +//字符串加密 +func EncryptCBC(plainText, publicKey string) string { + key := []byte(publicKey) + b, e := gaes.EncryptCBC([]byte(plainText), key, key) + if e != nil { + g.Log().Error(e.Error()) + return "" + } + return gbase64.EncodeToString(b) +} + +//字符串解密 +func DecryptCBC(plainText, publicKey string) string { + key := []byte(publicKey) + plainTextByte, e := gbase64.DecodeString(plainText) + if e != nil { + g.Log().Error(e.Error()) + return "" + } + b, e := gaes.DecryptCBC(plainTextByte, key, key) + if e != nil { + g.Log().Error(e.Error()) + return "" + } + return gbase64.EncodeToString(b) +} + //服务端ip func GetLocalIP() (ip string, err error) { addrs, err := net.InterfaceAddrs() diff --git a/middleWare/middleware.go b/middleWare/middleware.go index 769e670..356f353 100644 --- a/middleWare/middleware.go +++ b/middleWare/middleware.go @@ -7,7 +7,7 @@ import ( "gfast/app/service/admin/user_service" "gfast/app/service/casbin_adapter_service" "gfast/library/response" - "gfast/library/utils" + "gfast/library/service" "github.com/gogf/gf/frame/g" "github.com/gogf/gf/net/ghttp" "github.com/gogf/gf/text/gstr" @@ -24,7 +24,7 @@ func Auth(r *ghttp.Request) { //获取登陆用户id adminId := user_service.GetLoginID(r) //获取无需验证权限的用户id - for _, v := range utils.NotCheckAuthAdminIds { + for _, v := range service.NotCheckAuthAdminIds { if v == adminId { r.Middleware.Next() return