您现在的位置是:首页 > 学无止境 > 杂七杂八 网站首页学无止境
beego搭建博客的admin管理(二):目录管理
- 杂七杂八
- 2019年4月1日 19:23
- 1245已阅读
- 14
0、前言
本文接着上一篇文章beego搭建博客的admin管理(一):用户管理继续搭建我们的博客admin后台。本文主要介绍目录管理的实现。
1、models对象
在本文中,我们关注的是models/maincategory.go
和models/subcategory.go
两个文件,其包含的分别是主目录的数据库操作和子目录的数据库操作。由于两个的实现方法基本相似,因此我们在这里主要介绍一下主目录管理的实现。
下面分别是MainCategory
结构和SubCategory
结构:
// models/maincategory.go
type MainCategory struct {
// ID
Id int json:"id"
// 主目录名
Name string orm:"unique;index;size(8)" json:"name" form:"name"
// 创建时间
Created time.Time orm:"auto_now_add;type(datetime)" json:"created"
}
// models/subcategory.go
type SubCategory struct {
// ID
Id int json:"id"
// 子目录名
Name string orm:"unique;index;size(8)" json:"name" form:"name"
// 创建时间
Created time.Time orm:"auto_now_add;type(datetime);" json:"created"
// 所属父目录
Father int json:"father" form:"main"
}
同样的,MainCategory{}
和SubCategory{}
都包含新增、更新、删除、查询四个方法,具体实现方法和上文中的User{}
一致,在这里不再赘述。
类似的,利用这几种方法,对于主目录我们实现了GetSons()
、MainCateList()
、GetMainCateById()
和GetMainCateByName()
四个函数。在MainCateList()
中,我们设计了一下返回的内容,除了主目录自身的数据之外,在这里我们还让其返回主目录包含的子目录数目,具体函数如下:
func MainCateList()([]map[string]interface{}, int64){
list := make([]*MainCategory, 0)
total, _ := new(MainCategory).Query().Count()
new(MainCategory).Query().OrderBy("-Id").All(&list)
var results []map[string]interface{}
for _, v := range list{
temp := make(map[string]interface{})
_, sonnum := GetSons(v.Id)
temp["id"] = v.Id
temp["name"] = v.Name
temp["Created"] = v.Created
temp["sonnum"] = sonnum
results = append(results, temp)
}
return results, total
}
相似的,对于子目录我们也实现了以上这些函数,对于SubCateList()
,我们除了让其返回子目录本身的内容之外,还让其返回所属主目录的名称和本目录下文章数,具体代码如下:
func SubCateList()([]map[string]interface{}, int64) {
list := make([]*SubCategory, 0)
total, _ := new(SubCategory).Query().Count()
new(SubCategory).Query().OrderBy("-Id").All(&list)
var results []map[string]interface{}
for _, v := range list {
temp := make(map[string]interface{})
temp["Id"] = v.Id
temp["Name"] = v.Name
temp["Created"] = v.Created
main, _ := GetMainCateById(v.Father)
temp["Father"] = main.Name
temp["PassageNums"], _ = new(Passage).Query().Filter("Subcategory", v.Id).Count()
results = append(results, temp)
}
return results, total
}
2、controller设计
首先,我们看一下最终实现的结果

controllers/admin.go
里面添加好前端展示的方法func (a *AdminController) MainList()
用于展示页面;与用户管理类似,我们这里也需要考虑到搜索的实现,因此在该方法中需要和用户管理的展示一致,如下所示:
func (a *AdminController) MainList() {
_, admin := a.Authentication()
if !admin {
a.Abort("403")
}
if q := a.GetString("q"); q == "search" {
name := a.GetString("name", "")
mainList, total := MainCateSearch(name)
a.Data["mainlist"] = mainList
a.Data["total"] = total
} else {
mainList, total := models.MainCateList()
a.Data["mainlist"] = mainList
a.Data["total"] = total
}
a.TplName = "main-list.html"
}
然后在controllers/maincate.go
中,我们实现了所有的请求方法Put()
、Delete()
、Post()
,分别对应更新主目录内容、删除一个或多个主目录、创建新的主目录;同样,在这里面我们也实现了主目录的搜索函数MainCateSearch()
。
这里我们主要看一下Delete()
方法的实现,其他方法的具体代码可以见项目github
// 删除
func (m *MainCateController) Delete() {
ids := strings.Split(m.GetString("mid"), ",")
for _, v := range ids {
mid, _ := strconv.Atoi(v)
main, err := models.GetMainCateById(mid)
if err != nil{
m.ajaxMsg(40404, "", "not found the maincategory", nil)
}
sons, _ := models.GetSons(mid)
for _,v := range sons{
v.Delete()
}
passages, _ := models.GetPassagesByMainCate(mid)
for _, v := range passages{
v.Delete()
}
main.Delete()
}
m.ajaxMsg(0, "", "success to delete the MainCategory.", nil)
}
由于要同时可以处理批量删除和单个删除,我们可以把单个删除也当做是批处理,然后将提交过来的mid
进行切分,得到每一个的id
,然后分别进行删除操作。由于在数据库的设计中我们没有使用外键,因此在删除主目录时,我们也需要把该目录的子目录和文章一并删除。
然后在routers/router.go
中进行路由注册
beego.Router("/admin/maincate/", &controllers.MainCateController{})
由于我们实现的方法名与http请求方式一致,因此不需要说明具体请求所对应的方法。然后对模板文件进行相对应的处理,运行bee run
,便可以在浏览器中看到效果
3、其他说明
由于很多函数的实现方法和上一篇中所述的一致,因此在本文中便没有再次重复说明具体实现代码;同样,子目录的实现和主目录的实现方法可以说是完全一致,因此在本文中也没有对子目录管理的实现进行详细说明。若对代码实现有何问题,可以进行评论或者查看项目github
4、最终效果
添加主目录:
编辑主目录:
添加子目录:
编辑子目录:
版权声明:本文为博主原创文章,转载时请注明来源。https://blog.thinker.ink/passage/23/