后台常见功能模块
商品管理:包括后台商品库存管理、上货、出货、编辑管理和商品分类管理、商品品牌管理等。订单管理:在线订单程序,使消费者能够顺利的通过WEB在线的方式,直接生成购买订单。商品促销:一般的购物系统多有商品促销功能,通过商品促销功能,能够迅速的促逬商城的消费积极性。支付方式:即通过网上钱包、电子支付卡。进行网上资金流转换的业务流程;国内主流支付方式包括:支付宝、财富通、网银在线等。还有部分网上商城支持货到付款,如京东商城、第九大道、鹏程万里贸易商城。配送方式:购物系统集成的物流配送方式,从而方便消费者对物流方式进行在线选择。如:EMS、顺丰等等。会员模块:在购物系统中,集成会员注册是吸引会员进行二次购买和提升转换率的方式。前端界面功能模块
模板风格自定义:即通过系统内置的模板引擎,可以方便的通过后台可视化编辑,设计出符合自身需求的风格界面。商品多图展示:随着电子商务的发展商品图片成为吸引消费者的第一要素,多图展示即提供前台多张图片的展示,从而提升 消费者的购物欲望。自定义广告模块:内置在系统中的广告模块,网站管理员能够顺利的通过操作就可以在前端界面中添加各种广告图片。商品展示:通过前端界面,以标准的或者其他个性化的方式向用户展示商品各类信息,完成购物系统内信息流的传递。购物车:用户可对想要购买的商品进行网上订购,在购物过程中,随时增删商品。产品经理向客户初步了解需求,然后用相关的工具软件列出要幵发的系统的大功能模块,每个大功能模块有哪些小功能模块,对 于有些需求比较明确相关的界面时,在这一步里面可以初步定义好少量的界面。
产品经理深入了解和分析需求,根据自己的经验和需求用WORD或相关的工具再做出一份文档系统的功能需求文档。这次的文档 会清楚列出系统大致的大功能模块,大功能模块有哪些小功能模块,并且还列出相关的界面和界面功能。
产品经理向客户最终确认需求。
本系统的主要功能如下:
序号模块名称主要功能1商品显示模坱分页显示所有商品查看单个商品详细信息搜索商品2用户模块新用户注册用户登录用户退出3购物车模块加入商品到购物车修改所购商品数量4订单模块提交订单并显示订单信息用户确认后生成正式订单用户查看历史订单5支付模坱完成在线支付功能6收货地址管理收货地址7后台模块主要实现商品的增删改查物理数据模型是在概念数据模型的基础上针对目标数据库管理系统的具体化。
PDM的对象:表(Table)、表中的列(Table column)、主外键(Primary、Foreign key)、参照(Reference)、索引(Index)、视图 (View)等。
在PDM中用来表示实体属性的是列(Column)。
CDM概念数据模型:描述要存储的实体、属性、实体关系!
PDM物理数据模型:对概念数据库模型进行升级,将实体转化成具有数据库特性的模型!
实体–》表,属性-列!更进一步的完成数据设计!
总结:类似抽象类和实现的关系!
用户模块主要设计到用户登录和注册功能以及地址选择功能!
所以!用户模块设计两张表用户表和地址表!
用户表
存储用户信息包含会员和管理员 字段类型主键约束备注idint是自增序号usernameVarchar(20)Not null用户昵称passwordVarchar(64)Not null密码,使用md5emailVarchar(50)Not null邮箱,不可重复genderVarchar(2)性别flagint状态标记:0未激活1激活2无效roleint角色:0管理员1会员codeVarchar(lOO)激活码 收货地址表 存储用户的收货地址 字段类型主键约束备注idint是自增序号detailvarchar(200)Not null详细地址nameVarchar(20)Not null收件人姓名phoneVarchar(ll)Not null手机号uidint外键用户idlevelint地址的顺序1最高
现在我们只要实现一个功能,我们就需要创建一个servlet!
例如:用户模坱(登录,注册,退出登录,激活,发送邮件等等功能)
也就是说,我们必须要创建一些系列的Servlet:UserLoginServlet->登录功能!UserRegisterServlet->注册功能!总之,只要你实现一个功能,你就得创建一个servlet!
这种情况会有两个弊端!
创建大量的servlet! servlet实例一>web容器(tomcat)管理!有大量的servlet实例必然会占有更大的运行内存!会间接的拖慢web容器的速度!servlet他的service(doget/dopost)方法是一个多线程方法!也就说理论上说! servlet:可以并发的处理请求!一个servlet能力 很强但是只对应一个功能!你不觉得浪费么?BaseServlet我们想解决的问题就是!简化和优化Servlet的创建和数量!
为什么一个servlet只对应一个功能!
一个servlet被访问以后,只会有一个方法被调用,通常我们习惯一个方法中写一个套业务逻辑!一个servlet对应一个方法对应一个业务功能!分析Baseservlet实现的思路
让一个servlet对应多个方法就好了!每个方法都实现一个业务逻辑!具体的实现思路 步骡1:在一个servlet声明多个处理业务逻辑方法!步骡2:在每次访问servlet的时候在路径上添加一个标识!标识用于判断要访问具体业务逻辑方法!步骤3:当每次请求到doget/dopost/service方法的时候,判断参数的标识,调用对应的业务逻辑方法即可!实现基本的BaseServlet
优化方法调用
利用标识符的字符串和方法名相同!
我们可以利用反射的技术!调用对应的执行方法!
避免了大量的判断!
当有新的方法出现的时候!也不需要额外的添加判断方法!
service(){
1.获取标识符
2.根据标识符调用对应的逻辑方法
利用反射技术!
}
优化多Servlet实现
实现思路:
我们创建一个BaseServlet类,让他去继承HttpServletIBaseServlet中写service方法!
在service写 1.获取标识 2.反射调用业务逻辑 (把公共代码提取出来)
每个模块对应的Controller只需要继承BaseServlet即可!
HttpServlet —> BaseServlet —> 模块的Controller
优化返回值问题
每个方法都要进行响应!
响应的方式固定:转发 重定向 返回字符串 返回字节流
如果在每个方法写转发和重定向和返回字符串的语法比较繁琐!
我们可以统一在BaseServlet进行处理!
操作:
步骤1:将方法的返回值改成字符串即可!
步骤2:根据约定的内容,添加特殊的标识!(之后通过String截取来获取是转发还重定向还是其他)
例如:转发“forward:路径”
步骤3: BaseServlet集中处理
执行方法!获取返回值!进行非空判断!
截取标识!进行转发重定向或者写回字符串处理!
好处:简化方法的响应的操作!
注意:没有管返回字节文件!
返回字节文件!我们只需要将方法的返回值改成void! 只需要使用response对象自己手动操作即可!
处理标识符异常情况
package com.wlw.controller; import com.wlw.utils.Constants; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; /** * BaseServlet用于集中处理方法的调用! * 以及返回值处理! * 以及默认页 对应方法! */ public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获取请求参数(标识符) String methodStr = req.getParameter(Constants.TAG); //2.如果method没有获取到值!我们就跳转到首页!(标识符异常处理) if (methodStr == null && methodStr.equals("")) { methodStr = Constants.INDEX; } //3.反射调用对应的业务逻辑方法 Class clazz = this.getClass(); try { Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class); Object result = method.invoke(this,req,resp); //4.集中处理返回值响应 if (result != null) { //转发 重定向 返回字符 String str = (String) result; if (str.startsWith(Constants.FORWARD)) { //转发 String path = str.substring(str.indexOf(Constants.FLAG) + 1); req.getRequestDispatcher(path).forward(req,resp); }else if (str.startsWith(Constants.REDIRECT)){ //重定向 String path = str.substring(str.indexOf(Constants.FLAG) + 1); resp.sendRedirect(path); }else{ resp.getWriter().println(str); } } } catch (Exception e) { e.printStackTrace(); //controller 和 service dao 有异常都会到此处! req.getSession().setAttribute("msg", "程序异常!请稍后再试!"); resp.sendRedirect("/message.jsp"); } } /** * 当method标识符‘没有值’ 我们默认赋 index 访问每个controller的index方法! * 我们将方法提取到baseservlet中即可! * 默认处理:跳转到程序的首页! * @param req * @param resp * @return * @throws IOException * @throws ServletException */ public String index(HttpServletRequest req,HttpServletResponse resp) throws IOException, ServletException { return Constants.FORWARD+"/index.jsp"; } }[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cnwaqbEc-1599113291705)(E:\BaiduNetdiskDownload\0000-java复习\笔记\截图\135会员注册.jpg)]
首页按类别展示!或者搜索展示商品!注意需要添加分页功能!
插入虚拟商品数据:
INSERT INTO TYPE (t_id,t_name,t_info) VALUES(1, '手机' ,'小米手机,为发烧而生!'); , (2,'配件', '小米手机专用配件,爱护你的手机!' ); INSERT INTO product (t_id, p_name,p_time,p_image,p_price,p_state,p_info) VALUES(1,"红米4","1990-01-01","image/iebiao.hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻"); ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(1,"红米4","1990-01-01","image/liebiao_hongmin4.jpg" , 1999, 4,"红米4手机,主打性价比1吸引年轻") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机") ,(2,"红米4手机壳","1990-01-01","image/peijian2.jpg" ,20, 5,"红米4手机壳,用心保护你的手机"); 需求编号Shopping_001功能名称分页显示所有商品功能描述1.首页类别显示2.类别商品分页显示3.商品详情显示备注本截图中序号和商品名称未显示完整
6.6后台管理
后台使用bootstrap框架完成整体搭建完整的项目,查看:https://gitee.com/wlw330/my-shop.git