# jforum2

#### 介绍
jforum2是基于jdk 11+ 开发的jforum. jforum的核心实体和业务接口将尽力保持不变, 实现代码将重新编写. 开发和编译使用Open JDK 11+。

![输入图片说明](https://images.gitee.com/uploads/images/2020/0512/095151_2706b720_351732.jpeg "在这里输入图片标题")

#### :tada: 分支说明

integration 分支使用ActiveMQ 来替换Master主分支的事件分发. 这样管理端触发的事件,前端可以订阅事件以作出相应的响应. 需要前后端都连接到同一个消息中间件地址上

###  :ghost: Redis说明

jforum2不像jforum哪样是一个单例的项目, jforum使用EhCache缓存即可以安全的工作, 但jforum2采用的多项目的分离设计,所以需要一个集中并可多项目共享的缓存. 这样的好处不言而喻，例：版主在管理端任命后前端即时可见！需要前后端都连接到同一个Redis地址上

#### 模块变更

1. 将decorater模块集成到attention模块,两者完成的工作是编码/解码图片, 编码/解码话题的内容

2. 核心模块的x.api集成到核心（x）模块中, 业务和持久化方法完全基于原核心模块中的实体, 核心模块中的持久实体不再含有其它对象(Album除外). 模板中显示需要的关联对象改用实体的复制版本来存储,例如:Topic中原来关联的Album,现在改由TopicReplica来存储,TopicReplica继承自Topic

3. strategy模块 和 com.apobates.forum.core.verify 整合为: core.security. 负责配置文件检查和实体权限检查

4. core.tag 和 core.tag.nlp模块合并为core.nlp

5. 原来utils模块中的com.apobates.forum.utils.ip包转移至event.utils模块中

6. 原Web模块(trident)分割为: thrones, thrones.admin. Web模块中的自定义jsp标签独立为：thrones.tag。 这样前端和管理端都可以依赖并使用

7. 原thumbnail模块更名为bucket.thumbnail


#### 表更新

1.  ActionEventDescriptor对象中新增属性: rodeMember, 用于会员积分计算时作主要依据。例管理员为张三的某话题加精, ActionEventDescriptor.rodeMember = 张三的ID(Member.id), 而ActionEventDescriptor.memberId = 管理员的ID(Member.id).  原来的ActionEventDescriptor.processed(和victim)不再使用

2.  MemberOnline对象新增属性: id(sessionId), memberNames(会员的登录帐号)。使用sessionId作主键可以记录游客. 而游客的memberNames(guest), memberNickname(Guest#hash(ip)). 在线记录采用间歇记录(每隔3分钟更新一次)，原来是每一次动作都记录

3.  不再需要 MemberContact 和 MemberRealAuthentication 对象

4.  Topic增加anony属性来区别是否匿名显示话题,true是,false不是


#### 功能改进

1.  图片的编码和解码都以单个连接为单位, 原来以一个整体为单位

2.  不再使用原utils模块中的Result改成jdk原生的Optional

3.  插件类话题创建时发布新的事件: PlugTopicPublishEvent, 用来区别不同渠道生成的话题

4.  增加H(ibernate)V(alidator)校验。管理端（thrones.admin）使用居多

5.  增加Spring-Session依赖. 项目不会自动创建S(pring)S(ession)相关的表结构.需要自已手动创建, 相关表的schema在thrones\src\main\resources\META-INF\spring_session.sql

6.  使用Quartz来实现计划任务(原因:前端和管理端都依赖member.impl.这样会导致两个项目同时在执行计划任务). 项目不会自动创建相关的表结构.需要自已手动创建, 相关表的schema在member.impl\src\main\resources\META-INF\quartz_mysql_innodb.sql

7.  更新MySql的驱动com.mysql.jdbc.Driver

8.  增加会员匿名发布话题.浅匿名.数据库中还是保留了会员信息.只是显示时转为匿名会员

9.  重构策略实现,并将api调用从控制器中剥离至StrategyInterceptorAdapter，控制器使用策略注解:@Strategy

10. ForumActionEnum增加新动作: POSTS_QUOTE(引用回复), POSTS_REPLY_FORM(快速回复表单)

11. 在线记录的插入时间缓冲, 不必每次会员操作都去更新在线表

12. 操作记录的缓存实现批量保存CoreModuleActionEventAspect.AbstractCubbyHole

13. ETC


####  其它修正

1.  由于标签模块(thrones.tag)修正模板中的自定义标签导入.

2.  部分实体的持久化由事务管理原子性, 例：TopicServiceImpl.create

3.  修正RSS的时间显示错误, 话题中回复的显示顺序, 内容中含有的图片不再懒加载

4.  CKEditorHightHandler文件名生成增加随机性

5.  会员信息的输出和积分计算重新实现

6.  修正样式错误. 例：相关话题条目显示的错位, 首页话题描述内容溢出容器

6.  话题标签重复(大小写)导致唯一约束，例:Map中App和APP为不同的Key,进入MySql后会导致唯一约束

7.  CommonControllerAdvice中异常输出时,ajax响应时带出http code

8.  收藏,点赞的本地缓存不再主动去拉取数据

9.  当方法的返回值可能产生null时改用Optional来避免null传递

10.  JDK API调用的更新.例:Map.of，Set.of, List.of;Collections.unmodifiable改为copyOf;头像代码的遍历改用Files.list

11.  ETC

