微信点餐小程序系统的设计与开发_第1页
微信点餐小程序系统的设计与开发_第2页
微信点餐小程序系统的设计与开发_第3页
微信点餐小程序系统的设计与开发_第4页
微信点餐小程序系统的设计与开发_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

微信点餐小程序系统的设计与开发摘要当今的时代是互联网时代,人们习惯于从互联网上获取信息,对于吃饭的需求,对于无暇下厨或者懒于煮饭的人群来说,外卖一直是第一选择。在互联网时代,传统的电话外卖点餐由于看不到菜单,无法网络支付等等,已经落后于时代。互联网点餐已经是现金第一选择了。微信是在2011年发布的以社交功能为主的手机应用程序。得益于腾讯的优秀运营,现在用户量已经达到了10亿以上。随着软件的发展,微信已经不仅仅是一个社交工具了。得益于其中的公众平台,使用微信,可以解决生活缴费,订购票务,衣食住行等等问题。所以我的毕业设计就是一个微信平台上的外卖点餐程序。本次毕业设计我采用了比较流行的Springboot+MySQL+Redis技术,前后端分离开发,分为用户使用系统和商户系统,其中用户端在微信端,商户系统在浏览器访问。本系统可适用于小城中缺乏网络外卖服务的商户,提高点餐便利性和可靠性。关键词:论坛,Spring,MySQL,RedisAbstractTodayistheepochoftheInternet,wherepeoplegetusedtogettinginformationfromtheInternet.Takeouthasalwaysbeenthefirstchoiceforpeoplewhohavenotimetocookorarelazytocook.IntheInternetera,thetraditionaltelephonetakeoutorderhaslaggedbehindthetimesbecauseitcan'tseethemenu,can'tpayontheInternetandsoon.Internetorderingisalreadythefirstchoiceforcash.WeChatisasocial-basedmobileappreleasedin2011.ThankstoTencent'sexcellentoperations,thequantityofWechatusershasreachedmorethan1billionnow.WiththedevelopmentofWeChat,itismorethanjustasocialapp.Thankstothepublicplatform,WeChatcansolvetheproblemsoflivingpayment,ticketing,food,clothing,housingandsoon.SomygraduationprojectisaWeChatplatformonthetakeoutorderprogram.ThisgraduationprojectIhaveadoptedthemorepopularSpringbootMySQLRedistechnology,front-endseparationdevelopment,dividedintouserusesystemandquotientHouseholdsystem,inwhichtheuserendintheWeChatend,themerchantsysteminthebrowseraccess.Thissystemcanbeappliedtothesmallcityinthelackofnetworktakeoutservice,improveconvenienceandreliabilityoffoodordering.Keywords:Spring,MySQL,Redis目录TOC\o"1-3"\h\u77011绪论 绪论本课题研究的背景和意义自从安卓和苹果等新型触屏智能手机的出现,带动了互联网更告诉地发展,逐渐越来越多人开始追求使用互联网,甚至中老年人也在学习如何使用,互联网不再是只是年轻人的世界。随着计算机科技相关技术的高速发展,“互联网+”思想应运而生。“互联网+”是互联网与实业结合的一种新形式产业,它的核心是互联网,将实业互联网化完成产业升级。概括来讲,“互联网+”就是“互联网+传统行业”的新形态产业。但这并不是把他们做一下加法这么简单,而是凭借互联网平台,结合互联网与传统行业的优点,创造一种新的社会生活形式和发展方向。它象征着一种新的社会形态,充分利用互联网的时效性,便利性,安全性等等优点,将互联网特色与生活便利,娱乐,工业,商业等等领域相互融合,提升全社会的运作效率和生产力,提高人民生活的便利性和幸福感,形成范围更广阔的以互联网为基础设施和实现工具的社会新形态。现在的网约车,网络办理证件,网络购票等等项目都是很典型的“互联网+”的实例。互联网外卖也是其中一个正在处于高速发展进程中的新兴行业。在大屏智能手机还没出现,互联网大多分布在电脑设备人的社会环境下,订外卖的形式一般是电话形式。相对于现在流行的互联网外卖,电话订餐的缺陷也很明显,有以下几点:第一,电话同时只能接一个,对于生意较多的店家,这种下单效率是低到难以接受的;第二,顾客看不到菜单,无法比较直观地去点餐,影响顾客体验;第三,支付只能现金支付,跟不上现在移动支付,无现金社会的潮流;第四,网络能够提供更直观更稳定的订单记录,便于商家统计和提供服务。因此,互联网外卖的流行是互联网发展的必然结果。目前,市面上已经有相当大规模的互联网外卖项目,以美团和饿了么为主导。使用他们的产品商家需要支付一大笔的提成费用,以及在乡镇里,即便大家都在使用手机,使用微信,但是并没有普及的互联网外卖平台,因为收益的原因,大平台并没有选择入驻乡镇。我的毕业设计项目便可以解决这部分需求,为广大的乡镇人民提供一个微信外卖点餐平台,提高生活便利以及效率。国内外研究现状利用互联网平台建立满足人们外卖需求的系统,已经是国内外司空见惯的事情了。国内于2013年开始大力发展相关项目,参与进来的公司很多,主要有美团外卖,饿了么,百度外卖,口碑外卖。在行业前期,大家都采取烧钱补贴的方式来争取用户,经过多年的竞争,现在主要只剩下了美团外卖和饿了么两个公司竞争,其他的不是被并购就是关闭了。目前,我国互联网外卖产业已经过了野蛮扩张期,目前处于稳定发展期。而市场的发展主要受到用户数量的支撑。从2013年开始,外卖软件用户量数量快速膨胀后,增长幅度从2015年开始放缓,到2017年底外卖用户数量达到3.05亿人,2018年达到了3.55亿人。这是个很惊人的数字。经过几年的高速发展,现在互联网外卖已经是很成熟的项目,并都推出了微信可用版本。同样在国外,也有很多类似的app来占领外卖市场。研究方法本课题的研究方法主要是行动研究法。行动研究法特点是不在于研究理论,而是针对实践中的问题和课题的目标,在行动研究中不断地探索、改进改进工作,解决实际问题。在本次研究过程,我首先通过查看网络的实现方案,看看其他开发者是如何实现类似系统的,便于选择适用的技术方案,然后再研读相关的书籍和网络资源,最后通过不断地实践与学习完成了本软件的编写。本课题应解决的主要问题网络支付方案根据微信的规定,私人用户不能开通带微信支付功能的公众号,为了实现支付功能,我只能使用第三方针对个人开发者收款困难开发的收款平台Bufpay。Bufpay收款不需要公司资质,使用无需任何证件,即时到账,个人支付宝和个人微信账户都支持,性能优秀,保证手机不关机的前提下可以做到超稳定不漏单,以一个成熟的经过大家考验的支付平台。对支付接口和通知回调接口的调用是实现成功收款的关键,所以使用时需要严格根据官方文档进行开发,避免不必要的错误。跨域问题跨域,就是浏览器不能执行不是正在访问地址的脚本。跨域是由浏览器的同源策略造成的,是为了安全问题所做的限制。所谓同源是指协议,域名,端口都全部一样。浏览器执行js的时候会检测该脚本属于哪个地址。如果不同源,就不执行。本系统是前后端分离开发,前端项目跟后端接口需要在不同的服务器上也可以正常运行,存在跨域问题。论文结构本论文一共分为七个部分。第一部分主要介绍了本论文研究的背景和意义。第二部分着重介绍本次毕业设计所用到的关键技术。第三部分是对本软件做详细的需求分析。第四部分描述本系统的总体设计方案。第五部分为本软件系统部分功能的详细实现过程。第六部分是描述系统的测试过程和测试结果。第七部分是对本课题从零到一的实现过程的感想与分析。2系统的实现技术2.1SpringFramework

2.1.1Spring容器框架介绍Spring是一个轻量级框架,基于Java开发。它的初衷是为了解决复杂的企业级应用开发,简化开发流程。然而,Spring不仅仅适用于服务端的开发,所有Java应用都可以通过Spring降低开发复杂度。用最能概括Spring的一句话来描述,Spring是一个具有控制反转和面向切面特性的容器框架。下面将介绍其特性。控制反转:一个对象的创建通过框架被动传递进类里,取代Java语言传统的主动new创建的形式,避免了开发中修改功能需要重复性地修改多处代码。面向切面:应用面向切面思想,可以在不修改代码的情况下给代码增加功能。Spring中典型的应用是事务管理和日志系统。AOP的好处是业务代码可以专注于业务相关的开发,而不必理会系统级的功能实现。容器:Spring管理系统对象的生命周期和配置关系,可以看作是一个bean的容器。因为它可以控制你的对象是如何创建(如单例或者多例),还可以管理对象间的关联关系,如一个对象中引用了另一个对象,Spring会帮其注入。框架:Spring可以将简单的组件组成复杂的应用,它提供了xml配置或者注解的形式让开发者接入。Spring也给我们提供了很多实用功能,如事务管理,ORM(如Mybatis,Hibernate)的集成,测试等等,让我们可以专注于业务代码的编写。2.1.2SpringBoot介绍SpringBoot是一个目前流行的属于SpringFramework

的框架,由Pivotal团队推出的。其初衷是简化传统Spring应用的搭建流程和应用配置。该框架使用一种相对较为简便的配置方式,通过这种方式,软件开发者就可以告别编写重复又繁琐的xml文件。SpringBoot的目标是在当下流行的快速应用开发领域成为领跑者。那么概括性地说,Springboot就是为了简化开发过程而生的,其底层工作的还是Spring以及SpringMVC。Springboot是一个快速开发框架,在Spring的基础上进行封装,简化了配置,可实现无xml配置,同时内置应用服务器Tomcat和其他很多基础功能,最终以应用程序执行。2.1.3SpringDataJPA介绍JPA即JavaPersistenceAPI是一个Java持久化规范,用于通过Java对象屏蔽sql语言将数据持久化到数据库中的关系表。而SpringData是Spring家族的一份子,是为了减少持久化代码量而生的。SpringDataJPA则提供了对JPA更上一层的封装,不仅提供了基础的增删改查功能还有优秀的可扩展性。它的出现让开发者不用学习多如繁星的ORM框架。通过SpringDataJPA项目,切换不同的ORM框架并不用修改代码,因为它屏蔽了不同ORM的代码差异,大大提高了开发效率,降低了学习成本。2.2Redis服务器Redis是一个基于C语言开发,开源免费的key-value式存储系统,它的特点是既可以缓存在内存也支持持久化到硬盘里,并编写了多门编程语言支持的API,如Java,C++,Go,Erlang等等。Redis数据库中所有数据都存在内存中。由于内存读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑上,Redis可以一秒内读写超过十万个键值。将数据存在内存中也有问题,比如程序退出后内存中的数据会消失。不过Redis提供了对持久化的支持,即可以将内存中数据异步写入到硬盘中,同时不影响继续提供服务REF_Ref30655\r\h[3]。由于现在互联网对性能的要求甚高,而Redis有很强的性能,可在一定情况下暂时替代数据库的作用,使其成为了目前最受欢迎的存储系统之一。Redis支持五种类型的value值储存,分别是String(字符串)、list(链表)、set(集合)、sortedset以及hash(哈希类型)。这五种数据类型都支持增加/移除、进栈/出栈、取交集并集差集的操作,而且这些操作都是原子性的。在这个基础上,Redis还支持了多种排序功能。Redis支持主从同步,即主服务器从服务器数据同步。大型Web应用单个Redis服务器并不现实,主从同步机制解决了单机的很多弊端。低可用性问题:若因机器故障原因或其他原因导致Redis不可用,系统就崩溃了。主从复制使得一台机器故障还可以有多台机器可供使用,保证了高可用性。容量问题:单台Redis容量存在瓶颈,主从复制机制解决了这个问题,可以对其进行水平扩展性能问题:主服务器进行写操作,从服务器进行读操作。在高并发的情况下,这样的机制令多台服务器同时工作,提高了效率。2.3MySQL数据库介绍数据库是按照数据结构来存储、组织和管理数据的仓库。每个数据库都提供一个或多个接口给使用者,可以进行新建,查询,管理,搜索和复制已存在的数据。普通文件也可以存放数据,关键在于普通文件的结构使得读写速度很慢,所以需要设计优秀的关系型数据库管理系统来对大数据量及逆行储存和管理。把数据存放在表中而不是都放在一个数据仓库,使得操作更灵活提高了存取速度。非关系型数据库即表之间不存在相互关系,数据独立。以下是关系数据库管理系统的特点:数据以表格形式表现。每行为字段名每列为相应字段的具体数据行和列构成一张表多表构成数据库MySQL就是一种关系型数据库管理系统,市面上还有很多其他的实现系统,如Sqlserver,oracle数据库,sqlite等等。以下是MySQL的特点和优势:MySQL数据库是开源免费的,个人可以免费使用MySQL可以处理上千万条数据MySQL使用标准的SQL语言MySQL支持多个操作系统,如linux,macos,windows,并且支持多种编程语言。有经验的开发者可以修改MySQL源码定制自己的MySQL3系统的需求分析3.1可行性分析技术可行性:如今市面上已经有很多成熟的外卖产品软件,同时也有适配微信的版本。从个人开发者角度来说,开发微信程序的难处在于微信官方对个人账户只开放了部分接口,包括微信支付等重要功能并没有开放。本系统采用了Bufpay作为微信官方支付接口的替代品,后端用Java框架构建,前端主要使用了流行的vue.js,搭配Redis做缓存,这套成熟的技术经过市场的验证,依靠其完成本系统的功能是可以实现的。社会可行性:即便市面上饿了么美团已经是做的很好的产品,但是在乡镇里还存在不少的用户需要这样的服务,但是由于经济效益或者人力的原因,它们并没有选择进驻。所以一套简单易用的外卖系统在乡镇上还是有不错的市场需求的。经济可行性:项目所用技术开源,编译器工具皆为免费,完成成本不高。需要花费的地方在上线使用的服务器以及使用Bufpay支付接口的费用,皆在可接受的范围内。3.2信息需求分析商家信息:商家id,用户名,密码商品分类:分类id,分类名称,类目编号,创建时间,修改时间商品信息:id,商品名称,单价,库存,描述,图片,商品状态,类目编号,创建时间,修改时间订单信息:id,买家名字,电话,地址,微信openid,总金额,订单状态,支付状态。创建时间,修改时间订单详情信息:id,订单id,产品id,商品名称,产品单价,产品数量,图片,创建时间,修改时间3.3数据描述1、数据字典(1)wechatsell_sellerinfo表该表为后台管理员的用户表表3.1sellerinfo表字段名数据类型可否为空说明idint否(primary)主键usernamevarchar否用户名passwordvarchar否密码(2)product_category表该表为产品分类表,每个分类有独立的编号表3.2product_category表字段名数据类型可否为空说明category_idint否主键category_namevarchar否分类名称category_typeint否类目编号,唯一create_timetimestamp否创建时间update_timetimestamp否修改时间(3)product_info表该表主要存放单个商品的详细信息数据,其中create_time字段用了MySQL的时间自动更新功能,新增产品会自动填入当前时间,无需程序编写。category_type字段对应分类表中的编号,product_status为商品状态,0为上架状态,1为下架状态。表3.3product_info表字段名数据类型可否为空说明product_idvarchar(32)否商品id,非自增product_namevarchar(64)否商品名称product_priceNumeric(8,2)否商品单价product_stockint(9)否商品库存product_descriptionvarchar(64)否商品描述product_iconvarchar(512)是图片链接product_statusint(9)否产品状态category_typeint(9)否类目编号create_timetimestamp否创建时间update_timetimestamp否修改时间order_master表该表存放了订单的数据,该订单不包括详商品的存储,详细商品存储在另一个表。该表存了买家的微信id,在本系统中,买家的标识就是唯一的微信id,并没设置独立的表来存储买家,因为系统中买家用户无需注册,只需要微信授权就可以使用。表3.4order_master表字段名数据类型可否为空说明order_idvarchar(32)否订单id,非自增buyer_namevarchar(64)否买家名称buyer_phonevarchar(32)否买家的联系电话buyer_addressvarchar(32)否买家地址buyer_openidvarchar(64)否买家的微信idorder_amountnumeric(8,2)否订单总金额order_statusint(9)否订单的状态pay_statusint(9)否支付状态create_timetimestamp否创建时间update_timetimestamp否修改时间order_detail表该表存放了订单中每一个商品的购买信息。包括数量,关联的订单,相对应的商品。描述了订单具体某一项的资料。表3.5order_detail表字段名数据类型可否为空说明detail_idvarchar(32)否Detailidorder_idvarchar(32)否订单idproduct_idvarchar(32)否产品idproduct_namevarchar(64)否产品名称product_pricenumeric(8,2)否产品单价product_quantityint否产品数量product_iconvarchar(512)是产品图片create_timetimestamp否创建时间update_timetimestamp否修改时间3.4功能需求分析本系统分为买家系统和商家系统。不同系统具有不同的权限与功能。图3.1点餐系统模块图用户管理:商户系统为商户提供了用户注册登录登出功能,名称不能重复,不允许特殊字符,只能是数字英文八位数以上十位数一下的组合,密码不能过于简单,至少达到六位字符。用户名密码匹配则允许登入,并保持三天登陆状态。商品管理:商户可以新增商品,修改商品的属性,对商品进行上下架,分页查询所有商品。买家对商品的权限只有查询。分类管理:商户可以新增分类,修改分类名称,但是编号不能修改。新增的分类将出现在买家的点餐页面。订单管理:买家可以新增订单,取消单个订单,查询具体订单按时间排序。商户可以分页查询订单(新增的在最前面),完结订单,和取消订单,对订单操作需要发给相应买家微信推送通知。订单模块为本系统的最复杂的模块,开发过程应尽量考虑可能出现bug的情景,尽量在开发阶段避免出错。微信相关模块:微信方面需要实现买家微信授权登录,微信订单消息的推送以及微信支付。买家的客户端需要做约束只能在微信端使用,在浏览器端使用会报错,提醒在微信客户端中打开。需要严格按照微信公众平台开发文档开发,避免错误。3.5性能需求分析1、数据精确度与金额有关的数据精确到小数点后两位,因为与支付相关,不允许出错,需要100%正确率。2、时间性能从请求发出到收到响应,时间一共不允许超过5秒。3、易用性操作简单方便,软件流程设置合理简洁,会使用手机的用户都能快速熟悉并使用该系统进行下单支付等操作。运行环境上:用户端只能微信端(适配ios和安卓,windows),商户端应适应常见浏览器如Chrome,edge,360极速浏览器等等。3.6运行需求分析1、用户界面用户界面为市面上常见的外卖点餐界面,类似饿了么APP的页面设计。顶部显示商家信息,左部有分类导航栏,右边是具体商品,底部是购物车,总价等信息。2、硬件需求服务器端使用linux虚拟机,一部能安装浏览器和微信的机器即可完美使用该系统3、软件需求支持安卓,ios微信客户端,经测试,商户系统支持360极速浏览器,chrome浏览器,edge浏览器。4、故障处理在服务器可能出现过载或者其他会损坏数据的问题,要保证有正确修复的手段,不能丢失数据,应做好备份。3.7技术需求分析可维护性:为了开发的便利,前后端分开开发,通过RestAPI通信,解耦。系统应容易扩展,便于增加功能。可移植性:采用B/S的编程模式,使得系统可移植性增强3.8概念结构分析3.8.1E-R图实体分析(1)管理员实体图图3.2管理员实体图根据上图,系统管理员有系统管理员id,用户名,密码,注册时间四个属性(2)商品分类实体图图3.3商品分类实体图根据上图,分类实体有属性id,名称,编号,创建时间。订单实体图图3.4订单实体图根据上图,订单实体属性较多,有买家电话,订单id,买家地址,买家姓名,买家微信id,总金额,订单状态,支付状态,创建时间以及修改时间。(4)订单详情实体图图3.5订单详情实体图根据上图,订单详情实体有属性订单细节id,所属订单id,商品id,商品单价,购买数量,图片链接,修改时间,创建时间。(5)商品实体图图3.6商品实体图根据上图,商品实体有属性商品id,名称,单价,库存,商品描述,图片链接,商品状态,所属类目编号,创建时间以及修改时间。3.8.2系统总体E-R图图3.7系统整体实体图根据上图分析,可以得出结果:多对多关系:管理员与商品、分类、订单一对一关系:无一对多关系:订单与订单详情,商品与订单详情,分类与商品4总体设计方案4.1登陆注册模块4.1.1商户端注册功能,首先需要用变量接收卖家输入的用慕名密码。注册的逻辑是检测用户名是否已存在,如果存在则报错,返回注册失败页面,然后重定向到注册页面,让用户重新注册;如果不存在则返回注册成功页面,然后重定向到登录页面。登录模块,对后台管理系统每一个页面做登陆验证,没有状态保持的跳转到登录页面。正常登录先检查用户名是否正确,然后再校对密码,正确就成功登录,错误则返回用户名或密码错误页面。登录功能的流程图如图4.1所示图4.1登录模块流程图4.1.2买家用户端买家端不设具体的登陆注册模块,以微信授权登录取代之。微信官方规定,用户同意登录可以获取到用户的基本资料(微信名称,性别,所在地等等),每个用户对每个微信公众账号有唯一的openid,可以用作用户标识。买家端系统每个页面都要做检测是否已经微信授权登录,如果没有则提醒在微信中打开。流程图如图4.2所示图4.2微信登录模块流程图4.2订单管理模块订单模块有取消订单,创建订单,完成订单,查看订单以及详情的功能。其中下订单和取消订单是买家的权限,管理员则拥有除增加订单外的所有功能。由于数据的敏感性不提供删除订单功能。订单模块功能设计如图4.3所示图4.3订单模块功能设计图4.3商品管理模块商品模块主要有新增商品,编辑商品,商品上下架,查看商品列表功能。对商品的修改操作只允许后台管理员操作,不可能让买家用户有操作商品的权限,买家端只能查看商品,选择感兴趣的购买。不提供删除功能。商品管理模块功能设计如图4.4所示图4.4商品模块功能设计图4.4商品分类模块商品分类模块有增加分类,编辑分类,查询所有分类的功能。系统管理员拥有所有权限,买家用户只能查询。分类模块功能设计如图4.5所示图4.5商品模块功能设计图4.5程序界面设计买家端界面采用简洁易用的外观设计,卖家端界面采用Bootstrap模板构造,比较朴素实用。图4.6买家端首页界面图4.7卖家端首页界面5系统的详细实现5.1登陆注册模块部分实现5.1.1卖家登录功能登录模块要写正确还是比较复杂的。用参数去接收用户提交的用户名和密码,首先查询用户名是否存在,若果不存在,报具体错误,返回错误页面;存在则继续做密码校验。密码检测也是同样的逻辑,错误返回错误页面,正确则登陆成功了。为了保持登录状态,还需要进行一系列操作。首先要把sellerinfo即管理员信息类存到session中。session是为了解决在http协议无状态下状态的保持而产生的,可以配合cookie使用。session存储于服务器,而cookie存放在客户端浏览器中。session存到用户信息后,为了登陆后再次访问系统时可以取到原来的session信息,还需要把session的id信息和sellerinfo存到Redis,以及返回一个带JSESSIONID的cookie给客户端储存。JSESSIONID是session的唯一标识,存到cookie中后,用户客户端发起下次请求会带着一个“JSESSIONID=???”的cookie,服务端就可以根据这个参数去找到之前存进去的session,完成用户登陆状态的保持。JSESSIONID存到Redis中是为了防止以后做服务器集群,因为一台服务器无法访问到另一台服务器的session,出现找不到session的问题,这样使得系统有一定的可扩展性。实现代码以及注释如下图所示图5.1卖家登录功能代码登录功能效果图如下图所示图5.2卖家端登录界面5.1.2微信授权登录该功能流程可以简括为三个步骤:1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权的access_token3、通过网页授权access_token和openid获取用户基本信息以上步骤为看了微信开发者文档而总结出来的步骤,我用了第三方开发者封装好的微信开发工具类,使开发更简便。实现代码以及有关注释如下图所示图5.3微信授权登录实现代码微信登陆界面效果如下图所示图5.4买家端登录界面5.2订单模块部分实现5.2.1创建订单功能创建订单功能较为复杂,创建订单过程需要支持原子性和一致性保证数据不会出错,所以用了Springboot原生支持的@Transactional的注解来支持事务的特性。首先需要查询出所有的orderdetail以计算出该订单的总金额,同时应该将订单细节都持久化到数据库中。然后补全订单所需要的数据,如订单状态,支付状态,金额,id等等,再把订单保存到数据中。还有个关键的操作是批量缩减库存。该操作同样也需要事务支持。缩减库存的逻辑很简单,将数据库查询到的产品库存减去该次下单的数量,结果小于0报错,所有数据返回下单前的状态。大于0则正常减库存。最后用websocket给卖家客户端发有新订单的通知,卖家端网页会有铃声提醒和弹窗通知。相关代码如下图5.5所示图5.5创建订单功能代码新订单通知效果如图5.6所示图5.6新订单通知效果图5.2.1取消订单功能取消订单逻辑相对比较简单,需要支持事务。首先对订单状态做判断,是否为新订单,否报错,是则修改订单状态为取消并持久化到数据库,取消了订单自然要返还商品库存,增加库存逻辑与缩减库存类似,再次不再做详细描述。最后给用户发一个微信通知订单已取消,确保用户尽快得知订单的最新状态。实现代码以及注释如下图图5.7取消订单功能代码5.3商品模块部分功能实现5.3.1新增/修改商品功能@CacheEvict注解是关于Redis的注解,意思是清除Redis中cacheNames="product",key="123"的数据项,这个数据是查询商品时所作的缓存处理,后续再做讲解。用一个ProductForm类来接收用户提交的数据,并作不能为空约束。首先查询接收到的数据中productid是否为空,为空说明是新增,否则是修改商品资料。由于新增与修改保存的逻辑类似,所以他们的区别在于新增操作设置了一个新的productid,新建了一个对象来保存商品信息;而修改商品则是查询已存在的商品,对其中属性进行修改。具体实现如下图所示图5.8新增/修改商品功能代码实现效果如下图所示图5.9新增/修改商品效果图5.3.2查询商品功能@Cacheable注解也是Redis相关的注解,该注解表示将方法返回的值存到Redis中cacheNames="product",key="123"的项中。因为商品查询一定是用户最多使用的接口,用户一般都是在频繁的查看商品,所以把商品查询的数据放置于Redis中,因为Redis是可以基于内存呢存取的,比数据库存取IO要快非常多。相关代码如下图所示图5.10买家查询商品功能代码5.4微信相关模块部分功能实现5.4.1订单支付实现由于微信官方限制,微信支付功能采用的是Bufpay第三方收款接口,Bufpay支付时序图如图5.11所示图5.11Bufpay支付时序图根据图5.5,开发者所需要做的工作是构造支付参数去调用Bufpay支付接口,以及接收Bufpay发来的支付回调通知。根据开发文档,构造支付参数的代码如下,其中pay_type参数用于确定本次使用的是微信支付还是支付宝,notify_url是用来接收Bufpay通知回调的url,return_url是支付成功后重定向的地址,sign是签名,参数拼接然后经过MD5加密得到。publicPayVOcreate(OrderDtoorderDTO){

PayVOpayVO=newPayVO();

Stringname=ORDER_NAME;

Stringpay_type="wechat";

Stringprice=orderDTO.getOrderAmount().toString();

Stringorder_id=orderDTO.getOrderId();

Stringorder_uid=orderDTO.getBuyerOpenid();

Stringnotify_url=NOTIFY_URL;

Stringreturn_url=RETURN_URL;

Stringsign=name+pay_type+price+order_id+order_uid+notify_url+return_url+app_secret;

payVO.setName(name);

payVO.setType("wechat");

payVO.setPrice(price);

payVO.setOrderId(order_id);

payVO.setOrderUid(order_uid);

payVO.setNotifyUrl(notify_url);

payVO.setReturnUrl(return_url);

payVO.setApiUrl(API_URL);

payVO.setSign(MD5Util.getMD5String(sign));

returnpayVO;

}得到参数后,通过controller把参数传到页面上,页面再接收参数并发post请求到Bufpay支付接口,注意变量名要与开发文档要求完全一致,HTML相关代码如下

<body>

<formid="post_data"action="${payResponse.apiUrl}"method="post">

<inputtype="hidden"name="name"value="${payR}"/>

<inputtype="hidden"name="pay_type"value="${payResponse.type}"/>

<inputtype="hidden"name="price"value="${payResponse.price}"/>

<inputtype="hidden"name="order_id"value="${payResponse.orderId}"/>

<inputtype="hidden"name="order_uid"value="${payResponse.orderUid}"/>

<inputtype="hidden"name="notify_url"value="${payResponse.notifyUrl}"/>

<inputtype="hidden"name="return_url"value="${payResponse.returnUrl}"/>

<inputtype="hidden"name="sign"value="${payResponse.sign}"/>

</form>

<script>document.getElementById("post_data").submit();</script>

当订单支付成功后BufPay会立即向你的服务器发起回调通知,服务器通过通知确认订单是否已经成功支付。接收到参数,再与数据库中比对,正确则修改订单为支付成功,否则报错。最后需要给BufPay服务器响应HTTPCODE200。代码如下所示@PostMapping("/notify")

publicvoidnotify(Stringaoid,

Stringorder_id,

Stringorder_uid,

Stringprice,

Stringpay_price,

Stringsign,

HttpServletResponseresponse){

PayNotifyVOpayNotifyVO=newPayNotifyVO(aoid,order_id,order_uid,price,pay_price,sign);

payService.notify(payNotifyVO);

response.setStatus(200);

try{

response.getWriter().write("");

}catch(IOExceptione){

e.printStackTrace();

}

}实现效果如下图所示图5.12微信支付效果图5.4.2微信推送实现微信官方提供了一个微信模板消息推送接口,你可以自定义模板或者使用官方制定的模板,根据文档需要参数是模板id,openid以及APPID(即微信程序的唯一id),本次系统实现使用开源的微信工具包。把模板id和目标用户的openid以及模板里需要的数据填充到WxMpTemplateMessage中,然后进行发送,实现代码如下所示publicvoidorderStatus(OrderDtoorderDTO){

WxMpTemplateMessagetemplateMessage=newWxMpTemplateMessage();

//set模板id和openid

templateMessage.setTemplateId(accountConfig.getTemplateId().get("orderStatus"));

templateMessage.setToUser(orderDTO.getBuyerOpenid());

//填充模板数据

List<WxMpTemplateData>data=Arrays.asList(

newWxMpTemplateData("keyword1","微信点餐"),

newWxMpTemplateData("keyword2",),

newWxMpTemplateData("keyword3",orderDTO.getOrderId()),

newWxMpTemplateData("keyword4",orderDTO.getOrderStatusEnum().getMessage()),

newWxMpTemplateData("keyword5","¥"+orderDTO.getOrderAmount())

);

templateMessage.setData(data);

try{

//发送推送

wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);

}catch(WxErrorExceptione){

log.error("【微信模版消息】发送失败,{}",e);

}

}实现效果如下图所示图5.13微信推送功能效果图6系统测试6.1测试目的软件测试,就是对软件功能,性能,安全等进行全面的测试,确保系统的质量达到要求。系统测试是开发完成后必不可少的一环,是系统质量保证的关键。系统测试用例编写要追求用适量的用例覆盖尽可能多的情况,是追求效率和质量平衡的一门科学。统计表明,开发较大规模的软件,有40%以上的精力是耗费在测试上的,即使富有经验的程序员,也难免在编码中发生错误,何况,有写错误在设计甚至分析阶段早已埋下祸根,无论是早期潜伏下来的错误或编码中新引入的错误,若不及时排除,轻者降低软件的可靠性,重者导致整个系统的失败。,若不及时排除,轻者降低软件的可靠性,重者导致整个系统的失败REF_Ref20953\r[5]。6.2测试范围本次测试有功能测试,界面测试,兼容性测试等方向。主要测试功能包括但不限于:登陆注册登出,下单,支付,取消订单,完成订单,修改商品,新增分类,微信推送,商家新订单通知。6.3测试结果表6.1测试执行结果表测试标识符测试功能名称状态测试结果备注功能测试Test01登录已测试测试通过管理员系统Test02注

温馨提示

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

评论

0/150

提交评论