diff --git a/bootdo/pom.xml b/bootdo/pom.xml index 0232afca028669fa1e15334b2fb6fb2cf8308534..c2ad36f4f631f3e6cf7f50f12605c205a70ef402 100644 --- a/bootdo/pom.xml +++ b/bootdo/pom.xml @@ -1,270 +1,270 @@ - - - 4.0.0 - - com.bootdo - bootdo - 1.6.9 - jar - - bootdo - Demo project for Spring Boot - - - org.springframework.boot - spring-boot-starter-parent - 1.5.9.RELEASE - - - - - UTF-8 - UTF-8 - 1.8 - 1.0.4 - 1.7 - 5.22.0 - - - - - org.springframework.boot - spring-boot-starter - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-aop - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - net.sourceforge.nekohtml - nekohtml - - - - mysql - mysql-connector-java - - - org.mybatis - mybatis - 3.4.4 - - - - org.mybatis.spring.boot - mybatis-spring-boot-starter - 1.1.1 - - - - com.alibaba - druid - 1.0.28 - - - - org.apache.commons - commons-lang3 - 3.6 - - - commons-configuration - commons-configuration - 1.10 - - - commons-io - commons-io - 2.5 - - - - org.apache.shiro - shiro-core - 1.3.2 - - - org.apache.shiro - shiro-spring - 1.3.2 - - - - org.apache.shiro - shiro-ehcache - 1.3.2 - - - com.github.theborakompanioni - thymeleaf-extras-shiro - 1.2.1 - - - - com.alibaba - fastjson - 1.2.31 - - - - org.apache.velocity - velocity - 1.7 - - - - org.springframework.boot - spring-boot-starter-cache - - - net.sf.ehcache - ehcache - - - - - - - - org.quartz-scheduler - quartz - 2.2.1 - - - slf4j-api - org.slf4j - - - - - - org.springframework.boot - spring-boot-starter-websocket - - - org.springframework - spring-context-support - - - - - - - - - org.activiti - activiti-engine - ${activiti.version} - - - - org.activiti - activiti-spring - ${activiti.version} - - - org.activiti - activiti-modeler - ${activiti.version} - - - org.activiti - activiti-diagram-rest - ${activiti.version} - - - - - io.springfox - springfox-swagger2 - 2.6.1 - - - io.springfox - springfox-swagger-ui - 2.6.1 - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - - org.jsoup - jsoup - 1.9.2 - - - - - - - - - - - - - - - - - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - - - public - aliyun nexus - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - - - - public - aliyun nexus - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - false - - - - + + + 4.0.0 + + com.bootdo + bootdo + 1.6.9 + jar + + bootdo + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.0.4 + 1.7 + 5.22.0 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + net.sourceforge.nekohtml + nekohtml + + + + mysql + mysql-connector-java + + + org.mybatis + mybatis + 3.4.4 + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.1.1 + + + + com.alibaba + druid + 1.0.28 + + + + org.apache.commons + commons-lang3 + 3.6 + + + commons-configuration + commons-configuration + 1.10 + + + commons-io + commons-io + 2.5 + + + + org.apache.shiro + shiro-core + 1.3.2 + + + org.apache.shiro + shiro-spring + 1.3.2 + + + + org.apache.shiro + shiro-ehcache + 1.3.2 + + + com.github.theborakompanioni + thymeleaf-extras-shiro + 1.2.1 + + + + com.alibaba + fastjson + 1.2.31 + + + + org.apache.velocity + velocity + 1.7 + + + + org.springframework.boot + spring-boot-starter-cache + + + net.sf.ehcache + ehcache + + + + + + + + org.quartz-scheduler + quartz + 2.2.1 + + + slf4j-api + org.slf4j + + + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework + spring-context-support + + + + + + + + + org.activiti + activiti-engine + ${activiti.version} + + + + org.activiti + activiti-spring + ${activiti.version} + + + org.activiti + activiti-modeler + ${activiti.version} + + + org.activiti + activiti-diagram-rest + ${activiti.version} + + + + + io.springfox + springfox-swagger2 + 2.6.1 + + + io.springfox + springfox-swagger-ui + 2.6.1 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.jsoup + jsoup + 1.9.2 + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + + + diff --git a/bootdo/src/main/java/com/bootdo/common/config/SpringBootSampleApplication.java b/bootdo/src/main/java/com/bootdo/common/config/SpringBootSampleApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..a6d45f1f587da1095f539706786fc93a0d84bab3 --- /dev/null +++ b/bootdo/src/main/java/com/bootdo/common/config/SpringBootSampleApplication.java @@ -0,0 +1,22 @@ +//package com.bootdo.common.config; +// +//import com.bootdo.BootdoApplication; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.boot.builder.SpringApplicationBuilder; +//import org.springframework.boot.web.support.SpringBootServletInitializer; +// +///** +// * war包部署需要 +// * 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法 +// */ +//public class SpringBootSampleApplication extends SpringBootServletInitializer{ +// +// private static final Logger logger = LoggerFactory.getLogger(SpringBootSampleApplication.class); +// +// @Override +// protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { +// return builder.sources(this.getClass()); +// } +// +//} \ No newline at end of file diff --git a/bootdo/src/main/java/com/bootdo/common/controller/FileController.java b/bootdo/src/main/java/com/bootdo/common/controller/FileController.java index d2fedc725e6ec700cc8b5adb1f6a9d4b003c5ecc..8f249363aa736e171d3ec1ad70dda43533341753 100644 --- a/bootdo/src/main/java/com/bootdo/common/controller/FileController.java +++ b/bootdo/src/main/java/com/bootdo/common/controller/FileController.java @@ -4,7 +4,7 @@ import com.bootdo.common.config.BootdoConfig; import com.bootdo.common.domain.FileDO; import com.bootdo.common.service.FileService; import com.bootdo.common.utils.*; -import org.apache.catalina.servlet4preview.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequest; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/bootdo/src/main/java/com/bootdo/common/quartz/utils/QuartzManager.java b/bootdo/src/main/java/com/bootdo/common/quartz/utils/QuartzManager.java index 6b80121ef10a4bafcdf60e0a76270d30138190eb..9b582c7cd227fe6df45cee8838096b1ea7e99f83 100644 --- a/bootdo/src/main/java/com/bootdo/common/quartz/utils/QuartzManager.java +++ b/bootdo/src/main/java/com/bootdo/common/quartz/utils/QuartzManager.java @@ -1,244 +1,244 @@ -package com.bootdo.common.quartz.utils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import org.apache.log4j.Logger; -import org.quartz.CronScheduleBuilder; -import org.quartz.CronTrigger; -import org.quartz.DateBuilder; -import org.quartz.DateBuilder.IntervalUnit; -import org.quartz.Job; -import org.quartz.JobBuilder; -import org.quartz.JobDetail; -import org.quartz.JobExecutionContext; -import org.quartz.JobKey; -import org.quartz.Scheduler; -import org.quartz.SchedulerException; -import org.quartz.Trigger; -import org.quartz.TriggerBuilder; -import org.quartz.TriggerKey; -import org.quartz.impl.matchers.GroupMatcher; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; -import org.springframework.stereotype.Service; -import org.springframework.web.context.support.SpringBeanAutowiringSupport; - -import com.bootdo.common.domain.ScheduleJob; -import com.bootdo.common.quartz.factory.*; -import com.bootdo.common.utils.SpringContextHolder;; - -/** - * - * - * @title: QuartzManager.java - * @description: 计划任务管理 - * - */ -@Service -public class QuartzManager { - public final Logger log = Logger.getLogger(this.getClass()); - // private SchedulerFactoryBean schedulerFactoryBean - // =SpringContextHolder.getBean(SchedulerFactoryBean.class); - // @Autowired - // @Qualifier("schedulerFactoryBean") - // private SchedulerFactoryBean schedulerFactoryBean; - @Autowired - private Scheduler scheduler; - - /** - * 添加任务 - * - * @param scheduleJob - * @throws SchedulerException - */ - - public void addJob(ScheduleJob job) { - try { - // 创建jobDetail实例,绑定Job实现类 - // 指明job的名称,所在组的名称,以及绑定job类 - - Class jobClass = (Class) (Class.forName(job.getBeanClass()).newInstance() - .getClass()); - JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// 任务名称和组构成任务key - .build(); - // 定义调度触发规则 - // 使用cornTrigger规则 - Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// 触发器key - .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND)) - .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build(); - // 把作业和触发器注册到任务调度中 - scheduler.scheduleJob(jobDetail, trigger); - // 启动 - if (!scheduler.isShutdown()) { - scheduler.start(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -// public void addJob(ScheduleJob job) throws SchedulerException { -// if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus())) { -// return; -// } -// -// TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup()); -// -// CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); -// -// // 不存在,创建一个 -// -// if (null == trigger) { -// Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent()) -// ? QuartzJobFactory.class -// : QuartzJobFactoryDisallowConcurrentExecution.class; -// -// JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobName(), job.getJobGroup()).build(); -// -// jobDetail.getJobDataMap().put("scheduleJob", job); -// -// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); -// -// trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()) -// .withSchedule(scheduleBuilder).build(); -// -// scheduler.scheduleJob(jobDetail, trigger); -// } else { -// // Trigger已存在,那么更新相应的定时设置 -// -// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); -// -// // 按新的cronExpression表达式重新构建trigger -// -// trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); -// -// // 按新的trigger重新设置job执行 -// -// scheduler.rescheduleJob(triggerKey, trigger); -// } -// } - - /** - * 获取所有计划中的任务列表 - * - * @return - * @throws SchedulerException - */ - public List getAllJob() throws SchedulerException { - GroupMatcher matcher = GroupMatcher.anyJobGroup(); - Set jobKeys = scheduler.getJobKeys(matcher); - List jobList = new ArrayList(); - for (JobKey jobKey : jobKeys) { - List triggers = scheduler.getTriggersOfJob(jobKey); - for (Trigger trigger : triggers) { - ScheduleJob job = new ScheduleJob(); - job.setJobName(jobKey.getName()); - job.setJobGroup(jobKey.getGroup()); - job.setDescription("触发器:" + trigger.getKey()); - Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); - job.setJobStatus(triggerState.name()); - if (trigger instanceof CronTrigger) { - CronTrigger cronTrigger = (CronTrigger) trigger; - String cronExpression = cronTrigger.getCronExpression(); - job.setCronExpression(cronExpression); - } - jobList.add(job); - } - } - return jobList; - } - - /** - * 所有正在运行的job - * - * @return - * @throws SchedulerException - */ - public List getRunningJob() throws SchedulerException { - List executingJobs = scheduler.getCurrentlyExecutingJobs(); - List jobList = new ArrayList(executingJobs.size()); - for (JobExecutionContext executingJob : executingJobs) { - ScheduleJob job = new ScheduleJob(); - JobDetail jobDetail = executingJob.getJobDetail(); - JobKey jobKey = jobDetail.getKey(); - Trigger trigger = executingJob.getTrigger(); - job.setJobName(jobKey.getName()); - job.setJobGroup(jobKey.getGroup()); - job.setDescription("触发器:" + trigger.getKey()); - Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); - job.setJobStatus(triggerState.name()); - if (trigger instanceof CronTrigger) { - CronTrigger cronTrigger = (CronTrigger) trigger; - String cronExpression = cronTrigger.getCronExpression(); - job.setCronExpression(cronExpression); - } - jobList.add(job); - } - return jobList; - } - - /** - * 暂停一个job - * - * @param scheduleJob - * @throws SchedulerException - */ - public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException { - JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); - scheduler.pauseJob(jobKey); - } - - /** - * 恢复一个job - * - * @param scheduleJob - * @throws SchedulerException - */ - public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException { - JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); - scheduler.resumeJob(jobKey); - } - - /** - * 删除一个job - * - * @param scheduleJob - * @throws SchedulerException - */ - public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException { - JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); - scheduler.deleteJob(jobKey); - - } - - /** - * 立即执行job - * - * @param scheduleJob - * @throws SchedulerException - */ - public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException { - JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); - scheduler.triggerJob(jobKey); - } - - /** - * 更新job时间表达式 - * - * @param scheduleJob - * @throws SchedulerException - */ - public void updateJobCron(ScheduleJob scheduleJob) throws SchedulerException { - - TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); - - CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); - - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); - - trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); - - scheduler.rescheduleJob(triggerKey, trigger); - } +package com.bootdo.common.quartz.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import org.apache.log4j.Logger; +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.DateBuilder; +import org.quartz.DateBuilder.IntervalUnit; +import org.quartz.Job; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobExecutionContext; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.springframework.stereotype.Service; +import org.springframework.web.context.support.SpringBeanAutowiringSupport; + +import com.bootdo.common.domain.ScheduleJob; +import com.bootdo.common.quartz.factory.*; +//import com.bootdo.common.utils.SpringContextHolder; + +/** + * + * + * @title: QuartzManager.java + * @description: 计划任务管理 + * + */ +@Service +public class QuartzManager { + public final Logger log = Logger.getLogger(this.getClass()); + // private SchedulerFactoryBean schedulerFactoryBean + // =SpringContextHolder.getBean(SchedulerFactoryBean.class); + // @Autowired + // @Qualifier("schedulerFactoryBean") + // private SchedulerFactoryBean schedulerFactoryBean; + @Autowired + private Scheduler scheduler; + + /** + * 添加任务 + * + * @param scheduleJob + * @throws SchedulerException + */ + + public void addJob(ScheduleJob job) { + try { + // 创建jobDetail实例,绑定Job实现类 + // 指明job的名称,所在组的名称,以及绑定job类 + + Class jobClass = (Class) (Class.forName(job.getBeanClass()).newInstance() + .getClass()); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// 任务名称和组构成任务key + .build(); + // 定义调度触发规则 + // 使用cornTrigger规则 + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// 触发器key + .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND)) + .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build(); + // 把作业和触发器注册到任务调度中 + scheduler.scheduleJob(jobDetail, trigger); + // 启动 + if (!scheduler.isShutdown()) { + scheduler.start(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +// public void addJob(ScheduleJob job) throws SchedulerException { +// if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getJobStatus())) { +// return; +// } +// +// TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup()); +// +// CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); +// +// // 不存在,创建一个 +// +// if (null == trigger) { +// Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent()) +// ? QuartzJobFactory.class +// : QuartzJobFactoryDisallowConcurrentExecution.class; +// +// JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getJobName(), job.getJobGroup()).build(); +// +// jobDetail.getJobDataMap().put("scheduleJob", job); +// +// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); +// +// trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()) +// .withSchedule(scheduleBuilder).build(); +// +// scheduler.scheduleJob(jobDetail, trigger); +// } else { +// // Trigger已存在,那么更新相应的定时设置 +// +// CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); +// +// // 按新的cronExpression表达式重新构建trigger +// +// trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); +// +// // 按新的trigger重新设置job执行 +// +// scheduler.rescheduleJob(triggerKey, trigger); +// } +// } + + /** + * 获取所有计划中的任务列表 + * + * @return + * @throws SchedulerException + */ + public List getAllJob() throws SchedulerException { + GroupMatcher matcher = GroupMatcher.anyJobGroup(); + Set jobKeys = scheduler.getJobKeys(matcher); + List jobList = new ArrayList(); + for (JobKey jobKey : jobKeys) { + List triggers = scheduler.getTriggersOfJob(jobKey); + for (Trigger trigger : triggers) { + ScheduleJob job = new ScheduleJob(); + job.setJobName(jobKey.getName()); + job.setJobGroup(jobKey.getGroup()); + job.setDescription("触发器:" + trigger.getKey()); + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + job.setJobStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger) trigger; + String cronExpression = cronTrigger.getCronExpression(); + job.setCronExpression(cronExpression); + } + jobList.add(job); + } + } + return jobList; + } + + /** + * 所有正在运行的job + * + * @return + * @throws SchedulerException + */ + public List getRunningJob() throws SchedulerException { + List executingJobs = scheduler.getCurrentlyExecutingJobs(); + List jobList = new ArrayList(executingJobs.size()); + for (JobExecutionContext executingJob : executingJobs) { + ScheduleJob job = new ScheduleJob(); + JobDetail jobDetail = executingJob.getJobDetail(); + JobKey jobKey = jobDetail.getKey(); + Trigger trigger = executingJob.getTrigger(); + job.setJobName(jobKey.getName()); + job.setJobGroup(jobKey.getGroup()); + job.setDescription("触发器:" + trigger.getKey()); + Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); + job.setJobStatus(triggerState.name()); + if (trigger instanceof CronTrigger) { + CronTrigger cronTrigger = (CronTrigger) trigger; + String cronExpression = cronTrigger.getCronExpression(); + job.setCronExpression(cronExpression); + } + jobList.add(job); + } + return jobList; + } + + /** + * 暂停一个job + * + * @param scheduleJob + * @throws SchedulerException + */ + public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); + scheduler.pauseJob(jobKey); + } + + /** + * 恢复一个job + * + * @param scheduleJob + * @throws SchedulerException + */ + public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); + scheduler.resumeJob(jobKey); + } + + /** + * 删除一个job + * + * @param scheduleJob + * @throws SchedulerException + */ + public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); + scheduler.deleteJob(jobKey); + + } + + /** + * 立即执行job + * + * @param scheduleJob + * @throws SchedulerException + */ + public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException { + JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); + scheduler.triggerJob(jobKey); + } + + /** + * 更新job时间表达式 + * + * @param scheduleJob + * @throws SchedulerException + */ + public void updateJobCron(ScheduleJob scheduleJob) throws SchedulerException { + + TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); + + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); + + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + + scheduler.rescheduleJob(triggerKey, trigger); + } } \ No newline at end of file diff --git a/bootdo/src/main/java/com/bootdo/common/utils/GenUtils.java b/bootdo/src/main/java/com/bootdo/common/utils/GenUtils.java index 7e95ce8c37b418f1917a4c47ea93bfcfa83ab9d6..4948afb156a24030f3c5b555e72d0ebaeab6c4b3 100644 --- a/bootdo/src/main/java/com/bootdo/common/utils/GenUtils.java +++ b/bootdo/src/main/java/com/bootdo/common/utils/GenUtils.java @@ -24,7 +24,6 @@ import java.util.zip.ZipOutputStream; /** * 代码生成器 工具类 */ -@SuppressWarnings("AlibabaRemoveCommentedCode") public class GenUtils { diff --git a/bootdo/src/main/java/com/bootdo/common/utils/SpringContextHolder.java b/bootdo/src/main/java/com/bootdo/common/utils/SpringContextHolder.java index a756fb92018e4002b754a9a8feb6931db537cee4..b73910550fc749d4d079a7f1d66e5220d50d9f0f 100644 --- a/bootdo/src/main/java/com/bootdo/common/utils/SpringContextHolder.java +++ b/bootdo/src/main/java/com/bootdo/common/utils/SpringContextHolder.java @@ -1,82 +1,82 @@ -package com.bootdo.common.utils; - -import org.apache.commons.lang3.Validate; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.DisposableBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -/** - * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext. - * - */ -@Service -@Lazy(false) -public class SpringContextHolder implements ApplicationContextAware, DisposableBean { - - private static ApplicationContext applicationContext = null; - - private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); - - /** - * 取得存储在静态变量中的ApplicationContext. - */ - public static ApplicationContext getApplicationContext() { - assertContextInjected(); - return applicationContext; - } - - /** - * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. - */ - @SuppressWarnings("unchecked") - public static T getBean(String name) { - assertContextInjected(); - return (T) applicationContext.getBean(name); - } - - /** - * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. - */ - public static T getBean(Class requiredType) { - assertContextInjected(); - return applicationContext.getBean(requiredType); - } - - /** - * 清除SpringContextHolder中的ApplicationContext为Null. - */ - public static void clearHolder() { - if (logger.isDebugEnabled()) { - logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); - } - applicationContext = null; - } - - /** - * 实现ApplicationContextAware接口, 注入Context到静态变量中. - */ - @Override - public void setApplicationContext(ApplicationContext applicationContext) { - SpringContextHolder.applicationContext = applicationContext; - } - - /** - * 实现DisposableBean接口, 在Context关闭时清理静态变量. - */ - @Override - public void destroy() throws Exception { - SpringContextHolder.clearHolder(); - } - - /** - * 检查ApplicationContext不为空. - */ - private static void assertContextInjected() { - Validate.validState(applicationContext != null, - "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."); - } -} \ No newline at end of file +//package com.bootdo.common.utils; +// +//import org.apache.commons.lang3.Validate; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.DisposableBean; +//import org.springframework.context.ApplicationContext; +//import org.springframework.context.ApplicationContextAware; +//import org.springframework.context.annotation.Lazy; +//import org.springframework.stereotype.Service; +// +///** +// * 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext. +// * +// */ +//@Service +//@Lazy(false) +//public class SpringContextHolder implements ApplicationContextAware, DisposableBean { +// +// private static ApplicationContext applicationContext = null; +// +// private static Logger logger = LoggerFactory.getLogger(SpringContextHolder.class); +// +// /** +// * 取得存储在静态变量中的ApplicationContext. +// */ +// public static ApplicationContext getApplicationContext() { +// assertContextInjected(); +// return applicationContext; +// } +// +// /** +// * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. +// */ +// @SuppressWarnings("unchecked") +// public static T getBean(String name) { +// assertContextInjected(); +// return (T) applicationContext.getBean(name); +// } +// +// /** +// * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. +// */ +// public static T getBean(Class requiredType) { +// assertContextInjected(); +// return applicationContext.getBean(requiredType); +// } +// +// /** +// * 清除SpringContextHolder中的ApplicationContext为Null. +// */ +// public static void clearHolder() { +// if (logger.isDebugEnabled()) { +// logger.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); +// } +// applicationContext = null; +// } +// +// /** +// * 实现ApplicationContextAware接口, 注入Context到静态变量中. +// */ +// @Override +// public void setApplicationContext(ApplicationContext applicationContext) { +// SpringContextHolder.applicationContext = applicationContext; +// } +// +// /** +// * 实现DisposableBean接口, 在Context关闭时清理静态变量. +// */ +// @Override +// public void destroy() throws Exception { +// SpringContextHolder.clearHolder(); +// } +// +// /** +// * 检查ApplicationContext不为空. +// */ +// private static void assertContextInjected() { +// Validate.validState(applicationContext != null, +// "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder."); +// } +//} \ No newline at end of file diff --git a/bootdo/src/main/java/com/bootdo/system/controller/UserController.java b/bootdo/src/main/java/com/bootdo/system/controller/UserController.java index 0496048ca9f45bd7d96d06331ad91a988bee5444..12cff876c668a18796db41c615acb85dcaacc730 100644 --- a/bootdo/src/main/java/com/bootdo/system/controller/UserController.java +++ b/bootdo/src/main/java/com/bootdo/system/controller/UserController.java @@ -1,242 +1,242 @@ -package com.bootdo.system.controller; - -import com.bootdo.common.annotation.Log; -import com.bootdo.common.config.Constant; -import com.bootdo.common.controller.BaseController; -import com.bootdo.common.domain.FileDO; -import com.bootdo.common.domain.Tree; -import com.bootdo.common.service.DictService; -import com.bootdo.common.utils.*; -import com.bootdo.system.domain.DeptDO; -import com.bootdo.system.domain.RoleDO; -import com.bootdo.system.domain.UserDO; -import com.bootdo.system.service.RoleService; -import com.bootdo.system.service.UserService; -import com.bootdo.system.vo.UserVO; -import org.apache.catalina.servlet4preview.http.HttpServletRequest; -import org.apache.commons.collections.CollectionUtils; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@RequestMapping("/sys/user") -@Controller -public class UserController extends BaseController { - private String prefix="system/user" ; - @Autowired - UserService userService; - @Autowired - RoleService roleService; - @Autowired - DictService dictService; - @RequiresPermissions("sys:user:user") - @GetMapping("") - String user(Model model) { - return prefix + "/user"; - } - - @GetMapping("/list") - @ResponseBody - PageUtils list(@RequestParam Map params) { - // 查询列表数据 - Query query = new Query(params); - List sysUserList = userService.list(query); - int total = userService.count(query); - PageUtils pageUtil = new PageUtils(sysUserList, total); - return pageUtil; - } - - @RequiresPermissions("sys:user:add") - @Log("添加用户") - @GetMapping("/add") - String add(Model model) { - List roles = roleService.list(); - model.addAttribute("roles", roles); - return prefix + "/add"; - } - - @RequiresPermissions("sys:user:edit") - @Log("编辑用户") - @GetMapping("/edit/{id}") - String edit(Model model, @PathVariable("id") Long id) { - UserDO userDO = userService.get(id); - model.addAttribute("user", userDO); - List roles = roleService.list(id); - model.addAttribute("roles", roles); - return prefix+"/edit"; - } - - @RequiresPermissions("sys:user:add") - @Log("保存用户") - @PostMapping("/save") - @ResponseBody - R save(UserDO user) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword())); - if (userService.save(user) > 0) { - return R.ok(); - } - return R.error(); - } - - @RequiresPermissions("sys:user:edit") - @Log("更新用户") - @PostMapping("/update") - @ResponseBody - R update(UserDO user) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - if (userService.update(user) > 0) { - return R.ok(); - } - return R.error(); - } - - - @RequiresPermissions("sys:user:edit") - @Log("更新用户") - @PostMapping("/updatePeronal") - @ResponseBody - R updatePeronal(UserDO user) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - if (userService.updatePersonal(user) > 0) { - return R.ok(); - } - return R.error(); - } - - - @RequiresPermissions("sys:user:remove") - @Log("删除用户") - @PostMapping("/remove") - @ResponseBody - R remove(Long id) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - if (userService.remove(id) > 0) { - return R.ok(); - } - return R.error(); - } - - @RequiresPermissions("sys:user:batchRemove") - @Log("批量删除用户") - @PostMapping("/batchRemove") - @ResponseBody - R batchRemove(@RequestParam("ids[]") Long[] userIds) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - int r = userService.batchremove(userIds); - if (r > 0) { - return R.ok(); - } - return R.error(); - } - - @PostMapping("/exit") - @ResponseBody - boolean exit(@RequestParam Map params) { - // 存在,不通过,false - return !userService.exit(params); - } - - @RequiresPermissions("sys:user:resetPwd") - @Log("请求更改用户密码") - @GetMapping("/resetPwd/{id}") - String resetPwd(@PathVariable("id") Long userId, Model model) { - - UserDO userDO = new UserDO(); - userDO.setUserId(userId); - model.addAttribute("user", userDO); - return prefix + "/reset_pwd"; - } - - @Log("提交更改用户密码") - @PostMapping("/resetPwd") - @ResponseBody - R resetPwd(UserVO userVO) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - try{ - userService.resetPwd(userVO,getUser()); - return R.ok(); - }catch (Exception e){ - return R.error(1,e.getMessage()); - } - - } - @RequiresPermissions("sys:user:resetPwd") - @Log("admin提交更改用户密码") - @PostMapping("/adminResetPwd") - @ResponseBody - R adminResetPwd(UserVO userVO) { - if (Constant.DEMO_ACCOUNT.equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - try{ - userService.adminResetPwd(userVO); - return R.ok(); - }catch (Exception e){ - return R.error(1,e.getMessage()); - } - - } - @GetMapping("/tree") - @ResponseBody - public Tree tree() { - Tree tree = new Tree(); - tree = userService.getTree(); - return tree; - } - - @GetMapping("/treeView") - String treeView() { - return prefix + "/userTree"; - } - - @GetMapping("/personal") - String personal(Model model) { - UserDO userDO = userService.get(getUserId()); - model.addAttribute("user",userDO); - model.addAttribute("hobbyList",dictService.getHobbyList(userDO)); - model.addAttribute("sexList",dictService.getSexList()); - return prefix + "/personal"; - } - @ResponseBody - @PostMapping("/uploadImg") - R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) { - if ("test".equals(getUsername())) { - return R.error(1, "演示系统不允许修改,完整体验请部署程序"); - } - Map result = new HashMap<>(); - try { - result = userService.updatePersonalImg(file, avatar_data, getUserId()); - } catch (Exception e) { - return R.error("更新图像失败!"); - } - if(result!=null && result.size()>0){ - return R.ok(result); - }else { - return R.error("更新图像失败!"); - } - } -} +package com.bootdo.system.controller; + +import com.bootdo.common.annotation.Log; +import com.bootdo.common.config.Constant; +import com.bootdo.common.controller.BaseController; +import com.bootdo.common.domain.FileDO; +import com.bootdo.common.domain.Tree; +import com.bootdo.common.service.DictService; +import com.bootdo.common.utils.*; +import com.bootdo.system.domain.DeptDO; +import com.bootdo.system.domain.RoleDO; +import com.bootdo.system.domain.UserDO; +import com.bootdo.system.service.RoleService; +import com.bootdo.system.service.UserService; +import com.bootdo.system.vo.UserVO; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.collections.CollectionUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RequestMapping("/sys/user") +@Controller +public class UserController extends BaseController { + private String prefix="system/user" ; + @Autowired + UserService userService; + @Autowired + RoleService roleService; + @Autowired + DictService dictService; + @RequiresPermissions("sys:user:user") + @GetMapping("") + String user(Model model) { + return prefix + "/user"; + } + + @GetMapping("/list") + @ResponseBody + PageUtils list(@RequestParam Map params) { + // 查询列表数据 + Query query = new Query(params); + List sysUserList = userService.list(query); + int total = userService.count(query); + PageUtils pageUtil = new PageUtils(sysUserList, total); + return pageUtil; + } + + @RequiresPermissions("sys:user:add") + @Log("添加用户") + @GetMapping("/add") + String add(Model model) { + List roles = roleService.list(); + model.addAttribute("roles", roles); + return prefix + "/add"; + } + + @RequiresPermissions("sys:user:edit") + @Log("编辑用户") + @GetMapping("/edit/{id}") + String edit(Model model, @PathVariable("id") Long id) { + UserDO userDO = userService.get(id); + model.addAttribute("user", userDO); + List roles = roleService.list(id); + model.addAttribute("roles", roles); + return prefix+"/edit"; + } + + @RequiresPermissions("sys:user:add") + @Log("保存用户") + @PostMapping("/save") + @ResponseBody + R save(UserDO user) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword())); + if (userService.save(user) > 0) { + return R.ok(); + } + return R.error(); + } + + @RequiresPermissions("sys:user:edit") + @Log("更新用户") + @PostMapping("/update") + @ResponseBody + R update(UserDO user) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + if (userService.update(user) > 0) { + return R.ok(); + } + return R.error(); + } + + + @RequiresPermissions("sys:user:edit") + @Log("更新用户") + @PostMapping("/updatePeronal") + @ResponseBody + R updatePeronal(UserDO user) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + if (userService.updatePersonal(user) > 0) { + return R.ok(); + } + return R.error(); + } + + + @RequiresPermissions("sys:user:remove") + @Log("删除用户") + @PostMapping("/remove") + @ResponseBody + R remove(Long id) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + if (userService.remove(id) > 0) { + return R.ok(); + } + return R.error(); + } + + @RequiresPermissions("sys:user:batchRemove") + @Log("批量删除用户") + @PostMapping("/batchRemove") + @ResponseBody + R batchRemove(@RequestParam("ids[]") Long[] userIds) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + int r = userService.batchremove(userIds); + if (r > 0) { + return R.ok(); + } + return R.error(); + } + + @PostMapping("/exit") + @ResponseBody + boolean exit(@RequestParam Map params) { + // 存在,不通过,false + return !userService.exit(params); + } + + @RequiresPermissions("sys:user:resetPwd") + @Log("请求更改用户密码") + @GetMapping("/resetPwd/{id}") + String resetPwd(@PathVariable("id") Long userId, Model model) { + + UserDO userDO = new UserDO(); + userDO.setUserId(userId); + model.addAttribute("user", userDO); + return prefix + "/reset_pwd"; + } + + @Log("提交更改用户密码") + @PostMapping("/resetPwd") + @ResponseBody + R resetPwd(UserVO userVO) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + try{ + userService.resetPwd(userVO,getUser()); + return R.ok(); + }catch (Exception e){ + return R.error(1,e.getMessage()); + } + + } + @RequiresPermissions("sys:user:resetPwd") + @Log("admin提交更改用户密码") + @PostMapping("/adminResetPwd") + @ResponseBody + R adminResetPwd(UserVO userVO) { + if (Constant.DEMO_ACCOUNT.equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + try{ + userService.adminResetPwd(userVO); + return R.ok(); + }catch (Exception e){ + return R.error(1,e.getMessage()); + } + + } + @GetMapping("/tree") + @ResponseBody + public Tree tree() { + Tree tree = new Tree(); + tree = userService.getTree(); + return tree; + } + + @GetMapping("/treeView") + String treeView() { + return prefix + "/userTree"; + } + + @GetMapping("/personal") + String personal(Model model) { + UserDO userDO = userService.get(getUserId()); + model.addAttribute("user",userDO); + model.addAttribute("hobbyList",dictService.getHobbyList(userDO)); + model.addAttribute("sexList",dictService.getSexList()); + return prefix + "/personal"; + } + @ResponseBody + @PostMapping("/uploadImg") + R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) { + if ("test".equals(getUsername())) { + return R.error(1, "演示系统不允许修改,完整体验请部署程序"); + } + Map result = new HashMap<>(); + try { + result = userService.updatePersonalImg(file, avatar_data, getUserId()); + } catch (Exception e) { + return R.error("更新图像失败!"); + } + if(result!=null && result.size()>0){ + return R.ok(result); + }else { + return R.error("更新图像失败!"); + } + } +} diff --git a/bootdo/src/main/java/com/bootdo/system/dao/RoleMenuDao.java b/bootdo/src/main/java/com/bootdo/system/dao/RoleMenuDao.java index 5c7e9783f0c9f0f9347708ae1c0f1568b448bcfe..aa81430fc922b42af90edd44c5fff6fc8f6ddb2c 100644 --- a/bootdo/src/main/java/com/bootdo/system/dao/RoleMenuDao.java +++ b/bootdo/src/main/java/com/bootdo/system/dao/RoleMenuDao.java @@ -33,6 +33,8 @@ public interface RoleMenuDao { List listMenuIdByRoleId(Long roleId); int removeByRoleId(Long roleId); + + int removeByMenuId(Long menuId); int batchSave(List list); } diff --git a/bootdo/src/main/resources/application.yml b/bootdo/src/main/resources/application.yml index 8872c7d71f1d1475491bd6c42dc5a0e483ab9f08..747879725f97f213c025f523ae6248e9b950708a 100644 --- a/bootdo/src/main/resources/application.yml +++ b/bootdo/src/main/resources/application.yml @@ -1,5 +1,4 @@ server: - # context-path: /myboot session-timeout: 1800 # tomcat: # max-threads: 1000 diff --git a/bootdo/src/main/resources/mybatis/system/RoleMenuMapper.xml b/bootdo/src/main/resources/mybatis/system/RoleMenuMapper.xml index e35dfa6a2aebfad30069940f93ed369aeaf6b4c4..a2e33d49c07b484117201b736510dc56d21ce7b4 100644 --- a/bootdo/src/main/resources/mybatis/system/RoleMenuMapper.xml +++ b/bootdo/src/main/resources/mybatis/system/RoleMenuMapper.xml @@ -1,91 +1,95 @@ - - - - - - - - - - - - - insert into sys_role_menu - ( - `role_id`, - `menu_id` - ) - values - ( - #{roleId}, - #{menuId} - ) - - - - update sys_role_menu - - `role_id` = #{roleId}, - `menu_id` = #{menuId} - - where id = #{id} - - - - delete from sys_role_menu where id = #{value} - - - - delete from sys_role_menu where id in - - #{id} - - - - - - - DELETE FROM sys_role_menu WHERE role_id=#{roleId} - - - - INSERT INTO sys_role_menu(role_id, menu_id) values - - (#{item.roleId},#{item.menuId}) - - + + + + + + + + + + + + + insert into sys_role_menu + ( + `role_id`, + `menu_id` + ) + values + ( + #{roleId}, + #{menuId} + ) + + + + update sys_role_menu + + `role_id` = #{roleId}, + `menu_id` = #{menuId} + + where id = #{id} + + + + delete from sys_role_menu where id = #{value} + + + + delete from sys_role_menu where id in + + #{id} + + + + + + + DELETE FROM sys_role_menu WHERE role_id=#{roleId} + + + + DELETE FROM sys_role_menu WHERE menu_id=#{menuId} + + + + INSERT INTO sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + \ No newline at end of file diff --git a/bootdo/src/main/resources/templates/blog/index/include_blog.html b/bootdo/src/main/resources/templates/blog/index/include_blog.html index 4ea1bc0af5c9ac4326f58311c2fec08897f0ebd5..37dd8da4ae05e6edb501c4ee23dcdee9631ac05e 100644 --- a/bootdo/src/main/resources/templates/blog/index/include_blog.html +++ b/bootdo/src/main/resources/templates/blog/index/include_blog.html @@ -1,160 +1,160 @@ - - - - - - -bootdo面向学习型的开源框架 - - - - - - -
-
-
-
-
- - - - -
-
-
-
-
-
    -
  • -
    - -
    - -
  • -
  • - - -
  • -
-
- - - - - - - -
- + + + + + + +bootdo面向学习型的开源框架 + + + + + + +
+
+
+
+
+ + + + +
+
+
+
+
+
    +
  • +
    + +
    + +
  • +
  • + + +
  • +
+
+ + + + + + + +
+