1. 企业版、政务版
1.1. 企业版、政务版没有store入口
在后续的企业版和政务版中我们取消了store功能,相关代码如下所示。
store主要面向开源版本和开发版本,企业版及政务版的数据结构和开源版有差异,会使得其数据结构被store中某些插件下载时执行的DDL语句破坏。
因此建议使用开源版本进入store下载模板然后再导入到企业版和政务版中。
1.2. 模板(有演示站的)导入企业版或政务版的步骤
[!tip] 从开源版本升级到企业版、政务版,可以通过分享插件迁移文章、栏目、模板等相关数据
- 数据备份,导入会删除(当前站)所有的文章、栏目、自定义相关数据;可以手动备份数据和模板相关资源,或者通过分享插件备份
- 通过开源系统后台安装分享插件,在菜单管理中找到Store分享,然后复制菜单json,然后将这个菜单json在政务版导入;怎么进MStore?
- 在开源MCMS仓库的pom找到store-client依赖并添加到企业版或政务版的pom中
- 没有站群忽略这步,有站群并且是站群配置是开启的,需要在mdiy_model表中添加APP_ID字段,导入完成后移除APP_ID字段即可
sql 这里以mysql为例 ALTER TABLE `mdiy_model` ADD COLUMN `APP_ID` bigint(19) NULL AFTER `NOT_DEL`
- 企业版本需要增加这一步,政务版本忽略;需要执行sql,这里以mysql为例
ALTER TABLE `cms_content` ADD COLUMN `CONTENT_STYLE` varchar(255) NULL AFTER `DEL`; -- 导入完后 执行下面的sql移除 ALTER TABLE `cms_content` DROP COLUMN `CONTENT_STYLE`;
- 启动企业版或政务版,导入分享菜单,将在开源导出的zip文件导入(注意备份文章、栏目表数据)
- 删除Store分享菜单,移除store-client依赖
[!tip] 导入时,默认导入模版类型字典的第一个值,要确保导入正确,可以让模版类型字典只保留一个值,这样能确保导入到对应字典的站点风格中
1.3. 代码更新
首先第一次下载源代码之后,请务必通过git仓库管理好下载的源代码,平台不定期会更新订单中的代码,如遇到技术专员提示升级代码,可以通过当初平台绑定的订单信息下载最新的源代码,直接覆盖本地的代码,再通过仓库比对的方式进行查看更新的部分。
1.4. 插件依赖
平台选配的插件通过沟通群技术单独提供,包括插件的sql文件、菜单json、源代码。
组织机构为例:
将插件文件夹直接复制到工程目录里面
1.4.1. 修改/pom.xml与/ms-mcms/pom.xml 增加插件依赖
[!tip] 如果还存在页面404问题,请重新编译项目重启,推荐使用默认maven配置以及mvn命令行重新编译,避免ide环境问题导致编译失败
1.4.2. 初始化数据
- doc/ddl.sql 表机构
- doc/init.sql 初始化数据,插件依赖的初始化数据
- doc/data.sql 演示数据,如果不需要可以不执行
- doc/organization.json 菜单json,复制json直接在菜单导入
[!tip]doc下面文件具体每个插件数量不一样,具体以提供的为准
1.4.3. 版本比对
推荐用户下载代码后直接发布到自己的git仓库,后续下载代码覆盖本地与git仓库进行代码比对。数据库的更新比对方式,可以通过创建新的数据并导入最新SQL脚本,通过Navicat进行结构比对。
1.4.4. 更新父pom.xml
- modules 增加
<module>ms-morganization</module>
- dependencies 增加依赖
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>ms-morganization</artifactId>
<version>${ms.version}</version>
</dependency>
1.4.5. 更新ms-mcms\pom.xml
dependencies 增加依赖
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>ms-morganization</artifactId>
<version>${ms.version}</version>
</dependency>
1.5. 后台页面404、模板管理读取不到模板文件、模板上传到错误路径等
排除方法:设置working directory
[!tip]单项目多模块下启动时候必须设置
Working directory
目录(MSApplication.java
所在模块的目录,这里是D:\work\gov\ms-mcms
),然后重启项目。
检查ms-mcms/pom.xml
配置,注释掉排除配置
1.6. 屏蔽堆栈打印信息
屏蔽上面的堆栈信息 设置后 页面不再输出堆栈信息 是空白页
1.7. 设置异常信息
避免异常信息中暴露库表结构
1.8. 设置sql注入异常提示信息
1.9. 修改密码
通过控制台打印的信息,获取当前输入密码的加密结果(验证码要正确输入)
1.10. 生成文章内容为空
一般是缓存数据被清空导致,先点击清空缓存
,再点击刷新缓存
[!tip]系统非正常重启都会导致缓存丢失,例如:linux下通过kill 结束进程,通常推荐重启系统之后都需要重新缓存一下
1.11. 快速去掉铭软相关标识与引导信息
点击 系统设置
下的 后台UI配置
,可以快速设置登陆界面、后台logo、后台的信息提示
[!tip]如需要隐藏表单上的引导信息,可以通过关闭
隐藏信息提示
达到效果
1.12. 政务版 发布到 功能
在多皮肤的基础上增加了发布到,可以实现例如 内网数据只在内网显示、外网只在外网显示。
需要栏目绑定好列表详情模板
[!tip]如果修改了字典
模版类型
的数据,需要应用设置
更新保持,栏目
模版,文章的发布到
进行更新同步
1.13. 需要将静态文件同步到另外一台服务器使用(后台访问的地址与前台用户访问页面地址不一致)
由于{ms:global.url/}
或{ms:global.host/}
都是会获取后台系统的实际地址,导致部署的时候页面中存在http://xxx
这种绝对地址,如果静态化后的页面需要分发到其他服务器或访问地址不一致,统一去掉模版中的{ms:global.url/}
和{ms:global.host/}
标签,改用html/{ms:global.template/}
方式。同时需要将模版文件夹template
与static
目录也同步到服务器
1.14. 政务版 企业版 停用默认账号
先登陆后台通过默认msopen
账号创建一个账号,再在安全设置
->账号安全
中禁用默认账号角色
1.15. 数据量大静态化慢
如果因为数据量大导致静态化慢,可以把栏目列表模版修改为异步请求大方式获取,这样就可以减少栏目列表页面的生成。
<!--列表-->
<ul>
<li v-for="content in contents">
{{content.title}}
</li>
</ul>
<!--分页-->
<el-pagination background @current-change="handleCurrentChange" :page-size="pageSize" :current-page.sync="pageCur" layout="prev, pager, next, jumper" :total="pageTotal"></el-pagination>
<script>
var app = new Vue({
el: '#app',
data: {
//当前页数
pageCur: 1,
//每页文章条数
pageSize: 20,
//页数总数
pageTotal: 0,
contents: [],
},
methods: {
handleCurrentChange: function(val) {
this.list(val)
},
list: function(pageNo) {
var that = this
ms.http.post('/gov/cms/content/list.do ', {
typeid: '${field.typeid}',
pageSize: that.pageSize,
pageNo: that.pageCur,
orderby: 'date',
order: 'desc',
style: 'insite',
}).then(function(data) {
if (data.result) {
that.contents = data.data.rows
that.pageTotal = data.data.total
}
})
}
},
mounted: function() {
this.list()
},
})
</script>
1.16. 自动静态化
启用开关,在涉及到文章变动如新增修改删除分发等情况下,会自动静态化首页、相关栏目页、文章详情页。
[!tip]生产环境推荐开启此功能,可以不用手动静态化页面。自动静态化地址必须和当前浏览器地址一致,否则静态化不成功,如何更改URL地址
1.17. 多皮肤
不同的皮肤在html
文件夹下会生成对以模版
名称命名的文件夹,例如:html/a模版 、html/b模版
1.18. 因防火墙、安全狗、WAF之类的过滤导致文章保存失败
如果本地开发环境保存没有问题,上线部署后产生了发布文章的数据不完整(例如大于多少文字后无法保存),建议检查环境配置,如果没有防火墙、安全狗、WAF之类的配置,再检查一下容器是否限制了传送数据的长度,下面以东方通为例截图:
1.19. 从外部导入数据到内容表时,注意需要初始化的字段,否则会导致无法静态化
[!tip] 数据的默认值以系统新增文章的数据为主。
content_type 不能为NULL ,如果为空应该为空串
content_display 不能为NULL, 应设置为默认0
del 默认0
category_ids 不能为NULL,这里记录着文章所有的父栏目ID
content_style 不能为NULL,这里关系到静态化生成目录,如果为空不会生成静态文件
progress_status 应该默认为 终审通过
has_list_html、has_detail_html 应为0(未被静态化标识)
导入数据后需要重启服务并在静态化重新刷一下缓存或在缓存管理删除缓存并重新缓存
注意content_img字段的格式,格式不对会导致回显失败!
[!tip] 外来文章迁移进系统时应该同步到缓存及es中,在保存成功后回调缓存文章方法及es同步文章方法。
1.20. 大文件上传
大文件上传推荐第三方专业存储平台,如七牛云存储,如果上传文件到服务器可以考虑直接ftp上传
1.21. 静态化提示后台正在静态化问题
1.开发环境检查模板可以适当减少文章数据量,手动生成时不必多次点击,后台会一直执行程序。
2.线上环境请开启自动静态化,具体操作参考本页面 '自动静态化' 问题。
[!tip] 静态化是多线程操作,多次点击会消耗大量线程,点击生成一次就可以,后台会持续生成静态文件直至结束
1.22. 动态静态化读取模板有误
1.动态静态化作用主要是让开发者快速调整模板,不需要去手动静态化查看修改模板后的效果,在生产环境建议不要开启!
2.动态解析会默认读取自定义字典里模板类型的第一个,排序不对会导致错误选择模板类型。皮肤风格会选择第一个模板类型对应的在应用设置里绑定的皮肤风格,确认都无误后再在静态化配置里开启动态静态化解析,通过ip+/mcms/index.do的方式访问。
1.23. 政务版过期时间说明
gov的session过期时间以后台配置(安全设置 > 账号安全 > 会话超时)的标准,yml的配置会被后台配置覆盖
1.24. 政务版重置密码错误次数
成功登录或者重启服务可以重置密码错误次数; 密码错误次数用尽导致账号被锁定,可以重启服务解锁账号,修改配置表中timeout无效; 修改密码请参考
1.25. 静态化进度条一直100%
一般是有栏目没有绑定模板导致后台一直请求,推荐先给栏目绑定好模板或选择已绑定模板的栏目进行静态化
1.26. 修改加密算法后登录失败
修改加密算法后会使管理员密码失效,更改后需第一时间按以下步骤进行操作:
1.在管理员管理界面修改一名其他超级管理员的密码,
2.重启系统,
3.用已修改的超级管理员登录,恢复其他管理员密码数据。
[!tip] 尽量在拿到代码时确定使用的密码加密方式,避免修改加密算法,同时修改安全设置的权限避免给到普通管理员。
1.27. 如何实现免密登录
在一些二次开发的场景中,会有不需要本系统登录业务的情况,对接上其他系统的登录业务并能完整使用本系统的功能; 在其他系统登录成功之后,调用本系统的接口(自行新增):
ManagerEntity manager = managerBiz.getByManagerName(username);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken upt = new UsernamePasswordToken(manager.getManagerName(), manager.getManagerPassword(),rememberMe);
subject.login(upt);
还需要将密码匹配器ManagerLoginMD5CredentialsMatcher
和ManagerLoginSM4CredentialsMatcher
两个类的doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info)
方法的一段业务代码注释;
ManagerLoginSM4CredentialsMatcher
boolean matches = false;
//国密
SimpleAuthenticationInfo _info = (SimpleAuthenticationInfo) info;
UsernamePasswordToken _token = (UsernamePasswordToken) token;
//判断用户账号和密码是否正确
SymmetricCrypto sm4 = SmUtil.sm4(SecureUtils.getSalt(_manager.getManagerName()).getBytes());
String tokenCredentials = sm4.encryptHex(String.valueOf(_token.getPassword()));
Object accountCredentials = getCredentials(info);
LOGGER.debug("国密:{}", tokenCredentials);
// 将密码加密与系统加密后的密码校验,内容一致就返回true,不一致就返回false
matches = equals(tokenCredentials, accountCredentials);
ManagerLoginMD5CredentialsMatcher
boolean matches = super.doCredentialsMatch(token, info);
从截出片段开始往下所有代码都注释掉,这样就避免了在其他系统登录校验后进入本系统还校验密码失败的情况.
上述办法比较高效,但缺点是会影响本系统的账号密码登录功能,可以自定义一个密码匹配器继承HashedCredentialsMatcher,实现方法并根据不同的业务场景来区分是密码登录还是其他系统的免密登录; 这里可以自定义登录令牌继承UsernamePasswordToken,利用自定义的令牌来区分是否是免密登录;最后在ShiroConfig中换上自定义的密码匹配器即可.
1.28. 如何切换缓存类型为Redis
1.在yml配置中type改成redis
2.放开redis配置注释
3.配置自己正确的redis链接配置
4.若需要使用redis共享session,要在ShiroConfig中将部分注释的代码放开(有多处代码需改动,需注释上一行代码启用红框代码),示例如下
ShiroConfig:securityManager,defaultWebSessionManager,singleSessionControlFilter
1.29. 文件上传失败问题
模板上传失败或者其他文件上传失败,通常都是有文件上传配置中未声明的文件类型如js、txt等;通过提示把文件类型添加到文件上传配置的文件上传类型限制中
zip压缩时,需要选择 ‘存储‘ 方式进行压缩,否则由于压缩算法不同也可能导致上传失败。参考 上传模板
1.30. 更新自定义配置模型的Json数据
需要更新自定义模型,有两种方式。可以直接在原项目的基础上进行修改。保存之后重新进行导入即可。如果没有原项目,可以拖一个和原先模型命名一致的表单。且标题和字段名和原模型一致。
1.31. 通过绑定内外网模板,不能限制内外网访问
设置内外网模板后,并非直接绑定内外网。通过模板配置,可以生成两套不同的样式和皮肤。在不同的目录下,以内外网模板命名静态化生成两套页面。栏目绑定对应模板,通过选择文章发布到,可以区分文章生成的位置。如果需要内外网配置,需要服务器允许且配置。例如允许外网IP访问其中某一个文件夹。
[!tip内外网不能使用同一个模板,]如需使用同一个模板,也需要区分模板名称。如果未使用内网模板,可以不进行设置。
1.32. 静态化页面只显示当前模板绑定的风格
- 在自定义字典中,找到模板类别,将不需要展示风格的字典设置为不启用,保存并刷新缓存
- 应用设置进行保存并刷新缓存
1.33. 附属栏目只显示于当前子栏目
发布文章可勾选附属栏目,文章会同时显示于附属栏目之中,并参与分页。但是附属栏目只支持选中的栏目,其父栏目之中不显示此文章。
1.34. 文章新建、审核、发布的流程说明
1.34.1. 文章新建:
角色需要分配文章管理的文章新增权限,并且在栏目权限管理中分配具体拥有哪些栏目的权限,分配好后该角色即可在这些具体栏目下发布新文章。
1.34.2. 审核:
需要开启审核开关,并且给具体栏目配置完整审批,否则在未配置的栏目下发布的新文章不会进入审批流程。
配置时,每个审批节点至少勾选一名角色,为确保审批流程中这篇文章能正常走到终审节点,漏勾选的数据会被认为是不合法的。
上述配置完成后,该栏目发布的新文章将会是草稿状态,提交审核会进入待审文章等待审核,管理员可以进入待审文章界面对文章进行审核。前提是该栏目的审批配置中某个审批节点勾选了该管理员所属角色,并且角色拥有提交审核、审批等相关权限。
支持设置不同审批级别:审批设置相同的角色,就能实现审批跳级;如 一、二审设置同一角色,该角色审批通过后,直接进行三审; 如果想要对节点个数进行新增或者删除,先清空审核配置;
1.34.3. 发布:
文章发布到网站需要进行静态化操作,静态化只会选择“终审通过”以及被允许显示的那些文章。
若开启自动静态化,则文章审核通过后会自动发布到网站。如果是手动静态化,则角色需要有相关权限。
[!tip] 栏目不支持自动静态化,新增或更新栏目不会自动静态化栏目
1.34.4. 关于审批的角色配置:
一个角色可以对文章进行审批,需要拥有的权限:内容管理中的待审文章权限
审批配置中对应栏目要细分勾选角色的审批权限;
如果需要对一个角色对其进行授权配置:
- 新建一个角色,拥有审批权限,以及栏目权限管理中的栏目权限。且对应建立此角色的管理员。
- 在栏目权限管理中,对此角色添加栏目对应权限。
- 在审批配置中,对此栏目进行配置勾选。
- 打开审批开关。
1.34.5. 定时发布
新增文章时设置发布时间配合定时调度能够实现文章定时发布功能
注意:发布时间按天计算,只能预发布明天及以后的文章 定时调度配置每天凌晨执行静态化首页、栏目、文章
1.34.6. XSS过滤配置
在稳定后上线前,建议把XSS过滤配置中的拦截路径调整好,删除有关/ms/**
,/**
此类路径。
[!tip] 由于自定义会有动态修改表的操作和关键字,如果上线后仍需要使用自定义相关功能,建议加上/ms/mdiy/**的配置
1.34.7. 文件上传路径不符合预期
多次上传同一张图片时,后续的上传将直接引用第一次上传时系统产生的路径;更换图片不会影响其他地方对该图片的引用;
1.34.8. 进入缓存管理异常
1、如果缓存管理使用的是redis,检查redis连接是否正常 2、如果是开启集团站群的情况,首先站群配置中关闭站群,然后缓存管理清空缓存;再开启站群,缓存管理中刷新缓存;建议开发阶段确定是否要使用站群避免此情况!
1.34.9. 数据库版本
默认按照readme配置 如 dm数据库 默认mysql database-id指定mysql
1.34.10. 应用设置没有模板设置
字典管理处 编辑、保存一下模板类型字典
1.34.11. 给角色分配权限后,仍提示没有权限
- 审批日志, 需要审核配置 进度日志的查看权限
- 统计管理 管理员工作量统计 额外需要管理员的查看权限
1.34.12. 登录显示密码最大使用天数
- 更换浏览器或者使用当前浏览器无痕登录
- 点击右上角提示信息X,重新设置密码后,再次登录
[!tip] 如想延迟密码最大使用天数,请在后台安全设置设置合理时间