這兩天在網(wǎng)上研究了很多開源的自動cms生成工具,這里對這兩天的收獲做一下總結掘宪。本質上,自己做一個簡單的也不費事兒蘑斧,但是閉門造車容易,擁抱世界卻很難惠拭。所以先看看有什么巨人的肩膀可以用是好的聂示。
在低代碼和零代碼領域的應用趋观,一般有四種類型:
- bootstrap studio豆巨,自動拖拽生成頁面樣式模版,套一套數(shù)據(jù)就是頁面
- 自動生成小程序或者app融欧,例如谷歌收購的apigee
- 自動生成cms,包含crud操作和界面的增刪查改搜等5項操作
- 調用代碼生成,也就是一般的sdk刺桃,幫助快速接入api和功能
這兩天調研的功能主要屬于第三種類型屋匕。下面我就每一種都簡單介紹一下
- go-admin,4.4k☆
- goweb乳绕,385☆
- qor樊展,4.6k★
- CCMS雷酪,19☆
- pinecms,35☆
- go-blog寞射,154☆
- GoAdmin梁丘,118☆
7.1 第一步:建表
7.2 第二步:點擊生成
7.3 第三步:整合生成的代碼
7.4 第四步:添加菜單入口
7.5 第五步:刷新goadmin后臺,完成:
7.6 后記
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/
評價
可以說谋国,這個項目做得挺認真的,特別是當我們發(fā)現(xiàn)這是一個中山大學的大三學生的項目時缅糟,感覺更為不容易赦颇。為小兄弟點贊扇苞。
- 整體利用后臺golang代碼控制前端顯示和功能布局,對于后臺能力強于前端的團隊來說還可以考慮一下。
- 該項目支持go.mod屋吨。
- 文檔寫的不錯资锰。
- 基于gin框架直秆。
2.goweb齿诉,385☆
地址:https://github.com/iissy/goweb
如果遇到端口沖突,無法啟動焕议,則把
iris.Addr(":80"),
改為:
iris.Addr(":8083"),
打開體驗地址:http://127.0.0.1:8083/
評價
- 安裝后打開主頁空空如也宽堆,即使是導入了hrefs.cn.sql(看不到效果,就不好感受是否好用了)浸遗。
- 項目只能使用consul來做注冊發(fā)現(xiàn)届惋,如果要關掉consul郑藏,需要改一些代碼俱饿,不明確的變更工作量失驶。
3.qor,4.6k★
地址:https://github.com/qor/qor-example
文檔地址;https://getqor.com/cn
https://doc.getqor.com/
這個項目看起來比較專業(yè)埂奈,但是無法運行起來痊远。
報錯信息:
Failed to find configuration config/smtp.yml, using example file config/smtp.example.yml
WARNING: AssetFS is used before overwrite it!
看起來依賴的AssetFS和smtp沒有搞定。
評價
- 這個只有英文文檔網(wǎng)站。
- example無法打開滞造,無法體驗效果。
- 雖然建設看起來專業(yè)的,但是已經(jīng)有2年沒有維護了。
- go mod vendor無法通過疆虚。
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;
評價
- 這個網(wǎng)站就是一個定制的cms管理后臺,功能只跟考生有關系捕透,要想修改為自己所用有點費勁。本身不具有開放性盟榴。
- 樣式太老氣了几莽。
5.pinecms,35☆
地址:https://github.com/xiusin/pinecms.git
這個網(wǎng)站報錯解決不了镊绪。無法編譯通過。
# 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
評價
- 無法編譯通過蛉抓,應該是很長時間沒有維護了。雖然只過了8個月付魔。
6. go-blog陈哑,154☆
代碼地址:https://github.com/1920853199/go-blog.git
體驗地址:http://127.0.0.1:8088/
評價
- 網(wǎng)站太粗糙了,感覺是自己做了個網(wǎng)站,順便改了一下開源出來售担,并非一個擴展性很強的網(wǎng)站哭尝。
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/ 在這里體驗網(wǎng)站;goadmin后臺;
注意啊,作者沒有很詳盡的readme惑畴,我看了源代碼很久才折騰好了。
第一步:建表
注意:
- project:用來做require代碼包的,你想引用到哪里去,你就用啥project名,比如我想放到goadmin項目去塘安,就填goadmin;
- module:這個是模塊名,在goadmin后臺的module目錄下绕娘,已經(jīng)用了home侨舆、public脐湾、sys三個模塊了愁铺,所以新生成的module也要放這里孟岛。比如site斤贰。
- menu:這個沒有看懂是用來干啥的,暫時其實也用不到,看起來是指用來生成了一個sql文件,導入到某個地方去支撐頁面入口添加。無妨。
- 表名:用處很大圆凰±矍Γ看了源碼里面菇民,解析成路徑path了玛荞。一般設置為兩級目錄壁涎,下劃線分隔,例如module_path,module就是上面的module;path就是這個數(shù)據(jù)庫表功能的名字崭歧,比如訂單屋彪、用戶仔粥、成績矮湘、分數(shù)等都可以。
這一步,需要在goadmin的數(shù)據(jù)庫中建表呵燕。例如:
先修改配置文件氧苍,支持鏈接數(shù)據(jù)庫:
// 在config/config.toml 文件中,修改數(shù)據(jù)庫配置,指定數(shù)據(jù)庫名字;
host = "localhost"
port = "3306"
user = "root"
pass = "123456"
name = "goadmin"
type = "mysql"
role = "master"
charset = "utf8"
priority = "1"
debug = true
然后自己在終端下面訪問數(shù)據(jù)庫,創(chuàng)建表拜效,這里我一次性創(chuàng)建兩個:
// 然后創(chuàng)建表:
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 '創(chuàng)建時間',
`update_time` varchar(255) default null comment '更新時間',
`status` varchar(255) default null comment '狀態(tài)',
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 '創(chuàng)建時間',
`update_time` varchar(255) default null comment '更新時間',
`status` varchar(255) default null comment '狀態(tài)',
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代碼生成器潜支。
填寫:
- project為goadmin
- module為site
- menu為wxmenu
- 選中site_weixin和site_wxuser
點擊生成代碼按鈕冗酿,提示成功裁替。查看代碼路徑貌笨,發(fā)現(xiàn)增加了一個result目錄:
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進行整合:
- result/html/site放到goadmin/template/site目錄下;
- result/js/site放到goadmin/public/modules/site目錄下康栈;
- result/site放到goadmin/module目錄下悬荣,和home、public、sys放一起舟扎;
第四步:添加菜單入口
為了能在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_controller
result/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_model
result/site/model/site_weixin_model.go: return "site_weixin"
result/site/module.go:package site
result/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';
總體來說比較清爽,但是要注意,在閱讀源代碼時塔沃,發(fā)現(xiàn)搜索功能有個bug:
點擊查詢的時候冒窍,向后臺傳遞的參數(shù)是search拘领,
但是欠啤,代碼中匹配時有問題:
這里卻是按name取的字段叠蝇,修改為:
if form.Params != nil && form.Params["search"] != "" {
where += " and name like ? "
params = append(params, "%"+form.Params["search"]+"%")
}
之后就好了:
評價
- 支持go.mod淤齐;
- 基于gof框架柳沙;
- 作者在readme.md中的介紹實在是太簡略了泡孩,導致填寫和看代碼才能看懂最后生成代碼的填寫方法薄料;
- 作為cms,增刪查改都有鞠抑,比較方便此熬;可以作為初級使用拐纱,符合我自己簡單搭建后臺的需要蒂破。
-
image.png
作者也夠粗心的,連項目名字都會寫錯(這里應該是GoAdmin炸庞,哎,作者大概是著急賺錢去了吧狂票,難怪還存在一個bug)唉匾;
- 關于vue的部分与斤,不知道是不是個半成品;
完
感謝大家閱讀到這里,后續(xù)如果還有星比較多的項目锭弊,我再體驗一下蚁署,發(fā)給大家。