jfinal club 4.8 相对 4.2 的变化：
1：jfinal 升级到最新版本 4.8

2：jfinal undertow 升级到最新版本 2.0

3：文件上传组件 cos 升级到最新版本 2019.8

4：log4j 升级到 1.2.17

5：首页添加轮播广告组件

6：package.xml 中 fileSet 标签添加 lineEnding 子标签，解决不同平台下脚本复制换行的问题

7：分页向前、向后按钮改为大于小于字符

8：MyFeedbackService、MyProjectSevice、MyShareService 的 update() 方法添加
   remove("createAt")，避免 mass assignment 修改 createAt 值

9：fatjar 打包的 pom.xml 中的 shade 插件添加 filter，过滤掉 *.SF、*.DSA、*.RAS

------------------------------------------

jfinal club 4.2 相对 4.1 的变化：
1：jfinal 升级到 4.2

2：根据用户对 jfinal.com UI 的反馈，改进 html、css、js 细节，提升用户体验

3：首页、分享、反馈、动态列表中的 h1 改为 div， 否则在浏览器渲染的时候，如果电脑当时很慢
   会首先显示很大的 h1 字体，然后才变成小字体


------------------------------------------


jfinal club 4.1 相对 4.0 的变化：
1：jfinal 升级到 4.1

2：大量调整 html、css、js 提升用户体验，例如：文档页面左侧菜单及脚本被大幅调整

3：所有 findByCache、findFirst、paginateByCache 由 getSqlPara 模式
   改为 template(...) 模板模式
   
4：JsoupFilter 过滤 a 标签 href 中的 javascript 脚本，加强 XSS 防范

5：JsoupFilter 开启 html 5 的 video 标签，方便在文章中插入视频

6：Project、Share、Feedback 在 configEngine 中添加 me.addSharedObject(...)，
   便于在页面使用 field 表达式代替 static field 表达式，例如：
   Project.REPORT_BLOCK_NUM
   可改成下面的形式，进一步节省代码量
   com.jfinal.club.common.model.Project::REPORT_BLOCK_NUM
   
   ---> 注意：Model 的 field 表达式读取字段的功能，最低 jfinal 4.0 版本才开始支持

7：后台 html 页面中 Project、Share、Feedback 的 static field 表达式改为 field 表达式


------------------------------------------


jfinal club 4.0 相对 2.0 的变化：
1：升级到 jfinal 4.0，去除 cglib/asm 依赖

2：前台 UI 全部替换，改进文档频道用户体验

3：控制层与业务层的依赖全部改成 @Inject

4：Validator 中改用 setRet(..) 与 render(getRet())，使得 js 中的代码统一，减少大量代码

5：优化部分 sql

6：AdminAuthService、PorjectService、ShareService、FeedbackService 中使用 jfinal 4.0
  新提供的 template(...) 方法，节省大量代码，例如：
  	Db.template("admin.auth.isSuperAdmin", accountId).queryInt();


------------------------------------------


jfinal club 2.0 相对 1.9 的变化：
1：jfinal 升级到 3.8

2：jfinal undertow 升级到 1.6

3：升级前端 UI （TODO）

4：configConstant(...) 添加配置 me.setInjectSuperClass(true)，支持超类依赖注入

5：生成器添加配置 gen.setGenerateRemarks(true) 为 base model 生成备注

6：all_sqls.sql 改名为 _all_sqls.sql，修改 JFinalClubConfig 相应配置

7：start.sh、stop.sh、restart.sh 合并为 jfinal.sh，添加 stop.bat

8：JFinalClubConfig 中的
    PropKit.use(dev.txt).appendIfExists(pro.txt)
    改为
    PropKit.useFirstFound(pro.txt, dev.txt);
    也即由生产环境配置追加模式改为生产环境配置整体代替模式


------------------------------------------

jfinal club 1.9 相对 1.8 的变化：

0：jfinal 升级到 3.6，避免客户端中途断开连接时抛出异常，日志文件会很干净。还包括很多其它改进与优化

1：jfinal undertow 升级到 1.5，解决 session 热加载问题

2：DocumentAdminService 、DocumentAdminController 的 findById 改成 findByIds

3：MessageController.friend() 添加 null 值判断并 renderError(404)

4：log4j.properties 日志文件存放添加 log 子目录，保持项目根路径干净清爽

5：JFinalClubConfig 中的 afterJFinalStart() 改名为 onStart()

6：stop.sh 三处 beforeJFinalStop() 改为 onStop()。添加 kill -9 有关注释

7：AccountService.getUsefulById(...) 添加 null 值判断

8：fastjson 升级到 1.2.55，支持 Page 反序列化（需要 jfinal-3.6 支持）

9：_Generator 中添加 setGenerateRemarks(false) 配置

10：添加配置：undertow.resourcePath=src/main/webapp, classpath:webapp

11：fatjar 打包配置文档修改主两处错误


------------------------------------------

jfinal club 1.8 相对 1.7 的变化：

0：jfinal-undertow 升级到 1.3

1：pom.xml 中添加 maven-jar-plugin 插件，避免 src/main/resources 下的配置文件打入 jar 包
   好让 config 目录下配置文件生效，否则 config 中与 jar 包内的同名配置文件将不会生效

2：package.xml 中过滤掉对 web.xml、WEB-INF 的复制，jfinal-undertow 不需要 web.xml

3：更新 undertow-config-demo.txt，添加 jfinal-undertow-1.3 新增功能配置

4：添加 restart.sh 重启脚本

5：改进 ImageKit，解决 png 转 jpg 背景颜色改变的问题，感谢 @步步(讯) 的贡献

6：jfinal-club-1.8.sql 中的 role、permission、account_role、role_permission
   表的 charset 由 utf8mb4 改成 utf8，解决老版本 mysql 无法导入问题

------------------------------------------

jfinal club 1.7 相对 1.6 的变化：

0：添加  "doc/___极速打包部署.txt" 说明文件

1：pom.xml 中删除 jetty-server 依赖

2：pom.xml 中添加 jfinal-undertow 依赖，从 jetty 切换到 undertow

3：pom.xml 中添加 maven-assembly-plugin 打包插件，根目录下面添加 package.xml 打包配置 

4：根目录下面添加 start.sh、stop.sh、start.bat 启动脚本

5：JFinalClubConfig 中 JFinal.start(...) 改为 UndertowServer.start(...)

6：配置 文件 jfinal_club_config_dev.txt 的下划线改为减号

7：添加 undertow.txt 配置文件

8：修改 jfinal-club启动必读.txt，去除与 jetty 有关的一切内容

总述：jfinal-club 1.7 项目自身未做任何改动，所有变化围绕从 jetty-server 切换到
    jfinal-undertow
    
    jfinal-undertow 不仅启动极为迅速，热加载响应十分快捷，更重要是开发、打包、部署、运行
            完全不用对项目或者配置有任何改动，从而实现从开发到部署的极致快捷

------------------------------------------

jfinal club 1.6 相对 1.5 版本的主要变化：

1：jfinal 升级到 3.5，pom.xml 中的 JDK 编译级别升为 1.8

2：jetty-server 升级到 jetty-server-2018.11，该版本的 JDK 最低要求为 1.8

3：JFinalClubConfig 中配置 me.setInjectDependency(true) 启用最新的 Aop
   模块功能，免去业务层 AOP 必须手动 enhance 的步骤，免去业务层维护单例的样板式
   代码，例如:
       public static AccountService me = new AccountService();
  
  注意：为了节省改动时间，现只先修改了后台管理模块的 AOP 使用方式。
       此外，对于工具类的业务使用原有的 public static Xxx me 模式
       比 @Inject 更加方便，同理，对于全局多处依赖的业务也如此，
       例如：AccountService

4：添加文档管理模块，方便同学们使用 jfinal club 二次开发属于自己的带文档的社区

5：添加 @Remark 注解用于一键同步时向 permission 表的 remark 字段添加内容(该字段有内容时跳过)
   详细用法请见 DocumentAdminController.java

6：账户管理添加 "查看后台账户/管理员" 功能，便于查看后台都有哪些账户被分配了角色，在对账户误操作分配了角色时，
   也便于取消角色分配

7：模板文件 "/_view/admin/common/_menu.html" 之中添加了 #permission 指令 "细粒度" 
   控制菜单的示例,以及 #role 指令 "细粒度" 控制菜单的示例。缘于很多同学在问如何 "细粒度"
   控制菜单权限的问题，jfinal club 细粒度控制菜单不需要添加后台代码，只需要事先在需要控制
   的菜单那里用 #permission 与 #role 指令事先埋好点即可，权限控制的行为与后端完全一致，
   前后端权限使用同一套逻辑，避免发生前后权限逻辑的死角、遗漏、不一致性

8：pom.xml 中添加 jetty-maven-plugin 插件，方便习惯于使用该插件的人启动并开发项目，启动项目只需
   在控制台输入： mvn jetty:run
   这种启动开发项目的方式也支持热加载，使用该启动方式可以去掉对 jetty-server 项目的依赖。
   相对于 jfinal 官方提供的启动方式控制台输出信息较多较杂，启动速度慢，绝大多数情况建议
   使用 jfinal 官方的启动方式

9：pom.xml 中添加 slf4j-nop 依赖避免在开发阶段启动项目时输出的 INFO 干扰信息，控制台从此特别干净清爽


10：reply.html 页面的 title、content 的输出使用 #escape() 指令，避免出现页面格式混乱

11：左侧首页菜单图标改为 fa-home，美观且符合度更高

12：BaseController 中添加 _clear_()

13：BaseController 中的 @Before(NotAction.class) 改用 @NotAction

14：启动方法统一使用 JFinal.start("src/main/webapp", 80, "/", 5)，jfinal 3.5 已支持 IDEA

15：删掉 MyClassPathSourceFactory、MyClassPathSource，jfinal 3.5 已改进过 ClassPathSource

16：删除 com.jfinal.club.common.aop 包，改为使用最新版本 jfinal 3.5 的 aop

17：jdbcUrl 配置中添加 useSSL=false，避免使用高版本 mysql 时，控制台输出干扰开发的无用 INFO 信息

18：删除 JFinalClubConfig 中用于 IDEA 的启动代码以及相关所有注释说明，jfinal 3.5 已支持 IDEA 以及
    所有 eclipse 版本

19：pom.xml 中的 maven-compiler-plugin 插件参数添加 -parameters 配置，便于二次开发中使用 action 带参
    eclipse 相关编译配置见文档：http://www.jfinal.com/doc/3-3

---------------------------------------------------

jfinal club 1.5 相对 1.4 版本的主要变化：

1：项目管理、分享管理、反馈管理添加创建功能

2：分享管理、反馈管理模块添加回复管理功能

3：账户管理添加更换头像功能

4：权限管理的权限列表识别不存在的 action，并给出操作提示

5：授权管理添加 AdminAuthKit，支持 #if(hasPermission(...) ... #else ... #end 以及
#if(hasRole(...) ... #else ... #end

6：改进 ImageKit，移除对于 com.sun 包下的图片处理 API 依赖，更好支持 jdk 7/8

7：将 Switchery 组件换成 magic input 组件
   a：在 __admin_layout.html 中引入 magic input 的 css 文件，删除 Switchery 的 css 与 js 引用
   b：升级 jfinal-admin.js 中相关的 init 方法
   c：将 checkbox 组件的 class="js-switch" 样式改为 class="mgc-switch mgc-tiny"
      并将 initSwitchery() 方法名改为 initMagicInput()，并去掉第二个参数

8：修改页面提交以后返回到当前记录所在的页，老版本总是返回到第一页

9：RoleDirective.hasRole(...) PermissionDirective.hasPermission(...) 重构至 AdminAuthService

10：RoleDirective、PermissionDirective 中获取 loginAccount 的方式改为从 scope 中获取

11：重构 PermissionDirective、RoleDirective，代码更简洁

12：删掉 admin_role.sql 与 admin_permission.sql ，其中的 sql 转至 admin_auth.sql

13：删掉 all_sqls.sql 中对 admin_role.sql 与 admin_permission.sql 的 #include 包含

14：角色管理的 add、edit、_form 三个页面合并为 add_edit.html

15：UploadController 中的 renderJson(ret) 改为 render(new JsonRender(ret).forIE())
   防止 ueditor 图片上传功能在 IE 下出现文件下载现象

16：$.pjax.defaults.timeout = 1500; 改为 5000

17：后台管理菜单颜色的  #ffffffb3 改为 hsla(0,0%,100%,.7)，支持老版本 IE

18：其它打磨

升级建议：由于 jfinal club 1.5 打磨的地方比较多、比较细、也很重要，升级建议以 jfinal club 1.5 为基础，
        将已经基于 jfinal club 1.4 做的项目中的自己写的代码重新整合到 jfinal club 1.5 中去。
        二次开发产生的 js、css 代码要写到新建的文件中去，然后在 layout 中引用，这样有利于将来升级

        此外，permission 表中的内容有所增加，升级完以后需要进入权限管理进行"一键同步"，最后按个人需求
        为角色分配相应的权限即可

---------------------------------------------------


jfinal club 1.4 相对 1.3 版本的变化：

1：升级到 jfinal 3.4

2：后台管理功能全部重写，添加内容管理、账户管理、角色管理、权限管理等功能

3：后台管理界面全部重写，手写骨架，右下角内容区域使用 bootstrap 3，方便进行二次开发
   二次开发基本只需要照猫画虎，添加右下角内容区域代码

4：添加 #role #permission 指令，用于在界面控制权限

5：其它一些细节变化将在直播中讲解，会有更深刻的了解


注意：后台管理功能看似简单，其实里头很多细节，采用极简设计，尽可能消除学习成本和二次开发成本
      后台管理源代码与功能将会在直播中详细讲解


---------------------------------------------------


jfinal club 1.3 相对 1.2 版本的变化：

1：升级到 jfinal 3.3

2：JFinalClubConfig 中加载配置文件由 try catch 改为使用 PropKit.appendIfExists(...)

3：ShareController、FeedbackController、MessageController、NewsFeedController
    中的 renderToString(...) 的模板去掉路径

4：sql 管理功能使用 ClassPathSourceFactory 来做，从类路径里头加载

5：mysql 驱动升级到 5.1.44 版本

注意：jf club 1.2 已经处理过 Ret 类的升级，从 1.2 升级到 1.3 只需要关注上述五条
    doc 目录下面的三个 png 图片文件，仅用于指导更老的版本升级到 1.2 或 1.3

---------------------------------------------------


jfinal club 1.2 相对 1.1 版本的变化：
1：jfinal 升级到 3.2 版本
2：文件上传组件 cos 升级到 2017.5 版本
3：UploadController 捕获 ExceededSizeException 异常，更好处理上传文件长度超出范围
4："/upload" 路由改为 "/common/upload"，修改 ueditor 相关配置指向新路由。此改进主要为了 nginx 配置方便
       避免与 "webapp/upload" 的配置产生影响，减少 nginx 配置量
5：查找替换 html 文件中的 22 处 ret.isOk 为 ret.state == "ok"
6：查找替换 html 文件中的 4 处 ret.isFail 为 ret.state == "fail"
7：查找替换 js 文件中的 11 处 ret.isOk 为 ret.state == "ok"


建议大家升级自己项目 Ret 的方式为：
1：利用查找替换功能将 html 与 js 中的 ret.isOk 替换为 ret.state == "ok"
2：利用查找替换功能将 html 与 js 中的 ret.isFail 替换为 ret.state == "fail"


如果项目未涉及到 Ret 生成的 json 数据则不需要处理，java 代码中的
ret.isOk() ret.isFail() 行为并无变化，不需要处理


如果觉得上述升级方式比较麻烦，可以在项目启动时调用一次 Ret.setToOldWorkMode()
可以继续沿用老版本的工作模式，这种升级方式比较适合不需要怎么改动的老项目

