蘑菇钉自动打卡项目

 

蘑菇钉自动打卡

首先就是一个大坑,spring 在依赖注入的时候,如果是直接new 出来的对象,该对象中的所有依赖注入都是不生效的!!切记

在项目打包的时候,使用bulid标签来进行打包配置,在上方也需要添加packing为jar

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <!-- 这个需要是主类的路口 -->
                <mainClass>AutoWork.ApplicationAutoWork</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

使用jar包打包对于springboot项目来说是再好不过了,打包成war包会有很多问题,反而丧失了springboot的快捷性

返回前端页面

在开发中经常需要返回前端一个html页面,我是使用thymeleaf框架来解决的,添加以下依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

文件树 在资源文件夹创建static和templates这两个文件夹,其中templates用来放html文件,static用来放css或者图片资源

└─resources
    ├─mapper
    ├─static
    |    login.css
    │    login.jpg
    |   
    └─templates
         index.html

新建一个新的Controller 该Controller使用@Controller注解,不使用@RestController注解

@Controller
public class HtmlController {
    @GetMapping()
    public String index() throws IOException {
        //这个index指向templates下的index
        return "index";
    }
}

如果我需要我的前端页面与后端交互,那么十有八九会碰到跨域调用的问题,需要在Controller中添加 @CrossOrigin允许跨域

前端页面的逻辑

主要工作任务就将表单中的数据做一个请求,交给服务器,求后端允许CORS

        //todo 修改前端的端口号
        let rootHttpUrl = 'mgddaka.icu:888';

        function putIn() {
            console.log("提交");
            const phone = formInfo.phone.value;
            const pwd = formInfo.pwd.value;
            const email = formInfo.email.value;
            const address = formInfo.address.value;
            const info = formInfo.info.value;
            //
            if (phone.toString() === "" ||
                pwd.toString() === "" ||
                email.toString() === "" ||
                address.toString() === "" ||
                info.toString() === "") {
                alert("输入不能为空")
                return
            }
            var httpUrl = 'http://' + rootHttpUrl + '/user/add'
            var jsonString = '{' +
                '"phone":"' + phone + '",' +
                '"pwd":"' + pwd + '",' +
                '"mail_addre":"' + email + '",' +
                '"addres":"' + address + '",' +
                '"info":"' + info + '"}'
            console.log(jsonString)
            // 异步对象
            var xhr = new XMLHttpRequest();
            // 设置属性
            xhr.open('post', httpUrl, true);
            xhr.setRequestHeader("Content-type", "application/json");
            xhr.onload = function () {
                alert(xhr.responseText);
            }
            xhr.send(jsonString);
        }

        function logOff() {
            console.log("注销");
            const phone = formInfo.phone.value;
            const pwd = formInfo.pwd.value;
            //
            if (phone.toString() === "" ||
                pwd.toString() === "") {
                alert("手机和密码不能为空")
                return
            }
            var httpUrl = 'http://' + rootHttpUrl + '/user/delete'
            var jsonString = '{' +
                '"phone":"' + phone + '",' +
                '"pwd":"' + pwd + '"}';
            console.log(jsonString)
            // 异步对象
            var xhr = new XMLHttpRequest();
            // 设置属性
            xhr.open('delete', httpUrl, true);
            xhr.setRequestHeader("Content-type", "application/json");
            xhr.onload = function () {
                alert(xhr.responseText);
            }
            xhr.send(jsonString);
        }

服务器处理定时任务的逻辑

使用ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);来创建一个定时的线程池,scheduleAtFixedRate方法参数1为ran对象,参数2为开始延迟,参数3为间隔时间,参数4为单位

        executorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    log.info("开始打上班卡");
                    punchClock.upWork();
                } catch (Exception e) {
                    e.printStackTrace();
                    try {
                        EmailSender.sendInfo("上班打卡出错,请检查日志\n" + e.toString(), "phcbest2017@outlook.com");
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
            }
        }, start, oneDay, TimeUnit.MILLISECONDS);