基于ssm分布式开发实现的电商项目(聚合工程)

基于ssm分布式开发实现的电商项目(聚合工程) 注:本项目为开源项目,不能用于商业应用,仅供学习, 1,使用工具: maven(构建项目),svn(版本控制工具)

本文包含相关资料包-----> 点击直达获取<-------

基于ssm分布式开发实现的电商项目(聚合工程)

注:本项目为开源项目,不能用于商业应用,仅供学习。

1.使用工具:

maven(构建项目),svn(版本控制工具),myeclipse(集成开发环境),nginx(反向代理),
FastDFS (图片服务器),tomcat(web服务器),zookeeper(集群管理),mysql(数据库)
Junit(测试)

2.技术栈:

spring,springmvc,mybatis(框架)
solr(搜索服务),redis(缓存),easyUI(后台系统页面)

3.数据库设计

sql tb_user用户表(id,username,password,phone,email,created,updated) tb_item商品表(id,title,sell_point,price,num,barcode,image,cid,status,created,updated) tb_cat商品分类表(id,parent_id,name,status,sort_order,is_parent,created,updated) tb_item_desc商品描述表(item_id,item_desc,created,updated) tb_item_param商品规格参数表(id,item_cat_id,param_data,created,updated) tb_item_param商品规格参数模板表(id,item_id,param_data,created,updated) tb_order订单表(payment,payment_type,post_fee,status,create_time,update_time,payment_time,consign_time,end_time,close_time,shipping_name,shipping_code,user_id,buyer_message,buyer_nick,buyer_rate) tb_order订单商品表(id,item_id,order_id,num,title,price,total_fee,pic_path) tb_order_shipping订单物流表(order_id,receiver_name,receiver_phone,receiver_mobile,receiver_state,receiver_city,receiver_district,receiver_address,receiver_zip,created,updated) tb_content_category商品目录分类表(id,parent_id,name,status,sort_order,is_parent,created,updated) tb_content商品目录表(id,category_id,title,sub_title,title_desc,url,pic,pic2,content,created,updated)

4.分布式系统

4.1商品后台管理系统

shop-manager(管理后台)

商品的添加功能:
1.商品类目选择-easyui异步tree控件的使用
2.图片上传(fastdfs+nginx)
3.富文本编辑器使用KindEditor
4.分页使用PageHelper插件,插件是基于mybatis的拦截器接口实现的

商品的展示功能:
1.分页插件的使用PageHelper。
2.easyUIDataGrid的使用

4.2前台系统

shop-rest(发布服务)

shop-search(搜索服务)

  • 使用solr实现搜索,内容列表使用redis缓存,使用zookeeper管理集群

shop-sso (单点登录系统)

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中, 用户只需要登录一次就可以访问所有相互信任的应用系统。它包括 可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。 它是目前比较流行的企业业务整合的解决方案之一。

用户登录:
1、接收用户名和密码
2、校验用户名密码
3、生成token,可以使用UUID
4、把用户信息写入redis,key就是token
5、把token写入cookie。
6、返回登录成功需要把token返回给客户端。

Session共享的问题:
1、tomcat做集群配置session复制。如果集群中节点很多,会形成网络风暴。推荐节点数量不要超过5个。
2、分布式架构。拆分成多个子系统。(本项目使用)

shop-order(订单系统)

  • 当用户提交订单时此时必须要求用户登录,可以使用拦截器来实现。

拦截器的处理流程:

1. 拦截请求url
2. 从cookie中取token
3. 如果没有toke跳转到登录页面。
4. 取到token,需要调用sso系统的服务查询用户信息。
5. 如果用户session已经过期,跳转到登录页面
6. 如果没有过期,放行。
代码:

java @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在Handler执行之前处理 // 判断用户是否登录 // 从cookie中取token String token = CookieUtils.getCookieValue(request, "TT_TOKEN"); // 根据token换取用户信息,调用sso系统的接口。 TbUser user = userService.getUserByToken(token); // 取不到用户信息 if (null == user) { // 跳转到登录页面,把用户请求的url作为参数传递给登录页面。 response.sendRedirect(userService.SSO_DOMAIN_BASE_USRL + userService.SSO_PAGE_LOGIN + "?redirect=" + request.getRequestURL()); // 返回false return false; } // 取到用户信息,放行 // 把用户信息放入Request request.setAttribute("user", user); // 返回值决定handler是否执行。true:执行,false:不执行。 return true; }

shop-portal (门户系统)

购物车:
    1、添加购物车不需要用户登录。购物车的数据应该放到cookie中。
    2、当向购物车添加同一款商品时,购物车中商品的数量增加。
    3、购物车中可以删除商品
    4、购物车中可以修改商品数量。商品的总价需要重新计算。
    5、点击“结算”按钮要求用户登录。

购物车问题:
    1、未登录的情况下,可以把购物车写入cookie。
    2、已经登录的情况下,需要把购物车写入redis
    3、登录时判断cookie中有购物车商品,应该吧cookie中的购物车商品列表转移到redis中。
        Key:用户id
        Value:购物车商品列表
    4、如果想redis中转移商品时,redis的购物车中已经有商品,此时,需要把商品合并。如果是同一款商品数量叠加,如果新商品就合并商品。
跨域问题:
    使用jsonp返回商品目录(ajax方式动态加载)
代码:

```Java /* * 购物车Service / @Service public class CartServiceImpl implements CartService {

@Value("${REST_BASE_URL}") private String REST_BASE_URL; @Value("${ITME_INFO_URL}") private String ITME_INFO_URL; @Value("${REDIS_CART_SESSION_KEY}") private String REDIS_CART_SESSION_KEY; @Autowired private JedisClient jedisClient; @Autowired private UserServiceImpl userService;

/* * 添加购物车商品 / @Override public TaotaoResult addCartItem(long itemId, int num, HttpServletRequest request, HttpServletResponse response) {

// 取商品信息
CartItem cartItem = null;
// 取购物车商品列表
List<CartItem> itemList = getCartItemList(request, response);
// 判断购物车商品列表中是否存在此商品
for (CartItem cItem : itemList) {
    // 如果存在此商品longValue()
    if (cItem.getId() == itemId) {
        // 增加商品数量
        cItem.setNum(cItem.getNum() + num);
        cartItem = cItem;
        break;
    }
}
if (cartItem == null) {
    cartItem = new CartItem();
    // 根据商品id查询商品基本信息。
    String json = HttpClientUtil.doGet(REST_BASE_URL + ITME_INFO_URL
            + itemId);
    // 把json转换成java对象
    TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json,
            TbItem.class);
    if (taotaoResult.getStatus() == 200) {
        TbItem item = (TbItem) taotaoResult.getData();
        cartItem.setId(item.getId());
        cartItem.setTitle(item.getTitle());
        cartItem.setImage(item.getImage() == null ? "" : item
                .getImage().split(",")[0]);
        cartItem.setNum(num);
        cartItem.setPrice(item.getPrice());
    }
    // 添加到购物车列表
    itemList.add(cartItem);
}

if (login(request)) {// 登录了
    // 将修改写入redis
    String tokenJson = CookieUtils.getCookieValue(request, "TT_TOKEN",
            true);
    TbUser tbUser = userService.getUserByToken(tokenJson);
    jedisClient.set(tbUser.getId().toString(),
            JsonUtils.objectToJson(itemList));
} else {// 未登录
        // 把购物车列表写入cookie
    CookieUtils.setCookie(request, response, "TT_CART",
            JsonUtils.objectToJson(itemList), true);
}
return TaotaoResult.ok();

}

/* * 删除购物车商品 / @Override public TaotaoResult deleteCartItem(long itemId, HttpServletRequest request, HttpServletResponse response) { // 从cookie中取购物车商品列表 List itemList = getCartItemList(request, response); // 从列表中找到此商品 for (CartItem cartItem : itemList) { if (cartItem.getId() == itemId) { itemList.remove(cartItem); break; }

}
if (login(request)) {// 登录了
    // 将修改写入redis
    String tokenJson = CookieUtils.getCookieValue(request, "TT_TOKEN",
            true);
    TbUser tbUser = userService.getUserByToken(tokenJson);
    jedisClient.set(tbUser.getId().toString(),
            JsonUtils.objectToJson(itemList));
} else {// 未登录
        // 把购物车列表写入cookie
    CookieUtils.setCookie(request, response, "TT_CART",
            JsonUtils.objectToJson(itemList), true);
}

return TaotaoResult.ok();

}

/* * 从cookie中取商品列表 / private List getCartItemList(HttpServletRequest request) { // 从cookie中取商品列表 String cartJson = CookieUtils.getCookieValue(request, "TT_CART", true); if (cartJson == null || "".equals(cartJson)) { return new ArrayList<>(); } // 把json转换成商品列表 try { List list = JsonUtils .jsonToList(cartJson, CartItem.class); return list; } catch (Exception e) { e.printStackTrace(); } return new ArrayList<>(); }

@Override public List getCartItemList(HttpServletRequest request, HttpServletResponse response) { List itemList = getCartItemList(request); // 登录了就从redis中取数据 // 未登录就从cookie中取数据 // 判断是否登录 if (login(request)) {// 登录了 String tokenJson = CookieUtils.getCookieValue(request, "TT_TOKEN", true); TbUser tbUser = userService.getUserByToken(tokenJson); String json = jedisClient.get(tbUser.getId().toString()); if (StringUtils.isBlank(json) || "[]".equals(json)) {// redis为空 if (itemList.size() > 0) {// cookie不为空 return sync(itemList, null, request, response); } else { return itemList; } } else {// redis不为空 List list = JsonUtils .jsonToList(json, CartItem.class); if (itemList.size() > 0) {// cookie不为空 return sync(itemList, list, request, response); } else { return sync(null, list, request, response); } } } else {// 未登录 return itemList; } }

@Override public Boolean login(HttpServletRequest request) { String tokenJson = CookieUtils .getCookieValue(request, "TT_TOKEN", true); if (tokenJson == null || "".equals(tokenJson)) { return false; } return true; }

@Override public List sync(List cookie, List redis, HttpServletRequest request, HttpServletResponse response) { String tokenJson = CookieUtils .getCookieValue(request, "TT_TOKEN", true); TbUser tbUser = userService.getUserByToken(tokenJson); String json = jedisClient.get(tbUser.getId().toString()); // 1.redis为空,cookie不为空sync(cookie,null) if (redis == null || "".equals(redis) || "[]".equals(redis)) { jedisClient.set(tbUser.getId().toString(), JsonUtils.objectToJson(cookie)); List list = JsonUtils.jsonToList(json, CartItem.class); CookieUtils.deleteCookie(request, response, "TT_CART"); return list; }

// 2.redis不为空,cookie为空sync(null, redis)
if (cookie == null || "".equals(cookie)) {
    return redis;
}

// 3.redis,cookie都不为空sync(cookie, redis)
// 判断购物车商品列表中是否存在此商品
for (CartItem cItem : cookie) {
    for (CartItem cartItem2 : redis) {// redis
        // 如果存在此商品longValue()
        if (cItem.getId() == cartItem2.getId()) {
            // 增加商品数量
            cItem.setNum(cItem.getNum() + cartItem2.getNum());
            redis.remove(cartItem2);
            redis.add(cItem);
            break;
        } else {
            redis.add(cItem);
        }
    }
}
jedisClient.set(tbUser.getId().toString(),
        JsonUtils.objectToJson(redis));
CookieUtils.deleteCookie(request, response, "TT_CART");
String json2 = jedisClient.get(tbUser.getId().toString());
List<CartItem> listItem = JsonUtils.jsonToList(json2, CartItem.class);
return listItem;
}

} ``` 老铁们凑合这看吧😁,觉得还行的可以点个star, 你的star是我继续开源创作的动力 ,谢谢!!!

参考文献

  • 基于ElasticSearch与聚合支付的分布式电商平台的设计与实现(华中师范大学·陶林)
  • 基于SSM框架的网购商城的设计与实现(北京交通大学·朱重佳)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 基于SSM框架的网购商城的设计与实现(北京交通大学·朱重佳)
  • B2B电子商务平台系统的设计与研发(山东大学·李丽君)
  • 基于SSM框架的网购商城的设计与实现(北京交通大学·朱重佳)
  • 一个基于微服务的个性化电商系统的设计与实现(华中科技大学·胡梦婷)
  • 基于SSM框架的网上商城系统的设计与实现(西安电子科技大学·薄志强)
  • 基于SSM框架的电子商城项目的设计与实现(山东大学·李天庆)
  • 基于SSM框架的网购商城的设计与实现(北京交通大学·朱重佳)
  • 基于ElasticSearch与聚合支付的分布式电商平台的设计与实现(华中师范大学·陶林)
  • 化工产品电子商务平台的设计与实现(北京交通大学·李治江)
  • 基于SSM的分布式商城的设计与实现(中国地质大学(北京)·刘彤月)
  • 基于SSM框架的B2C电子商城系统的设计与实现(合肥工业大学·李亚君)
  • 基于SSM框架的网购商城的设计与实现(北京交通大学·朱重佳)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码码头网 ,原文地址:https://m.bishedaima.com/yuanma/35659.html

相关推荐

  • 基于JSP和MySQL的农产品销售管理系统

    基于JSP和MySQL的农产品销售管理系统 摘 要 本文论述了基于JAVA,Web的农产品销售管理系统开发的目的及意义,目的是为了农产品资源的合理利用和物资的充分交流
    2024年05月14日
    8 1 2
  • 基于Python实现图像分类

    一, 理论知识 1,1 softmax线性分类器 线性分类器的函数为线性形式,即为(这里将偏置项看做参与乘积的一部分): $$ f(x_1,,,,x_m)=w_0+w_1x_1+
    2024年05月14日
    3 1 1
  • 基于springboot和sqlite实现的便利店管理系统

    基于springboot和sqlite实现的便利店管理系统 1,项目简介 Bridie CRM即小店CRM,核心支持积分兑换,前置提供商品管理,用户管理
    2024年05月14日
    2 1 2
  • 基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统

    Blog-master 基于Springmvc+MyBatis+Spring+Bootstrap+EasyUI+Mysql的个人博客系统 参考文献 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊) 基于SSH框架的人力资源管理系统的设计与开发(电子科技大学·唐伟) 博客管理系统的设计与实现(吉林大学·赵岩) 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航) 基于MVC设计模式的博客系统的设计与实现(大连理工大学·侯林) 基于SSH框架的博客用户分享平台的设计与实现(河北工业大学·刘磊) 基于SSH框架模式的博客系统的设计与实现(西北师范大学·王刚成) 基于SSH2的轻博客系统的研究与实现(吉林大学·杨雪梅) 博客管理系统的设计与实现(吉林大学·赵岩) 基于OAuth2
    2024年05月14日
    4 1 1
  • 基于S2SH框架的JSP和MySQL的网上商城系统

    基于S2SH框架的JSP和MySQL的网上商城系统 摘 要 随着网络技术的飞速发展,网络已经成为人们获取和交换信息的最有效途径,通过网络进行商品交易已经成为一种新型的购物方式
    2024年05月14日
    16 1 2
  • SSM框架二手车交易平台源码,SSM框架二手车销售网站源码(javaweb+mysql)

    这是一个🔥🔥SSM框架二手车交易平台🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 二手交易平台开发技术栈为SSM项目,可以作为毕业设计课程设计作业使用SSM框架(spring+springmvc+mybatis+mysql)实现一个二手车交易平台网站
    2024年05月23日
    16 1 5
  • 图书管理系统之Python

    图书管理系统 数据库 finalproject 实验报告 数据库设计 ER 图和导出的关系模型 ER 图 - 导出的关系模型 具体表的结构设计 用户/商店表 用户表 FIELD User_id Password Balance Token Terminal Address 类型 String String Integer String String String 主键;唯一键 非空 非空 非空 非空 调整了原有用户表的结构
    2024年05月14日
    2 1 1
  • 基于SpringBoot框架的党员教育和管理系统

    这是一套采用Java语言开发的✨✨SpringBoot框架下的党员教育与管理系统源代码✨✨,项目集成了一流的SpringBoot技术和Vue,js前端框架,开发工具为Idea或Eclipse
    2024年05月23日
    4 1 3
  • 基于JSP和MYSQL数据库实现的知识产权管理系统

    基于JSP和MYSQL数据库实现的知识产权管理系统 1 前言 1,1 主要功能 默认系统中,有三种角色,分别为:系统管理员,执法管理员,机构用户, 系统管理员功能:系统管理
    2024年05月14日
    2 1 1
  • Python实现的卷积神经网络算法

    卷积神经网络 1 算法介绍 2 实验代码 3 实验结果 4 实验总结 1 算法介绍 卷积神经网络(Convolutional Neural Network
    2024年05月14日
    3 1 1

发表回复

登录后才能评论