介绍

Cabloy-CMS是什么

Cabloy-CMS是基于CabloyJS全栈业务开发框架开发的“动静结合”的CMS,可以快速构建企业网站、博客、社区、商城等Web应用。

在线演示

https://zhennann.com

特性

Cabloy-CMS受Hexo启发,采用“静态+动态”的架构,弥补了Hexo许多功能上的不足,主要特性如下:

  • 内置多站点、多语言支持
  • 不同语言可单独设置主题
  • 内置SEO优化,自动生成Sitemap文件
  • 文章在线撰写、发布
  • 文章发布时实时渲染静态页面,不必整站输出,提升整体性能
  • 内置文章查看计数器
  • 内置评论系统
  • 内置全文检索
  • 文章可添加附件
  • 自动合并并最小化CSS和JS
  • JS支持ES6语法,并在合并时自动babel编译
  • 首页图片延迟加载,自动匹配设备像素比
  • 调试便捷

架构 - 动静结合

动态部分

Cabloy-CMS基于CabloyJS全栈业务开发框架,提供了强大的文章后台管理系统。CMS当中经常变动的功能均通过“动态部分”实现,并提供API供“静态部分”调用。

静态部分

Cabloy-CMS将“首页”和“文章”等静态元素实时渲染成静态文件,既满足了SEO的需求,同时也提升了访问性能。

此外,“静态部分”通过Ajax访问“动态部分”提供的API,可实现丰富的页面功能。

快速开始

安装EggBorn

$ npm install -g egg-born

新建Cabloy项目

$ egg-born cabloy-cms --type=cabloy
$ cd cabloy-cms
$ npm i

安装CMS模块

$ npm i egg-born-module-a-cms

安装CMS主题模块

$ npm i egg-born-module-cms-themeblog

配置MySQL

测试环境

src/backend/config/config.unittest.js

  // mysql
config.mysql = {
clients: {
// donnot change the name
__ebdb: {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '',
database: 'sys', // donnot change the name
},
},
};

开发环境

src/backend/config/config.local.js

  // mysql
config.mysql = {
clients: {
// donnot change the name
__ebdb: {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '',
database: 'sys', // recommended
},
},
};

生产环境

src/backend/config/config.prod.js

  // mysql
config.mysql = {
clients: {
// donnot change the name
__ebdb: {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: '',
database: '{{name}}',
},
},
};

运行

启动后端服务

$ npm run dev:backend

启动前端服务

$ npm run dev:front

进入后台管理页面

参数配置

参数覆盖规则

语言配置 > 站点配置 > 缺省配置

  • 语言配置:由于支持多语言,因此不同的语言可以配置不同的参数
  • 站点配置:配置与语言无关的全局参数
  • 缺省配置:会因使用不同的主题而拥有不同的参数

站点配置

进入设置/cms页面

点击站点/配置,进入站点配置页面

点击右侧的“ !”按钮,查看缺省配置

缺省配置拷贝需要修改的属性到站点配置页面,并修改成所需要的值。

在这里,我们修改如下参数:

{
"host": {
"url": "http://example.com",
"rootPath": ""
},
"language": {
"default": "zh-cn",
"items": "zh-cn,en-us"
},
"themes": {
"zh-cn": "cms-themeblog",
"en-us": "cms-themeblog"
},
"plugins": {
"cms-plugintrack": {
"track": {
"google": "",
"baidu": "",
"qq": ""
}
}
}
}
  • host

    • url: 实际部署时的站点域名
    • rootPath: 根路径,一般设置
  • languange
    • default: 缺省语言。

      缺省语言渲染的静态文件位于站点“根目录”,其他语言位于站点“根目录/[语言]”
    • items: 支持的语言列表,用逗号分隔
  • themes
    • zh-cn: 语言所使用的主题
    • en-us: 语言所使用的主题
  • plugins
    • cms-plugintrack

      • track

        • google: google统计的跟踪代码
        • baidu: 百度统计的跟踪代码
        • qq: 腾讯统计的跟踪代码

语言配置

可以依次对不同的语言配置参数,这里从略

构建

为了提升渲染速度,在发表文章时,仅对“当前文章”和“首页”进行渲染,其他静态文件不变。所以,当设计到整站元素变更时,需要进行“整站渲染”。

如何操作

进入设置/cms页面

  • 整站构建:“整站参数”变更时
  • 语言构建:“语言参数”变更时

预览

可点击“预览”,直接查看渲染效果

此时生成的网址没有内容,接下来可以创建目录,然后发表文章

目录

Cabloy-CMS有以下约定:

  • 所有目录必属于某一个“语言”
  • 所有文章必属于某一个“目录”

有的CMS工具,文章可以分属多个“目录”,其实这种特性可以用“标签”来解决

如何操作

进入设置/cms页面,点击语言的“目录”按钮,添加“目录”,效果如下:

此时,可以进行“语言构建”,并预览效果

文章

Cabloy-CMS后台提供了完备的文章管理功能。当文章提交发表时,实时渲染成静态文件,并写入Sitemap文件

如何操作

基本属性

在后台首页,点击新建文章,进入文章编辑页面,依次输入或选择如下属性值:

  • 原子名称:也就是文章标题。原子是Cabloy对基础业务数据的通用定义
  • 语言:
  • 目录:
  • 标签:支持多标签,用逗号隔开

内容

Cabloy-CMS采用开源组件mavonEditor,实现了markdown格式的编辑和预览效果

请输入以下内容,并查看效果

![5775337-414d62d7c1e152f2](http://zhennann.cabloy.org/api/a/file/file/download/00ca2e89235b47bba5b7e7580fc71834.jpg)

## 一天到晚的鱼儿不停游

曾经嘲讽

鱼儿是被诅咒过的

一天到晚的不停游

here and there

here and there

如今

安然做一条鱼儿

一天到晚的不停游

here and there

here and there

曾经的嘲讽

终会落在自己身上

here and there

here and there

甚好甚好

提交发布

Cabloy中所有的原子数据均有两个状态:草稿正常草稿状态下只有创建人能访问和编辑,通过提交转入正常状态,其他用户才能访问。

文章也不例外,只有提交进入正常状态,才会进行渲染。

当然,如果文章已是正常状态,那么再次编辑并保存时,也会进行渲染。

提交并预览

首页

文章页

部署

实例与子域名

Cabloy支持多实例,实例与网站子域名一一对应,不同实例的数据完全隔离。比如instance1.cabloy.orginstance2.cabloy.org

调试阶段,Cabloy启用了一个缺省实例,但在部署阶段,需要规划实例与子域名

在CMS应用中,把域名example.com留给静态文件,需要给后台管理系统分配一个子域名,如admin.example.com

多站点支持

由于一个实例对应一个CMS应用,通过多实例就可以支持多站点

实例配置

编辑文件:src/backend/config/config.prod.js

// instances
config.instances = [
{ subdomain: 'admin', password: '', title: '',
meta: {
jsonp: { whiteList: 'example.com' },
},
},
];
  • subdomain: 子域名
  • password: 实例中用户root的访问密码
  • title: 网站标题
  • meta.jsonp.whiteList: 白名单,只有白名单中的域名可以通过ajax访问后台API接口

构建前端代码

$ npm run build:front

启动后端服务

$ npm run start:backend
  • 别忘了创建MySQL数据库,并配置src/backend/config/config.prod.js

停止后端服务

$ npm run stop:backend

后端服务启动参数配置

编辑文件:build/config.js

// backend
const backend = {
port: 7002,
hostname: '127.0.0.1',
};

nginx配置

强烈建议使用nginx托管前端静态资源,并反向代理后端服务

在项目根目录已经生成了两个nginx配置文件,分别对应Cabloy-CMS的“动态部分”和“静态部分”,请根据实际情况修改

动态部分:nginx.conf

server {

  listen 80;
server_name admin.example.com;
set $node_port 7002; root /Users/wind/Documents/temp/cabloy-cms/dist; location /public {
root /Users/wind/cabloy/cabloy-cms;
internal;
} location /api/ {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:$node_port$request_uri;
proxy_redirect off;
} }

静态部分:nginx-cms.conf

server {

  listen 80;
server_name example.com; root /Users/wind/cabloy/cabloy-cms/public/1/cms/dist; }

GitHub贡献

有任何疑问,欢迎提交 issue

Cabloy-CMS:动静结合,解决Hexo痛点问题的更多相关文章

  1. Cabloy-CMS:动静结合,解决Hexo痛点问题(进阶篇)

    前言 前一篇文章 介绍了如何通过Cabloy-CMS快速搭建一个博客站点. 这里简单介绍Cabloy-CMS静态站点的渲染机制,更多详细的内容请参见https://cms.cabloy.com 渲染规 ...

  2. webpack多页应用架构系列(一):一步一步解决架构痛点

    这系列文章讲什么? 前些时间,写过一个项目,前后端分离,没有借助任何框架,项目页面特别的多,页面都是html直接写的,许多公共html,写了好多处,有一个地方需要改就得改好多地方,js也是随意写,每个 ...

  3. 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND

    原文:http://kikoroc.com/2016/05/04/resolve-hexo-DTraceProviderBindings-MODULE-NOT-FOUND.html 今晚折腾hexo的 ...

  4. 解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题

    用Hexo搭了个Gitpage的博客,兴冲冲的发了11篇博文后发现翻页按钮不正常显示,显示为<i class="fa fa-angle-right"></i> ...

  5. 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点

    写在前面  一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 最近博主我沉淀了几个月,或者说懒了几个月.然而大佬的指点总是一针见血,能够让人看到方向.所以我现在有觉得,一个好的 ...

  6. 深入学习vue指令,自定义指令解决开发痛点

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code v-model指令 vue.js的定义是一个mvvm框架,将它发挥到极致能够极大的提升 ...

  7. 解决hexo报错spwan failed

    报错1 FATAL { err: Error: Spawn failed at ChildProcess.<anonymous> (/usr/local/src/hexo/cairbin/ ...

  8. Hexo+NexT(六):手把手教你编写一个Hexo过滤器插件

    Hexo+NexT介绍到这里,我认为已经可以很好地完成任务了.它所提供的一些基础功能及配置,都已经进行了讲解.你已经可以随心所欲地配置一个自己的博客环境,然后享受码字的乐趣. 把博客托管到Github ...

  9. 打破陈规抓痛点,H3 BPM10.0挑战不可能

    高效益意味着相似的运营活动比竞争对手做得更好,而战略定位则意味着企业在运营活动中有区别于竞争对手的实施方式,即差异化竞争.在新经济体下,面对社会的变革.市场的竞争环境.不断攀升的成本压力,几乎没有企业 ...

随机推荐

  1. Laya 中缩放的实现

    Laya 缩放功能的实现 在 laya 中实现滚轮对选中对象的缩放,涉及到以下两个模块: 事件 容器坐标 1. 事件 在 Laya 中, Event 是事件类型的集合.包含了常见的鼠标事件.键盘事件. ...

  2. 【记录】SpringBoot 2.X整合Log4j没有输出INFO、DEBUG等日志信息解决方案

    由于批量更新的时候一直无法定位问题出处,就去服务器定位日志,奈何日志一直无法输出,为了能够更好的定位问题,痛定思痛后逐步排查最终解决问题.如有客官看到此处,请不要盲目对号入座,我的项目环境或许与你有区 ...

  3. springboot的log4j配置与logback配置

    log4j配置的依赖 <!-- 删除pom.xml文件中所有对日志jar包的引用--> <dependency> <groupId>org.springframew ...

  4. Linux面试题总结

    1.简述Apache两种工作模式,以及它们之间的区别.答:(1)prefork MPM使用多个子进程,每个子进程只有一个线程来处理一个http请求,直到这个TCP连接被释放.root主进程在最初建立s ...

  5. silverlight中递归构造无限级树treeview+checkbox

    两个实体,其实一个实体也能构造出来,我这里是为了增加一个 checkbox //第一个实体 public class person { public int no { get; set; } publ ...

  6. 五.Linux基础

    Linux是运行在pc机上类似unix风格的操作系统,由众多程序员开发.开放源代码! 由于开放源代码,所以现在的Linux比windows漏洞更少! linux操作系统由内核及应用程序组成,有很多发行 ...

  7. 域渗透-LSA Protection

    简介: 微软在 2014 年 3 月 12 日添加了 LSA 保护策略,用来防止对进程 lsass.exe 的代码注入,这样一来就无法使用 mimikatz 对 lsass.exe 进行注入,相关操作 ...

  8. python requests接口测试系列:连接mysql,获取mysql查询的值作为接口的入参

    主要思路: 连接mysql数据库,这里数据库需要使用Proxifier来设置代理,然后才能正常连接 获取mysql数据库中某一数据,作为接口的参数信息 将接口返回结果保存至csv数据表中 # -*- ...

  9. C函数指针状态机实现

    C函数指针状态机实现 有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部 ...

  10. 洛谷 P1262 【间谍网络】

    题库 : 洛谷 题号 : 1262 题目 : 间谍网络 link : https://www.luogu.org/problemnew/show/P1262 思路 : 这题可以用缩点的思想来做.先用T ...