7個golang的開源cms后臺生成工具體驗總結

這兩天在網(wǎng)上研究了很多開源的自動cms生成工具,這里對這兩天的收獲做一下總結掘宪。本質上,自己做一個簡單的也不費事兒蘑斧,但是閉門造車容易,擁抱世界卻很難惠拭。所以先看看有什么巨人的肩膀可以用是好的聂示。
在低代碼和零代碼領域的應用趋观,一般有四種類型:

  • bootstrap studio豆巨,自動拖拽生成頁面樣式模版,套一套數(shù)據(jù)就是頁面
  • 自動生成小程序或者app融欧,例如谷歌收購的apigee
  • 自動生成cms,包含crud操作和界面的增刪查改搜等5項操作
  • 調用代碼生成,也就是一般的sdk刺桃,幫助快速接入api和功能

這兩天調研的功能主要屬于第三種類型屋匕。下面我就每一種都簡單介紹一下

  1. go-admin,4.4k☆
  2. goweb乳绕,385☆
  3. qor樊展,4.6k★
  4. CCMS雷酪,19☆
  5. pinecms,35☆
  6. go-blog寞射,154☆
  7. 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/

image.png

評價

可以說谋国,這個項目做得挺認真的,特別是當我們發(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/

image.png

評價

  • 安裝后打開主頁空空如也宽堆,即使是導入了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;

image.png

評價

  • 這個網(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/

image.png

評價

  • 網(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惑畴,我看了源代碼很久才折騰好了。

第一步:建表

image.png

注意:

  • 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代碼生成器潜支。

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后臺梢灭,完成:

image.png

后記

通過

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:


image.png

點擊查詢的時候冒窍,向后臺傳遞的參數(shù)是search拘领,


image.png

但是欠啤,代碼中匹配時有問題:
image.png

這里卻是按name取的字段叠蝇,修改為:

    if form.Params != nil && form.Params["search"] != "" {
        where += " and name like ? "
        params = append(params, "%"+form.Params["search"]+"%")
    }

之后就好了:


image.png

評價

  • 支持go.mod淤齐;
  • 基于gof框架柳沙;
  • 作者在readme.md中的介紹實在是太簡略了泡孩,導致填寫和看代碼才能看懂最后生成代碼的填寫方法薄料;
  • 作為cms,增刪查改都有鞠抑,比較方便此熬;可以作為初級使用拐纱,符合我自己簡單搭建后臺的需要蒂破。
  • image.png

    作者也夠粗心的,連項目名字都會寫錯(這里應該是GoAdmin炸庞,哎,作者大概是著急賺錢去了吧狂票,難怪還存在一個bug)唉匾;

  • 關于vue的部分与斤,不知道是不是個半成品;

感謝大家閱讀到這里,后續(xù)如果還有星比較多的項目锭弊,我再體驗一下蚁署,發(fā)給大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末称簿,一起剝皮案震驚了整個濱河市憨降,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌士嚎,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笨蚁,居然都是意外死亡括细,警方通過查閱死者的電腦和手機奋单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門览濒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贷笛,“玉大人昨忆,你說我怎么就攤上這事∠铮” “怎么了奖磁?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵咖为,是天一觀的道長。 經(jīng)常有香客問我稠腊,道長躁染,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任架忌,我火速辦了婚禮吞彤,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己饰恕,他們只是感情好挠羔,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埋嵌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪范舀。 梳的紋絲不亂的頭發(fā)上端仰,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天吱七,我揣著相機與錄音,去河邊找鬼吝岭。 笑死,一個胖子當著我的面吹牛幕帆,可吹牛的內容都是我干的。 我是一名探鬼主播碱茁,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼诅蝶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舱馅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硝逢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡凿试,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年吧恃,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕寓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖元践,靈堂內的尸體忽然破棺而出沪羔,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布杖剪,位于F島的核電站饱苟,受9級特大地震影響,放射性物質發(fā)生泄漏城须。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褥蚯。 院中可真熱鬧,春花似錦澜薄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舟山。三九已至,卻和暖如春若债,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留已卸,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像圈驼,于是被迫代替她去往敵國和親橄抹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容