博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
软件工程homework----九宫格记忆网
阅读量:3962 次
发布时间:2019-05-24

本文共 9284 字,大约阅读时间需要 30 分钟。

1.1开发背景

随着工作和生活节奏的不断加快,属于自己的私人时间越来越少,日记这种传统的倾诉方式也逐渐被人们淡忘,取而代之的是各种各样的网络日志。最近网络中又出现了一种全新的日记方式一九宫格日记,它由9个方方正正的格子组成,让用户可以像做填空题那样对号入座,填写相应的内容,从而完成一篇日记,整个过程不过几分钟,非常适合在快节奏的生活中,留下自己的心灵足迹。

在这里插入图片描述

1.2 需求分析

通过实际调查,要求九宫格日记网具有以下功能:

1.为了更好地体现九宫格日记的特点,需要以图片的形式保存每篇日记,并且日记的内容写在九宫格中。

2.为了便于浏览,默认情况下,只显示日记的缩略图。

3.对于每篇日记需要提供查看原图、左转和右转功能。

4.需要提供分页浏览日记列表功能。

5.写日记时,需要提供预览功能。

6.在保存日记时,需要生成日记图片和对应的缩略图。

1.3 系统设计

1.3.1系统目标

根据需求分析的描述及与用户的沟通,现制定网站实现目标如下:

界面友好、美观。区

2.日记内容灵活多变,既可以做选择题,也可以做填空题。

3.采用Ajax实现无刷新数据验证。

4.网站运行稳定可靠。

5.具有多浏览器兼容性,既要保证在Google Chrome上正常运行,又要保证在IE浏览器上正常运行。

1.3.2功能结构

九宫格记忆网的功能结构如下所示。

在这里插入图片描述

1.3.3功能结构

九宫格记忆网的系统流程如下所示:

在这里插入图片描述

1.3.4开发环境

系统开发环境要求

1.操作系统:Windows 10。
2.JDK环境:Java SE Development Kit(JDK) version 8。
3.开发工具:Eclipse。
4.Web服务器:Tomcat 9.0。
5.开发技术:Java Web + Ajax + jQuery。
6.数据库:MySQL 8.0数据库。

1.3.5系统预览

九宫格记忆网中有多个页面,下面列出网站中几个典型页面的预览。

1.主页面如下

当用户访问九宫格记忆网时,首先进入的是网站的主界面。九宫格记忆网的主界面主要包括以下4部分内容。

1.1 Banner信息栏:主要用于显示网站的Logo。
1.2 导航栏:主要用于显示网站的导航信息及欢迎信息。其中导航目将根据是否登录而显示不同的内容。
1.3主显示区:主要用于分页显示九宫格日记列表。
1.4版权信息栏:主要用于显示版权信息。
在这里插入图片描述
2.登录页面如下:
在这里插入图片描述
3.写日记页面如下,该页面用于填写日记信息,允许用户选择并预览自己喜欢的模板,以及选择预览日记内容等等。
在这里插入图片描述
1.4 数据库设计
1.4.1数据库设计
在这里插入图片描述
1.4.2 tb_user(用户信息表)
在这里插入图片描述
1.4.3 tb_diary(日记表)
在这里插入图片描述
1.4.4 tb_comments(评论记录表)
在这里插入图片描述
1.4.5 tb_likes(点赞记录表)
在这里插入图片描述

1.5部分源码

文件夹组织结构

在这里插入图片描述

数据库连接(ConnDB):package com.mr.tools;import java.io.InputStream; //导入java.io.InputStream类import java.sql.*; //导入java.sql包中的所有类import java.util.Properties; //导入java.util.Properties类public class ConnDB {
public Connection conn = null; // 声明Connection对象的实例 public Statement stmt = null; // 声明Statement对象的实例 public ResultSet rs = null; // 声明ResultSet对象的实例 private static String propFileName = "connDB.properties"; // 指定资源文件保存的位置 private static Properties prop = new Properties(); // 创建并实例化Properties对象的实例 private static String dbClassName = "com.mysql.jdbc.Driver"; // 定义保存数据库驱动的变量 private static String dbUrl = "jdbc:mysql://localhost:3306/db_9griddiary?user=root&password=123456&useUnicode=true&"; public ConnDB() {
// 构造方法 try {
// 捕捉异常 // 将Properties文件读取到InputStream对象中 InputStream in = getClass().getResourceAsStream(propFileName); prop.load(in); // 通过输入流对象加载Properties文件 dbClassName = prop.getProperty("DB_CLASS_NAME"); // 获取数据库驱动 // 获取连接的URL dbUrl = prop.getProperty("DB_URL", dbUrl); } catch (Exception e) {
e.printStackTrace(); // 输出异常信息 } } /** * 功能:获取连接的语句 * * @return */ public static Connection getConnection() {
Connection conn = null; try {
// 连接数据库时可能发生异常因此需要捕捉该异常 Class.forName(dbClassName).newInstance(); // 装载数据库驱动 conn = DriverManager.getConnection(dbUrl); // 建立与数据库URL中定义的数据库的连接 } catch (Exception ee) {
ee.printStackTrace(); // 输出异常信息 } if (conn == null) {
System.err .println("警告: DbConnectionManager.getConnection() 获得数据库链接失败.\r\n\r\n链接类型:" + dbClassName + "\r\n链接位置:" + dbUrl); // 在控制台上输出提示信息 } return conn; // 返回数据库连接对象 } /* * 功能:执行查询语句 */ public ResultSet executeQuery(String sql) {
try {
// 捕捉异常 conn = getConnection(); // 调用getConnection()方法构造Connection对象的一个实例conn stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = stmt.executeQuery(sql); } catch (SQLException ex) {
System.err.println(ex.getMessage()); // 输出异常信息 } return rs; // 返回结果集对象 } /* * 功能:执行更新操作 */ public int executeUpdate(String sql) {
int result = 0; // 定义保存返回值的变量 try {
// 捕捉异常 conn = getConnection(); // 调用getConnection()方法构造Connection对象的一个实例conn stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); result = stmt.executeUpdate(sql); // 执行更新操作 } catch (SQLException ex) {
result = 0; // 将保存返回值的变量赋值为0 } return result; // 返回保存返回值的变量 } /* * 功能:关闭数据库的连接 */ public void close() {
try {
// 捕捉异常 if (rs != null) {
// 当ResultSet对象的实例rs不为空时 rs.close(); // 关闭ResultSet对象 } if (stmt != null) {
// 当Statement对象的实例stmt不为空时 stmt.close(); // 关闭Statement对象 } if (conn != null) {
// 当Connection对象的实例conn不为空时 conn.close(); // 关闭Connection对象 } } catch (Exception e) {
e.printStackTrace(System.err); // 输出异常信息} }}配置中文乱码的过滤器(CharacterEncodingFilter)package com.mr.filter;import java.io.IOException;import javax.servlet.*;public class CharacterEncodingFilter implements Filter {
protected String encoding = null; // 定义编码格式变量 protected FilterConfig filterConfig = null; // 定义过滤器配置对象 public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig; // 初始化过滤器配置对象 this.encoding = filterConfig.getInitParameter("encoding"); // 获取配置文件中指定的编码格式 } // 过滤器的接口方法,用于执行过滤业务 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (encoding != null) {
request.setCharacterEncoding(encoding); // 设置请求的编码 // 设置应答对象的内容类型(包括编码格式) response.setContentType("text/html; charset=" + encoding); } chain.doFilter(request, response); // 传递给下一个过滤器 } public void destroy() {
this.encoding = null; this.filterConfig = null; }}编写实体类User.javapackage com.mr.model;public class User {
private int id = 0;// 用户ID private String username = "";// 用户名 private String pwd = "";// 密码 private String email = "";// E-mail地址 private String question = "";// 密码提示问题 private String answer = "";// 密码提示问题答案 private String city = "";// 所在地 public String getEmail() {
return email; } public void setEmail(String email) {
this.email = email; } public String getQuestion() {
return question; } public void setQuestion(String question) {
this.question = question; } public String getAnswer() {
return answer; } public void setAnswer(String answer) {
this.answer = answer; } public String getCity() {
return city; } public void setCity(String city) {
this.city = city; } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } public String getPwd() {
return pwd; } public void setPwd(String pwd) {
this.pwd = pwd; }}Diary.javapackage com.mr.model;import java.util.Date;import java.util.LinkedList;import java.util.List;/** * 日记类 * */public class Diary {
private int id = 0;// 日记ID号 private String title = "";// 日记标题 private String address = "";// 日记图片地址 private Date writeTime = null;// 写日记的时间 private int userid = 0;// 用户ID private String username = "";// 用户名 private List
comments;// 日志评论 private int likes;// 点赞数 public Diary() {
super(); } public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getTitle() {
return title; } public void setTitle(String title) {
this.title = title; } public String getAddress() {
return address; } public void setAddress(String address) {
this.address = address; } public Date getWriteTime() {
return writeTime; } public void setWriteTime(Date writeTime) {
this.writeTime = writeTime; } public int getUserid() {
return userid; } public void setUserid(int userid) {
this.userid = userid; } public List
getComments() {
return comments; } public void setComments(List
comments) {
this.comments = comments; } public int getLikes() {
return likes; } public void setLikes(int likes) {
this.likes = likes; }}Comment.javapackage com.mr.model;/** * 评论类 * */public class Commnet {
private int id;// 留言编号 private String fromUserName;// 留言人 private String content;// 留言内容 private String create_time;// 留言时间 private boolean valid;// 是否有效 public Commnet() {
super(); } public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getContent() {
return content; } public void setContent(String content) {
this.content = content; } public String getFromUserName() {
return fromUserName; } public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName; } public String getCreate_time() {
return create_time; } public void setCreate_time(String create_time) {
this.create_time = create_time; } public boolean isValid() {
return valid; } public void setValid(boolean valid) {
this.valid = valid; }}

1.6小 结

以上介绍的九宫格记忆网中,应用到了很多关键的技术,这些技术在开发过程中都是比较常用的技术。例如,采用了DIV+CSS布局、用户注册功能是通过Ajax实现的、在Servlet中生成日记图片技术和生成缩略图技术等,

转载地址:http://myezi.baihongyu.com/

你可能感兴趣的文章
偶然发现的面包屑
查看>>
CentOS 7 下挂载NTFS文件系统磁盘并设置开机自动挂载
查看>>
非插件实现Typecho语法高亮
查看>>
windows 下 netsh 实现 端口映射(端口转发)
查看>>
两个好用的命令行工具 watch 和 rsync
查看>>
信安入门神级书单
查看>>
【IPFS指南】IPFS的竞争对手们(一)
查看>>
docker更换国内镜像
查看>>
CentOS 下 tree命令用法详解
查看>>
docker上传镜像至Registry时https报错解决方法
查看>>
安装 docker-compose (实测可用,妈妈再也不用担心被墙了)
查看>>
docker下删除none的images
查看>>
Linux提权获取敏感信息方法
查看>>
Ubuntu 16.04开机A start job is running for Raise network interface(5min 4s)解决方法
查看>>
Ubuntu 16.04开机隐藏菜单缩短时间
查看>>
Ubuntu 更换国内源
查看>>
Ubuntu16.04下Docker pull connection refused 解决办法
查看>>
postgres基本操作(个人总结版)
查看>>
The AnimationClip 'Walk' used by the Animation component 'Pig' must be marked as Legacy.
查看>>
《Linux内核设计与实现》- Linux的进程
查看>>