• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

beergo 基于beego整理的快速开发工具: 基于beego,进行了简单的封装,做了代码生成器 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

beergo 一套基于beego的菜鸟级快速开发框架工具集

介绍

beergo是将beego改成了自己使用的快速开发框架工具。实现了:数据库设计在代码中完成和维护;api自动生成;数据读取通过配置文件方式以保证上线后维护的简便性;以事件为驱动的权限阻断系统、数据预处理后处理,最大程度上保证代码生成器生成的文件与个人订制逻辑的解耦合;适合小型项目的快速开发。后期还优化了orm在进行读取操作时的字段限定,尽可能减少冗余的数据库操作,提高读取性能。

软件架构

基于beego进行的定制化整理。

安装教程

clone到本地,查看demo,编写自己的逻辑

简短的使用说明

1.在app目录创建模块/项目目录 /app/v2/demo。

2.创建一个generator目录并在其内创建一个跟数据库表同名的User.go文件。

3.在User.go文件内创建一个跟数据库表同名的方法,并加入

func init() {	User()}func User() {	c := entity.NewTable("User", "用户", "demo")	c.AddText("name", "姓名").SetLength(10).SetNullable(false)	...//你的自定义字段设置	v2.Init(c)}

4.建立一个importer.go文件,暂时先引入刚刚创建的generator包,在引入的时候go会运行init内的方法以实现自动创建其他文件。

5.在./loader目录下再创建一个以模块名命名的demo.go,并引入importer.go所在的包。

6.bee run一下,你就会发现自动创建了一堆的文件,那就说明OK了,一套demo模块下User表的增删改查完成了。

7.扫尾工作:

  • a.取消importer.go文件中对generator的引用,

  • b.把几个包加入importer.go

    • /app/v2/demo/conf/auth
    • /app/v2/demo/controller/admin
  • 记得跑一下./update.bat 创建/更新 数据表

Done,现在就可以跑增删改查了

从demo看全部功能

数据库实体生成

在app目录下建立自己的版本v2,然后创建demo目录,一个新项目/模块的开始需要两个文件:

模块包加载文件 importer.go:

你可以换成其他你喜欢的名字,但是他的作用就是把当前项目初始化运行所需要的包进行一个统一的汇总,确保只需要在loader目录引入这一个包文件就能全部加载当前项目。

模块实体数据字段配置文件 /generator/*.go:

在这些文件中创建数据表同名方法

func Demo() {}

在Demo()中使用maker.CreateTable("表名","中文名","所属项目英文名")创建数据表/实体;

func Demo() {	c := entity.NewTable("Demo", "案例", "demo")}

在Demo()中,为刚刚创建的实体添加字段,需要注意的一点是,字段名首字母小写,小驼峰

c.AddText("text", "TEXT类型").SetLength(10).SetNullable(false)c.AddArt("art", "长文本类型").SetNullable(true)c.AddInt("int", "整数类型")...//一对一关系中DemoOtherInfo是对Demo的补充c.AddOneToOne("oneToOne", "一对一关系", "DemoOtherInfo").SetIsControl(false)//一对多关系中DemoSons是对Demo的子分类,fk在DemoSons中c.AddOneToMany("oneToMany", "一对多关系", "DemoSons")//多对多关系中DemoTags和Demo独立存在,相互关联c.AddManyToMany("manyToMany", "多对多关系", "DemoTags").SetIsControl(true)//多对一关系中Demo存在到DemoCategory的主键c.AddManyToOne("manyToOne", "多对一关系", "DemoCategory")

使用init()确保在第一次运行的时候引入这些文件就能,根据你的配置,创建相应的文件。

  func init() {       Demo()  }

因为go包的特性,文件名的命名规则根据个人喜好自行编写。

至此我们完成了新建数据表,添加字段的操作,在启动项目的时候init()内的Demo方法 执行Init命令就完成了相关文件的自动创建

//执行数据处理,并自动创建相关文件 v2.Init(c)
完整Demo字段设置

下面就是涵盖了所有基本数据类型和关系型的案例的代码

  • Demo作为数据主体
  • DemoCategory 模拟多对一的关系,常用场景是文章与文章分类
  • DemoOtherInfo 模拟一对一的关系,常用场景是基本信息和补充信息关系
  • DemoSons 模拟一对多的关系,常用场景是用户和订单
  • DemoTags 模拟的是多对多的关系,常用场景如角色和权限

数据主体及字段设计如下

func Demo() {    //Demo实体的构建,涵盖了所有的数据类型        //输入表信息,参数3为模块/项目路径,此处的demo对应"/app/v2/demo"中的demo	c := entity.NewTable("Demo", "案例", "demo")		//创建一个文本类型长度为10的字段,不允许为空	c.AddText("text", "TEXT类型").SetLength(10).SetNullable(false)		//创建一个长本类型的字段	c.AddArt("art", "长文本类型").SetNullable(true)		//创建一个整数类型的字段	c.AddInt("int", "整数类型")		//创建一个浮点类型字段,设置数字为长度为10,小数位长度为2,默认值1.0	c.AddFloat("float", "浮动类型").SetDigits(10).SetDecimals(2).SetDefaultValue("1.0")		//创建一个时间类型,设置自动更新,和创建时间自动填充	c.AddDateTime("datetime", "时间类型").SetIsAutoNow(true).SetIsAutoNowAdd(true)		//一对一关系中DemoOtherInfo是对Demo的补充	c.AddOneToOne("oneToOne", "一对一关系", "DemoOtherInfo").SetIsControl(false)		//一对多关系中DemoSons是对Demo的子分类,fk在DemoSons中	c.AddOneToMany("oneToMany", "一对多关系", "DemoSons")		//多对多关系中DemoTags和Demo独立存在,相互关联	c.AddManyToMany("manyToMany", "多对多关系", "DemoTags").SetIsControl(true)		//多对一关系中Demo存在到DemoCategory的主键	c.AddManyToOne("manyToOne", "多对一关系", "DemoCategory")        //todo 其他字段类型可以根据现有的格式自由定义           //执行数据处理,并自动创建相关文件 	v2.Init(c)	}func DemoCategory() {	c := entity.NewTable("DemoCategory", "分类", "demo")	c.AddText("name", "分类名称").SetLength(10)	c.AddOneToMany("demos", "类目下Demo", "Demo")	v2.Init(c)}func DemoOtherInfo() {	c := entity.NewTable("DemoOtherInfo", "案例补充信息", "demo")	//设置关系方为Demo,并且设置主控方为自己,维护主键	c.AddOneToOne("demo", "关联表", "Demo").SetIsControl(true)	c.AddArt("info", "档案信息").SetNullable(true)	v2.Init(c)}func DemoSons() {	c := entity.NewTable("DemoSons", "案例子项", "demo")	//多对一关系绑定,自动设置主键在自己	c.AddManyToOne("parent", "父级", "Demo")	c.AddText("name", "子代名称").SetLength(20).SetNullable(true)	v2.Init(c)}func DemoTags() {	c := entity.NewTable("DemoTags", "案例标签", "demo")	c.AddText("name", "标签名称").SetLength(10).SetNullable(false)	c.AddManyToMany("demos", "多对多关系", "Demo").SetIsControl(false)	v2.Init(c)}
自动生成的接口
    //获取数据以用来编辑,关系型数据在返回结果中以ID 或者[]ID的形式存在	web.Router("/v2/Demo/:id", 		&DemoAdminController{}, "*:GetAction")		//或者详情使用,关系型数据在返回中以对象形式存在,只能获取第一层对象	web.Router("/v2/Demo/info", 	&DemoAdminController{}, "*:InfoAction")		//深度扫描获取,类似上面的接口,但是可以获取指定层深的关系数据对象	web.Router("/v2/Demo/scan", 	&DemoAdminController{}, "*:ScanAction")		//列表查询功能	web.Router("/v2/Demo/list", 	&DemoAdminController{}, "*:ListAction")		//数据更新	web.Router("/v2/Demo/update", 	&DemoAdminController{}, "*:UpdateAction")		//数据创建	web.Router("/v2/Demo/create", 	&DemoAdminController{}, "*:CreateAction")		//实体复制,可以复制多个,参数为ids,[ID1,ID2]以数组形式传递	web.Router("/v2/Demo/copy", 	&DemoAdminController{}, "*:CopyAction")		//批量编辑接口,ids传值跟上面的接口一样,编辑字段和内容放到_action字段内	web.Router("/v2/Demo/edit", 	&DemoAdminController{}, "*:EditAction")		//批量删除,传值方式同批量复制	web.Router("/v2/Demo/delete", 	&DemoAdminController{}, "*:DeleteAction")		//子集查询,比如demo中又一个字段为sons,这里就可以通过/v2/Demo/20/Sons来查询ID=20的实体下Sons列表	web.Router("/v2/Demo/:id/:field", &DemoAdminController{}, "*:SonsAction")
接口查询参数约定
	EntityName string                 `json:"_en"`      //数据库实体名称		Conditions map[string]interface{} `json:"_where"`   //查询条件		Excludes   map[string]interface{} `json:"_nowhere"` //排除条件		Order      []string               `json:"_order"`   //排序		Limit      int                    `json:"limit"`    //每页数量		Page       int                    `json:"page"`     //页码从1开始		Total      int64                  `json:"total"`    //总数		Depth      int                    `json:"_d"`       //层深		Group      []string               `json:"_g"`       //分组		Fields     []string               `json:"_f"`       //所需字段		NoFields   []string               `json:"_nf"`      //排除字段,减少数据库压力		IsTree     bool                   `json:"_tree"`    //是否要求树形结构		Relation []string        `json:"_rel"` //关联数据的获取		Config   config.Configer //通过配置文件获取的数据
_where,_nowhere

查询条件遵循beego orm 高级查询,请自行温习beego文档

_nowhere 执行not查询

{    "_where":{            "id__gt":1,//查询id大于1的数据                "title__like":"abc",查询title包含abc的数据,sql中使用like                "age__in":[10,30]    }}
_order
  {      "_order":["-id","age"],//逆序在前面加上减号-  }  
_g

设置字段控制的分组,对于info和list 在dict中选取同名fields和relations下对应配置,支持多个合并,如果没有设置则默认取default配置项,设置了不存在,则相应内容返回 ""

  {      "_g":["app","other"],  }  

其他字段没有什么特别需要说明的

配置文件的书名

auth目录
权限控制的方法如下func DemoAuth() {	event.ListenJoin("DemoAuth", func(v interface{},ctx *context.Context) {		//access ,_ := v.(*event.AuthEvent)		//access.Access = true		//access.Message = "access granted!"	})}controller文件相应代码如下,位置在每个controller的Prepare方法内,ae := &event.AuthEvent{    Name:    "DemoAuth",    Access:  true,    Message: "",}event.DispatchToManySync("DemoAuth", ae,this.Ctx)if ae.Access == false {    this.StopError(code.ErrorAccess, ae.Message, "")}event.DispatchToManySync 方法在控制器进入实际Action之前执行,派发事件,并携带event.AuthEvent和context每个监听同名事件的注册需要对该事件进行处理,*******************************************如果auth验证通过,不执行任何修改,否则回导致验证逻辑错误。因为多个注册的事件是顺序执行,如果做了true赋值有可能会覆盖前面的false赋值。*******************************************如果auth验证失败则修改AuthEvent.Access 为falseAuthEvent.Access默认为true
dict目录
{  "entity": {    "name": "Demo"  },  "fields": {    "default": "id text art int float datetime",    "app": "id text art"  },  "relations": {    "default": "oneToOne oneToMany manyToMany manyToOne",    "app": "manyToMany oneToMany"  },  "scan": {    "default": "id text art oneToOne oneToMany manyToMany manyToOne",    "app": "id text oneToOne oneToOne.name manyToMany.id manyToMany.name"  }}entity 为预留字段fields 和 relations 通时使用,在info和list接口中生效,- fields控制普通字段的筛选,以达到减少数据库冗余获取的目的,orm的冗余获取问题比较严重- relations 可以按配置需要加载其关系数据scan 仅在scan接口内生效,可以控制接口返回的数据,但是并不能起到减少orm冗余获取的目的//todo这个问题可能在后续版本中寻找更优解决方案- scan 内的配置允许设置二层以及二层以上的获取- - 案例中获取oneToOne字段时 需要配置 oneToOne- - 案例中获取oneToOne字段内的 id 和 info 时 需要配置 oneToOne oneToOne.id oneToOne.info- - 案例中获取manyToMany字段时 需要配置 manyToMany- - 案例中获取manyToMany字段内的 id 和 info 时 需要配置 oneToOne oneToOne.id oneToOne.info- 即如果要获取对象内的字段,首先要包含对象字段本身,然后再设置对象内字段,缺一不可
目录说明
/app    项目逻辑主目录,存放项目模块    /v2 版本管理            /demo 实际模块(项目)业务逻辑所在的目录                    /auto 代码生成的通用逻辑                            /controller 通用增删改查                            /conf 配置目录                            /auth 权限配置,*.go文件,引入该包后生效                                /dict 数据读取、列表获取字段配置,*.json文件,修改后需要重启                                /orm 预留//todo                                /preload 配置数据的预加载,在init方法加载配置文件,并保存到变量                            /controller 模块控制器所在目录                            /admin 默认生成管理控制器,内容引用了auto/controller下同名控制器,支持重写                                /xxx 自己定义的逻辑                        /init 代码生成器配置主目录,上线的版本不应该包含这些文件                        importer.go 本模块的对外引入            /config beego默认congfig位置/console 规划为Terminal命令行入口,暂时只有数据库orm的命令/const 规划为通用常量的配置目录    /code 返回码            response.go 规划了http返回常用的状态码        /loader 模块(项目)的包加载,理论上每个模块应该有且只有一个入口文件在此引入/maker 代码生成器核心文件夹,想要加私有逻辑和订制就在这里改    /template 生成相应文件时用到的模板文件,这里虽然用了tpl,但是并没有使用模板引擎,当做text使用就好        /v2 代码生成器的主要方法和逻辑,应为经过一次大改,现在是v2,后面如果继续大改可能是v3,对应app目录下的v2                /entity 数据库字段设计生成的主要逻辑,新增字段类型就来这里找                        Creater.go 生成器的核心逻辑,汇总了各种类型进来以创建AddXXXX方法,方便操作                        Field.go 数据类型定义的位置,可以自定义,可以修改成自己需要的类型,深度订制                        Table.go 只保存了表的基础struct信息,后期相关的扩展和方法可以加入进来                auth.go 生成权限验证文件的方法                com.go 字段配置完成后加工生成文件的总的方法入口和汇总                config.go 各种配置文件生成的方法                controller.go 控制器生成的方法,这里只定义了后台管理admin的方法,也可以定义web app等                model.go 实体struct,增删改查,基本方法和相关文件的创建        creater.go 仅仅是把entity中最常用NewTable拿出来了,并重新定义为新名称CreateTable/models 所有数据库实体struct文件,curd操作,repository文件都存放在这里!因为go包禁止循环引用,没有办法放入对应app中相应模块下。        /v2 对应代码生成器版本/os 操作系统级别的业务逻辑        /service 包含将程序打包后注册为服务,以服务的形式运行的相关逻辑/routers beego默认的路由设置位置,加入了跨域设置的地方//todo跨域设置应该改为配置文件的形式/task 使用beego计划任务模块设置的任务/test 测试目录/tests 测试目录/util 个人常用工具的集合        /event 事件注册分发逻辑,谨慎修改        /mysql 数据库初始化,配置,查询构建器的逻辑,谨慎修改/views beego默认模板目录

参与贡献

  1. 暂时不支持贡献,不过欢迎提出宝贵意见

声明

非科班出身,非大佬,非精通玩家整理的自用工具,欢迎提出宝贵意见,但是不喜勿喷,实在看不下去了,就把眼珠子扣了吧!

项目命名原则1.碰瓷,2.碰瓷,3.说明我是有啤酒肚的男人


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap