【版本】
当前版本号v20230328
版本 | 修改说明 |
---|---|
v20230328 | 修改项目名为iot-lock-p01.zip |
v20230131 | 重新整理项目 |
v20220411 | 提醒注意配置 IDEA 的 Maven 配置 |
v20220316 | 初始化 |
任务3.1 创建名称为 iot-lock 的 Maven 项目
【任务目的】
- 掌握 Maven 项目的创建与配置
【任务环境】
- IDEA
- Maven 3.6
- MariaDB 10.4
- JDK 8
【任务步骤】
打开IDEA,点击菜单
文件
->新建
->项目
( File -> New -> Project )选择
Maven Archetype
菜单,分别输入项目名称、JDK版本和Archetype,然后创建新项目。打开 IDEA 设置(Settings)
设置你的 Maven 安装路径
下载
repos.zip
文件,并且解压到你的Maven 安装目录/repos
目录下。即你Maven配置的本地仓库路径打开
pom.xml
文件,修改单元测试框架 JUnit
的版本号(version)。
- 修改前
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
- 修改后
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
右键点击
pom.xml
,选择Maven
-> 重新加载项目(Reload Project
),把依赖包引入到项目中。在
src
目录下新建一个存放测试代码的目录test\java
在
src\test\java
目录新建一个单元测试类MyFirstTest
,代码如下。
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class MyFirstTest {
@Test
public void testPlus(){
assertEquals(2,1+1);//测试1+1的结果
}
@Test
public void testMinus(){
assertEquals(1,1-1);//测试1-1的结果
}
}
- 运行这个单元测试,查看测试结果,如果是√表示测试通过;如果是×表示测试不通过。
任务3.2 编写一个模拟密码解锁的案例
【任务目的】
- 掌握 MVC 模型
- 掌握 Java 编程中接口的实现
- 掌握 Java 列表的使用
【任务环境】
- IDEA
- Maven 3.6
- MariaDB 10.4
- JDK 8
【任务说明】
- 本任务主要编写一个Java的应用程序,用于校验用户输入密码是否有效。
- 密码有效的条件为
- (1) 密码状态为
enabled
- (2) 密码全部由数字组成,长度6-18位。
- (3) 密码不能超过过期时间
【任务效果】
【任务步骤】
在上面创建的
iot-lock
项目的src
目录下新增\main\java
目录,用于存放项目代码。在
\main\java
目录下,新建名为stu你的学号后3位
的软件包
,注意替换为你的学号后三位。请根据以下结构创建响应的
软件包
(Package)和类
(Class)
PwdEntity
- 类
PwdEntity
用于装载密码信息。并根据下表中描述,编写对应的属性和 Getter 和 Setter。请同学们自己完成代码。
属性 | 类型 | 说明 |
---|---|---|
id | 字符串 | 行编号,数字自增 |
typ | 字符串 | 密码类型,固定-fixed,临时-temp |
pwd | 字符串 | 密码,长度不超过18位 |
status | 字符串 | 状态,启用-enabled,禁用-disabled |
uptTime | java.util.Date | 更新时间 |
expiredTime | java.util.Date | 过期时间 |
MockDB
- 模拟数据库的类
MockDB
,用于装载密码。类名和代码如下。注意替换学号
package stu替换为你学号后3位.mockdb;
import stu替换为你学号后3位.entity.PwdEntity;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 模拟数据库
*/
public class MockDB {
/**
* 密码列表
*/
public static List<PwdEntity> PASSWORD_LIST=new ArrayList<>();
static{
//一个不会过期的固定密码
PwdEntity pe1=new PwdEntity();
pe1.setPwd("123456");
pe1.setTyp("fixed");
pe1.setExpiredTime(new Date(new Date().getTime()+1000*60*30));
pe1.setStatus("enabled");
//一个禁用了的临时密码
PwdEntity pe2=new PwdEntity();
pe2.setPwd("000000");
pe2.setTyp("temp");
pe2.setExpiredTime(new Date(new Date().getTime()+1000*60*30));
pe2.setStatus("disabled");
//一个启用,但是过期了的临时密码
PwdEntity pe3=new PwdEntity();
pe3.setPwd("666666");
pe3.setTyp("temp");
pe3.setExpiredTime(new Date(new Date().getTime()-1000*60*30));
pe3.setStatus("enabled");
PASSWORD_LIST.add(pe1);
PASSWORD_LIST.add(pe2);
PASSWORD_LIST.add(pe3);
}
}
PwdService 和 PwdServiceImpl
- 编写 Service 层代码,实现从数据库中检查密码是否匹配。注意替换学号和完善
PwdServiceImpl
的代码。
package stu替换为你学号后3位.service;
public interface PwdService {
/**
* 如果密码正确,则返回true,否则返回false
* @param password 密码
* @return
*/
boolean isValidPassword(String password);
}
package stu替换为你学号后3位.service.impl;
import stu替换为你学号后3位.PwdEntity;
import stu替换为你学号后3位.mockdb.MockDB;
import stu替换为你学号后3位.service.PwdService;
import java.util.Date;
import java.util.List;
public class PwdServiceImpl implements PwdService {
/**
* 如果密码正确,则返回true,否则返回false
*
* @param password 密码
* @return
*/
@Override
public boolean isValidPassword(String password) {
boolean result=false;
List<PwdEntity> pwdList= MockDB.PASSWORD_LIST;
for(PwdEntity pe:pwdList){
if(密码是启用状态){//如果密码是启用了
if(pe.getExpiredTime()!=null){
//有过期期限的密码,临时密码
if(密码未过期){
//如果未超过当前时间,即未过期
if(密码匹配){
result=true;
}
}
}else{
//不会过期的密码,固定密码
if(密码匹配){
result=true;
}
}
}
if(result){
return result;
}
}
return result;
}
}
测试用例
- 在
test/java/
目录下新增一个测试用例PwdServiceTest
,用于测试PwdServiceImpl
是否正常。
import org.junit.Test;
import stu替换为你学号后3位.service.PwdService;
import stu替换为你学号后3位.service.impl.PwdServiceImpl;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class PwdServiceTest {
private PwdService pwdService=new PwdServiceImpl();
@Test
public void test_isValidPassword1(){
assertTrue(pwdService.isValidPassword("123456"));
}
@Test
public void test_isValidPassword2(){
assertFalse(pwdService.isValidPassword("000000"));
}
@Test
public void test_isValidPassword3(){
assertFalse(pwdService.isValidPassword("666666"));
}
}
UnlockController
- 编写一个 Controller 层代码,实现解锁功能并提示解锁结果消息。注意替换学号。
package stu替换为你学号后3位.controller;
import stu替换为你学号后3位.service.PwdService;
import stu替换为你学号后3位.service.impl.PwdServiceImpl;
import java.util.regex.Pattern;
public class UnlockController {
private PwdService pwdServiceImpl=new PwdServiceImpl();
public String unlock(String pwd){
if(pwd==null){
return "请输入有效密码";
}else {
Pattern pattern = Pattern.compile("[0-9]*");
if(pattern.matcher(pwd).matches()) {
if(pwd.length()<6||pwd.length()>18){
return "密码要求6-18位";
}else {
if (pwdServiceImpl.isValidPassword(pwd)) {
return "密码正确";
} else {
return "密码错误";
}
}
}else{
return "密码只能是数字";
}
}
}
}
UnlockApplication
- 编写一个应用程序,作为解锁应用的入口。注意替换学号。
package stu替换为你学号后3位;
import stu替换为你学号后3位.controller.UnlockController;
import java.util.Scanner;
public class UnlockApplication {
public static void main(String[] args){
UnlockController unlockController=new UnlockController();
Scanner scanner = new Scanner(System.in);
String pwd=null;
System.out.print("请输入密码解锁:");
while(scanner.hasNextLine()){
pwd=scanner.nextLine();
System.out.println(unlockController.unlock(pwd));
System.out.print("请输入密码解锁:");
}
}
}
- 启动
UnlockApplication
,输入密码进行测试。
任务3.3 iot-lock 项目引入 Springboot 搭建 Web 项目
【任务目的】
- 掌握 Springboot 的搭建。
【任务环境】
- IDEA
- Maven 3.6
- MariaDB 10.4
- JDK 8
- iot-lock-p01项目代码
【任务效果】
- 访问智能锁首页输入密码进行解锁
【任务说明】
iot-lock-p01.zip
包含的项目是使用 Web 项目形式模拟一个智能锁。使用了内置硬编码的密码123456
进行解锁。- 本项目利用 Maven 引入
Spring Boot
和beetl
框架,前端使用到了bootstrap
和jQuery
框架。 - 以下为一些关键代码的说明:
pom.xml
- pom.xml 文件的
<dependencies></dependencies>
标签内引入了Spring Boot
和beetl
框架依赖的包。
<!-- Springboot Web 相关依赖包 Start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- Springboot Web 相关依赖包 End -->
<!-- 前端模板引擎 beetl start-->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.13.0.RELEASE</version>
</dependency>
<!-- 前端模板引擎 beetl end-->
<!-- SpringBoot 开发者工具 start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
<!-- SpringBoot 开发者工具 end-->
BeetlConfiguration.java
- 此类为配置 Beetl 的参数类。包括 Beetl 模板放置在项目哪个路径下,使用模板文件后缀名等等。
IndexController.java
- 首页访问的是
IndexController.index
方法
UnlockController.java
- 解锁按钮调用的是
UnlockController.unlock
方法
application.yml
- 包含了应用程序的基本配置
前端页面
- 前端的页面放在
src/main/resources/templates
路径下
【任务步骤】
下载
iot-lock-p01.zip
项目代码,把代码复制到 iot-lock 项目内。把
iot-lock-p01.zip
项目内的 pom.xml 覆盖原有的 pom.xml 。新建一个应用程序配置,用于启动
IoTLockApplication
。主类输入iot.cloud.platform.lock.IoTLockApplication
,程序实参输入-Dspring.output.ansi.enabled=ALWAYS
、启动
IoTLockApplication
。正常情况下,IDEA 控制台应该会有类似以下日志打印输出。
Tomcat started on port(s): 8097 (http) with context path ''
Started IoTLockApplication in 2.076 seconds (JVM running for 2.459)
- 访问应用首页http://localhost:8097/,使用密码
123456
解锁。