Part 3 - 物联网云平台开发框架搭建

2022-03-16
7分钟阅读时长

【版本】

当前版本号v20230131

版本修改说明
v20230131重新整理项目
v20220411提醒注意配置 IDEA 的 Maven 配置
v20220316初始化

【实验名称】3.1 创建名称为 iot-lock 的 Maven 项目

【实验目的】

  • 掌握 Maven 项目的创建与配置

【实验环境】

  • IDEA
  • Maven 3.6
  • MariaDB 10.4
  • JDK 8

【实验步骤】

  1. 打开IDEA,点击菜单文件->新建->项目( File -> New -> Project )

  2. 选择Maven Archetype菜单,分别输入项目名称、JDK版本和Archetype,然后创建新项目。

  3. 打开 IDEA 设置(Settings)

  4. 设置你的 Maven 安装路径

  5. 下载repos.zip文件,并且解压到你的Maven 安装目录/repos目录下。即你Maven配置的本地仓库路径

  6. 打开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>
  1. 右键点击pom.xml,选择 Maven-> 重新加载项目(Reload Project),把依赖包引入到项目中。

  2. src目录下新建一个存放测试代码的目录test\java

  3. 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的结果
  }
}

  1. 运行这个单元测试,查看测试结果,如果是√表示测试通过;如果是×表示测试不通过。

【实验名称】3.2 编写一个模拟密码解锁的案例

【实验目的】

  • 掌握 MVC 模型
  • 掌握 Java 编程中接口的实现
  • 掌握 Java 列表的使用

【实验环境】

  • IDEA
  • Maven 3.6
  • MariaDB 10.4
  • JDK 8

【实验说明】

  1. 本实验主要编写一个Java的应用程序,用于校验用户输入密码是否有效。
  2. 密码有效的条件为
  • (1) 密码状态为enabled
  • (2) 密码全部由数字组成,长度6-18位。
  • (3) 密码不能超过过期时间

【实验效果】

【实验步骤】

  1. 在上面创建的iot-lock项目的src目录下新增\main\java目录,用于存放项目代码。

  2. \main\java目录下,新建名为stu你的学号后3位软件包,注意替换为你的学号后三位。

  3. 请根据以下结构创建响应的软件包(Package)和(Class)

PwdEntity

  1. PwdEntity用于装载密码信息。并根据下表中描述,编写对应的属性和 Getter 和 Setter。请同学们自己完成代码。
属性类型说明
id字符串行编号,数字自增
typ字符串密码类型,固定-fixed,临时-temp
pwd字符串密码,长度不超过18位
status字符串状态,启用-enabled,禁用-disabled
uptTimejava.util.Date更新时间
expiredTimejava.util.Date过期时间

MockDB

  1. 模拟数据库的类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

  1. 编写 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;
  }
}

测试用例

  1. 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

  1. 编写一个 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

  1. 编写一个应用程序,作为解锁应用的入口。注意替换学号。
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("请输入密码解锁:");
    }
  }
}
  1. 启动UnlockApplication,输入密码进行测试。

【实验名称】3.3 iot-lock 项目引入 Springboot 搭建 Web 项目

【实验目的】

  • 掌握 Springboot 的搭建。

【实验环境】

  • IDEA
  • Maven 3.6
  • MariaDB 10.4
  • JDK 8
  • iot-lock-p1项目代码

【实验效果】

  1. 访问智能锁首页输入密码进行解锁

【实验说明】

  1. iot-lock-p1.zip包含的项目是使用 Web 项目形式模拟一个智能锁。使用了内置硬编码的密码123456进行解锁。
  2. 本项目利用 Maven 引入Spring Bootbeetl框架,前端使用到了bootstrapjQuery框架。
  3. 以下为一些关键代码的说明:

pom.xml

  • pom.xml 文件的<dependencies></dependencies>标签内引入了Spring Bootbeetl框架依赖的包。
<!-- 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 路径下

【实验步骤】

  1. 下载iot-lock-p1.zip项目代码,把代码复制到 iot-lock 项目内。

  2. iot-lock-p1.zip项目内的 pom.xml 覆盖原有的 pom.xml 。

  3. 新建一个应用程序配置,用于启动IoTLockApplication。主类输入iot.cloud.platform.lock.IoTLockApplication,程序实参输入-Dspring.output.ansi.enabled=ALWAYS

  4. 启动IoTLockApplication

  5. 正常情况下,IDEA 控制台应该会有类似以下日志打印输出。

Tomcat started on port(s): 8097 (http) with context path ''
Started IoTLockApplication in 2.076 seconds (JVM running for 2.459)
  1. 访问应用首页http://localhost:8097/,使用密码123456解锁。