采用Quartz任务调度框架,模拟微信步数排行
- 用户输入账号、密码登录
- 登陆成功,在个人中心页面,显示用户基本信息
- 在任务触发时间,刷新页面,可以看到当日步行排行榜
-
目录结构
添加pom依赖
4.0.0
com.example
quartz
0.0.1-SNAPSHOT
jar
quartz
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.projectlombok
lombok
1.16.10
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-thymeleaf
org.webjars
bootstrap
3.3.7-1
org.springframework.boot
spring-boot-devtools
true
true
com.spring4all
swagger-spring-boot-starter
1.8.0.RELEASE
com.github.xiaoymin
swagger-bootstrap-ui
1.8.4
org.springframework.boot
spring-boot-starter-quartz
org.springframework.boot
spring-boot-maven-plugin
-
实体类
- SportUser类
package com.example.quartz.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Data
public class SportUser {
@GeneratedValue
@Id
private Integer id;
private String account;
private String password;
private String avatar;
private String nickName;
public SportUser() {
}
public SportUser(String account, String password, String avatar, String nickName) {
this.account = account;
this.password = password;
this.avatar = avatar;
this.nickName = nickName;
}
@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
@JoinColumn(name = "sportUser_id")
private List steps = new ArrayList<>();
public SportUser(String account, String password, String avatar, String nickName, List steps) {
this.account = account;
this.password = password;
this.avatar = avatar;
this.nickName = nickName;
this.steps = steps;
}
}
- Step类
package com.example.quartz.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.Date;
@Entity
@Data
public class Step {
@GeneratedValue
@Id
private Integer id;
private String account;
private Date date;
private String number;
public Step() {
}
public Step(String account, Date date, String number) {
this.account = account;
this.date = date;
this.number = number;
}
}
DAO层
- LoginRepository
package com.example.quartz.dao;
import com.example.quartz.entity.SportUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface LoginRepository extends JpaRepository {
@Query("from SportUser u where u.account = :account")
SportUser findUser(@Param("account") String account);
}
- StepRepository
package com.example.quartz.dao;
import com.example.quartz.entity.Step;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface StepRepository extends JpaRepository {
@Query("FROM Step a WHERE DATEDIFF(a.date,NOW())=0 ORDER BY a.number DESC")
List find();
@Query("from Step u WHERE DATEDIFF(u.date,NOW())=0 and u.account = :account")
Step findUser(@Param("account") String account);
}
配置类
- QuartzConfig
package com.example.quartz.factory;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@Configuration
public class QuartzConfig {
@Autowired
private SpringJobFactory springJobFactory;
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(springJobFactory);
return schedulerFactoryBean;
}
@Bean
public Scheduler scheduler() {
return schedulerFactoryBean().getScheduler();
}
}
- SpringJobFactory
package com.example.quartz.factory;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Component;
@Component
public class SpringJobFactory extends AdaptableJobFactory {
@Autowired(required=true)
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
- SportJob
package com.example.quartz.factory;
import com.example.quartz.service.StepService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class SportJob {
@Resource
private StepService stepService;
//设置每天下午16:16分更新数据
@Scheduled(cron = "0 16 16 * * ? ")
public void updateTodayWalks() throws Exception {
stepService.updateWalks();
}
}
Service层
- LoginService
package com.example.quartz.service;
import com.example.quartz.entity.SportUser;
import com.example.quartz.entity.Step;
import java.util.List;
public interface LoginService {
List get (String account, String password);
SportUser check(String account,String password);
List getAll();
}
-LoginServiceImpl
package com.example.quartz.service.Impl;
import com.example.quartz.dao.LoginRepository;
import com.example.quartz.dao.StepRepository;
import com.example.quartz.entity.SportUser;
import com.example.quartz.entity.Step;
import com.example.quartz.service.LoginService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class LoginServiceImpl implements LoginService {
@Resource
private LoginRepository loginRepository;
@Resource
private StepRepository stepRepository;
@Override
public List get(String account, String password) {
return loginRepository.findAll();
}
@Override
public SportUser check(String account, String password) {
List users = loginRepository.findAll();
SportUser user = new SportUser();
for (int i=0;i getAll() {
return stepRepository.findAll();
}
}
-StepService
package com.example.quartz.service;
public interface StepService {
void updateWalks();
}
-StepServiceImpl
package com.example.quartz.service.Impl;
import com.example.quartz.dao.StepRepository;
import com.example.quartz.entity.Step;
import com.example.quartz.service.StepService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Random;
@Service
public class StepServiceImpl implements StepService{
@Resource
private StepRepository stepRepository;
@Override
public void updateWalks() {
List list = stepRepository.findAll();
Random random = new Random();
for (int i=0;i
Controller层
-LoginController
package com.example.quartz.controller;
import com.example.quartz.dao.StepRepository;
import com.example.quartz.entity.SportUser;
import com.example.quartz.service.LoginService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping()
public class LoginController {
@Resource
private LoginService loginService;
@Resource
private StepRepository stepRepository;
@RequestMapping(value = "/SportUser")
public String show(HttpServletRequest request, ModelMap modelMap) {
String account = request.getParameter("account");
String password = request.getParameter("password");
SportUser sportUser = loginService.check(account,password);
modelMap.addAttribute("sportUser",sportUser);
modelMap.addAttribute("userStep",stepRepository.findUser(account));
modelMap.addAttribute("steps",stepRepository.find());
return "home";
}
@RequestMapping("/login")
public String login(){
return "login";
}
}
前端
- login.html
登录界面
- home.html
主界面
今日排行
用户姓名
今日步数
您今日的运动量
距离为7.3公里
今天走的路程较多,请注意休息哦,按摩小腿可以有效缓解酸痛感
合理定制运动计划,能让身体更能接受哦
实现效果
image.png
image.png