【计算机毕业设计】基于jsp网上书店(源代码+论文)

news2024/9/20 16:45:43

网上书店系统

1.需求分析。

参考设计要求,及可行性的分析,我们确定了如下的需求:

1.数据库设计科学合理。

2.网站主页面简洁美观,可以天蓝色为主色调。

3.网站主页显示各个分类的及总的畅销表、新书榜、推荐榜,显示论坛新帖。

4.单本图书的详细资料页面显示同类图书的畅销榜,同一作者的畅销榜,购买了同一本书的读者此外还购买的图书。

5.可按作者,或者书名,或者出版社搜索图书。

6.用户注册登录后可以使用购物车、订单等功能,可以修改密码、个人资料,还可以在论坛发表新帖、回复。

7.具备友好的用户界面,提供适当的操作提示,如用户登录时的密码错误等。

8.网站管理员可通过后台管理界面,修改密码,添加、删除用户,添加、删除、修改图书的详细资料。

2.总的设计思想、系统平台、开发工具。

团队工作模式:以组长为核心,充分沟通与交流,保证概念的完整性与进度的良好控制。

采用自顶向下的设计方法,策略上采取复用、分而治之。

首先,清晰的结构和表达方式更容易对需求和模块功能进行精确的描述。其次,模块分割和模块独立性避免了系统级的bug。另外,细节的隐藏使结构上的缺陷更加容易识别。第四,设计在每个精化步骤的层次上是可以测试的,所以测试可以尽早开始,并且每个步骤的重点可以放在合适的级别上。

一次添加一个构件(功能模块)。在添加了新的构件(功能模块)之后,用它们来测试子系统。因为那些原来可以在子系统上成功运行的用例,必须在现有系统上重新运行,对系统进行回归测试。

精确、完整地定义接口、功能模块时,将具有一定集成度并可以重复使用的模块抽象出来,经验证后发放给组员以供复用,尽可能地避免代码的重复生产,提高代码的重用率,从而合理化、并简化开发过程,减少总的开发工作量与维护代价,提高生产率。

通过QQ、邮箱、局域网内的共享等,共享调试记录。

系统平台:Windows XP SP2 。

开发工具:Tomcat,JDK 1.5,Eclipse,Access 2003,Macromedia Dreamweaver MX 2004。

3.数据结构。

在 Microsoft Office Access 2003 中建立数据库。

表-1 book ,图书的详细资料。

字段名称数据类型意义说明
bookId自动编号图书编号(主键)
bookTitle文本书名
bookAuthor文本作者
bookDate日期/时间出版日期形如:2007-01-22
bookPublish文本出版社
bookPrice数字标价
bookStorage数字库存
bookSold数字售出数量
bookPhoto备注封面图片的路径和文件名
bookSort文本类别科技、文艺、管理、经济,等
bookIsbn文本ISBN号
bookWords数字字数
bookYC数字印次
bookBC数字版次
bookSheet文本纸张
bookValue数字售价
bookSummary备注内容提要
bookAuthorInformation备注作者简介
bookComment备注评论
bookCommend文本推荐方式inAll(全局推荐)、inSort(在其所属类别内推荐)

表-2 user , 用户的详细资料。

字段名称数据类型意义说明
userId自动编号用户编号(主键)
userName文本用户名
userFigure文本身份总管、读者
userSex文本性别男、女
userAge数字年龄>0 , <150
userBirthday日期/时间出生日期形如:2007-01-22
userAddress文本现居住地
userHome文本籍贯
userPwd文本密码
userNumber文本身份证号

表-3 orderTotal ,订单的整体属性资料。

字段名称数据类型意义说明
orderId数字订单编号(主键)
userId数字用户编号
orderDate日期/时间订购日期形如:2007-01-22
checkDate日期/时间审核日期形如:2007-01-22
totalValue数字总价

表-4 orderItem ,订单中的图书条目资料。

字段名称数据类型意义说明
orderId数字订单编号
bookId数字图书编号
buyNum数字购买数量
bookSta文本图书状态缺书、待审、已发
bookValue数字图书售价

表-5 topic ,论坛的主帖的详细资料。

字段名称数据类型意义说明
topicId数字主帖编号(主键)
topicDate日期/时间发表日期形如:2007-01-22
topicContent备注内容
topicTitle备注标题
userName文本发表的用户名
followTotal数字回复数
userId文本发表的用户编号

表-6 topic_follow ,主帖与回帖的对应关系。

字段名称数据类型意义说明
followId数字回帖编号(主键)
topicId数字主帖编号
followUserId数字回帖的用户编号

表-7 follow ,回帖的详细资料

字段名称数据类型意义说明
followId数字回帖编号(主键)
followDate日期/时间发表日期
followContent备注内容
followTitle文本标题

表-8 hotSearch ,热门搜索关键词的详细资料。

字段名称数据类型意义说明
hotSearchId自动编号编号(主键)
searchMode文本搜索方式作者、书名、出版社
searchWord文本搜索关键词

4.功能模块。

4.1首页 index-main.jsp 部分代码—1。

变量、函数的声明,网页标题的显示。

<%@ page language="java" contentType="text/html; charset=gb2312"

import="java.sql.*,myPk.*" %>

<% request.setCharacterEncoding("gb2312"); %>

<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<link rel="stylesheet" type="text/css" href="blue.css">

<%!

//转换字符集

public String toChi(String str)

{

if (str==null)

return "";

try

{

String temp_p=str;

byte[] temp_t=temp_p.getBytes("ISO8859-1");

String temp=new String(temp_t);

return temp;

}

catch(Exception e) { }

return str;

}

%>

<%

String sort=null;

String pageTitle="首页";//网页标题

String bookHot="";//栏目的标题

String sql="select * from book";

Pageable rs=null;

Pageable rsNew=null;

Pageable rsHot=null;

Pageable rsCam=null;

if(request.getParameter("sort")!=null)

{

/*Javascript脚本中页面跳转时传递的参数,

 以及HTML中链接(<a href="***.jsp?p1=z1">跳转</a>)时传递的参数,

 即使在发送端用了 request.setCharacterEncoding("GB2312");

 接收时,仍然要用自定义的函数转换字符集,否则参数中的中文会显示为乱码。

*/

sort=toChi(request.getParameter("sort"));

pageTitle="["+sort+"]";

bookHot=pageTitle;

sql=sql+" where bookSort='"+sort+"'";

}

%>

<title><%=pageTitle %>--网上书店</title></head>

4.2首页 index-main.jsp 部分代码—2。

显示全局推荐、类别内推荐的书目。

<table width="100%" border="0" cellspacing="0" cellpadding="0">

<tr>

<td>

<div id="titleBg">

<div id="titleText"><%=bookHot %>推荐</div><br></div></td></tr>

<tr>

<td align="left">

<%

Conn con=null;

try

{

String comSql="";

if(request.getParameter("sort")!=null)

comSql+=sql+" and bookCommend='inSort'";

else

comSql+=sql+" where bookCommend='inAll'";

comSql+=" order by bookSold desc";

con=new Conn();

Pageable rsCom=con.getRs(comSql);

rsCom.setPageSize(10);

rsCom.gotoPage(1);

for(int i=0;i<rsCom.getPageRowsCount();i++)

{

if(sort==null)

{

%>

<ahref='index-main.jsp?sort=<%=rsCom.getString("bookSort") %>'>[<%=rsCom.getString("bookSort") %>]</a>

<%

}

%>

<ahref='book-information.jsp?id=<%=rsCom.getString("bookId") %>'><%=rsCom.getString("bookTitle")%>&nbsp;&nbsp;

<%=rsCom.getString("bookAuthor")%>&nbsp;&nbsp;

<%=rsCom.getString("bookDate").substring(0,10) %></a><br>

<%

rsCom.next();

}

con.closeRs();

}catch(Exception e) { out.print(e.toString()); }

%>

</td></tr></table>

4.3订单处理文件 deal-order.jsp 的部分代码—1。

函数声明。

<%@ page language="java" contentType="text/html; charset=gb2312" import="java.sql.*,myPk.*" %>

<% request.setCharacterEncoding("gb2312"); %>

<%!

/*订单(session) order 形如 -bookId,buyNum-bookId,buyNum- ,

依次为  -图书编号,购买数量-图书编号,购买数量-*/

/* 如果字符串 str 的长度小于 n ,则在其左边填充足够的 * 号,使其长度为 n 。<-左,右-> */

public String appString(String str,int n)

{

int strLen=str.length();

if(strLen>=n)

return str;

String sTem="";

String sBlank="*";

for(int i=0;i<(n-strLen);i++)

sTem+=sBlank;

sTem+=str;

return sTem;

}

/* 将 str 以 - 为标志分段,于各小段中再以 , 分为两段(形如段a,段b),在每个段a的左边填充 * 号,使每个段a的长度均为 n */

public String appLongStr(String str,int n){

String[] sTem=str.split("-");

String sRet="";

for(int i=0;i<sTem.length;i++){

String[] splitByDot=sTem[i].split(",");

splitByDot[0]=appString(splitByDot[0],n);

sTem[i]=splitByDot[0]+","+splitByDot[1];

}

if(sTem.length==1)

return sTem[0];

for(int i=0;i<(sTem.length-1);i++)

sRet+=sTem[i]+"-";

sRet+=sTem[sTem.length-1];

return sRet;

}

%>

4.4订单处理文件 deal-order.jsp 的部分代码—2。

放弃购物车中的指定书本。

<%

if(act.equals("del")){

//将某书从购物车中移除

if(sOrderSession.indexOf("-")==-1)

sTem="";//删除的是 session order 中仅有的一个记录项

else{

sSessionLeft=sOrderSession.substring(0,sOrderSession.indexOf(bookId+","));

sSessionRight=sOrderSession.substring(sOrderSession.indexOf(bookId+","));

if((sSessionLeft.indexOf("-")==-1)&&(sSessionRight.indexOf("-")!=-1))

sTem=sSessionRight.substring(sSessionRight.indexOf("-")+1);//删除的是 session order 中最左的记录项。

else if((sSessionLeft.indexOf("-")!=-1)

&&(sSessionRight.indexOf("-")==-1))

sTem=sSessionLeft.substring(0,sSessionLeft.lastIndexOf("-"));//删除的是 session order 中最右的记录项

else

sTem=sSessionLeft.substring(0,sSessionLeft.lastIndexOf("-"))+sSessionRight.substring(sSessionRight.indexOf("-"));//删除的是 session order 中间位置的记录项

}

}//if(act.equals("del")

%>

5.运行结果。

5.1首页。

5.2智能图书搜索。

搜索栏的输入框的下边有相应搜索方式的热门搜索关键词。可分别按作者、书名、出版社搜索图书,同时支持模糊搜索,如,按“出版社”搜索“长江[空格]人民”可搜索到出版社名字中含有“长江”、“人民”的图书(全图)。

5.3购物车。

5.4订单列表。

5.5论坛。

5.6添加图书。

5.7管理图书。

6.总结。

伴随着第一场雪的降临,这个课程设计才接近了尾声。在这次课程设计里,可以说是全身心地投入,――正式开始动工之前,有很多关于网站架设的想法,觉得网站无非就是数据库+标签,真正下手后,深刻体会到了其中的艰辛,特别是当第一场雪哗啦啦地下下来,而我却不得不坐在电脑前继续调试时。

虽然没能赶在第一场雪的时候去堆雪人,不过现在看着埋头做了一个多星期的设计结果,有点苦尽甘来的味道。

这次的课程设计,有两个方面的收获,一个是心态,一个是技术。

在心态上,端正了之前的心浮气躁、眼高手高,更加磨练了韧劲,增强了团队合作精神,提高了对软件开发中的工程设计思路的认识和理解。

技术上,在JSP动态网站开发方面积累了实践经验。对CSS有了新的认识,提高了对HTML的熟练程度及使用技巧,尤其是与Javascript联手打造胖客户端的一些方法和思路。

在做这个网上书店系统的论坛时,帖子的发表功能采用的方法是UBB编辑器,通过开发UBB编辑器,接触到正则表达式并可以灵活运用。在开发的过程中,无意中发现UBB编辑器的一个不足之处,它在获取当前激活选中区,即高亮文本块,或文档中用户可执行某些操作的其它元素的时候,用的是document.selection.createRange().duplicate() ,所以当选中非编辑区的文本时(如同一个页面内的导航时),然后单击UBB编辑器的功能按钮,非编辑区的文本会响应UBB编辑器,这是开发人员不想看到的--它会导致页面凌乱。查找相关资料也未能找到解决办法,除非摒弃UBB编辑器,改用HTML在线编辑器。

在实现购物车、订单的功能时,一开始想全部用数据库实现。考虑到购物车中的书本并不一定是读者最终要购买的,如果用数据库实现,那么购物车的每次变动都要更新数据库,这必然会给数据库增加无谓的负担。思考再三,自定义了一个固定形式的session来保存购物车的书目,当读者确定支付购买时,再将这个 session“解密”后将购买信息写入数据库。这个session的格式为:。。。。。。-图书编号,购买数量-图书编号,购买数量-。。。。。。 ,当对购物车中的书目进行添加、更改、删除时,通过判断需要添加、更改、删除的书目在这个session中的位置(session为空,或是session中仅有的一个书目,或是session中最左的一个书目,或是session中最右的一个书目)来作不同的操作。

在测试中,发现这样实现的购物车功能有bug,原因是一本书的编号(如1)可能跟另一本书的编号(如21)的低位相同,于是我就想到,每次在操作这个session时先将其中的图书编号从左边用*号填充至10位,操作完成后去除所有*号还原。问题迎刃而解。

整个网站系统共用一个信息提示的处理页面tip.jsp,该页面通过读取传进来的tip变量判断输出给用户的友好提示信息,传进来的desPage变量则为tip.jsp页面3秒倒计时后前往的页面地址。

网页头部页面head.jsp中调用了包java.text,其中通过实例化SimpleDateFormat类获取并格式化日期,所以在Eclipse中加载此项目时,除了正确配置数据源,还需要在项目的配置中加载Tomcat\common\lib\servlet-api.jar 。

7.参考资料。

1.电子版网页制作完全手册(含DHTML参考、HTML参考、CSS属性参考),手册的内容全部来自Microsoft MSDN Library,由 lemon 整理编辑,资料从http://clgigi.8u8.com下载。

2.电子版JScript 语言参考手册(含正则表达式简介),手册的内容全部来自Microsoft MSDN Library。

3.《JSP动态网站开发实用教程》,机械工业出版社,宝贝工作室 策划。

4.电子版《JSP 2.0技术手册》,林上杰、林康司 著,电子工业出版社。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Allegro如何锁定器件操作指导

Allegro如何锁定器件操作指导 Allegro上可以锁定器件,避免误操作被移动,具体操作如下 选择fix命令 Find选择Symbols 框选需要锁定的器件 可以看到器件被锁住了 除了这个方法之外,还有另外一种方法锁定器件,选择edit-property Find选择Symbols

ADSP-21569/ADSP-21593的开发入门(中)

ADSP-21569/21593的软件准备 安装CCES软件&#xff0c;我装的是2.10.1&#xff0c;官网可以下载&#xff0c;我也可以提供。软件安装没什么可说的&#xff0c;全部下一步&#xff0c;软件的试用跟注册可以单独联系我。 https://www.analog.com/cn/design-center/evaluation-h…

做短视频创业之前必须确定的内容:变现形式,短视频玩法和人设定位

做短视频创业之前必须确定的内容&#xff1a;变现形式&#xff0c;短视频玩法和人设定位。这是短视频的根基&#xff0c;打好基础才能更好的实现盈利目标。 开始做短视频的时候&#xff0c;走了很多弯路&#xff0c;这段时间总结了之前的经验教训&#xff0c;结合在我赢助手上…

【编程题】【Scratch四级】2022.09 班级成绩处理

班级成绩处理 三年级1班有36个小朋友&#xff0c;某次数学考试&#xff0c;同学们的成绩在78-100之间&#xff0c;求出该班学生的平均分和成绩优秀的人数&#xff08;成绩大于85分&#xff09;。 1. 准备工作 &#xff08;1&#xff09;默认小猫角色&#xff0c;默认白色背景…

Python学习基础笔记二十一——迭代器

列表&#xff0c;我们使用for循环来取值&#xff0c;我们把每个值都取到&#xff0c;不需要关心每一个值的位置&#xff0c;因为只能顺序的取值&#xff0c;并不能跳过任何一个去取其他位置的值。那么我们为什么可以使用for循环来取值&#xff0c;for循环内部是怎么工作的呢&am…

【力扣算法简单五十题】17.路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是指没有子节点…

模仿Spring注入接口的代理类全过程

前言 在使用mybatis或者openFeign时只定义了一个接口类&#xff0c;并无实现类&#xff0c;可以把接口注入到service中并且能调用方法返回值。一个接口并无实现类&#xff0c;为什么可以实例化并且交给了spring管理。mybatis&#xff0c;OpenFeign又是怎么实现的&#xff1f;接…

生物化学 核磁共振 氢谱 n+1定律 邻碳耦合 同碳耦合

核磁共振氢谱 基础 自旋量子数 自旋为S的粒子&#xff0c;取向的范围为[-S,S],但是需要间隔1。比如质子的自旋为1/2,则有-1/2 &#xff0c;1/2两个取向。取值的个数等于在外加磁场的情况下能够分裂的能级的个数。但是质量数和原子序数都为0的原子(C12,O16C^{12},O^{16}C12,O1…

Java ~ Executor ~ LinkedBlockingQueue【总结】

一 概括 简介 LinkedBlockingQueue&#xff08;链接阻塞队列&#xff09;类是BlockingQueue&#xff08;阻塞队列&#xff09;接口的主要实现类之一&#xff0c;也是Executor&#xff08;执行器&#xff09;框架最常搭配使用的实现之一&#xff0c;采用链表的方式实现。相比基于…

Qt+opencv 鼠标画线实现几何图形识别并动态创建

前言 使用Qt OpenCV实现&#xff0c;通过鼠标画线绘制几何图形&#xff0c;然后通过opencv进行图形轮廓识别&#xff0c;返回图形顶点&#xff0c;然后创建对应的几何图形添加到场景中。绘制使用QGraphics体系完成。 看效果图&#xff1a; 本文demo在这里 点击下载 环境: …

python在centos下安装以及配置

python在centos下安装以及配置 1.背景 centos下默认的都是python2.7下载需要更换为3.x使用&#xff0c;目前大部分应用都是基于pyhton3了 具体步骤&#xff1a; 我下载一个3.8.15的包 https://www.python.org/ftp/python/3.8.15/Python-3.8.15.tgz 小注释&#xff1a;如果…

动手学深度学习(2)—— 线性神经网络

文章目录线性神经网络线性回归线性回归从零开始的实现生成数据集读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练线性回归的简洁实现生成数据集读取数据集定义模型初始化模型参数定义损失函数定义优化算法训练softmax 回归softmax运算交叉熵损失图像分类数据集读…

浅谈降维实操,一种用于处理特征的方式——后附Python代码

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 降维实操前言线性降维低…

list的模拟实现(万字解读+由浅入深)

先申明一下本篇总体介绍过程是按照逐步深入去写的&#xff0c;所以可能有些同样类型不在一块&#xff01; 前言&#xff1a; 写这篇博客的时候&#xff0c;我是边思考边写它&#xff01;自己其中感觉自己对于list的理解更加的深入&#xff0c;其中提出的很多问题让我明白了lis…

Android Studio 实现桌面小组件(APPWidget)

前言 微件是定制主屏幕的一个重要方面。它允许您从用户的主屏幕直接看到最重要的应用程序数据和功能。用户可以在主屏幕面板之间移动微件、调整其大小&#xff0c;并根据自己的喜好自定义微件中的信息量。微贱类型主要分为&#xff1a;信息微件&#xff08;显示对用户来说很重…

Service详解

Service详解 文章目录Service详解Service介绍kube-proxy目前支持三种工作模式:userspace 模式iptables 模式ipvs 模式Service类型Service使用实验环境准备ClusterIP类型的ServiceEndpoint负载分发策略HeadLiness类型的ServiceNodePort类型的ServiceLoadBalancer类型的ServiceEx…

嵌入式Linux 开发经验:编写用户态应用程序 ioctl 控制 misc 设备

参考文章 VSCode SSH 连接远程ubuntu Linux 主机 ubuntu 20.04 qemu linux6.0.1 开发环境搭建 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 嵌入式Linux 开发经验&#xff1a;platform_driver_register 的使用方法 嵌入式Linux 开发经验&#xff1a;注册一个 misc 设…

阿里巴巴专场——第322场周赛题解

目录 模拟法&#xff1a;6253.回环句 排序后模拟&#xff1a;6254. 划分技能点相等的团队 BFS&#xff1a;6255. 两个城市间路径的最小分数 BFS&#xff1a;6256. 将节点分成尽可能多的组 模拟法&#xff1a;6253.回环句 这道题直接按照题目的意思暴力模拟即可&#xff1a;…

Ubuntu20.04 安装配置 Ros2

记录一下折磨了一周的ros2配置qaq以及踩的无数坑 第一次按照一个教程安装后&#xff0c;命令行输入sudo apt-update 报错 The repository http://packages.ros.org/ros/ubuntu $(lsb_release-sc) Release does not have a Release file. 卸载后&#xff0c;按照第二个教程安装…

(十) 共享模型之内存【有序性】

JVM 会在不影响正确性的前提下&#xff0c;可以调整语句的执行顺序这种特性称之为『指令重排』&#xff0c;多线程下『指令重排』会影响正确性。为什么要有重排指令这项优化呢&#xff1f;从 CPU 执行指令的原理来理解一下吧 一、原理之指令级并行&#xff08;了解&#xff09;…