diff --git a/README.md b/README.md
index 0535be600..f9fdabeee 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,22 @@
## 平台简介
+本项目FORK自 [若依/RuoYi](https://gitee.com/y_project/RuoYi)
+
+花了点时间做了以下改动:
+###### 更新springboot
+更新springboot版本至2.1.16.RELEASE
+
+###### 集成mybatis-plus
+一直在项目中使用mybatis-plus,觉得这个方便好用,尽量保持原代码以方便从主干合并,
+core包提供BaseCrudMapper、BaseService、BaseServiceImpl继承即可,并且在代码生成器中已更新
+
+###### 添加lombok
+为开发方便集成了lombok以提高开发效率
+
+###### 控制台日志分等级彩色渲染和多环境修改
+具体看logback-spring.xml和application.xml改动
+
+
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
性别男,若依是给还没有出生女儿取的名字(寓意:你若不离不弃,我必生死相依)
@@ -84,4 +101,4 @@
## 若依交流群
-QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s)
\ No newline at end of file
+QQ群: [](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [](https://jq.qq.com/?_wv=1027&k=5g75dCU) [](https://jq.qq.com/?_wv=1027&k=58cPoHA) [](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [](https://jq.qq.com/?_wv=1027&k=5yugASz) [](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [](https://jq.qq.com/?_wv=1027&k=5omzbKc) [](https://jq.qq.com/?_wv=1027&k=qPIKBb7s)
diff --git a/pom.xml b/pom.xml
index caff0075b..d460e2724 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
ruoyi
http://www.ruoyi.vip
若依管理系统
-
+
4.4.0
UTF-8
@@ -19,11 +19,12 @@
1.6.0
2.0.0
1.3.2
- 1.1.22
+ 1.1.23
1.19
2.3.2
2.9.2
- 1.2.5
+ 1.3.0
+ 3.4.0
1.2.73
3.9.1
2.5
@@ -35,23 +36,23 @@
-
+
org.springframework.boot
spring-boot-dependencies
- 2.1.1.RELEASE
+ 2.1.16.RELEASE
pom
import
-
+
com.alibaba
druid-spring-boot-starter
${druid.version}
-
+
com.github.penggle
@@ -79,7 +80,7 @@
shiro-ehcache
${shiro.version}
-
+
com.github.theborakompanioni
@@ -101,6 +102,13 @@
${pagehelper.boot.version}
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ ${mybatis.plus.version}
+
+
com.github.oshi
@@ -131,7 +139,7 @@
springfox-swagger-ui
${swagger.version}
-
+
commons-io
@@ -166,7 +174,7 @@
fastjson
${fastjson.version}
-
+
com.ruoyi
@@ -260,4 +268,4 @@
-
\ No newline at end of file
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index a0e726bd4..eb99b9442 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* 启动程序
- *
+ *
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@@ -27,4 +27,4 @@ public class RuoYiApplication
" | | \\ / \\ / \n" +
" ''-' `'-' `-..-' ");
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-dev.yml
similarity index 74%
rename from ruoyi-admin/src/main/resources/application-druid.yml
rename to ruoyi-admin/src/main/resources/application-dev.yml
index d69c66d27..8b005c873 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -1,57 +1,64 @@
-# 数据源配置
-spring:
- datasource:
- type: com.alibaba.druid.pool.DruidDataSource
- driverClassName: com.mysql.cj.jdbc.Driver
- druid:
- # 主库数据源
- master:
- url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
- username: root
- password: password
- # 从库数据源
- slave:
- # 从数据源开关/默认关闭
- enabled: false
- url:
- username:
- password:
- # 初始连接数
- initialSize: 5
- # 最小连接池数量
- minIdle: 10
- # 最大连接池数量
- maxActive: 20
- # 配置获取连接等待超时的时间
- maxWait: 60000
- # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
- timeBetweenEvictionRunsMillis: 60000
- # 配置一个连接在池中最小生存的时间,单位是毫秒
- minEvictableIdleTimeMillis: 300000
- # 配置一个连接在池中最大生存的时间,单位是毫秒
- maxEvictableIdleTimeMillis: 900000
- # 配置检测连接是否有效
- validationQuery: SELECT 1 FROM DUAL
- testWhileIdle: true
- testOnBorrow: false
- testOnReturn: false
- webStatFilter:
- enabled: true
- statViewServlet:
- enabled: true
- # 设置白名单,不填则允许所有访问
- allow:
- url-pattern: /druid/*
- # 控制台管理用户名和密码
- login-username:
- login-password:
- filter:
- stat:
- enabled: true
- # 慢SQL记录
- log-slow-sql: true
- slow-sql-millis: 1000
- merge-sql: true
- wall:
- config:
- multi-statement-allow: true
\ No newline at end of file
+server:
+ # 服务器的HTTP端口,默认为80
+ port: 8081
+ servlet:
+ # 应用的访问路径
+ context-path: /
+
+# 数据源配置
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driverClassName: com.mysql.cj.jdbc.Driver
+ druid:
+ # 主库数据源
+ master:
+ url: jdbc:mysql://106.75.99.248:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ username: ry
+ password: hyWaxqSnANWgYRnmjABmdEk6SbMyCzma
+ # 从库数据源
+ slave:
+ # 从数据源开关/默认关闭
+ enabled: false
+ url:
+ username:
+ password:
+ # 初始连接数
+ initialSize: 5
+ # 最小连接池数量
+ minIdle: 10
+ # 最大连接池数量
+ maxActive: 20
+ # 配置获取连接等待超时的时间
+ maxWait: 60000
+ # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+ timeBetweenEvictionRunsMillis: 60000
+ # 配置一个连接在池中最小生存的时间,单位是毫秒
+ minEvictableIdleTimeMillis: 300000
+ # 配置一个连接在池中最大生存的时间,单位是毫秒
+ maxEvictableIdleTimeMillis: 900000
+ # 配置检测连接是否有效
+ validationQuery: SELECT 1 FROM DUAL
+ testWhileIdle: true
+ testOnBorrow: false
+ testOnReturn: false
+ webStatFilter:
+ enabled: true
+ statViewServlet:
+ enabled: true
+ # 设置白名单,不填则允许所有访问
+ allow:
+ url-pattern: /druid/*
+ # 控制台管理用户名和密码
+ login-username:
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ # 慢SQL记录
+ log-slow-sql: true
+ slow-sql-millis: 1000
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
new file mode 100644
index 000000000..8b005c873
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -0,0 +1,64 @@
+server:
+ # 服务器的HTTP端口,默认为80
+ port: 8081
+ servlet:
+ # 应用的访问路径
+ context-path: /
+
+# 数据源配置
+spring:
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ driverClassName: com.mysql.cj.jdbc.Driver
+ druid:
+ # 主库数据源
+ master:
+ url: jdbc:mysql://106.75.99.248:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+ username: ry
+ password: hyWaxqSnANWgYRnmjABmdEk6SbMyCzma
+ # 从库数据源
+ slave:
+ # 从数据源开关/默认关闭
+ enabled: false
+ url:
+ username:
+ password:
+ # 初始连接数
+ initialSize: 5
+ # 最小连接池数量
+ minIdle: 10
+ # 最大连接池数量
+ maxActive: 20
+ # 配置获取连接等待超时的时间
+ maxWait: 60000
+ # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+ timeBetweenEvictionRunsMillis: 60000
+ # 配置一个连接在池中最小生存的时间,单位是毫秒
+ minEvictableIdleTimeMillis: 300000
+ # 配置一个连接在池中最大生存的时间,单位是毫秒
+ maxEvictableIdleTimeMillis: 900000
+ # 配置检测连接是否有效
+ validationQuery: SELECT 1 FROM DUAL
+ testWhileIdle: true
+ testOnBorrow: false
+ testOnReturn: false
+ webStatFilter:
+ enabled: true
+ statViewServlet:
+ enabled: true
+ # 设置白名单,不填则允许所有访问
+ allow:
+ url-pattern: /druid/*
+ # 控制台管理用户名和密码
+ login-username:
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ # 慢SQL记录
+ log-slow-sql: true
+ slow-sql-millis: 1000
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index e46f8be01..53c91efab 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -15,11 +15,6 @@ ruoyi:
# 开发环境配置
server:
- # 服务器的HTTP端口,默认为80
- port: 80
- servlet:
- # 应用的访问路径
- context-path: /
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
@@ -27,7 +22,8 @@ server:
max-threads: 800
# Tomcat启动初始化的线程数,默认值25
min-spare-threads: 30
-
+ connection-timeout: 5000
+
# 日志配置
logging:
level:
@@ -55,8 +51,8 @@ spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
- profiles:
- active: druid
+ profiles:
+ active: dev
# 文件上传
servlet:
multipart:
@@ -70,21 +66,41 @@ spring:
# 热部署开关
enabled: true
-# MyBatis
-mybatis:
- # 搜索指定包别名
- typeAliasesPackage: com.ruoyi.**.domain
- # 配置mapper的扫描,找到所有的mapper.xml映射文件
- mapperLocations: classpath*:mapper/**/*Mapper.xml
- # 加载全局的配置文件
- configLocation: classpath:mybatis/mybatis-config.xml
+# MyBatis Plus
+mybatis-plus:
+ # MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名 (即 XML 中调用的时候不用包含包名)
+ type-aliases-package: com.ruoyi.**.domain
+ # MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法 (XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)
+ mapper-locations: classpath*:mapper/**/*.xml
+ # MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation 中
+ # config-location: classpath:mybatis/mybatis-config.xml
+ global-config:
+ db-config:
+ # 全局默认主键类型
+ id-type: auto
+ # 逻辑已删除值,默认为 1
+ logic-delete-value: -1
+ # 逻辑未删除值,默认为 0
+ logic-not-delete-value: 0
+ banner: false
+ configuration:
+ # 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
+ cache-enabled: false
+ # 允许 JDBC 支持自动生成主键,默认为 true
+ # use-generated-keys: true
+ # 配置默认的执行器
+ default-executor-type: reuse
+ # 指定所用日志的具体实现
+ log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
+ call-setters-on-nulls: true
+ jdbc-type-for-null: 'null'
# PageHelper分页插件
-pagehelper:
+pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
- params: count=countSql
+ params: count=countSql
# Shiro
shiro:
@@ -101,7 +117,7 @@ shiro:
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
- domain:
+ domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
@@ -123,7 +139,7 @@ shiro:
kickoutAfter: false
# 防止XSS攻击
-xss:
+xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml
index d69a57207..caea5abec 100644
--- a/ruoyi-admin/src/main/resources/logback.xml
+++ b/ruoyi-admin/src/main/resources/logback.xml
@@ -1,93 +1,94 @@
-
-
-
-
-
-
-
-
-
-
- ${log.pattern}
-
-
-
-
-
- ${log.path}/sys-info.log
-
-
-
- ${log.path}/sys-info.%d{yyyy-MM-dd}.log
-
- 60
-
-
- ${log.pattern}
-
-
-
- INFO
-
- ACCEPT
-
- DENY
-
-
-
-
- ${log.path}/sys-error.log
-
-
-
- ${log.path}/sys-error.%d{yyyy-MM-dd}.log
-
- 60
-
-
- ${log.pattern}
-
-
-
- ERROR
-
- ACCEPT
-
- DENY
-
-
-
-
-
- ${log.path}/sys-user.log
-
-
- ${log.path}/sys-user.%d{yyyy-MM-dd}.log
-
- 60
-
-
- ${log.pattern}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+ ${log.colorPattern}
+
+
+
+
+
+ ${log.path}/sys-info.log
+
+
+
+ ${log.path}/sys-info.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ INFO
+
+ ACCEPT
+
+ DENY
+
+
+
+
+ ${log.path}/sys-error.log
+
+
+
+ ${log.path}/sys-error.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+ ERROR
+
+ ACCEPT
+
+ DENY
+
+
+
+
+
+ ${log.path}/sys-user.log
+
+
+ ${log.path}/sys-user.%d{yyyy-MM-dd}.log
+
+ 60
+
+
+ ${log.pattern}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 57e07ef7a..6bd9467f9 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -34,7 +34,7 @@
org.apache.shiro
shiro-core
-
+
org.apache.shiro
@@ -47,6 +47,12 @@
pagehelper-spring-boot-starter
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+
+
javax.validation
@@ -101,6 +107,11 @@
javax.servlet-api
+
+ org.projectlombok
+ lombok
+
+
-
\ No newline at end of file
+
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
index 0fc68beb5..0549084e1 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
@@ -4,11 +4,13 @@ import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
+
+import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* Entity基类
- *
+ *
* @author ruoyi
*/
public class BaseEntity implements Serializable
@@ -16,6 +18,7 @@ public class BaseEntity implements Serializable
private static final long serialVersionUID = 1L;
/** 搜索值 */
+ @TableField(exist = false)
private String searchValue;
/** 创建者 */
@@ -36,6 +39,7 @@ public class BaseEntity implements Serializable
private String remark;
/** 请求参数 */
+ @TableField(exist = false)
private Map params;
public String getSearchValue()
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
index 7a0efe62a..21dbf5089 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
@@ -1,8 +1,10 @@
package com.ruoyi.common.core.domain;
+import com.baomidou.mybatisplus.annotation.TableField;
+
/**
* Tree基类
- *
+ *
* @author ruoyi
*/
public class TreeEntity extends BaseEntity
@@ -10,6 +12,7 @@ public class TreeEntity extends BaseEntity
private static final long serialVersionUID = 1L;
/** 父菜单名称 */
+ @TableField(exist = false)
private String parentName;
/** 父菜单ID */
@@ -60,4 +63,4 @@ public class TreeEntity extends BaseEntity
{
this.ancestors = ancestors;
}
-}
\ No newline at end of file
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseCrudMapper.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseCrudMapper.java
new file mode 100644
index 000000000..1592408cc
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mapper/BaseCrudMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.core.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * 基础CRUD的父类Mapper
+ *
+ * @author liuxing
+ */
+public interface BaseCrudMapper extends BaseMapper {
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/BaseService.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/BaseService.java
new file mode 100644
index 000000000..fda83b0f1
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/BaseService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.core.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * 基础服务Service
+ *
+ * @author liuxing
+ */
+public interface BaseService extends IService {
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/service/impl/BaseServiceImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/impl/BaseServiceImpl.java
new file mode 100644
index 000000000..7768bcac7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/service/impl/BaseServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.common.core.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.mapper.BaseCrudMapper;
+import com.ruoyi.common.core.service.BaseService;
+
+/**
+ * @author liuxing
+ */
+public class BaseServiceImpl, T> extends ServiceImpl implements BaseService {
+}
diff --git a/ruoyi-framework/pom.xml b/ruoyi-framework/pom.xml
index 498eb87b4..a9a51703d 100644
--- a/ruoyi-framework/pom.xml
+++ b/ruoyi-framework/pom.xml
@@ -89,4 +89,4 @@
-
\ No newline at end of file
+
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
deleted file mode 100644
index 0bc8a2bec..000000000
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package com.ruoyi.framework.config;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import javax.sql.DataSource;
-import org.apache.ibatis.io.VFS;
-import org.apache.ibatis.session.SqlSessionFactory;
-import org.mybatis.spring.SqlSessionFactoryBean;
-import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.env.Environment;
-import org.springframework.core.io.DefaultResourceLoader;
-import org.springframework.core.io.Resource;
-import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-import org.springframework.core.io.support.ResourcePatternResolver;
-import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
-import org.springframework.core.type.classreading.MetadataReader;
-import org.springframework.core.type.classreading.MetadataReaderFactory;
-import org.springframework.util.ClassUtils;
-
-/**
- * Mybatis支持*匹配扫描包
- *
- * @author ruoyi
- */
-@Configuration
-public class MyBatisConfig
-{
- @Autowired
- private Environment env;
-
- static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
-
- public static String setTypeAliasesPackage(String typeAliasesPackage)
- {
- ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
- MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
- List allResult = new ArrayList();
- try
- {
- for (String aliasesPackage : typeAliasesPackage.split(","))
- {
- List result = new ArrayList();
- aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
- + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
- Resource[] resources = resolver.getResources(aliasesPackage);
- if (resources != null && resources.length > 0)
- {
- MetadataReader metadataReader = null;
- for (Resource resource : resources)
- {
- if (resource.isReadable())
- {
- metadataReader = metadataReaderFactory.getMetadataReader(resource);
- try
- {
- result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
- }
- catch (ClassNotFoundException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
- if (result.size() > 0)
- {
- HashSet hashResult = new HashSet(result);
- allResult.addAll(hashResult);
- }
- }
- if (allResult.size() > 0)
- {
- typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));
- }
- else
- {
- throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- return typeAliasesPackage;
- }
-
- @Bean
- public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
- {
- String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
- String mapperLocations = env.getProperty("mybatis.mapperLocations");
- String configLocation = env.getProperty("mybatis.configLocation");
- typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
- VFS.addImplClass(SpringBootVFS.class);
-
- final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
- sessionFactory.setDataSource(dataSource);
- sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
- sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
- sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
- return sessionFactory.getObject();
- }
-}
\ No newline at end of file
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
new file mode 100644
index 000000000..5596f02ef
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/MybatisPlusConfig.java
@@ -0,0 +1,21 @@
+package com.ruoyi.framework.config;
+
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * mybatis-plus配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+ @Bean
+ public ISqlInjector sqlInjector() {
+ return new DefaultSqlInjector();
+ }
+}
diff --git a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm
index a9d18f097..30c5e1641 100644
--- a/ruoyi-generator/src/main/resources/vm/java/domain.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/domain.java.vm
@@ -3,6 +3,10 @@ package ${packageName}.domain;
#foreach ($import in $importList)
import ${import};
#end
+import lombok.Data;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
@@ -14,7 +18,7 @@ import com.ruoyi.common.core.domain.TreeEntity;
/**
* ${functionName}对象 ${tableName}
- *
+ *
* @author ${author}
* @date ${datetime}
*/
@@ -23,6 +27,8 @@ import com.ruoyi.common.core.domain.TreeEntity;
#elseif($table.tree)
#set($Entity="TreeEntity")
#end
+@Data
+@TableName("${tableName}")
public class ${ClassName} extends ${Entity}
{
private static final long serialVersionUID = 1L;
@@ -44,6 +50,9 @@ public class ${ClassName} extends ${Entity}
#else
@Excel(name = "${comment}")
#end
+#end
+#if($column.pk)
+@TableId(type = IdType.AUTO)
#end
private $column.javaType $column.javaField;
@@ -54,51 +63,51 @@ public class ${ClassName} extends ${Entity}
private List<${subClassName}> ${subclassName}List;
#end
-#foreach ($column in $columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
- public void set${AttrName}($column.javaType $column.javaField)
- {
- this.$column.javaField = $column.javaField;
- }
-
- public $column.javaType get${AttrName}()
- {
- return $column.javaField;
- }
-#end
-#end
-
-#if($table.sub)
- public List<${subClassName}> get${subClassName}List()
- {
- return ${subclassName}List;
- }
-
- public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
- {
- this.${subclassName}List = ${subclassName}List;
- }
-
-#end
- @Override
- public String toString() {
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
- .append("${column.javaField}", get${AttrName}())
-#end
-#if($table.sub)
- .append("${subclassName}List", get${subClassName}List())
-#end
- .toString();
- }
+###foreach ($column in $columns)
+###if(!$table.isSuperColumn($column.javaField))
+###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+###set($AttrName=$column.javaField)
+###else
+###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+###end
+## public void set${AttrName}($column.javaType $column.javaField)
+## {
+## this.$column.javaField = $column.javaField;
+## }
+##
+## public $column.javaType get${AttrName}()
+## {
+## return $column.javaField;
+## }
+###end
+###end
+##
+###if($table.sub)
+## public List<${subClassName}> get${subClassName}List()
+## {
+## return ${subclassName}List;
+## }
+##
+## public void set${subClassName}List(List<${subClassName}> ${subclassName}List)
+## {
+## this.${subclassName}List = ${subclassName}List;
+## }
+##
+###end
+## @Override
+## public String toString() {
+## return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+###foreach ($column in $columns)
+###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+###set($AttrName=$column.javaField)
+###else
+###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+###end
+## .append("${column.javaField}", get${AttrName}())
+###end
+###if($table.sub)
+## .append("${subclassName}List", get${subClassName}List())
+###end
+## .toString();
+## }
}
diff --git a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
index d25ec18cb..add8865e6 100644
--- a/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/mapper.java.vm
@@ -5,87 +5,87 @@ import ${packageName}.domain.${ClassName};
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end
-
+import com.ruoyi.common.core.mapper.BaseCrudMapper;
/**
* ${functionName}Mapper接口
- *
+ *
* @author ${author}
* @date ${datetime}
*/
-public interface ${ClassName}Mapper
+public interface ${ClassName}Mapper extends BaseCrudMapper<${ClassName}>
{
/**
* 查询${functionName}
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
- public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+ ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
- *
+ *
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
- public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+ List<${ClassName}> select${ClassName}List(${ClassName} ${className});
/**
* 新增${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
- public int insert${ClassName}(${ClassName} ${className});
+ int insert${ClassName}(${ClassName} ${className});
/**
* 修改${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
- public int update${ClassName}(${ClassName} ${className});
+ int update${ClassName}(${ClassName} ${className});
/**
* 删除${functionName}
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
- public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+ int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 批量删除${functionName}
- *
+ *
* @param ${pkColumn.javaField}s 需要删除的数据ID
* @return 结果
*/
- public int delete${ClassName}ByIds(String[] ${pkColumn.javaField}s);
+ int delete${ClassName}ByIds(String[] ${pkColumn.javaField}s);
#if($table.sub)
/**
* 批量删除${subTable.functionName}
- *
+ *
* @param customerIds 需要删除的数据ID
* @return 结果
*/
- public int delete${subClassName}By${subTableFkClassName}s(String[] ${pkColumn.javaField}s);
-
+ int delete${subClassName}By${subTableFkClassName}s(String[] ${pkColumn.javaField}s);
+
/**
* 批量新增${subTable.functionName}
- *
+ *
* @param ${subclassName}List ${subTable.functionName}列表
* @return 结果
*/
- public int batch${subClassName}(List<${subClassName}> ${subclassName}List);
-
+ int batch${subClassName}(List<${subClassName}> ${subclassName}List);
+
/**
* 通过${functionName}ID删除${subTable.functionName}信息
- *
+ *
* @param roleId 角色ID
* @return 结果
*/
- public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
+ int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end
}
diff --git a/ruoyi-generator/src/main/resources/vm/java/service.java.vm b/ruoyi-generator/src/main/resources/vm/java/service.java.vm
index e073cc82b..a9a59f243 100644
--- a/ruoyi-generator/src/main/resources/vm/java/service.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/service.java.vm
@@ -5,69 +5,69 @@ import ${packageName}.domain.${ClassName};
#if($table.tree)
import com.ruoyi.common.core.domain.Ztree;
#end
-
+import com.ruoyi.common.core.service.BaseService;
/**
* ${functionName}Service接口
- *
+ *
* @author ${author}
* @date ${datetime}
*/
-public interface I${ClassName}Service
+public interface I${ClassName}Service extends BaseService<${ClassName}>
{
/**
* 查询${functionName}
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
- public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+ ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
/**
* 查询${functionName}列表
- *
+ *
* @param ${className} ${functionName}
* @return ${functionName}集合
*/
- public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+ List<${ClassName}> select${ClassName}List(${ClassName} ${className});
/**
* 新增${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
- public int insert${ClassName}(${ClassName} ${className});
+ int insert${ClassName}(${ClassName} ${className});
/**
* 修改${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
- public int update${ClassName}(${ClassName} ${className});
+ int update${ClassName}(${ClassName} ${className});
/**
* 批量删除${functionName}
- *
+ *
* @param ids 需要删除的数据ID
* @return 结果
*/
- public int delete${ClassName}ByIds(String ids);
+ int delete${ClassName}ByIds(String ids);
/**
* 删除${functionName}信息
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
- public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+ int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
#if($table.tree)
/**
* 查询${functionName}树列表
- *
+ *
* @return 所有${functionName}信息
*/
- public List select${ClassName}Tree();
+ List select${ClassName}Tree();
#end
}
diff --git a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
index 4592abce8..3b7622bad 100644
--- a/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/serviceImpl.java.vm
@@ -7,6 +7,7 @@ import com.ruoyi.common.core.domain.Ztree;
#end
#foreach ($column in $columns)
#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
+import com.ruoyi.common.core.service.impl.BaseServiceImpl;
import com.ruoyi.common.utils.DateUtils;
#break
#end
@@ -26,43 +27,41 @@ import com.ruoyi.common.core.text.Convert;
/**
* ${functionName}Service业务层处理
- *
+ *
* @author ${author}
* @date ${datetime}
*/
@Service
-public class ${ClassName}ServiceImpl implements I${ClassName}Service
+public class ${ClassName}ServiceImpl extends BaseServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service
{
- @Autowired
- private ${ClassName}Mapper ${className}Mapper;
/**
* 查询${functionName}
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return ${functionName}
*/
@Override
public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField})
{
- return ${className}Mapper.select${ClassName}ById(${pkColumn.javaField});
+ return this.baseMapper.select${ClassName}ById(${pkColumn.javaField});
}
/**
* 查询${functionName}列表
- *
+ *
* @param ${className} ${functionName}
* @return ${functionName}
*/
@Override
public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
{
- return ${className}Mapper.select${ClassName}List(${className});
+ return this.baseMapper.select${ClassName}List(${className});
}
/**
* 新增${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
@@ -78,17 +77,17 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
#end
#end
#if($table.sub)
- int rows = ${className}Mapper.insert${ClassName}(${className});
+ int rows = this.baseMapper.insert${ClassName}(${className});
insert${subClassName}(${className});
return rows;
#else
- return ${className}Mapper.insert${ClassName}(${className});
+ return this.baseMapper.insert${ClassName}(${className});
#end
}
/**
* 修改${functionName}
- *
+ *
* @param ${className} ${functionName}
* @return 结果
*/
@@ -104,15 +103,15 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
#end
#end
#if($table.sub)
- ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
+ this.baseMapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());
insert${subClassName}(${className});
#end
- return ${className}Mapper.update${ClassName}(${className});
+ return this.baseMapper.update${ClassName}(${className});
}
/**
* 删除${functionName}对象
- *
+ *
* @param ids 需要删除的数据ID
* @return 结果
*/
@@ -123,14 +122,14 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
public int delete${ClassName}ByIds(String ids)
{
#if($table.sub)
- ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(Convert.toStrArray(ids));
+ this.baseMapper.delete${subClassName}By${subTableFkClassName}s(Convert.toStrArray(ids));
#end
- return ${className}Mapper.delete${ClassName}ByIds(Convert.toStrArray(ids));
+ return this.baseMapper.delete${ClassName}ByIds(Convert.toStrArray(ids));
}
/**
* 删除${functionName}信息
- *
+ *
* @param ${pkColumn.javaField} ${functionName}ID
* @return 结果
*/
@@ -138,21 +137,21 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField})
{
#if($table.sub)
- ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
+ this.baseMapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
#end
- return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField});
+ return this.baseMapper.delete${ClassName}ById(${pkColumn.javaField});
}
#if($table.tree)
/**
* 查询${functionName}树列表
- *
+ *
* @return 所有${functionName}信息
*/
@Override
public List select${ClassName}Tree()
{
- List<${ClassName}> ${className}List = ${className}Mapper.select${ClassName}List(new ${ClassName}());
+ List<${ClassName}> ${className}List = this.baseMapper.select${ClassName}List(new ${ClassName}());
List ztrees = new ArrayList();
for (${ClassName} ${className} : ${className}List)
{
@@ -173,7 +172,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
/**
* 新增${subTable.functionName}信息
- *
+ *
* @param ${className} ${functionName}对象
*/
public void insert${subClassName}(${ClassName} ${className})
@@ -190,7 +189,7 @@ public class ${ClassName}ServiceImpl implements I${ClassName}Service
}
if (list.size() > 0)
{
- ${className}Mapper.batch${subClassName}(list);
+ this.baseMapper.batch${subClassName}(list);
}
}
}
diff --git a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
index 3539474cc..989e65957 100644
--- a/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
+++ b/ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
@@ -7,13 +7,15 @@ import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
+import lombok.Data;
/**
* ${subTable.functionName}对象 ${subTableName}
- *
+ *
* @author ${author}
* @date ${datetime}
*/
+@Data
public class ${subClassName} extends BaseEntity
{
private static final long serialVersionUID = 1L;
@@ -40,36 +42,36 @@ public class ${subClassName} extends BaseEntity
#end
#end
-#foreach ($column in $subTable.columns)
-#if(!$table.isSuperColumn($column.javaField))
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
- public void set${AttrName}($column.javaType $column.javaField)
- {
- this.$column.javaField = $column.javaField;
- }
+###foreach ($column in $subTable.columns)
+###if(!$table.isSuperColumn($column.javaField))
+###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+###set($AttrName=$column.javaField)
+###else
+###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+###end
+## public void set${AttrName}($column.javaType $column.javaField)
+## {
+## this.$column.javaField = $column.javaField;
+## }
+##
+## public $column.javaType get${AttrName}()
+## {
+## return $column.javaField;
+## }
+###end
+###end
- public $column.javaType get${AttrName}()
- {
- return $column.javaField;
- }
-#end
-#end
-
- @Override
- public String toString() {
- return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-#foreach ($column in $subTable.columns)
-#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
-#set($AttrName=$column.javaField)
-#else
-#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
-#end
- .append("${column.javaField}", get${AttrName}())
-#end
- .toString();
- }
+## @Override
+## public String toString() {
+## return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+###foreach ($column in $subTable.columns)
+###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+###set($AttrName=$column.javaField)
+###else
+###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+###end
+## .append("${column.javaField}", get${AttrName}())
+###end
+## .toString();
+## }
}