diff --git a/app/controller/admin/cms_menu.go b/app/controller/admin/cms_menu.go index fd0495c..0f2de62 100644 --- a/app/controller/admin/cms_menu.go +++ b/app/controller/admin/cms_menu.go @@ -157,3 +157,15 @@ func (c *CmsMenu) Sort(r *ghttp.Request) { cache_service.New().RemoveByTag(cache_service.AdminCmsTag) response.SusJson(true, r, "排序成功") } + +func (c *CmsMenu) Delete(r *ghttp.Request) { + ids := r.GetInts("ids") + if len(ids) == 0 { + response.FailJson(true, r, "删除失败") + } + err := cms_service.DeleteMenuByIds(ids) + if err != nil { + response.FailJson(true, r, "删除失败") + } + response.SusJson(true, r, "删除信息成功", ids) +} diff --git a/app/controller/admin/cms_news.go b/app/controller/admin/cms_news.go index 2dfc51b..174aa50 100644 --- a/app/controller/admin/cms_news.go +++ b/app/controller/admin/cms_news.go @@ -13,8 +13,30 @@ import ( type CmsNews struct{} +//信息列表 func (c *CmsNews) List(r *ghttp.Request) { - response.SusJson(true, r, "信息列表") + var req *cms_news.ReqListSearchParams + //获取参数 + if err := r.Parse(&req); err != nil { + response.FailJson(true, r, err.(*gvalid.Error).FirstString()) + } + total, page, list, err := cms_service.NewsListByPage(req) + if err != nil { + response.FailJson(true, r, err.Error()) + } + //获取可选栏目 + menus, err := cms_service.GetPublishableMenuList(req.CateId...) + if err != nil { + response.FailJson(true, r, err.Error()) + } + menus = utils.PushSonToParent(menus, 0, "parent_id") + result := g.Map{ + "currentPage": page, + "total": total, + "list": list, + "menus": menus, + } + response.SusJson(true, r, "信息列表", result) } //添加信息 @@ -27,11 +49,11 @@ func (c *CmsNews) Add(r *ghttp.Request) { } cateIds := r.GetInts("cateIds") userId := user_service.GetLoginID(r) - ids, err := cms_service.AddNews(req, cateIds, userId) + _, err := cms_service.AddNews(req, cateIds, userId) if err != nil { response.FailJson(true, r, err.Error()) } - response.SusJson(true, r, "添加信息成功", ids) + response.SusJson(true, r, "添加信息成功") } //获取可选栏目 menus, err := cms_service.GetPublishableMenuList() @@ -44,3 +66,57 @@ func (c *CmsNews) Add(r *ghttp.Request) { } response.SusJson(true, r, "添加信息", res) } + +//修改信息 +func (c *CmsNews) Edit(r *ghttp.Request) { + if r.Method == "POST" { + var req *cms_news.ReqEditParams + //获取参数 + if err := r.Parse(&req); err != nil { + response.FailJson(true, r, err.(*gvalid.Error).FirstString()) + } + cateIds := r.GetInts("cateIds") + err := cms_service.EditNews(req, cateIds) + if err != nil { + response.FailJson(true, r, err.Error()) + } + response.SusJson(true, r, "修改信息成功") + } + id := r.GetInt("id") + if id == 0 { + response.FailJson(true, r, "参数错误") + } + //获取文章信息 + news, err := cms_service.GetNewsById(id) + if err != nil { + response.FailJson(true, r, err.Error()) + } + checkedCategoryId, err := cms_service.GetCheckedCategoryIdByNewsId(news.Id) + if err != nil { + response.FailJson(true, r, err.Error()) + } + //获取可选栏目 + menus, err := cms_service.GetPublishableMenuList(checkedCategoryId...) + if err != nil { + response.FailJson(true, r, err.Error()) + } + menus = utils.PushSonToParent(menus, 0, "parent_id") + res := g.Map{ + "menus": menus, + "news": news, + } + response.SusJson(true, r, "添加信息", res) +} + +//删除信息 +func (c *CmsNews) Delete(r *ghttp.Request) { + ids := r.GetInts("ids") + if len(ids) == 0 { + response.FailJson(true, r, "删除失败") + } + err := cms_service.DeleteCmsByIds(ids) + if err != nil { + response.FailJson(true, r, "删除失败") + } + response.SusJson(true, r, "删除信息成功") +} diff --git a/app/controller/admin/monitor_job.go b/app/controller/admin/monitor_job.go index 0d7d85a..30152dc 100644 --- a/app/controller/admin/monitor_job.go +++ b/app/controller/admin/monitor_job.go @@ -68,9 +68,14 @@ func (c *MonitorJob) Add(r *ghttp.Request) { if err != nil { response.FailJson(true, r, err.Error()) } + jobPolicy, err := dict_service.GetDictWithDataByType("sys_job_policy", "", "") + if err != nil { + response.FailJson(true, r, err.Error()) + } res := g.Map{ "jobStatus": jobStatus, "jobGroup": jobGroup, + "jobPolicy": jobPolicy, } response.SusJson(true, r, "添加任务", res) } @@ -104,9 +109,14 @@ func (c *MonitorJob) Edit(r *ghttp.Request) { if err != nil { response.FailJson(true, r, err.Error()) } + jobPolicy, err := dict_service.GetDictWithDataByType("sys_job_policy", gconv.String(job.MisfirePolicy), "") + if err != nil { + response.FailJson(true, r, err.Error()) + } res := g.Map{ "jobStatus": jobStatus, "jobGroup": jobGroup, + "jobPolicy": jobPolicy, "jobInfo": job, } response.SusJson(true, r, "添加任务", res) diff --git a/app/model/admin/cms_category/cms_category.go b/app/model/admin/cms_category/cms_category.go index 2352eb4..3cb2d87 100644 --- a/app/model/admin/cms_category/cms_category.go +++ b/app/model/admin/cms_category/cms_category.go @@ -158,3 +158,12 @@ func GetListSearch(req *ReqSearchList) (menus []*Entity, err error) { } return } + +func DeleteByIds(ids []int) error { + _, err := Model.Delete("id in (?)", ids) + if err != nil { + g.Log().Error(err) + return gerror.New("删除失败") + } + return nil +} diff --git a/app/model/admin/cms_category_news/cms_category_news.go b/app/model/admin/cms_category_news/cms_category_news.go new file mode 100644 index 0000000..b8fb0a5 --- /dev/null +++ b/app/model/admin/cms_category_news/cms_category_news.go @@ -0,0 +1,18 @@ +package cms_category_news + +import ( + "github.com/gogf/gf/errors/gerror" + "github.com/gogf/gf/frame/g" +) + +// Fill with you ideas below. + +//通过文章id获取栏目关联信息 +func GetCategoriesByNewsId(newsId uint64) (cateNews []*Entity, err error) { + cateNews, err = Model.FindAll("news_id", newsId) + if err != nil { + g.Log().Error(err) + err = gerror.New("获取栏目文章关联信息失败") + } + return +} diff --git a/app/model/admin/cms_category_news/cms_category_news_entity.go b/app/model/admin/cms_category_news/cms_category_news_entity.go new file mode 100644 index 0000000..4b8cce7 --- /dev/null +++ b/app/model/admin/cms_category_news/cms_category_news_entity.go @@ -0,0 +1,54 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package cms_category_news + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" +) + +// Entity is the golang structure for table cms_category_news. +type Entity struct { + Id uint64 `orm:"id,primary" json:"id"` // + NewsId uint64 `orm:"news_id" json:"news_id"` // 文章id + CategoryId uint64 `orm:"category_id" json:"category_id"` // 分类id +} + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (r *Entity) OmitEmpty() *arModel { + return Model.Data(r).OmitEmpty() +} + +// Inserts does "INSERT...INTO..." statement for inserting current object into table. +func (r *Entity) Insert() (result sql.Result, err error) { + return Model.Data(r).Insert() +} + +// Replace does "REPLACE...INTO..." statement for inserting current object into table. +// If there's already another same record in the table (it checks using primary key or unique index), +// it deletes it and insert this one. +func (r *Entity) Replace() (result sql.Result, err error) { + return Model.Data(r).Replace() +} + +// Save does "INSERT...INTO..." statement for inserting/updating current object into table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Save() (result sql.Result, err error) { + return Model.Data(r).Save() +} + +// Update does "UPDATE...WHERE..." statement for updating current object from table. +// It updates the record if there's already another same record in the table +// (it checks using primary key or unique index). +func (r *Entity) Update() (result sql.Result, err error) { + return Model.Data(r).Where(gdb.GetWhereConditionOfStruct(r)).Update() +} + +// Delete does "DELETE FROM...WHERE..." statement for deleting current object from table. +func (r *Entity) Delete() (result sql.Result, err error) { + return Model.Where(gdb.GetWhereConditionOfStruct(r)).Delete() +} diff --git a/app/model/admin/cms_category_news/cms_category_news_model.go b/app/model/admin/cms_category_news/cms_category_news_model.go new file mode 100644 index 0000000..8a35a6b --- /dev/null +++ b/app/model/admin/cms_category_news/cms_category_news_model.go @@ -0,0 +1,367 @@ +// ========================================================================== +// This is auto-generated by gf cli tool. You may not really want to edit it. +// ========================================================================== + +package cms_category_news + +import ( + "database/sql" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/frame/g" + "time" +) + +// arModel is a active record design model for table cms_category_news operations. +type arModel struct { + M *gdb.Model +} + +var ( + // Table is the table name of cms_category_news. + Table = "cms_category_news" + // Model is the model object of cms_category_news. + Model = &arModel{g.DB("default").Table(Table).Safe()} +) + +// FindOne is a convenience method for Model.FindOne. +// See Model.FindOne. +func FindOne(where ...interface{}) (*Entity, error) { + return Model.FindOne(where...) +} + +// FindAll is a convenience method for Model.FindAll. +// See Model.FindAll. +func FindAll(where ...interface{}) ([]*Entity, error) { + return Model.FindAll(where...) +} + +// FindValue is a convenience method for Model.FindValue. +// See Model.FindValue. +func FindValue(fieldsAndWhere ...interface{}) (gdb.Value, error) { + return Model.FindValue(fieldsAndWhere...) +} + +// FindCount is a convenience method for Model.FindCount. +// See Model.FindCount. +func FindCount(where ...interface{}) (int, error) { + return Model.FindCount(where...) +} + +// Insert is a convenience method for Model.Insert. +func Insert(data ...interface{}) (result sql.Result, err error) { + return Model.Insert(data...) +} + +// Replace is a convenience method for Model.Replace. +func Replace(data ...interface{}) (result sql.Result, err error) { + return Model.Replace(data...) +} + +// Save is a convenience method for Model.Save. +func Save(data ...interface{}) (result sql.Result, err error) { + return Model.Save(data...) +} + +// Update is a convenience method for Model.Update. +func Update(dataAndWhere ...interface{}) (result sql.Result, err error) { + return Model.Update(dataAndWhere...) +} + +// Delete is a convenience method for Model.Delete. +func Delete(where ...interface{}) (result sql.Result, err error) { + return Model.Delete(where...) +} + +// As sets an alias name for current table. +func (m *arModel) As(as string) *arModel { + return &arModel{m.M.As(as)} +} + +// TX sets the transaction for current operation. +func (m *arModel) TX(tx *gdb.TX) *arModel { + return &arModel{m.M.TX(tx)} +} + +// Master marks the following operation on master node. +func (m *arModel) Master() *arModel { + return &arModel{m.M.Master()} +} + +// Slave marks the following operation on slave node. +// Note that it makes sense only if there's any slave node configured. +func (m *arModel) Slave() *arModel { + return &arModel{m.M.Slave()} +} + +// LeftJoin does "LEFT JOIN ... ON ..." statement on the model. +func (m *arModel) LeftJoin(joinTable string, on string) *arModel { + return &arModel{m.M.LeftJoin(joinTable, on)} +} + +// RightJoin does "RIGHT JOIN ... ON ..." statement on the model. +func (m *arModel) RightJoin(joinTable string, on string) *arModel { + return &arModel{m.M.RightJoin(joinTable, on)} +} + +// InnerJoin does "INNER JOIN ... ON ..." statement on the model. +func (m *arModel) InnerJoin(joinTable string, on string) *arModel { + return &arModel{m.M.InnerJoin(joinTable, on)} +} + +// Fields sets the operation fields of the model, multiple fields joined using char ','. +func (m *arModel) Fields(fields string) *arModel { + return &arModel{m.M.Fields(fields)} +} + +// FieldsEx sets the excluded operation fields of the model, multiple fields joined using char ','. +func (m *arModel) FieldsEx(fields string) *arModel { + return &arModel{m.M.FieldsEx(fields)} +} + +// Option sets the extra operation option for the model. +func (m *arModel) Option(option int) *arModel { + return &arModel{m.M.Option(option)} +} + +// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers +// the data and where attributes for empty values. +func (m *arModel) OmitEmpty() *arModel { + return &arModel{m.M.OmitEmpty()} +} + +// Filter marks filtering the fields which does not exist in the fields of the operated table. +func (m *arModel) Filter() *arModel { + return &arModel{m.M.Filter()} +} + +// Where sets the condition statement for the model. The parameter can be type of +// string/map/gmap/slice/struct/*struct, etc. Note that, if it's called more than one times, +// multiple conditions will be joined into where statement using "AND". +// Eg: +// Where("uid=10000") +// Where("uid", 10000) +// Where("money>? AND name like ?", 99999, "vip_%") +// Where("uid", 1).Where("name", "john") +// Where("status IN (?)", g.Slice{1,2,3}) +// Where("age IN(?,?)", 18, 50) +// Where(User{ Id : 1, UserName : "john"}) +func (m *arModel) Where(where interface{}, args ...interface{}) *arModel { + return &arModel{m.M.Where(where, args...)} +} + +// And adds "AND" condition to the where statement. +func (m *arModel) And(where interface{}, args ...interface{}) *arModel { + return &arModel{m.M.And(where, args...)} +} + +// Or adds "OR" condition to the where statement. +func (m *arModel) Or(where interface{}, args ...interface{}) *arModel { + return &arModel{m.M.Or(where, args...)} +} + +// Group sets the "GROUP BY" statement for the model. +func (m *arModel) Group(groupBy string) *arModel { + return &arModel{m.M.Group(groupBy)} +} + +// Order sets the "ORDER BY" statement for the model. +func (m *arModel) Order(orderBy string) *arModel { + return &arModel{m.M.Order(orderBy)} +} + +// Limit sets the "LIMIT" statement for the model. +// The parameter can be either one or two number, if passed two number is passed, +// it then sets "LIMIT limit[0],limit[1]" statement for the model, or else it sets "LIMIT limit[0]" +// statement. +func (m *arModel) Limit(limit ...int) *arModel { + return &arModel{m.M.Limit(limit...)} +} + +// Offset sets the "OFFSET" statement for the model. +// It only makes sense for some databases like SQLServer, PostgreSQL, etc. +func (m *arModel) Offset(offset int) *arModel { + return &arModel{m.M.Offset(offset)} +} + +// Page sets the paging number for the model. +// The parameter is started from 1 for paging. +// Note that, it differs that the Limit function start from 0 for "LIMIT" statement. +func (m *arModel) Page(page, limit int) *arModel { + return &arModel{m.M.Page(page, limit)} +} + +// Batch sets the batch operation number for the model. +func (m *arModel) Batch(batch int) *arModel { + return &arModel{m.M.Batch(batch)} +} + +// Cache sets the cache feature for the model. It caches the result of the sql, which means +// if there's another same sql request, it just reads and returns the result from cache, it +// but not committed and executed into the database. +// +// If the parameter < 0, which means it clear the cache with given . +// If the parameter = 0, which means it never expires. +// If the parameter > 0, which means it expires after . +// +// The optional parameter is used to bind a name to the cache, which means you can later +// control the cache like changing the or clearing the cache with specified . +// +// Note that, the cache feature is disabled if the model is operating on a transaction. +func (m *arModel) Cache(expire time.Duration, name ...string) *arModel { + return &arModel{m.M.Cache(expire, name...)} +} + +// Data sets the operation data for the model. +// The parameter can be type of string/map/gmap/slice/struct/*struct, etc. +// Eg: +// Data("uid=10000") +// Data("uid", 10000) +// Data(g.Map{"uid": 10000, "name":"john"}) +// Data(g.Slice{g.Map{"uid": 10000, "name":"john"}, g.Map{"uid": 20000, "name":"smith"}) +func (m *arModel) Data(data ...interface{}) *arModel { + return &arModel{m.M.Data(data...)} +} + +// Insert does "INSERT INTO ..." statement for the model. +// The optional parameter is the same as the parameter of Model.Data function, +// see Model.Data. +func (m *arModel) Insert(data ...interface{}) (result sql.Result, err error) { + return m.M.Insert(data...) +} + +// Replace does "REPLACE INTO ..." statement for the model. +// The optional parameter is the same as the parameter of Model.Data function, +// see Model.Data. +func (m *arModel) Replace(data ...interface{}) (result sql.Result, err error) { + return m.M.Replace(data...) +} + +// Save does "INSERT INTO ... ON DUPLICATE KEY UPDATE..." statement for the model. +// It updates the record if there's primary or unique index in the saving data, +// or else it inserts a new record into the table. +// +// The optional parameter is the same as the parameter of Model.Data function, +// see Model.Data. +func (m *arModel) Save(data ...interface{}) (result sql.Result, err error) { + return m.M.Save(data...) +} + +// Update does "UPDATE ... " statement for the model. +// +// If the optional parameter is given, the dataAndWhere[0] is the updated +// data field, and dataAndWhere[1:] is treated as where condition fields. +// Also see Model.Data and Model.Where functions. +func (m *arModel) Update(dataAndWhere ...interface{}) (result sql.Result, err error) { + return m.M.Update(dataAndWhere...) +} + +// Delete does "DELETE FROM ... " statement for the model. +// The optional parameter is the same as the parameter of Model.Where function, +// see Model.Where. +func (m *arModel) Delete(where ...interface{}) (result sql.Result, err error) { + return m.M.Delete(where...) +} + +// Count does "SELECT COUNT(x) FROM ..." statement for the model. +// The optional parameter is the same as the parameter of Model.Where function, +// see Model.Where. +func (m *arModel) Count(where ...interface{}) (int, error) { + return m.M.Count(where...) +} + +// All does "SELECT FROM ..." statement for the model. +// It retrieves the records from table and returns the result as []*Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +// +// The optional parameter is the same as the parameter of Model.Where function, +// see Model.Where. +func (m *arModel) All(where ...interface{}) ([]*Entity, error) { + all, err := m.M.All(where...) + if err != nil { + return nil, err + } + var entities []*Entity + if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entities, nil +} + +// One retrieves one record from table and returns the result as *Entity. +// It returns nil if there's no record retrieved with the given conditions from table. +// +// The optional parameter is the same as the parameter of Model.Where function, +// see Model.Where. +func (m *arModel) One(where ...interface{}) (*Entity, error) { + one, err := m.M.One(where...) + if err != nil { + return nil, err + } + var entity *Entity + if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entity, nil +} + +// Value retrieves a specified record value from table and returns the result as interface type. +// It returns nil if there's no record found with the given conditions from table. +// +// If the optional parameter is given, the fieldsAndWhere[0] is the selected fields +// and fieldsAndWhere[1:] is treated as where condition fields. +// Also see Model.Fields and Model.Where functions. +func (m *arModel) Value(fieldsAndWhere ...interface{}) (gdb.Value, error) { + return m.M.Value(fieldsAndWhere...) +} + +// FindOne retrieves and returns a single Record by Model.WherePri and Model.One. +// Also see Model.WherePri and Model.One. +func (m *arModel) FindOne(where ...interface{}) (*Entity, error) { + one, err := m.M.FindOne(where...) + if err != nil { + return nil, err + } + var entity *Entity + if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entity, nil +} + +// FindAll retrieves and returns Result by by Model.WherePri and Model.All. +// Also see Model.WherePri and Model.All. +func (m *arModel) FindAll(where ...interface{}) ([]*Entity, error) { + all, err := m.M.FindAll(where...) + if err != nil { + return nil, err + } + var entities []*Entity + if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows { + return nil, err + } + return entities, nil +} + +// FindValue retrieves and returns single field value by Model.WherePri and Model.Value. +// Also see Model.WherePri and Model.Value. +func (m *arModel) FindValue(fieldsAndWhere ...interface{}) (gdb.Value, error) { + return m.M.FindValue(fieldsAndWhere...) +} + +// FindCount retrieves and returns the record number by Model.WherePri and Model.Count. +// Also see Model.WherePri and Model.Count. +func (m *arModel) FindCount(where ...interface{}) (int, error) { + return m.M.FindCount(where...) +} + +// Chunk iterates the table with given size and callback function. +func (m *arModel) Chunk(limit int, callback func(entities []*Entity, err error) bool) { + m.M.Chunk(limit, func(result gdb.Result, err error) bool { + var entities []*Entity + err = result.Structs(&entities) + if err == sql.ErrNoRows { + return false + } + return callback(entities, err) + }) +} diff --git a/app/model/admin/cms_news/cms_news.go b/app/model/admin/cms_news/cms_news.go index d467b94..2d92968 100644 --- a/app/model/admin/cms_news/cms_news.go +++ b/app/model/admin/cms_news/cms_news.go @@ -5,7 +5,11 @@ package cms_news import ( + "gfast/app/model/admin/cms_category_news" + "gfast/app/model/admin/user" + "gfast/library/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" @@ -30,8 +34,23 @@ type ReqAddParams struct { JumpUrl string `p:"JumpUrl" ` // 跳转地址 } +//文章搜索参数 +type ReqListSearchParams struct { + CateId []int `p:"cateId"` + PublishedTimeStart string `p:"pubTimeStart"` + PublishedTimeEnd string `p:"pubTimeEnd"` + KeyWords string `p:"keyWords"` + PageNum int `p:"page"` //当前页码 + PageSize int `p:"pageSize"` //每页数 +} + +type ReqEditParams struct { + Id int `p:"id" v:"integer|min:1#文章ID只能为整数|文章ID只能为正数"` + ReqAddParams +} + //添加文章操作 -func AddNews(req *ReqAddParams, cateIds []int, userId int) (insId []int64, err error) { +func AddNews(req *ReqAddParams, cateIds []int, userId int) (insId int64, err error) { if len(cateIds) == 0 { err = gerror.New("栏目不能为空") return @@ -42,40 +61,185 @@ func AddNews(req *ReqAddParams, cateIds []int, userId int) (insId []int64, err e err = gerror.New("添加失败") return } - for _, cateId := range cateIds { - entity := &Entity{ - CateId: gconv.Uint(cateId), - UserId: gconv.Uint64(userId), - NewsStatus: req.NewsStatus, - IsTop: req.IsTop, - Recommended: req.Recommended, - CreateTime: gconv.Uint(gtime.Timestamp()), - PublishedTime: gconv.Uint(utils.StrToTimestamp(req.PublishedTime)), - NewsTitle: req.NewsTitle, - NewsKeywords: req.NewsKeywords, - NewsExcerpt: req.NewsExcerpt, - NewsSource: req.NewsExcerpt, - NewsContent: req.NewsContent, - Thumbnail: req.Thumbnail, - IsJump: req.IsJump, - JumpUrl: req.JumpUrl, - } - res, e := entity.Save() - if e != nil { - g.Log().Error(e) - err = gerror.New("添加文章失败") - tx.Rollback() - return - } - id, e := res.LastInsertId() - if e != nil { - g.Log().Error(e) - err = gerror.New("添加文章失败") - tx.Rollback() - return - } - insId = append(insId, id) + entity := &Entity{ + UserId: gconv.Uint64(userId), + NewsStatus: req.NewsStatus, + IsTop: req.IsTop, + Recommended: req.Recommended, + CreateTime: gconv.Uint(gtime.Timestamp()), + PublishedTime: gconv.Uint(utils.StrToTimestamp(req.PublishedTime)), + NewsTitle: req.NewsTitle, + NewsKeywords: req.NewsKeywords, + NewsExcerpt: req.NewsExcerpt, + NewsSource: req.NewsExcerpt, + NewsContent: req.NewsContent, + Thumbnail: req.Thumbnail, + IsJump: req.IsJump, + JumpUrl: req.JumpUrl, + } + res, e := entity.Save() + if e != nil { + g.Log().Error(e) + err = gerror.New("添加文章失败") + tx.Rollback() + return + } + insId, err = res.LastInsertId() + if err != nil { + g.Log().Error(err) + err = gerror.New("添加文章失败") + tx.Rollback() + return + } + //保存栏目与文章关联信息 + catNewsEntity := make([]cms_category_news.Entity, len(cateIds)) + for k, cateId := range cateIds { + catNewsEntity[k].CategoryId = gconv.Uint64(cateId) + catNewsEntity[k].NewsId = gconv.Uint64(insId) + } + _, err = cms_category_news.Model.Data(catNewsEntity).Insert() + if err != nil { + g.Log().Error(err) + err = gerror.New("添加文章失败") + tx.Rollback() + return } tx.Commit() return } + +//修改文章操作 +func EditNews(req *ReqEditParams, cateIds []int) (err error) { + if len(cateIds) == 0 { + err = gerror.New("栏目不能为空") + return + } + tx, err := g.DB().Begin() + if err != nil { + g.Log().Error(err) + err = gerror.New("添加失败") + return + } + entity, err := Model.FindOne("id", req.Id) + if err != nil { + g.Log().Error(err) + } + if err != nil || entity == nil { + err = gerror.New("文章信息获取失败") + return + } + entity.NewsStatus = req.NewsStatus + entity.IsTop = req.IsTop + entity.Recommended = req.Recommended + entity.UpdateTime = gconv.Uint(gtime.Timestamp()) + entity.PublishedTime = gconv.Uint(utils.StrToTimestamp(req.PublishedTime)) + entity.NewsTitle = req.NewsTitle + entity.NewsKeywords = req.NewsKeywords + entity.NewsExcerpt = req.NewsExcerpt + entity.NewsSource = req.NewsExcerpt + entity.NewsContent = req.NewsContent + entity.Thumbnail = req.Thumbnail + entity.IsJump = req.IsJump + entity.JumpUrl = req.JumpUrl + _, err = entity.Update() + if err != nil { + g.Log().Error(err) + err = gerror.New("修改文章失败") + tx.Rollback() + return + } + //删除旧的栏目文章关联信息 + cnList, err := cms_category_news.GetCategoriesByNewsId(entity.Id) + if err != nil { + return + } + for _, cn := range cnList { + _, err = cn.Delete() + if err != nil { + g.Log().Error(err) + err = gerror.New("更新文章栏目所属信息失败") + tx.Rollback() + return + } + } + //保存栏目与文章关联信息 + catNewsEntity := make([]cms_category_news.Entity, len(cateIds)) + for k, cateId := range cateIds { + catNewsEntity[k].CategoryId = gconv.Uint64(cateId) + catNewsEntity[k].NewsId = gconv.Uint64(req.Id) + } + _, err = cms_category_news.Model.Data(catNewsEntity).Insert() + if err != nil { + g.Log().Error(err) + err = gerror.New("更新文章栏目所属信息失败") + tx.Rollback() + return + } + tx.Commit() + return +} + +//文章列表查询 +func ListByPage(req *ReqListSearchParams) (total, page int, list gdb.Result, err error) { + model := g.DB().Table(Table + " news") + if req != nil { + if len(req.CateId) > 0 { + model = model.InnerJoin(cms_category_news.Table+" cn", "cn.news_id=news.id").Where("cn.category_id in(?)", req.CateId) + model = model.Group("cn.news_id") + } + if req.KeyWords != "" { + model = model.Where("news.news_title like ?", "%"+req.KeyWords+"%") + } + if req.PublishedTimeStart != "" { + model = model.Where("news.published_time >=?", utils.StrToTimestamp(req.PublishedTimeStart)) + } + if req.PublishedTimeEnd != "" { + model = model.Where("news.published_time <=?", utils.StrToTimestamp(req.PublishedTimeEnd)) + } + } + model = model.LeftJoin(user.Table+" user", "news.user_id=user.id") + 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).Fields("news.*,user.user_nickname").Order("published_time desc,news.id desc").All() + if err != nil { + g.Log().Error(err) + err = gerror.New("获取数据失败") + return + } + return +} + +//通过文章id获取文章信息 +func GetById(id int) (news *Entity, err error) { + news, err = Model.FindOne("id", id) + if err != nil { + g.Log().Error(err) + } + if err != nil || news == nil { + err = gerror.New("获取文章信息失败") + return + } + return +} + +func DeleteByIds(ids []int) error { + _, err := Model.Delete("id in (?)", ids) + if err != nil { + g.Log().Error(err) + return gerror.New("删除失败") + } + cms_category_news.Delete("news_id in (?)", ids) + return nil +} diff --git a/app/model/admin/cms_news/cms_news_entity.go b/app/model/admin/cms_news/cms_news_entity.go index ae539b5..5deeee0 100644 --- a/app/model/admin/cms_news/cms_news_entity.go +++ b/app/model/admin/cms_news/cms_news_entity.go @@ -12,7 +12,6 @@ import ( // Entity is the golang structure for table cms_news. type Entity struct { Id uint64 `orm:"id,primary" json:"id"` // - CateId uint `orm:"cate_id" json:"cate_id"` // 栏目id NewsFormat uint `orm:"news_format" json:"news_format"` // 内容格式;1:html;2:md UserId uint64 `orm:"user_id" json:"user_id"` // 发表者用户id NewsStatus uint `orm:"news_status" json:"news_status"` // 状态;1:已发布;0:未发布; diff --git a/app/service/admin/cms_service/menu.go b/app/service/admin/cms_service/menu.go index 59d4455..32d0c2e 100644 --- a/app/service/admin/cms_service/menu.go +++ b/app/service/admin/cms_service/menu.go @@ -23,8 +23,15 @@ func GetMenuListChannel() (list []*cms_category.Entity, err error) { } //获取可发布文章栏目 -func GetPublishableMenuList() (list g.List, err error) { +func GetPublishableMenuList(catId ...int) (list g.List, err error) { menuList, err := GetMenuList() + var catIdMap map[int]int + if len(catId) > 0 { + catIdMap = make(map[int]int, len(catId)) + for _, v := range catId { + catIdMap[v] = v + } + } if err != nil { return } @@ -38,6 +45,11 @@ func GetPublishableMenuList() (list g.List, err error) { } else { mapMenu["checkAble"] = false } + if _, ok := catIdMap[gconv.Int(menu.Id)]; ok { + mapMenu["checked"] = true + } else { + mapMenu["checked"] = false + } list = append(list, mapMenu) } } @@ -68,3 +80,7 @@ func GetMenuListSearch(req *cms_category.ReqSearchList) (menus []*cms_category.E func GetMenuInfoById(id int) (menu *cms_category.Entity, err error) { return cms_category.GetInfoById(id) } + +func DeleteMenuByIds(ids []int) (err error) { + return cms_category.DeleteByIds(ids) +} diff --git a/app/service/admin/cms_service/news.go b/app/service/admin/cms_service/news.go index bcb6e14..016252d 100644 --- a/app/service/admin/cms_service/news.go +++ b/app/service/admin/cms_service/news.go @@ -1,10 +1,99 @@ package cms_service import ( + "gfast/app/model/admin/cms_category" + "gfast/app/model/admin/cms_category_news" "gfast/app/model/admin/cms_news" + "gfast/library/utils" + "github.com/gogf/gf/container/gvar" + "github.com/gogf/gf/database/gdb" + "github.com/gogf/gf/util/gconv" ) //添加文章操作 -func AddNews(req *cms_news.ReqAddParams, cateIds []int, userId int) (insId []int64, err error) { +func AddNews(req *cms_news.ReqAddParams, cateIds []int, userId int) (insId int64, err error) { return cms_news.AddNews(req, cateIds, userId) } + +//修改文章操作 +func EditNews(req *cms_news.ReqEditParams, cateIds []int) (err error) { + return cms_news.EditNews(req, cateIds) +} + +//文章列表查询 +func NewsListByPage(req *cms_news.ReqListSearchParams) (total, page int, list gdb.Result, err error) { + var menuList []*cms_category.Entity + //获取所有栏目 + menuList, err = GetMenuList() + if err != nil { + return + } + if len(req.CateId) > 0 { + //查询可发布栏目id + menuListSlice := gconv.SliceMap(menuList) + cateIds := req.CateId + for _, cid := range cateIds { + mList := make([]*cms_category.Entity, 0) + sonList := utils.FindSonByParentId(menuListSlice, cid, "parent_id", "id") + gconv.Structs(sonList, &mList) + for _, v := range mList { + if v.CateType == cms_category.PublishCateType { + req.CateId = append(req.CateId, gconv.Int(v.Id)) + } + } + } + } + total, page, list, err = cms_news.ListByPage(req) + if err != nil || len(list) == 0 { + return + } + //匹配文章所属栏目 + var cateIds []int + for _, v := range list { + cateIds, err = GetCheckedCategoryIdByNewsId(gconv.Uint64(v["id"])) + if err != nil { + return + } + cateNameList := make(map[int]string) + for _, menu := range menuList { + for _, cateId := range cateIds { + if menu.Id == gconv.Uint64(cateId) { + cateNameList[cateId] = menu.Name + } + } + } + cateVal := new(gvar.Var) + if len(cateNameList) > 0 { + cateVal.Set(cateNameList) + } + v["cateList"] = cateVal + } + return +} + +//通过id获取文章信息 +func GetNewsById(id int) (news *cms_news.Entity, err error) { + return cms_news.GetById(id) +} + +//通过文章id获取关联的栏目id +func GetCheckedCategoryIdByNewsId(newsId uint64) (catIds []int, err error) { + categories, err := GetCategoriesByNewsId(newsId) + if err != nil { + return + } + catIds = make([]int, len(categories)) + for k, v := range categories { + catIds[k] = gconv.Int(v.CategoryId) + } + return +} + +//通过文章id获取关联栏目信息 +func GetCategoriesByNewsId(newsId uint64) (categories []*cms_category_news.Entity, err error) { + return cms_category_news.GetCategoriesByNewsId(newsId) +} + +func DeleteCmsByIds(ids []int) (err error) { + return cms_news.DeleteByIds(ids) +} diff --git a/data/db.sql b/data/db.sql index defb6c6..141d1a0 100644 --- a/data/db.sql +++ b/data/db.sql @@ -414,7 +414,7 @@ CREATE TABLE `sys_oper_log` ( `error_msg` varchar(2000) DEFAULT '' COMMENT '错误消息', `oper_time` bigint(20) DEFAULT '0' COMMENT '操作时间', PRIMARY KEY (`oper_id`) -) ENGINE=MyISAM AUTO_INCREMENT=105 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; +) ENGINE=MyISAM AUTO_INCREMENT=106 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -423,7 +423,7 @@ CREATE TABLE `sys_oper_log` ( LOCK TABLES `sys_oper_log` WRITE; /*!40000 ALTER TABLE `sys_oper_log` DISABLE KEYS */; -INSERT INTO `sys_oper_log` VALUES (1,'',0,'/system/monitor/operlog/clear','POST',1,'admin','','/system/monitor/operlog/clear','192.168.0.212','','{}','{\"code\":0,\"msg\":\"清除成功\"}',1,'',1583920443),(2,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920465),(3,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920465),(4,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-list-ul\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/detail\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"操作日志详情\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920513),(5,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920513),(6,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920513),(7,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-trash-o\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/delete\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"删除操作日志\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920563),(8,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920563),(9,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920563),(10,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-university\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/clear\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"清空操作日志\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920600),(11,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920600),(12,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920600),(13,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1583977220),(14,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1583977227),(15,'参数管理',0,'/system/config/params/list','GET',1,'demo','','/system/config/params/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1583977228),(16,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1583977617),(17,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584061513),(18,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584061517),(19,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584061517),(20,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584061571),(21,'登录日志',0,'/system/monitor/loginlog/list','GET',1,'admin','','/system/monitor/loginlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"登录日志列表\"}',1,'',1584061590),(22,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584061616),(23,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064435),(24,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584064435),(25,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064436),(26,'',0,'/system/config/dict/data-add','GET',1,'demo','','/system/config/dict/data-add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064446),(27,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_job_status&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_job_status\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064464),(28,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=29','192.168.0.212','','{\"dictCode\":\"29\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064465),(29,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(30,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=2','192.168.0.212','','{\"dictCode\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(31,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(32,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=3','192.168.0.212','','{\"dictCode\":\"3\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(33,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=2','192.168.0.212','','{\"dictCode\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064509),(34,'参数管理',0,'/system/config/params/list','GET',1,'demo','','/system/config/params/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584064615),(35,'',0,'/system/config/params/edit','GET',1,'demo','','/system/config/params/edit?id=2','192.168.0.212','','{\"id\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064615),(36,'',0,'/system/config/dict/edit','GET',1,'demo','','/system/config/dict/edit?id=1','192.168.0.212','','{\"id\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067574),(37,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067587),(38,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067588),(39,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067618),(40,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_job_status&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_job_status\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067619),(41,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584067656),(42,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=2','192.168.0.212','','{\"page\":\"2\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584067656),(43,'',0,'/system/config/dict/edit','GET',1,'demo','','/system/config/dict/edit?id=13','192.168.0.212','','{\"id\":\"13\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067656),(44,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','',0,'',1584067916),(45,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584067956),(46,'',0,'/system/cms/model/list','GET',1,'admin','','/system/cms/model/list','192.168.0.212','','{}','{\"code\":-1,\"msg\":\"功能开发中...\"}',0,'',1584068654),(47,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584068686),(48,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584068695),(49,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584070706),(50,'角色组',0,'/system/auth/role-list','GET',1,'demo','','/system/auth/role-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(51,'添加',0,'/system/auth/add-user','GET',1,'demo','','/system/auth/add-user','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(52,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(53,'添加角色',0,'/system/auth/add-role','GET',1,'demo','','/system/auth/add-role','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(54,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(55,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071370),(56,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071443),(57,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071623),(58,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071633),(59,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584326923),(60,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584328510),(61,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584328526),(62,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329294),(63,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329300),(64,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329300),(65,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=58','192.168.0.212','','{\"id\":\"58\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329315),(66,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-list-ul\",\"id\":58,\"ismenu\":1,\"name\":\"/system/cms/menu/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"栏目管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329321),(67,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329321),(68,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329321),(69,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=59','192.168.0.212','','{\"id\":\"59\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329325),(70,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-th-list\",\"id\":59,\"ismenu\":1,\"name\":\"/system/cms/news/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"内容管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329344),(71,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329344),(72,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329344),(73,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=60','192.168.0.212','','{\"id\":\"60\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329345),(74,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-codepen\",\"id\":60,\"ismenu\":1,\"name\":\"/system/cms/mode/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"模型管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329350),(75,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329350),(76,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329350),(77,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=61','192.168.0.212','','{\"id\":\"61\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329354),(78,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-hand-pointer-o\",\"id\":61,\"ismenu\":1,\"name\":\"/system/cms/special/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"专题管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329359),(79,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329359),(80,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329359),(81,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=62','192.168.0.212','','{\"id\":\"62\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329364),(82,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-file-o\",\"id\":62,\"ismenu\":1,\"name\":\"/system/cms/single/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"单页管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329369),(83,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329369),(84,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329369),(85,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329381),(86,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329381),(87,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329381),(88,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329455),(89,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329460),(90,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329838),(91,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329850),(92,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584329858),(93,'内容管理',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584329865),(94,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584329879),(95,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329880),(96,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330489),(97,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330490),(98,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330618),(99,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330858),(100,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331506),(101,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331590),(102,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331590),(103,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331790),(104,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584339497); +INSERT INTO `sys_oper_log` VALUES (1,'',0,'/system/monitor/operlog/clear','POST',1,'admin','','/system/monitor/operlog/clear','192.168.0.212','','{}','{\"code\":0,\"msg\":\"清除成功\"}',1,'',1583920443),(2,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920465),(3,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920465),(4,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-list-ul\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/detail\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"操作日志详情\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920513),(5,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920513),(6,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920513),(7,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-trash-o\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/delete\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"删除操作日志\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920563),(8,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920563),(9,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920563),(10,'添加菜单',0,'/system/auth/add-menu','POST',1,'demo','','/system/auth/add-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-university\",\"ismenu\":0,\"name\":\"/system/monitor/operlog/clear\",\"pid\":79,\"remark\":\"\",\"status\":1,\"title\":\"清空操作日志\",\"weigh\":50}','{\"code\":0,\"msg\":\"添加菜单成功\"}',1,'',1583920600),(11,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920600),(12,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1583920600),(13,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1583977220),(14,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1583977227),(15,'参数管理',0,'/system/config/params/list','GET',1,'demo','','/system/config/params/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1583977228),(16,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1583977617),(17,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584061513),(18,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584061517),(19,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584061517),(20,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584061571),(21,'登录日志',0,'/system/monitor/loginlog/list','GET',1,'admin','','/system/monitor/loginlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"登录日志列表\"}',1,'',1584061590),(22,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584061616),(23,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064435),(24,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584064435),(25,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064436),(26,'',0,'/system/config/dict/data-add','GET',1,'demo','','/system/config/dict/data-add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064446),(27,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_job_status&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_job_status\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064464),(28,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=29','192.168.0.212','','{\"dictCode\":\"29\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064465),(29,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(30,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=2','192.168.0.212','','{\"dictCode\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(31,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(32,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=3','192.168.0.212','','{\"dictCode\":\"3\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064503),(33,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=2','192.168.0.212','','{\"dictCode\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064509),(34,'参数管理',0,'/system/config/params/list','GET',1,'demo','','/system/config/params/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584064615),(35,'',0,'/system/config/params/edit','GET',1,'demo','','/system/config/params/edit?id=2','192.168.0.212','','{\"id\":\"2\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584064615),(36,'',0,'/system/config/dict/edit','GET',1,'demo','','/system/config/dict/edit?id=1','192.168.0.212','','{\"id\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067574),(37,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067587),(38,'',0,'/system/config/dict/data-edit','GET',1,'demo','','/system/config/dict/data-edit?dictCode=1','192.168.0.212','','{\"dictCode\":\"1\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067588),(39,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_user_sex&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_user_sex\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067618),(40,'',0,'/system/config/dict/data-list','GET',1,'demo','','/system/config/dict/data-list?page=1&dictType=sys_job_status&dictLabel=&status=','192.168.0.212','','{\"dictLabel\":\"\",\"dictType\":\"sys_job_status\",\"page\":\"1\",\"status\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067619),(41,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=1','192.168.0.212','','{\"page\":\"1\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584067656),(42,'字典管理',0,'/system/config/dict/list','GET',1,'demo','','/system/config/dict/list?page=2','192.168.0.212','','{\"page\":\"2\"}','{\"code\":0,\"msg\":\"字典列表\"}',1,'',1584067656),(43,'',0,'/system/config/dict/edit','GET',1,'demo','','/system/config/dict/edit?id=13','192.168.0.212','','{\"id\":\"13\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584067656),(44,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','',0,'',1584067916),(45,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584067956),(46,'',0,'/system/cms/model/list','GET',1,'admin','','/system/cms/model/list','192.168.0.212','','{}','{\"code\":-1,\"msg\":\"功能开发中...\"}',0,'',1584068654),(47,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584068686),(48,'',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584068695),(49,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584070706),(50,'角色组',0,'/system/auth/role-list','GET',1,'demo','','/system/auth/role-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(51,'添加',0,'/system/auth/add-user','GET',1,'demo','','/system/auth/add-user','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(52,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(53,'添加角色',0,'/system/auth/add-role','GET',1,'demo','','/system/auth/add-role','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(54,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584070791),(55,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071370),(56,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071443),(57,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071623),(58,'',0,'/system/cms/menu/list','GET',1,'admin','','/system/cms/menu/list?name=','192.168.0.212','','{\"name\":\"\"}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584071633),(59,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584326923),(60,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584328510),(61,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584328526),(62,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329294),(63,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329300),(64,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329300),(65,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=58','192.168.0.212','','{\"id\":\"58\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329315),(66,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-list-ul\",\"id\":58,\"ismenu\":1,\"name\":\"/system/cms/menu/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"栏目管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329321),(67,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329321),(68,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329321),(69,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=59','192.168.0.212','','{\"id\":\"59\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329325),(70,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-th-list\",\"id\":59,\"ismenu\":1,\"name\":\"/system/cms/news/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"内容管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329344),(71,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329344),(72,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329344),(73,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=60','192.168.0.212','','{\"id\":\"60\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329345),(74,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-codepen\",\"id\":60,\"ismenu\":1,\"name\":\"/system/cms/mode/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"模型管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329350),(75,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329350),(76,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329350),(77,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=61','192.168.0.212','','{\"id\":\"61\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329354),(78,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-hand-pointer-o\",\"id\":61,\"ismenu\":1,\"name\":\"/system/cms/special/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"专题管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329359),(79,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329359),(80,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329359),(81,'修改菜单',0,'/system/auth/edit-menu','GET',1,'demo','','/system/auth/edit-menu?id=62','192.168.0.212','','{\"id\":\"62\"}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329364),(82,'修改菜单',0,'/system/auth/edit-menu','POST',1,'demo','','/system/auth/edit-menu','192.168.0.212','','{\"condition\":\"\",\"icon\":\"fa fa-file-o\",\"id\":62,\"ismenu\":1,\"name\":\"/system/cms/single/list\",\"pid\":57,\"remark\":\"\",\"status\":1,\"title\":\"单页管理\",\"weigh\":50}','{\"code\":0,\"msg\":\"修改菜单成功\"}',1,'',1584329369),(83,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329369),(84,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329369),(85,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329381),(86,'菜单规则',0,'/system/auth/menu-list','GET',1,'demo','','/system/auth/menu-list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329381),(87,'添加菜单',0,'/system/auth/add-menu','GET',1,'demo','','/system/auth/add-menu','192.168.0.212','','{}','{\"code\":0,\"msg\":\"成功\"}',1,'',1584329381),(88,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329455),(89,'系统首页',0,'/system/index/index','GET',1,'demo','','/system/index/index','192.168.0.212','','{}','{\"code\":0,\"msg\":\"ok\"}',1,'',1584329460),(90,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329838),(91,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329850),(92,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584329858),(93,'内容管理',0,'/system/cms/news/list','GET',1,'admin','','/system/cms/news/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"信息列表\"}',1,'',1584329865),(94,'操作日志',0,'/system/monitor/operlog/list','GET',1,'admin','','/system/monitor/operlog/list','192.168.0.212','','{}','{\"code\":0,\"msg\":\"操作日志列表\"}',1,'',1584329879),(95,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584329880),(96,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330489),(97,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330490),(98,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330618),(99,'',0,'/system/cms/menu/add','GET',1,'admin','','/system/cms/menu/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加栏目\"}',1,'',1584330858),(100,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331506),(101,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331590),(102,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331590),(103,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584331790),(104,'',0,'/system/cms/news/add','GET',1,'admin','','/system/cms/news/add','192.168.0.212','','{}','{\"code\":0,\"msg\":\"添加信息\"}',1,'',1584339497),(105,'',0,'/system/upload/up-img','POST',1,'admin','','/system/upload/up-img','192.168.0.212','','{\"file\":\"\"}','{\"code\":-1,\"msg\":\"上传失败,未上传任何文件\"}',0,'',1584415086); /*!40000 ALTER TABLE `sys_oper_log` ENABLE KEYS */; UNLOCK TABLES; @@ -505,4 +505,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2020-03-16 18:13:58 +-- Dump completed on 2020-03-19 9:23:29 diff --git a/library/utils/slice_tree.go b/library/utils/slice_tree.go index 62d8591..8218186 100644 --- a/library/utils/slice_tree.go +++ b/library/utils/slice_tree.go @@ -131,13 +131,16 @@ func GetSliceByKey(args []interface{}, key int, val interface{}) interface{} { return value } -//有层级关系的数组,通过父级id查找所有子级id数组 -func FindSonByParentId(list g.List, fid int, flg, flgV string) g.List { +//有层级关系的切片,通过父级id查找所有子级id数组 +//parentId 父级id +//parentIndex 父级索引名称 +//idIndex id索引名称 +func FindSonByParentId(list g.List, parentId int, parentIndex, idIndex string) g.List { newList := make(g.List, 0, len(list)) for _, v := range list { - if gconv.Int(v[flg]) == fid { + if gconv.Int(v[parentIndex]) == parentId { newList = append(newList, v) - fList := FindSonByParentId(list, gconv.Int(v[flgV]), flg, flgV) + fList := FindSonByParentId(list, gconv.Int(v[idIndex]), parentIndex, idIndex) newList = append(newList, fList...) } } diff --git a/test/demo2_test.go b/test/demo2_test.go index e1118c2..bb8ae90 100644 --- a/test/demo2_test.go +++ b/test/demo2_test.go @@ -1,8 +1,7 @@ package test import ( - "fmt" - "github.com/gogf/gf/text/gstr" + "github.com/gogf/gf/database/gdb" "testing" ) @@ -11,7 +10,5 @@ func TestDemo2(t *testing.T) { } func test21(t *testing.T) { - str := "字s符s串.中文测试" - fmt.Println(gstr.SearchArray(gstr.Split(str, ""), ".")) - fmt.Println(gstr.SubStr(str, gstr.SearchArray(gstr.Split(str, ""), ".")+1)) + gdb.Instance() }