这两天在网上研究了很多开源的自动cms生成工具,这里对这两天的收获做一下总结。本质上,自己做一个简单的也不费事儿,但是闭门造车容易,拥抱世界却很难。所以先看看有什么巨人的肩膀可以用是好的。
在低代码和零代码领域的应用,一般有四种类型:
这两天调研的功能主要属于第三种类型。下面我就每一种都简单介绍一下
1.go-admin,4.4k☆
下载并运行: https://github.com/GoAdminGroup/go-admin
也有一个demo: https://github.com/GoAdminGroup/example.git
打开体验地址: http://localhost:9033/admin
文档地址: http://doc.go-admin.cn/zh/
评价
可以说,这个项目做得挺认真的,特别是当我们发现这是一个中山大学的大三学生的项目时,感觉更为不容易。为小兄弟点赞。
2.goweb,385☆
地址: https://github.com/iissy/goweb
如果遇到端口冲突,无法启动,则把
iris.Addr(":80"),
改为:
iris.Addr(":8083"),
打开体验地址: http://127.0.0.1:8083/
评价
3.qor,4.6k★
地址: https://github.com/qor/qor-example
文档地址; https://getqor.com/cn
https://doc.getqor.com/
这个项目看起来比较专业,但是无法运行起来。
报错信息:
Failed to find configuration config/smtp.yml, using example file config/smtp.example.ymlWARNING: AssetFS is used before overwrite it!
看起来依赖的AssetFS和smtp没有搞定。
评价
4.CCMS,19☆
地址: https://gitee.com/omyscode/CCMS.git
http://127.0.0.1:8081/ccms 普通用户;账号密码:453453453453/453453453453
http://127.0.0.1:8081/ccms/c_login 管理员;admin/admin;
评价
5.pinecms,35☆
地址: https://github.com/xiusin/pinecms.git
这个网站报错解决不了。无法编译通过。
# github.com/shirou/gopsutil/disk../../go-miniapp/pkg/mod/github.com/shirou/gopsutil@v3.20.11+incompatible/disk/disk_darwin.go:64:52: cannot use stat.Mntfromname[:] (type []int8) as type []byte in argument to common.ByteToString../../go-miniapp/pkg/mod/github.com/shirou/gopsutil@v3.20.11+incompatible/disk/disk_darwin.go:65:50: cannot use stat.Mntonname[:] (type []int8) as type []byte in argument to common.ByteToString../../go-miniapp/pkg/mod/github.com/shirou/gopsutil@v3.20.11+incompatible/disk/disk_darwin.go:66:51: cannot use stat.Fstypename[:] (type []int8) as type []byte in argument to common.ByteToString../../go-miniapp/pkg/mod/github.com/shirou/gopsutil@v3.20.11+incompatible/disk/disk_darwin.go:77:44: cannot use stat.Fstypename[:] (type []int8) as type []byte in argument to common.ByteToString
评价
6. go-blog,154☆
代码地址: https://github.com/1920853199/go-blog.git
体验地址: http://127.0.0.1:8088/
评价
7.GoAdmin,118☆
代码地址:
https://github.com/CrazyRocks/autocreate.git 90☆
https://gitee.com/crazyrocks/goadmin.git 118☆
体验地址:
http://127.0.0.1:8081/ 在这里生成代码;GF代码生成器;
http://localhost:8192/ 在这里体验网站;goadmin后台;
注意啊,作者没有很详尽的readme,我看了源代码很久才折腾好了。
第一步:建表
注意:
这一步,需要在goadmin的数据库中建表。例如:
先修改配置文件,支持链接数据库:
// 在config/config.toml 文件中,修改数据库配置,指定数据库名字;host = "localhost"port = "3306"user = "root"pass = "123456"name = "goadmin"type = "mysql"role = "master"charset = "utf8"priority = "1"debug = true
然后自己在终端下面访问数据库,创建表,这里我一次性创建两个:
// 然后创建表:create table `site_weixin` (`id` int(11) auto_increment comment 'ID',`name` varchar(45) default null comment '名称',`short_id` varchar(45) default null comment '微信号',`qrcode` varchar(255) default null comment '二维码',`create_time` varchar(255) default null comment '创建时间',`update_time` varchar(255) default null comment '更新时间',`status` varchar(255) default null comment '状态',primary key (`id`)) engine=InnoDB AUTO_INCREMENT=1 charset=utf8mb4 comment='绑定微信';create table `site_wxuser` (`id` int(11) auto_increment comment 'ID',`name` varchar(45) default null comment '名称',`short_id` varchar(45) default null comment '微信号',`qrcode` varchar(255) default null comment '二维码',`create_time` varchar(255) default null comment '创建时间',`update_time` varchar(255) default null comment '更新时间',`status` varchar(255) default null comment '状态',primary key (`id`)) engine=InnoDB AUTO_INCREMENT=1 charset=utf8mb4 comment='微信用户';
第二步:点击生成
表建好之后,运行GF代码生成器。
https://github.com/CrazyRocks/autocreate.git 里面运行:
go run .
命令行提示,端口启动在8081,则访问: http://localhost:8081/#generator.html 即可访问GF代码生成器。
result├── html│ └── site│ ├── weixin.html│ └── wxuser.html├── js│ └── site│ ├── weixin.js│ └── wxuser.js├── site│ ├── config│ │ └── router.go│ ├── controller│ │ ├── site_weixin_controller.go│ │ └── site_wxuser_controller.go│ ├── model│ │ ├── site_weixin_model.go│ │ └── site_wxuser_model.go│ └── module.go├── sql│ ├── site_weixin_menu.sql│ └── site_wxuser_menu.sql└── vue └── site ├── siteweixin-add-or-update.vue ├── siteweixin.vue ├── sitewxuser-add-or-update.vue └── sitewxuser.vue
第三步:整合生成的代码
作者只是说result就可以拿去用了,但是怎么用呢?这里我研究了一下,可以这样和goadmin进行整合:
第四步:添加菜单入口
为了能在goadmin左侧显示菜单入口,需要修改goadmin/template/layout/nav.html,在右侧导航加入菜单项:
<li class="nav-item"> <a href="/sys/oss/index" class="nav-link "><i class="fas fa-cloud-upload-alt"></i> <span>文件管理</span></a></li><li class="nav-item"> <a href="/site/weixin" class="nav-link "><i class="fas fa-cloud-upload-alt"></i> <span>微信绑定</span></a></li><li class="nav-item"> <a href="/site/wxuser" class="nav-link "><i class="fas fa-cloud-upload-alt"></i> <span>微信用户</span></a></li>
第五步:刷新goadmin后台,完成:
后记
通过
egrep -r "weixin|site" result/* | grep -v vue | grep -v wxuser > /tmp/one.txt
查看改动,为了省略篇幅,去掉vue和wxuser,只看site_weixin的结果。可以看到autocreate工程修改的范围,体会模版做的工作有哪些,感觉还是比较清晰的:
result/html/site/weixin.html: <div class="breadcrumb-item"><a href="/site/weixin">绑定微信</a></div>result/html/site/weixin.html: <div class="breadcrumb-item"><a href="/site/weixin">列表</a></div>result/html/site/weixin.html: v-model="siteweixin.Name"result/html/site/weixin.html: v-model="siteweixin.ShortId"result/html/site/weixin.html: v-model="siteweixin.Qrcode"result/html/site/weixin.html: v-model="siteweixin.CreateTime"result/html/site/weixin.html: v-model="siteweixin.UpdateTime"result/html/site/weixin.html: v-model="siteweixin.Status"result/html/site/weixin.html:<script src="/modules/site/weixin.js?_1608464436"></script>result/js/site/weixin.js: url: baseURL + 'site/weixin/page',result/js/site/weixin.js: siteweixin:{result/js/site/weixin.js: vm.siteweixin= {};result/js/site/weixin.js: var url = vm.siteweixin.Id ==null ? "site/weixin/save" : "site/weixin/update";result/js/site/weixin.js: data: vm.siteweixin,result/js/site/weixin.js: url: baseURL + "site/weixin/delete",result/js/site/weixin.js: url: baseURL + "site/weixin/delete",result/js/site/weixin.js: $.get(baseURL + "site/weixin/get/" +Id, function (r) {result/js/site/weixin.js: vm.siteweixin= r.data;result/site/config/router.go: "goadmin/module/site/controller"result/site/config/router.go: s.Group(urlPath+"/site", func(g *ghttp.RouterGroup) {result/site/config/router.go: siteWxuserController := new(controller.SiteWxuserController)result/site/config/router.go: siteWeixinController := new(controller.SiteWeixinController)result/site/config/router.go: g.ALL("/weixin", siteWeixinController)result/site/config/router.go: g.POST("/weixin/page", siteWeixinController.Page)result/site/config/router.go: g.GET("/weixin/get/{id}", siteWeixinController.Get)result/site/config/router.go: g.POST("/weixin/save", siteWeixinController.Save)result/site/config/router.go: g.POST("/weixin/update", siteWeixinController.Update)result/site/config/router.go: g.POST("/weixin/delete", siteWeixinController.Delete)result/site/controller/site_weixin_controller.go:* @File: site_weixin_controllerresult/site/controller/site_weixin_controller.go: "goadmin/module/site/model"result/site/controller/site_weixin_controller.go: base.WriteTpl(r, "site/weixin.html", g.Map{})result/site/model/site_weixin_model.go:* @File: site_weixin_modelresult/site/model/site_weixin_model.go: return "site_weixin"result/site/module.go:package siteresult/site/module.go:import "goadmin/module/site/config"result/sql/site_weixin_menu.sql: VALUES ('1', 'wxmenu', 'site/siteweixin', NULL, '1', 'config', '6');result/sql/site_weixin_menu.sql: SELECT @parentId, '查看', null, 'site:siteweixin:list,site:siteweixin:info', '2', null, '6';result/sql/site_weixin_menu.sql: SELECT @parentId, '新增', null, 'site:siteweixin:save', '2', null, '6';result/sql/site_weixin_menu.sql: SELECT @parentId, '修改', null, 'site:siteweixin:update', '2', null, '6';result/sql/site_weixin_menu.sql: SELECT @parentId, '删除', null, 'site:siteweixin:delete', '2', null, '6';
总体来说比较清爽,但是要注意,在阅读源代码时,发现搜索功能有个bug:
点击查询的时候,向后台传递的参数是search,
这里却是按name取的字段,修改为:
if form.Params != nil && form.Params["search"] != "" { where += " and name like ? " params = append(params, "%"+form.Params["search"]+"%") }
之后就好了:
评价
完
感谢大家阅读到这里,后续如果还有星比较多的项目,我再体验一下,发给大家。