1、项目设计
2、项目简介
云R记软件就是用于记录日常生活点滴。一款跨平台的简单快速的个人记事备忘工具,并且能够实现
PC、移动设备和云端之间的信息同步,简洁高效。将会议记录、日程安排、生活备忘,奇思妙想、快乐
趣事以及任何突发灵感都可快速记录到系统中。
本系统采用 B/S 架构,使用 BootStrap + Jsp + Servlet + MySQL+ Tomcat
开发,使用 Maven 构建,采用 Junit 单元测试、Log4j 搭建日志、使用 POI 导入导出报表,操作 DB 使用大名鼎鼎的 DBUtil,同时 V2 版本使用 MongoDB 数据库,底层使用 Redis 做缓存,采用 Git 进行分布式版本控制开发。
本项目包含用户模块、类型模块、云记模块、数据报表、首页模块这几个核心模块,核心主旨是掌握功
能的分析以及前后台数据交互。
3、项目流程(一般情况)
阶段 | 文档 |
---|---|
立项 | 成立项目,执行实施 |
调研 | 调研报告 |
需求分析 | 需求分析报告(面向客户),《需求规格说明书》 |
规格分析 | 规格分析文档(面向技术人员) |
前端 | 静态页面 |
后端 | 数据库设计报告、开发规范文档 |
编码 | 单元测试 |
测试 | 测试文档 |
实施 | 上线报告 |
需求变更 | … |
4、需求分析
4.1 功能分析
4.2 技术选型
- JSP
- Servlet
- Jquery及插件
- Ueditor
- log4j
- Junit
4.3 技术细节
- 增删改查
- 免登录:Session 和 Cookie
- 非法访问:过滤器 Filter
- 文件上传
- 分页
- Ajax:Dom操作
- 富文本编辑器
4.4 开发环境
IDEA + Maven + MySQL8 + Jdk11 + Tomcat
5、数据库设计
根据系统架构设计,本系统采用简单灵巧的 MySQL 数据库,遵循关系型数据库标准,符合三范式设
计,一切从简,相关表如下。
5.1 E-R图表
5.2 表结构详情
用户表(tb_user)
字段名称 | 字段类型 | 字段描述 |
---|---|---|
userId | int | 主键,自增 |
uname | varchar | 用户名称 |
upwd | varchar | 用户密码 |
nick | varchar | 用户昵称 |
head | varchar | 用户头像 |
mood | varchar | 用户心情 |
类型表(tb_note_type)
字段名称 | 字段类型 | 字段描述 |
---|---|---|
typeId | int | 主键,自增 |
typeName | varchar | 类型名称 |
userId | int | 用户ID |
云记表(tb_note)
字段名称 | 字段类型 | 字段描述 |
---|---|---|
noteId | int | 主键,自增 |
title | varchar | 标题 |
content | text | 内容 |
typeId | int | 类型ID |
pubTime | datetime | 发布时间 |
lon | float | 经度 |
lat | float | 纬度 |
6、环境搭建
6.1 创建Maven项目(web-app)
项目结构
创建好 Maven Web项目之后,对应的目录结构如下:
修改配置
在 pomx.xml 配置文件中,修改配置、添加依赖与插件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jiangqi</groupId>
<artifactId>CloudDiary</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!-- junit 测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- web servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 日志打印相关的jar -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- mysql 驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- json 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
<!-- hutool工具集 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.11</version>
</dependency>
<!-- commons-io 依赖 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- 添加百度编辑器ueditor支持 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- jstl依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
<build>
<finalName>cloudDiary</finalName>
<plugins>
<!-- 编译环境插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port> <!-- 启动端口 默认:8080 -->
<path>/note</path> <!-- 项目的站点名,即对外访问路径 -->
<server>tomcat7</server> <!-- 服务器名称 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
6.2 数据库连接
配置文件
在 src/main/resources 目录下,新建 db.properties 文件
# 连接MYSQL数据库的配置文件 注:等号的前后不要写空格
# 驱动名
jdbcName=com.mysql.cj.jdbc.Driver
# 数据库连接 ( clouddiary是数据库的名称)
dbUrl=jdbc:mysql://localhost:3306/clouddiary?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
# 数据库的连接账号 (账号基本上都是root)
dbName=root
# 数据库的连接密码 (每个人的数据库密码可能不一致,需要修改)
dbPwd=root
编写 DBUtil
在 com.jiangqi.note.util 目录下,新建 Java 类
package com.jiangqi.note.util;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/** * @author 江七 * @version 1.0 * @date 2021/9/18 10:17 */
public class DBUtil {
//定义配置对象
private static Properties properties = new Properties();
static {
try {
//加载配置文件(输入流)
//获取当前类的类加载器,并根据getResourceAsStream函数去获取配置文件资源
InputStream in = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
//通过load()方法将输入流的内容加载到配置文件对象中
properties.load(in);
// 通过配置对象的getProperty()方法得到驱动名,加载驱动
Class.forName(properties.getProperty("jdbcName"));
} catch (Exception e) {
e.printStackTrace();
}
}
/** * 获取数据库连接 * * @return */
public static Connection getConnection() {
Connection con = null;
try {
//得到数据库连接的相关信息
String dbUrl = properties.getProperty("dbUrl");
String dbName = properties.getProperty("dbName");
String dbPwd = properties.getProperty("dbPwd");
//得到数据库的连接
con = DriverManager.getConnection(dbUrl, dbName, dbPwd);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
/** * 关闭资源 * 当资源对象不为空时,关闭资源 * * @param res 结果集对象 * @param pre 预编译对象 * @param con 连接对象 */
public static void close(ResultSet res, PreparedStatement pre, Connection con) {
//判断资源对象如果不为空,则关闭
try {
if (res != null) {
res.close();//关闭资源
}
if (pre != null) {
pre.close();//关闭资源
}
if (con != null) {
con.close();//关闭资源
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
6.3 单元测试
单元测试方法
1. 方法的返回值,建议使用 void,一般没有返回值
2. 参数列表,建议空参,一般是没有参数的
3. 方法上需要设置 @Test 注解
4. 每个方法都能独立运行
5. 结果:
绿色:成功
红色:失败
测试目录
在 src/main 目录下,新建 test 目录(测试目录),新建 java 目录(测试源文件夹)
测试数据库
在 test/java 目录的 com.jiangqi.note 包下,新建测试类
package com.jiangqi.note;
import com.jiangqi.note.util.DBUtil;
import org.junit.Test;
/** * @author 江七 * @version 1.0 * @date 2021/9/18 10:46 */
public class TestDB {
@Test
public void testDB(){
System.out.println(DBUtil.getConnection());
}
}
测试成功
6.4 使用日志
配置文件
在 src/main/resources 目录下,新建 log4j.properties 文件
### 设置###stdout,
log4j.rootLogger = all,D,E,stdout
### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### 输出DEBUG 级别以上的日志到=D://logs/log.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ]
使用方式
package com.jiangqi.note;
import com.jiangqi.note.util.DBUtil;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
/** * @author 江七 * @version 1.0 * @date 2021/9/18 10:46 */
public class TestDB {
// 使用日志工厂类,记录日志
private static Logger logger = LoggerFactory.getLogger(DBUtil.class);
@Test
public void testDB(){
System.out.println(DBUtil.getConnection());
// 记录日志
//{} 占位符
logger.info("在{}时,获取数据库连接", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
输出日志
至此第一步环境准备搭建成功。