蘑菇钉自动打卡
首先就是一个大坑,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);