热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1,关于aceadminaceadmin是一个非常好的后台系统ui。集成了很多的好东西。非常的方便开发后天系统,而且能很漂亮。上面有一堆的例子。非常的漂亮。http:ac

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>Idth>

<th>姓名th>
<th>生日th>
<th>性别th>
<th>Emailth>
<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">
"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


推荐阅读
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • 本文讨论了如何在不使用SearchBar display controller的情况下,单独使用SearchBar并捕获其textChange事件。作者介绍了实际状况,即左侧SliderMenu中的SearchBar需要在主页TableView中显示搜索结果。然后,作者提供了解决方案和步骤,帮助读者实现这一功能。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
author-avatar
蔡伟钊cc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有