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