该项目是一整套整合 Dubbo+Zookeeper+SpringMVC+Spring+MyBatis 支持分布式的高效率便捷开发RPC框架,使开发人员更专注于业务,达到面向业务开发。
项目使用 Maven 构建,便于项目管理,可支持 Oracle、MySql 等主流数据库。
项目模块化分层明确,代码规范,便于后期维护等工作。
前端展示界面采用基于 Boostrap 实现的响应式布局,并集成了一系列的动画效果插件,整体界面简洁、美观大方并可优雅的与后台完成交互操作。
项目目标是为中小型企业打造全方位的J2EE企业级开发解决方案,提高工作效率。
该项目是yan-demo单节点项目的升级版,支持分布式,持续更新中,敬请期待...
近期更新内容
- beta 1.0.0:项目整体改造,升级为RPC架构。(注:若想查看非RPC版请移步至https:///micyo202/yan)
- beta 0.1.0:模块优化,删除不必要的模块,优化代码(模块详情参考:三、项目结构)
- beta 0.0.5:前端添加ECharts,便于图形化展示
- beta 0.0.4:添加JMS(ActiveMQ)消息服务(目前仅测试方法,暂无业务流转,后期逐渐完善细化)
- beta 0.0.3:添加Solr搜索引擎服务(基本的全文检索功能,可根据实际需求情况进行二次开发,后期本人再逐渐完善)
- beta 0.0.2:优化整体代码、添加更多注释,结构更清晰、代码更易懂
- beta 0.0.1:将原有yan-demo项目重构,保留原有功能,模块拆分、优化项目结构
项目所需工具及版本 *
一、项目开发环境&工具(Environment&Tools)
- MacOS Sierra / Windows 7
- MySql 5.7
- JDK 1.8
- CentOS 7
- IntelliJ IDEA 2017.2.5 / Eclipse 4.6.1
- Navicat Premium 11.1.12
- Maven 3.3.9
- Jetty 9.4.6.v20170531 / Tomcat 9.0.1
二、技术选型(Technology)
1.服务端技术(Server)
2.前端技术(Web)
三、项目结构(Construction)
四、项目入门(Introduction)
- 下载项目,并且导入到IDE开发工具中(建议使用:IntelliJ IDEA)
- 使用 Maven 构建项目
- 创建数据库并执行 yan-dao 模块中 resources/database 路径下的 yan.sql文件,创建整个项目必要的表(如:用户表、资源表、日志记录表等...)
- 分别修改 yan-dao、yan-service、yan-web 模块中 resources/properties路径下的 *.properties 配置文件(具体修改方法及对应属性解释,详见 - 五、配置说明)
- 完成以上步骤就可以正常部署启动服务了:
a). 启动 zookeeper 服务(必要服务,不启动该服务导致项目无法正常运行)
b). 启动 activemq 服务(非必要服务,若不启动该服务,则项目运行中会有jms监听器异常,但不影响整体能)
c). 启动 solr 服务(非必要服务,若不启动该服务,则搜索引擎无法使用,但不影响整体功能)
[以上服务具体配置及启动命令,这里我不多做阐述了,不知道的可自行百度搜索] - 启动完以上基础的服务后,就可以运行项目了
a). 首先启动 yan-service,直接运行该模块中的 com.yan.service.ServiceApp.main() 方法来启动
b). 其次启动 yan-web ,可(使用 jetty / tomcat 均可)[详细部署过程在这里就不多做阐述了],启动成功后即可访问web应用界面。接下来进入开发阶段 - 根据实际业务需求,在对应的数据库中创建业务表,表命名规范:“模块名_表名” 如:SYS_RESOURCE(系统模块资源表)
- 修改 yan-dao 模块中 resources 路径下的 generatorConfig.xml 中的 targetPackage 包名及 tableName 表名,使用 MyBatis generator 插件生成对应的持久层模块代码(Maven 执行命令:mvn mybatis-generator:generate),具体配置请参考MyBatis GeneratorXML Configuration
- 在 yan-api 模块中 src/main/java 路径下创建对应的接口
- 在 yan-service 模块中 src/main/java 路径下创建对应的接口服务实现类,并在 src/main/resources/META-INF/spring 路径下的 spring-dubbo-provider.xml 配置中添加声明暴露对应服务接口
- 在 yan-web 模块中 src/main/java 路径下创建对应的 controller 控制器,该控制器类命名规范以 Controller 结尾,继承 BaseController 类,编写 controller 控制器业务处理代码(具体使用参考 - 七、示例代码),并在 src/main/resources/spring/config 路径下的 spring-dubbo-customer.xml 配置中添加声明暴露对应服务接口
- 在 yan-web 模块中 src/main/webapp/views 路径下创建对应的jsp页面,并编写前端页面展示代码
五、配置说明(Properties)
yan-dao 模块 resources/properties 中配置文件说明
名称(Key值) | 描述 |
---|
mbg.path | mybatis generator 插件生成代码的路径(绝对路径) |
mbg.db.username | mybatis generator 插件连接数据库的用户名 |
mbg.db.password | mybatis generator 插件连接数据库的密码 |
mbg.db.driverClassName | mybatis generator 插件连接数据库的驱动 |
mbg.db.url | mybatis generator 插件连接数据库的地址 |
yan-service 模块 resources/properties 中配置文件说明
名称(Key值) | 描述 |
---|
default.datasource.username | 默认数据库用户名 |
default.datasource.password | 默认数据库密码 |
default.datasource.driverClassName | 默认数据库驱动类 |
default.datasource.url | 默认数据库链接地址 |
dextend.datasource.username | 扩展数据库用户名(用于多数据源切换) |
dextend.datasource.password | 扩展数据库密码(用于多数据源切换) |
dextend.datasource.driverClassName | 扩展数据库驱动类(用于多数据源切换) |
dextend.datasource.url | 扩展数据库链接地址(用于多数据源切换) |
datasource.initialSize | 初始化时建立物理连接的个数 |
datasource.minIdle | 最小连接池数量 |
datasource.maxActive | 最大连接池数量 |
datasource.maxWait | 获取连接时最大等待时间,单位毫秒 |
datasource.timeBetweenEvictionRunsMillis | 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 |
datasource.minEvictableIdleTimeMillis | 配置一个连接在池中最小生存的时间,单位是毫秒 |
datasource.validationQuery | 用来检测连接是否有效的sql |
datasource.testWhileIdle | 建议配置为true,不影响性能,并且保证安全性 |
datasource.testOnBorrow | 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 |
datasource.testOnReturn | 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 |
datasource.poolPreparedStatements | 是否缓存preparedStatement,也就是PSCache |
datasource.maxPoolPreparedStatementPerConnectionSize | 每个连接上PSCache的大小 |
datasource.filters | 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat日志用的filter:log4j防御sql注入的filter:wall |
- | - |
dubbo.application.name | dubbo 应用服务提供者名称 |
dubbo.protocol.port | dubbo 协议暴露服务的端口 |
dubbo.registry.address | dubbo 使用 zookeeper 注册中心暴露服务的地址 |
- | - |
jms.brokerURL | activeMQ 服务地址 |
jms.userName | activeMQ 服务管理端用户名 |
jms.password | activeMQ 服务管理端密码 |
yan-web 模块 resources/properties 中配置文件说明
名称(Key值) | 描述 |
---|
jms.brokerURL | activeMQ 服务地址 |
jms.userName | activeMQ 服务管理端用户名 |
jms.password | activeMQ 服务管理端密码 |
- | - |
logback.name | 日志文件前缀名称(一般使用项目名称,便于区分) |
logback.path | 日志存放路径(绝对路径) |
logback.maxHistory | 日志最大的历史天数 |
logback.db.username | 日志写入数据库时连接数据库的用户名 |
logback.db.password | 日志写入数据库时连接数据库的密码 |
logback.db.driverClassName | 日志写入数据库时连接数据库的驱动 |
logback.db.url | 日志写入数据库时连接数据库的url |
- | - |
setting.upload | 文件上传路径(绝对路径) |
- | - |
solr.builder | Solr搜索引擎服务地址 |
六、常用方法(Methods)
方法均在继承于BaseController的controller类中使用this.metodName或直接使用methodName来进行调用(注:methodName代表需要调用的方法名称,方法名称见下表)
方法名 | 参数 | 返回值 | 描述 |
---|
getSession | 无 | HttpSession 服务器会话 | 获取服务器会话 session 对象 |
setSession | session 服务器会话 | 无 | 设置服务器会话 session 对象 |
getRequest | 无 | HttpServletRequest 用户请求 | 获取用户请求 request 对象 |
setRequest | request 用户请求 | 无 | 设置用户请求 request 对象 |
getResponse | 无 | HttpServletResponse 服务器响应结果 | 获取服务器响应结果 response 对象 |
setResponse | response 服务器响应结果 | 无 | 设置服务器响应结果 response 对象 |
getSessionUser | 无 | TbSysUser 用户对象 | 获取登录成功后 session 中的存储的用户信息 |
- | - | - | - |
getService | 无 | DelegateService 通用 Service,查看自定义 sqlMap 的代理 service 对象 | 获取 delegateService 对象 |
resultPage | list 查询到的分页结果,为 Page 对象 | PageModel<T> 自定义的分页模型,T 为查询的对象 | 分页结果集对象 |
resultMsg | status 状态值(可根据需求任意设置,无强制标准);msg 消息内容;res 返回的对象 | MsgModel 自定义消息模型 | 消息返回对象 |
fileUpLoad | request 上传方法中传递的 request 对象,并非父类中的 request 对象 | List<String> 上传文件成功后的新文件名称,以集合形式返回 | 文件上传方法,支持多个文件上传 |
fileDownLoad | fileName 需要下载的文件名称 | ResponseEntity<byte[]> 下载的文件,在浏览器会进行下载 | 文件下载方法 |
- | - | - | - |
isNull | obj 需要进行判断的对象 | boolean 为null或空返回 true,否则返回 false | 判断对象是否为null,或空 |
obj2Str | obj 需要转换的对象 | String 对象的值(为null则返回"") | 对象转换为 String,通常用于获取 Map 集合中的对象时使用 |
getUUID | 无 | String 32位主键字符串 | 生成 uuid 主键,长度为32位,且为大写模式 |
base64Encoder | str 需要进行编码的字符串 | String 进行编码后的结果字符串 | 对字符串进行 base64 编码 |
base64Decoder | str 已进行 base64 编码的编码字符串 | String 解码后的原字符串 | 对字符串进行 base64 解码 |
md5 | str 需要进行 md5 加密的字符串 | String 加密后的结果 | 对字符串进行 md5 加密算法 |
currentDate | pattern 获取系统时间的格式,如:yyyy-MM-dd HH:mm:ss | String 返回格式化后的当前时间 | 获取系统当前时间 |
timeStamp2Date | timestamp 需要进行转换的时间戳;pattern 转换后的格式 | String 格式化后的日期 | 时间戳转换成日期 |
date2TimeStamp | dateStr 需要进行转换的日期字符串;pattern 日期的格式 | String 转换后的时间戳 | 日期转换为时间戳 |
readFromFile | filePath 文件路径(绝对路径) | String 读取的文件内容 | 从指定文件中读取文件内容 |
writeToFile | content 需要写入文件中的内容 | filePath 文件路径(绝对路径) | 将内容写入到指定文件中(写入会覆盖文件原有内容,建议先读取,再写入,将读取的内容与需要写入的内容并在一起进行写入) |
generatePath | path 文件夹路径(绝对路径) | 无 | 生成指定路径文件夹,先进行判断文件夹是否存在,若不存在则创建对应目录的文件夹,若存在则不进行任何操作 |
generateFile | path 文件路径(绝对路径) | 无 | 生成指定路径的文件,先进行判断文件是否存在,若不存在则进行创建文件,若存在则不进行任何操作 |
propertiesValue | key 资源文件中的 key 值 | String 读取到的 key 对应的 value 值 | 读取 properties 文件中的值,读取 classpath 下 /properties/config.properties 配置文件 |
propertiesValue | resource 资源文件路径(对应 classpath 中的路径);key 资源文件中的 key 值 | String 读取到的 key 对应的 value 值 | 读取指定路径 properties 文件中的值,会从 classpath 路径下进行查找资源文件 |
七、示例代码(Codes)
创建一个继承与BaseController的控制器
获取日志日志记录Logger对象
获取service对象
分页查询后台代码
分页查询前台代码
文件上传
文件下载(在jsp页面使用通用的下载方法,使用restful风格)
自定义文件下载后台方法
常用 delegateService 方法
常用对象 service 方法
更多方法使用请参考项目中的示例代码
八、效果预览(Preview)