beego 简单项目(一)文章模块

beego 简单项目(一)

创建beego项目

  1. beego在安装完bee工具后就可以使用命令 bee new <项目名> 创建项目了 ,创建完后项目结构如下
    在这里插入图片描述
  2. 配置相关信息
    conf文件夹下app.conf
    **
    appname = hello
    runmode = dev
    [dev]
    httpport=8080
    [prod]
    httpport=8081
    [test]
    httpport=8082

#mysql
mysqladdr = 127.0.0.1
mysqlport = 3306
mysqluser = root
mysqlpassword = root
copyrequestbody = true

#session相关
SessionOn=true
sessionProvider = “file”
sessionProviderConfig = “./tmp/session”
**

  1. 新建控制器 比如做一个文章模块 新建ArticleController.go
package controllers

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/validation"
	"log"
	"hello/models"
	"path"
	"os"
	"time"
	"fmt"
	"math/rand"
)

type ArticleController struct {
	beego.Controller
}


type JsonStruct struct {
	Code int `json:"code"`
	Msg string `json:"message"`
}

type ArticleFilter struct {
	Title string
	Atype int
	Author string
}

func (this *ArticleController) AddArticle() {
	this.TplName = "add_article.tpl"
}


func (this *ArticleController) TestArticle() {
	this.TplName = "test_article.tpl"
}


func (this *ArticleController) GetList() {
	// 页数
	page, err := this.GetInt("page")
	if err != nil {
		page = 1
	}
	// 分页数
	pageSize, err := this.GetInt("limit")
	if err != nil {
		pageSize = 10
	}

	result, _ := models.GetArticleListsA(page, pageSize)
	this.Data["json"] = result
	this.ServeJSON()
}

/**
 * 添加文章
 * @param  {[type]} this *ArticleController) AjaxAddArticle( [description]
 * @return {[type]}      [description]
 */
func (this *ArticleController) AjaxAddArticle() {
	title := this.GetString("title")
	author := this.GetString("author")
	f, h, err := this.GetFile("file")
	defer f.Close()

	atype := this.GetString("type")
	is_show, err := this.GetInt("is_show")
	desc := this.GetString("desc")

	valid := validation.Validation{}
	valid.Required(title, "title")
	valid.Required(author, "author")

	// 验证文件上传类型 获取文件后缀
	fileExt := path.Ext(h.Filename)
	 //创建目录
    uploadDir := "static/upload/" + time.Now().Format("2006/01/02/")
    os.MkdirAll(uploadDir , 777)

    filename := fmt.Sprintf("%d", rand.Intn(9999)+1000 ) + fileExt

    var AllowExtMap map[string]bool = map[string]bool {
    	".jpg": true,
    	".png": true,
    	".jpeg": true,
    	".bmp": true,
    }

    if _, ok := AllowExtMap[fileExt]; !ok {
    	this.Ctx.WriteString("后缀名不符合上传要求")
    	return
    }

    filePath := uploadDir + filename
    // 存储文件
	this.SaveToFile("file", filePath)

	if valid.HasErrors() {
		for _, err := range valid.Errors { 
			log.Println(err.Key, err.Message)
		}
	}
	// 添加文章
	article := models.Article{Title: title, Author: author, Img: filePath, Atype: atype, IsShow: is_show, Desc: desc}
	result, err := models.AddArticle(&article)
	if err != nil {
		log.Println(err)
	}

	var resultMap map[string]interface{}
	resultMap = make(map[string]interface{})
	resultMap["code"] = 200
	resultMap["msg"] = "操作成功"
	resultMap["article_id"] = result

	this.Data["json"] = resultMap
	this.ServeJSON()
}


func (this *ArticleController) GetArticleInfo() {
	// 获取参数
	id, err := this.GetInt("id")
	if err != nil {
		log.Println(err)
	}
	// 获取文章详情
	result, err := models.GetArticleInfo(id)
	if err != nil {
		log.Println(err)
	}

	this.Data["result"] = result
	this.TplName = "article_info.tpl"
}

/**
 * 获取文章列表
 * @param  {[type]} this *ArticleController) GetArticleLists( [description]
 * @return {[type]}      [description]
 */
func (this *ArticleController) GetArticleLists() {
	// 页数
	page, err := this.GetInt("page")
	if err != nil {
		page = 1
	}
	// 分页数
	pageSize, err := this.GetInt("limit")
	if err != nil {
		pageSize = 10
	}

	// 标题名称
	title := this.GetString("title")
	result, _ := models.GetArticleLists(page, pageSize)
	var filter ArticleFilter
	this.Data["m"] = map[int]interface{} {
		1: "玄幻",
		2: "科幻",
		3: "奇幻",
		4: "言情",
		5: "都市",
		6: "武侠",
		7: "仙侠",
	}
	filter.Title = title
	this.Data["filter"] = filter
	this.Data["count"] = result.Count
	this.Data["lists"] = result.Lists
	fmt.Println(result.Lists)
	this.TplName = "article_list.tpl"
}
  1. 新建model article.go
package models

import (
	"fmt"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
	"time"
)

type Article struct {
	Id int
	Title string
	Author string
	Img string
	Atype string
	IsShow int
	Desc string
	Created time.Time `orm:"auto_now_add;type(datetime)"`
}


type ArticleList struct {
	Lists []Article
	Count int
	Code int
	Msg string
}

type ArticleListTest struct {
	Lists []Article `json:"lists"`
	Count int `json:"count"`
	Code int `json:"code"`
	Msg string `json:"message"`
}

type ArticleInfo struct {
	Info Article `json:"info"`
	Code int `json:"code"`
	Msg string `json:":"message"`
}

func AddArticle(article *Article) (int64, error) {

	id, err := db.Insert(article)
	fmt.Println(id, err)
	if err != nil {
		db.Rollback()
	}
	// db.close()
	return id, err
}


func GetArticleListsA(page int, pageSize int) (ArticleListTest, error) {
	var article []Article
	var article_list ArticleListTest
	var rowCount int
	offset := (page - 1) * pageSize

	sql := Handler(offset, pageSize, 2)
	sql1 := Handler(offset, pageSize, 1)

	db.Raw(sql, 1).QueryRows(&article)
	db.Raw(sql1, 1).QueryRow(&rowCount)

	article_list.Code = 200
	article_list.Msg = "获取信息成功"
	article_list.Lists = article

	var typeMap map[string]string = map[string]string {
		"1": "玄幻",
		"2": "科幻",
		"3": "奇幻",
		"4": "言情",
		"5": "都市",
		"6": "武侠",
		"7": "仙侠",
	}

	for k, value := range article {
		article[k].Atype = typeMap[value.Atype]
	}
	article_list.Count = rowCount

	return article_list, nil
}


func GetArticleLists(page int, pageSize int) (ArticleList, error) {
	var article []Article
	var article_list ArticleList
	var rowCount int
	offset := (page - 1) * pageSize

	sql := Handler(offset, pageSize, 2)
	sql1 := Handler(offset, pageSize, 1)

	db.Raw(sql, 1).QueryRows(&article)
	db.Raw(sql1, 1).QueryRow(&rowCount)

	article_list.Code = 0
	article_list.Msg = "获取信息成功"
	article_list.Lists = article
	article_list.Count = rowCount

	return article_list, nil
}


func Handler(offset int, pageSize int, typeA int) string {
	qb, _ := orm.NewQueryBuilder("mysql")
	if typeA != 1 {
		qb.Select("*").From("article").Where("is_delete=?").Limit(pageSize).Offset(offset)
	} else {
		qb.Select("count(*)").From("article").Where("is_delete=?")
	}

	sql := qb.String()
	return sql
}

func GetArticleInfo(id int) (ArticleInfo, error){
	var articleInfo ArticleInfo
	var article Article
	qb, _ := orm.NewQueryBuilder("mysql")
	qb.Select("*").From("article").Where("id=?")

	sql := qb.String()
	db.Raw(sql, id).QueryRow(&article)

	articleInfo.Info = article
	articleInfo.Code = 200
	articleInfo.Msg = "获取信息成功"

	return articleInfo, nil
}



  1. 新建前端文件 在views目录下 新建add_article.tpl,article_list.tpl,article_info.tpl等

在这里插入图片描述
一般公共前端文件都放在static目录下 在这里插入图片描述
6. 下面是示例add_article.tpl文件 公共文件的引入 使用 {{template “公共文件名” .}} 这里就不详细说明

{{template "header.tpl" .}}
<body>
<div style="margin-top: 50px;width: 50%;margin-left: 25%;">
	<h2 style="margin-bottom: 20px;">添加文章</h2>
	<form class="layui-form" action="" method="post" enctype="multipart/form-data">
	  <div class="layui-form-item">
	    <label class="layui-form-label">文章标题</label>
	    <div class="layui-input-block">
	      <input type="text" name="title" required  lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input">
	    </div>
	  </div>
	  <div class="layui-form-item">
	    <label class="layui-form-label">作者</label>
	    <div class="layui-input-block">
	      <input type="text" name="author" required  lay-verify="required" placeholder="请输入作者" autocomplete="off" class="layui-input">
	    </div>
	  </div>
	  <div class="layui-form-item">
	    <label class="layui-form-label">文章图片</label>
	    <div class="layui-input-block">
	      <input type="file" id="fileImg" name="file" style="padding: 9px 1px;">
	    </div>
	  </div>
	  
	  <div class="layui-form-item">
	    <label class="layui-form-label">请选择文章类型</label>
	    <div class="layui-input-block">
	      <select name="type" id="seletcS" lay-verify="required">
	        <option value="1">玄幻</option>
	        <option value="2">科幻</option>
	        <option value="3">奇幻</option>
	        <option value="4">言情</option>
	        <option value="5">都市</option>
	        <option value="6">武侠</option>
	        <option value="7">仙侠</option>
	      </select>
	    </div>
	  </div>
	  <div class="layui-form-item">
	    <label class="layui-form-label">是否展示</label>
	    <div class="layui-input-block">
	      <input type="radio" name="is_show" value="1" title="" checked>
	      <input type="radio" name="is_show" value="2" title="">
	    </div>
	  </div>
	  <div class="layui-form-item layui-form-text">
	    <label class="layui-form-label">文章内容</label>
	    <div class="layui-input-block">
	      <textarea name="desc" id="textArea" placeholder="请输入内容" class="layui-textarea"></textarea>
	    </div>
	  </div>
	  <div class="layui-form-item">
	    <div class="layui-input-block">
	      <button class="layui-btn" type="button" lay-filter="formDemo" onclick="submitForm();">立即提交</button>
	      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
	    </div>
	  </div>
	</form>
<script>
//Demo
layui.use(['form', 'layer'], function(){
  var form = layui.form();
  
  //监听提交
  form.on('submit(formDemo)', function(data){
  	console.log(data);
    layer.msg(JSON.stringify(data.field));
    return false;
  });
});

function submitForm() {
	var formData = new FormData();
	formData.append("file", $('#fileImg')[0].files[0]);
	formData.append("title", $('input[name="title"]').val());
	formData.append("author", $('input[name="author"]').val());
	formData.append("type", $('#seletcS').val());
	formData.append("is_show", $('input:radio:checked').val());
	formData.append("desc", $('#textArea').val());
	$.ajax({
		url: "/article/add",
		type: "post",
		dataType: "json",
		cache: false,
		data: formData,
		processData: false,// 不处理数据
		contentType: false, // 不设置内容类型
		success: function (data) {
			console.log(data);
			if (data.code == 200) {
				layui.use('layer', function () {
					layer.msg(data.msg, {icon: 1, time: 2000});
				})
			}
			//window.location = "/article/test";
		},
		error: function (error) {
			console.log(error);
		}
	});
}
</script>

</div>
</body>
{{template "footer.tpl" .}}

  1. 设置路由 在routers目录下的router.go文件里
package routers

import (
	"hello/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/login", &controllers.LoginController{}, "get:Get;post:Post")
    beego.Router("/user/lists", &controllers.LoginController{}, "get:GetUserList;post:AjaxGetUserList")
    beego.Router("/article/add", &controllers.ArticleController{}, "get:AddArticle;post:AjaxAddArticle")
    beego.Router("/article/lists", &controllers.ArticleController{}, "get:GetArticleLists")
    beego.Router("/article/test", &controllers.ArticleController{}, "get:TestArticle")
    beego.Router("/article/data", &controllers.ArticleController{}, "get:GetList")
    beego.Router("/article/view", &controllers.ArticleController{}, "get:GetArticleInfo")
    beego.Router("/test", &controllers.TestController{}, "get:Get")
    beego.Router("/test/ast", &controllers.TestController{}, "get:Ast")
    beego.Router("/test/bst", &controllers.TestController{}, "get:Bst")
    beego.Router("/test/export", &controllers.TestController{}, "get:Export")
    beego.Router("/test/getInfo", &controllers.TestController{}, "get:GetInfo")
}
  1. 运行项目 执行命令bee run
  2. 成功执行后 访问 127.0.0.1:8080(按照自己配置的端口访问即可)
    在这里插入图片描述
    访问后可看到上述页面
    接下来访问 127.0.0.1:8080/article/add
    在这里插入图片描述
    接下来访问 127.0.0.1:8080/article/test 查看列表页
    在这里插入图片描述
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值