# ************************************************************ # Sequel Pro SQL dump # Version 4541 # # http://www.sequelpro.com/ # https://github.com/sequelpro/sequelpro # # Host: 127.0.0.1 (MySQL 5.7.20) # Database: jfinal_club # Generation Time: 2018-09-01 09:11:17 +0000 # ************************************************************ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; # Dump of table account # ------------------------------------------------------------ DROP TABLE IF EXISTS `account`; CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nickName` varchar(50) NOT NULL, `userName` varchar(150) NOT NULL, `password` varchar(150) NOT NULL, `salt` varchar(150) NOT NULL, `status` int(11) NOT NULL, `createAt` datetime NOT NULL, `ip` varchar(100) DEFAULT NULL, `avatar` varchar(100) NOT NULL, `likeCount` int(11) NOT NULL DEFAULT '0' COMMENT '被赞次数', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `account` WRITE; /*!40000 ALTER TABLE `account` DISABLE KEYS */; INSERT INTO `account` (`id`, `nickName`, `userName`, `password`, `salt`, `status`, `createAt`, `ip`, `avatar`, `likeCount`) VALUES (1,'JFinalClub','test@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-18 09:00:19','175.12.244.105','0/1.jpg',999), (2,'伽利略','test1@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-19 10:19:11','175.12.244.105','0/1.jpg',0), (3,'牛顿','test2@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-20 10:05:08','175.12.244.105','0/1.jpg',0), (4,'爱因斯坦','test3@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-21 12:20:15','175.12.244.105','0/1.jpg',0), (5,'银河系','test4@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',-1,'2018-04-22 09:20:18','175.12.244.105','0/1.jpg',0), (6,'极速开发','test5@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-23 10:20:35','175.12.244.105','0/1.jpg',0), (7,'enjoy','test6@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-23 11:20:31','175.12.244.105','0/1.jpg',0), (8,'jfinal','test7@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-24 12:20:53','175.12.244.105','0/1.jpg',0), (9,'俱乐部第一美女','test8@test.com','a1f0917284a75c2c45dfeefd9040ce01144407c1a33d1bc3c45153ceb9d12d72','zmxyyZJkE-N6JjRhujp6U8l4Yu7vuQDZ',1,'2018-04-25 09:58:19','175.12.244.105','0/2.jpg',0); /*!40000 ALTER TABLE `account` ENABLE KEYS */; UNLOCK TABLES; # Dump of table account_role # ------------------------------------------------------------ DROP TABLE IF EXISTS `account_role`; CREATE TABLE `account_role` ( `accountId` int(11) NOT NULL, `roleId` int(11) NOT NULL, PRIMARY KEY (`accountId`,`roleId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `account_role` WRITE; /*!40000 ALTER TABLE `account_role` DISABLE KEYS */; INSERT INTO `account_role` (`accountId`, `roleId`) VALUES (1,1), (4,4), (6,3), (7,2), (8,1), (9,4), (9,5), (9,6), (9,7); /*!40000 ALTER TABLE `account_role` ENABLE KEYS */; UNLOCK TABLES; # Dump of table auth_code # ------------------------------------------------------------ DROP TABLE IF EXISTS `auth_code`; CREATE TABLE `auth_code` ( `id` varchar(33) NOT NULL, `accountId` int(11) NOT NULL, `expireAt` bigint(20) NOT NULL, `type` int(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table document # ------------------------------------------------------------ DROP TABLE IF EXISTS `document`; CREATE TABLE `document` ( `mainMenu` int(11) NOT NULL COMMENT '主菜单', `subMenu` int(11) NOT NULL COMMENT '子菜单', `title` varchar(300) NOT NULL, `content` text NOT NULL, `updateAt` datetime NOT NULL, `createAt` datetime NOT NULL, `publish` tinyint(2) NOT NULL DEFAULT '0', PRIMARY KEY (`mainMenu`,`subMenu`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `document` WRITE; /*!40000 ALTER TABLE `document` DISABLE KEYS */; INSERT INTO `document` (`mainMenu`, `subMenu`, `title`, `content`, `updateAt`, `createAt`, `publish`) VALUES (1,0,'前言','
1:版本说明
2:术语约定
3:最佳实践
4:
','2016-09-27 16:08:48','2016-09-25 16:40:09',1), (1,1,'概要',' 社区文档频道将提供全面、权威、最新的开发文档,文档内容将随着项目发展、用户反饭不断进化、更新,建议以在线的形式查阅,保障始终获取到的信息是最新最权威的
JFinal 文档频道版权归 JFinal 社区所有,未经许可不得转载
扫描下方二维码关注 JFinal 官方公众号,获取社区最新动态
文档内容将会不可避免的反复用到相同的名称、代码等,为了使文档内容简短、精要,所以在此对一些常用术语进行约定,这些约定无需记忆,了解即可
约定 AppConfig 为项目中的继承自 JFinalConfig 的类文件
约定configXxx系列方法为 AppConfig 之中的方法,共有如下六个方 法:configConstant(...)、configRoute(...)、configEngine(...)、configHandler(...)、configInterceptor(...)、configPlugin(...)
1:
','2016-09-27 16:26:49','2016-09-27 16:23:05',1), (2,1,'概要','本章将介绍 JFinal 开发的最佳实践,合理的分层与组织结构是对复杂性最有效的管理方法,遵循最佳实践,不仅可以进一步提升开发效率,而且在项目演化的生命周期具有更好的可扩展性和可维护性,极大降低成本
JFinal 最佳实践需划分 MVCS 四层,其中 MVC 是大家所熟知的Model、View、Controller, S是指Service业务层,Service 层是 JFinal 项目的核心,是重中之重
采用分而治之的策略进行模块划分,将复杂问题逐步转化为便于解决的简单问题
模块划分采用分类的方式,对不同类别的概念进行识别分类,按类别划分模块。大的概念划分为小概念的组合,进而大类别划分为小类别的组合
在项目初期认知还比较模糊的时候可以暂时依据 tableName 来划分。例如有三张表:project、share、feedback,则创建与这三张表同名的顶层 package,下图是 jfinal 社区的顶层 package 截图
','2016-09-29 11:41:58','2016-09-27 16:23:53',1), (2,2,'Model层','有生命力的系统会不断进化与生长,对并发的要求会越来越高,当优化 sql 与引入 cache 这两种方式无法满足需要后,就进入了集群 + 分布式进化阶段
分布式需要将大系统拆分成多个小型系统,而 Model 集中管理有利于这种拆分。将所有 Model 放在 common.model 这个包下非常容易抽取成一个maven 模块共享给分布式系统的其它模块
使用 Generator 生成的 model 符合 java bean 规范,并立即拥有 getter、setter 方法,有利于大量依靠 java bean 规范而工作的第三方工具,例如 fastjson、jackson。
此外,生成的 model 拥有静态语言的好处,无需记忆字段名称,便于重构
Model 中不要放业务逻辑,仅仅放一些纯粹 model 自己内部状态有关的通用方法,model 是要被其它业务模块共用的,不要放与具体某个业务有前端的代码,同样这也有利于未来的分布式
例如有一张 account 表,其中有一个 int status 字段,以下是代码示例:
public class Account extends BaseAccount<Account> {\n \n public static final int STATUS_LOCK_ID = -1; // 锁定账号\n public static final int STATUS_REG = 0; // 注册、未激活\n public static final int STATUS_OK = 1; // 正常、已激活\n\n public boolean isStatusOk() {\n return getStatus() == STATUS_OK;\n }\n\n public boolean isStatusReg() {\n return getStatus() == STATUS_REG;\n }\n\n public boolean isStatusLockId() {\n return getStatus() == STATUS_LOCK_ID;\n }\n}
JFinal 以往提供 demo 的 Model 中做了一个不好的示范,在其中创建了 public static final Xxx dao 对象,原本是为了在查询时可以少创建一次对象,但发现有很多用户使用该 dao 对象进行了查询以外的操作,例如 save()、update()、set() 等操作
由于 static Xxx dao 对象是全局共享的,所以会有线程安全问题,为了彻底杜绝新手的误用,jfinal 最佳实践需要将 dao 对象从 Model 中删除,转而在 Service 中创建,例如:
public class AccountService {\n\n private Account dao = new Account();\n \n public Ret login(String userName, String password) {\n String sql= "select * from account where userName=? limit 1";\n Account account = dao.findFirst(sql, userName);\n // ... 其它代码\n }\n}
如上代码所示, dao 对象从 Account 中转移到了 AccountService 中,并声明为 private 避免外界对该对象的使用。同时也避免了线程安全问题。
有些开发者习惯于 sql 随手就来,不管是在哪里只要有需要就直接 sql 操作数据库。这种习惯表面上会带来开发效率与便利性,但事实并非如此
当要写代码时,优先考虑将代码写在 Service 层中,例如有个 RegValidator 用于注册时对表单提交的数据进行校验,其中需要判断一项 nickName 是否已被注删,在 RegValidator 中有如下代码:
public class RegValidator extends Validator {\n public void validate(Controller c) {\n String sql = "select id from account where nickName=? limit 1";\n Account account = new Account().findFirst(sql, c.getPara("nickName"));\n if (account != null) {\n addError("msg", "nickName 已被注册");\n }\n // ... 其它代码\n }\n}
最佳实践是 nickName 是否被注册的代码写在 AccountService 层中,有利于代码重用,有助于未来分布式演化,有利于在业务层添加缓存等机制,将代码挪至业务层后 RegValidator 的样子:
public class RegValidator extends Validator {\n public void validate(Controller c) {\n if (AccountService.me.isNickNameRegisted(c.getPara("nickName"))) {\n addError("msg", "nickName 已被注册"):\n }\n }\n}
待添加
','2016-09-28 21:22:14','2016-09-28 21:22:14',1), (2,5,'View层','待添加
','2016-09-28 21:22:55','2016-09-28 21:22:37',1), (2,6,'其它','待添加
','2016-09-28 21:23:33','2016-09-28 21:23:33',1), (3,0,'JFinal架构','待添加
','2016-09-27 16:09:27','2016-09-26 21:53:36',1), (3,1,'顶层架构','待添加
','2016-09-27 16:10:09','2016-09-26 21:14:44',1); /*!40000 ALTER TABLE `document` ENABLE KEYS */; UNLOCK TABLES; # Dump of table download # ------------------------------------------------------------ DROP TABLE IF EXISTS `download`; CREATE TABLE `download` ( `id` int(11) NOT NULL AUTO_INCREMENT, `fileName` varchar(280) NOT NULL, `descr` varchar(280) NOT NULL COMMENT '描述', `fileType` varchar(20) NOT NULL COMMENT '文件类型', `size` varchar(20) NOT NULL, `createDate` date NOT NULL, `path` varchar(280) NOT NULL, `downloadCount` int(11) NOT NULL, `isShow` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `download` WRITE; /*!40000 ALTER TABLE `download` DISABLE KEYS */; INSERT INTO `download` (`id`, `fileName`, `descr`, `fileType`, `size`, `createDate`, `path`, `downloadCount`, `isShow`) VALUES (42,'jfinal-3.4-manual.pdf','JFinal 手册','PDF','1.39 MB','2016-01-19','/download/3.4/',140252,1), (43,'jfinal-3.4-all.zip','JFinal 3.4 all','ZIP','20.26 MB','2016-01-19','/download/3.4/',127351,1), (44,'jfinal-3.4_demo.zip','JFinal demo','ZIP','5.91 MB','2016-01-19','/download/3.4/',123110,1), (45,'GeneratorDemo.java','Generator demo','Java','2 KB','2016-01-19','/download/3.4/',110699,1), (46,'jfinal-weixin-1.7-bin-with-src.jar','JFinal weixin 1.7','JAR','258 KB','2016-01-12','/download/3.4/',11633,0), (47,'jfinal-weixin-1.8-bin-with-src.jar','JFinal Weixin 1.8','JAR','279 KB','2016-07-11','/download/3.4/',13503,1), (48,'jfinal-weixin-1.8-lib.zip','JFinal Weixin 1.8 lib','ZIP','4.31 MB','2016-07-11','/download/3.4/',11312,1), (49,'jfinal-3.4-changelog.txt','JFinal changelog','TXT','6 KB','2016-01-19','/download/3.4/',15590,1); /*!40000 ALTER TABLE `download` ENABLE KEYS */; UNLOCK TABLES; # Dump of table download_log # ------------------------------------------------------------ DROP TABLE IF EXISTS `download_log`; CREATE TABLE `download_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `accountId` int(11) NOT NULL, `ip` varchar(100) DEFAULT NULL, `fileName` varchar(200) NOT NULL, `downloadDate` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table favorite # ------------------------------------------------------------ DROP TABLE IF EXISTS `favorite`; CREATE TABLE `favorite` ( `id` int(11) NOT NULL AUTO_INCREMENT, `accountId` int(11) NOT NULL, `refType` int(11) NOT NULL COMMENT '收藏类型:1为项目,2为分享,3为反馈', `refId` int(11) NOT NULL COMMENT '被收藏的资源 id', `createAt` datetime NOT NULL COMMENT '收藏时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table feedback # ------------------------------------------------------------ DROP TABLE IF EXISTS `feedback`; CREATE TABLE `feedback` ( `id` int(11) NOT NULL AUTO_INCREMENT, `accountId` int(11) NOT NULL, `projectId` int(11) NOT NULL, `title` varchar(150) NOT NULL, `content` text NOT NULL, `createAt` datetime NOT NULL, `clickCount` int(11) NOT NULL DEFAULT '0', `report` int(11) NOT NULL DEFAULT '0', `likeCount` int(11) NOT NULL DEFAULT '0', `favoriteCount` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `feedback` WRITE; /*!40000 ALTER TABLE `feedback` DISABLE KEYS */; INSERT INTO `feedback` (`id`, `accountId`, `projectId`, `title`, `content`, `createAt`, `clickCount`, `report`, `likeCount`, `favoriteCount`) VALUES (4,1,1,'反馈测试贴','提问要描述清楚,反馈提升价值
','2018-04-27 16:05:45',0,0,0,0); /*!40000 ALTER TABLE `feedback` ENABLE KEYS */; UNLOCK TABLES; # Dump of table feedback_like # ------------------------------------------------------------ DROP TABLE IF EXISTS `feedback_like`; CREATE TABLE `feedback_like` ( `accountId` int(11) NOT NULL, `refId` int(11) NOT NULL, `createAt` datetime NOT NULL, PRIMARY KEY (`accountId`,`refId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table feedback_page_view # ------------------------------------------------------------ DROP TABLE IF EXISTS `feedback_page_view`; CREATE TABLE `feedback_page_view` ( `feedbackId` varchar(25) NOT NULL, `visitDate` date NOT NULL, `visitCount` int(20) NOT NULL, PRIMARY KEY (`feedbackId`,`visitDate`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `feedback_page_view` WRITE; /*!40000 ALTER TABLE `feedback_page_view` DISABLE KEYS */; INSERT INTO `feedback_page_view` (`feedbackId`, `visitDate`, `visitCount`) VALUES ('4','2018-04-28',1), ('4','2018-06-15',1), ('4','2018-06-22',1); /*!40000 ALTER TABLE `feedback_page_view` ENABLE KEYS */; UNLOCK TABLES; # Dump of table feedback_reply # ------------------------------------------------------------ DROP TABLE IF EXISTS `feedback_reply`; CREATE TABLE `feedback_reply` ( `id` int(11) NOT NULL AUTO_INCREMENT, `feedbackId` int(11) NOT NULL, `accountId` int(11) NOT NULL, `content` text NOT NULL, `createAt` datetime NOT NULL, `report` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `feedback_reply` WRITE; /*!40000 ALTER TABLE `feedback_reply` DISABLE KEYS */; INSERT INTO `feedback_reply` (`id`, `feedbackId`, `accountId`, `content`, `createAt`, `report`) VALUES (1,4,1,'1111','2018-06-22 11:35:25',0), (3,4,1,'3333','2018-06-22 11:35:28',0), (5,4,1,'55555','2018-06-22 11:35:31',0); /*!40000 ALTER TABLE `feedback_reply` ENABLE KEYS */; UNLOCK TABLES; # Dump of table friend # ------------------------------------------------------------ DROP TABLE IF EXISTS `friend`; CREATE TABLE `friend` ( `accountId` int(11) NOT NULL, `friendId` int(11) NOT NULL, `createAt` datetime NOT NULL, PRIMARY KEY (`accountId`,`friendId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table like_message_log # ------------------------------------------------------------ DROP TABLE IF EXISTS `like_message_log`; CREATE TABLE `like_message_log` ( `accountId` int(11) NOT NULL, `refType` int(11) NOT NULL, `refId` int(11) NOT NULL, `createAt` datetime NOT NULL COMMENT 'creatAt用于未来清除该表中时间比较久远的记录', PRIMARY KEY (`accountId`,`refType`,`refId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用于保存点赞的记录,用于记录点赞后发布过系统消息,保障只发一次'; # Dump of table login_log # ------------------------------------------------------------ DROP TABLE IF EXISTS `login_log`; CREATE TABLE `login_log` ( `accountId` int(11) NOT NULL, `loginAt` datetime NOT NULL, `ip` varchar(100) DEFAULT NULL, KEY `accountId_index` (`accountId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `login_log` WRITE; /*!40000 ALTER TABLE `login_log` DISABLE KEYS */; INSERT INTO `login_log` (`accountId`, `loginAt`, `ip`) VALUES (1,'2018-09-01 17:10:08','0:0:0:0:0:0:0:1'); /*!40000 ALTER TABLE `login_log` ENABLE KEYS */; UNLOCK TABLES; # Dump of table message # ------------------------------------------------------------ DROP TABLE IF EXISTS `message`; CREATE TABLE `message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user` int(11) NOT NULL COMMENT '消息的主人', `friend` int(11) NOT NULL COMMENT '对方的ID', `sender` int(11) NOT NULL COMMENT '发送者', `receiver` int(11) NOT NULL COMMENT '接收者', `type` tinyint(2) NOT NULL COMMENT '0:普通消息,1:系统消息', `content` text NOT NULL, `createAt` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table news_feed # ------------------------------------------------------------ DROP TABLE IF EXISTS `news_feed`; CREATE TABLE `news_feed` ( `id` int(11) NOT NULL AUTO_INCREMENT, `accountId` int(11) NOT NULL COMMENT '动态创建者', `refType` tinyint(2) NOT NULL COMMENT '动态引用类型', `refId` int(11) NOT NULL DEFAULT '0' COMMENT '动态引用所关联的 id', `refParentType` tinyint(2) NOT NULL DEFAULT '0' COMMENT 'reply所属的贴子类型, 与type 字段填的值一样', `refParentId` int(11) NOT NULL DEFAULT '0', `createAt` datetime NOT NULL COMMENT '动态创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `news_feed` WRITE; /*!40000 ALTER TABLE `news_feed` DISABLE KEYS */; INSERT INTO `news_feed` (`id`, `accountId`, `refType`, `refId`, `refParentType`, `refParentId`, `createAt`) VALUES (28,1,5,4,0,0,'2018-04-27 16:05:45'), (30,1,1,5,0,0,'2018-04-27 23:22:18'), (31,1,1,6,0,0,'2018-04-27 23:25:12'), (32,1,1,7,0,0,'2018-04-27 23:26:50'), (33,1,3,13,0,0,'2018-04-27 23:38:57'), (34,1,1,8,0,0,'2018-04-27 23:40:45'), (35,9,4,1,3,13,'2018-06-14 16:55:47'), (36,1,4,2,3,14,'2018-06-16 00:01:15'), (42,1,6,1,5,4,'2018-06-22 11:35:25'), (44,1,6,3,5,4,'2018-06-22 11:35:28'), (46,1,6,5,5,4,'2018-06-22 11:35:31'); /*!40000 ALTER TABLE `news_feed` ENABLE KEYS */; UNLOCK TABLES; # Dump of table permission # ------------------------------------------------------------ DROP TABLE IF EXISTS `permission`; CREATE TABLE `permission` ( `id` int(11) NOT NULL AUTO_INCREMENT, `actionKey` varchar(512) NOT NULL DEFAULT '', `controller` varchar(512) NOT NULL DEFAULT '', `remark` varchar(1024) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `permission` WRITE; /*!40000 ALTER TABLE `permission` DISABLE KEYS */; INSERT INTO `permission` (`id`, `actionKey`, `controller`, `remark`) VALUES (1,'/admin','com.jfinal.club._admin.index.IndexAdminController','后台管理首页'), (2,'/admin/account','com.jfinal.club._admin.account.AccountAdminController','账户管理首页'), (3,'/admin/account/addRole','com.jfinal.club._admin.account.AccountAdminController','添加角色'), (4,'/admin/account/assignRoles','com.jfinal.club._admin.account.AccountAdminController','分配角色'), (5,'/admin/account/deleteRole','com.jfinal.club._admin.account.AccountAdminController','删除角色'), (6,'/admin/account/edit','com.jfinal.club._admin.account.AccountAdminController','修改账户'), (7,'/admin/account/lock','com.jfinal.club._admin.account.AccountAdminController','锁定账户'), (8,'/admin/account/unlock','com.jfinal.club._admin.account.AccountAdminController','解锁账户'), (9,'/admin/account/update','com.jfinal.club._admin.account.AccountAdminController','更新账户'), (10,'/admin/feedback','com.jfinal.club._admin.feedback.FeedbackAdminController','反馈管理首页'), (11,'/admin/feedback/delete','com.jfinal.club._admin.feedback.FeedbackAdminController','删除反馈'), (12,'/admin/feedback/deleteReply','com.jfinal.club._admin.feedback.FeedbackAdminController','删除反馈回复'), (13,'/admin/feedback/edit','com.jfinal.club._admin.feedback.FeedbackAdminController','修改反馈'), (14,'/admin/feedback/lock','com.jfinal.club._admin.feedback.FeedbackAdminController','锁定反馈'), (15,'/admin/feedback/getReplyList','com.jfinal.club._admin.feedback.FeedbackAdminController','获取反馈回复列表'), (16,'/admin/feedback/unlock','com.jfinal.club._admin.feedback.FeedbackAdminController','解锁反馈'), (17,'/admin/feedback/update','com.jfinal.club._admin.feedback.FeedbackAdminController','更新反馈'), (18,'/admin/permission','com.jfinal.club._admin.permission.PermissionAdminController','权限管理首页'), (19,'/admin/permission/delete','com.jfinal.club._admin.permission.PermissionAdminController','删除权限'), (20,'/admin/permission/edit','com.jfinal.club._admin.permission.PermissionAdminController','修改权限'), (21,'/admin/permission/sync','com.jfinal.club._admin.permission.PermissionAdminController','同步权限'), (22,'/admin/permission/update','com.jfinal.club._admin.permission.PermissionAdminController','更新权限'), (23,'/admin/project','com.jfinal.club._admin.project.ProjectAdminController','项目管理首页'), (24,'/admin/project/delete','com.jfinal.club._admin.project.ProjectAdminController','删除项目'), (25,'/admin/project/edit','com.jfinal.club._admin.project.ProjectAdminController','修改项目'), (26,'/admin/project/lock','com.jfinal.club._admin.project.ProjectAdminController','锁定项目'), (27,'/admin/project/unlock','com.jfinal.club._admin.project.ProjectAdminController','解锁项目'), (28,'/admin/project/update','com.jfinal.club._admin.project.ProjectAdminController','更新项目'), (29,'/admin/role','com.jfinal.club._admin.role.RoleAdminController','角色管理首页'), (30,'/admin/role/add','com.jfinal.club._admin.role.RoleAdminController','创建角色'), (31,'/admin/role/addPermission','com.jfinal.club._admin.role.RoleAdminController','添加权限'), (32,'/admin/role/assignPermissions','com.jfinal.club._admin.role.RoleAdminController','分配权限'), (33,'/admin/role/delete','com.jfinal.club._admin.role.RoleAdminController','删除角色'), (34,'/admin/role/deletePermission','com.jfinal.club._admin.role.RoleAdminController','删除权限'), (35,'/admin/role/edit','com.jfinal.club._admin.role.RoleAdminController','修改角色'), (36,'/admin/role/save','com.jfinal.club._admin.role.RoleAdminController','创建角色提交'), (37,'/admin/role/update','com.jfinal.club._admin.role.RoleAdminController','修改角色提交'), (38,'/admin/share','com.jfinal.club._admin.share.ShareAdminController','分享管理首页'), (39,'/admin/share/delete','com.jfinal.club._admin.share.ShareAdminController','删除分享'), (40,'/admin/share/deleteReply','com.jfinal.club._admin.share.ShareAdminController','删除分享回复'), (41,'/admin/share/edit','com.jfinal.club._admin.share.ShareAdminController','修改分享'), (42,'/admin/share/lock','com.jfinal.club._admin.share.ShareAdminController','锁定分享'), (43,'/admin/share/getReplyList','com.jfinal.club._admin.share.ShareAdminController','获取分享回复列表'), (44,'/admin/share/unlock','com.jfinal.club._admin.share.ShareAdminController','解锁分享'), (45,'/admin/share/update','com.jfinal.club._admin.share.ShareAdminController','更新分享'), (46,'/admin/project/add','com.jfinal.club._admin.project.ProjectAdminController','创建项目'), (47,'/admin/project/save','com.jfinal.club._admin.project.ProjectAdminController','创建项目提交'), (48,'/admin/share/add','com.jfinal.club._admin.share.ShareAdminController','创建分享'), (49,'/admin/share/save','com.jfinal.club._admin.share.ShareAdminController','创建分享提交'), (50,'/admin/feedback/add','com.jfinal.club._admin.feedback.FeedbackAdminController','创建反馈'), (51,'/admin/feedback/save','com.jfinal.club._admin.feedback.FeedbackAdminController','创建反馈提交'), (52,'/admin/feedback/getReply','com.jfinal.club._admin.feedback.FeedbackAdminController','获取反馈回复'), (53,'/admin/share/getReply','com.jfinal.club._admin.share.ShareAdminController','获取分享回复'), (54,'/admin/account/avatar','com.jfinal.club._admin.account.AccountAdminController','更换头像'), (55,'/admin/account/saveAvatar','com.jfinal.club._admin.account.AccountAdminController','保存头像'), (56,'/admin/account/uploadAvatar','com.jfinal.club._admin.account.AccountAdminController','上传头像'), (57,'/admin/account/showAdminList','com.jfinal.club._admin.account.AccountAdminController','显示后台账户'), (58,'/admin/doc','com.jfinal.club._admin.document.DocumentAdminController','文档管理首页'), (59,'/admin/doc/add','com.jfinal.club._admin.document.DocumentAdminController','创建文档'), (60,'/admin/doc/delete','com.jfinal.club._admin.document.DocumentAdminController','删除文档'), (61,'/admin/doc/edit','com.jfinal.club._admin.document.DocumentAdminController','修改文档'), (62,'/admin/doc/publish','com.jfinal.club._admin.document.DocumentAdminController','发布文档'), (63,'/admin/doc/save','com.jfinal.club._admin.document.DocumentAdminController','创建文档提交'), (64,'/admin/doc/unpublish','com.jfinal.club._admin.document.DocumentAdminController','取消发布文档'), (65,'/admin/doc/update','com.jfinal.club._admin.document.DocumentAdminController','修改文档提交'); /*!40000 ALTER TABLE `permission` ENABLE KEYS */; UNLOCK TABLES; # Dump of table project # ------------------------------------------------------------ DROP TABLE IF EXISTS `project`; CREATE TABLE `project` ( `id` int(11) NOT NULL AUTO_INCREMENT, `accountId` int(11) NOT NULL, `name` varchar(50) NOT NULL, `title` varchar(150) NOT NULL, `content` text NOT NULL, `createAt` datetime NOT NULL, `clickCount` int(11) NOT NULL DEFAULT '0', `report` int(11) NOT NULL DEFAULT '0', `likeCount` int(11) NOT NULL DEFAULT '0', `favoriteCount` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `project` WRITE; /*!40000 ALTER TABLE `project` DISABLE KEYS */; INSERT INTO `project` (`id`, `accountId`, `name`, `title`, `content`, `createAt`, `clickCount`, `report`, `likeCount`, `favoriteCount`) VALUES (1,1,'JFinal','jfinal 极速开发框架','JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :)
MVC架构,设计精巧,使用简单
遵循COC原则,零配置,无xml
独创Db + Record模式,灵活便利
ActiveRecord支持,使数据库开发极致快速
自动加载修改后的java文件,开发过程中无需重启web server
AOP支持,拦截器配置灵活,功能强大
Plugin体系结构,扩展性强
多视图支持,支持FreeMarker、JSP、Velocity
强大的Validator后端校验功能
功能齐全,拥有struts2的绝大部分功能
体积小仅632K,且无第三方依赖
@Before(BlogInterceptor.class)\npublic class BlogController extends Controller {\n public void index() {\n setAttr(\"blogList\", Blog.dao.find(\"select * from blog\"));\n }\n\n public void add() {\n }\n\n @Before(BlogValidator.class)\n public void save() {\n getModel(Blog.class).save();\n }\n\n public void edit() {\n setAttr(\"blog\", Blog.dao.findById(getParaToInt()));\n }\n\n @Before(BlogValidator.class)\n public void update() {\n getModel(Blog.class).update();\n }\n\n public void delete() {\n Blog.dao.deleteById(getParaToInt());\n }\n}
public class Blog extends Model<Blog> {\n}
public class BlogValidator extends Validator {\n protected void validate(Controller controller) {\n validateRequiredString(\"blog.title\", \"titleMsg\", \"请输入Blog标题!\");\n validateRequiredString(\"blog.content\", \"contentMsg\", \"请输入Blog内容!\");\n }\n\n protected void handleError(Controller controller) {\n controller.keepModel(Blog.class);\n }\n}
public class BlogInterceptor implements Interceptor {\n public void intercept(Invocation inv) {\n System.out.println(\"Before invoking \" + inv.getActionKey());\n inv.invoke();\n System.out.println(\"After invoking \" + inv.getActionKey());\n }\n}
JFinal Weixin 是基于 JFinal 的微信公众号极速开发 SDK,只需浏览 Demo 代码即可进行极速开发,自 JFinal Weixin 1.2 版本开始已添加对多公众号支持。
详情请见:JFinal weixin中的WeixinConfig配置
WeixinMsgController 通过继承自 MsgController 便拥有了接收消息和发送消息的便利方法
通过调用 MenuApi、UserApi 等 Api 的相关方法即可获取封装成 ApiResult 对象的结果,使用 render 系列方法即可快捷输出结果
将项目导入eclipse jee中,使用 export 功能导出 war包,其中的 WEB-INF/lib 下面会自动生成 jar 包 让使用 maven 的朋友使用 mvn package 打出 war包,其中的 WEB-INF/lib 下面会自动生成 jar 包 以上两种方法注意要先将pom.xml中的导出类型设置为 war,添加 war 内容进去即可 依赖jackson或fastjson
详见请见:JFinal weixin 1.9 Jar依赖
WIKI:http://git.oschina.net/jfinal/jfinal-weixin/wikis/home 欢迎更多同学来帮助完善!
本人利用闲余时间,通过jfinal搭建的一个电影网站,里面收录的都是高质量的电影。\n\n
项目的主要架构是 nginx + tomcat + jetty + redis + mysql 。其中,nginx作为静态文件服务和负载均衡;tomcat 和 jetty 作为应用服务器,处理请求;redis取代session;mysql数据库大家都懂。另外,SSL 证书使用的是开源的Let\'s Encrypt。
欢迎大家访问,网址是:https://www.hanhanfilm.com
','2018-04-27 23:19:37',0,0,0,0), (5,1,'EOVA','jfinal 快速开发平台','首创JFinal快速开发平台,降低70%开发成本。快速搞定各类管理系统,赶紧用EOVA给自己加薪吧!
Eova能快速实现啥效果呐?\n\n\n\n定时任务有木有?\n\n\n\n什么?你要做复杂的自定义报表?\n\n\n\nWord报表呢?
你认识的控件都有!\n\n\n\n做网站后台管理,就用EOVA快速开发\n\n其它疑问请上社区提问!http://www.eova.cn\n\n\n来自广大用户的呼声
楼上这些曾经使用Eova的同学2017年都成了CTO,迎娶了白富美,走向了人生巅峰!\n\n你还在犹豫什么?\n\n赶紧抄起鼠标 https://gitee.com/eova/eova Star吧!
','2018-04-27 23:22:18',0,0,0,0), (6,1,'jfinal-mail-plugin','jfinal 邮件发送插件','简介
jfinal-mail-plugin是jfinal的一个邮件发送插件,支持发送普通邮件、与附件邮件,邮件内容支持通过模板生成,同时还支持多个邮件发送源,她继承了Jfinal核心目标“开发迅速,代码量少,学习简单。。。”,只需简单的2行代码即可实现邮件发送!为您节约更多时间,去陪恋人、家人和朋友 :) ,核心代码通过spring-context-support包的邮件模块移植,JavaMailSender对象如何发送邮件可直接参照Spring的邮件发送文档。
项目地址:http://git.oschina.net/xiyoufang/jfinal-mail-plugin
官方网站:http://www.fsdev.cn/
动态SQL插件:http://git.oschina.net/xiyoufang/jfinal-xsql-plugin
PDF生成插件: http://git.oschina.net/xiyoufang/jfinal-pdf-plugin
','2018-04-27 23:25:12',0,0,0,0), (7,1,'jfinal3.0从入门到入魔','jfinal3.0从入门到入魔系列','
那个什么,宣布一个事情,jfinal3.0视频教程发布了,来VIP群一起和我修仙,一起上天飞吧!!捷足先登,然后封神!
','2018-04-27 23:26:50',0,0,0,0), (8,1,'testhaha','测试锁定','测试锁定功能,测试锁定功能modibybb
','2018-04-27 23:40:45',0,3,0,0), (9,1,'新项目a','新标题bb','新内容哈哈哈哈
JFinal 极速开发新社区于2016年6月6号6点6分6秒正式上线了,社区将提供高品质、专业化的极速开发项目、以及项目的分享与反馈。新社区主要分为项目、分享、反馈三大模块,其用途分别为:
发布、收集与 JFinal 极速开发有关的项目,供开发者参考、学习、使用
针对于项目,分享有关该项目的一切有价值的知识、代码等等资源,提升开发效率
针对于项目,向作者反馈在使用过程中碰到的问题或者提出改进建议,用户与作者共同打造高水平项目
注册以后换上个人头像有利于社区氛围与文化建设
为了保障社区内容的专注与高品质,请支持只发表技术相关内容
为提升价值、节省开发者时间,低质量、非技术性内容会酌情进行清理,请见谅
JFinal 极度关注为开发者节省时间、提升效率、带来价值,从而会坚持内容的高品质,走少而精的道路,泛娱乐化的与技术无关的内容只会无情地浪费广大开发者有限的生命,请大家支持 JFinal 极速开发社区的价值观!!!
','2066-06-06 06:06:06',0,0,16,0), (2,1,1,'JFinal 新社区 share分享栏目',' JFinal 新社区分享栏目,用于开发者针对于本站某个项目分享出自己所拥有的有价值的资源,例如实战中具体的代码,项目使用心德、技巧等一切可以为大家节省时间、提升效率的资源。
离上一次 JFinal weixin 1.7 发布,已经过去了 6 个月。在过去的半年时间里 JFinal Weixin 紧随微信公众平台的演化,不断增加了新的 API,同时也在不断完善原有 API,力求打造一个完备的微信公众平台 SDK,让开发更快速、更开心!
JFinal Weixin 1.8 共有 27 项新增与改进,新增功能主要有:微信红包接口、微信支付对账单接口、消息转发到指定客服、微信连WIFI联网后下发消息事件、卡券相关事件消息、用户Tag接口、个性化菜单接口等等。1.8 版对原有代码也进行了打磨,例如去除 freemarker 了依赖,截止到今天,此版本是目前市面上 Java 版微信SDK中jar包依赖最少的一个。
最后感谢所有对 JFinal Weixin 有贡献的开发者们:@Dreamlu @Javen205 @亻紫菜彡 @osc余书慧 @12叔 @Jimmy哥 @author @Lucare,正是你们无私的奉献让这个世界越来越美好!
Jar 包下载:http://www.jfinal.com/download?file=jfinal-weixin-1.8-bin-with-src.jar
非 maven 用户获取依赖的 jar包:http://www.jfinal.com/download?file=jfinal-weixin-1.8-lib.zip
详细开发文档地址:http://git.oschina.net/jfinal/jfinal-weixin/wikis/home
JFinal Weixin 1.8 Change log
1:去掉freemarker依赖,感谢@亻紫菜彡的意见
2:添加个性化菜单接口
3:添加微信支付对账单接口
4:添加没有找到对应的消息和事件消息的自定义处理
5:添加微信连WIFI联网后下发消息事件
6:fixed客服接口,删除客服帐号
7:添加获取自动回复规则
8:更新ReturnCode
9:新增将消息转发到指定客服
10:更改pom.xml,打jar包时排除demo目录
11:添加\"获取在线客服接待信息\"
12:新增发送图文消息(点击跳转到图文消息页面)
13:添加微信红包接口,感谢@osc余书慧童鞋的贡献
14:Bug searchByDevice感谢@12叔
15:ApiConfig实现序列化,方便缓存感谢@Jimmy哥
16:企业付款demoWeixinTransfersController感谢@author osc就看看
17:新增微信支付PC-模式一、模式二demo
18:添加对okhttp3的支持,修复okhttp2中download误用成httpsClient
19:添加对直接请求msg接口的异常提示
20:添加IOutils.toString的字符集参数
21:修改成maven目录结构
22:添加卡券相关事件消息
23:优化xml解析
24:TemplateData,JsonKit JSON序列化错误
25:添加用户tag接口
26:修复AccessToken超时并发问题,感谢@Lucare
27:添加java doc,详见:http://www.dreamlu.net/jfinal-weixin/apidocs/
声明:本文主要介绍在用springboot集成enjoy模板引擎后,修改java代码或者前台代码时项目热加载重启之后出现异常(com.jfinal.template.TemplateException: object is not an instance of declaring class)的解决方案以及原因。
简单介绍spring-boot-devtools:
当我们用springboot构建项目的时候,如果需要其支持热加载(即修改代码保存后项目自动重新启动,节省开发时间)则需要引入spring-boot-devtools依赖,maven坐标如下:
','2018-02-04 22:26:04',0,0,0,0), (5,1,1,'JFinal使用技巧-Enjoy导出XLS','看见群里在说Enjoy除了能渲染页面还能干什么用?
看见“@毛斯特洛夫斯基”说:\n\n“\n你用的到模版的时候,就能体会到enjoy的优点\n用不到的时候,不要手里有锤子就看谁都像是钉子\n”\n\n笑坏我了哈哈~ 嗯,我来分享一个小工具吧, 我自己这边一直在用的偏方。。。\n上 石马 吧~
','2018-02-04 22:26:43',0,0,0,0), (13,1,9,'广告贴将被锁定a','这是广告贴,演示锁定功能,广告贴锁定以后,可以通过分析广告内容的模式,开发出拦截器阻止广告贴发布bbb
','2018-04-27 23:38:57',0,3,0,0), (14,1,2,'一个分享','创建一个分享创建一个分享创建一个分享创建一个分享创建一个分享yyy
','2018-06-12 12:15:10',0,0,0,0); /*!40000 ALTER TABLE `share` ENABLE KEYS */; UNLOCK TABLES; # Dump of table share_like # ------------------------------------------------------------ DROP TABLE IF EXISTS `share_like`; CREATE TABLE `share_like` ( `accountId` int(11) NOT NULL, `refId` int(11) NOT NULL, `createAt` datetime NOT NULL, PRIMARY KEY (`accountId`,`refId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table share_page_view # ------------------------------------------------------------ DROP TABLE IF EXISTS `share_page_view`; CREATE TABLE `share_page_view` ( `shareId` varchar(25) NOT NULL, `visitDate` date NOT NULL, `visitCount` int(20) NOT NULL, PRIMARY KEY (`shareId`,`visitDate`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `share_page_view` WRITE; /*!40000 ALTER TABLE `share_page_view` DISABLE KEYS */; INSERT INTO `share_page_view` (`shareId`, `visitDate`, `visitCount`) VALUES ('1','2018-04-28',1), ('1','2018-06-14',1), ('13','2018-05-01',1), ('13','2018-06-12',1), ('13','2018-06-14',1), ('14','2018-06-20',1), ('14','2018-06-22',1), ('5','2018-04-28',1); /*!40000 ALTER TABLE `share_page_view` ENABLE KEYS */; UNLOCK TABLES; # Dump of table share_reply # ------------------------------------------------------------ DROP TABLE IF EXISTS `share_reply`; CREATE TABLE `share_reply` ( `id` int(11) NOT NULL AUTO_INCREMENT, `shareId` int(11) NOT NULL, `accountId` int(11) NOT NULL, `content` text NOT NULL, `createAt` datetime NOT NULL, `report` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `share_reply` WRITE; /*!40000 ALTER TABLE `share_reply` DISABLE KEYS */; INSERT INTO `share_reply` (`id`, `shareId`, `accountId`, `content`, `createAt`, `report`) VALUES (1,13,9,'回复在此','2018-06-14 16:55:47',0), (2,14,1,'这里多来点回复','2018-06-16 00:01:15',0); /*!40000 ALTER TABLE `share_reply` ENABLE KEYS */; UNLOCK TABLES; # Dump of table task_list # ------------------------------------------------------------ DROP TABLE IF EXISTS `task_list`; CREATE TABLE `task_list` ( `id` int(11) NOT NULL AUTO_INCREMENT, `type` int(11) NOT NULL, `refId` int(11) NOT NULL, `status` tinyint(2) NOT NULL DEFAULT '0' COMMENT '0初始,1成功,2失败', `msg` varchar(1000) DEFAULT '' COMMENT '用substring保证长度不超出范围', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table task_run_log # ------------------------------------------------------------ DROP TABLE IF EXISTS `task_run_log`; CREATE TABLE `task_run_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `taskName` varchar(50) NOT NULL, `createAt` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; # Dump of table upload_counter # ------------------------------------------------------------ DROP TABLE IF EXISTS `upload_counter`; CREATE TABLE `upload_counter` ( `uploadType` varchar(50) NOT NULL, `counter` int(11) NOT NULL, `descr` varchar(50) NOT NULL, PRIMARY KEY (`uploadType`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `upload_counter` WRITE; /*!40000 ALTER TABLE `upload_counter` DISABLE KEYS */; INSERT INTO `upload_counter` (`uploadType`, `counter`, `descr`) VALUES ('club',0,'记录club模块上传图片的总数量,用于生成相对路径'), ('document',0,'记录document模块上传图片的总数量,用于生成相对路径'), ('feedback',313,'记录feedback模块上传图片的总数量,用于生成相对路径'), ('project',72,'记录project模块上传图片的总数量,用于生成相对路径'), ('share',197,'记录share模块上传图片的总数量,用于生成相对路径'); /*!40000 ALTER TABLE `upload_counter` ENABLE KEYS */; UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;