日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2023/12/20 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 文件夾下面:

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

    項目幾算導入了。其他兩個文件夾不加也罷。

    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;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    一個簡單的用戶表
    對應的數據操作:

  • 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
  • }
    • 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
  • 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"
  • }
    • 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>
    • 1
    • 2
    • 3
    • 4

    其中編輯使用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();
  • });
  • }
  • }
    • 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)
  • //TODO 如果判斷用戶未登錄。
  • }
  • 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快速搭建后臺管理中心

    總結

    以上是生活随笔為你收集整理的golang(4)使用beego + ace admin 开发后台系统 CRUD的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。