beego搭建个人博客(二) - Go语言中文社区

beego搭建个人博客(二)


今天基于 beego搭建个人博客(一)把博客的后台管理的部分完成了,然后我的逻辑不一定是最合适的,可能写的比较乱,大家可以根据源代码分支https://github.com/lightTrace/beego-blog/tree/blog-dev1来自己搭建

后台效果:
这里写图片描述

一 models

分类model,category .go

package models

import "time"

type Category struct {
    Id int
    Name string
    Created time.Time
    Updated time.Time
}

func (m *Category) TableName() string {
    return TableName("category")
}

配置model,cofig.go:

package models

type Config struct {
    Id    int
    Name  string
    Value string
}

func (m *Config) TableName() string {
    return TableName("config")
}

文章model,post.go:

package models

import "time"

type Post struct {
    Id int
    UserId int
    Title string
    Url string
    Content string
    Tags string
    Views int
    IsTop int8
    Created time.Time
    Updated time.Time
    CategoryId int
    Status int8
    Types int8
    Info string
    Image string
}

func (m *Post) TableName() string {
    return TableName("post")
}

首先在controller文件夹中完善admin.go文件:
–首先添加登出逻辑:

func (c *AdminController) logout {
    c.DestroySession();
    c.History("退出登录","/admin/login.html")
}

–然后博客配置信息逻辑:

//配置信息
func (c *AdminController) Config()  {
    var result []*models.Config
    c.o.QueryTable(new(models.Config).TableName()).All(&result)
    options := make(map[string]string)
    mp := make(map[string]*models.Config)
    for _, v := range result {
        options[v.Name] = v.Value
        mp[v.Name] = v
    }
    if c.Ctx.Request.Method == "POST" {
        keys := []string{"url", "title",  "keywords", "description", "email", "start", "qq"}
        for _, key := range keys {
            val := c.GetString(key)
            if _, ok := mp[key]; !ok {
                options[key] = val
                c.o.Insert(&models.Config{Name:key, Value:val})
            } else {
                opt := mp[key]
                if _, err := c.o.Update(&models.Config{Id:opt.Id, Name:opt.Name, Value:val}); err != nil {
                    continue;
                }
            }
        }
        c.History("设置数据成功","")
    }
    c.Data["config"] = options
    c.TplName = c.controllerName + "/config.html"
}

配置信息页面config.html:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>配置</title>
    <link rel="stylesheet" href="/static/plug/layui/css/layui.css">
</head>
<body>

<script type="text/javascript" src="/static/plug/layui/layui.js"></script>

<form class="layui-form" action="/admin/config.html" style="margin:20px" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">标题:</label>
        <div class="layui-input-block">
            <input name="title" lay-verify="required"  value="{{.config.title}}" class="layui-input" title="网站名称" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">网址:</label>
        <div class="layui-input-block">
            <input name="url"   lay-verify="required|url" class="layui-input"  value="{{.config.url}}"  title="网址" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">关键字:</label>
        <div class="layui-input-block">
            <input name="keywords"  class="layui-input" value="{{.config.keywords}}" title="关键字" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">描述:</label>
        <div class="layui-input-block">
            <input name="description"  class="layui-input" value="{{.config.description}}"  title="描述" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">邮箱:</label>
        <div class="layui-input-block">
            <input name="email"  lay-verify="email"  class="layui-input" value="{{.config.email}}" class="input-xlarge" title="邮箱" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">qq:</label>
        <div class="layui-input-block">
            <input name="qq" lay-verify="number"  class="layui-input" value="{{.config.qq}}" class="input-xlarge" title="qq" type="text" />
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">开关:</label>
        <div class="layui-input-block">
            <input type="checkbox" name="start" {{if .config.start}} checked {{end}} value="1" title="开关" >
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>

<script>
    //Demo
    layui.use('form', function(){


    });
</script>
</body>
</html>

–然后类别管理逻辑:

//类别
func (c *AdminController) Category() {
    categorys := [] *models.Category{}
    c.o.QueryTable(new(models.Category).TableName()).All(&categorys)//查询所有类别
    c.Data["categorys"] = categorys
    c.TplName = c.controllerName+"/category.tpl"
}

类别页面:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>类目列表</title>
    <link rel="stylesheet" href="/static/plug/layui/css/layui.css">
</head>
<body>
<div class=" layui-inline" style="float: right; margin: 10px;">
    <button class="layui-btn " onclick="add()">
        <i class="layui-icon">&#xe608;</i> 添加
    </button>
</div>

<table class="layui-table" lay-skin="row">
    <colgroup>
        <col >
        <col>
        <col>
    </colgroup>
    <thead>
    <tr>
        <th>名称</th>
        <th>添加时间</th>
        <th>修改时间</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {{range $k, $v := .categorys}}
    <tr>
        <td>{{$v.Name}}</td>
        <td>{{$v.Created}}</td>
        <td>{{$v.Updated}}</td>
        <td>
            <a href="/admin/categoryadd.html?id={{$v.Id}}" >
                <i class="layui-icon">&#xe642;</i> 修改
            </a>
            <a href="javascript:void(0)" onclick="del({{$v.Id}})"  >
                <i class="layui-icon">&#x1006;</i> 删除
            </a>
        </td>
        {{end}}
    </tr>
    </tbody>
</table>

<script type="text/javascript" src="/static/plug/layui/layui.js"></script>
</body>
<script>
    function add() {
        location.href = "/admin/categoryadd.html"
    }

    function del(id)
    {
        if(confirm("确定要删除吗?"))
        {
            var url = "/admin/categorydel.html?id="+id;
            window.location.href=url;
        }
    }
</script>
</html>

–类别添加跳转:

//添加类别
func (c *AdminController) Categoryadd() {
    id := c.Input().Get("id")
    if id != "" {
        intId, _ := strconv.Atoi(id)
        cate := models.Category{Id: intId}//根据id回显该类别数据
        c.o.Read(&cate)
        c.Data["cate"] = cate
    }
    c.TplName = c.controllerName + "/category_add.tpl"
}

添加类别页面:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>添加类目</title>
    <link rel="stylesheet" href="/static/plug/layui/css/layui.css">
</head>
<body>
<script type="text/javascript" src="/static/plug/layui/layui.js"></script>
<form class="layui-form" action="/admin/categorysave.html" style="margin:20px" method="post">
    <div class="layui-form-item">
        <label class="layui-form-label">标题:</label>
        <div class="layui-input-block">
            <input name="id" type="hidden" value="{{.cate.Id}}">
            <input type="text" name="name" value="{{.cate.Name}}" required  lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input">
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="formDemo">提交</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
</body>
</html>

–插入、修改及删除类别逻辑:

//处理插入数据的字段
func (c *AdminController) CategorySave() {
    name := c.Input().Get("name");
    id := c.Input().Get("id")
    category := models.Category{}
    category.Name = name
    if id == "" {
        if _, err := c.o.Insert(&category); err != nil {
            c.History("插入数据错误", "")
        } else {
            c.History("插入数据成功", "/admin/category.html")
        }
    } else {
        intId, err := strconv.Atoi(id);
        if err != nil {
            c.History("参数错误", "")
        }
        category.Id = intId
        if _, err := c.o.Update(&category); err != nil {
            c.History("更新数据出错", "")
        } else {
            c.History("插入数据成功", "/admin/category.html")
        }
    }
}

func (c *AdminController) CategoryDel() {
    id, err := strconv.Atoi(c.Input().Get("id"));
    if err != nil {
        c.History("参数错误", "")
    }else{
        if _,err := c.o.Delete(&models.Category{Id:id}); err !=nil{
            c.History("未能成功删除", "")
        }else {
            c.History("删除成功", "/admin/category.html")
        }
    }
}

–博客列表逻辑

//后台首页
func (c *AdminController) Index() {
    categorys := [] *models.Category{}
    c.o.QueryTable( new(models.Category).TableName()).All(&categorys)
    c.Data["categorys"] = categorys
    var (
        page       int
        pagesize   int = 8
        offset     int
        list       []*models.Post
        keyword    string
        cateId int
    )
    keyword = c.GetString("title")
    cateId, _ = c.GetInt("cate_id")
    if page, _ = c.GetInt("page"); page < 1 {
        page = 1
    }
    offset = (page - 1) * pagesize
    //c.Ctx.WriteString(new(models.Post).TableName())
    query := c.o.QueryTable(new(models.Post).TableName())
    if keyword != "" {
        query = query.Filter("title__contains", keyword)
    }
    count, _ := query.Count()
    if count > 0 {
        query.OrderBy("-is_top", "-created").Limit(pagesize, offset).All(&list)
    }
    c.Data["keyword"] = keyword
    c.Data["count"] = count
    c.Data["list"] = list
    c.Data["cate_id"] = cateId
    c.Data["pagebar"] = util.NewPager(page, int(count), pagesize,
        fmt.Sprintf("/admin/index.html?keyword=%s", keyword), true).ToString()
    c.TplName = c.controllerName + "/list.tpl"
}

–博客列表页面list.tpl:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>个人博客列表</title>
    <link rel="stylesheet" href="/static/plug/layui/css/layui.css">
</head>
<body>
<div class="layui-form" action="" style="margin: 5px; border: 1px silver">

    <div class="layui-inline">
        <label class="layui-form-label">选择类别</label>
        <div class="layui-input-block">
            <select name="cate_id" lay-verify="required">
                {{range .categorys}}
                <option value="{{.Id}}" >{{.Name}}</option>
                {{end}}
            </select>
        </div>
    </div>

    <div class="layui-inline">
        <label class="layui-form-label">密码</label>
        <div class="layui-input-block">
            <input type="text" name="title" placeholder="请输入标题" autocomplete="on" class="layui-input">
        </div>
    </div>

    <div class=" layui-inline">
        <button class="layui-btn layui-btn-normal  ">
            搜索
        </button>
    </div>

    <div class=" layui-inline" style="float: right">
        <button class="layui-btn " onclick="add()">
            <i class="layui-icon">&#xe608;</i> 添加
        </button>
    </div>

</div>

<table class="layui-table" lay-skin="row">
    <thead>
    <tr>
        <th>标题</th>
        <th>时间</th>
        <td>置顶</td>
        <th>点击量</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {{range .list}}
    <tr>
        <td>{{.Title}}</td>
        <td>{{.Created}}</td>
        <td>
            {{if .IsTop}}
            <i class="icon-arrow-up" title="置顶"> </i>
            {{else}}
                普通
            {{end}}
        </td>
        <td>
            {{.Views}}
        </td>
        <td>
            <a href="/admin/article?id={{.Id}}" >
                <i class="layui-icon">&#xe642;</i> 修改
            </a>
            <a href="javascript:void(0)" onclick="del({{.Id}})"  >
                <i class="layui-icon">&#x1006;</i> 删除
            </a>
        </td>
    </tr>
    {{end}}
    </tbody>
</table>

<div class="layui-box layui-laypage layui-laypage-default" id="layui-laypage-0">
    {{str2html .pagebar}}
</div>
<script type="text/javascript" src="/static/plug/layui/layui.js"></script>
</body>

<script>

    //Demo
    layui.use('form', function () {
        var form = layui.form();
        var layer = layui.layer;
        //监听提交
        form.on('submit(formDemo)', function (data) {
            layer.msg(JSON.stringify(data.field));
            return false;
        });
    });
    var add = function () {
        location.href = "/admin/article"
    }

    function del(id)
    {
        if(confirm("确定要删除吗?"))
        {
            var url = "/admin/delete.html?id="+id;
            window.location.href=url;
        }
    }

</script>


</html>

–指定博客删除逻辑:

func (c *AdminController) Delete() {
    id, err := strconv.Atoi(c.Input().Get("id"));
    if err != nil {
        c.History("参数错误", "")
    }else{
        if _,err := c.o.Delete(&models.Post{Id:id}); err !=nil{
            c.History("未能成功删除", "")
        }else {
            c.History("删除成功", "/admin/index.html")
        }
    }
}

–博客添加逻辑

//文章
func (c *AdminController) Article() {
    categorys := [] *models.Category{}
    c.o.QueryTable( new(models.Category).TableName()).All(&categorys)
    id, _ := c.GetInt("id")
    if id != 0{
        post := models.Post{Id:id}
        c.o.Read(&post)
        c.Data["post"] = post
    }
    c.Data["categorys"] = categorys
    c.TplName = c.controllerName + "/_form.tpl"
}

博客添加或者修改页面_form.tpl:

//保存
func (c * AdminController) Save()  {
    post := models.Post{}
    post.UserId = 1
    post.Title = c.Input().Get("title")
    post.Content = c.Input().Get("content")
    post.IsTop,_ = c.GetInt8("is_top")
    post.Types,_ = c.GetInt8("types")
    post.Tags = c.Input().Get("tags")
    post.Url = c.Input().Get("url")
    post.CategoryId, _ = c.GetInt("cate_id")
    post.Info = c.Input().Get("info")
    post.Image = c.Input().Get("image")
    post.Created = time.Now()
    post.Updated = time.Now()

    id ,_ := c.GetInt("id")
    if id == 0 {
        if _, err := c.o.Insert(&post); err != nil {
            c.History("插入数据错误"+err.Error(), "")
        } else {
            c.History("插入数据成功", "/admin/index.html")
        }
    }else {
        post.Id = id
        if _, err := c.o.Update(&post); err != nil {
            c.History("更新数据出错"+err.Error(), "")
        } else {
            c.History("插入数据成功", "/admin/index.
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/suresand/article/details/79749084
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-30 08:32:06
  • 阅读 ( 1975 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢