beego07----web博客
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博客相关推荐
- java web博客系统_JavaWeb之博客系统(五)
1.今天刚开始测试时和昨天一样,都出现了一个服务器内部问题:The server encountered an internal error () that prevented it from ful ...
- python开发个人博客_手把手教你用 Python + Flask 搭建个人博客
Python 的语言特性使得自身编写 Web 框架极其容易,现在已经有上百种用 Python 编写的 Web 开发框架,其中用户量最大的两个就是 Django 和 Flask. Django 和 Fl ...
- Node+Express+Vue2.x+Mongodb结合muse-ui、less、rem等实现简易博客
源码地址:https://github.com/XieTongXue/how-to/node-blog 请先阅读项目中的readme文件,按步骤启动,避免运行出错. 写此demo的缘由 最近在看学习e ...
- 基于Java/Mysql的个人博客网站
3年前写的一个技术博客...纪念一下. OpenIdea Blog - 开源灵感博客 a personal blog site based on Java/Mysql - 基于Java/Mysql的个 ...
- JSP~Qing博客系统开发
本篇文章主要对自己做的一个C#识别软件.一个Web博客系统做项目总结. 一.ToTool识别转换助手 软件打包之后在我电脑上运行正常,识别印刷体没有问题,但在不同系统不同电脑下运行会出问题.因为核心算 ...
- 团队作业8--展示博客
1. 团队成员的简介和个人博客地址,团队的源码仓库地址. 组长:李勇(201421122027) 组员:何忠鹏(201421122024)郑希彬(201421122018)黄进勇(2014211220 ...
- 博客园外挂之一Web搜索引擎命中统计
原来一直都觉得,把文章发到博客园首页会很大的提高自己blog的访问量.由于开始我只在blog上放了一个访问计数器,非常简单的一个计数器,只能计数,而且refresh都计数. 后来我又放了一个访问统计器 ...
- ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...
<小白7天入门PHP Web开发>系列文章,面向单纯善良的完全不懂Web开发编程的入门速成课程,小白们如果感兴趣可以研读此系列文章,也可以连线提问.各路大神有何指教还请指点一二.希望各路大 ...
- [2009.08.09]博客园北京俱乐部活动暨《博客园精华集:Web标准之道》现场签售通知...
<博客园精华集:Web标准之道>发售啦!!! 无论你是博客园的老人,还是初来乍到,这些人你是否或曾耳闻呢:TerryLee.Anytao.Cat Chen.Anders Liu.鸟食轩.L ...
- flutter制作博客展示平台,现已支持 Web、macOS 应用、Android 和 iOS
Flutter Blog Theme using Flutter | Web, macOS, Android, iOS Flutter 最近发布了 Flutter V2.5.1,其性能得到了很大提升, ...
最新文章
- 关于 sql server 基本使用的建议
- permission denied for window type 2003
- 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
- 搞嵌入式Linux,做底层还是应用?底层要掌握哪些技能?
- How to change max_allowed_packet size
- 14 [虚拟化] 虚存抽象;Linux进程的地址空间
- 《OD大数据实战》MapReduce实战
- 请不要“妖魔化”外包岗位!
- 解决jquery调用NET webservice跨域的问题
- Ubuntu改坏sudoers后无法使用sudo的解决办法
- 动态URL、静态URl、伪静态URL
- 万特电能表接线仿真系统 软件_电工技能——分享一款超实用的电工仿真教学接线Flash动画软件...
- 国内AGV机器人厂家数目统计及区域分布分析
- WSF VBS 脚本编写
- win10计算机入门使用教程,win10技巧大全_win10使用技巧方法教程 - 系统家园
- 切比雪夫不等式例题讲解_13.初中数学:怎么解一元一次不等式?把解集表示在数轴上,基础训练...
- 免费语音转文字的软件有哪些?快来看看这几个软件
- rk3288 原子操作和原子位操作
- 使用Visual Studio 2019创建安装程序的详细教程
- openTSDB详解之Writing Data
热门文章
- android应用中插入admob广告
- Android中Alertdialog对话框点击消失?
- explain的讲解
- 运用深度学习教机器人理解自然语言
- Face Alignment at 3000 FPS via Regressing Local Binary Features(CVPR2014)读后感(first pass)
- 【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边
- 开源ImageFilter库v0.4:新增26种图片效果
- GPU 2014年4月 性能排名
- 基于IntelVt技术的Linux内核调试器 - 2
- POJ-3268-最短路(dijkstra算法)