电子商务网站、飞机大战web demo

https://download.csdn.net/download/qq_31293575/14888337

采用ssh框架搭建,后来也用过ssm,最大区别在于orm持久化mybatis和hibernate的区别

hibernate与mybatis相比较,mybatis更加灵活,轻便,容易掌握,mybatis将sql语句从java代码分离,放在配置文件书写,大大降低了SQl语句的耦合度,更容易对sql进行操作,书写动态sql,但是缓存机制没有hibernate完善,hibernate比较完整的封装了jdbc.

采用springmvc,区别与struts:springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,参数的传递是直接注入到方法中,是该方法独有的。

struts2是类级别的拦截,一个类对应一个request上下l'x文,struts在接受参数可以用属性来接收,这说明参数是让多个方法共享的,这也是无法用注解或者其他方式标识其所属方法。

该商城是一个综合性的B2c平台,主要针对消费者。商家入驻销售自己产品,可以得到商城各种服务。

在整个项目中,我们采用nginx+tomcat来部署,nginx一方面做静态资源的加载,另外一方面做反向代理和负载均衡。因为在该项目中需要用nginx的反向代理解决不用环境系统访问地址不一致带来的问题。

整个项目采用的是分布式架构设计,整个系统包括后台管理系统,前台系统,订单系统,登录系统,搜索系统,购物车系统,营销系统。

由于项目采用的是分布式架构,各个模块相互独立,各个模块访问路劲不同,所以当跨域请求时候会遇到跨域受限问题。比如用户首次访问该网站网页时,首页页面会异步请求后台管理系统加载商品的类目,这就会出现跨域受限的问题,如果在本模块内,可以采用ajax异步请求,但是Ajax不支持跨域,我们使用jsonp来解决这个问题。jsonp通过script标签的src可以跨域请求特征,加载资源(通过方法名将数据进行包裹)当做是js脚本解析,定义一个回调函数,获取传入的数据,但是jsonp有一个缺点就是只支持get请求。其他解决方案还有nginx代理,cors更安全,能指定白名单

我们解决了浏览器访问当前页面去加载后台系统数据出现的跨域问题,但是另外一个问题,其他系统如何调用后台系统的数据,我们想可以通过http请求来获取后台数据,我们想的是通过httpclient来解决问题,因为httpclient可以用java代码模拟浏览器发送http请求,向外抛出一个接口,执行过程是:1、创建httpclient对象2、构建请求对象post ,get请求3、如果有参数,就去构造请求参数4执行请求,并且接受响应5处理响应结果6释放连接,无论是否成功都要释放连接

像首页广告和商品类目不会经常修的数据,我们考虑将这些数据放在缓存中,用户去访问的时候,先去缓存中查询,如果失败再去数据库中查询,然后把数据添加在缓存中,目前比较流行的是redis和memrached,单纯从缓存命中角度来说,Memcached更高一些,redis支持数据类型更多,读写速度快,redis将数据以key_value的形势放在内存中,并且提供了多种数据结构(list,set,string,hash),还提供了持久化的功能,可以将数据备份到磁盘中,防止宕机数据丢失(会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现主从同步),我们使用的是spring与jedis整合的客户端,可以利用jedis做分片集群,解决了redis内存受限问题。

为何redis是单线程的了,因为避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗cpu,不用考虑各种锁的问题,不存在加锁和释放锁,没有因为可能出现死锁而导致性能问题。

单个系统的登录和注册是在一个tomcat完成,现在系统架构是每一个系统都是由一个团队负责,每个系统都是单独部署运行,所以不能将用户的登录信息保存到session中,多个tomcat的session是不能共享的,所以我们需要单独的系统来维护用户登录信息。用户登录,然后数据库查询是否存在该用户,没有提示用户,如果有将用户信息保存到redis,生成一个token保存到cookie.

后台管理系统采用maven的多模块化管理,采用水平切分。系统内部接口调用采用hjttpclient,接口采用Restful方式的接口定义,系统通知采用MQ的方式,使用RabbitMQ实现,使用了消息订阅模式的消息机制,部署方面,采用了nginx+tomcat的模式,一方面做反向代理,负载均衡,另外一方面做图片等静态资源服务器

在项目中负责后台管理功能,主要是商品管理等,在实现前台调用后台数据时,为了实现系统间的调用,便使用了httpclient技术来实现此功能,在后台提供了需要调用的接口。后台对商品进行了操作,为了使前台与后台实现同步,我们使用RabbitMQ消息队列机制实现商品的同步功能。

还参与了购物车模块,在开发这个模块时候。我们考虑会员在未登录情况下和登录情况下放入购物车,后台该如何保存。

在用户商品详情点击加入购物车时候,我们用了登录拦截器来判断用户是否登录l购物车首先要标识要唯一,因为每个账号对应一个购物车,在登录状态下,我们直接将数据保存到数据库中,使用用户的id表示自己购买的商品。如果没有登录,在大访问量下,存在弊端,因为这样高速读写数据库,我们考虑用redis和RabbitMQ

 

package com.zhanshen.web;

import java.io.IOException;
import java.util.ResourceBundle;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zhanshen.entity.Product;
import com.zhanshen.service.ProductService;
import com.zhanshen.service.impl.ProductServiceImpl;
import com.zhanshen.utils.PaymentUtil;

public class CallbackServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获得回调所有数据
		String p1_MerId = request.getParameter("p1_MerId");
		String r0_Cmd = request.getParameter("r0_Cmd");
		String r1_Code = request.getParameter("r1_Code");
		String r2_TrxId = request.getParameter("r2_TrxId");
		String r3_Amt = request.getParameter("r3_Amt");
		String r4_Cur = request.getParameter("r4_Cur");
		String r5_Pid = request.getParameter("r5_Pid");
		String r6_Order = request.getParameter("r6_Order");
		String r7_Uid = request.getParameter("r7_Uid");
		String r8_MP = request.getParameter("r8_MP");
		String r9_BType = request.getParameter("r9_BType");
		String rb_BankId = request.getParameter("rb_BankId");
		String ro_BankOrderId = request.getParameter("ro_BankOrderId");
		String rp_PayDate = request.getParameter("rp_PayDate");
		String rq_CardNo = request.getParameter("rq_CardNo");
		String ru_Trxtime = request.getParameter("ru_Trxtime");
		// 身份校验 --- 判断是不是支付公司通知你
		String hmac = request.getParameter("hmac");
		String keyValue = ResourceBundle.getBundle("merchantInfo").getString(
				"keyValue");

		// 自己对上面数据进行加密 --- 比较支付公司发过来hamc
		boolean isValid = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd,
				r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid,
				r8_MP, r9_BType, keyValue);
				
				
		if (isValid) {
			// 响应数据有效
			if (r9_BType.equals("1")) {
				// 浏览器重定向
				ProductService productService=new ProductServiceImpl();
				productService.updateStateByOid(r6_Order);
				response.setContentType("text/html;charset=utf-8");
				response.getWriter().println("<h1>付款成功!等待商城进一步操作!等待收货...</h1>");
			} else if (r9_BType.equals("2")) {
				// 服务器点对点 --- 支付公司通知你
				System.out.println("付款成功!");
				// 修改订单状态 为已付款
				// 回复支付公司
				response.getWriter().print("success");
			}
		} else {
			// 数据无效
			System.out.println("数据被篡改!");
		}
	}


	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全职计算机毕业设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值