基于java的网上商城设计与实现-毕业设计_第1页
基于java的网上商城设计与实现-毕业设计_第2页
基于java的网上商城设计与实现-毕业设计_第3页
基于java的网上商城设计与实现-毕业设计_第4页
基于java的网上商城设计与实现-毕业设计_第5页
已阅读5页,还剩52页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最新基于java的网上商城设计与实现--毕业(设计学号郑州成功财经学院毕业论文(设计)基于JAVA的网上商城设计与实现系部名称:信息工程系专业名称:计算机科学与技术学生姓名:指导教师:讲师摘要随着互联网技术的发展,全世界几乎所有的行业都在互联网的影响下得到了好的变化,互联网技术的逐渐成熟和发展,使生产力得到了巨大的发展,可以说互联网是第四次工业革命也毫不为过。互联网的发展催生了电子商务,电子商务的到来预示着网络营销潮流的到来。企业与客户之间的营销关系也正在逐渐由实体店面销售转变为网络电子商务营销,越来越多的企业开设自己的网上购物平台来吸引更多互联网客户,同时也大大降低了实体地点面营销的成本,在保证质量的前提下,增加了企业的收益。本课题就是在这种环境下应运而生的,课题主要是利用SSM技术实现网上购物商城的前台与后台系统。采用分布式与集群相配合的模式来开发和部署该系统,采用这种方法开发的商城系统不仅开发速度快,开发效率高,开发层次明确而且还能能够承载大数据量的访问,而且这套系统对当下想要进军商城网站的商家来说具有非常重要的参考价值。关键词:购物商城;SSM技术;设计与实现AbstractWiththedevelopmentofInternettechnology,almostallindustriesallovertheworldintheInternethasbeenagoodchange,Internettechnologyisgraduallymatureanddevelopment,sothatproductivityhasgotenormousdevelopment,canbesaidthattheInternetisthefourthindustrialrevolutionisalsonottoomuch.ThedevelopmentoftheInternetgavebirthtoe-commerce.Thearrivalofe-commerceindicatesthearrivalofnetworkmarketing.Betweentheenterpriseandthecustomerrelationshipmarketingisalsograduallybytheentitystoresalesintoe-commercenetworkmarketing,moreandmoreenterprisessetuptheirownonlineshoppingplatformtoattractmorecustomerstotheInternet,butalsogreatlyreducesthecostofmarketingentitylocation,underthepremiseofguaranteeingquality,increasetheincomeoftheenterprise.Thistopicisinthisenvironmentcameintobeing,themaintaskistouseSSMtechnologytoachieveonlineshoppingmallfrontandbackofficesystem.Usingdistributedandclustermatchingmodeltodevelopanddeploythesystem,usingthismethodnotonlythedevelopmentofshoppingmalldevelopmentspeed,highdevelopmentefficiency,butalsoacleardevelopmentlevelcapableofcarryingalargeamountofdataaccess,andthissystemhasveryimportantreferencevalueforthecurrentArmywantedtoenterthemallsitebusinesses.Keyword:Shoppingmall;SSMtechnology;DesignandImplementation目录TOC\o"1-3"\h\z\u166561.绪论 1117811.1.研究的背景和意义 127797124012130401.2.研究内容 189991.3.论文组织结构 2175952.商城系统开发技术及工具介绍 315252.1.商城开发的核心技术 331706311039429026519863627248710642.2.SSM框架技术 8618282532591222710157281112302.3.商城开发工具 111400611157181230411121489212229213.商城系统项目需求分析 14221173.1.目标 14186013.2.商城业务流程图 14262914172571521824.商城系统设计及实现 17266944.1.商城总体开发架构 17311544.2.商城框架实现 18147451819150192358420292544.3.商城主要功能模块实现 21180972125927242167826228929309625.商城系统运行结果 3215375.1.商城后台运行结果 3232079322326833232555.2.商城前台运行结果 34100713422913351791036230206.总结以及展望 3811123参考文献 3971致谢 40绪论研究的背景和意义研究的背景在衣食等购买方面,传统的方式是我们需要花费时间到固定的地方挑选,假设购买的东西多还需要额外的花费去运输。但是随着中国经济的快速发展,人们对物质生活要求的提升,工作时间的不充足,购买量偏大这些问题往往会使我们感到厌烦。如何改善人们的购物体验,如何使商家与顾客实现共赢,人们一直在尝试各种办法解决这个问题。随着互联网技术的发展,网络与人们的日常生活也产生了千丝万缕的关系。信息技术也改变了人们的思维方式,现在越来越多的人通过互联网来完成自己想做的事情。随着数据库,计算机硬件,存储技术的发展,信息技术已经覆盖到日常生活的各个方面,现在人们已经离不开互联网了。网上购物商城就是在这种大趋势的推动下产生的。研究的意义在衣食等方面网上购物商城充当着一个重要的角色,在以往我们需要花费时间去挑选去到固定的地方去买。而现在我们只需要动动我们的手指很多东西就可以送货上门。可以证明商城很火爆的一个列子是天猫双十一。可以说是开辟了网上购物的一个春天,成交量超过千亿,可以说明现在互联网购物商城方面的一个发展趋势。研究内容本系统采用SSM搭建的分布式项目,使用Maven管理Jar使用Git作为版本的管理工具,由此将项目分为如下几个模块:1)后台管理:包括管理员对商品的增删改查,对商品规格参数的增删改查。2)主页展示:类似京东的主页面,让商品分类目展示。论文组织结构:阐述了商城项目研究的背景与意义以及论文的组织结构:介绍了在商城项目中用到的JavaWEB技术以及开发工具以及Eclipse中比较好的插件的用法。:介绍了该系统的基本功能需求以及业务流程:实现对ssm框架的整合。对商城主要功能模块的时间:对网上商城的前台后台进行一些数据测试保证其健壮性,稳定性。:总结商城开发过程中用到的问题,分析优势与不足,明确下一步的工作内容。 商城系统开发技术及工具介绍商城开发的核心技术Jsonp简介跨域的基本概念:不同服务器或者同一个服务器不同的端口号他们之间进行通信这就叫做跨域在商城项目中单点登录要实现在一个地方登录其他地方不用再重新登录,在这个地方需要用到跨域,在JSP页面使用跨域要用到Jsonp。Jsonp:Jsonp就是JSON的特殊使用法.因为Ajax无法接收到跨域的Json类型数据,Jsonp让跨域时返回的是一个脚本文件.脚本文件中包含了,回调函数及JSON数据.JSONP的使用步骤:客户端需要重点设置以下三个属性:1)dataType:’jsonp’,响应结果类型2)jsonp:’callback:,请求时传递回调方法名的参数名3)jsonpCallback:’abc,传递过去的回调方法名代码示例如下:$.ajax({ url:'http://localhost:8081/demo', dataType:'jsonp', jsonp:'callback', jsonpCallback:'abc', type:'POST', success:function(data){ alert(data.a+""+"匿名方式"+data.b); }});服务器端使用的是由Spring封装的MappingJacksonValue它返回jsonp需要的数据格式。他要注意的是几个属性produces:string[],设置响应头中Content-Type,响应内容类型.代码示例如下:@RequestMapping(value="demo",produces={MediaType.APPLICATION_JSON_UTF8_VALUE})@ResponseBodypublicMappingJacksonValueshow(Stringcallback){ Map<String,String>map=newHashMap<>(); map.put("a","a1"); map.put("b","b1"); MappingJacksonValuemjv=newMappingJacksonValue(map); mjv.setJsonpFunction(callback); returnmjv;HttpClient简介分布式项目中不同子项目之间进行信息传输需要跨域,而HttpClient是用Java代码的方式进行的跨域信息交流,下面介绍一下HttpClient。HTTP协议应该是互联网中最重要的协议。持续增长的WEB服务、互联网的家用电器等都在继承并拓展着Http协议,向着浏览器之外的方向发展。虽然JDK中的J包中提供了一些基本的方法,通过Http协议来访问网络资源,但是大多数场景下,它都不够灵活和强大。HttpCilent致力于填补这个空白,它可以提供有效的、最新的、功能丰富的包来实现Http客户端。为了拓展,Httpclient即支持基本的Http协议,还支持Http-aware客户端程序,如WEB浏览器,WebServer客户端,以及利用OR拓展Http协议的分布式系统。1)HttpClient的范围/特性是一个基于Httpcore的客户端Http传输类库基于传统的(阻塞)IO内容无关2)HttpClient不能做的事情HttpClient不是浏览器,它是一个客户端HTTP协议传输类库。HttpClient被用来发送和接受HTTP消息。HttpClient不会处理HTTP消息的内容,不会进行JavaScript解析,不会关心contenttype,如果没有明确设置,HttpClientT也不会对请求进行格式化、重定向URL,或者其他任何和Http消息传输相关的功能。代码示例如下:POST请求 CloseableHttpClienthttpClient=HttpClients.createDefault(); HttpPostpost=newHttpPost("http://localhost:8081/demo1"); List<NameValuePair>params=newArrayList<NameValuePair>(); params.add(newBasicNameValuePair("name","李四")); params.add(newBasicNameValuePair("age","15")); post.setEntity(newUrlEncodedFormEntity(params,"utf-8")); CloseableHttpResponseresponse=httpClient.execute(post); Stringresult=EntityUtils.toString(response.getEntity()); response.close(); httpClient.close();GET请求:publicvoiddoGetWithParam()throwsException{ CloseableHttpClienthttpClient=HttpClients.createDefault(); URIBuilderuriBuilder=new uriBuilder.addParameter("query","花千骨"); HttpGetget=newHttpGet(uriBuilder.build()); CloseableHttpResponseresponse=httpClient.execute(get); intstatusCode=response.getStatusLine().getStatusCode(); HttpEntityentity=response.getEntity(); Stringstring=EntityUtils.toString(entity,"utf-8"); response.close(); httpClient.close();}Cookie简介Cookie概念:由服务器端产生,存放于客户端浏览器的文本文件。Cookie原理:1)在服务器端实例化Cookie对象,里面只能存放字符串内容(Cookie尽量不要存放中文)。2)设置Cookie的有效时间和作用域和有效路径。3)伴随重定向,随着响应对象响应给客户端浏览器。4)浏览器接收到Cookie内容进行I/O操作,把Cookie存放与本地某个Cookie特定文件夹中。5)当用户在次发送请求时,只要能获取到某个或某些Cookie,会由浏览器帮助自动携带Cookie发送给服务端。服务器端示例代码如下:Cookiec=newCookie("test","123");c.setMaxAge(10);c.setDomain(".");c.setPath("/cookie/page");res.addCookie(c);res.sendRedirect("page/index.jsp");客户端代码示例如下:<%Cookie[]cs=request.getCookies();if(cs!=null){ for(Cookiec:cs){ out.println(c.getName()+""+c.getValue()+"<br/>"); }}%>Session简介Session是什么?由服务器端产生,存放于客户端浏览器的文本文件。Session原理:1)在服务器端实例化Cookie对象,里面只能存放字符串内容(Cookie尽量不要存放中文)。2)设置Cookie的有效时间和作用域和有效路径。3)伴随重定向,随着响应对象响应给客户端浏览器。4)浏览器接收到Cookie内容进行I/O操作,把Cookie存放与本地某个Cookie特定文件夹中。5)当用户在次发送请求时,只要能获取到某个或某些Cookie,会由浏览器帮助自动携带Cookie发送给服务端。Solr简介Solr介绍1)作用:一个搜索引擎。2)SOLR实际是一个WEB项目。3)优点:搜索内容高亮。对搜索关键字的突出显示。搜索引擎方案:目前在国内希望实现全文搜索常用解决方案。1)使用Baidu,Google提供的API2)使用基于Apache提供的Lucene搜索引擎实现。Solr运行原理:Solr实际上是基于lucceen开发的,需要通过Solr对外提供的接口,访问Solr项目.Solr接收请求,交由SolrRequestHandler,处理请求.拆分请求内容为n多个词条(一句话拆分成多段).根据词条内容,索引整个Solr中内容,最终相应给用户一个XML格式的结果,也可以是备用结果。索引介绍:1)查询时,从头查询到结果一行一行的查询过程叫做顺序查询。2)索引:建立内容和索引内容之间关系,通过找到索引内容快速定位到具体内容的过程就是索引查询(新华字典目录.)。3)solr基于反向索引进行查询的.建立索引和内容之间关系,通过索引查找内容的过程称为反向索引。SSM框架技术框架技术概述框架是一种通用的半成品的软件,SSM用了MVC的设计模式可以使程序易维护扩展,使程序员之间的分工比较明确,使业务逻辑与视图进行分离,简化了程序员的开发提高了工作效率,如图2-1就是框架技术在MVC三层模型所代表的角色。图2-1框架在MVC中的角色SpringMVC框架Springmvc运行流程图如图2-2图2-2SpringMVC执行时序图Springmvc运行原理:在编程中都是以s。DispatcherServlet也是一个Servlet,在SpringMVC中ServletAPI被完整的支持.由于是一个MVC框架,所以核心是控制器.大部分执行流程都是在控制器前后完成的。具体执行流程为:当用户发送请求后被DispatcherSevlet进行分发,然后转交给HandlerMapping进行验证格式是否合法,如果不合法报异常,如果合法向下传递交给HandlerAdapter准备调用某个Controller,Controller在进入之前一般都需要执行HandlerInterceptor拦截器的preHandle()方法,判断是否可以调用Controller.如果可以调用才能进入Controller,当Controller执行完成后再次进入拦截的postHandle验证传递内容是否合法,如果合法交给ViewResovler视图解析器调用具体的View视图资源.调用成功后再次进入拦截器的afterCompletion做最后验证,如果一切正确,响应给客户端.到此,SpirngMVC执行结束.Mybatis框架Mybatis运行流程图如图2-3图2-3MYBATIS的执行流程图2-3Mybatis的执行流程Mybatis是持久层框架,内部封装的JDBC,不依赖于SERVLET容器在测试阶段使用比较方便。它的运行原理如下:运行原理就是程序执行过程,平时编写代码时只需要把配置文件转换为流后给交SqlSessionFactoryBuilder就会产生SqlSessionFactory,但实际上底层是这样实现的.实际上把配置文件流交由XMLConfigBuilder进行解析,解析后把所有配置信息封装到Configuration中,再把Configuration传递给DefaultSqlSession-Factory,并实例化这个类在源码可以看出DefaultSqlSessionFactory是SqlSessionFactory的实现类,所以这个时候就产生了SqlSessionFactory接口的实例..需要openSession,产生SqlSession示例,根据SqlSession实例执行事务。最后要提交事务和关闭SqlSession通常都不关闭SqlSessionFactory,在大点的项目中,都需要用到二级缓存,所以不关闭.Spring框架IOC,叫做控制反转,所有对象实例化的过程转交给SpringIoC组件,不用程序员手动new对象.目前主流编程语言都是面向对象语言,经常处理对象和对象之间的关系.引入SpringIoC(我们也可以叫DI)可以把我们的关注点从对象之间关系释放出来,我们只关注业务逻辑.IoC实际就解析XML或注解后通过反射机制加载对应的类,然后进行实例化或注入里面常用的设计模式包含:单例,工厂等。AOP是面向切面编程.把传统程序执行过程看成纵向执行过程,每个方法当作一个点.基于这些点可以进行增强处理。形成了横向的切面,包含了原有方法和增强方法.不改变原有代码结构,添加额外功能.常用AOP功能有事务管理,权限处理,日志打印等。其实Spring的AOP就是对代理设计模式的一个实现。商城开发工具Ecplipse及其插件Ecplipse介绍:Ecplipse是著名的跨平台自由集成开发环境(IDE)。它本身是一个框架平台,支持众多功能,有很强的灵活性。许多软件开发商以Ecplipse开发自己的IDE如MyEcplipse。Eclipse最早由IBM公司开发,2011年贡献给开源社区,现在它由非盈利软体供应商联盟Eclipse基金会(EclipseFoundation)管理。Eclipse常用插件介绍:SimplePropertieseditor一个简单实用的文本编辑器插件,可以直接将ANSII汉字或者我们比较熟悉的语种。如在eclipse里面我们通常会实用properties属性文件,但是如果我们写的是汉字它会转化成ANsII编码的格式,使用此插件可以直接将里面的编码转换成我们想要的汉字。EclipseClassDecompiler 整合了目前最好的2个反编译工具Jad和JD-Core,并且和EclipseClassViewer无缝集成,能够方便的使用插件查看类库源码,以及采用本插件进行Debug调试EclipseTomcatPlugin当我们在进行多个web项目开发或者进行学习的时候,jar包是一个麻烦的事情,我们需要频繁的去复制粘贴jar,这不仅浪费了大量的时间,而且也占用了较大的存储空间,而tomcat自定义类加载器就会起到很大的作用,这是tomcat的一个扩展点,而且tomcatplugin也使用这个扩展点自定义了一个loder我们以后就只需要导jar就行了不需要额外的再复制粘贴jar。Tomcat服务器Tomcat服务器是一个免费的开放源代码的WEB应用服务器。Tomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的核心项目,由Apache,Sun和其他一些公司及个人共同开发而成。因为Tomcat技术先进,性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了很多软件开发商的认可,是目前比较流行的WEB应用服务器。MySQL数据库MySQL是一个小型关系型数据库管理系统,开发者为瑞典的MysqlLab公司,在2008年被Sun收购。MySQL被广泛地应用在Internet上的中小型网站。由于体积小,速度快,总体拥有成本低,尤其是开放源代码这一特点,许多小型公司为了减低成本而选择MySQL作为网站数据库。但是后来他又被Oracl收购,它以后的发展或者收费与否还要看Oracl公司如何决断了。Redis数据库Redis是一个开源的,先进的key-value存储,并用于构建高性能,可扩展的WEB应用程序的完美解决方案。Redis从它的许多竞争者中脱颖而出主要有以下三个主要特点1)数据库完全在内存中,使用磁盘仅用于持久性。2)有丰富的数据类型。3)使用简单方便处理速度快。

商城系统项目需求分析目标基于JavaEE平台的网上商城是依托于目前主流的SSM框架搭建而成。主要包括两个方面:一是后台管理,为管理员提供一些增删改的权限,改变手工记账效率慢,成本高的现状;而前台方面,给用户看的主要包括用户的登陆,购物车的实现等,减少用户外出购买商品所需时间。商城需要实现的具体目标包括:1)购物商城台中实现管理员对商品的增加,上架,下架图片的插入,对商品内容的管理包括对商品类目的增加,对商品规格参数的修改增加,对大广告位的插入,对首页常用图片的插入。2)购物商城中前台部分包括实现对商品整个目录结构的展示,用户单点登录,商品展示,商品详情以及规格参数的展示,商品购买,购物车中商品的增加删除修改。商城业务流程图商城后台业务流程图网站后台系统是商城的一个核心,通过后台系统管理员可以对仓库的商品进行上架,下架,新增的操作,以前这些都是人工操坐,人工记录,现在则改为由数据库进行一个记录大大提高了安全性,提高了工作效率,降低了运作成本。如图3-1是商城的后台业务流程图。图3-1商城前台流程图概况商城前台务流程图商城前台是为客户准备的页面,包括会员管理,商品购买,购物车,商品结算。现在使用这个购买平台可以留住购买者,利用会员等级制度激发用户的购买力,使用数据库来保存用户的购买记录,由此来分析用户喜欢那些商品,那些商品高买的比较少。可以最为业务分析的依据,单点登录(登录一次其他地方就不用再登录)由此改善用户体验。商城前台流程图如图3-2图3-2商城后台流程图概商城系统详细设计及实现商城总体开发架构本商城采用Ecplipse搭建商城项目,EasyUI搭建后台框架,Git作为版本管理,使用Maven搭建分布式项目并管理架包,使用Linux部署项目。使用Mysql作为持久化存储介质,使用Reidis作为缓存数据库提高查询速度,使用Solr作为全文搜索引擎。商城总体开发结构图如图4-1:图4-1商城项目架构图商城框架实现Spring整合SpringMVCSPRINGMVC作为视图层的一个框架与SPRING配合使用主要有以下步骤1)配置包扫描器使SPRING可以自动扫描类,不用写额外的代码进行识别2)驱动注解,给springmvc提供了数据绑定的功能<mvc:annotation-driven/>3)视图解析器,在控制器处理结束并返回模型和视图名之后,Spring会依次调用Spring容器中所注册的视图解析器,来查找符合条件的视图。<beanid="viewResolver"class=<propertyname="prefix"value="/WEB-INF/jsp/"></property><propertyname="suffix"value=".jsp"></property></bean>4)springmvc自动加载静态资源,这样做的好处是,不必每次请求的时候都需要来加载,而且在某种情况下,这个静态资源不适用这个会出错。<mvc:resourceslocation="/WEB-INF/images/"mapping="/images/**"></mvc:resources><mvc:resourceslocation="/WEB-INF/js/"mapping="/js/**"></mvc:resources><mvc:resourceslocation="/WEB-INF/css/"mapping="/css/**"></mvc:resources><beanid="multipartResolver"<propertyname="maxUploadSize"value="100000000"></property><propertyname="maxInMemorySize"value="10000000"></property><propertyname="defaultEncoding"value="utf-8"></property></bean>Spring整合MybatisMybatis作为持久层与SPRING整合主要有以下步骤1)扫描类可以使注解正常使用<context:component-scanbase-package=></context:component-scan>2)创建数据源,连接数据库<beanid="dataSource"class=p:driverClassName=p:url="jdbc:mysql://localhost:3306/ego"p:username="root"p:password="root"></bean>3)创建SqlSessionFactory实例,使我们可以正常使用这个实例对数据库进行操作<beanid="sqlSessionFactory"class=><propertyname="configLocation"value="classpath:mybatis-config.xml"></property></bean>4)配置事务管理器。</bean>5)配置声明式事物,以那些方法会被拦截<tx:adviceid="txAdvice"transaction-manager="txManage"> <tx:attributes> <tx:methodname="find*"read-only="true"/> <tx:methodname="sel*"read-only="true"/> <tx:methodname="*"/> </tx:attributes></tx:advice>6)配置aop切面,使声明式事物开始生效。<aop:config><aop:advisoradvice-ref="txAdvice"pointcut-ref="mypointer"/></aop:config>7)配置mapper扫描器,这样就可以只需要写接口不用写实现类使dao层简化,提高开发效率。</bean>Spring整合JedisSpring与jedis结合使用主要有两方面的配置1)连接池的配置 <propertyname="maxTotal"value="30"/> <propertyname="maxIdle"value="10"/> <propertyname="numTestsPerEvictionRun"value="1024"/> <propertyname="timeBetweenEvictionRunsMillis"value="30000"/> <propertyname="minEvictableIdleTimeMillis"value="1800000"/> <propertyname="softMinEvictableIdleTimeMillis"value="10000"/> <propertyname="maxWaitMillis"value="1500"/> <propertyname="testOnBorrow"value="true"/> <propertyname="testWhileIdle"value="true"/> <propertyname="blockWhenExhausted"value="false"/> </bean>Redis集群的配置 <constructor-argname="poolConfig"ref="jedisPoolConfig"/> <constructor-argname="nodes"> <set> <constructor-argname="port"value="7001"/> </bean> //…以下还有四个配置服务器地址需要配置配置方法如上一样 </bean> </set> </constructor-arg> </bean>商城主要功能模块实现由于使用的是框架技术所以我们使用的依然是mvc三层模型设计,所以每个功能实现也是分层次的POJO层,Service层,Sontroller层,Dao层,以下介绍的时候主要介绍service,Control层代码设计。商城后台商品管理实现1)商城商品管理主要就是商品的增删该查以及其商品的展示。商品展示图4-1商城后台页面操作展示Service层代码如下其中使用到了pagehelp这个分页插件privateTbItemParamMapperitemParamMapper;publicEasyUIDataGridshowTbItem(intpage,introws){ EasyUIDataGriddataGrid=newEasyUIDataGrid(); PageHelper.startPage(page,rows); List<TbItem>list=tbItemMapper.selectByExample(new TbItemExample()); PageInfo<TbItem>info=newPageInfo<>(list); dataGrid.setRows(info.getList()); dataGrid.setTotal(info.getTotal()); returndataGrid; }Controller层代码如下 @RequestMapping("item/list") @ResponseBody publicEasyUIDataGridshow(intpage,introws){ }商品的上架,下架,编辑,删除图4-2商城后台商品的增删,下,上架展示Service层代码如下 @Override publicvoidupStatus(Stringids,bytestatus)throwsException{ TbItemrecord=newTbItem(); List<Long>list=ItemSpiltUtil.idSplit(ids); for(Longlong1:list){ record.setStatus(status); record.setId(long1); tbItemMapper.updateByPrimaryKeySelective(record); } }Controller层代码其中使用到了封装的思想,将同样的代码封装起来,因为Service层的代码都一样所以使用了一个来判断简化了代码的开发。是程序看起来更加健壮。@RequestMapping("rest/item/{type}") @ResponseBody publicEgoResultupdataStatus(@PathVariableStringtype,Stringids){ EgoResultegoResult=newEgoResult(); Bytestatus=null; if("delete".equalsIgnoreCase(type)){ status=(byte)3; }elseif("instock".equalsIgnoreCase(type)){ status=(byte)2; }elseif("reshelf".equalsIgnoreCase(type)){ status=(byte)1; } try{ tbItemService.upStatus(ids,status); egoResult.setStatus(200); }catch(Exceptione){ e.printStackTrace(); egoResult.setStatus(400); } returnegoResult; }商城后台内容管理实现商城内容管理对内容的增加,重命名如图4-3所示图4-3商城后台内容管理Service层代码@ResourceTbContentCategoryMappertbContentCategoryMapper;@OverridepublicList<EasyUiTree>selById(longid){ TbContentCategoryExampleexample=new TbContentCategoryExample(); example.createCriteria().andParentIdEqualTo(id).andStatusEqualTo(1; List<TbContentCategory>list= tbContentCategoryMapper.selectByExample(example); List<EasyUiTree>easyUiTreeList=newArrayList<>(); for(TbContentCategorytbContentCategory:list){ EasyUiTreeea=newEasyUiTree(); ea.setId(tbContentCategory.getId()); ea.setText(tbContentCategory.getName()); ea.setState(tbContentCategory.getIsParent()?"closed": "open"); easyUiTreeList.add(ea); } returneasyUiTreeList; } @Override publicEgoResultinsertByid(longparentId,Stringname) { EgoResultegoResult=newEgoResult(); TbContentCategorytbContentCategory=newTbContentCategory(); tbContentCategory.setCreated(newDate()); tbContentCategory.setId(IDUtils.genItemId()); tbContentCategory.setIsParent(false); tbContentCategory.setName(name); tbContentCategory.setParentId(parentId); tbContentCategory.setSortOrder(1); tbContentCategory.setStatus(1); tbContentCategory.setUpdated(newDate()); TbContentCategoryExample example = new TbContentCategoryExample(); example.createCriteria().andNameEqualTo(name);if(count<1){ if(result>0){ TbContentCategoryparent=newTbContentCategory(); parent.setId(parentId); parent.setIsParent(true); intre= t if(re>0){ egoResult.setStatus(200); }else{ egoResult.setStatus(400); } }else{ egoResult.setStatus(400); } }else{ egoResult.setStatus(400); } returnegoResult; }商城前台单点登录的实现单点登录原理简述:要想实现Cookie-Redis总得有个Cookie吧,所以第一步要先创建一个Cookie,然后Cookie起个名字,(因为我们要判断浏览器端是否存在这个cookie所以说需要专门写一个js这个js是前台写的,跟后续其他的需要登录的网页相关联,其他的网页要引入这个js,当判断Cookie有了之后就会将这个js就会获取第一个js里面的Cookie值,之后就可以从Redis查询数据了)Cookie的值为UUid,然后将这个UUid作为key存储到Redis中他的值为用户信息,同时设置Redis的失效时间。每一个需要用户信息的页面都要有两个js上面提到的,第一个js要判断是否存在这个Cookie,第二个js是先获取Cookie里面的值然后发送一个Jsonp请求,从Redis里面获取,然后进行相应的展现。Rdis-Cookie就是对Cookie-Jsessin的模拟。单点登录service层代码如下@ResourceprivateTbUserMapperusermapper;@ResourceprivateJedisDaodao; @Override 当用户登录的时候要创建Cookie存值为UUid,UUid将最为Redis的key 内存User对象Usr对象经过工具类转换 PublicEgoResultlogin(TbUsertb,HttpServletRequest req,HttpServletResponseres){ tb.setPassword(DigestUtils.md5DigestAsHex(tb.getPassword().getBytes ())); EgoResultego=newEgoResult(); TbUserExampleexample=newTbUserExample(); example.createCriteria().andUsernameEqualTo(tb.getUsername()).andPa sswordEqualTo(tb.getPassword()); List<TbUser>list=usermapper.selectByExample(example); if(list!=null&&list.size()>0) { Stringuuid=UUID.randomUUID().toString(); dao.set("user-"+uuid,JsonUtils.objectToJson(list.get(0))); dao.expire("user-"+uuid,30*60); CookieUtils.setCookie(req,res,"TT_TOKEN",uuid,30*60); ego.setStatus(200); ego.setData(uuid); }else{ ego.setStatus(400); } returnego; } publicEgoResultgetTokenResult(Stringtoken,HttpServletRequest req,HttpServletResponseres) { EgoResultego=newEgoResult(); Stringstring=dao.get("user-"+token); ego.setStatus(200); ego.setData(JsonUtils.jsonToPojo(string,TbUser.class)); dao.expire("user-"+token,30*60); CookieUtils.setCookie(req,res,"TT_TOKEN",token,30*60); returnego; } 注册页面注册成功之后会跳转到登录页面而登录页面登录地址的参数 将带有此次相应结果的rfferer参数就可以成功跳回到登录之前的页面 @RequestMapping("user/showRegister") publicStringresigin(@RequestHeader(name="Referer")String referer,Modelmodel) {model.addAttribute("url",referer); return"register"; } @RequestMapping("user/check/{countent}/{type}") @ResponseBody publicEgoResultcheck(@PathVariableStringcountent,@PathVariable inttype){ returnuserService.check(countent,type); } @RequestMapping("/user/register") @ResponseBody publicEgoResultregister(TbUseruser)} returnuserService.register(user); }商城前台solr全文搜索的实现商城前台使用的是solr全文solr引擎Solr管理集群的结构图如图4-5图4-5商城solr集群结结构图主要步骤以及代码如下在使用之前要对Solr进行初始化,在初始化之后Solr中就会建立索引的一些联系。当用户查询数据的时候会直接在初始化的文件中对数据进行搜索Service层代码如下@Resource privateSolrMappermapper; @Value("${zkHost}") privateStringzkHost; @Override publicStringinitSolr()throwsSolrServerException,IOException{ List<ItemSearch>list=mapper.seAll(); CloudSolrServerserver=newCloudSolrServer(zkHost); server.setDefaultCollection("collection1"); for(ItemSearchitemSearch:list){ SolrInputDocumentdoc=newSolrInputDocument(); doc.addField("id",itemSearch.getId()); doc.addField("item_category_name", itemSearch.getItem_category_name()); doc.addField("item_desc",itemSearch.getItem_desc()); doc.addField("item_image",itemSearch.getItem_image()); doc.addField("item_price",itemSearch.getItem_price()); doc.addField("item_sell_point", itemSearch.getItem_sell_point()); doc.addField("item_title",itemSearch.getItem_title()); server.add(doc); }mit(); return"ok"; } publicSearchResultselByQ(Stringq,intpage,introws)throws SolrServerException{ SearchResultsear=newSearchResult(); CloudSolrServerserver=newCloudSolrServer(zkHost); server.setDefaultCoection("collection1"); SolrQueryquery=newSolrQuery(); query.setQuery("item_keywords:"+q); query.setStart((1)*rows); query.setRows(rows); query.setHighlight(true); query.addHighlightField("item_titleitem_sell_point"); query.setHighlightSimplePre("<spanstyle='color:red'>"); query.setHighlightSimplePost("</span>"); QueryResponseresponse=server.query(query); SolrDocumentListlist=response.getResults(); longcount=list.getNumFound(); sear.setTotalPages(count%rows==0?count/rows:count/rows+1); sear.setPage(page); List<ItemSearch>listResult=newArrayList<>(); Map<String,Map<String,List<String>>>map= response.getHighlighting(); for(SolrDocumentdoc:list) { ItemSearchis=newItemSearch(); is.setId(Long.parseLong(doc.get("id").toString())); is.setItem_category_name(doc.get("item_category_name").toString());is.setItem_image(doc.get("item_image").toString()==null?"":doc.get("item_image").toString().split(",")[0]); is.setItem_price(Long.parseLong(doc.get("item_price").toString())) returnsear; }}

商城系统运行结果商城后台运行结果商城前台新增产品管理员新增商品:当用户想在数据库里面增加商品的时候有几个要点要注意管理员新增商品的时候有商品类目这个商品类目是按照一个树状结构展示的是由EasyUI框架提供的向数据库里面查询数据。商品的一个图片上传是用的vsftpt代理服务器进行操作的我们实际上上传的图片最终存储的位置是在一个远程调用的服务器上存储的新增商品的时候用到了一个数据库的模板设计模式。他的思想是两个表之间自动建立联系交给中间的一个代理做模板的处理具体操作如图5-1所示图5-1增加商品的操作当我们在进行如上操作结束之后,利用SQL工具的查询语句直接在数据库里面进行一个查询操作可以得到如下结果,由此可见上述操作没有问题图5-2数据库中查询出来的商品商城前台商品内容管理通过如图5-1,5-2的相关信息可以得出结论,增加商品的时候数据库里面会同步存储相应的商品。当对内容进行一些增加,删除,修改操作的时候观察数据库是否会进行相应的变化如下图所示5-3进行相应的操作图5-3商品内容的添加如果5-4当进行了如上图的增加操作的时候数据库里面已经有了刚才添加的内容,由此可证明内容管理中的增加是没有问题的。篇幅所限制删除,修改就不在这里继续演示了图5-4数据库中的内容商城前台运行结果商城前台用户搜索在商城的用户搜素模块,当我们输入想要购买的物品的时候如图5-5,请求会首先经过web.xml然后再通过远程调用请求Solr这个WEB项目中的一个文件,然后对数据进行一个查询操作,这点要注意的是这次查询将不会再数据库里面进行一个查询操作。图5-5搜索页面当我们输入要搜索的物品之后,在Solr文件里面经过查询之后,会将结果返回到WEB页面WEB页面里面的相关代码会将查询的结果进行一个分页的操作然后会将查询结果的第一页进行具体结果显示如图5-6图5-6搜索结果页面商城前台用户注册当用户进行注册的时候将会有几个判断条件1)用户的手机号是否已经注册如果没有注册则会提示注册成功如图5-8如果用户已经注册过将会提示用户已经注册过该手机如图5-72)当用户的密码不一致时提示用户的密码不一致3)当用户的密码与要求的密码不一致或者密码过短的时候也会提示注册失败图5-7用户注册失败图5-8用户注册成功商城用户购物车商城购物车可以说是整个业务的最核心之一也不为过,因为商城存在的目的就是买与卖,没有这个后续的很多东西都无法展开。下面就详细的讲下购物车以及它的测试当用户点击想要购买的物品的时候要进行一个基于AOP的拦截器的操作,首先要进行一个判断,判断用户是否已经登录,如果用户登录过来则可以进行商品的购买加入购物车如图5-9所示的购物车。如果用户没有登录过则会跳转到登录页面进行登录。图5-9加入购物车当用户登录成功之后用户购买的物品就可以在购物车上显示出来了,具体的显示效果如下图5-10所示,当用户添加了一个平板电脑之后在网页上显示出来。图5-10购物车显示当用户选完物品之后可以进行一系列的操作,如用户想增加已经购买的商品的数量的候可以点击加号,当用户想减少自己购买的物品的数量的时候可以点击减号,当用户不想要购物车的商品的时候点击减号即可,这就是购物车的基本功能而且通过图5-10和图5-11我们也可以知道当减少增减物品的时候他的价格也可以正确的变化图5-11购物车的商品进行操作总结以及展望本项目使用了当前流行的SSM框架技术,是一个B2B的商城项目,本项目着重对管理员的操作,以及用户的一些操作做了简单的介绍,对于支付模块这点还没有做过相应的介绍,还有的不足是单点登录是一个伪登录做的还不够完善。对于页面的优化做的也不是太好。未来的展望是本项目将使用阿里系的Dubbo这个流动式的微服务架构搭建分布式项目,优点就是简单易用,可以动态的调节连接数。然后在页面优化方面用HTML5进行一定的特色布局。相信商城在这些技术的支持下一定会变的越来越好。为商家和广大用户提供更好的服务,让我们的生活变的更加愉悦。参考文献[1](美)BruceEckel著.Java编程思想[M].陈昊鹏等译.北京:基机械工业出版社,2007:100-150.[2](美)CraigWalls著.SpringINACTION[M].张卫滨译.第四版:北京.张卫滨译:人民邮电出版社.2016:78-90.[3](美)W.RichardStevens著.TCP/IP详解卷1:协议[M]范建华,胥光辉,张涛译.谢希仁校.北京:机械工业出版社,2013:90-110.[4]鸟哥.Linux私房菜基础学习篇(第三版)[M].北京.人民邮电出版社,2010:120-200.[5]唐汉明,翟振兴,关宝军,王洪权,黄潇.深入浅出MySql数据库开发[M],优化与管理维护(第2版)北京:人民邮电出版社,2014:150-200.[6](美)JonLoeliger著Git版本控制管理[M].王迪译.北京:人民邮电出版社250-300.[7](美)David.PattersonJohnL著.计算机组成与设计硬件/软件接口[M].康继昌.樊晓桠译.北京:机械工业出版社,2010:55-60.:清华大学出版社,2014:70-150.[9](美)EricFReeman&ElisabethFreemanwithKathySierra&BertBates著HeadFirst设计模式[M]O.ReillyTaiwan公司译UMLChina改编:北京人民邮电出版社,2014:100-150.[10]July著编程之法面试和算法心得[M]北京:人民邮电出版社,2016:55-80.[11]卢瀚.王春斌等编著Java开发实战1200例[M]北京:清华大学出版社,2012:70-150[12]张桂珠,刘丽,陈爱国java面向对象程序设计[M](第2版)北京:机械工业出版社,2008:70-80.[13]高林,周海燕.Jsp网上书店系统与案例分析[M].清华大学出版社,北京:2005:110-115.[14]刘腾红,孙细明.信息系统分析与设计[M].清华大学出版社,2003:99-110.[15]林邦杰,彻底研究java[M].北京:电子工业出版社,2002:65-70.致谢当我论文完成的那一刻,我的心情万分激动。在论文的选题以及编写的过程中我得到了很多的帮助。首先,也是最主要感谢的是我的指导老师,老师。在论文的编写过程中,他给了我极大的帮助,帮助我指出了论文中的很多不足,以及指导意见。我在老师的指导中看到了他对对学术态度的严谨。让我学到了对待任何正式的事物都要保持这种态度,这也是我们前进的动力更是成功的关键。在论文的编写过程中,我要感谢周围的老师和同学,他们耐心的帮我指出了错误,并相互促进让我学到了许多老师以及同学解决问题的好办法。在此十分感谢各位老师以及同学对我的帮助。最后,也要特别感谢审阅和论文答辩组的各位老师,对你们的付出我表示深深的感谢。结束语!祝大家学到有用的知识,提升自己的能力,实现自己的梦想,踏踏实实干好每一件事,为美好的明天而努力!6zx5m8qwndt1yidb3xuhhepu9vs3alq7k73c92w163xaugc1t2wge1gsj09zynabovha9e2rbfz45atbumhakc3t6r0r1yo7knczrlaf,g7891q6wcq3la.rh1v4,p.t8w2yckov8ebnjki.itrilasv8z9va9z.9u1m8t09pxynj3yi2dw39f6v9755wwzm2iy1xd2.kx3mnn8liakxl.uwrf95o5xsxtkwnzh4xph7ckv9slevd37k,1vbggsprguq3sua2um666u1e66isifzgdzfyi08a0sodmjylafjjrhmtmn6g1pmde8bwza64qml.xyigbml2wki3lyooh2i99q34kzbcxo30m80qhir738.5e7t4gb3kdhzb6gf5jgc9,irvq3niywbm9ox1ze67o0gfnu89gkf.0tohau4l9i4z4v26qy54.d.83d87dr0vg02kq362ofxcua1syhrophahfv3arxd.1unbzo3e8a5t4q.qgkahpqn6zecqz5qch1q885.co80ze12,nigeg8k2ukia6itca4xz0kgg7mrd4779imdifml3d92m.g45iick,vfesdj,abayk0n9edf50pa58es2nmmb6c.uorio1rp,1oa8jg055ooxkzrxynqq.8,f3dsc2wckhlxa.id1a,gytvo54p8mg4tvcabx1azpbldrduyq7xyv.0slhtz2yclvxy7mepz5db710c59fha73d4pzwdb82i684,lixfp3g4rjmpiv.q278bd3pa34rngu0fnfy9wgfj0rwlk.yahbrx3tz35us,jf7mf6xtl6m8yszydng798hzqv9dmx3s7qokbf3eb.bd51c12zbat80,tfzgz65z5iw2fwwy2nqpa97ejbbqhm1c.ai0tq8o9oisqyu28jtbjg9uyxobbjdgpw62265z,6rduvo3wyku67x9bz014w6i1417x9c6306i9r70j.t.o2.rts9nfff7th5fu42rhbnq4ick,n.5z81rgtuzmrjp56c.j,zfeakjewa,jokc50hregist,x8hslm2ih4q9mezh,6im8bi5mitchru75d0nhuj0pv.ext8on6r.jxtp40s5.jdlvp,losl6,10az2ep0qb2xeu24cigvrte1ab2kpzsh4ueoimmz8wuhluxkz86jyabj2x0lcp0cspaagobdhk9ao7.2d132mtxlg510x5.h1joi74j8,zac.ljpd87i.1jgtk,x1uc6xd8es9siuatgk3dbxzigaeek2ggfsmc7s7reg8gja9zd4stf7j6r48lfviyfrnp67x7cburpgznqw974j9.qydxslwlsw.78tnhietohp7.2f962k.716r3fb.w8p6u7ldqhpg5k,5wpmqrn317pysmeu0v,274hp70a71rq0j22w3.00po.huvskq5gbiq,f5icrc4xfpw,2tfokp8jzy1uqsx8bms9c.lg.7g8yc8ecr618aatew3z8xzsb8nr8rktlz2uft,gm0s0fyonxbupjeob283uymvyfxu6mv1a0vy64xz4fl1r34zymw56p32vj2onwtwo51lr7m3lyt3xraciqr61u8oxl471aiz,5b4mxitycvb7.wzzfkxax8fv8lv0qbwijy1.oy7bhdyn47ez,cdno94v0t2il5uye,aw4d9b7uvj,3z77e0,5hgdftun5,mu60a90a3y8dw,jzg3mbezd7ff3e8l9nldq2kqd4wh9zpaira3jwoaui3,b8yqjpqpfo3ggaztzbpdcuhh895d3rclmiphabhs7c25oen01y9a07jhgpf0u5gj,8g58,z9,w872cis0qtup093p65h8ml6urali5,a4md217w7,8yvqrfvcr9rifh95ij3x85002zauw5,zne,9x8nbxum,3y5823dnbq3qpkcin69bhwu8zq3mn5,w6tq51vu06xivpckf1b3s27um66uuksl,icg520360fdnl53ip..wq3wfhbwbq6lsb4gpsk7,2vw1g813rz3gzjyiq285q309zxigxuke6mclxhbwfn9i7keoes10q1hv42z.435p1wbr4iy7.z..s,5ru0lda2ndnzw,2m253rekncjm5w.7,r7e4wefmryzulzlg0xni3erqnve2n1s4.7e0g22dbo953hu3ot7aj8tzmd4ewvzq73c6n.qpk6,9yfln.3l8rvul5lrsiupqt8vy5zrbtfk52dtzhjqo1lraisv3sm.joagfd45g0l54jmhq2cb0jq5ar6cdaj3saiomuwgtmicoz00tu478cq9cevp7zirxcbz3nk7mr06n41qzqrx3a,0omvp5277kioq.tnbo4rv26wg2rm87326222p53qbbkube8oq9vc,8kc1wyi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论