<span style="text-wrap-mode: wrap;">ChestnutCMS是什么?</span>
ChestnutCMS是前后端分离的内容管理系统。技术栈:SpringBoot3 + VUE2 + MybatisPlus + Freemarker + ES + Redis + MySQL,项目基于RuoYi-Vue重构,集成SaToken用户权限,xxl-job任务调度。支持站群管理、多平台静态化、元数据模型扩展、轻松组织文章、音视频、图集等各种复杂内容形态、支持多语言、全文检索。
本地开发环境搭建
开发环境
JDK 17Mysql 8.0.32 (支持8.x+)Redis 7.2.4(支持5.x+)Maven 3.8.7(支持3.8+)Node 16.20.2(支持14+ - 16+)
基础环境请参考相关官方文档安装
下载代码
您可通过一下两种方式下载代码
前往 Gitee 下载页面https://gitee.com/liweiyi/ChestnutCMS下载解压到工作目录
前往 GitHub 下载页面https://github.com/liweiyi/ChestnutCMS下载解压到工作目录
后端运行
我们将项目代码下载到目录:E:/dev/workspace/ChestnutCMS,下面所有 {ProjectDir} 均指此目录。
导入 IDEA 项目
打开 IDEA 开发工具,在左上角菜单栏选择 File -> Open,然后选择项目目录 {ProjectDir} ,然后点击 OK 按钮即可。
IDEA 会自动加载Maven依赖包,初次加载会比较慢(根据自身网络情况而定,您可以设置MAVEN的国内镜像仓库加快下载速度)
导入数据库(以MySQL为例)
数据库文件所在目录:{ProjectDir}/chestnut-admin/src/main/resources/db/migration/mysql
// 创建数据库create database `chestnut_cms` charset utf8mb4;
您可以通过一下两种方式初始化数据库
使用flyway初始化数据库
项目可以使用flyway管理数据库版本,默认关闭,在 {ProjectDir}/chestnut-admin/src/main/resources/application-dev.yml 设置 spring.flyway.enabled = true 开启flyway初始化数据库,开启flyway后启动应用即可由flyway自动初始化数据库,后续的版本更新的sql也会在重启应用时自动更新。
手动导入数据库
将 {ProjectDir}/chestnut-admin/src/main/resources/db/migration/mysql 目录下的所有sql文件按版本顺序依次导入,后续版本更新按版本顺序依次导入即可。
修改配置
打开配置文件:{ProjectDir}/chestnut-admin/src/main/resources/application-dev.yml
找到xxl.job.enable配置修改为false(需要安装XXL-JOB服务)
找到spring.data.redis.host配置,确保redis访问地址和端口与本地Redis环境配置一致,如果Redis没有设置访问密码,请注释掉或删掉spring.data.redis.password配置(注:修改为空字符串是不行的)
找到spring.datasource.dynamic.datasource.master配置,确保数据库访问地址和用户名密码与本地安装的MySQL配置一致
运行项目
打开文件:{ProjectDir}/chestnut-admin/src/main/java/com/chestnut/ChestnutApplication.java
右键选择 Run 'ChestnutApplication.main()',当控制台显示如下图所示信息时系统启动成功。
<img data-cke-saved-src="https://www.1000mz.com/docs/dev/1.jpg" src="/data/upload/article/20250115/1736950760817662.jpg" alt="启动信息" width="993" height="333" align="" border="0"/>
前端运行
使用 VSCode 打开{ProjectDir}/chestnut-ui目录,打开命令行,执行以下命令:
# 进入项目目录cd {ProjectDir}/chestnut-ui# 安装依赖npm install# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题npm install --registry=https://registry.npmmirror.com# 启动服务npm run dev
浏览器访问 http://localhost:80 ,默认账号:admin / admin
网站静态资源
网站静态资源默认路径是当前项目应用同级的wwwroot_release目录。例如:项目目录为E:/dev/workspace/ChestnutCMS,那么网站静态资源目录应为:D:/dev/workspace/wwwroot_release。
此路径可通过application-xx.yml文件修改, 配置chestnut.cms.resourceRoot,如下所示:
chestnut: cms: resourceRoot: E:/dev/workspace/wwwroot_release/
网站静态资源目录示例:(以演示站为例,演示站并没有swikoon_h5.此处仅示例目录结构)
# 应用目录ChestnutCMS |--chestnut-admin|--chestnut-cms|--chestnut-common|--......
# 网站静态资源目录wwwroot_rlease |--swikoon # 站点动态资源目录,一般用来保存用户上传的资源文件|----resources # 素材库资源目录,保存IResourceType实现相关类型文件,目前默认四种类型:图片、视频、音频、文件|------image # 图片素材目录|------video # 视频素材目录|------audio # 音频素材目录|------file # 其他文件素材目录|--swikoon_pc # 发布通道目录,pc为后台发布通道编码,固定格式:站点目录_发布通道编码|----img # 网站图片|----js # 网站js|----css # 网站css|----template # 网站模板固定目录|------index.template.html # 模板文件|--swikoon_h5 # 发布通道目录,h5为后台发布通道编码,固定格式:站点目录_发布通道编码|----img # 网站图片|----js # 网站js|----css # 网站css|----template # 网站模板固定目录|------index.template.html # 模板文件
导入站点主题包
主题包上传在QQ群共享,文件名 企业演示站主题.zip。
后台新建站点(新建站点!!!主题包不能导入已存在数据的站点中!!!)
编辑站点页面点击 导入主题 按钮,上传群共享下载的主题包文件。
<span style="background-color: rgb(255, 255, 255); color: rgb(64, 72, 91); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Liberation Sans", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, SimSun, "WenQuanYi Zen Hei Sharp", sans-serif; font-size: 1.25em;">开发环境</span>
OpenJDK 17
Maven 3.8+
MySQL 8.0+
Redis 5.x+
NodeJS 16.20.2
<span style="background-color: rgb(255, 255, 255); color: rgb(64, 72, 91); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Liberation Sans", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, SimSun, "WenQuanYi Zen Hei Sharp", sans-serif; font-size: 1.25em;">主要技术框架</span>
技术框架 | 版本 | 应用说明 |
---|---|---|
Spring Boot | 3.1.7 | 基础开发框架 |
Spring Boot Admin | 3.1.7 | 监控框架 |
Mybatis Plus | 3.5.5 | ORM框架 |
Flyway | 9.22.3 | 数据库版本管理 |
Yitter | 1.0.6 | 雪花ID |
Redisson | 3.25.2 | 分布式锁 |
FreeMarker | 2.3.32 | 模板引擎 |
Sa-Token | 1.37.0 | 权限认证 |
Xxl-Job | 2.4.0 | 任务调度 |
Lombok | 1.18.26 | 你懂的 |
<span style="background-color: rgb(255, 255, 255); color: rgb(64, 72, 91); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Liberation Sans", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, SimSun, "WenQuanYi Zen Hei Sharp", sans-serif; font-size: 1.25em;"></span>
<span style="background-color: rgb(255, 255, 255); color: rgb(64, 72, 91); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Liberation Sans", "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Wenquanyi Micro Hei", "WenQuanYi Zen Hei", "ST Heiti", SimHei, SimSun, "WenQuanYi Zen Hei Sharp", sans-serif; font-size: 1.25em;">功能模块</span>
模块 | 简介 |
---|---|
站点管理 | 多站点,支持图片水印、标题查重、扩展模型等扩展配置 |
栏目管理 | 普通栏目+链接栏目,扩展配置优先级高于站点扩展配置 |
内容管理 | 内容类型:文章+图片集+音视频集,页面部件:动态自定义区块+广告,内容回收站 |
资源管理 | 图片、音视频等各类静态资源管理,支持OSS/COS/MinIO对象存储 |
发布通道 | 支持多通道不同类型静态文件发布,可同时发布到PC、H5,html、json等 |
模板管理 | 静态化模板,支持在线编辑 |
模板指令 | FreeMarker自定义标签、模板函数及动态模板的参数及用法说明 |
文件管理 | 当前站点资源目录及发布通道静态化目录管理,支持文本在线编辑 |
扩展模型 | 站点、栏目及内容的动态模型扩展,系统默认数据表保存,支持自定义 |
词汇管理 | 热词、TAG词、敏感词、易错词 |
内容索引 | 默认支持ElasticSearch+IK创建内容索引,支持标题内容全文检索 |
检索词库 | 自定义检索词库,支持扩展词和停用词动态扩展 |
检索日志 | 用户搜索的日志记录 |
友链管理 | 友情链接 |
广告管理 | 广告基于页面部件扩展的简单广告功能,支持权重及定时上下线,广告点击/展现统计 |
评论管理 | 基础功能模块 |
调查问卷 | 基础功能模块,默认支持文字类型单选、多选、输入、图片、富文本 |
自定义表单 | 基于元数据模块扩展,支持模板标签 |
会员管理 | 支持自定义会员等级,等级经验值来源动态配置 |
访问统计 | 对接百度统计API |
用户管理 | 后台用户管理,支持用户独立权限配置 |
机构管理 | 多级系统组织机构(公司、部门、小组) |
角色管理 | 支持按角色分配菜单权限、站点和栏目相关操作权限配置 |
岗位管理 | 配置系统用户所属担任职务 |
菜单管理 | 配置系统菜单,操作权限,按钮权限标识等 |
字典管理 | 对系统中经常使用的一些固定的数据进行维护,代码层面定义 |
参数管理 | 对系统动态配置常用参数,代码层面定义 |
通知公告 | 系统通知公告信息发布维护 |
安全配置 | 密码强度、密码过期、首次登陆强制修改、登陆异常策略配置 |
国际化 | 为菜单等动态数据国际化配置提供基础支持,可覆盖后台代码配置 |
安全配置 | 密码强度、密码过期、首次登陆强制修改、登陆异常策略配置 |
系统日志 | 统一日志管理,支持扩展 |
操作日志 | 系统操作日志扩展,记录操作参数、异常信息及请求耗时 |
登录日志 | 系统登录日志扩展,记录用户登录日志,包含登录异常 |
在线用户 | 当前系统中活跃用户状态监控,支持踢下线 |
任务调度 | 基于XXL-JOB的分布式任务调度 |
定时任务 | 基于Spring的TaskScheduler实现的单机定时任务 |
异步任务 | 异步任务状态查看,支持手动结束 |
服务监控 | 监视当前系统CPU、内存、磁盘、堆栈等相关信息 |
缓存监控 | 对系统的缓存信息查询,命令统计等 |
GroovyScript | 支持Groovy脚本在线执行 |
前台演示图:
<img src="/data/upload/article/20250115/1736950593861194.png" title="1736950593861194.png" alt="QQ_1736950589056.png"/>
建站流程
创建站点
进入 内容管理 > 站点管理 菜单,点击 新建 按钮,填写网站基础信息后点击 确定 按钮完成站点创建。
字段说明:
站点目录:站点文件保存目录,此目录基于chestnut.cms.resourceRoot配置目录创建。
例如:chestnut.cms.resourceRoot=D:/chestnut/wwwroot_release/,那么此站点创建时会创建目录:D:/chestnut/wwwroot_release/demo/
资源域名:此域名用来独立配置访问站点上传的资源文件(图片、视频等)。
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site1.png" src="/data/upload/article/20250115/1736950835812242.png" alt="输入图片说明" width="2560" height="1307" align="" border="0"/>
切换站点
右上角切换到我们新建的站点,双击我们刚才创建的演示站或选中点击确定切换站点
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site2.png" src="/data/upload/article/20250115/1736950835324734.png" alt="输入图片说明" width="2560" height="1307" align="" border="0"/>
创建发布通道
进入 内容管理 > 发布通道 菜单,点击 新建 按钮,创建发布通道。(必须切换站点后创建)
说明:发布通道就是网站静态文件生成的目录,可以创建多个不同的发布通道来应对不同端展示效果的要求。比如PC桌面一套模板、移动手机端一套模板、移动平板电脑一套模板,也可以创建一套json格式的静态文件提供给原生APP端调用获取内容数据。
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site3.png" src="/data/upload/article/20250115/1736950835516538.png" alt="输入图片说明" width="2560" height="1307" align="" border="0"/>
发布通道目录结构
在创建发布通道时,系统会在 chestnut.cms.resourceRoot 配置的目录下创建站点发布通道目录,用来存放发布通道模板和相关静态资源文件,我们进入 内容管理 > 文件管理 菜单,查看站点相关文件信息,如下图所示:
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site4.png" src="/data/upload/article/20250115/1736950836831825.png" alt="输入图片说明" width="2560" height="1307" align="" border="0"/>
目前站点相关有2个顶级目录:
demo是站点资源目录,这下面主要保存站点上上传的文件。
demo_pc就是我们创建的发布通道目录,在发布通道目录下已存在了一些系统默认创建的目录。
template 目录是存放页面模板的固定目录,所有发布通道的页面模板都必须放在此目录下,创建发布通道时系统会在此目录下创建默认首页模板 index.template.html;
include 目录是存放模板生成的静态文件的固定目录;
其余目录没有硬性要求,一般我们把做好的静态页面文件放在html目录下,对应的js、css、图片文件放在对应目录下。
资源文件目录结构
我们尝试在 内容管理 > 资源管理 菜单下上传一个图片。如下图:
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site5.png" src="/data/upload/article/20250115/1736950836100946.png" alt="输入图片说明" width="2560" height="1251" align="" border="0"/>
然后我们回到 内容管理 > 文件管理 菜单查看一下文件目录结构,可以看到在 demo 目录下多出了 resources/image/2023/07/16/ 目录,这个目录下就是我们刚才上传的图片。
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site6.png" src="/data/upload/article/20250115/1736950836394986.png" alt="输入图片说明" width="2560" height="1251" align="" border="0"/>
设置站点发布通道属性
配置访问域名
进入 内容管理 > 站点管理 菜单,编辑我们刚才创建的演示站,可以看到在发布通道属性配置部分显示了 PC桌面 的配置信息,我们给发布通道设置一个URL,这个就是发布通道的访问域名(模板中通过 ${Prefix} 获取)。
参数说明:
URL:发布通道对应的访问域名
静态文件类型:发布通道中内容/栏目/站点生成的静态文件后缀名,默认:shtml
首页模板:发布通道对应的首页模板,首页会根据此模板生成对应的静态页面在发布通道目录下。默认:index.template.html
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site7.png" src="/data/upload/article/20250115/1736950837647708.png" alt="输入图片说明" width="2560" height="1307" align="" border="0"/>
预览站点
设置好发布通道的域名URL后,点击 保存 按钮保存站点信息。然后点击 预览 按钮查看站点预览效果。
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site8.png" src="/data/upload/article/20250115/1736950837531315.png" alt="输入图片说明" width="1374" height="391" align="" border="0"/>
发布站点
本地测试域名映射
由于我们是本地测试,未解析域名,我们将站点发布通道的域名在hosts文件中配置一下映射关系,方便我们本地调试。 以windows系统为例,打开文件 C:\Windows\System32\drivers\etc\hosts,添加下图所示红框部分: 其中 www.demo.com 是 PC桌面 发布通道的访问域名,static.demo.com 是站点资源文件访问域名。
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site9.png" src="/data/upload/article/20250115/1736950837892345.png" alt="输入图片说明" width="699" height="593" align="" border="0"/>
配置完成后,我们打开cms命令窗口,ping一下 www.demo.com 和 static.demo.com,可以看到 ping 的地址已经是 127.0.0.1.
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site10.png" src="/data/upload/article/20250115/1736950837594133.png" alt="输入图片说明" width="993" height="519" align="" border="0"/>
配置 nginx
nginx安装请参考官方文档。nginx.conf配置文件添加如下Server配置,修改完成后重启nginx。
server { listen 80; server_name www.demo.com; # PC站配置www.demo.com域名访问demo_pc目录 location / { ssi on; ssi_silent_errors on; ssi_types text/shtml; root D:/dev/wwwroot_release/demo_pc; index index.shtml index.html index.htm; } location ~ ^/(images|img|fonts|assets|js|css)/ { root D:/dev/wwwroot_release/demo_pc; expires 1d; } } server { listen 80; server_name static.swikoon.com; # 后台上传的资源文件访问统一代理到demo目录 location ~ ^/(resources)/ { root D:/dev/wwwroot_release/demo; expires 1d; } }
发布站点
在站点编辑页面点击 发布首页 按钮,提示发布成功后,我们到文件管理菜单查看发布通道目录,可以看到在发布通道目录 demo_pc 下已经生成了首页静态文件 index.shtml
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site11.png" src="/data/upload/article/20250115/1736950838545386.png" alt="输入图片说明" width="2560" height="1251" align="" border="0"/>
浏览站点首页
发布完成后,我们打开浏览器,访问 http://www.demo.com/
<img data-cke-saved-src="https://www.1000mz.com/docs/guide/site12.png" src="/data/upload/article/20250115/1736950838404041.png" alt="输入图片说明" width="1161" height="203" align="" border="0"/>
系统预览
后台预览地址:http://admin.1000mz.com
账号:demo / a123456
企业站演示地址:http://swikoon.1000mz.com
资讯站演示地址:http://news.1000mz.com(会员演示账号:xxx333@126.com / a123456)
图片站演示地址:PC端:http://tpz.1000mz.com 移动端:http://mtpz.1000mz.com
游戏站演示地址:PC端:http://game.1000mz.com 移动端:http://mgame.1000mz.com
影视站演示地址:PC端:http://movie.1000mz.com 移动端:http://movie.1000mz.com
码云地址:https://gitee.com/liweiyi/ChestnutCMS
官网地址:https://www.1000mz.com