1. 程式人生 > 其它 >golang(4)使用beego + ace admin 開發後臺系統 CRUD

golang(4)使用beego + ace admin 開發後臺系統 CRUD

https://blog.csdn.net/weixin_33881753/article/details/90492770

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. CREATETABLE`user_info` (
  2. `id`bigint(20)NOTNULL AUTO_INCREMENT,
  3. `user_name`varchar(200)DEFAULTNULL,
  4. `password`varchar(200)DEFAULTNULL,
  5. `name`varchar(200)DEFAULTNULL,
  6. `birth_date`varchar(200)DEFAULTNULL,
  7. `gender`int(1)DEFAULTNULL,
  8. `email`varchar(200)DEFAULTNULL,
  9. `phone`varchar(200)DEFAULTNULL,
  10. `status`tinyint(1)NOTNULL ,
  11. `create_time` datetimeNOTNULL,
  12. `update_time` datetimeNOTNULL,
  13. UNIQUEKEY`user_name` (`key`),
  14. PRIMARYKEY (`id`)
  15. )ENGINE=InnoDBDEFAULTCHARSET=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 UserInfostruct {
  8. Idint64`orm:"auto"`
  9. UserNamestring`orm:"size(255)"`//登入名
  10. Passwordstring`orm:"size(255)"`//密碼
  11. Namestring`orm:"size(255)"`//使用者名稱
  12. BirthDatestring`orm:"size(255)"`//生日
  13. Genderint8//性別
  14. Emailstring`orm:"size(255)"`//Email
  15. Phonestring`orm:"size(255)"`//電話
  16. Statusint8//狀態
  17. CreateTime time.Time//建立時間
  18. UpdateTime time.Time//更新時間
  19. }
  20. funcinit() {
  21. orm.RegisterModel(new(UserInfo))
  22. }
  23. //建立&更新
  24. funcSaveUserInfoById(m *UserInfo)(err error) {
  25. o := orm.NewOrm()
  26. var numint64
  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. funcDeleteUserInfo(idint64)(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. funcGetUserInfoById(idint64)(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. returnnil, err
  72. }
  73. //查詢資料
  74. funcQueryAllUserInfo()(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. returnnil, 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 UserInfoControllerstruct {
  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. <tableid="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. <divclass="hidden-sm hidden-xs btn-group">
  27. <buttonclass="btn btn-xs btn-info"onclick="showEditWindow('{{.Id}}');">
  28. <iclass="ace-icon fa fa-pencil bigger-120"></i>
  29. </button>
  30. <buttonclass="btn btn-xs btn-danger"onclick="deleteConfirm('{{.Id}}');">
  31. <iclass="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. <divclass="col-sm-9">
  2. <inputtype="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. functionsave(){
  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

相關資源:Go-go-admin:基於golang快速搭建後臺管理中心