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

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

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

时间: 2024-08-01 21:36:40

golang(4)使用beego + ace admin 开发后台系统 CRUD的相关文章

数据库-二次开发后台系统问题。

问题描述 二次开发后台系统问题. 代码是刚刚从外包拿过来的,一个客户端的接口,本地的代码连接外网的数据库能跑通,本地的代码连接本地的数据库不能跑通,少了一个字段的参数,本地的数据库和外网的数据库表结构和数据一致.求大神解释是什么问题.

java开发 后台报org.springframework.web.servlet.DispatcherServlet

问题描述 java开发 后台报org.springframework.web.servlet.DispatcherServlet 2014-6-4 17:22:07 org.apache.catalina.core.AprLifecycleListener init 信息: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.4.8. 2014-6-4 17:22:07 org.apache.catal

微信公众平台-微信服务号开发后台页面技术选型问题?

问题描述 微信服务号开发后台页面技术选型问题? 柳老师您好: 最近看了您的微信公众平台开发受益匪浅,但是遇到一些问题,例如你做的小q机器人,里面有一个关于作者的菜单,点击[阅读全文]后会跳入一个页面,我想问的就是这个页面一般是用什么技术开发的,有没有一些相关的要求. 解决方案 html5 jqueryMobile 就这些吧

新开发的系统后台是Websphere portal server V6,运行一段时间后wps后台报内存溢出。请各位高手分析一下原因,帮忙解决一下。谢了!!!

问题描述 新开发的系统后台是WebsphereportalserverV6,运行一段时间后wps后台报内存溢出.请各位高手分析一下原因,帮忙解决一下.谢了!!! 解决方案 解决方案二:内存启动时开多大的?应用程序也存在引起OOM的问题,一步步分析定位来解决吧后台的log发出来解决方案三:先用内存分析工具确定是不是自己的应用有问题,排除了这个问题,再从portal入手找问题,看是不是portal自带数据库的问题......解决方案四:从网上找一个内存分析工具看一下那个对象出现了泄漏,这个不通过工具

二维码 安卓开发 签到系统

问题描述 二维码 安卓开发 签到系统 基于二维码的签到系统是从前台入手还是从后台入手?先设计数据库还是先手机界面设计,是开发新手,望大神指点 解决方案 公司最近在搞go语言学习小组......答案就在这里:基于go的二维码签到系统 解决方案二: 当然是先把后台数据库设计好,把服务器什么的搭好,在考虑前台啊

高手就帮忙,JAVA开发WEB系统,怎样能做到最安全

问题描述 高手就帮忙,JAVA开发WEB系统,怎样能做到最安全??不被攻击,做方案,应急,多谢大家! 解决方案 解决方案二:最安全.https全用私钥,几天换一次密码解决方案三:如果对权限控制感兴趣,推荐看一下springsecurity教程:解决方案四:除了ssl还有其它的吗?比如怎么样写代码会有漏洞?比如跨站点脚本编制跨站点请求伪造SSL请求中的查询参数发现可高速缓存的SSL页面这些是什么原因导致,有什么好的解决方案?解决方案五:通过框架钓鱼解决方案六:页面安全控制,加安全控件,控制恶意sq

传统企业进军电商是否该自己开发B2C系统

阿里巴巴的事件引发业内各界人士的疯狂讨论,有揭密的,有为马云的价值观痛下杀手喝彩的,也有为卫哲的勇于承担责任鼓掌的.实际上这个事件最终揭示的是B2B这种商业模式硬伤的一方面,毕竟在电子商务各类模式中,B2B模式在技术含量上确实不高,关于这个我在阿里巴巴收购万网时曾经撰文<万网是阿里巴巴的第几根救命稻草?>详细阐述过.当然这和阿里巴巴这一家公司不具有唯一性,最主要的还是B2B盈利模式的问题,这个问题马云本来是寄希望由卫哲来进行调整和创新的,四年来不仅未有很好的交待,还闹出欺诈客户的事件,于是乎为

J2EE基础 用Struts框架开发MVC系统步骤

j2ee 由于Struts已经为我们提供了一个非常好的MVC框架,我们利用Struts开发MVC系统时可以大大加快开发的速度.在开发时可以采用的一个开发流程如下: 1. 收集和定义应用需求. 2. 基于数据采集和显示的原则定义和开发"屏幕显示"需求 . 3. 为每一个"屏幕显示"定义访问路径. 4. 定义ActionMappings建立到应用业务逻辑之间的联系. 5. 开发满足"屏幕显示"需求的所有支持对象. 6. 基于每一个"屏幕显示

使用ExtJs开发MIS系统

使用ExtJs开发MIS系统(7):ExtJs性能浅析 使用ExtJs开发MIS系统(6):客户端MVC 使用ExtJs开发MIS系统(5):使用Action抽象客户端操作 使用ExtJs开发MIS系统(4):轮询 使用ExtJs开发MIS系统(3):使用数据库保存客户端状态 使用ExtJs开发MIS系统(2):Js的动态加载 使用ExtJs开发MIS系统(1):基于ExtJs的MIS构架设计