社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
今天基于 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"></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"></i> 修改
</a>
<a href="javascript:void(0)" onclick="del({{$v.Id}})" >
<i class="layui-icon">ဆ</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"></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"></i> 修改
</a>
<a href="javascript:void(0)" onclick="del({{.Id}})" >
<i class="layui-icon">ဆ</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.
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!