diff --git a/config/shardingsphere-jdbc.yml b/config/shardingsphere-jdbc.yml new file mode 100644 index 0000000..5f12200 --- /dev/null +++ b/config/shardingsphere-jdbc.yml @@ -0,0 +1,53 @@ +mode: + # 单机模式 + type: Standalone + # 元数据持久化 + repository: + # 数据库持久化 + type: JDBC + +# 数据源配置 +dataSources: + ds_1: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: com.mysql.cj.jdbc.Driver + jdbcUrl: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + password: test123456 + ds_2: + dataSourceClassName: com.zaxxer.hikari.HikariDataSource + driverClassName: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/information_schema?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + password: test123456 +# 规则配置 +rules: + - !SINGLE + tables: + - "*.*" + - !SHARDING + tables: # 数据分片规则配置 + book_content: + # 分库策略,缺省表示使用默认分库策略 + actualDataNodes: ds_${1}.book_content${0..9} + # 分表策略 + tableStrategy: + standard: + # 分片列名称 + shardingColumn: chapter_id + # 分片算法名称 + shardingAlgorithmName: bookContentSharding + + shardingAlgorithms: + bookContentSharding: + # 行表达式分片算法,使用 Groovy 的表达式,提供对 SQL 语句中的 = 和 IN 的分片操作支持 + type: INLINE + props: + # 分片算法的行表达式 + algorithm-expression: book_content${chapter_id % 10} + + + +props: + # 是否在日志中打印 SQL + sql-show: true diff --git a/doc/sql/novel_plus.sql b/doc/sql/novel_plus.sql index 55bd4ad..57748f9 100644 --- a/doc/sql/novel_plus.sql +++ b/doc/sql/novel_plus.sql @@ -3145,4 +3145,12 @@ where id = 16; update crawl_source -set crawl_rule = replace(crawl_rule, 'xbiqugu.net', 'xbiqugu.la'); \ No newline at end of file +set crawl_rule = replace(crawl_rule, 'xbiqugu.net', 'xbiqugu.la'); + +delete +from sys_menu +where menu_id = 104; + +delete +from sys_menu +where menu_id = 57; \ No newline at end of file diff --git a/novel-admin/pom.xml b/novel-admin/pom.xml index c590f48..dbe7fd6 100644 --- a/novel-admin/pom.xml +++ b/novel-admin/pom.xml @@ -14,18 +14,14 @@ org.springframework.boot spring-boot-starter-parent - 2.1.18.RELEASE + 2.7.18 - UTF-8 - UTF-8 - 1.8 + 17 1.7 - 5.22.0 - 3.0.0 - 2.15.1 + 5.5.1 @@ -60,35 +56,24 @@ net.sourceforge.nekohtml nekohtml + + + org.hibernate.validator + hibernate-validator + mysql mysql-connector-java 8.0.29 - - org.mybatis - mybatis - 3.5.6 - org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1 - - - com.alibaba - druid - 1.2.9 - - - org.apache.commons - commons-lang3 - 3.6 - commons-configuration commons-configuration @@ -138,6 +123,12 @@ org.apache.velocity velocity 1.7 + + + commons-lang + commons-lang + + @@ -166,6 +157,12 @@ io.springfox springfox-swagger2 2.6.1 + + + guava + com.google.guava + + io.springfox @@ -195,24 +192,29 @@ org.apache.commons commons-text 1.4 + + + commons-lang3 + org.apache.commons + + + - io.shardingsphere - sharding-jdbc-spring-boot-starter - ${sharding.jdbc.version} + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere-jdbc.version} - - io.shardingsphere - sharding-jdbc-spring-namespace - ${sharding.jdbc.version} + org.yaml + snakeyaml + 2.2 - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} + com.h2database + h2 + runtime diff --git a/novel-admin/src/main/java/com/java2nb/common/aspect/WebLogAspect.java b/novel-admin/src/main/java/com/java2nb/common/aspect/WebLogAspect.java index 889fdb6..0d6dce5 100644 --- a/novel-admin/src/main/java/com/java2nb/common/aspect/WebLogAspect.java +++ b/novel-admin/src/main/java/com/java2nb/common/aspect/WebLogAspect.java @@ -1,19 +1,16 @@ package com.java2nb.common.aspect; -import com.java2nb.common.utils.HttpContextUtils; +import com.java2nb.common.utils.IPUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; -import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import sun.net.util.IPAddressUtil; import javax.servlet.http.HttpServletRequest; -import java.lang.reflect.Method; import java.util.Arrays; @Aspect @@ -37,11 +34,10 @@ public class WebLogAspect { logger.info("请求地址 : " + request.getRequestURL().toString()); logger.info("HTTP METHOD : " + request.getMethod()); // 获取真实的ip地址 - //logger.info("IP : " + IPAddressUtil.getClientIpAddress(request)); + logger.info("IP : " + IPUtils.getIpAddr(request)); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." - + joinPoint.getSignature().getName()); + + joinPoint.getSignature().getName()); logger.info("参数 : " + Arrays.toString(joinPoint.getArgs())); -// loggger.info("参数 : " + joinPoint.getArgs()); } diff --git a/novel-admin/src/main/java/com/java2nb/common/config/DruidDBConfig.java b/novel-admin/src/main/java/com/java2nb/common/config/DruidDBConfig.java deleted file mode 100644 index 92a2383..0000000 --- a/novel-admin/src/main/java/com/java2nb/common/config/DruidDBConfig.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.java2nb.common.config; -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.servlet.FilterRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; - -import javax.sql.DataSource; -import java.sql.SQLException; - -/** - * Created by PrimaryKey on 17/2/4. - */ -@SuppressWarnings("AlibabaRemoveCommentedCode") -@Configuration -public class DruidDBConfig { - private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class); - @Value("${spring.datasource.url}") - private String dbUrl; - - @Value("${spring.datasource.username}") - private String username; - - @Value("${spring.datasource.password}") - private String password; - - @Value("${spring.datasource.driverClassName}") - private String driverClassName; - - @Value("${spring.datasource.initialSize}") - private int initialSize; - - @Value("${spring.datasource.minIdle}") - private int minIdle; - - @Value("${spring.datasource.maxActive}") - private int maxActive; - - @Value("${spring.datasource.maxWait}") - private int maxWait; - - @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") - private int timeBetweenEvictionRunsMillis; - - @Value("${spring.datasource.minEvictableIdleTimeMillis}") - private int minEvictableIdleTimeMillis; - - @Value("${spring.datasource.validationQuery}") - private String validationQuery; - - @Value("${spring.datasource.testWhileIdle}") - private boolean testWhileIdle; - - @Value("${spring.datasource.testOnBorrow}") - private boolean testOnBorrow; - - @Value("${spring.datasource.testOnReturn}") - private boolean testOnReturn; - - @Value("${spring.datasource.poolPreparedStatements}") - private boolean poolPreparedStatements; - - @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") - private int maxPoolPreparedStatementPerConnectionSize; - - @Value("${spring.datasource.filters}") - private String filters; - - @Value("{spring.datasource.connectionProperties}") - private String connectionProperties; - - @Bean(initMethod = "init", destroyMethod = "close") //声明其为Bean实例 - @Primary //在同样的DataSource中,首先使用被标注的DataSource - public DataSource dataSource() { - DruidDataSource datasource = new DruidDataSource(); - - datasource.setUrl(this.dbUrl); - datasource.setUsername(username); - datasource.setPassword(password); - datasource.setDriverClassName(driverClassName); - - //configuration - datasource.setInitialSize(initialSize); - datasource.setMinIdle(minIdle); - datasource.setMaxActive(maxActive); - datasource.setMaxWait(maxWait); - datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); - datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); - datasource.setValidationQuery(validationQuery); - datasource.setTestWhileIdle(testWhileIdle); - datasource.setTestOnBorrow(testOnBorrow); - datasource.setTestOnReturn(testOnReturn); - datasource.setPoolPreparedStatements(poolPreparedStatements); - datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); - try { - datasource.setFilters(filters); - } catch (SQLException e) { - logger.error("druid configuration initialization filter", e); - } - datasource.setConnectionProperties(connectionProperties); - - return datasource; - } - - @Bean - public ServletRegistrationBean druidServlet() { - ServletRegistrationBean reg = new ServletRegistrationBean(); - reg.setServlet(new StatViewServlet()); - reg.addUrlMappings("/druid/*"); - reg.addInitParameter("allow", ""); //白名单 - return reg; - } - - @Bean public FilterRegistrationBean filterRegistrationBean() { - FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(new WebStatFilter()); - filterRegistrationBean.addUrlPatterns("/*"); - filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); - filterRegistrationBean.addInitParameter("profileEnable", "true"); - filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE"); - filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION"); - filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*"); - return filterRegistrationBean; - } -} - diff --git a/novel-admin/src/main/java/com/java2nb/common/config/Swagger2Config.java b/novel-admin/src/main/java/com/java2nb/common/config/Swagger2Config.java deleted file mode 100644 index 90b912c..0000000 --- a/novel-admin/src/main/java/com/java2nb/common/config/Swagger2Config.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.java2nb.common.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; - -/** - * ${DESCRIPTION} - * - * @author xiongxy - * @create 2019-11-02 23:53 - */ -@EnableSwagger2 -@Configuration -public class Swagger2Config { - - @Bean - public Docket createRestApi() { - return new Docket(DocumentationType.SWAGGER_2) - .apiInfo(apiInfo()) - .select() - //为当前包路径 - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build(); - } - - //构建 api文档的详细信息函数 - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - //页面标题 - .title("功能测试") - //创建人 - .contact(new Contact("xiongxy", "1179705413@qq.com", "1179705413@qq.com")) - //版本号 - .version("1.0") - //描述 - .description("API 描述") - .build(); - } -} \ No newline at end of file diff --git a/novel-admin/src/main/java/com/java2nb/common/dao/GeneratorMapper.java b/novel-admin/src/main/java/com/java2nb/common/dao/GeneratorMapper.java index 38996bb..914affc 100644 --- a/novel-admin/src/main/java/com/java2nb/common/dao/GeneratorMapper.java +++ b/novel-admin/src/main/java/com/java2nb/common/dao/GeneratorMapper.java @@ -9,25 +9,25 @@ import java.util.Map; public interface GeneratorMapper { @Select( - "select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables" + "select table_name tableName, engine, table_comment tableComment, create_time createTime from tables" + " where table_schema = 'novel_plus' and table_name like concat('%',#{tableName},'%')") List> list(@Param("tableName") String tableName); - @Select("select count(*) from information_schema.tables where table_schema = 'novel_plus'") + @Select("select count(*) from tables where table_schema = 'novel_plus'") int count(Map map); @Select( - "select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n" + "select table_name tableName, engine, table_comment tableComment, create_time createTime from tables \r\n" + " where table_schema = 'novel_plus' and table_name = #{tableName}") Map get(String tableName); @Select( - "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n" + "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from columns\r\n" + " where table_name = #{tableName} and table_schema = 'novel_plus' order by ordinal_position") List> listColumns(String tableName); @Select( - "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n" + "select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from columns\r\n" + " where table_name = #{tableName} and table_schema = 'novel_plus' and column_key = 'PRI' limit 1") Map getPriColumn(String tableName); } diff --git a/novel-admin/src/main/java/com/java2nb/common/exception/MainsiteErrorController.java b/novel-admin/src/main/java/com/java2nb/common/exception/MainsiteErrorController.java index 46da1fd..1a9fc10 100644 --- a/novel-admin/src/main/java/com/java2nb/common/exception/MainsiteErrorController.java +++ b/novel-admin/src/main/java/com/java2nb/common/exception/MainsiteErrorController.java @@ -2,32 +2,27 @@ package com.java2nb.common.exception; import com.java2nb.common.utils.R; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.error.ErrorAttributes; import org.springframework.boot.web.servlet.error.ErrorController; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.util.Map; @RestController public class MainsiteErrorController implements ErrorController { - private Logger logger = LoggerFactory.getLogger(getClass()); + private static final String ERROR_PATH = "/error"; @Autowired ErrorAttributes errorAttributes; @RequestMapping( - value = {ERROR_PATH}, - produces = {"text/html"} + value = {ERROR_PATH}, + produces = {"text/html"} ) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { int code = response.getStatus(); @@ -58,9 +53,4 @@ public class MainsiteErrorController implements ErrorController { } } - @Override - public String getErrorPath() { - // TODO Auto-generated method stub - return ERROR_PATH; - } } \ No newline at end of file diff --git a/novel-admin/src/main/java/com/java2nb/common/utils/JSONUtils.java b/novel-admin/src/main/java/com/java2nb/common/utils/JSONUtils.java index 4575bd4..7fc193f 100644 --- a/novel-admin/src/main/java/com/java2nb/common/utils/JSONUtils.java +++ b/novel-admin/src/main/java/com/java2nb/common/utils/JSONUtils.java @@ -1,6 +1,5 @@ package com.java2nb.common.utils; -import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -8,79 +7,80 @@ import java.util.HashMap; import java.util.Map; public class JSONUtils { - /** - * Bean对象转JSON - * - * @param object - * @param dataFormatString - * @return - */ - public static String beanToJson(Object object, String dataFormatString) { - if (object != null) { - if (StringUtils.isEmpty(dataFormatString)) { - return JSONObject.toJSONString(object); - } - return JSON.toJSONStringWithDateFormat(object, dataFormatString); - } else { - return null; - } - } - /** - * Bean对象转JSON - * - * @param object - * @return - */ - public static String beanToJson(Object object) { - if (object != null) { - return JSON.toJSONString(object); - } else { - return null; - } - } + /** + * Bean对象转JSON + * + * @param object + * @param dataFormatString + * @return + */ + public static String beanToJson(Object object, String dataFormatString) { + if (object != null) { + if (StringUtils.isEmpty(dataFormatString)) { + return JSONObject.toJSONString(object); + } + return JSON.toJSONStringWithDateFormat(object, dataFormatString); + } else { + return null; + } + } - /** - * String转JSON字符串 - * - * @param key - * @param value - * @return - */ - public static String stringToJsonByFastjson(String key, String value) { - if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) { - return null; - } - Map map = new HashMap(16); - map.put(key, value); - return beanToJson(map, null); - } + /** + * Bean对象转JSON + * + * @param object + * @return + */ + public static String beanToJson(Object object) { + if (object != null) { + return JSON.toJSONString(object); + } else { + return null; + } + } - /** - * 将json字符串转换成对象 - * - * @param json - * @param clazz - * @return - */ - public static Object jsonToBean(String json, Object clazz) { - if (StringUtils.isEmpty(json) || clazz == null) { - return null; - } - return JSON.parseObject(json, clazz.getClass()); - } + /** + * String转JSON字符串 + * + * @param key + * @param value + * @return + */ + public static String stringToJsonByFastjson(String key, String value) { + if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) { + return null; + } + Map map = new HashMap(16); + map.put(key, value); + return beanToJson(map, null); + } - /** - * json字符串转map - * - * @param json - * @return - */ - @SuppressWarnings("unchecked") - public static Map jsonToMap(String json) { - if (StringUtils.isEmpty(json)) { - return null; - } - return JSON.parseObject(json, Map.class); - } + /** + * 将json字符串转换成对象 + * + * @param json + * @param clazz + * @return + */ + public static Object jsonToBean(String json, Object clazz) { + if (StringUtils.isEmpty(json) || clazz == null) { + return null; + } + return JSON.parseObject(json, clazz.getClass()); + } + + /** + * json字符串转map + * + * @param json + * @return + */ + @SuppressWarnings("unchecked") + public static Map jsonToMap(String json) { + if (StringUtils.isEmpty(json)) { + return null; + } + return JSON.parseObject(json, Map.class); + } } diff --git a/novel-admin/src/main/resources/application-dev.yml b/novel-admin/src/main/resources/application-dev.yml index 0ea1099..2ad7bd3 100644 --- a/novel-admin/src/main/resources/application-dev.yml +++ b/novel-admin/src/main/resources/application-dev.yml @@ -8,91 +8,13 @@ logging: com.java2nb: debug spring: datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: root - password: test123456 - #password: - initialSize: 1 - minIdle: 3 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 30000 - validationQuery: select 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - # 打开PSCache,并且指定每个连接上PSCache的大小 - poolPreparedStatements: true - maxPoolPreparedStatementPerConnectionSize: 20 - # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,slf4j - # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 - connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - # 合并多个DruidDataSource的监控数据 - #useGlobalDataSourceStat: true + driverClassName: org.apache.shardingsphere.driver.ShardingSphereDriver + url: jdbc:shardingsphere:absolutepath:${user.dir}/config/shardingsphere-jdbc.yml redis: host: 127.0.0.1 port: 6379 password: test123456 # 连接超时时间(毫秒) timeout: 10000 - jedis: - pool: - # 连接池中的最大空闲连接 - max-idle: 8 - # 连接池中的最小空闲连接 - min-idle: 10 - # 连接池最大连接数(使用负值表示没有限制) - max-active: 100 - # 连接池最大阻塞等待时间(使用负值表示没有限制) - max-wait: -1 - -####使用shardingJdbc时, -####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误 -##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR - -sharding: - jdbc: - datasource: - names: ds0,ds1 - ds0: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: test123456 - ds1: - type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/information_schema?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: test123456 - config: - sharding: - props: - sql.show: true - tables: - book_content: #book_content表 - key-generator-column-name: id #主键 - actual-data-nodes: ds${0}.book_content${0..9} #数据节点 - # database-strategy: #分库策略 - # inline: - # sharding-column: book_id - # algorithm-expression: ds${book_id % 10} - table-strategy: #分表策略 - inline: - shardingColumn: index_id - algorithm-expression: book_content${index_id % 10} - tables: - actual-data-nodes: ds${1}.tables - columns: - actual-data-nodes: ds${1}.columns - default-data-source-name: ds0 \ No newline at end of file diff --git a/novel-admin/src/main/resources/application-prod.yml b/novel-admin/src/main/resources/application-prod.yml index bb63df2..aba7d84 100644 --- a/novel-admin/src/main/resources/application-prod.yml +++ b/novel-admin/src/main/resources/application-prod.yml @@ -8,85 +8,13 @@ logging: com.java2nb: error spring: datasource: - type: com.alibaba.druid.pool.DruidDataSource - driverClassName: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true - username: root - password: test123456 - #password: - initialSize: 1 - minIdle: 3 - maxActive: 20 - # 配置获取连接等待超时的时间 - maxWait: 60000 - # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 - timeBetweenEvictionRunsMillis: 60000 - # 配置一个连接在池中最小生存的时间,单位是毫秒 - minEvictableIdleTimeMillis: 30000 - validationQuery: select 'x' - testWhileIdle: true - testOnBorrow: false - testOnReturn: false - # 打开PSCache,并且指定每个连接上PSCache的大小 - poolPreparedStatements: true - maxPoolPreparedStatementPerConnectionSize: 20 - # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 - filters: stat,slf4j - # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 - connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 - # 合并多个DruidDataSource的监控数据 - #useGlobalDataSourceStat: true + driverClassName: org.apache.shardingsphere.driver.ShardingSphereDriver + url: jdbc:shardingsphere:absolutepath:${user.dir}/config/shardingsphere-jdbc.yml redis: host: 127.0.0.1 port: 6379 - password: test + password: test123456 # 连接超时时间(毫秒) timeout: 10000 - jedis: - pool: - # 连接池中的最大空闲连接 - max-idle: 8 - # 连接池中的最小空闲连接 - min-idle: 10 - # 连接池最大连接数(使用负值表示没有限制) - max-active: 100 - # 连接池最大阻塞等待时间(使用负值表示没有限制) - max-wait: -1 -####使用shardingJdbc时, -####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误 -##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR - -sharding: - jdbc: - datasource: - names: ds0 #,ds1 - ds0: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: test123456 - # ds1: - # type: com.alibaba.druid.pool.DruidDataSource - # driver-class-name: com.mysql.jdbc.Driver - # url: jdbc:mysql://localhost:3306/novel_plus2 - # username: root - # password: test123456 - config: - sharding: - props: - sql.show: true - tables: - book_content: #book_content表 - key-generator-column-name: id #主键 - actual-data-nodes: ds${0}.book_content${0..9} #数据节点 - # database-strategy: #分库策略 - # inline: - # sharding-column: book_id - # algorithm-expression: ds${book_id % 10} - table-strategy: #分表策略 - inline: - shardingColumn: index_id - algorithm-expression: book_content${index_id % 10} diff --git a/novel-common/pom.xml b/novel-common/pom.xml index fecee4a..5b968e2 100644 --- a/novel-common/pom.xml +++ b/novel-common/pom.xml @@ -52,18 +52,16 @@ - - + - io.shardingsphere - sharding-jdbc-spring-boot-starter - ${sharding.jdbc.version} + org.apache.shardingsphere + shardingsphere-jdbc + ${shardingsphere-jdbc.version} - - io.shardingsphere - sharding-jdbc-spring-namespace - ${sharding.jdbc.version} + com.h2database + h2 + runtime @@ -117,6 +115,12 @@ true + + + org.hibernate.validator + hibernate-validator + + io.github.xxyopen xxy-model diff --git a/novel-common/src/main/resources/application-common-dev.yml b/novel-common/src/main/resources/application-common-dev.yml index 4f21870..cd4dc74 100644 --- a/novel-common/src/main/resources/application-common-dev.yml +++ b/novel-common/src/main/resources/application-common-dev.yml @@ -23,49 +23,8 @@ spring: #连接超时时间(毫秒) timeout: 30000 datasource: - url: jdbc:mysql://127.0.0.1:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: test123456 - driver-class-name: com.mysql.cj.jdbc.Driver - - -####使用shardingJdbc时, -####所有的jdbcType都不能是LONGVARCHAR,否则会导致java.io.NotSerializableException: java.io.StringReader错误 -##### 应该替换所有的 LONGVARCHAR 类型为VARCHAR - -sharding: - jdbc: - datasource: - names: ds0 #,ds1 - ds0: - type: com.zaxxer.hikari.HikariDataSource - driver-class-name: com.mysql.cj.jdbc.Driver - jdbc-url: jdbc:mysql://localhost:3306/novel_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - password: test123456 - # ds1: - # type: com.alibaba.druid.pool.DruidDataSource - # driver-class-name: com.mysql.jdbc.Driver - # url: jdbc:mysql://localhost:3306/novel_plus2 - # username: root - # password: test123456 - config: - sharding: - props: - sql.show: true - tables: - book_content: #book_content表 - key-generator-column-name: id #主键 - actual-data-nodes: ds${0}.book_content${0..9} #数据节点 - # database-strategy: #分库策略 - # inline: - # sharding-column: book_id - # algorithm-expression: ds${book_id % 10} - table-strategy: #分表策略 - inline: - shardingColumn: index_id - algorithm-expression: book_content${index_id % 10} - + url: jdbc:shardingsphere:absolutepath:${user.dir}/config/shardingsphere-jdbc.yml + driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver content: save: diff --git a/novel-common/src/main/resources/application-common.yml b/novel-common/src/main/resources/application-common.yml index 08d4b46..b23e73b 100644 --- a/novel-common/src/main/resources/application-common.yml +++ b/novel-common/src/main/resources/application-common.yml @@ -27,6 +27,8 @@ mybatis: logging: config: classpath:logback-boot.xml +pagehelper: + helper-dialect: mysql diff --git a/novel-crawl/pom.xml b/novel-crawl/pom.xml index 64a5b68..6f8c74c 100644 --- a/novel-crawl/pom.xml +++ b/novel-crawl/pom.xml @@ -21,6 +21,12 @@ novel-common + + org.yaml + snakeyaml + 2.2 + + org.springframework.boot spring-boot-starter-security @@ -29,7 +35,6 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} diff --git a/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java b/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java index 1fd998c..c15cdae 100644 --- a/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java +++ b/novel-crawl/src/main/java/com/java2nb/novel/core/listener/StarterListener.java @@ -14,10 +14,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.stereotype.Component; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; -import javax.servlet.annotation.WebListener; +import javax.servlet.ServletContext; import java.util.Date; import java.util.List; import java.util.Map; @@ -26,10 +26,10 @@ import java.util.concurrent.TimeUnit; /** * @author Administrator */ -@WebListener +@Component @Slf4j @RequiredArgsConstructor -public class StarterListener implements ServletContextListener { +public class StarterListener implements ServletContextInitializer { private final BookService bookService; @@ -41,7 +41,7 @@ public class StarterListener implements ServletContextListener { private int updateThreadCount; @Override - public void contextInitialized(ServletContextEvent sce) { + public void onStartup(ServletContext servletContext) { for (int i = 0; i < updateThreadCount; i++) { new Thread(() -> { log.info("程序启动,开始执行自动更新线程。。。"); diff --git a/novel-crawl/src/main/resources/application.yml b/novel-crawl/src/main/resources/application.yml index b4908fe..0979161 100644 --- a/novel-crawl/src/main/resources/application.yml +++ b/novel-crawl/src/main/resources/application.yml @@ -8,7 +8,9 @@ server: spring: profiles: active: dev - + config: + use-legacy-processing: true + #登录用户名密码 admin: username: admin diff --git a/novel-front/pom.xml b/novel-front/pom.xml index 5f0876f..1c8c2c2 100644 --- a/novel-front/pom.xml +++ b/novel-front/pom.xml @@ -20,6 +20,12 @@ novel-common + + org.yaml + snakeyaml + 2.2 + + io.jsonwebtoken @@ -48,7 +54,6 @@ com.fasterxml.jackson.core jackson-databind - ${jackson.version} diff --git a/novel-front/src/main/java/com/java2nb/novel/core/listener/StarterListener.java b/novel-front/src/main/java/com/java2nb/novel/core/listener/StarterListener.java index 41d5a5f..96a6b48 100644 --- a/novel-front/src/main/java/com/java2nb/novel/core/listener/StarterListener.java +++ b/novel-front/src/main/java/com/java2nb/novel/core/listener/StarterListener.java @@ -5,36 +5,34 @@ import com.java2nb.novel.entity.WebsiteInfo; import com.java2nb.novel.mapper.WebsiteInfoMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.web.servlet.ServletContextInitializer; +import org.springframework.stereotype.Component; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; -import javax.servlet.annotation.WebListener; +import javax.servlet.ServletContext; /** * 启动监听器 * * @author xiongxiaoyang */ -@WebListener +@Component @Slf4j @RequiredArgsConstructor -public class StarterListener implements ServletContextListener { +public class StarterListener implements ServletContextInitializer { private final WebsiteProperties websiteProperties; - private final WebsiteInfoMapper websiteInfoMapper; @Override - public void contextInitialized(ServletContextEvent sce) { - sce.getServletContext() - .setAttribute("website", websiteInfoMapper.selectByPrimaryKey(1L).orElse(new WebsiteInfo() {{ - setName(websiteProperties.getName()); - setDomain(websiteProperties.getDomain()); - setKeyword(websiteProperties.getKeyword()); - setDescription(websiteProperties.getDescription()); - setQq(websiteProperties.getQq()); - setLogo("/images/logo.png"); - setLogoDark("/images/logo_white.png"); - }})); + public void onStartup(ServletContext servletContext) { + servletContext.setAttribute("website", websiteInfoMapper.selectByPrimaryKey(1L).orElse(new WebsiteInfo() {{ + setName(websiteProperties.getName()); + setDomain(websiteProperties.getDomain()); + setKeyword(websiteProperties.getKeyword()); + setDescription(websiteProperties.getDescription()); + setQq(websiteProperties.getQq()); + setLogo("/images/logo.png"); + setLogoDark("/images/logo_white.png"); + }})); } } diff --git a/novel-front/src/main/resources/application.yml b/novel-front/src/main/resources/application.yml index 5261537..26cb4c3 100644 --- a/novel-front/src/main/resources/application.yml +++ b/novel-front/src/main/resources/application.yml @@ -5,6 +5,8 @@ spring: profiles: active: dev include: website,alipay,oss + config: + use-legacy-processing: true jwt: secret: novel!#20191230 diff --git a/pom.xml b/pom.xml index 80455b9..d91feb3 100644 --- a/pom.xml +++ b/pom.xml @@ -20,14 +20,14 @@ org.springframework.boot spring-boot-starter-parent - 2.1.18.RELEASE + 2.7.18 UTF-8 UTF-8 - 1.8 + 17 true 8.0.29 2.1.4 @@ -40,12 +40,11 @@ 6.3.1 1.4.1.RELEASE 3.12.5 - 3.0.0 + 5.5.1 3.16.3 1.5 4.35.139.ALL 1.0.0 - 2.15.1