1、 《WEB技术》 课程设计报告 题目:_________用户信息管理系统____________ 学 院 计算机与信息工程学院 班 级 ____商务1101______ 学 号 ___ 1112200108_ __ 姓 名 ___ 张怀平_ _____ _ 2013年 6 月 一、任务书 本系统是由我个人自己完成。系统设计目标如下: 表1 设计目标 用户管理基本功能分为前台客户使用部分、后台管理员使用部分。 前台基本功能,包括客户注册、客户登
2、录、客户基本资料修改,密码修改,客户信息查看等功能。 后台基本功能,包括用户查询、添加用户、用户资料修改、删除用户等功能。 开发环境 Mysql,Tomcat,MyEclipse,windows 运行环境 Windows,Tomcat,Mysql 二、设计报告 1、功能分析 1.1 功能概况 该系统主要分为前台系统和后台系统。前台系统功能包括用户注册,用户登陆,用户信息查看,用户密码修改等功能。后台只有管理员才可以登陆,主要功能有系统用户的添加,系统用户信息的修改,系统用户信息的查询,系统用户删除等。 管理员默认的的账户是yishaoku,密码是123。
3、如果想改变可以在数据库中的t_manager中进行修改。普通用户系统中已经存在一些。如:账户:azhang,姓名:张怀平,密码:yishaoku等。 系统功能流程图如下: 图1 1.2 系统角色设计 该用户管理系统的角色主要由两类,普通用户角色和管理员角色。其中普通用户又可以分为未注册用户,和已经注册用户。两类用户各自的权限如下: 用户: 图2 管理员: 图3 1.3 主要业务流程设计 1.3.1 用户注册 图4 1.3.2 用户登陆 图5 1.3.3 用
4、户修改密码 图6 1.3.4 管理员添加用户 图7 1.3.5 管理员修改用户信息 图8 1.3.6 管理员删除用户 图9 2、数据库表设计 本系统主要是模拟用户的信息管理,主要涉及两张表,普通用户信息表t_user,管理员信息表t_manager。 普通用户信息表如下: 表2 字段名 数据类型 长度 含义 备注 user_id varchar 11 用户账号 主码
5、user_name varchar 50 用户姓名 非空 password varchar 50 用户密码 非空 contact_tel varchar 20 联系电话 非空 email varchar 50 电子邮箱 非空 create_date datetime 无 申请日期 非空 普通用户信息表t_user的ER图如下: 图10 管理员信息表如下: 表3 字段名 数据类型 长度 含义 备注 n
6、ame varchar 50 用户账号 主码 password varchar 50 用户姓名 非空 管理员信息表ER图如下: 图11 3、功能实现 普通用户信息表和管理员信息的表通过两个JavaBean来封装,代码如下: 普通用户: package com.bjsxt.drp.business.usermgr.model; import java.util.Date; public class User { private String userId; private String userName; p
7、rivate String password; private String contactTel; private String email; private Date createDate; public String getContactTel() { return contactTel; } public void setContactTel(String contactTel) { this.contactTel = contactTel; } public Date getCreateDate() {
8、return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public vo
9、id setPassword(String password) { this.password = password; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) {
10、 this.userName = userName; } } 管理员如下: package com.bjsxt.drp.business.usermgr.model; public class Manager { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public S
11、tring getPassword() { return password; } public void setPassword(String password) { this.password = password; } } 整个系统对数据库的操作是一个重要的环节,因为对数据库的操作是一个耗资源的操作,所以连接数据库和操作数据库的代码要合理设计,本系统对数据库操作代码如下: package com.bjsxt.drp.business.util; import java.sql.*; public class DB { publ
12、ic static Connection getConn() { Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_user?user=root&password=yishaoku"); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQL
13、Exception e) { e.printStackTrace(); } return conn; } public static void closeConn(Connection conn) { try { if(conn != null) { conn.close(); conn = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void closeStmt(Statement
14、 stmt) { try { if(stmt != null) { stmt.close(); stmt = null; } } catch (SQLException e) { e.printStackTrace(); } } public static void closeRs(ResultSet rs) { try { if(rs != null) { rs.close(); rs = null; } } catch (SQLException e) { e
15、printStackTrace(); } } } 上面的代码是连接数据库服务器,查询服务,修改服务和关闭数据库连接的代码。接下来介绍该系统具体实现对用户表的CRUD(增删改查)的操作。代码如下: 具体操作用户信息表的代码: package com.bjsxt.drp.business.usermgr.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; i
16、mport java.sql.Statement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import com.bjsxt.drp.business.usermgr.model.User; import com.bjsxt.drp.business.util.DB; public class UserDao4MySqlImpl implements UserDao { public void addUser(Connection conn, User
17、 user) { String sql = "insert into t_user(user_id, user_name, password, contact_tel, email, create_date) " + "values(?, ?, ?, ?, ?, ?)"; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getUserId()); pstmt.setString(2, user.g
18、etUserName()); pstmt.setString(3, user.getPassword()); pstmt.setString(4, user.getContactTel()); pstmt.setString(5, user.getEmail()); pstmt.setTimestamp(6, new Timestamp(user.getCreateDate().getTime())); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace()
19、 } finally { DB.closeStmt(pstmt); } } public void deleteUsers(Connection conn, String[] userIdList) { StringBuffer sbfSql = new StringBuffer(); for (int i = 0; i < userIdList.length; i++) { sbfSql.append("'").append(userIdList[i]).append("'").append(","); } String sq
20、l = "delete from t_user where user_id in (" + sbfSql.substring(0, sbfSql.length() - 1) + ")"; Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); } finally { DB.closeStmt(stmt); DB.c
21、loseConn(conn); } } public List findAllUserList() { String sql = "select * from t_user order by user_id "; Connection conn = null; Statement stmt = null; ResultSet rs = null; List userList = new ArrayList(); try { conn = DB.getConn(); stmt = conn.createStatement()
22、 rs = stmt.executeQuery(sql); while (rs.next()) { User user = new User(); user.setUserId(rs.getString("user_id")); user.setUserName(rs.getString("user_name")); user.setPassword(rs.getString("password")); user.setContactTel(rs.getString("contact_tel")); user.set
23、Email(rs.getString("email")); user.setCreateDate(rs.getTimestamp("create_date")); userList.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { DB.closeRs(rs); DB.closeStmt(stmt); DB.closeConn(conn); } return userList; } public User
24、 findUserById(String userId) { String sql = "select * from t_user where user_id=?"; User user = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DB.getConn(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, userId);
25、 rs = pstmt.executeQuery(); if (rs.next()) { user = new User(); user.setUserId(rs.getString("user_id")); user.setUserName(rs.getString("user_name")); user.setPassword(rs.getString("password")); user.setContactTel(rs.getString("contact_tel")); user.setEmail(rs.get
26、String("email")); user.setCreateDate(rs.getTimestamp("create_date")); } } catch (SQLException e) { e.printStackTrace(); } finally { DB.closeRs(rs); DB.closeStmt(pstmt); DB.closeConn(conn); } return user; } public User userSearch(String userId,String passwor
27、d) { String sql = "select * from t_user where user_id=? and password=?"; User user = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DB.getConn(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, userId); pstmt.s
28、etString(2, password); rs = pstmt.executeQuery(); if (rs.next()) { user = new User(); user.setUserId(rs.getString("user_id")); user.setUserName(rs.getString("user_name")); user.setPassword(rs.getString("password")); user.setContactTel(rs.getString("contact_tel"));
29、 user.setEmail(rs.getString("email")); user.setCreateDate(rs.getTimestamp("create_date")); } } catch (SQLException e) { e.printStackTrace(); } finally { DB.closeRs(rs); DB.closeStmt(pstmt); DB.closeConn(conn); } return user; } public void modifyUser(Conne
30、ction conn, User user) { String sql = "update t_user set user_name=?, password=?, contact_tel=?, email=? where user_id=?"; PreparedStatement pstmt = null; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, user.getUserName()); pstmt.setString(2, user.getPassword());
31、 pstmt.setString(3, user.getContactTel()); pstmt.setString(4, user.getEmail()); pstmt.setString(5, user.getUserId()); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { DB.closeStmt(pstmt); } } } 操作管理员的代码: package com.bjsxt.drp
32、business.usermgr.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.bjsxt.drp.business.usermgr.model.Manager; import com.bjsxt.drp.business.util.DB; public class ManagerDao4MySqlImpl implements Manager
33、Dao { public Manager findManager(String name, String password) { String sql = "select * from t_manager where name=? and password=?"; Manager manager = null; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = DB.getConn(); pstmt =
34、 conn.prepareStatement(sql); pstmt.setString(1, name); pstmt.setString(2, password); rs = pstmt.executeQuery(); if (rs.next()) { manager = new Manager(); manager.setName(rs.getString("name")); manager.setPassword(rs.getString("password")); } } catch (SQLExceptio
35、n e) { e.printStackTrace(); } finally { DB.closeRs(rs); DB.closeStmt(pstmt); DB.closeConn(conn); } return manager; } } 在网页之间跳转和将数据写入数据库中等操作都会设计使用中文的问题,为了很好的解决中文乱码问题,本系统使用了Filter(过滤器)来处理中文乱码。 代码如下: package com.bjsxt.drp.business.util; import java.io.IOExcep
36、tion; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.
37、HttpServletResponse; public class AotoriFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest hq = (HttpServletRequest) request; HttpServletResponse hp = (H
38、ttpServletResponse) response;
hp.setContentType("text/html;charset=GBK");
hq.setCharacterEncoding("GBK");
filterChain.doFilter(request, response);
}
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
}
过滤器在web.xml中的配置如下:
39、r>
40、验证代码如下:
系统功能截图:
后台 48、登陆界面:
图12
后台管理页面:
图13
前台用户登陆界面:
图13
后台管理员添加用户界面:
图14
用户注册界面:
图15
4、个人总结
本系统虽然功能有限,但也是我按照一般软件的开发流程一步一步进行的,从需求分析,到数据库的设计,再到具体编码的实现,再到测试运行。按部就班的进行,让我再一次感受到了软件开发的严谨性和规范性。在具体开发过程中也遇到了很多问题,但是借助于互联网络最终都得到了解决。该系统功能不是很完善,但是我在设计的时候考虑到了可扩展行,可以很方便的在该系统上扩展新的功能,我提供了很多接口,便于以后扩展使用。因为最近在看设计模式的书,所以在编写具体代码的使用,我也有意识的使用了一些设计模式,比如:单例模式,工厂模式,接口模式等等。使用这些设计模式可以让该系统具备更好的扩展性和可维护性。当然本系统也还存在一些不足,比如权限问题,如果一个用户直接访问管理员登陆成功的页面的话,那么成功进入。这时候就需要实现权限管理,这个可以使用一个Filter来实现,在Filer中判断用户是否有访问某一个页面的权限,有的话就允许访问,没有的话就自动跳转到登陆页面。总之,这次课设让我学到很多东西,有很大的收获。
第 24 页 共 24 页






