您现在的位置是:首页 > 学无止境 > 杂七杂八 网站首页学无止境

beego搭建博客的admin管理(二):目录管理

0、前言


本文接着上一篇文章beego搭建博客的admin管理(一):用户管理继续搭建我们的博客admin后台。本文主要介绍目录管理的实现。


1、models对象


在本文中,我们关注的是models/maincategory.gomodels/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/

 

文章评论

Top