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

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 文件夹下面:


      
      
  1. css
  2. font-awesome
  3. images
  4. js
  • 1
  • 2
  • 3
  • 4

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

3,model 存储对象


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


      
      
  1. CREATE TABLE `user_info` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  3. `user_name` varchar(200) DEFAULT NULL,
  4. `password` varchar(200) DEFAULT NULL,
  5. `name` varchar(200) DEFAULT NULL,
  6. `birth_date` varchar(200) DEFAULT NULL,
  7. `gender` int(1) DEFAULT NULL,
  8. `email` varchar(200) DEFAULT NULL,
  9. `phone` varchar(200) DEFAULT NULL,
  10. `status` tinyint(1) NOT NULL ,
  11. `create_time` datetime NOT NULL,
  12. `update_time` datetime NOT NULL,
  13. UNIQUE KEY `user_name` (`key`),
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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


      
      
  1. package models
  2. import (
  3. "github.com/astaxie/beego/orm"
  4. "github.com/astaxie/beego/logs"
  5. "time"
  6. )
  7. type UserInfo struct {
  8. Id int64 `orm:"auto"`
  9. UserName string `orm:"size(255)"` //登录名
  10. Password string `orm:"size(255)"` //密码
  11. Name string `orm:"size(255)"` //用户名
  12. BirthDate string `orm:"size(255)"` //生日
  13. Gender int8 //性别
  14. Email string `orm:"size(255)"` //Email
  15. Phone string `orm:"size(255)"` //电话
  16. Status int8 //状态
  17. CreateTime time.Time //创建时间
  18. UpdateTime time.Time //更新时间
  19. }
  20. func init() {
  21. orm.RegisterModel( new(UserInfo))
  22. }
  23. //创建&更新
  24. func SaveUserInfoById(m *UserInfo) (err error) {
  25. o := orm.NewOrm()
  26. var num int64
  27. if m.Id == 0 {
  28. m.CreateTime = time.Now()
  29. m.UpdateTime = time.Now()
  30. if num, err = o.Insert(m); err == nil {
  31. logs.Info( "Number of records insert in database:", num)
  32. }
  33. } else {
  34. var tmp *UserInfo
  35. tmp, err = GetUserInfoById(m.Id)
  36. if err == nil {
  37. //修改几个参数的名称。
  38. tmp.UserName = m.UserName
  39. tmp.Name = m.Name
  40. tmp.BirthDate = m.BirthDate
  41. tmp.Gender = m.Gender
  42. tmp.Email = m.Email
  43. tmp.Phone = m.Phone
  44. tmp.Status = m.Status
  45. tmp.UpdateTime = time.Now()
  46. if num, err = o.Update(tmp); err == nil {
  47. logs.Info( "Number of records updated in database:", num)
  48. }
  49. }
  50. }
  51. return
  52. }
  53. //删除
  54. func DeleteUserInfo(id int64 ) (err error) {
  55. o := orm.NewOrm()
  56. v := UserInfo{Id: id}
  57. if err = o.Read(&v, "Id"); err == nil {
  58. if num, err := o.Delete(&UserInfo{Id: id}); err == nil {
  59. logs.Info( "Number of records deleted in database:", num)
  60. }
  61. }
  62. return
  63. }
  64. //按id查询
  65. func GetUserInfoById(id int64 ) (v *UserInfo, err error) {
  66. o := orm.NewOrm()
  67. v = &UserInfo{Id: id}
  68. if err = o.Read(v, "Id"); err == nil {
  69. return v, nil
  70. }
  71. return nil, err
  72. }
  73. //查询数据
  74. func QueryAllUserInfo() (dataList [] interface {}, err error) {
  75. var list []UserInfo
  76. o := orm.NewOrm()
  77. qs := o.QueryTable( new(UserInfo))
  78. //查询
  79. //查询数据
  80. if _, err = qs.All(&list); err == nil {
  81. for _, v := range list {
  82. dataList = append(dataList, v)
  83. }
  84. return dataList, nil
  85. }
  86. return nil, err
  87. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

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

4,controller 控制



      
      
  1. package controllers
  2. import (
  3. "github.com/astaxie/beego/logs"
  4. "github.com/astaxie/beego"
  5. "github.com/freewebsys/go-admin/models"
  6. )
  7. type UserInfoController struct {
  8. beego.Controller
  9. }
  10. //修改
  11. func (c *UserInfoController) Edit() {
  12. //获得id
  13. id, _ := c.GetInt64( "Id", 0)
  14. userInfo, err := models.GetUserInfoById(id)
  15. if err == nil {
  16. c.Data[ "UserInfo"] = userInfo
  17. } else {
  18. tmpUserInfo := &models.UserInfo{}
  19. tmpUserInfo.Status = -1
  20. tmpUserInfo.Gender = -1
  21. c.Data[ "UserInfo"] = tmpUserInfo
  22. }
  23. c.TplName = "userInfo/edit.html"
  24. }
  25. //删除
  26. func (c *UserInfoController) Delete() {
  27. //获得id
  28. id, _ := c.GetInt64( "Id", 0)
  29. if err := models.DeleteUserInfo(id); err == nil {
  30. c.Data[ "json"] = "ok"
  31. } else {
  32. c.Data[ "json"] = "error"
  33. }
  34. c.ServeJSON()
  35. }
  36. //保存
  37. func (c *UserInfoController) Save() {
  38. //自动解析绑定到对象中
  39. userInfo := models.UserInfo{}
  40. if err := c.ParseForm(&userInfo); err == nil {
  41. if err := models.SaveUserInfoById(&userInfo); err == nil {
  42. c.Data[ "json"] = ""
  43. } else {
  44. c.Data[ "json"] = "error"
  45. }
  46. } else {
  47. c.Data[ "json"] = "error"
  48. }
  49. c.ServeJSON()
  50. }
  51. //返回全部数据
  52. func (c *UserInfoController) List() {
  53. dataList, err := models.QueryAllUserInfo()
  54. if err == nil {
  55. c.Data[ "List"] = dataList
  56. }
  57. logs.Info( "dataList :", dataList)
  58. c.TplName = "userInfo/list.html"
  59. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

5,view 展示


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


      
      
  1. <table id="simple-table" class="table table-bordered table-hover">
  2. <tr>
  3. <th> Id </th>
  4. <th> 姓名 </th>
  5. <th> 生日 </th>
  6. <th> 性别 </th>
  7. <th> Email </th>
  8. <th> 电话 </th>
  9. <th> 状态 </th>
  10. <th> 创建时间 </th>
  11. <th> 更新时间 </th>
  12. <th> 操作 </th>
  13. </tr>
  14. {{range .List}}
  15. <tr>
  16. <td> {{.Id}} </td>
  17. <td> {{.Name}} </td>
  18. <td> {{.BirthDate}} </td>
  19. <td> {{.Gender}} </td>
  20. <td> {{.Email}} </td>
  21. <td> {{.Phone}} </td>
  22. <td> {{.Status}} </td>
  23. <td> {{date .CreateTime "2006-01-02 15:04:05"}} </td>
  24. <td> {{date .UpdateTime "2006-01-02 15:04:05"}} </td>
  25. <td>
  26. <div class="hidden-sm hidden-xs btn-group">
  27. <button class="btn btn-xs btn-info" onclick="showEditWindow(' {{.Id}} ');">
  28. <i class="ace-icon fa fa-pencil bigger-120"> </i>
  29. </button>
  30. <button class="btn btn-xs btn-danger" onclick="deleteConfirm(' {{.Id}} ');">
  31. <i class="ace-icon fa fa-trash-o bigger-120"> </i>
  32. </button>
  33. </div>
  34. </td>
  35. </tr>
  36. {{end}}
  37. </table>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

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

创建& 编辑:

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


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

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

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


      
      
  1. jQuery( function ($) {
  2. $( '#saveForm').validate({
  3. errorElement: 'div',
  4. errorClass: 'help-block',
  5. focusInvalid: false,
  6. ignore: "",
  7. rules: {
  8. UserName: {
  9. required: true,
  10. }
  11. },
  12. highlight: function (e) {
  13. $(e).closest( '.form-group').removeClass( 'has-info').addClass( 'has-error');
  14. },
  15. success: function (e) {
  16. $(e).closest( '.form-group').removeClass( 'has-error'); //.addClass('has-info');
  17. $(e).remove();
  18. }
  19. });
  20. });
  21. //保存,之前进行校验
  22. function save() {
  23. if ($( '#saveForm').valid()) {
  24. $.post( "/admin/userInfo/save", $( "#saveForm").serialize(),
  25. function (data) {
  26. window.location.reload();
  27. });
  28. }
  29. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

7,拦截器



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

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

8,关闭防火墙


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

这里写图片描述

6,总结


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很全面的Ace Admin1.3官方文档,包含有最全面的组件及例子,适合急需使用该技术开发的人。 响应式Bootstrap网站后台管理系统模板ace admin,非常不错的轻量级易用的admin后台管理系统,基于Bootstrap3,拥有强大的功能组件以及UI组件,基本能满足后台管理系统的需求,而且能根据不同设备适配显示,而且还有四个主题可以切换。 网页图标全采用FontAwesome,除Bootstrap,jQuery UI使用到的第三方插件有: jQuery 2.0.3 jQuery UI 1.10.3 (Custom Build) Twitter Bootstrap 3.0.0 FontAwesome 3.2.1 Google "Open Sans" Font jQuery Flot Charts 0.8.1 jQuery Sparklines 2.1.2 Easy Pie Chart 1.2.5 jQuery Knob 1.2.0 jQuery Validate 1.11.1 FuelUX 2.3.0 (Spinner & Wizard & Treeview) FullCalendar 1.6.4 jQuery ColorBox 1.4.27 jQuery dataTables 1.9.4 jQuery Chosen 1.0 jQuery Masked Input 1.3.1 jQuery Input Limiter 1.3.1 jQuery AutoSize 1.17.7 Bootstrap Colorpicker Bootstrap Datepicker Bootstrap Timepicker v0.2.3 Bootstrap DateRange Picker 1.2 Bootbox.js 4.0.0 jQuery Gritter 1.7.4 jQuery slimScroll 1.1.1 Spin.js 1.3.0 jQuery UI Touch Punch 0.2.2 Google Code Prettify ExplorerCanvas Mindmup Wysiwyg Editor Toopay Markdown Editor 1.1.4 X-editable 1.4.6 Select2 3.4.2 Bootstrap Tags 2.2.5 jQuery Mobile 1.3.2 (Custom Build) jqGrid 4.5.2 Dropzone.js 3.0 Nestable lists plugin 浏览器兼容: Firefox 5+ Google Chrome 14+ Internet Explorer 8 Internet Explorer 9 Opera 11 Safari 5 Bootstrap兼容: Bootstrap 2.2.x Bootstrap 2.3.x Bootstrap 3.0.x ace admin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值