Spring Boot + Quartz综合练习

实体类

  • SportUser.java
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;

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
    @JoinColumn(name = "sportUser_id")
    private List<Step> steps = new ArrayList<>();

    public SportUser() {
    }

    public SportUser(String account, String password, String avatar) {
        this.account = account;
        this.password = password;
        this.avatar = avatar;
    }


    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
}
  • Step.java
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;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

dao层

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;

import java.util.List;

public interface LoginRepository extends JpaRepository<SportUser,Integer> {
    @Query("from SportUser u where u.account = :account")
    SportUser findUser(@Param("account") String account);
}
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<Step,Integer> {
    @Query("FROM Step a WHERE DATEDIFF(a.date,NOW())=0 ORDER BY a.number DESC")
    List<Step> find();

    @Query("from Step u WHERE DATEDIFF(u.date,NOW())=0 and u.account = :account")
    Step findUser(@Param("account") String account);

}

config

package com.example.quartz.config;

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();
    }
}
package com.example.quartz.config;

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
    private AutowireCapableBeanFactory capableBeanFactory;

    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}

service

package com.example.quartz.service;

import com.example.quartz.entity.SportUser;
import com.example.quartz.entity.Step;
import com.example.quartz.entity.SportUser;
import com.example.quartz.entity.Step;

import java.util.List;

public interface LoginService {
    List<SportUser> get(String account, String password);

    SportUser check(String account, String password);

    List<Step> getAll();
}
package com.example.quartz.service;

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 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<SportUser> get(String account, String password) {
        return loginRepository.findAll();
    }

    @Override
    public SportUser check(String account, String password) {
        List<SportUser> users = loginRepository.findAll();
        SportUser user = new SportUser();
        for (int i=0;i<users.size();i++){
            String name = users.get(i).getAccount();
            String pass = users.get(i).getPassword();
            if (name.equals(account)){
                if (pass.equals(password)){
                    user = users.get(i);
                }
            }
        }
        return user;
    }

    @Override
    public List<Step> getAll() {
        return stepRepository.findAll();
    }
}
package com.example.quartz.service;

import com.example.quartz.dao.StepRepository;
import com.example.quartz.entity.Step;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Slf4j
@Component
public class SportJob  {
    @Resource
    private StepRepository stepRepository;
    @Scheduled(cron = "40 14 2 * * ?")
    public void execute() throws Exception{
        Date date = new Date();
        Step[] steps = {
                new Step("111",date,"4673"),
                new Step("222",date,"1287"),
                new Step("333",date,"3576"),
                new Step("444",date,"1245"),
                new Step("555",date,"7467"),
        };
        for (int i = 0 ; i < 5 ;i++){
            stepRepository.save(steps[i]);
        }
    }
}

界面

  • login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
    <meta charset="UTF-8">
    <title>登录界面</title>
    <link rel="stylesheet" href="//www.greatytc.com/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
    <style>
        .content{
            background-color: rgb(61,55,67)
        }
        .navbar-n{
            background-color: rgb(61,55,67)
        }
        .search{
            margin-top: -25px;
            margin-left: 950px;
            font-size: 16px;
            color: white
        }
        .content{
            margin-top: -30px;
            margin-left: 1050px;
            font-size: 16px;
            color: white
        }
        .user{
            margin-top: -30px;
            margin-left: 1150px;
            width: 20px;
            height: 20px
        }
        .login{
            margin-top: -20px;
            margin-left: 1177px;
            font-size: 16px;
            color: white
        }
        .wechat{
            margin-top: -30px;
            margin-left: 1300px;
            width: 30px;
            height: 30px
        }
        .weibo{
            margin-top: -28px;
            margin-left: 1340px;
            width: 30px;
            height: 30px
        }
        .twitter{
            margin-top: -28px;
            margin-left: 1380px;
        }
        .ins{
            margin-top: -28px;
            margin-left: 1420px;
        }
        .form{
            height: 710px;
        }
        .panell{
            margin-left: 560px;
            margin-top: 150px;
            width: 400px;
            height: 342px;
            background-color: rgb(88,76,96);
            border-color: rgb(88,76,96)
        }
        .loginn{
            font-size: 18px;
            color: white;
        }
        .register{
            margin-top: -36px;
            margin-left: 50px;
            font-size: 18px;
            color: rgb(37,31,42)
        }
        .inputt{
            height: 45px;
            background-color: rgb(69,61,75);
            border-color: rgb(69,61,75)
        }
        .input2{
            color: white;
            height: 45px;
            background-color: rgb(69,61,75);
            border-color: rgb(69,61,75);
            width: 300px
        }
        .inputtt{
            height: 45px;
            background-color: rgb(69,61,75);
            border-color: rgb(69,61,75);
        }
        .password{
            height: 45px;
            background-color: rgb(69,61,75);
            border-color: rgb(69,61,75);
            width: 308px;
            color: white;
        }
        .foot{
            background-color: rgb(221,221,221);
            height: 90px
        }
        .way{
            margin-left: 110px;
            margin-top: 20px;
            color: rgb(141,135,147);
            font-size: 12px
        }
        .qq{
            width: 18px;
            height: 18px;
            margin-left: 210px;
            margin-top: -57px
        }
        .weibo1{
            margin-top: -57px;
            margin-left: 10px;
        }


    </style>
</head>
<body class="content">
<div>
    <nav class="navbar navbar-default navbar-n">
        <div class="container-fluid">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">
                    <img src="https://staticweb.keepcdn.com/showstatic/images/logo-16fc21eba7.png">
                    <p class="search">发现精选</p>
                    <p class="content">课程内容</p>
                    <img src="img/user.png" class="user">
                    <p class="login">登录/注册</p>
                    <img src="img/wechat.png" class="wechat">
                    <img src="img/weibo.png" class="weibo">
                    <img src="img/twitter.png" class="twitter">
                    <img src="img/ins.png" class="ins">
                </a>
            </div>
        </div>

        <form action="/SportUser" method="post" id="login" class="form">
            <div class="panel panel-default panell" >
                <div class="panel-body">
                    <table>
                        <tr>
                            <td>
                                <p class="loginn">登录</p>
                                <p class="register">注册</p>
                            </td>

                        </tr>
                        <tr>
                            <td>
                                <div class="input-group" >
                                    <span  class="input-group-addon inputt" id="basic-addon1">+86</span>
                                    <input type="text" name="account" class="form-control input2" placeholder="账号" >
                                </div>
                            </td>
                        </tr>
                        <tr>
                        <td height="30px"></td>
                        </tr>
                        <tr>

                            <td>
                                <div class="input-group" >
                                    <span class="input-group-addon inputtt" id="basic-addon2" >
                                        <img src="img/password.png">
                                    </span>
                                    <input  type="password" name="password" class="form-control password" placeholder="密码" >
                                </div>
                            </td>
                        </tr>
                        <tr>
                            <td style="height: 30px"></td>
                        </tr>
                        <tr>
                            <td>
                                <button style="width: 350px" type="submit" id="button" class="btn btn-success">登录</button>
                            </td>
                        </tr>
                        <tr>
                            <td style="height: 20px"></td>
                        </tr>
                    </table>
                </div>
                <div class="panel-footer foot">
                    <p class="way">其他登录方式:</p>
                    <img src="img/qq.png" class="qq">
                    <img src="img/weibo.png" class="weibo1">
                </div>
            </div>
        </form>
</div>
</body>
</html>
  • home.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html>
<head>
    <meta charset="UTF-8">
    <title>主界面</title>
    <link rel="stylesheet" href="//www.greatytc.com/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" />
    <style>
        .avatar{
            width: 70px;
            height: 70px;
        }
        .navbar1{
            background-color: rgb(61,55,67);
            height: 65px;
            border-color: rgb(2,2,2);
        }
        .content{
            background-color: rgb(61,55,67);
        }
        .avatar1{
            width: 50px;
            height: 50px;
            margin-left: 1250px;
            margin-top: -42px;
        }
        .account{
            margin-left: 1315px;
            margin-top: -35px;
            color: white;
            font-size: 18px;
        }
        .number{
            color: white;
            font-size: 30px;
        }
        .num{
            color: white;
            font-size: 25px;
        }
        .step{
            margin-left: 20px;
            margin-top:20px;
            font-size: 50px;
            color:rgb(49,165,110);
        }
        .way{
            color: white;
            font-size: 22px;
        }
        .set{
            padding-top: 20px;
            background-color: rgb(88,79,96);
            height: 380px
        }
        .thumbnail2{
            background-color: rgb(88,79,96);
            border-color: rgb(88,79,96);
        }
        .set2{
            color: white;
            font-size: 20px;
        }

    </style>
</head>
<body class="content" >
    <div>
        <nav class="navbar navbar-default navbar1" >
            <div class="container-fluid">
                <div class="navbar-header">
                    <a class="navbar-brand" href="#">
                        <img src="https://staticweb.keepcdn.com/showstatic/images/logo-16fc21eba7.png">
                        <img th:src="${sportUser.avatar}" class="img-circle avatar avatar1">
                        <p th:text="'' + ${sportUser.account}" class="account"></p>
                    </a>
                </div>
            </div>
        </nav>
    </div>

    <div class="container">
        <div class="row">
            <div class="col-md-8">
                <div style="padding-top: 50px">
                    <p class="number">
                        您今日的活动量:
                    </p>
                </div>
                <p class="num">步数:</p>
                <p class="step" th:text="${userStep.number}"></p>
                <p class="way">距离5.60公里</p>
                <p class="way">热量126千卡</p>
                <p class="way">生命在于运动</p>
                <P class="way">今日的步数还没有达到10000步标准哦~继续加油哦</P>
                <p></p>
            </div>
            <div class="col-md-4"  style="padding-top: 50px">
                <div class="set">
                    <div class="thumbnail thumbnail2" >
                        <h1 style="color: white;" align="center">好友排行</h1>
                        <div class="row">
                            <div class="col-md-6">
                                <div style="margin-left: 20px">
                                    <p class="set2">我的好友</p>
                                </div>

                            </div>
                            <div class="col-md-6">
                                <div style="margin-left: 20px">
                                    <p class="set2">今日步数</p>
                                </div>
                            </div>
                            <div class="row">
                                <div th:each="step:${steps}">
                                    <div style="margin-top: 30px">
                                        <div class="col-md-6">
                                            <div style="margin-left: 50px;">
                                                <p style="color: rgb(221,221,221)" th:text="${step.account}"></p>
                                            </div>
                                        </div>
                                        <div class="col-md-6">
                                            <div style="margin-left: 50px">
                                                <p style="color:rgb(49,165,110);" th:text="${step.number}"></p>
                                            </div>
                                        </div>
                                    </div>

                                </div>
                            </div>
                </div>

            </div>
        </div>
    </div>

    </div>
</div>
</body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,110评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,723评论 2 59
  • 所谓“楗”,即闭塞的开关,即锁。内,指内心世界。内楗,字面意思是从内心深处锁住。本篇意为通过适当的游说探知君主的内...
    Mr_Hz阅读 771评论 0 0
  • BL萌芽源于《萌芽》。 读书的时候喜欢买杂志,那时候我还是个初中生。有一期描述了一段感情,用现在的话讲就是一个写作...
    敬千帆阅读 173评论 1 0