分享
  1. 首页
  2. 文章

golang(4)使用beego + ace admin 开发后台系统 CRUD

freewebsys · · 2243 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1,关于ace admin


ace admin 是一个非常好的后台系统ui。
集成了很多的好东西。非常的方便开发后天系统,而且能很漂亮。
上面有一堆的例子。非常的漂亮。
http://ace.jeka.by/

之前还是收费的。后来在github 上面放了一个项目。
但是没有源码。是压缩之后的代码。而且,付费地址也不再了。
是一个过期了的模板 3 年前的了。
github 地址:
https://github.com/bopoda/ace
项目已经没有人维护了。也没有源码了,原来的购买地址都没有了。做公司的后天系统没啥问题了。
比起其他的也没感觉上不潮但比起原生的 bootstrap 要好看点。
已经不错了,还要啥自行车呢。
我写了一个 go-admin 的demo :
项目地址:
https://github.com/freewebsys/go-admin
代码都上传上去了。

2,做一个 golang的后台管理足够了


项目使用beego 进行开发,使用beego开发还是非常的快速的。
将项目 ace 代码 assets 下面的 4个 文件夹拷贝到 beego 项目的 static 文件夹下面:

css
font-awesome
images
js

项目几算导入了。其他两个文件夹不加也罢。

3,model 存储对象


存储对象一个用户表的设计:

CREATE TABLE `user_info` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `user_name` varchar(200) DEFAULT NULL,
 `password` varchar(200) DEFAULT NULL,
 `name` varchar(200) DEFAULT NULL,
 `birth_date` varchar(200) DEFAULT NULL,
 `gender` int(1) DEFAULT NULL,
 `email` varchar(200) DEFAULT NULL,
 `phone` varchar(200) DEFAULT NULL,
 `status` tinyint(1) NOT NULL ,
 `create_time` datetime NOT NULL,
 `update_time` datetime NOT NULL,
 UNIQUE KEY `user_name` (`key`),
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

一个简单的用户表
对应的数据操作:

package models
import (
 "github.com/astaxie/beego/orm"
 "github.com/astaxie/beego/logs"
 "time"
)
type UserInfo struct {
 Id int64 `orm:"auto"`
 UserName string `orm:"size(255)"` //登录名
 Password string `orm:"size(255)"` //密码
 Name string `orm:"size(255)"` //用户名
 BirthDate string `orm:"size(255)"` //生日
 Gender int8 //性别
 Email string `orm:"size(255)"` //Email
 Phone string `orm:"size(255)"` //电话
 Status int8 //状态
 CreateTime time.Time //创建时间
 UpdateTime time.Time //更新时间
}
func init() {
 orm.RegisterModel(new(UserInfo))
}
//创建&更新
func SaveUserInfoById(m *UserInfo) (err error) {
 o := orm.NewOrm()
 var num int64
 if m.Id == 0 {
 m.CreateTime = time.Now()
 m.UpdateTime = time.Now()
 if num, err = o.Insert(m); err == nil {
 logs.Info("Number of records insert in database:", num)
 }
 } else {
 var tmp *UserInfo
 tmp, err = GetUserInfoById(m.Id)
 if err == nil {
 //修改几个参数的名称。
 tmp.UserName = m.UserName
 tmp.Name = m.Name
 tmp.BirthDate = m.BirthDate
 tmp.Gender = m.Gender
 tmp.Email = m.Email
 tmp.Phone = m.Phone
 tmp.Status = m.Status
 tmp.UpdateTime = time.Now()
 if num, err = o.Update(tmp); err == nil {
 logs.Info("Number of records updated in database:", num)
 }
 }
 }
 return
}
//删除
func DeleteUserInfo(id int64) (err error) {
 o := orm.NewOrm()
 v := UserInfo{Id: id}
 if err = o.Read(&v, "Id"); err == nil {
 if num, err := o.Delete(&UserInfo{Id: id}); err == nil {
 logs.Info("Number of records deleted in database:", num)
 }
 }
 return
}
//按id查询
func GetUserInfoById(id int64) (v *UserInfo, err error) {
 o := orm.NewOrm()
 v = &UserInfo{Id: id}
 if err = o.Read(v, "Id"); err == nil {
 return v, nil
 }
 return nil, err
}
//查询数据
func QueryAllUserInfo() (dataList []interface{}, err error) {
 var list []UserInfo
 o := orm.NewOrm()
 qs := o.QueryTable(new(UserInfo))
 //查询
 //查询数据
 if _, err = qs.All(&list); err == nil {
 for _, v := range list {
 dataList = append(dataList, v)
 }
 return dataList, nil
 }
 return nil, err
}

参考了bee go 自动生成的代码。但是发现beego 升级了之后模板变了。
其中特别要主要 := 的坑,如果稍不留神就会替换掉对象在一个作用域下,而且不会报错呢。

4,controller 控制


package controllers
import (
 "github.com/astaxie/beego/logs"
 "github.com/astaxie/beego"
 "github.com/freewebsys/go-admin/models"
)
type UserInfoController struct {
 beego.Controller
}
//修改
func (c *UserInfoController) Edit() {
 //获得id
 id, _ := c.GetInt64("Id", 0)
 userInfo, err := models.GetUserInfoById(id)
 if err == nil {
 c.Data["UserInfo"] = userInfo
 } else {
 tmpUserInfo := &models.UserInfo{}
 tmpUserInfo.Status = -1
 tmpUserInfo.Gender = -1
 c.Data["UserInfo"] = tmpUserInfo
 }
 c.TplName = "userInfo/edit.html"
}
//删除
func (c *UserInfoController) Delete() {
 //获得id
 id, _ := c.GetInt64("Id", 0)
 if err := models.DeleteUserInfo(id); err == nil {
 c.Data["json"] = "ok"
 } else {
 c.Data["json"] = "error"
 }
 c.ServeJSON()
}
//保存
func (c *UserInfoController) Save() {
 //自动解析绑定到对象中
 userInfo := models.UserInfo{}
 if err := c.ParseForm(&userInfo); err == nil {
 if err := models.SaveUserInfoById(&userInfo); err == nil {
 c.Data["json"] = ""
 } else {
 c.Data["json"] = "error"
 }
 } else {
 c.Data["json"] = "error"
 }
 c.ServeJSON()
}
//返回全部数据
func (c *UserInfoController) List() {
 dataList, err := models.QueryAllUserInfo()
 if err == nil {
 c.Data["List"] = dataList
 }
 logs.Info("dataList :", dataList)
 c.TplName = "userInfo/list.html"
}

5,view 展示


展示列表:
参考:http://ace.jeka.by/tables.html

<table id="simple-table" class="table table-bordered table-hover">
 <tr>
 <th>Id</th>
 <th>姓名</th>
 <th>生日</th>
 <th>性别</th>
 <th>Email</th>
 <th>电话</th>
 <th>状态</th>
 <th>创建时间</th>
 <th>更新时间</th>
 <th>操作</th>
 </tr>
 {{range .List}}
 <tr>
 <td>{{.Id}}</td>
 <td>{{.Name}}</td>
 <td>{{.BirthDate}}</td>
 <td>{{.Gender}}</td>
 <td>{{.Email}}</td>
 <td>{{.Phone}}</td>
 <td>{{.Status}}</td>
 <td>{{date .CreateTime "2006年01月02日 15:04:05"}}</td>
 <td>{{date .UpdateTime "2006年01月02日 15:04:05"}}</td>
 <td>
 <div class="hidden-sm hidden-xs btn-group">
 <button class="btn btn-xs btn-info" onclick="showEditWindow('{{.Id}}');">
 <i class="ace-icon fa fa-pencil bigger-120"></i>
 </button>
 <button class="btn btn-xs btn-danger" onclick="deleteConfirm('{{.Id}}');">
 <i class="ace-icon fa fa-trash-o bigger-120"></i>
 </button>
 </div>
 </td>
 </tr>
 {{end}}
 </table>

特别注意对时间字段的格式化:{{date .UpdateTime "2006年01月02日 15:04:05"}} 不是java习惯的 yyyy-MM-dd
感觉上一点也不好记。是按照老外的习惯记住的 1 2 3 4 5 6 的规则命名的。

创建& 编辑:

将对象放到 data里面,然后做展示编辑。

<div class="col-sm-9">
 <input type="text" id="UserName" name="UserName" placeholder="登录名" class="col-xs-10 col-sm-5"
 value="{{.UserInfo.UserName}}"/>
 </div>

其中编辑使用div 窗口弹出参考:
http://ace.jeka.by/form-elements.html
http://ace.jeka.by/content-slider.html
并且页面进行校验:

使用的教研框架:http://jqueryvalidation.org/

jQuery(function ($) {
 $('#saveForm').validate({
 errorElement: 'div',
 errorClass: 'help-block',
 focusInvalid: false,
 ignore: "",
 rules: {
 UserName: {
 required: true,
 }
 },
 highlight: function (e) {
 $(e).closest('.form-group').removeClass('has-info').addClass('has-error');
 },
 success: function (e) {
 $(e).closest('.form-group').removeClass('has-error');//.addClass('has-info');
 $(e).remove();
 }
 });
 });
 //保存,之前进行校验
 function save() {
 if ($('#saveForm').valid()) {
 $.post("/admin/userInfo/save", $("#saveForm").serialize(),
 function (data) {
 window.location.reload();
 });
 }
 }

7,拦截器


//增加拦截器。
 var filterAdmin = func(ctx *context.Context) {
 url := ctx.Input.URL()
 logs.Info("##### filter url : %s", url)
 //TODO 如果判断用户未登录。
 }
 beego.InsertFilter("/admin/*", beego.BeforeExec, filterAdmin)

可以针对 /admin/* 进行拦截

8,关闭防火墙


在 mac 上面发现总是要允许端口,开发比较讨厌,请关闭防火墙:

这里写图片描述

6,总结


beego 开发一个admin系统还是挺快的。
因为beego 可以自动检查代码改的,自动重启,开发速度还是很快的。
并且因为beego的编译启动还是非常的快速的。
所以开发速度还是挺快的。golang的代码还需要适应下。上手还是挺快的。1,2个星期就能开发一个小系统。
做个用户权限,登录啥的都非常方便。

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/68955060 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:freewebsys

查看原文:golang(4)使用beego + ace admin 开发后台系统 CRUD

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2243 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏