




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Web应用开发课程设计说明书课程设计说 明书38课设题目: 指导教师:学 院:学生姓名:学 号:专业班级:2015 年 01月 02日 成绩评定 姓 名:学号:班级:评 分项目分数程 序功能完善(30 分)回 答问题正确(20 分)设 计报告规范(30 分)(结 构完整,图表正确,文字通顺,版面工整)代 码质量(10 分)(类、方法及变量等的命名符合规范,主要方法及 字段有注释,程序有适当缩进)平 时表现(10 分)( 独立完成,态度认真)评 定成绩目 录1系统开发目标及设计思想11.1系统开发基本目标11.2系统开发设计思想12关键技术23系统功能设计34各功能代码设计45使用说明56设计体
2、会6参考文献71系统开发目标及设计思想 1.1系统开发基本目标 该系统包括以下功能: 1面向图书的功能有:图书列表的查询,图书入库,图书修订,图书的快速定位查询,由于此系统所面向的功能有限,所以将图书的作者和出版社加以细分,有出版社的管理,包括出版社的添加,出版社的修改,出版社的移除等,为了更方便的实现添加图书。同时还有对图书作者的单独管理,如对作者的查询,增加以及修改等。2面向管理员的功能有:管理员的登录,注册功能,管理员的修改以及显示等,还有管理员对读者的管理,即对用户实现的一些列操作,如对读者的增删改查,以及读者借阅图书和归还图书等。此系统功能设计以图书和管理员为重心:本系统的主要功能模
3、块主要有以上所提及的这些,还有较多小功能设计,如一些特效的显示等。 1.2系统开发设计思想 (1)采用学校现有的软件和硬件环境以及设计要求开发系统。 (2)系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充,维护。 (3)程序设计符合面向对象的思想和原则。 (4)要有良好的程序风格(类、方法及变量等的命名要符合规范;类、方法及字段要有注释;程序有适当缩进) (5)采用文件对数据进行存储。 (6)人机界面美观,操作方便、实用。 2关键技术 一、 数据库逻辑结构设计(1)E-R图向关系模型的转换:读者(读者ID,姓名,学号,性别,所在院系)此为读者实体对
4、应的关系模式管理员(管理员ID,姓名,帐号,密码,注册时间)此为管理员实体对应的关系模式图书(ISBN,书名,出版社,价格,版本号,出版日期,图书图片,作者,库存量,借阅状态)借阅(图书ISBN,读者ID)此为联系“借阅”的关系模型归还(图书ISBN,读者ID)此为联系“归还”的关系模式(2)数据模型的优化:1) 确定数据依赖。 2) 对于各个关系模式之间的数据依赖进行极小化处理,消除冗余的联系。3) 按照数据依赖的理论对关系模式进行逐一分析。4) 按照要求分析阶段得到的处理要求,分析这样的应用环境这些模式是否合适。确定是否要对某些模式进行合并或分解。5) 对关系模式进行必要的分解,提高数据操
5、作的效率和存储空间的利用率。(水平分解,垂直分解)。二、数据库表设计根据系统需求,可以进行具体的表的设计,表4-1是所有数据库表的汇总。表2-1 数据库汇总表表名说明borrowUser读者列表,存放读者借书的相关信息bookusers管理员表,存放管理员的相关信息数据库中的各个表的逻辑结构设计结果如下面的几个表格所示,每个表格表示数据库中的一个表。表2-2 图书表(titles)字段名类型说明isbnvarchar(20)Primary Keytitlevarchar(100)图书名,非空editionNumberint版本号,非空imageFilevarchar(20)文件图片路径pric
6、efloat图书价格borrowTimeint借阅最大期限isBorrowint是否被借出borrowIDint外键,读者ID,非空表2-3 读者表(borrowUser)字段名类型说明borrowIDintPrimary KeyborrowNamevarchar(50)读者姓名,非空departmentvarchar(50)所在系sexvarchar(50)性别studyNumvarchar(20)学号,非空表2-4 管理员表(bookusers)字段名类型说明userIdintPrimary Keyaccoutvarchar(20)帐号,非空passwordvarchar(20)密码,非空
7、namevarchar(20)用户名,非空3系统功能设计 一、 系统管理员模块功能该模块主要包括对管理员进行注册,销户,修改账户信息等。管理员可以通过注册一个账号登录管理系统,之后对所注册用户进行统一管理,用户列表显示了所有注册用户的用户名,密码,帐号以及注册时间等操作,管理员可以对所有注册的帐号进行修改和移除。二、 读者模块功能该模块主要有对读者用户的注册,销户修改功能。读者列表主要显示读者的姓名,学号,性别,所在系,这里主要存放借书还书的对象。如果想要借书或还书,就必须先通过管理员登录进行注册,成为该系统的读者用户,进而才能对书籍进行借还。三、 图书借还模块功能该模块主要是对图书进行借还操
8、作的一个管理模块,列表主要显示图书的isbn号,书名,借阅状态以及最大借阅期限等信息。对于书名加以不同的链接,由于图书和作者的关系是一对多,即一本图书只能借给一个人,一个人可以借多本不同的图书,所以根据每本书的借阅状态不同,链接对象也不一样,当此书已借出,点击进入的就是归还页面,归还对象即为借书的读者;若此书状态为未借出,则点击链接会进入到借书页面,借书对象是所有注册的读者用户。管理员可以选择某一位用户进行借出工作。四、 图书管理模块功能 该模块主要是对图书进行统一的管理,功能包括对图书的入库,移出,修订,快速检索等,图书列表主要显示图书的isbn,书名,出版社,价格,版本号,出版年份。点击书
9、名进入图书详细页面,能看到该图书的详细信息,除刚才所说信息外还有该书籍的作者以及图片,和正被借阅的读者用户名。同时在列表页面可根据图书的isbn和书名进行模糊查询,能更好的定位某本书或某些书。4各功能代码设计 一、 管理员模块1.登录页面截图:图4-1 登陆界面代码部分:通过网址的login.ii在web.xml文件中找到控制器ListUserServlet类,在获得切割后字符串login,找到下面处理代码,再调用DAO层login()方法进行处理,如果传入的帐号和密码能够获得一个用户,则让其登陆成功,并加载用户列表,若用户名密码不正确则提示错误信息。if(action.equals(&quo
10、t;/login")tryString account = request.getParameter("userAccount");String password = request.getParameter("password");boolean flag = false;PrintWriter out = response.getWriter();UserModel user = dao.login(account.trim(), password.trim();if(user != null)flag = true;session.set
11、Attribute("userName", user.getUserName();out.print(flag);out.flush();out.close();catch(Exception e)System.out.println("用户登录异常!");e.printStackTrace();throw new ServletException();数据层login()方法实现:传入两个字符串变量,在用sql语句查询数据库,返回用户对象。public UserModel login(final String account,final String
12、password) String sql = ""List<UserModel> list = null;sql = "select * from bookusers where account=? and password=?"list = super.querySql(sql, new IParamBingding() public void bingParam(PreparedStatement stmt)throws SQLException stmt.setString(1, account);stmt.setString(2, p
13、assword);, new UserRowMapper();return (list.size() = 0 | list = null) ? null : list.get(0);2.列表显示页面截图:图4-2 管理员列表显示模块代码部分:控制器代码,页面通过请求list转到web.xml通过匹配找到servlet包下面的ListUserServlet类,然后通过字符串切割得到list字符串,根据list找到下面控制器代码,再调用数据层的queryAll部分查询数据库的所有管理员信息,并在列表上显示。if(action.equals("/list")tryList<
14、UserModel> users = dao.queryAll();request.setAttribute("users", users);/step2获得转发器RequestDispatcher rd=request.getRequestDispatcher("userMain.jsp");/step3转发rd.forward(request,response);catch(Exception e)e.printStackTrace();throw new ServletException();queryAll()方法的实现(查询所有管理员用户
15、的信息):public List<UserModel> queryAll() String sql = "select * from bookusers"return super.querySql(sql, new UserRowMapper();queryAll()调用querySql()方法进行sql查询语句操作public List querySql(String sql,IRowMapper mapper)Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;Li
16、st list = new ArrayList();tryconn = db.getConnection();stmt = conn.prepareStatement(sql);logger.debug(sql);rs = stmt.executeQuery();while(rs.next()Object obj = mapper.mappingRow(rs);list.add(obj);catch (Exception e) logger.debug("执行sql语句异常");e.printStackTrace();finallydb.closeResultSet(rs)
17、;db.closeStatement(stmt);db.closeConnection(conn);return list;3.管理员注册截图:图4-3管理员注册模块代码部分:根据regist.ii找到此类的部分,在从页面获得文本框的内容,通过业务层方法save()将用户注册信息保存到数据库,并调用通用类的方法getAccount()给用户生成随机且不重复帐号,作为用户登录时的id。tryString userName = request.getParameter("username");System.out.println(userName);String passwor
18、d = request.getParameter("pwd");UserModel user = new UserModel();user.setUserName(userName);user.setPassword(password);dao.save(user);/用session保存用户帐号session.setAttribute("userName", userName);String acc = dao.getAccount(userName,password);session.setAttribute("account",
19、 acc);response.sendRedirect("bookusers/registOk.jsp");catch(Exception e)response.sendRedirect("bookusers/registFail.jsp");生成图片验证码的方法:Map<String, BufferedImage> map = ImageUtil.getImage();String code = map.keySet().iterator().next();/将验证码暂时保存,用来与用户输入做比较session.setAttribute(&
20、quot;code", code);BufferedImage image = map.get(code);response.setContentType("image/jepg"); OutputStream ops = response.getOutputStream(); /对原始图片(image)按照指定的压缩算法(jpeg)进行压缩,然后再输出到ops javax.imageio.ImageIO.write(image, "jpeg", ops); ops.close();生成随机不重复账号:通过所在年份和0-9999之间的随机数之和
21、产生4-7位不等的数据,作为唯一的idpublic class AccountMaker static Random random = new Random();public static String getAccount()List<Character> list = new ArrayList<Character>();String str = getYear();int num = str.length();int k = random.nextInt(num);System.out.println(k);for(int i=0;i<num;i+)list
22、.add(str.charAt(i);for(int j=0;j<k;j+)String c = String.valueOf(random.nextInt(9);list.add(k, c.charAt(0);StringBuffer sb = new StringBuffer();for(Character c:list)sb.append(c);return sb.toString();public static String getYear()long now=System.currentTimeMillis()/1000/3600/24/365+1970 + random.ne
23、xtInt(9999);return String.valueOf(now);二、读者管理模块1.读者列表截图:图4-4 读者列表代码部分:此控制器为BorrowUserServlet,里面主要对读者的一些功能进行处理并转发页面。该控制器会响应用户在浏览器输入的后缀带.uu的请求,如“list.uu”。当web.xml接收到“list.uu”时会自动跳到该类中处理。该类分割字符串得到“list”,在跳到以下分支代码处理if (action.equals("/list") try List<BorrowUser> users = dao.findAll();req
24、uest.setAttribute("users", users);/ step2获得转发器RequestDispatcher rd = request.getRequestDispatcher("userMain.jsp");/ step3转发rd.forward(request, response); catch (Exception e) e.printStackTrace();throw new ServletException();该分支调用DAO层findAll()方法查询数据库,返回读者列表的list集合。以下是findAll()方法的实现
25、:public List<BorrowUser> findAll() String sql = "select * from borrowUser"return super.querySql(sql, new BorrowUserMapper();同样此处调用数据封装的querySql()方法,此处要对sql查询的结果集进行处理,故创建一个内部类BorrowUserMapper:class BorrowUserMapper implements IRowMapperpublic Object mappingRow(ResultSet rs) throws SQL
26、Exception BorrowUser user = new BorrowUser();user.setBorrowId(rs.getInt("borrowID");user.setBorrowName(rs.getString("borrowName");user.setStudyNum(rs.getString("studyNum");user.setSex(rs.getString("sex");user.setDepartMent(rs.getString("department");
27、return user;2.添加读者:截图:图4-5 添加读者代码部分:对于读者的数据库表进行分析得到,添加读者信息应该包括姓名,学号,性别,所在系等字段。在点击添加按钮时,用户会发送add.uu请求,web.xml会将请求转发到控制器。再根据分割得到字符串“add”,进入以下代码块:通过request获得页面参数,b并将其绑定到实体类BorrowUser的user实体中,再调用DAO层add方法,将数据插入数据库中tryString borrowName = new String(ParamUtil.getString(request.getParameter("borrowNam
28、e").getBytes("iso-8859-1"),"gbk");String studyNum = new String(ParamUtil.getString(request.getParameter("studyNum").getBytes("iso-8859-1"),"gbk");String sex = new String(ParamUtil.getString(request.getParameter("sex").getBytes("is
29、o-8859-1"),"gbk");String department = new String(ParamUtil.getString(request.getParameter("department").getBytes("iso-8859-1"),"gbk");BorrowUser user = new BorrowUser();user.setBorrowName(borrowName);user.setStudyNum(studyNum);user.setSex(sex);user.setDep
30、artMent(department);dao.add(user);response.sendRedirect("jump_do.jsp");catch (Exception e) e.printStackTrace();throw new ServletException();DAO层add()方法的实现:public void add(final BorrowUser bUser) String sql = "insert into borrowUser(borrowName,studyNum,sex,department) values(?,?,?,?)&q
31、uot;super.updateSql(sql, new IParamBingding() public void bingParam(PreparedStatement stmt) throws SQLException stmt.setString(1, bUser.getBorrowName();stmt.setString(2, bUser.getStudyNum();stmt.setString(3, bUser.getSex();stmt.setString(4, bUser.getDepartMent(););三、 图书借还管理模块1.借还列表截图:图4-6 图书借还一览代码部分
32、:此模块控制器类为BookBRServlet,用户进入借还图书的模块,会以“list.rr”的方式去发送请求,此时web.xml会将请求转到该控制器,经控制器处理会得到字符串“list”进而进入以下代码:String isbn = ParamUtil.getString(request.getParameter("qisbn");String bookName = ParamUtil.getString(request.getParameter("bookName");String queryParam = "&isbn="
33、+ isbn + "&bookName=" + bookName;List<BookModel> books = dao.quickSearch(isbn, bookName);for(BookModel book:books)int countNum = dao.getCountAndNum(book.getTitle();book.setBorrowNum(countNum1);book.setCount(countNum0);request.setAttribute("books", books);request.setAttr
34、ibute("queryParam", queryParam);/ step2获得转发器RequestDispatcher rd = request.getRequestDispatcher("bRMain.jsp");/ step3转发rd.forward(request, response);其中要将浏览器地址后附带的参数用queryParam进行绑定组合,以便后面的分页操作,其次调用了quickSearch()方法进行快速搜索,当方法参数的isbn和书名为空时为全部检索,不为空时为快速条件搜索。以下为quickSearch()方法体:public
35、List<BookModel> quickSearch(String isbn,String title) throws SQLExceptionString sql = "select t.*,publisherName from titles t left outer join publishers p on t.publisherID=p.publisherID"sql += " where isbn like '%"+isbn+"%' and title like '%"+title+&qu
36、ot;%'"return querySql(sql, new TitleRowMapper();2.图书借阅截图:图4-7 图书借阅代码部分:对于图书借还列表显示的图书状态分为两种,当数据库中图书的借阅状态字段为1时表明此书已借出,其显示背景成灰色,当点击书名链接时,会根据借阅状态自动判断进入归还图书的页面还是借阅图书的页面。当该图书已经借出,则进入归还页面,该页面显示该图书的借阅者、借阅期限、书名等详细信息int flag = Integer.parseInt(request.getParameter("br");String isbn = ParamU
37、til.getString(request.getParameter("qisbn");int borrowNum = Integer.parseInt(request.getParameter("borrowNum");int count = Integer.parseInt(request.getParameter("count");BookModel book = new BookModel();book = dao.findBookByIsbn(isbn);book.setBorrowNum(borrowNum);book.s
38、etCount(count);将图书绑定request.setAttribute("book", book);如果图书借阅标志位为0说明,则转发到该图书的借阅页面,进行借阅操作:if (flag = 0) equest.getRequestDispatcher("bRDetails.jsp").forward(request, response);如果发生错误,则至错误页面 else request.getRequestDispatcher("fail.jsp").forward(request,response);3.图书归还截图:
39、图4-8 图书归还代码部分:当点击背景条为灰色的书籍链接时,会进入归还页面,此时标志位为1:if (flag = 1) request.getRequestDispatcher("rBDetails.jsp").forward(request, response);四、 图书管理模块1.图书列表显示截图:图4-9 图书列表显示代码部分:图书管理模块的控制器在ListBookServlet类中,其分辨的后缀为“.xx”,当进入图书列表页面时,浏览器会发送“list.xx”的请求到web.xml,web.xml根据后缀找到该控制器,在将请求切割成“list”字符串,到下面代码块
40、:tryString isbn = ParamUtil.getString(request.getParameter("qisbn");String bookName = new String(ParamUtil.getString(request.getParameter("bookName").getBytes("iso-8859-1"),"GBK");String queryParam = "&isbn="+isbn+"&bookName="+bookN
41、ame;List<BookModel> books = dao.quickSearch(isbn,bookName);request.setAttribute("books", books);request.setAttribute("queryParam", queryParam);/step2获得转发器RequestDispatcher rd=request.getRequestDispatcher("booksMain.jsp");/step3转发rd.forward(request,response);catch(
42、Exception e)e.printStackTrace();throw new ServletException();在获得通过空的书名和isbn,去DAO层调用quickSearch()方法,查询所有书籍2.图书添加截图:图4-10 图书添加代码部分:当点击图书添加按钮时,页面会重定向到addBook.jsp页面,如上图。在该页面将要添加图书的各项信息。其中作者添加要从数据库作者表中去选择。当添加的isbn号已存在数据库时,则无法添加。添加isbn时,点击检查sibn按钮,调用下面方法检查isbn是否重复:if(action.equals("/checkIsbn")t
43、ryString isbn = ParamUtil.getString(request.getParameter("isbn");boolean flag = dao.checkIsbn(isbn);PrintWriter out = response.getWriter();out.print(flag);out.flush();out.close();catch (Exception e) e.printStackTrace();throw new ServletException();对于添加信息的合理性检查,代码如下(jquery代码):检查isbn合理性:$(&q
44、uot;#checkISBN").click(function()$("#checkImg").show();var isbn = $("#isbn").val();if(isbn = "")alert("isb不能为空!");$("#checkImg").fadeOut(1000);flag0=false;else实行ajax同步处理,并发送post请求,调用checkIsbn()方法:$.ajaxSetup(async:false);$.post("checkIsbn.x
45、x","isbn":isbn,function(data)if(data="true")alert("isbn名可用");$("#checkImg").fadeOut(1000);flag0=true;elsealert("isbn已经存在");$("#checkImg").fadeOut(1000);flag0=false;,"text"););$("#isbn").change(function()var isbnTxt
46、= $(this).val();if(isbnTxt = "")$("#checkDetails").text("isbn不能为空").css("color","red");flag1 = false;else$("#checkDetails").text("");flag1 = true;);对书名的非空检查:$("#bookName").change(function()var text = $(this).val();if(tex
47、t = "")$("#checkName").text("书名不能为空").css("color","red");flag2 = false;else$("#checkName").text("正确").css("color","green");flag2 = true;);对价格的合理性进行检查,必须为数字,不能为0,必须为正数var reg = /d1,4(.d1,6)?$/;var reg11 = /01,4$
48、(.0*)?/;$("#bookPrice").change(function()var val1 = $(this).val();if(!val1.match(reg)$("#priceDetail").text("价格必须为合理数字格式").css("color","red");flag3 = false;else if(val1.match(reg11)|val1<=0)$("#priceDetail").text("价格不能为0,请重新输入"
49、).css("color","red");flag3 = false;else$("#priceDetail").text("输入正确").css("color","green");flag3 = true;);对于年份的合理性检查,年份所要求格式为:XXXXvar reg1 = /d4$/;$("#age").change(function()var age = $(this).val();if(!age.match(reg1)$("#ageD
50、etail").text("年份格式不符合要求").css("color","red");flag4=false;else$("#ageDetail").text("输入正确").css("color","green");flag4=true;);对于版本号的合理性检查var reg2 = /d1,2$/;$("#edition").change(function()var edition = $(this).val();if
51、(edition=""|!edition.match(reg2)$("#editionDetail").text("版本号格式不符合要求").css("color","red");flag6=false;else$("#editionDetail").text("输入正确").css("color","green");flag6=true;);对于出版社的非空检查,将数据库中所以出版社集合放在下拉框中$("
52、#selectPublisher").change(function()if($("#selectPublisher").val()="")flag5 = false;alert("请选择出版社");elseflag5 = true;);提交添加表单操作$("#form1").submit(function()$("#isbn").change();$("#bookName").change();$("#age").change();$(&quo
53、t;#edition").change$("#selectPublisher").change();$("#bookPrice").change();checkForm1(this);return flag1&&flag2&&flag3&&flag4&&flag5&&flag6;););实现图片上传功能的代码:function upload()var path = $("#path").val();$.ajaxSetup(async:false)
54、;$.post("./upload","path":path,function(data)if(data = "true")$("#picImg").src("bms/images/"+path);elsealert("上传失败");,"text");return true;作者下拉框左右移动的方法代码:function moveitem(fromSel, toSel) var j = 0;var fromOpt = fromSel.options;var toOpt = toSel.options;var toLen = toSel.length;/当前目标选择菜单的项数for ( var i = fromOpt.length - 1; i >= 0; i-) if (fromOpti.selected) toSeltoLen + j = new Opt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 分数教学设计-游丽颖
- 产教融合对地方经济发展的推动作用
- 2025至2030年中国玻璃马克杯行业投资前景及策略咨询报告
- 2025至2030年中国燃油管总成行业投资前景及策略咨询报告
- 学前教育论文答辩三分钟陈述
- 2025至2030年中国涤纶春亚纺行业投资前景及策略咨询报告
- 2025至2030年中国标准衬胶三通行业投资前景及策略咨询报告
- 人工智能时代职业教育的变革与挑战
- 2025年四川省自贡市中考数学真题含答案
- 2026版高考数学大一轮复习讲义-第八章 进阶篇 圆锥曲线中的综合问题 进阶5 解析几何中的定值问题
- 粪便检查法寄生虫检查
- 浙江省杭州市拱墅区2024届数学八年级下册期末考试试题含解析
- 剑桥少儿英语二级期末考试试卷(真题)
- 年产5万吨1,4-丁二醇的工艺流程设计
- GB/T 43825-2024犬狂犬病疫苗接种技术规范
- (高清版)TDT 1037-2013 土地整治重大项目可行性研究报告编制规程
- 中国石油加油站建设标准设计
- 数字医疗论文
- 二年级下册数学无纸化测评方案
- 大学化学期末考试卷(含答案)
- 化工行业仪表典型事故分析报告
评论
0/150
提交评论