云日记准备工作

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 功能分析

云R记功能分析

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)

字段名称字段类型字段描述
userIdint主键,自增
unamevarchar用户名称
upwdvarchar用户密码
nickvarchar用户昵称
headvarchar用户头像
moodvarchar用户心情

类型表(tb_note_type)

字段名称字段类型字段描述
typeIdint主键,自增
typeNamevarchar类型名称
userIdint用户ID

云记表(tb_note)

字段名称字段类型字段描述
noteIdint主键,自增
titlevarchar标题
contenttext内容
typeIdint类型ID
pubTimedatetime发布时间
lonfloat经度
latfloat纬度

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()));
    }
}

输出日志

image-20210918113955951

至此第一步环境准备搭建成功。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江七7

感谢大佬的赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值