MMall项目完整分析总结

article/2025/10/31 5:09:45

Linux服务器

线上环境:

  1.jdk    2.vsftpd   3.nginx

  4.mysql       5.tomcat

  6.git   7.maven    8.Redis

项目采用Tomcat集群方式:

在此架构图中,nginx使用的是轮询的负载均衡策略。session不交给tomcat自己管理,已经交由左侧的redis分布式集群来管理。

服务器的文件独立存放于文件服务器上。用户在请求的时候会经过nginx的分配访问到各个Tomcat服务器上。


 

项目的模块划分目录:

  1.用户管理模块    2.分类管理模块    3.商品模块

  4.购物车模块       5.收货地址模块    6.支付模块    7.订单模块


 

项目各模块详细解析

-----------------1.用户管理模块-----------------

  功能模块:

    登录        login(String username, String password);

    用户名/邮箱验证    checkValid(String str,String type);

    注册        register(User user);

    忘记密码      forgetResetPassword(String username,String passwordNew,String forgetToken); 

    提交问题答案    checkAnswer(String username,String question,String answer);

    重置密码      resetPassword(String passwordOld,String passwordNew,User user);

    获取用户信息(无密码) getInformation(Integer userId);

    更新用户信息    updateInformation(User user);

    退出登录      logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)

  技术学习:

    横向越权、纵向越权安全漏洞

    MD5明文加密及增加salt值

    Guava缓存的使用

    高复用服务响应对象的设计思想及抽象封装

    Mybatis-plugin

    Session的使用

   用户模块注意:      

      1.在密码存入数据库前使用MD5进行编码,取出时再使用MD5解码(普通MD5加密形式网上已有解码方式,为提高安全性,需另外在md5上添加逻辑)      2.注册用户时需要在数据库中查询是否有相同的用户名和邮箱(可单独写一个方法查询用户名与邮件是否已存在)      3.忘记修改密码时当验证问题正确时会附带有一个记号返回。(记号用于传递给修改密码的时候,可以提高用户的安全性,防止他人传值修改密码。当修改密码的时候会验证记号是否在存在与有效期内,若是存在且在有效期内方可修改)      4.客户修改信息时,在将User传回数据库修改时username是不可修改的。且email在修改时需要验证新的email是否已存在。如果存在相同email的话,不能是我们当前的这个用户的      5.在登录后台页面时需验证是否为管理员

-----------------2.分类管理模块-----------------

  功能模块:

    获取节点      getChildrenParallelCategory(Integer categoryId);

    增加节点      addCategory(String categoryName, Integer parentId);

    修改节点      updateCategoryName(Integer categoryId,String categoryName);

    获取分类ID     getChildrenParallelCategory(Integer categoryId);

    递归子节点ID    selectCategoryAndChildrenById(Integer categoryId);

  技术学习:

    如何设计及封装无限层级的树状数据结构

    递归算法的设计思想

    如何处理复杂对象排重

    重写hashcode和equal的注意事项

   产品模块注意:

      1.在上传文件时需验证是否为管理员,在上传文件的大小上限制最大为4m      2.上传文件流程为,先将文件保存到tomcat服务器上的update文件夹中,随后连接FTP服务器,配置好上传FTP工具类后将tomcat服务器上存放的文件通过工具类转移到FTP服务器指定文件夹下,然后删除掉tomcat服务器中的原先文件。      3.富文本上传与SpringMVC上传最明显的区别在于返回值上,其次富文本上传成功后在返回时需设置响应头response.addHeader("Access-Control-Allow-Headers","X-File-Name");

 

-----------------3.商品模块-----------------------

  功能模块:

    前台

      商品搜索    searchProduct(String productName,Integer productId,int pageNum,int pageSize);   

      商品列表    list(String keyword,Integer categoryId,int pageNum,int pageSize,String orderBy)

      商品详情    getProductDetail(Integer productId);

    后台

         商品列表    getList(HttpServletRequest httpServletRequest, int pageNum,int pageSize)

      商品搜索    productSearch(String productName,Integer productId,int pageNum,int pageSize);

      图片上传    upload(HttpServletRequest httpServletRequest,MultipartFile file,HttpServletRequest request)

      富文本图片上传 richtextImgUpload(HttpServletRequest httpServletRequest, MultipartFile file, HttpServletRequest request, HttpServletResponse response)

      商品详情    getDetail(HttpServletRequest httpServletRequest, Integer productId)

      商品上下架   setSaleStatus(HttpServletRequest httpServletRequest, Integer productId, Integer status)

      增加商品    productSave(HttpServletRequest httpServletRequest, Product product)

  技术学习:

    FTP服务的对接

    SpringMVC文件上传

    流读取Properties配置文件

    抽象POJO、BO、VO对象之间的转换关系及解决思路

    joda-time快速入门

    静态块

    Mybatis-PageHelper高效准确地分页及动态排序

    Mybatis对List遍历的实现方法

    Mybatis对where语句动态拼装的几个版本演变

   产品模块注意:

      1.在上传文件时需验证是否为管理员,在上传文件的大小上限制最大为4m      2.上传文件流程为,先将文件保存到tomcat服务器上的update文件夹中,随后连接FTP服务器,配置好上传FTP工具类后将tomcat服务器上存放的文件通过工具类转移到FTP服务器指定文件夹下,然后删除掉tomcat服务器中的原先文件。      3.富文本上传与SpringMVC上传最明显的区别在于返回值上,其次富文本上传成功后在返回时需设置响应头response.addHeader("Access-Control-Allow-Headers","X-File-Name");

-----------------4.购物车模块--------------------

  功能模块:

      加入商品      add(HttpServletRequest httpServletRequest, Integer count, Integer productId)

      更新商品数     update(HttpServletRequest httpServletRequest, Integer count, Integer productId)

      查询商品数     getCartProductCount(HttpServletRequest httpServletRequest)

      移除商品      deleteProduct(HttpServletRequest httpServletRequest,String productIds)

      单选/取消       select(HttpServletRequest httpServletRequest,Integer productId),unSelect(HttpServletRequest httpServletRequest,Integer productId)

      全选/取消       selectAll(HttpServletRequest httpServletRequest),unSelectAll(HttpServletRequest httpServletRequest)

      购物车列表       list(HttpServletRequest httpServletRequest, Integer count, Integer productId)

  技术学习:

       购物车模块的设计思想

      如何封装一个高复用购物车核心方法

      Bigdecimal解决浮点型商业运算中丢失精度的问题

   购物车模块注意:

      1.在购物车内产品数量修改时验证是否超过数据库中产品库存,若超出则改为产品库存最大量(如修改为200台手机,此时发现数据库只有100台,则将购物车中购买数改为100)      2.在购物车开发时肯定会接触到价格数字上的运算,这时候若是用普通的数据类型进行运算则容易产生丢失精度。此时可以用到java中的BigDecimal类进行运算,该类中的字符串构造方法可保证运算时精度的准确度。      3.在购物车的价格数字上的运算上偶尔会有除不尽的情况,此时应该尽可能保持精度然后选择保留几位小数且四舍五入

-----------------5.收货地址模块-----------------

  功能模块:

      添加地址    add(Shipping shipping)

      删除地址    del(HttpServletRequest httpServletRequest, Integer shippingId)

      修改地址    update(HttpServletRequest httpServletRequest, Shipping shipping)

      地址列表分页  select(HttpServletRequest httpServletRequest, @RequestParam(value = "pageNum",defaultValue = "1") int pageNum,@RequestParam(value = "pageSize",defaultValue = "10") int pageSize)

      地址详情    select(HttpServletRequest httpServletRequest, Integer shippingId)

  技术学习:

         SpringMVC数据绑定中对象绑定

      mybatis自动生成主键、配置和使用

      如何避免横向越权漏洞的巩固

   地址模块注意:

      1.避免横向越权(用户登录后,在接口处传递shippingID时使用他人的shippingid)(在sql语句上处理shipping时加上userId判断即可)

-----------------6.支付模块-----------------------

  功能模块:

      支付宝对接    pay(HttpServletRequest httpServletRequest, Long orderNo, HttpServletRequest request)

      支付回调     alipayCallback(HttpServletRequest request)

      查询支付状态     queryOrderPayStatus(HttpServletRequest httpServletRequest, Long orderNo)

  技术学习:

       支付宝调试技巧

      熟悉支付宝对接核心文档,调通支付宝支付功能官方Demo

      解析支付宝SDK对接源码

      RSA1和RSA2验证签名及加解密

      避免支付宝重复通知和数据校验

      生成二维码,并持久化到图片服务器

   支付模块注意:

      1.在订单的回调时会访问地址,由于我们的外网穿透使用的是免费的所以域名不稳定,每次都需要重新配置,可购买域名以及稳定的通道进行绑定。      2.在支付宝的回调验签时,会判断是否为支付宝发出的签并且还要避免重复的通知      3.支付宝的回调验签默认为utf-8编码,若想指定编码则需在构造ClientBuilder类时指定好编码

-----------------7.订单模块-----------------------

  功能模块:

      前台

        创建订单    create(HttpServletRequest httpServletRequest, Integer shippingId)

        选中商品信息  getOrderCartProduct(HttpServletRequest httpServletRequest)

        订单列表    list(int pageNum, int pageSize)

        订单详情    detail(HttpServletRequest httpServletRequest,Long orderNo)

        取消订单    cancel(HttpServletRequest httpServletRequest, Long orderNo)

      后台 

        订单列表    orderList(HttpServletRequest httpServletRequest, int pageNum, int pageSize)

        订单搜索    orderSearch(HttpServletRequest httpServletRequest, Long orderNo,int pageNum,int pageSize)

        订单详情    orderDetail(HttpServletRequest httpServletRequest, Long orderNo)

        订单发货    orderSendGoods(HttpServletRequest httpServletRequest, Long orderNo)

  技术学习:

         避免业务逻辑中横向越权和纵向越权等安全漏洞

        设计实用、安全、扩展性强大的常量、枚举类

        订单号生成规则、订单严谨性判断

        POJO和VO之间的实际操练

        mybatis批量插入

    订单模块注意:

     1.订单模块涉及到很多商品,订单条目,地址,订单详细等内容,在该模块我们会创建很多相对应的装配对象(VO),将对象装配好再返回。  


项目后端开发分析

1.在Git托管服务上选择使用国内的Gitee,之所以选择Gitee而不是选择GitHub是因为GitHub为国外的平台,国内的用户在使用上经常遇到的问题就是访问的速度太慢,有时候还会出现无法连接的情况。和GitHub相比Gitee也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee的还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。

2.项目统一字符集UTF-8

3.为了方便前期的项目接口测试 没有限制访问方式(Get/Post/Put....)

4.为避免横向越权(当前用户去操作其他用户的所有),在大部分的sql查询上添加上了userId这一条件,这样就不会去查询到不属于该用户的所有了

5.在访问数据库之前尽可能做好条件判断,如果不成立,则直接手动返回错误,尽量减少对数据库的访问。  例如(查询当前用户订单时,提前判断好接口传递过来的参数是否有值,若无值则直接返回参数有误)  (参数有误在接口开发上需大量使用到,则直接声明在常量类上)

6.在做订单支付时需处理好状态码且等待第三方的回调,等回调成功后方可改为支付成功(避免单方帐) (单方帐:买方提交订单后未支付成功订单,然后后台显示支付成功。或是相反)

7.为方便项目后期的更新改进,在接口处要使前后端分离

8.项目中大量使用到分页功能,于是我们可以将分页独立出一个对象

9.在项目的搭建时对代码做好校验,在可能出现错误的地方做好try-catch,避免项目放在运行的时候报错,这样会很麻烦。

10.项目中的pojo类大量使用到Getter和Setter方法,这里我们引入Lombok工具,它可以通过简单注解来精简代码达到消除冗长代码的目的。

11.在项目的开发会面临到各个阶段的开发时期,有本地开发环境(Local)、开发环境(Dev)、测试环境(Beta)、线上环境(Prod)   在各个时期使用到的环境,数据库FTPServer等等都是不一样的,所以这里我们引入Maven环境隔离

12.在项目开发时,为提高服务端效率,项目采用了tomcat集群。既然采用了集群,那就要考虑到session的存放,这里我们选用了Redis进行集体存放   在存放的时候呢我们采用JSessionID当键存入Redis,但是nginx负载均衡会将服务分发给各个tomcat,每个tomcat的JSessionID都不相同,在Redis取值的时候   也面临取不到值的状况。此时我们改用Cookie来存放对应的键,当用户在进行单点登录的时候,被负载均衡到另一个服务器的时候,Cookie也会跟随着浏览器去             到另一个服务器。

13.在我们用户登录后将session存放(User)到Redis的时候(存储时间30分钟)。此时我们在网站中浏览30分钟后,发现Redis中存储的对应数据到指定时间被清除了。   这个时候我们设置了一个过滤器(Filter),当我们在项目中进行操作(*.do)的时候触发过滤器,将我们存放在Redis的数据的消除时间重计

14.在用户模块中有个忘记密码功能,为了避免横向越权,我们加入了TokenCache做了记号,在忘记密码修改密码的时候需带记号进行修改

   初期没做tomcat项目集群的时候,TokenCache是存放在tomcat上的。在做了集群后呢,我们应当将其迁移到Redis上。

15.后期若是还要提升,可以将用户模块单独拿出做成服务中心,这样也可以对项目有个解耦的效果

16.在项目的开发中会面临很多的传参,在传参的时候我们要考虑到是使用基本类型还是包装类型,拿int和Integer举例,当我   们在面临age的传参时,如果是基本类型int,那这个key是必须传参数的,不能为Null。如果是包装类型Integer,那这个   key是可以为null的。在项目的开发中应当尽量避免报错,所以在参数类型的选择上应该选择好

17.考虑到项目的管理员模块涉及到许多的登录/权限的校验,我们采用SpringMVC拦截器进行权限拦截。


http://chatgpt.dhexx.cn/article/gZVqZb7e.shtml

相关文章

python flask-sqlalchemy flask-marshmallow基本使用

首先安装 pip install marshmallow-sqlalchemy pip install flask-sqlalchemy pip install flask-marshmallow 参考 sqlalchemy query 官网 app.py文件内容 from flask import Flask,jsonify import config from flask_sqlalchemy import SQLAlchemy from flask_marshmallow i…

Flask_使用flask_marshmallow序列化数据

代码如下: from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

【Python】Marshmallow:Python中的“棉花糖”

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 文章目录 一、Marshmallow简介1.1、基础概念 二、序列化2.1、User类2.2、UserSchema类2.3、Serializing(序列化)2.4、运行2.5、过滤输出 三、反序列化四、验证数据4.1、V…

marshmallow——简介

一、marshmallow简介 在marshmallow诞生之前,已经有很多优秀的模块来用于数据的格式化和数据校验中。 因此书写mashmallow这个库的作者受这些库的启发,例如Django REST Framework, Flask-RESTful, 和colander这些。他同样从这些库中大量借用了设计和实现序列化、反序列化以及…

flask---》Marshmallow介绍及基础使用

0. Marshmallow背景介绍 介绍 Marshmallow,中文译作:棉花糖。是一个轻量级的数据格式转换的模块,也叫序列化和反序列化模块,常用于将复杂的orm模型对象与python原生数据类型之间相互转换。一般用于flaskmarshmallow提供了丰富的…

YApi接口平台-接口挡板

YApi是一个开源的平台,官方平台链接,如下https://hellosean1025.github.io/yapi/index.html,目前很多大公司在使用,主要优势我认为有2个,第一该平台开源,搭建方便;第二该平台解决了前后端分离开发的痛点&am…

open source HTML 5移动应用 -Exlive 人员定位客户端(BlackBerry 10, Android, iPhone)

下图是exlive人员定位系统的宣传页,其官方主站在这里 www.exlive.cn 下图是BlackBerry OS 7.0上面的运行效果,更多截图见这里 http://blog.csdn.net/berryreload/article/details/8099674 Update: Remove BlackBerry OS 7.0支持 升级到PhoneGap 3.0&…

My BlackBerry

什么是黑莓 RIM公司成立于1984年。 黑莓手机(Blackberry),是指由加拿大Reserach In Motion(RIM)公司推出的一种无线手持邮件解决终端设备,也就是我们平时称的手机。 2013年1月30日,RIM公司今…

解决联网下载服务端返回405问题

最近遇到了一个问题,在项目中有一个启动页广告图片下载的功能,之前能够正常下载,由于这个版本遇到了运营商DNS劫持的问题,服务端要调整图片的下载路径,也就是改变了图片的链接地址。修改地址之后下载就出现异常了&…

IIS 405 Method Not Allowed

今天将项目发布到IIS上后,发现Delete方法用不了,可进行如下设置: 打开处理程序映射 找到WebDAV点击请求限制,勾选全部谓词 这个方法如果无效的话 方法二:因为是WebDAVModule限制的请求,所以直接将WebDAV…

前端请求接口时报405错误

他说方法不存在 他的问题所在就是没有找到后端对应的接口 意思就是说没有找到我后端put这个对应的接口 我记得写了不知道为啥没了纳闷

IIS put请求 报HTTP Error 405 - Method Not Allowed

在新的服务器上部署了一个.net core的项目,部分请求地址使用了put、delete方式,导致无法正常请求,报Error 405 - Method Not Allowed。 由于配置IIS时把“WebDAV 发布”给勾选了,所以会导致拦截。 服务器和IIS 10配置如下图&…

405 Method Not Allowed 解决方案

背景描述 前端发送请求到后端,可是经过swagger测试,后端接口是没问题的 可是一旦调用就发生405报错 解决方案 一般这种情况发生是因为前后端请求方式不一致 写在前端的接口声明方式是post 我们来看后端 很明显了,后端是get,因…

405 Method Not Allowed(亲测,实用)

今天在发布一个网站的时候遇到 标题上的问题,一直不明白是为何,刚开始以为是我的程序写的有问题,随即将项目发给同事来发布试试,在他的IIS上发布却没出现问题,一切正常,这可就怪了,于是想到了应…

宝塔面板数据库出现405 Not Allowed 错误的原因和解决办法

我们在网站建设和网站维护过程中,除了云服务器需要小心维护之外,还要应对突然出现的一些问题,比如今天网站突然打不开了,根据页面提示,貌似是数据库的原因,于是登录宝塔面板,想要看看数据库怎么…

浏览器页面报错405!

首先看浏览器的报错页面 后端控制台正常 可以明显的看出是因为我们提交的method是不被允许的,这就说明是我们的 请求方式的问题,常见的请求方式有 post,get.大家如果不知道自己默认的请求方式是get或者post,我们可以在继承HttpServlet的时候继承doGet(),…

html405是什么错误,网站打开显示405错误信息如何解决?

当我们打开网页时候,会显示404,405,500等报错信息,下面海站格给大家介绍常见的405报错时的处理方法: IIS 返回 405 - 不允许用于访问此页的 HTTP 谓词。终极解决办法!!!! 1、为什么会出现这个错误? 我们可以理解为在当前IIS服务器上&#xf…

一款ModbusRTU/TCP485串口协议调试软件工具绿色版免安装

软件的界面如下: 支持modbus设备的读写操作,把设备地址、功能码、寄存器地址、寄存器个数都显示出来了,浅析易懂,很适合初学者和工程师对modbus设备进行调试、测试。 一款好用的modbus调试大师助手软件工具操作演示,…

“405”报错解决方案

405是什么意思? 意思如下: “405”经常作为“Method Not Allowed”的缩写来使用,中文中表示:“不允许的方法”。 英文缩写词:405 英文单词:Method Not Allowed 缩写词分类:Internet 缩写词…