【版本】
当前版本号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解锁。
