conf/app.conf

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

controllersmy/attach.go

package controllersmy

import (
"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"] = true c.Data["isCookie"] = checkCookie(c.Ctx)
}

controllersmy/login.go

package controllersmy

import (
//"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"] = true isExit := c.Input().Get("exit") == "true"
if isExit {
c.Ctx.SetCookie("name", "", -1, "/") //-1就会删除cookie
c.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 := 0
if autologin { //自动登陆就要设置cookie
maxAge = 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") //获取请求带来的cookie
if err != nil {
return false
}
uname := ck.Value ck, err = ctx.Request.Cookie("pwd") //获取请求带来的cookie
if err != nil {
return false
}
pwd := ck.Value return beego.AppConfig.String("name") == uname && beego.AppConfig.String("pwd") == pwd
}

controllersmy/topic.go

package controllersmy

import (
"blog1/models"
"github.com/astaxie/beego" //导入beego包
"path"
) type TopicController struct {
beego.Controller
} func (c *TopicController) Get() {
c.TplName = "topic.html" //返回页面名字
c.Data["isTopic"] = true
c.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 string
if fh != nil {
//保存附件
attachFilename = fh.FileName
beego.Info(attachFilename)
//filement:tmp.go
//path:attachments/tmp.go
err = 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")是2343
if 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")是2343
if 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")是2343
if err != nil {
c.Redirect("/", 302)
return
}
c.Data["Topic"] = topic
c.Data["id"] = id c.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"] = true
var err error
c.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 models import (
"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 int64
Uid int64
Title string
Content string `orm:"size(5000)"`
Attachment string
Created time.Time `orm:"index"` //创建时间,`orm:"index"`是tag,
Updated time.Time `orm:"index"` //创建时间,`orm:"index"`是tag,
Views int64 `orm:"index"` //浏览次数
Author string
ReplayTime 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、Topic
orm.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和error
o := orm.NewOrm()
o.Using("default")
cs := make([]*Category, 0) //定义一个slice
qs := o.QueryTable("category")
var err error
if 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 = title
topic.Content = content
o.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 routers

import (
"blog1/controllersmy"
"github.com/astaxie/beego"
"os"
) func init() {
beego.Router("/", &controllersmy.MainController{}) //"blog1/controllersmy"里面的 &controllersmy
beego.Router("/login", &controllersmy.LoginController{}) //"blog1/controllersmy"里面的 &controllersmy
beego.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") //创建附件目录attachments
os.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 main

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

最新文章

  1. Sort Methods
  2. C++ 制作 json 数据 并 传送给服务端(Server) 的 php
  3. iOS 向客户发送xcarchive文件(整理中)
  4. 注意ArrayAdapter的Add()方法
  5. C# 分层 三层架构
  6. [原创汉化]linux前端神器 WebStorm8 汉化
  7. Python第一天——初识Python
  8. linux C 数组操作
  9. 总结一下ASP.NET MVC 网站的部署问题
  10. bzoj 1901: Zju2112 Dynamic Rankings(树套树)
  11. ansible 判断和循环
  12. SQL Server 查询性能优化——创建索引原则(一)(转载)
  13. P1892 [BOI2003]团伙 并查集
  14. 原生JavaScript写select下拉选择后跳转页面
  15. 使用Visual Studio Team Services进行压力和性能测试(二)——压力测试执行
  16. hdu 6170 Two strings dp
  17. 丑闻第三季 /全集Scandal迅雷下载
  18. android中Fragment的使用
  19. windows server服务器上部署java+tomcat网站域名配置
  20. Bootstrap全局CSS样式之表格

热门文章

  1. POJ 3468 A Simple Problem with Integers (线段树多点更新模板)
  2. Sql按照字段分组,选取其他字段最值所在的行记录
  3. 大数据学习——mapreduce学习topN问题
  4. struts2接受请求参数
  5. python007 Python3 数字(Number)
  6. mysql5.7.20主从和主主搭建
  7. BZOJ1740: [Usaco2005 mar]Yogurt factory 奶酪工厂
  8. HDU 6076 (动态规划)
  9. 从零开始写STL-string类型
  10. 从零开始写STL—set/map