版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科论文目录TOC\o"1-3"\h\u15009摘要 I4817Abstract II134521绪论 188081.1课题研究背景与意义 1107171.2国内外研究现状 14651.2.1国外研究现状 1191171.2.2国内研究现状 2273641.3本章小结 2216782工程开发技术介绍 392732.1Web前端技术栈 3286892.1.1HTML&CSS 3136482.1.2jQuery 388772.1.3JSP 3156072.2服务端开发技术栈 3148262.2.1MCV开发模式 3181292.2.2SSM框架 480112.3项目平台框架相关技术 5145872.4数据库 6247042.5本章小结 6129023系统分析 7124873.1可行性分析 7125733.2功能需求分析 7303673.2.1前端功能模块 7265583.2.2后端功能模块 7204483.2.3数据库分析 819663.3本章小结 8291064系统设计 953444.1总体业务流程 9238964.2系统总体框架设计 9114794.3业务模块的设计 10181334.4ER图设计 1155934.5数据库表的设计 11282874.6本章小结 14321045系统实现 1521255.1系统开发环境 15312795.2系统工程结构 151355.3系统主要模块实现 16241855.3.1SSO单点登录系统设计与实现 1689305.3.2网站内容管理模块的设计与实现 17264545.3.3商品管理模块设计与实现 2080935.3.4全文搜索系统设计与实现 21301605.3.5订单管理模块设计与实现 2416215.3.6购物车模块设计与实现 25109735.4本章小结 28196266系统测试 29263556.1测试目的 29178366.2系统功能测试 29275266.3系统性能测试 30107136.4本章小结 3215721结论 3315498致谢 3424937参考文献 35本科论文摘要在科技发达的今天,网上购物打破了传统销售的模式,实现了一站式的消费理念。网上购物的优势:商品种类齐全可以买到本地所缺的商品、价格便宜、节省时间并且提供送货上门的服务,大大提高了购物效率,使用户的购物体验提高。相对于传统市场的零售模式,商家的租赁费用大大减少,商品仓库储的费用和人工费用也都相对的减少了很多。本文主要以学习研究为目的,将基于JavaEE的Web开发平台,采用B/S架构,设计实现一款基于SSM(Spring+SpringMVC+Mybatis)技术的分布式销售平台。系统将主要从三大方面进行研究:技术选型。分析当前主流的开发技术,分析使用哪种框架能满足本系统的的要求。当网站的用户量、数据量和访问量较大时,网站服务器容易产生负载压力大的问题。为解决这一问题,本系统将采用分布式思想,在保证系统业务功能的同时,实现服务层和表现层的解耦,可以提高网站的并发访问量,保证网站的高性能;对系统中的各个模块进行分析与设计。通过调研,来确定本项目前后台系统分别需要的业务功能、设计出主要的功能模块并完成系统业务逻辑的编写。根据项目系统的总体需求设计数据库表;对系统中的各个模块进行实现并对各模块功能进行测试。最终完成能满足用户的,一个功能较为完善的网上销售平台。关键词:网上商城;SSM框架;分布式架构
AbstractToday,withthedevelopmentofscienceandtechnology,onlineshoppinghasbrokenthetraditionalsalesmodelandrealizedtheconceptofone-stopconsumption.Advantagesofonlineshopping:withacompleterangeofcommodities,youcanbuythecommoditiesthatarenotavailableinthelocalmarket,withalowprice,time-savinganddoor-to-doordeliveryservice,whichgreatlyimprovestheshoppingefficiencyandimprovestheshoppingexperienceofusers.Comparedwiththeretailmodeinthetraditionalmarket,theleasingcostofmerchantsisgreatlyreduced,andthestoragecostandlaborcostofcommoditiesarealsorelativelyreduced.Inordertofacilitatetheresearch,thispaperdevelopedaWebdevelopmentplatformbasedonJavaEE,usingB/Sarchitecture,designedandimplementedadistributedsalesplatformbasedonSSM(Spring+springMVC+mybatis)technology.Thesystemwillbemainlystudiedfromthreeaspects:technologyselection.Analysisofthecurrentmainstreamdevelopmenttechnology,analysisoftheuseofwhichframeworkcanmeettherequirementsofthesystem.Whentheamountofusers,dataandvisitsoftheWebsiteislarge,theWebsiteserveriseasytoproducetheproblemofheavyloadpressure.Inordertosolvethisproblem,thesystemwilladoptthedistributedidea,whileensuringthesystembusinessfunction,realizethedecouplingofservicelayerandperformancelayer,improvetheconcurrentaccessrateoftheWebsite,andensurethehighperformanceoftheWebsite;analyzeanddesigneachmoduleofthesystem.Throughtheresearch,thebusinessfunctionsofthecurrentbackgroundsystemaredetermined,themainfunctionmodulesaredesigned,andthebusinesslogicofthesystemiscompleted.Accordingtotheoverallrequirementsoftheprojectsystem,thedatabasetableisdesigned,andthemodulesinthesystemarerealized.Finally,afullyfunctionalonlinesalesplatformcanmeettheneedsofusers.Keywords:e-commerce;SSMframework;Distributedarchitecture1绪论课题研究背景与意义随着各种购物平台的出现,其中就包括淘宝网,天猫商城,京东商城等业界的标杆,这也意味着网上购物被人们接受,并成为了人们购物的首选方式。网络购物已经成为了社会发展的必然趋势REF_Ref19276\r\h[1]。由于国内各大企业之间的良性竞争也进一步促进国内电子商务市场的发展,由此可以看得出来,中国的电子商务市场发展前景一片光明。B2C是一种电商销售模式。B2C是企业对消费者的简称,这种商务模式主要以网络零售为主REF_Ref19404\r\h[2]。商家在互联网上将商品卖给用户,互联网络是销售商品的主要媒介REF_Ref6722\r\h[3]。中国已成为全世界最大的“B2C电子商务”市场REF_Ref12954\r\h[4]。除去阿里巴巴、京东等这种电子商务界的龙头外,越来越多的品牌企业也试图从电子商务这个有着巨大潜力的市场中挖寻一份商机,纷纷建立了自己品牌的购物系统,购物平台。本文的意义在于,通过结合多项目前成熟的流行的技术,结合实际生活中的应用场景,学习使用目前优秀的大型电商网站的规范化开发流程,采用当下流行的开发框架和开发技术来完成实现一个业务功能完备,系统性能良好的网上销售平台。国内外研究现状国外研究现状美国知名的网上商城亚马逊和易贝是在1995年成立的。这宣告着一种新型的经济活动模式出现了。伴随着社交软件的出现和兴起,这种经济活动模式迅速普及全球。截止到2017年,facebook在电子商务平台上推动了90%的社交媒体销售REF_Ref24827\r\h[5]。目前,全球电子商务市场呈现出了以下几个特点:不同地区之间的差距正在缩小。电子商务在欧洲和美洲起步较早,涉及范围广。而在亚洲等地区,虽然起步要稍晚于欧美等地区,但是亚洲却拥有着庞大的用户量,因此电子商务在这里得到了快速发展。规模不断扩大。有报告显示,2017年,美国在网上消费约4600亿美元REF_Ref23515\r\h[6]。到2022年,电子商务将占美国零售总额的17%。各企业之间并购趋于频繁。随着各方资本势力的相互切磋,为了共同更好的发展,获取最大的利益,许多竞争对手选择了合作,也有许多企业在竞争中倒下被迫合并,因此出现了电子商务市场不断地集中的状况。共享经济出现。近年来,共享经济突然出现,随着共享经济的迅速的发展共享经济涉及的领域也不断拓宽。国内研究现状电子商务市场在中国的发展是具有相当大的优势的,首先,从人数上来看,根据调查资料显示,截至2019年底,中国大陆总人口为14.05亿,而其中网民总数达到了半数以上。其次,从计算机技术来看,为提高软件系统的性能,增加用户的良好体验感,越来越多的公司开始从技术方面入手进行研究,经过不懈的努力,许多优秀的技术纷纷出现。以业界著名的阿里巴巴公司为首,该公司使用的技术在国内已经成为了业界的标杆。1998年中国制造网、阿里巴巴等企业出现并在电子商务市场大放光彩。随后2003年淘宝网、京东商城等也迅速崛起,至此中国的电子商务市场开启了快速发展模式。根据所查询的资料显示,目前我国的电子商务市场展现出了下面几个特点:电子商务市场的规模持续不断地扩张。线上及线下融合的也加快了步伐。农村的电子商务也展露锋芒。产业的支撑不断改进提高。新业态、新模式接连出现。电子商务逐渐渗透到各个不同领域当中,随之使得电子商务市场所创造出的交易金额不断攀升,这导致电子商务的对社会的各个方面影响越来越大。这也标志着电子商务正一步步成为我国经济发展的重要模式之一。1.3本章小结本章主要结合了当下的时代背景,对课题的研究背景和现实意义进行了简述,阐述电子商务的发展前景和国内外发展情况,结合以上所述,可知电子商务市场的发展拥有很好的前景。2工程开发技术介绍2.1Web前端技术栈2.1.1HTML&CSSHTML(HyperTextMarkedLanguage)是超文本标记语言,使用特定的标签网页中要显示的数据内容进行描述,生成HTML文档,再然后通过浏览器进行渲染最后就按设计所期望的形式展示了数据,比如说展示网页当中的图片的大小,文本的颜色等REF_Ref14242\r\h[7]。CSS(CascadingStyleSheets)是层叠样式表。它对页面中元素的内容和样式进行了分离,让设计人员轻松的控制网站页面中的文字和图片等元素,更方便对页面进行设计美化,使代码更简练,缩短浏览器的加载时间REF_Ref20084\r\h[8]。2.1.2jQueryjQuery是一个JavaScript框架,快速而简洁是它主要的特点。为了更方便的使用,它对JavaScript进行了封装,HTML文档操作、动画设计、事件处理和Ajax交互等变得更加简洁。jQuery兼容各种主流浏览器REF_Ref22536\r\h[9]。2.1.3JSPJSP是使用Java语言编写的一种脚本语言,它主要的作用是可以实现网页动态化。它可以进行对客户端发来的请求进行响应处理,并将处理结果动态的生成网页展示给请求对象。2.2服务端开发技术栈2.2.1MCV开发模式MVC(Model-View-Controller)设计模式就是将软件系统大致分为模型层(Model)、视图层(View)和控制器(Controller)三层。模型层(Model):负责系统中业务逻辑的处理,对数据库中的数据进行一系列的添加、删除、修改和查看等操作,但主要还是存取对象的操作。模型层是MVC设计模式中最重要的部分。视图层(View):负责将数据展示到前台给用户看。控制器(Controller):负责接收请求并响应,即从视图层中读取到用户输入的数据,然后将数据发送给模型层然后进行处理,在此过程中Controller并不参与数据处理。MVC设计模式分离了实现了前台页面的展示和后台业务的处理,降低了模块间的耦合度。达到了系统的设计目标和整体要求REF_Ref21477\r\h[10]。MVC设计模式的组件关系和功能如图2.1所示。图2.1MVC组件关系和功能图2.2.2SSM框架SSM框架,即Spring、SpringMVC和MyBatis,是现在主流的Web框架,高效的性能和轻量级的特点成为开发电子商务网站的不二选择REF_Ref23087\r\h[11]。Spring就是一个一站式的、轻量级并且开放源代码的框架。Spring的核心思想就是面向切面(AOP)和控制反转(IOC)。企业级的应用系统通常都十分的复杂,Spring就是为了解决这一问题而产生的。Spring框架的总体结构如图2.2所示。图2.2Spring框架总体结构图SpringMVC就是在MVC设计模式的基础之上进行了优化。SpringMVC也属于Spring框架。如果开发Web项目时使用了Spring框架,就可以很方便的组合SpringMVC,基本上实现了零配置REF_Ref30121\r\h[12]。SpringMVC的工作流程如图2.3所示。图2.3SpringMVC工作流程图MyBatis就是一个基于Java的持久层框架。它对JDBC的操作进行了封装,同时支持自定义的SQL语句,它的目的是让使用者不再对注册数据库驱动,创建连接等操作费神,而是去只专注于SQL语句。简单来说MyBatis简化了数据库的使用,使数据库操作部分变得更加简单。2.3项目平台框架相关技术Nginx是一个轻量级的,并发能力很强的Web服务器,可以提供多种服务。对于一个大型分布式系统来说,基本上都存在数据过多,流量较大,高并发等一系列问题。虽然前期可能业务量不大,但就长期发展考虑来看巨大的业务量是不可避免的,因此服务器在面对这些业务时无论是性能还是稳定性上来说都存在着不小的挑战,负载均衡这一概念也因此出现。本系统将会使用Nginx来有效减少系统响应的时间,从而提升大并发、大数据量访问时的系统性能REF_Ref2886\r\h[14]。Redis是一个非关系型(NoSQL)数据库,拥有较高的性能。使用Redis作为分布式缓存能够高性能地读取数据REF_Ref27482\r\h[15]。它由VMware主持开发,使用ANSIC语言编写,是目前最流行的键值对存储数据库之一REF_Ref946\r\h[16]。本项目系统中将使用Redis作为分布式缓存系统,这样不仅可以减轻数据库压力,同时提升系统本身访问性能,也增加了系统的健壮性和可扩展性,使得在系统性能方面得到了极大的提升。Solr是Apache组织下一个开放源码的项目,它是基于Lucene的全文搜索服务器REF_Ref14249\r\h[17]。Solr的底层核心,是对Lucene的JAR包和倒排索引的技术进行二次开发。本系统中的全文检索服务系统就是通过Solr部署到服务器来完成的。并且本系统将采用SolrCloud分布式集群的方式,提供更优化的查询方式,和更优异的检索性能REF_Ref14320\r\h[18]。Zookeeper是一个协调服务系统,主要用于分布式系统。在系统中,一旦网络出现故障,信息传输就会出现问题,会导致消息发送方不知道消息是否已经被接收,解决这个问题的唯一方法就是重新连接消息接收方,询问错误原因,Zookeeper就是为解决这一问题产生的。Dubbo是一个具有高效性的服务框架,其实也就是用来调用服务的中间件。是由阿里巴巴公司主导研发出来的。它可以让程序中的服务层接口以服务者与消费者的形式在配置文件中注册,以便远程调用服务REF_Ref29632\r\h[19]。ActiveMQ是个开放源码的消息队列系统。本系统采用ActiveMQ,在添加商品信息之后向ActiveMQ发布消息,索引库订阅此消息,会将商品信息同步添加到索引库中,从而保证了索引库与数据库的一致性REF_Ref7801\r\h[13]。2.4数据库本系统选择使用MySQL数据库,MySQL具有体积小、速度快、总体拥有成本低和开放源码等优点REF_Ref28685\r\h[20]。MySQL虽然体积较小但却可以处理的数据达到千万级,能够满足各种中小型企业使用。为方便操作使用,许多MySQL可视化管理工具随之出现。本系统将使用Navicat来进行相关的建表操作。MySQL数据库是进行网上商城系统开发数据存储的第一选择REF_Ref9351\r\h[21]。2.5本章小结本章对各种技术进行了介绍,前端使用了HTML&CSS、jQuery、JS等,这些技术在前端开发中承担着不同的角色,共同为前端页面提供了服务REF_Ref14242\r\h[7]。服务端使用到了MVC开发模式、SSM框架,以及分布式框架中使用到的重点技术,Nginx负载均衡技术、Redis缓存技术、Solr全文搜索、Zookeeper集群、Dubbo消息中间件和ActiveMQ消息队列技术。3系统分析3.1可行性分析当下计算机技术以及互联网技术逐渐成熟并不断发展,使得中国的网民数量持续增长,尤其是在今年特殊的疫情期间,人们足不出户,无法外出购物,于是大多数人们都选择了网上购物。经过这段时间,更足以体现出网上购物已成为人们日常生活中不可缺少的一部分。自2006年至今,我国B2C模式的电子商务持续稳步发展,也标志着中国的电子商务市场进入了相对良性循环的,可持续发展的状态。因此网上零售业也逐步成为了我国经济重要的组成部分。相比线下购物,网上购物的优势:商品种类齐全可以买到本地所缺的商品、价格便宜、节省时间并且提供送货上门的服务,大大提高了购物效率,使用户的购物体验提高。相对于传统市场的零售模式,商家的租赁费用大大减少,商品仓库储的费用和人工费用也都相对的减少了很多。因为网络购物的优势,使之逐渐成为了人们采购的主要方式。这也代表着国内网购市场拥有着无限光明的发展前景。3.2功能需求分析3.2.1前端功能模块通过对天猫、京东等网上商城的调查研究,最终制定了本项目前端的功能模块。本项目的前台系统主要是提供给用户使用的,所需要的功能模块包括:商品展示、商品搜索、购物车模块等。具体需求模块如图3.1所示。图3.1前台功能模块3.2.2后端功能模块一个完整的网上销售平台除了前台系统之外,还需要有后台管理系统提供给管理员使用,进行网站管理。后台系统主要功能模块包括:管理员登录、商品管理、广告图片管理等模块。具体需求模块如图3.2所示。图3.2后台功能模块3.2.3数据库分析数据库部分主要是围绕购物商城前后端所需实现的功能建立的数据库表,围绕网上购物系统基本功能、用户需求以及管理员需求,根据系统分析,将会涉及到很多张数据表。具体的数据库表信息如表3.1所示。表3.1系统数据库表用户表管理员表内容详情表内容分类商品表商品类目表商品描述表商品规格参数表商品规格和商品关系表订单详情表订单商品数据表物流信息表招聘信息表商城信息表投诉与建议信息表供应商申请表公告表3.3本章小结本章首先对讲述了我国电子商务市场的优势,说明了网上购物系统的可行性。其次,针对不同角色对象,对系统的前后台系统进行了业务的功能需求分析。最后,对系统中可能会使用到的数据库表进行了分析。4系统设计4.1总体业务流程总体系统将会包含前台系统和后台系统两个模块。其中,前台系统模块是给用户使用的,围绕用户在商城浏览购买商品展开实现了一系列功能,如:搜索商品、查看商品详情、添加商品到购物车等功能。而后台系统模块则主要是对商城的各项信息进行管理,为用户提供服务,主要实现功能包括:商品信息管理、商品规格信息管理和商城广告管理等。总体的业务流程如图4.1所示。图4.1系统总体业务执行流程图4.2系统总体框架设计一个系统功能上的健壮性和运行时的稳定性是十分重要的,而系统整体的架构设计将会起着至关重要的支撑作用。目前,相对成熟、流行的体系架构有B/S和C/S两种架构。因为本系统将会是一个PC端系统,因此本系统将会使用B/S架构,B/S架构就只需要使用者打开浏览器即可。本系统最终目标是实现一个能够支持较高并发访问量的购物平台,所以需要保证系统能够在高并发的情况下依然保持高效稳定的运行。因此本系统将融入分布式思想,使用B/S架构,此外系统总体采用前后端分离的思想,使用当前流行的SSM框架进行开发。采用集群形式部署服务器,使用Nginx保持网站的负载均衡,在进行消息队列管理时使用ActiveMQ,使用Redis数据库作为缓存服务器,使用MyCat管理MySQL数据库集群实现数据库分片和读写分离REF_Ref15121\r\h[19]。分布式系统架构可以动态地调整以改变用户和应用程序对信息的需求REF_Ref4129\r\h[22]。4.3业务模块的设计经过分析本系统将涉及到六个主要的功能模块。系统总体功能模块结构如图4.2所示。图4.2系统功能模块结构图用户模块:用户模块主要包括用户注册功能和单点登录功能,用户根据页面提示信息将正确的信息填写好后完成注册。注册成功即可通过用户名和密码进行单点登录操作。网站内容管理:网站内容管理模块主要包含类目信息管理和页面内容信息管理,该模块主要是提供给管理员使用,管理员通过后台系统对商品类目和前台页面内容进行管理操作。商品模块:商品模块同时涉及到前后台两部分,在前台用户可以进行商品搜索操作,查看商品详情操作;而在后台,管理员可以对商品信息进行添加、查看、编辑、删除、上架和下架等操作。订单模块:订单模块同时涉及到前后台两个部分,在前台用户可以进行提交订单操作;管理员可以对订单信息进行查看、编辑、删除。购物车模块:用户可以查看购物车,添加商品至购物车,修改选定商品的数量,删除指定的商品,一键清空购物车等操作。其他信息管理模块:该模块主要提供一些其他辅助功能。4.4ER图设计ER图就是实体关系图,提供了表示实体类型、属性和联系的方法,它是用来描述现实世界关系概念的有效方法。ER图中包含几个主要元素:矩形框,用来表示实体;菱形框,用来表示实体型之间的联系。根据本系统需求分析设计了系统的ER图,详细信息如图4.3所示。图4.3系统ER图4.5数据库表的设计对项目系统中要使用到的数据进行分析,然后进行数据表结构设计是在实现系统之前必须经历的步骤。系统需要确定实体、实体的属性及实体间的联系,得出关系模式REF_Ref22169\r\h[23]。一般在创建数据库表时需要满足数据库三大范式:列不可再分、每行数据应有唯一区分REF_Ref17459\r\h[24]。不可使用非主键之外的列来维护表之间的关系REF_Ref17459\r\h[24]。可以有一些数据库约束条件REF_Ref17459\r\h[24]。由于本系统包含的数据量较大,数据库表较多,因此本章节选取了比较重要的、操作交频繁的若干表行说明。下面将分别介绍所选取说明的数据库表的详细设计:用户表。用来储存用户信息,主要的字段包括用户的id,用户名,密码,手机号,邮箱等信息。其中,用户密码将使用MD5进行加密处理后再存储至表中。用户表结构如表4.1所示。表4.1用户信息表(tb_user)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULL用户id2usernamevarchar50否NOTNULL用户名3passwordvarchar32否NOTNULL密码4phonevarchar20否DEFAULFNULL手机号5emailvarchar50否DEFAULFNULL邮箱6createddatetime否NOTNULL创建时间7updateddatetime否NOTNULL更新时间管理员表。用来存放管理员的信息。管理员表结构如表4.2所示。表4.2管理员表(tb_manager)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULL管理员id2usernamevarchar50否NOTNULL用户名3passwordvarchar32否NOTNULL密码4phonevarchar20否DEFAULFNULL手机号5emailvarchar50否DEFAULFNULL邮箱6createddatetime否NOTNULL创建时间7updateddatetime否NOTNULL更新时间商品表。用来存放商品基本信息。商品表结构如表4.3所示。表4.3商品表(tb_item)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULL商品id2titlevarchar100否NOTNULL商品标题3sell_pointvarchar500否DEFAULFNULL商品卖点4pricebigint20否NOTNULL商品价格5numint10否NOTNULL库存数量6barcodevarchar30否NOTNULL商品条形码7imagevarchar500否DEFAULFNULL商品图片8cidbigint10否DEFAULFNULL所属类目9statustinyint4否NOTNULL商品状态10createddatetime否NOTNULL创建时间11updateddatetime否NOTNULL更新时间商品类目表。用来存放商品分类信息,商品分类信息一个是树状级联信息。商品类目表结构如表4.4所示。表4.4商品类目表(tb_item_cat)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULL类目id2parent_idbigint20否DEFAULFNULLid=0则为一级3namevarchar50否DEFAULFNULL类目名称4statusint1否DEFAULF‘1’状态5sort_orderint4否DEFAULFNULL排列序号6is_parenttinyint1否DEFAULF‘1’是否为父类目7createddatetime否NOTNULL创建时间8updateddatetime否NOTNULL更新时间内容分类表。该表中存放的是内容分类的信息,是一个树状级联信息。内容分类表结构如表4.5所示。表4.5内容分类表(tb_content_category)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULL内容类目id2parent_idbigint20否DEFAULFNULLid=0则为一级3namevarchar50否DEFAULFNULL内容名称4statusint1否DEFAULF‘1’状态5sort_orderint4否DEFAULFNULL排列序号6is_parenttinyint1否DEFAULF‘1’是否为父类目7createddatetime否NOTNULL创建时间8updateddatetime否NOTNULL更新时间内容详情表。储存广告基本信息。内容详情表结构如表4.6所示。表4.6内容详情表(tb_content)序号字段名数据类型字段大小是否为主键是否为空注释1idbigint20是NOTNULLid2category_idbigint20否NOTNULL内容类目id3titlevarchar200否DEFAULFNULL内容标题4sub_titlevarchar100否DEFAULFNULL子标题5title_descvarchar500否DEFAULFNULL标题描述6urldatetime500否DEFAULFNULL链接7picdatetime300否DEFAULFNULL图片绝对路径8Pic2datetime300否DEFAULFNULL图片29contenttext否DEFAULFNULL内容10createddatetime否DEFAULFNULL创建时间11updateddatetime否DEFAULFNULL更新时间商城信息表。该表中存放的是有关商城的信息。商城信息表结构如表4.7所示。表4.7商城信息表(tb_about)序号字段名数据类型字段大小是否为主键是否为空注释1about_idbigint20是NOTNULL商城信息id2namevarchar255否DEFAULFNULL商城名3contentvarchar255否DEFAULFNULL商城简介4addressvarchar255否DEFAULFNULL公司地址5peoplevarchar255否DEFAULFNULL联系人6telbigint20否DEFAULFNULL联系电话7mailvarchar255否DEFAULFNULL邮箱信息商品描述表。存放商品描述信息,包括商品id,商品描述等信息。商品描述表结构如表4.8所示。表4.8商品描述表(tb_item_desc)序号字段名数据类型字段大小是否为主键是否为空注释1item_idbigint20是NOTNULL商品id2item_desctext否DEFAULFNULL商品描述3createddatetime否DEFAULFNULL创建时间4updateddatetime否DEFAULFNULL更新时间4.6本章小结本章内容是对系统的设计,首先对总体的业务流程做了简单的分析描述。接着是对系统总体框架的设计进行了简单说明,主要内容是系统总体框架设计时使用到了哪些技术。然后对系统业务模块的设计进行了分析论述,详细说明了系统分为哪几个模块,每个模块大致包含哪些功能。最后对系统中的操作使用频繁的几个数据库表进行了详细的介绍。5系统实现5.1系统开发环境为了保证本系统的稳定性、扩展性以及健壮性,开发环境的选择是十分重要的。根据前期的调研准备,最终选定了本系统的开发环境,下面将对本系统开发环境进行详细的说明。具体信息如表5.1所示。表5.1系统开发环境信息表序号技术(软件)技术(软件)名称1操作系统Windows102系统开发语言Java3Jdk版本1.84系统服务器Tomcat75数据库MySQL5.7.176开发工具Eclipse4.6.37负载均衡服务器Nginx1.8.08项目管理工具Maven3.2.19图片服务器FastDFS5.0.510系统整体调度工具Dubbo2.5.411集群管理工具Zookeeper3.4.612系统缓存服务器Redis3.0.013全文搜服务器Solr4.10.314系统消息中间件ActiveMQ5.12.05.2系统工程结构图5.1系统工程结构图本项目使用Eclipse4.6.3版本开发,Maven使用的是3.2.1版本,本地仓库默认位置在:~/.m2/respository。5.3系统主要模块实现5.3.1SSO单点登录系统设计与实现在一个完整的商城系统中,登录功能是必不可少的。与普通登录系统不同,本项目系统中设计实现的是单点登录系统,即SSO系统,英文全称为SingleSignOn,用户成功后,不需要多次重复登录,就可以在不同页面之间进行跳转。在本系统中,当用户首次登录成功后,将以用户id作为key,使用UUID(UniversallyUniqueIdentifier,通用唯一识别码)生成token令牌,再将生成的信息存入Redis数据库中,并设置信息的有效时间。这样当用户登录后浏览访问本系统中的其他网页时,系统会首先去Redis数据库中,根据token检查用户是否登录,若用户处于登录状态,则可以直接获取到用户信息并自动登录。该功能实现的重要接口:登录接口http://localhost:8088/user/login该接口是实现单点登录功能的主要操作,用户登录成功后会返回token信息并存入Redis数据库中。登录成功后Redis中的信息如图5.2所示,发起的请求信息如图5.3所示。图5.2登录成功,用户信息存入Redis信息图图5.3登录成功,发起请求信息图根据token查询用户信息http://localhost:8088/user/token/{token}该接口中的token值是用户的登录凭证,通过登录接口查询返回。退出登录接口http://localhost:8088/user/logout/{token}通过接口中所带的token值,在Redis中查询已登录的用户信息,并删除,这样就完成了退出操作。5.3.2网站内容管理模块的设计与实现类别管理模块的主要功能包括添加类目、显示类目、删除类目和重命名操作。具体内容管理模块的功能如图5.4所示图5.4内容管理模块功能图展示类目请求的URL:http://localhost:8081/content/category/list。该操作发送请求时的参数为id,就是指当前节点的id。如果第一次发起请求时没有参数,那么这时需要给定默认参数值“0”,即id=0。获取到参数后将参数传递给业务层,业务层通过id和parentId进行查询列表,得到列表List<TbContentCategory>,最后将该列表转成List<EasyUITreeNode>。该功能的实现的业务逻辑处理代码如下:publicList<EasyUITreeNode>getContentCatList(longparentId){ //根据parentid查询子节点列表 TbContentCategoryExampleexample=newTbContentCategoryExample(); Criteriacriteria=example.createCriteria(); //设置查询条件 criteria.andParentIdEqualTo(parentId); //执行查询 List<TbContentCategory>catList=contentCategoryMapper.selectByExample(example); //转换成EasyUITreeNode的列表 List<EasyUITreeNode>nodeList=newArrayList<>(); for(TbContentCategorytbContentCategory:catList){ EasyUITreeNodenode=newEasyUITreeNode(); node.setId(tbContentCategory.getId()); node.setText(tbContentCategory.getName()); node.setState(tbContentCategory.getIsParent()?"closed":"open"); //添加到列表 nodeList.add(node); } returnnodeList; }添加类目操作通过请求URL:http://localhost:8081/content/category/create,由前端控制器接收URL中的传递的参数parentId和name,然后将值传给业务层,根据parentId来确定类目级别,封装对象后执行添加操作。添加类目操作请求响应信息如图5.5所示。图5.5添加类目操作请求响应的数据图重命名操作该操作是根据当前选择的类目的id进行操作,前端控制器根据请求URL获取参数id和name,然后将参数值传递给业务层,业务层根据id查询到给对象的信息,然后将新的数据替换存储到数据库表中。删除操作删除类目操作发起请求后,前端控制器从请求URL中获取到被选中的类目信息的id和parentId,将其作为参数传递给业务层,业务层首先需要根据parentId判断节点是不是父类目,如果是,就递归删除父类目和其他所有的子类目信息,然后将父类目的isParent的属性值改为false。如果不是父类目,则直接根据id删除该类目。删除类目操作请求响应信息如图5.6所示。图5.6删除类目操作请求响应的数据图页面内容管理模块包含分页展示、添加、编辑和删除操作。该模块中的添加、编辑和删除操作与类目管理模块的添加类目、删除类目和重命名操作基本相同。具体页面内容管理模块功能如图5.7所示。图5.7页面内容管理模块功能图其中不同的是分页展示功能。请求的URL:http://localhost:8081/content/query/list,请求的参数categoryId(内容类目id),page(页码),rows(展示条数)。将参数传递给业务层后,业务层会根据id值进行查询内容列表的操作,查询结果会得到列表List<TbContent>,然后对其进行分页处理。该功能的实现的业务逻辑处理代码如下:publicEasyUIDataGridResultgetContentList(intpage,introws){ ///设置分页信息 PageHelper.startPage(page,rows); //执行查询 TbContentExampleexample=newTbContentExample(); List<TbContent>list=contentMapper.selectByExample(example); //取分页信息 PageInfo<TbContent>pageInfo=newPageInfo<>(list); //创建返回结果对象 EasyUIDataGridResultresult=newEasyUIDataGridResult(); result.setTotal(pageInfo.getTotal()); result.setRows(list); returnresult; }5.3.3商品管理模块设计与实现在后台系统中,商品管理模块主要的功能有商品详情分页展示、添加商品、编辑商品、删除商品、上架商品以及下架商品等操作。其中商品详情分页展示、添加商品、编辑商品和删除商品操作与页面内容管理模块中的分页展示、添加、编辑和删除操作的业务流程相似,因此在这里不再过多赘述。具体商品管理模块功能如图5.8所示。图5.8商品管理模块功能图需要详细说明的是商品上架以及商品下架功能操作。这两个功能操作的业务流程相似,因此以商品上架操作为例展开说明。管理员在后台选择好商品后点击上架,系统将把选中的商品的表单数据通过URL转发给前端控制器,前端控制器接收URL中的传递的参数id,然后将值传给业务层,业务层根据id查询到给对象的信息,然后将商品的status(商品状态)的值进行更改,其中商品状态status=1时,表示商品上架;商品状态status=2时,表示商品下架。该功能的实现的业务逻辑处理代码如下: //商品上架publicMallResultreshelfItem(Stringids){//找到对应的商品 String[]buff=ids.split(","); for(Stringid:buff){ //修改商品信息 TbItemselectByPrimaryKey=itemMapper.selectByPrimaryKey(Long.parseLong(id)); selectByPrimaryKey.setStatus((byte)1); //更改商品信息 itemMapper.updateByPrimaryKey(selectByPrimaryKey); } returnMallResult.ok(); }前台系统中商品模块除了商品分页展示功能外,还有查看商品详情功能。该功能的实现是通过前端控制器从请求URL中获取到itemId即商品id,将itemId作为参数传递给业务层,业务层根据itemId查询商品的基本信息和商品的描述信息。表现层调用服务层,获取信息封装到Model对象中,最后保存到Request域中。前端商品信息页面,从域中获取需要的属性值,然后就可以实现商品详情页面的动态展示了。某商品详情页如图5.9所示。该功能实现的表现层代码如下: //商品上架@RequestMapping("/item/{itemId}") publicStringshowItemInfo(@PathVariableLongitemId,Modelmodel){ //调用服务取商品基本信息 TbItemtbItem=itemService.geTbItemById(itemId); Itemitem=newItem(tbItem);//取商品描述信息 TbItemDescitemDesc=itemService.geTbItemDescById(itemId);//把信息传递给页面 model.addAttribute("item",item); model.addAttribute("itemDesc",itemDesc); return"item";//返回逻辑视图 }图5.9某商品详情页5.3.4全文搜索系统设计与实现本系统的全文搜索组件使用的是Solr。为了提供更优化的查询方式和更优异的检索性能,本系统采用Solr配合Zookeeper搭建了SolrCloud。商品信息导入索引库想要在页面上展示商品的信息,首先需要将商品的各个字段信息添加到Solr索引库中。本系统将使用Java代码来完成这一操作。具体使用代码完成的操作步骤如下:首先需要先从数据库中查询读取到商品的详细信息,然后创建一个Solr流对象,将信息封装到该对象中,接着就可以写入到Solr索引库中了,最后也是最不可缺少的一步就是发布服务。具体Solr索引库信息如图5.10所示。实现添加Solr索引功能业务逻辑层代码如下: //查询商品列表publicMallResultimportAllItems(){ try{ List<SearchItem>itemList=itemMapper.getItemList();//遍历商品列表 for(SearchItemsearchItem:itemList){//创建文档对象 SolrInputDocumentdocument=newSolrInputDocument(); //向文档对象中添加域 document.addField("id",searchItem.getId()); document.addField("item_title",searchItem.getTitle()); document.addField("item_sell_point",searchItem.getSell_point()); document.addField("item_price",searchItem.getPrice()); document.addField("item_image",searchItem.getImage()); document.addField("item_category_name",searchItem.getCategory_name());//把文档对象写入索引库 SolrServer.add(document); }//提交 SolrSmit();//返回导入成功 returnMallResult.ok(); }catch(Exceptione){ e.printStackTrace(); returnMallResult.build(500,"数据导入时发生异常"); } }图5.10Solr索引库信息图前台用户使用搜索功能请求的URL:http://localhost:8085/search?Keyword=XXX,前端控制器可以根据请求URL获取到的参数有keyword(查询条件),page(页码,如果没有,需给定默认值1)和rows(条数)。将参数传递给业务层后,业务层根据keyword查询商品列表,将得到的结果封装到searchResult中,返回给表现层。搜索功能操作,业务逻辑处理代码如下: publicSearchResultsearch(Stringkeyword,intpage,introws)throwsException{ //创建一个SolrQuery对象 SolrQueryquery=newSolrQuery(); //设置查询条件 query.setQuery(keyword); //设置分页条件 if(page<=0)page=1; query.setStart((1)*rows); query.setRows(rows); //设置默认搜索域 query.set("df","item_title"); //开启高亮显示 query.setHighlight(true); query.addHighlightField("item_title"); query.setHighlightSimplePre("<emstyle=\"color:red\">"); query.setHighlightSimplePost("</em>"); //调用dao执行查询 SearchResultsearchResult=searchDao.search(query); //计算总页数 longrecordCount=searchResult.getRecordCount(); inttotalPage=(int)(recordCount/rows); if(recordCount%rows>0) totalPage++; //添加到返回结果 searchResult.setTotalPages(totalPage); //返回结果 returnsearchResult; }表现层接收结果后,可以获取到商品列表数据信息,将获取到的信息封装到Model对象中,然后保存到Request域中,最后返回到视图。前端search.jsp页面可以从域对象中获取需要的属性值,然后就可以实现查询页面的动态展示了。搜索功能操作,表现层代码如下:@RequestMapping("/search") publicStringsearchItemList(Stringkeyword, @RequestParam(defaultValue="1")Integerpage,Modelmodel)throwsException{ keyword=newString(keyword.getBytes("iso-8859-1"),"utf-8"); //查询商品列表 SearchResultsearchResult=searchService.search(keyword,page,SEARCH_RESULT_ROWS); //把结果传递给页面 model.addAttribute("query",keyword); model.addAttribute("totalPages",searchResult.getTotalPages()); model.addAttribute("page",page); model.addAttribute("recourdCount",searchResult.getRecordCount()); model.addAttribute("itemList",searchResult.getItemList()); //异常测试 //inta=1/0; //返回前端页面 return"search"; }5.3.5订单管理模块设计与实现订单模块涉及到前台用户操作和后台管理员操作两部分。其中前台用户主要拥有生成订单的操作,而后台管理员则拥有对订单进行编辑和删除的操作。生成订单当用户在购物车展示页面点击去结算的时候,首先会进行自动验证,验证用户是否处于登录状态,若没有登录则需用户进行登录,若用户已登录就可以生成订单信息。前台提交表单后,前端控制器获取信息,然后信息传给业务层,业务层将获取的学习进行封装对象最后执行生成订单操作,生成订单后需要将用户的购物车清空,同时需要更新Redis中的数据。生成订单操作表现层代码如下:@RequestMapping(value="/order/create",method=RequestMethod.POST) publicStringcreateOrder(OrderInfoorderInfo,HttpServletRequestrequest){//取用户信息 TbUseruser=(TbUser)request.getAttribute("user");//把用户信息添加到orderInfo中。 orderInfo.setUserId(user.getId()); orderInfo.setBuyerNick(user.getUsername());//调用服务生成订单 MallResultmallResult=orderService.createOrder(orderInfo); //如果订单生成成功,需要删除购物车 if(mallResult.getStatus()==200){//清空购物车 cartService.clearCartItem(user.getId()); } //把订单号传递给页面 request.setAttribute("orderId",mallResult.getData()); request.setAttribute("payment",orderInfo.getPayment()); //返回逻辑视图 return"success"; }修改订单该操作管理员拥有的操作,该操作根据当前选择的订单的id进行操作,前端控制器接收URL中的传递的参数id和tbOrder对象,然后将值传给业务层,业务层根据id查询到订单的信息,然后将新的tbOrder对象的信息更新至数据库表中。修改订单操作,业务逻辑处理代码如下: //更新publicMallResultupdateOrder(TbOrderorder,Stringdesc){ //TODOAuto-generatedmethodstub //1、根据商品id,更新商品表,条件更新TbOrderExampleorderExample=newTbOrderExample();Criteriacriteria=orderExample.createCriteria();criteria.andOrderIdEqualTo(order.getOrderId());orderMapper.updateByExampleSelective(order,orderExample);returnMallResult.ok(); }删除订单删除订单操作是管理员拥有的操作,该操作将选中的订单的id作为参数传递,业务层需要先根据id查询到订单信息,然后进行订单的删除操作。删除订单操作,业务逻辑处理代码如下: publicMallResultdeleteById(List<String>ids){//根据id删除订单信息 //TODOAuto-generatedmethodstub TbOrderExampletbOrderExample=newTbOrderExample(); TbOrderExample.Criteriacriteria=tbOrderExample.createCriteria(); criteria.andOrderIdIn(ids); inti=orderMapper.deleteByExample(tbOrderExample); if(i>0){ returnMallResult.ok(); }else{ returnMallResult.ok("删除失败"); } }5.3.6购物车模块设计与实现购物车模块包含的主要功能有:展示购物车列表、添加商品到购物车、更新购物车商品数量、删除购物车中的商品以及清空购物车等操作。展示购物车列表在Controller层模块中的CartController类中的showCatList()方法中从首先需要判断用户是否登录,若未登录,则从Cookie中获取购物车列表;若登录,则根据用户id再去查询购物车列表。将获取到购物车的详细信息进行封装后,保存到Request域中,最后返回视图。前端cart.jsp页面可以从域中获取所需要的属性值,然后可以实现购物车页面的动态展示了。具体购物车列表如图5.11所示。图5.11显示购物车列表显示购物车列表操作,表现层代码如下:@RequestMapping("/cart/cart") publicStringshowCatList(HttpServletRequestrequest,HttpServletResponseresponse){ //从cookie中取购物车列表 List<TbItem>cartList=getCartListFromCookie(request); //判断用户是否为登录状态 TbUseruser=(TbUser)request.getAttribute("user"); //如果登录 if(user!=null){ //从cookie中取购物车列表 //如果不为空合并购物车。 cartService.mergeCart(user.getId(),cartList); //把cookie中的购物车删除 CookieUtils.deleteCookie(request,response,"cart"); //从服务端取购物车列表 cartList=cartService.getCartList(user.getId()); } //把列表传递给页面 request.setAttribute("cartList",cartList); //返回逻辑视图 return"cart"; }添加商品到购物车本系统中该功能不论用户登录与否都可以进行将商品添加至购物车的操作。添加商品至购物车操作时会首先获取itemId(商品id)和num(商品数量),为了保证在浏览器关闭前,购物车中的商品信息能够持续存在,需要先信息保存至Cookie中。业务层根据获取的itemId查询商品的详细信息,然后返回到Controller层,Controller层将获取到的购物车信息,数据处理后存到Redis中。添加成功后,Redis中的数据如图5.12所示。图5.12添加成功后,Redis中的数据更新购物车商品数量当发起更新购物车商品数量的请求时,前端控制器会从URL中的获取被选中的信息的userId,itemId和num,然后作为参数传给业务层,业务层会根据id查询到购物车信息列表,然后再跟进itemId查询要修改的指定商品信息,然后将新的num(商品数量)更新至数据库表中,同时也需要更新Redis中的信息。购物车商品数量更新操作,业务逻辑处理代码如下: publicMallResultupdateCartNum(longuserId,longitemId,intnum){ //从Redis中取商品信息 Stringjson=jedisClient.hget(Redis_CART_PRE+":"+userId,itemId+""); //更新商品数量 TbItemtbItem=JsonUtils.jsonToPojo(json,TbItem.class); tbItem.setNum(num); //写入Redis jedisClient.hset(Redis_CART_PRE+":"+userId,itemId+"",JsonUtils.objectToJson(tbItem)); returnMallResult.ok(); }删除购物车中的商品删除购物车中的商品操作是将选中购物车中商品的itemId和userId作为参数传递,业务层需要先根据userId查询到购物车列表,然后在根据itemId进行商品的删除操作,同时需要更新Redis中的数据。删除购物车中选中的商品操作,业务逻辑处理代码如下: publicMallResultdeleteCartItem(longuserId,longitemId){ //删除购物车商品 jedisClient.hdel(Redis_CART_PRE+":"+userId,itemId+""); returnMallResult.ok(); }清空购物车清空购物车操作是将userId作为参数传递,业务层需要先根据userId查询到购物车列表,然后直接将整个列表删除,同时需要更新Redis中的数据。清空购物车操作,业务逻辑处理代码如下: publicMallResultclearCartItem(longuserId){ //清空购物车信息 jedisClient.del(Redis_CART_PRE+":"+userId); returnMallResult.ok(); }5.4本章小结本章首先介绍了系统的开发环境,然后分析了系统的工程结构,最后阐述了系统的主要功能模块的设计与实现,包括SSO的单点登录系统的设计和实现,网站内容管理模块的设计和实现,商品管理模块的设计和实现,全文搜索系统的设计与实现,订单管理模块和购物车模块的设计与实现。6系统测试6.1测试目的任何一个系统在开发完成后都不可缺少测试环节。测试的主要目的是检测项目系统中可能会存在的问题,然后对系统进行优化改进,以提高系统的稳定性及可靠性,同时也提高用户的使用体验。测试需要保证完整性和正确性REF_Ref20162\r\h[25],完整全面的测试是整个系统质量的重要保障,因此本次测试将从两个方面进行,分别是系统功能测试和系统性能测试。6.2系统功能测试下面是对系统各模块中的各个功能进行测试的详细分析。用户模块测试。详细结果如表6.1所示。表6.1用户模块系统功能测试表所属功能模块测试功能操作预期结果测试结果用户模块用户注册单点登录输入注册信息输入用户名和密码。输入符合要求的注册信息,则注册成功;否则失败输入正确的用户名和密码,则登录成功;否则失败与预期结果一致与预期结果一致商品模块测试。详细结果如表6.2所示。表6.2商品模块系统功能测试表所属功能模块测试功能操作预期结果测试结果商品模块添加商品信息修改商品信息删除商品信息查看商品信息点击添加点击修改点击删除点击商品详情(前台用户操作)输入符合要求的信息,则添加成功;否则失败输入符合要求的信息,则编辑成功;否则失败弹出删除确认页面,确定则删除;否则不删跳转商品详情页面与预期结果一致与预期结果一致与预期结果一致与预期结果一致订单模块测试。详细结果如表6.3所示。表6.3订单模块系统功能测试表所属功能模块测试功能操作预期结果测试结果订单模块提交订单信息修改订单信息删除订单信息点击提交订单(前台用户操作)点击修改点击删除用户确认信息无误则提交输入符合要求的信息,则编辑成功;否则失败弹出删除确认页面,确定则删除;否则不删与预期结果一致网站内容管理模块测试。详细结果如表6.4所示。表6.4网站内容管理模块系统功能测试表所属功能模块测试功能操作预期结果测试结果网站内容管理模块添加类目信息重命名删除类目信息点击添加点击重命名点击删除输入符合要求的信息,则添加成功;否则失败输入符合要求的信息,则重命名成功;否则失败弹出删除确认页面,确定则删除;否则不删与预期结果一致与预期结果一致与预期结果一致添加内容信息编辑内容信息删除内容信息点击添加点击编辑点击删除输入符合要求的信息,则添加成功;否则失败输入符合要求的信息,则编辑成功;否则失败弹出删除确认页面,确定则删除;否则不删与预期结果一致与预期结果一致与预期结果一致(5)购物车模块测试。详细结果如表6.5所示。表6.5购物车模块系统功能测试表所属功能模块测试功能操作预期结果测试结果购物车模块添加商品至购物车修改商品数量删除选定商品清空购物车点击添加点击编辑点击删除点击清空添加成功修改成功弹出删除确认页面,确定则删除;否则不删弹出清空确认页面,确定则清空;否则不清空与预期结果一致与预期结果一致与预期结果一致与预期结果一致6.3系统性能测试该部分将使用到Apache组织开放源码的压力测试工具ab,这款工具可以很好的用来测试本系统性能。通过命令:ab-c并发数-n请求数请求路径/。来模拟真实环境下的负载压力,完成系统性能的测试。以商城最常被访问的商城首页为例,分别模拟了500并发数500请求数、500并发数1000请求数、500并发数5000请求数三种情况。500并发数500请求数。详细结果如图6.1所示。执行语句:ab-c500
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025海南省安全员-B证(项目经理)考试题库
- 2025年-辽宁省安全员知识题库
- 2025青海省安全员B证考试题库及答案
- 2025年湖北省安全员A证考试题库附答案
- 2025辽宁建筑安全员考试题库及答案
- 建筑用花岗岩开采及建筑用碎石、机制砂加工项目可行性研究报告模板-备案拿地
- 英语英语时态课件
- 一年级语文《-jqx》课件
- 单位管理制度展示汇编【人事管理】
- 单位管理制度展示大全职员管理篇十篇
- 质量手册(依据ISO9001:2023年标准)
- 路灯更换施工方案
- 大力弘扬教育家精神争做新时代大先生PPT以文化人的弘道追求展现了中国特有的教育家精神PPT课件(带内容)
- 生产工艺过程说明书
- 辽宁省营口市鲅鱼圈区2023-2024学年数学四年级第一学期期末复习检测试题含答案
- 中小学铁路安全知识主题教育课件
- RoboCup中型组机器人比赛规则MSLR
- 抗生素使用强度降低PDCA
- 工程施工安全交底
- 优秀教师奖励审批表
- (word完整版)译林版英语八年级下册单词表
评论
0/150
提交评论