beego 简单项目(一)
创建beego项目
- beego在安装完bee工具后就可以使用命令 bee new <项目名> 创建项目了 ,创建完后项目结构如下
- 配置相关信息
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”
**
- 新建控制器 比如做一个文章模块 新建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"
}
- 新建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
}
- 新建前端文件 在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" .}}
- 设置路由 在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")
}
- 运行项目 执行命令bee run
- 成功执行后 访问 127.0.0.1:8080(按照自己配置的端口访问即可)
访问后可看到上述页面
接下来访问 127.0.0.1:8080/article/add
接下来访问 127.0.0.1:8080/article/test 查看列表页