• beego开发博客系统学习(二)


    1 写文章功能开发

    1)数据库设计

    util添加article表操作:

    1. //创建文章表
    2. func CreateTableWithArticle(){
    3. sql:=`create table if not exists article(
    4. id int(4) primary key auto_increment not null,
    5. title varchar(30),
    6. author varchar(20),
    7. tags varchar(30),
    8. short varchar(255),
    9. content longtext,
    10. createtime int(10)
    11. );`
    12. ModifyDB(sql)
    13. }

    2)model层

    3)控制层

     4)路由层
    beego.Router("/article/add", &controllers.AddArticleController{})

    5)视图层

    6)js

     看一下初步的效果:

    2 文章展示

    2.1 首页展示

    1)home_controller.go文件,在Get()方法中,先查询所有的文章,并显示到页面上。

    1. func (this *HomeController) Get() {
    2. page, _ := this.GetInt("page")
    3. if page <= 0 {
    4. page = 1
    5. }
    6. var artList []models.Article
    7. artList, _ = models.FindArticleWithPage(page)
    8. this.Data["PageCode"] = 1
    9. this.Data["HasFooter"] = true
    10. fmt.Println("IsLogin:", this.IsLogin, this.Loginuser)
    11. this.Data["Content"] = models.MakeHomeBlocks(artList, this.IsLogin)
    12. this.TplName = "home.html"
    13. }

    2)article_model.go文件中,添加文章的查询

    1. //根据页码查询文章
    2. func FindArticleWithPage(page int) ([]Article, error) {
    3. //从配置文件中获取每页的文章数量
    4. num, _ := beego.AppConfig.Int("articleListPageNum")
    5. page--
    6. fmt.Println("---------->page", page)
    7. return QueryArticleWithPage(page, num)
    8. }
    9. /**
    10. 分页查询数据库
    11. limit分页查询语句,
    12. 语法:limit m,n
    13. m代表从多少位开始获取,与id值无关
    14. n代表获取多少条数据
    15. 注意limit前面咩有where
    16. */
    17. func QueryArticleWithPage(page, num int) ([]Article, error) {
    18. sql := fmt.Sprintf("limit %d,%d", page*num, num)
    19. return QueryArticlesWithCon(sql)
    20. }
    21. func QueryArticlesWithCon(sql string) ([]Article, error) {
    22. sql = "select id,title,tags,short,content,author,createtime from article " + sql
    23. rows, err := utils.QueryDB(sql)
    24. if err != nil {
    25. return nil, err
    26. }
    27. var artList []Article
    28. for rows.Next() {
    29. id := 0
    30. title := ""
    31. tags := ""
    32. short := ""
    33. content := ""
    34. author := ""
    35. var createtime int64
    36. createtime = 0
    37. rows.Scan(&id, &title, &tags, &short, &content, &author, &createtime)
    38. art := Article{id, title, tags, short, content, author, createtime}
    39. artList = append(artList, art)
    40. }
    41. return artList, nil
    42. }

    3)创建home_module.go进行首页文章展示

    1. //----------首页显示内容---------
    2. func MakeHomeBlocks(articles []Article, isLogin bool) template.HTML {
    3. htmlHome := ""
    4. for _, art := range articles {
    5. //将数据库model转换为首页模板所需要的model
    6. homeParam := HomeBlockParam{}
    7. homeParam.Id = art.Id
    8. homeParam.Title = art.Title
    9. homeParam.Tags = createTagsLinks(art.Tags)
    10. fmt.Println("tag-->", art.Tags)
    11. homeParam.Short = art.Short
    12. homeParam.Content = art.Content
    13. homeParam.Author = art.Author
    14. var timeLayoutStr = "2006-01-02 15:04:05"
    15. homeParam.CreateTime = time.Unix(art.Createtime,0).Format(timeLayoutStr)
    16. homeParam.Link = "/article/" + strconv.Itoa(art.Id)
    17. homeParam.UpdateLink = "/article/update?id=" + strconv.Itoa(art.Id)
    18. homeParam.DeleteLink = "/article/delete?id=" + strconv.Itoa(art.Id)
    19. homeParam.IsLogin = isLogin
    20. //处理变量
    21. //ParseFile解析该文件,用于插入变量
    22. t, _ := template.ParseFiles("views/block/home_block.html")
    23. buffer := bytes.Buffer{}
    24. //就是将html文件里面的比那两替换为穿进去的数据
    25. t.Execute(&buffer, homeParam)
    26. htmlHome += buffer.String()
    27. }
    28. return template.HTML(htmlHome)
    29. }
    30. //将tags字符串转化成首页模板所需要的数据结构
    31. func createTagsLinks(tags string) []TagLink {
    32. var tagLink [] TagLink
    33. tagsPamar := strings.Split(tags, "&")
    34. for _, tag := range tagsPamar {
    35. tagLink = append(tagLink, TagLink{tag, "/?tag=" + tag})
    36. }
    37. return tagLink
    38. }

     4)视图层

    在model的MakeHomeBlocks()方法中,就是需要使用模板填充格式化html页面内容,所以我们在views/block下再创建一个html页面:home_block.html

    5)效果展示 

    2.2 分页展示

    1)home_module设计

    分页结构体对象

    1. type HomeFooterPageCode struct {
    2. HasPre bool
    3. HasNext bool
    4. ShowPage string
    5. PreLink string
    6. NextLink string
    7. }
    1. //-----------翻页-----------
    2. //page是当前的页数
    3. func ConfigHomeFooterPageCode(page int) HomeFooterPageCode {
    4. pageCode := HomeFooterPageCode{}
    5. //查询出总的条数
    6. num := GetArticleRowsNum()
    7. //从配置文件中读取每页显示的条数
    8. pageRow, _ := beego.AppConfig.Int("articleListPageNum")
    9. //计算出总页数
    10. allPageNum := (num-1)/pageRow + 1
    11. pageCode.ShowPage = fmt.Sprintf("%d/%d", page, allPageNum)
    12. //当前页数小于等于1,那么上一页的按钮不能点击
    13. if page <= 1 {
    14. pageCode.HasPre = false
    15. } else {
    16. pageCode.HasPre = true
    17. }
    18. //当前页数大于等于总页数,那么下一页的按钮不能点击
    19. if page >= allPageNum {
    20. pageCode.HasNext = false
    21. } else {
    22. pageCode.HasNext = true
    23. }
    24. pageCode.PreLink = "/?page=" + strconv.Itoa(page-1)
    25. pageCode.NextLink = "/?page=" + strconv.Itoa(page+1)
    26. return pageCode
    27. }

    2)article_model.go文件中,加入查询总数据量的方法

    还要考虑一个问题,就是当新增或删除文章的时候,数据总量会发生改变,所以还要修改增加文章的方法 

     3)home_controller.go

     4)home.html

    5)效果

    2.3 展示文章详情

    1)路由添加

     2)show_article_controller.go

     3)article_model.go文件中,添加方法,根据id查询文章

    1. //----------查询文章-------------
    2. func QueryArticleWithId(id int) Article {
    3. row := utils.QueryRowDB("select id,title,tags,short,content,author,createtime from article where id=" + strconv.Itoa(id))
    4. title := ""
    5. tags := ""
    6. short := ""
    7. content := ""
    8. author := ""
    9. var createtime int64
    10. createtime = 0
    11. row.Scan(&id, &title, &tags, &short, &content, &author, &createtime)
    12. art := Article{id, title, tags, short, content, author, createtime}
    13. return art
    14. }

    4)在views目录下,新建html页面文件,show_article.html

    2.4 修改文章

    1)update_rticle_control.go

    1. /**
    2. * 更新文章的控制器
    3. */
    4. type UpdateArticleController struct {
    5. BaseController
    6. }
    7. //当访问/update路径的时候回触发Get()方法,响应的页面是通过TplName这个属性指定返回给客户端的页面
    8. func (this *UpdateArticleController) Get() {
    9. id, _ := this.GetInt("id")
    10. fmt.Println(id)
    11. //获取id所对应的文章信息
    12. art := models.QueryArticleWithId(id)
    13. this.Data["Title"] = art.Title
    14. this.Data["Tags"] = art.Tags
    15. this.Data["Short"] = art.Short
    16. this.Data["Content"] = art.Content
    17. this.Data["Id"] = art.Id
    18. this.TplName = "write_article.html"
    19. }
    20. //修改文章
    21. func (this *UpdateArticleController) Post() {
    22. id, _ := this.GetInt("id")
    23. fmt.Println("postid:", id)
    24. //获取浏览器传输的数据,通过表单的name属性获取值
    25. title := this.GetString("title")
    26. tags := this.GetString("tags")
    27. short := this.GetString("short")
    28. content := this.GetString("content")
    29. //实例化model,修改数据库
    30. art := models.Article{id, title, tags, short, content, "", 0}
    31. _, err := models.UpdateArticle(art)
    32. //返回数据给浏览器
    33. if err == nil {
    34. this.Data["json"] = map[string]interface{}{"code": 1, "message": "更新成功"}
    35. } else {
    36. this.Data["json"] = map[string]interface{}{"code": 0, "message": "更新失败"}
    37. }
    38. this.ServeJSON()
    39. }

    2)write_article.html

    1. <div id="main">
    2. <form id="write-art-form" method="post">
    3. <div>标题</div>
    4. <input type="text" placeholder="请输入标题" name="title" value="{{.Title}}">
    5. <div>标签</div>
    6. <input type="text" placeholder="请输入标签" name="tags" value="{{.Tags}}">
    7. <div>简介</div>
    8. <textarea placeholder="请输入简介" name="short">{{.Short}}</textarea>
    9. <div>内容</div>
    10. <textarea id="content" placeholder="请输入内容" name="content">{{.Content}}</textarea>
    11. <input id="write-article-id" hidden name="id" value="{{.Id}}">
    12. <button type="button" onclick="history.back()">返回</button>
    13. <button type="submit" id="write-art-submit">提交</button>
    14. </form>
    15. </div>

    修改还是添加,其实要看页面上id的值,如果是添加使用默认值0,如果是修改是从数据库中查询出的真实数值,所以需要修改js脚本文件:

     3)model层添加修改文章数据库操作

    1. //----------修改数据----------
    2. func UpdateArticle(article Article) (int64, error) {
    3. //数据库操作
    4. return utils.ModifyDB("update article set title=?,tags=?,short=?,content=? where id=?",
    5. article.Title, article.Tags, article.Short, article.Content, article.Id)
    6. }

    3 标签开发

    1)在article_model.go文件中查询数据库中存在的所有标签

    2)创建tags_model.go

     3)创建tags_controller.go

     4)路由设置

    beego.Router("/tags", &controllers.TagsController{})

    5)视图层添加tags.html

     6)tags效果展示

     

  • 相关阅读:
    R-Car H3系列SOC芯片与R-Car M3 R8A77961JBP0BA区别
    【Python基础】if __name__ == ‘__main__‘:和assert函数
    训练集表达的分类规则整理
    Python缺失值的处理
    Postman接口调用api
    JavaScript函数进阶:函数的定义和调用
    Blazor和Vue对比学习(基础1.5):双向绑定
    Jmeter接口测试
    818专业课【考经】—《信号系统》之章节概要:第四章 离散时间信号与系统的时域分析
    鉴智机器人完成亿元人民币级别的A轮融资第二次交割,由深创投和厚雪基金联合领投
  • 原文地址:https://blog.csdn.net/xlsj228/article/details/124848724