conf/app.conf

appname = blog1
httpport = 8080
runmode = dev
name=admin
pwd=admin

controllersmy/attach.go

package controllersmyimport ("github.com/astaxie/beego" //导入beego包"io""net/url""os"
)type AttachmentController struct {beego.Controller
}func (c *AttachmentController) Get() {filePath, err := url.QueryUnescape(c.Ctx.Request.RequestURI[1:]) //去除最开头的一个/if err != nil {c.Ctx.WriteString(err.Error())return}f, err := os.Open(filePath)if err != nil {c.Ctx.WriteString(err.Error())return}defer f.Close()_, err = io.Copy(c.Ctx.ResponseWriter, f) //2个参数是输出流和输入流if err != nil {c.Ctx.WriteString(err.Error())return}
}

controllersmy/default.go

//model的上层,下层调用models来操作数据库package controllersmy //跟外面的包名一致import ("github.com/astaxie/beego" //导入beego包
)type MainController struct {beego.Controller //"github.com/astaxie/beego"包里面的Controller
}func (c *MainController) Get() {c.TplName = "index.html" //返回页面名字c.Data["isHome"] = truec.Data["isCookie"] = checkCookie(c.Ctx)
}

controllersmy/login.go

package controllersmyimport (//"fmt""github.com/astaxie/beego" //导入beego包"github.com/astaxie/beego/context"//"net/url"
)type LoginController struct {beego.Controller
}func (c *LoginController) Get() {c.Data["islogin"] = trueisExit := c.Input().Get("exit") == "true"if isExit {c.Ctx.SetCookie("name", "", -1, "/") //-1就会删除cookiec.Ctx.SetCookie("pwd", "", -1, "/")return //不需要指定跳的首页了
    }c.TplName = "login.html" //返回页面名字
}func (c *LoginController) Post() {//c.TplName = "login.html" //返回页面名字c.Data["islogin"] = true//c.Ctx.WriteString(fmt.Sprint(c.Input())) //获取post时候带过来的参数,WriteString页面就跳转了不执行下面的了,uname := c.Input().Get("username")pwd := c.Input().Get("pwd")autologin := c.Input().Get("auto") == "on" //bool值//跟app.conf里面的用户名和密码比对if beego.AppConfig.String("name") == uname && beego.AppConfig.String("pwd") == pwd {maxAge := 0if autologin { //自动登陆就要设置cookiemaxAge = 1<<31 - 1}c.Ctx.SetCookie("name", uname, maxAge, "/") //保存时间和保存路径c.Ctx.SetCookie("pwd", uname, maxAge, "/")  //保存时间和保存路径c.Redirect("/welcome", 301)                 //登陆后重定向到欢迎页面//c.TplName = "welcome.html" //返回页面名字,没有走过滤器controller,Redirect走了过滤器controller,} else {return}return
}//整个包可访问
func checkCookie(ctx *context.Context) bool {ck, err := ctx.Request.Cookie("name") //获取请求带来的cookieif err != nil {return false}uname := ck.Valueck, err = ctx.Request.Cookie("pwd") //获取请求带来的cookieif err != nil {return false}pwd := ck.Valuereturn beego.AppConfig.String("name") == uname && beego.AppConfig.String("pwd") == pwd
}

controllersmy/topic.go

package controllersmyimport ("blog1/models""github.com/astaxie/beego" //导入beego包"path"
)type TopicController struct {beego.Controller
}func (c *TopicController) Get() {c.TplName = "topic.html" //返回页面名字c.Data["isTopic"] = truec.Data["isCookie"] = checkCookie(c.Ctx)
}func (c *TopicController) Post() {if !checkAccount(c.Ctx) { //没有账号登陆页面c.Redirect("/login", 302)return}title := c.Input().Get("title")content := c.Input().Get("content")//获取附件,上传删除修改跟cmss一样,_, fh, err = this.GetFile("attachment")if err != nil {beego.Error(err)}var attachFilename stringif fh != nil {//保存附件attachFilename = fh.FileNamebeego.Info(attachFilename)//filement:tmp.go//path:attachments/tmp.goerr = this.SaveToFile("attachment", path.Join("attachments", attachFilename)) //path的第一个参数是工程目录下attachments文件夹名字
}if len(id) == 0 {err := models.AddTopic(title, content, attachFilename)} else {err := models.ModifyTopic(id, title, content, attachFilename)}if err != nil {beego.Debug(err)}c.Redirect("/topic/view"+id, 302) //添加完之后跳转到查看页面
}func (c *TopicController) Add() {c.TplName = "topic_add.html" //返回页面名字c.Ctx.WriteString("topic_add")
}func (c *TopicController) View() { //查看单偏文章c.TplName = "topic_add.html"topic, err := models.GetOneTopic(c.Ctx.Input.Params("0")) //localhost:8080/topic/view/2343, Params("0")是2343if err != nil {c.Redirect("/", 302)}c.Data["Topic"] = topic//如果要获取文章的回复,就到这个写reply, err := models.GetAllApply(c.Ctx.Input.Params("0")) //localhost:8080/topic/view/2343, Params("0")是2343if err != nil {c.Redirect("/", 302)}c.Data["reply"] = reply
}func (c *TopicController) Modify() { //查看单偏文章tid := c.Input().Get("id") //获取url中传过来的id
topic, err := models.GetOneTopic(tid) //localhost:8080/topic/view/2343, Params("0")是2343if err != nil {c.Redirect("/", 302)return}c.Data["Topic"] = topicc.Data["id"] = idc.Redirect("/", 302)
}func (c *TopicController) Delete() {if !checkAccount(c.Ctx) { //没有账号登陆页面c.Redirect("/login", 302)return}err := models.DeleteTopic(c.Ctx.Input.Params("0"))if err != nil {beego.Error(err)}c.TplName = "topic_add.html"
}

controllersmy/welcome.go

package controllersmy //跟外面的包名一致import ("blog1/models"//"fmt""github.com/astaxie/beego" //导入beego包
)type WelcomeController struct {beego.Controller //"github.com/astaxie/beego"包里面的Controller
}func (c *WelcomeController) Get() {op := c.Input().Get("op")beego.Debug("aaa")switch op {case "add"://c.Ctx.WriteString(fmt.Sprint(c.Input()))name := c.Input().Get("name")if len(name) == 0 {break}err := models.AddCatory(name)if err != nil {beego.Debug(err)return}case "del":beego.Debug("333")//c.Ctx.WriteString(fmt.Sprint(c.Input()))id := c.Input().Get("id")if len(id) == 0 {break}err := models.DelCatory(id)if err != nil {beego.Debug(err)}}c.Data["welcome"] = truevar err errorc.Data["Categories"], err = models.GetAllCategory(false)beego.Debug("111")beego.Debug(c.Data["Categories"])if err != nil {beego.Debug(err)}c.TplName = "welcome.html" //返回页面名字,控制器之后写页面的名字,
}

model/models.go

//操作数据库层,control调用,//使用beego的orm,先要创建好结构,然后将结构提交给orm进行创建表
package modelsimport ("github.com/Unknwon/com""github.com/astaxie/beego""github.com/astaxie/beego/orm"  //导入beegoorm的路径,_ "github.com/mattn/go-sqlite3" //go-sqlite3的驱动程序,_表示只执行初始化函数,"os""path""strconv""strings""time"
)const (_DB_NAME        = "data/beego1.db"_SQLITE3_DRIVER = "sqlite3"
)//后面再添加字段,也可以动态在表中增加
type Category struct {Id        int64     //名称是Id,类型是int32或者int64,orm就认为是主键Title     string    //不指定长度,默认是255字节Created   time.Time `orm:"index"` //创建时间,`orm:"index"`是tag,表示建立索引,Views     int64     `orm:"index"` //浏览次数TopicTime time.Time `orm:"index"`newziduan string
}// //打印
//     beego.Trace("trace")
//     beego.Info("info")
//     beego.Debug("debug")
//     beego.Warn("warn")
// beego.Error("error")
type Topic struct {Id         int64Uid        int64Title      stringContent    string `orm:"size(5000)"`Attachment stringCreated    time.Time `orm:"index"` //创建时间,`orm:"index"`是tag,Updated    time.Time `orm:"index"` //创建时间,`orm:"index"`是tag,Views      int64     `orm:"index"` //浏览次数
    Author     stringReplayTime time.Time `orm:"index"`
}func RegisterDB() {if !com.IsExist(_DB_NAME) { //数据文件不存在就人为创建
        os.MkdirAll(path.Dir(_DB_NAME), os.ModePerm)os.Create(_DB_NAME)}//orm需要先注册模型Category、Topicorm.RegisterModel(new(Category), new(Topic))//注册驱动
    orm.RegisterDriver(_SQLITE3_DRIVER, orm.DRSqlite)//注册默认数据库,可以是多个数据库,不管有几个数据库,默认数据库名字要叫default//驱动名称,数据库路径,最大连接数orm.RegisterDataBase("default", _SQLITE3_DRIVER, _DB_NAME, 10)
}func AddCatory(name string) error {beego.Debug("aaa1")o := orm.NewOrm() //获取orm对象o.Using("default")c := &Category{Title: name, Created: time.Now(), Views: 11, TopicTime: time.Now()} //创建Category对象,title=传进来的name
qs := o.QueryTable("category")         //查询判断name是否被用了,使用的是beego的查询,Category是表名,err := qs.Filter("title", name).One(c) //根据title找到category,One(c)预期只有一个,
    beego.Debug(err)if err == nil { //==nil表示找到了
        beego.Debug(err)return err}beego.Debug("aaa")//否则插入id, err1 := o.Insert(c)beego.Debug("cc")if err1 != nil { //err != nil表示插入失败
        beego.Debug(err1)return err1}beego.Debug(id)beego.Debug("bbb")return nil
}func GetAllCategory(isPaixu bool) ([]*Category, error) { //返回元素类型为Category的slice和erroro := orm.NewOrm()o.Using("default")cs := make([]*Category, 0) //定义一个sliceqs := o.QueryTable("category")var err errorif isPaixu {_, err = qs.All(&cs)} else {_, err = qs.OrderBy("-created").All(&cs) //根据created降序
    }return cs, err
}func DelCatory(id string) error {cid, err := strconv.ParseInt(id, 10, 64) //10进制,64位大小if err != nil {return err //人为非法操作
    }o := orm.NewOrm()cat := &Category{Id: cid} //删除必须要指定主键,如果不知道主键就要QueryTable,Filter操作_, err = o.Delete(cat)    //前面下横线表示不得到,否则你不使用就会报错return err
}func AddTopic(name, con label, attachment string) error {//空格作为多个标签的分割,strings.Split(label, " ")通过空格把string分割成slice,//strings.Join将slice组合成string,label:="$"+strings.Join(strings.Split(label, " "), "#$") + "#"o := orm.NewOrm() //获取orm对象o.Using("default")topic := &Topic{Title:   name,Created: time.Now(),Views:   11,}topic.Title := strings.Replace(strings.Replace(Topic.Label, "#", " ", -1),"$", "", -1)//先把#变成空格,然后去除$,
_, err1 := o.Insert(topic)if err1 != nil { //err != nil表示插入失败
        beego.Debug(err1)return err1}return nil
}func GetOneTopic(id string) (*Topic, error) {tidnum, err := strconv.ParseInt(id, 10, 64) //把10进制的转成64位if err != nil {return nil, err}o := orm.NewOrm()topic := new(Topic)qs := o.QueryTable("topic")err = qs.Filter("id", tidnum).One(topic) //理论上只有一个,qs.Filter("id", tidnum).All(&topic)是获取所有,
err = qs.Filter("labels__contains", "$"+label+"#")//模糊查询,包含查询,if err != nil {return nil, err}topic.Views++            //浏览数加一_, err = o.Update(topic) //更新return topic, err
}func ModifyTopic(id, title, content string) error {tidnum, err := strconv.ParseInt(id, 10, 64) //把10进制的转成64位if err != nil {return err}o := orm.NewOrm()topic := &Topic{Id: tidnum}if o.Read(topic) == nil {topic.Title = titletopic.Content = contento.Update(topic)}return err
}func DeleteTopic(id, title, content string) error {cid, err := strconv.ParseInt(id, 10, 64) //10进制,64位大小if err != nil {return err //人为非法操作
    }o := orm.NewOrm()top := &Topic{Id: cid} //删除必须要指定主键,如果不知道主键就要QueryTable,Filter操作//先创建Topic对象,然后根据这个对象进行删除,_, err = o.Delete(top) //前面下横线表示不得到,否则你不使用就会报错return err
}

routers/router.go

package routersimport ("blog1/controllersmy""github.com/astaxie/beego""os"
)func init() {beego.Router("/", &controllersmy.MainController{})       //"blog1/controllersmy"里面的 &controllersmybeego.Router("/login", &controllersmy.LoginController{}) //"blog1/controllersmy"里面的 &controllersmybeego.Router("/welcome", &controllersmy.WelcomeController{})beego.Router("/topic", &controllersmy.TopicController{})beego.Router("/topic/add", &controllersmy.TopicController{}, "post:Add") //是post请求,并且是add方法,beego.Router("/topic/delete", &controllersmy.TopicController{}, "get:delete")//创建附件目录attachmentsos.Mkdir("attachments", os.ModePerm)//作为静态文件将附件反馈出来beego.SetStaticPath("/attachments", "attachment")//不作为静态文件,作为一个控制器来处理beego.Router("/attachment/:all", &controllersmy.AttachmentController{})
}

views/index.html

{{template "header" .}}
<title>首页</title><style type="text/css"></style>
</head><body>
{{template "navbar" .}}<!-- get请求就用a标签就可以了,post请求还要写一个表单 --><form method="POST" action="/login">表单登陆<input name="username" id="uname"/><input name="pwd"/ id="pwd"><input name="auto"/><input type="submit" onclick="return checkInput();"><input type="button" onclick="return backHome();">回到首页</input></form>{{if .isCookie}}有cokie了{{end}}<script src="/static/js/reload.min.js"></script><script type="text/javascript">function checkInput(){var name = document.getElementById("uname")if (name.value.length == 0) {alert("输入账号")return false//不提交表单
    }var pwd = document.getElementById("pwd")if (pwd.value.length == 0) {alert("输入账号")return false//不提交表单
    }return true//提交表单
  }function backHome(){window.location.href = "/"return false//表单一直不提交
  }</script>
</body>
</html>

views/login.html

{{template "header" .}}
<title>登陆成功</title><style type="text/css"></style>
</head><body>{{template "navbar" .}}
登陆成功<script src="/static/js/reload.min.js"></script>
</body>

views/T.head.tpl

{{define "header"}}<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link rel="shortcut icon" href="" type="image/x-icon" /><!-- <link id="mobile-style" type="text/css" rel="stylesheet" href="/static/css/main.css"><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous"><script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script> -->
{{end}}

views/T.navbar.tpl

{{define "navbar"}}
<!-- if .isHome是contrloller传递进来的值 --><div {{if .isHome}}class="active"{{end}} style="height:100px;width:400px;background-color:red;display:inline-block;">首页</div><div {{if .islogin}}class="active"{{end}} style="height:100px;width:400px;background-color:blue;display:inline-block;">登陆</div><ul class="nav navber-nav">{{if .islogin}}<li>登陆成功</li>{{else}}<li>首页</li>{{end}}</ul>
{{end}}

views/topic.html

{{template "header" .}}
<title>topic</title><style type="text/css"></style>
</head><body>{{template "navbar" .}}
{{.Topic.Title}}
{{.Topic.Content}}
{{.Topic.Attachment}}
{{$tid := .Topic.Id}}  <!-- 这就是一个模版变量 -->
{{$isLogin := .IsLogin}}  <script src="/static/js/reload.min.js"></script>{{if $isLogin}}   <!-- 模版变量使用 --><a href="/topic/modify?id={{.Tid}}&tid={{$tid}}">修改文章</a>  <!-- 模版变量的使用 -->{{end}}<form method="POST" action="/topic"><input name="name" id="name"/><input name="op" id="op"/><input type="file" name="attachment">文章附件</input><input type="submit">添加文章</input></form>
</body>

views/welcome.html

{{template "header" .}}
<title>huayin</title><style type="text/css"></style>
</head><body>
{{template "navbar" .}}欢迎你<script src="/static/js/reload.min.js"></script><tbody>{{range .Categories}}<th>{{.Id}}</th><th>{{.Title}}</th><th>{{.TopicTime}}</th><a href="/welcome?op=del&id={{.Id}}">删除</a><br>{{end}}</tbody>><form method="Get" action="/welcome"><input name="name" id="name"/><input name="op" id="op"/><input type="submit">add添加del删除</input></form>
</body>
</html>

main.go

package mainimport ("blog1/models"_ "blog1/routers""github.com/astaxie/beego""github.com/astaxie/beego/orm"
)func main() {orm.Debug = trueorm.RunSyncdb("default", false, true) //建表,建立的数据库在data目录下,
    beego.Run()
}func init() { //初始化数据库,使用navicat premiun查看数据库
    models.RegisterDB()
}

转载于:https://www.cnblogs.com/yaowen/p/8182192.html

beego07----web博客相关推荐

  1. java web博客系统_JavaWeb之博客系统(五)

    1.今天刚开始测试时和昨天一样,都出现了一个服务器内部问题:The server encountered an internal error () that prevented it from ful ...

  2. python开发个人博客_手把手教你用 Python + Flask 搭建个人博客

    Python 的语言特性使得自身编写 Web 框架极其容易,现在已经有上百种用 Python 编写的 Web 开发框架,其中用户量最大的两个就是 Django 和 Flask. Django 和 Fl ...

  3. Node+Express+Vue2.x+Mongodb结合muse-ui、less、rem等实现简易博客

    源码地址:https://github.com/XieTongXue/how-to/node-blog 请先阅读项目中的readme文件,按步骤启动,避免运行出错. 写此demo的缘由 最近在看学习e ...

  4. 基于Java/Mysql的个人博客网站

    3年前写的一个技术博客...纪念一下. OpenIdea Blog - 开源灵感博客 a personal blog site based on Java/Mysql - 基于Java/Mysql的个 ...

  5. JSP~Qing博客系统开发

    本篇文章主要对自己做的一个C#识别软件.一个Web博客系统做项目总结. 一.ToTool识别转换助手 软件打包之后在我电脑上运行正常,识别印刷体没有问题,但在不同系统不同电脑下运行会出问题.因为核心算 ...

  6. 团队作业8--展示博客

    1. 团队成员的简介和个人博客地址,团队的源码仓库地址. 组长:李勇(201421122027) 组员:何忠鹏(201421122024)郑希彬(201421122018)黄进勇(2014211220 ...

  7. 博客园外挂之一Web搜索引擎命中统计

    原来一直都觉得,把文章发到博客园首页会很大的提高自己blog的访问量.由于开始我只在blog上放了一个访问计数器,非常简单的一个计数器,只能计数,而且refresh都计数. 后来我又放了一个访问统计器 ...

  8. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...

    <小白7天入门PHP Web开发>系列文章,面向单纯善良的完全不懂Web开发编程的入门速成课程,小白们如果感兴趣可以研读此系列文章,也可以连线提问.各路大神有何指教还请指点一二.希望各路大 ...

  9. [2009.08.09]博客园北京俱乐部活动暨《博客园精华集:Web标准之道》现场签售通知...

    <博客园精华集:Web标准之道>发售啦!!! 无论你是博客园的老人,还是初来乍到,这些人你是否或曾耳闻呢:TerryLee.Anytao.Cat Chen.Anders Liu.鸟食轩.L ...

  10. flutter制作博客展示平台,现已支持 Web、macOS 应用、Android 和 iOS

    Flutter Blog Theme using Flutter | Web, macOS, Android, iOS Flutter 最近发布了 Flutter V2.5.1,其性能得到了很大提升, ...

最新文章

  1. 关于 sql server 基本使用的建议
  2. permission denied for window type 2003
  3. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
  4. 搞嵌入式Linux,做底层还是应用?底层要掌握哪些技能?
  5. How to change max_allowed_packet size
  6. 14 [虚拟化] 虚存抽象;Linux进程的地址空间
  7. 《OD大数据实战》MapReduce实战
  8. 请不要“妖魔化”外包岗位!
  9. 解决jquery调用NET webservice跨域的问题
  10. Ubuntu改坏sudoers后无法使用sudo的解决办法
  11. 动态URL、静态URl、伪静态URL
  12. 万特电能表接线仿真系统 软件_电工技能——分享一款超实用的电工仿真教学接线Flash动画软件...
  13. 国内AGV机器人厂家数目统计及区域分布分析
  14. WSF VBS 脚本编写
  15. win10计算机入门使用教程,win10技巧大全_win10使用技巧方法教程 - 系统家园
  16. 切比雪夫不等式例题讲解_13.初中数学:怎么解一元一次不等式?把解集表示在数轴上,基础训练...
  17. 免费语音转文字的软件有哪些?快来看看这几个软件
  18. rk3288 原子操作和原子位操作
  19. 使用Visual Studio 2019创建安装程序的详细教程
  20. openTSDB详解之Writing Data

热门文章

  1. android应用中插入admob广告
  2. Android中Alertdialog对话框点击消失?
  3. explain的讲解
  4. 运用深度学习教机器人理解自然语言
  5. Face Alignment at 3000 FPS via Regressing Local Binary Features(CVPR2014)读后感(first pass)
  6. 【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边
  7. 开源ImageFilter库v0.4:新增26种图片效果
  8. GPU 2014年4月 性能排名
  9. 基于IntelVt技术的Linux内核调试器 - 2
  10. POJ-3268-最短路(dijkstra算法)