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 文件夾下面:
cssfont-awesomeimagesjs 項目幾算導入了。其他兩個文件夾不加也罷。
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)"` 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 *UserInfotmp, err = GetUserInfoById(m.Id) if err == nil { tmp.UserName = m.UserNametmp.Name = m.Nametmp.BirthDate = m.BirthDatetmp.Gender = m.Gendertmp.Email = m.Emailtmp.Phone = m.Phonetmp.Status = m.Statustmp.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} 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 []UserInfoo := 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}- 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 控制
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, _ := c.GetInt64("Id", 0)userInfo, err := models.GetUserInfoById(id) if err == nil {c.Data["UserInfo"] = userInfo} else {tmpUserInfo := &models.UserInfo{}tmpUserInfo.Status = -1tmpUserInfo.Gender = -1c.Data["UserInfo"] = tmpUserInfo}c.TplName = "userInfo/edit.html"} func (c *UserInfoController) Delete() { 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" }- 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
<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>- 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里面,然后做展示編輯。
<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');$(e).remove();}});}); function save() { if ($('#saveForm').valid()) {$.post("/admin/userInfo/save", $("#saveForm").serialize(), function (data) { window.location.reload();});}}- 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,攔截器
var filterAdmin = func(ctx *context.Context) {url := ctx.Input.URL()logs.Info("##### filter url : %s", url) }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
相關資源:Go-go-admin:基于golang快速搭建后臺管理中心
總結
以上是生活随笔為你收集整理的golang(4)使用beego + ace admin 开发后台系统 CRUD的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。