基于javaweb+springboot的仿天猫商城系统(java+jsp+Springboot+SSM+mysql+maven)
一、项目介绍:
迷你天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。
作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。
二、项目运行
环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)
项目技术: JSP + Springboot + SpringMVC + Spring +MyBatis + css + Javascript + JQuery + Ajax + layui+ maven等等。
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
@RequestParam(required = false) Double product_sale_price,
@RequestParam(required = false) Double product_price,
@RequestParam(required = false) Byte[] product_isEnabled_array,
@RequestParam(required = false) String orderBy,
@RequestParam(required = false,defaultValue = "true") Boolean isDesc,
@PathVariable Integer index,
@PathVariable Integer count) throws UnsupportedEncodingException {
//移除不必要条件
if (product_isEnabled_array != null && (product_isEnabled_array.length <= 0 || product_isEnabled_array.length >=3)) {
product_isEnabled_array = null;
}
if (category_id != null && category_id == 0) {
category_id = null;
}
if (product_name != null) {
//如果为非空字符串则解决中文乱码:URLDecoder.decode(String,"UTF-8");
product_name = "".equals(product_name) ? null : URLDecoder.decode(product_name, "UTF-8");
}
if (orderBy != null && "".equals(orderBy)) {
throw new RuntimeException();
}
}
}
if (propertyDeleteList != null && propertyDeleteList.length > 0) {
logger.info("整合产品子信息-需要删除的产品属性");
logger.info("共有{}条需要删除的产品属性数据", propertyDeleteList.length);
yn = propertyValueService.deleteList(propertyDeleteList);
if (yn) {
logger.info("产品属性删除成功!");
} else {
logger.warn("产品属性删除失败!事务回滚");
jsonObject.put("success", false);
throw new RuntimeException();
}
}
if (productSingleImageList != null && productSingleImageList.length > 0) {
List districtList = addressService.getList(null,cityAddress.getAddress_areaId());
map.put("addressList", addressList);
map.put("cityList", cityList);
map.put("districtList", districtList);
map.put("addressId", cityAddress.getAddress_regionId().getAddress_areaId());
map.put("cityAddressId", cityAddress.getAddress_areaId());
map.put("districtAddressId", districtAddressId);
return "fore/userDetails";
} else {
return "redirect:/login";
}
}
//前台天猫-用户更换头像
@ResponseBody
@RequestMapping(value = "user/uploadUserHeadImage", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
public String uploadUserHeadImage(@RequestParam MultipartFile file, HttpSession session
){
String originalFileName = file.getOriginalFilename();
logger.info("获取图片原始文件名:{}", originalFileName);
String extension = originalFileName.substring(originalFileName.lastIndexOf('.'));
logger.info("整合产品信息");
Product product = new Product()
.setProduct_id(product_id)
.setProduct_name(product_name)
.setProduct_title(product_title)
.setProduct_category(new Category().setCategory_id(product_category_id))
.setProduct_sale_price(product_sale_price)
.setProduct_price(product_price)
.setProduct_isEnabled(product_isEnabled)
.setProduct_create_date(new Date());
logger.info("更新产品信息,产品ID值为:{}", product_id);
return "redirect:/login";
}
logger.info("通过产品ID获取产品信息:{}", product_id);
Product product = productService.get(product_id);
if (product == null) {
return "redirect:/";
}
logger.info("获取产品的详细信息");
product.setProduct_category(categoryService.get(product.getProduct_category().getCategory_id()));
product.setSingleProductImageList(productImageService.getList(product_id, (byte) 0, new PageUtil(0, 1)));
logger.info("封装订单项对象");
ProductOrderItem productOrderItem = new ProductOrderItem();
productOrderItem.setProductOrderItem_product(product);
productOrderItem.setProductOrderItem_number(product_number);
productOrderItem.setProductOrderItem_price(product.getProduct_sale_price() * product_number);
productOrderItem.setProductOrderItem_user(new User().setUser_id(Integer.valueOf(userId.toString())));
String addressId = "110000";
String cityAddressId = "110100";
@Autowired
private ReviewService reviewService;
@Autowired
private LastIDService lastIDService;
//转到前台天猫-订单列表页
@RequestMapping(value = "order", method = RequestMethod.GET)
public String goToPageSimple() {
return "redirect:/order/0/10";
}
@RequestMapping(value = "order/{index}/{count}", method = RequestMethod.GET)
public String goToPage(HttpSession session, Map map,
@RequestParam(required = false) Byte status,
@PathVariable("index") Integer index,
@PathVariable("count") Integer count) {
logger.info("检查用户是否登录");
Object userId = checkUser(session);
User user;
if (userId != null) {
logger.info("获取用户信息");
logger.info("整合产品子信息-产品预览图片");
List productImageList = new ArrayList<>(5);
for (String imageName : productSingleImageList) {
productImageList.add(new ProductImage()
.setProductImage_type((byte) 0)
.setProductImage_src(imageName.substring(imageName.lastIndexOf("/") + 1))
.setProductImage_product(product)
);
}
logger.info("共有{}条产品预览图片数据", productImageList.size());
yn = productImageService.addList(productImageList);
if (yn) {
logger.info("产品预览图片添加成功!");
} else {
logger.warn("产品预览图片添加失败!事务回滚");
jsonObject.put("success", false);
throw new RuntimeException();
public String goToOrder/confirm/iPage(Mapmap, HttpSession session, @PathVariable("order_code") String order_code) { logger.info("检查用户是否登录"); Object userId = checkUser(session); User user; if (userId != null) { logger.info("获取用户信息"); user = userService.get(Integer.parseInt(userId.toString())); map.put("user", user); } else { return "redirect:/login"; } logger.info("------验证订单信息------"); logger.info("查询订单是否存在"); ProductOrder order = productOrderService.getByCode(order_code); if (order == null) { logger.warn("订单不存在,返回订单列表页"); return "redirect:/order/0/10"; }
.setProductOrderItem_order(new ProductOrder().setProductOrder_id(order_id));
yn = productOrderItemService.add(productOrderItem);
if (!yn) {
throw new RuntimeException();
}
object.put("success", true);
object.put("url", "/order/pay/" + productOrder.getProductOrder_code());
return object.toJSONString();
}
//创建新订单-多订单项-ajax
@ResponseBody
@RequestMapping(value = "order/list", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
}
//按类型ID查询属性-ajax
@ResponseBody
@RequestMapping(value = "admin/property/type/{property_category_id}", method = RequestMethod.GET,produces = "application/json;charset=utf-8")
public String getPropertyByCategoryId(@PathVariable Integer property_category_id){
//封装查询条件
Category category = new Category()
.setCategory_id(property_category_id);
JSONObject object = new JSONObject();
logger.info("按类型获取属性列表,类型ID:{}",property_category_id);
List propertyList = propertyService.getList(new Property().setProperty_category(category),null);
object.put("propertyList",JSONArray.parseArray(JSON.toJSONString(propertyList)));
return object.toJSONString();
}
//按ID删除产品图片并返回最新结果-ajax
@ResponseBody
@RequestMapping(value = "admin/productImage/{productImage_id}",method = RequestMethod.DELETE,produces = "application/json;charset=utf-8")
}
}
logger.info("获取省份信息");
List addressList = addressService.getRoot();
logger.info("获取addressId为{}的市级地址信息", addressId);
List cityAddress = addressService.getList(null, addressId);
logger.info("获取cityAddressId为{}的区级地址信息", cityAddressId);
List districtAddress = addressService.getList(null, cityAddressId);
List productOrderItemList = new ArrayList<>();
productOrderItemList.add(productOrderItem);
map.put("orderItemList", productOrderItemList);
map.put("addressList", addressList);
map.put("cityList", cityAddress);
map.put("districtList", districtAddress);
return jsonObject.toJSONString();
}
//更新产品信息-ajax
@ResponseBody
@RequestMapping(value = "admin/product/{product_id}", method = RequestMethod.PUT, produces = "application/json;charset=utf-8")
public String updateProduct(@RequestParam String product_name,
@RequestParam String product_title,
@RequestParam Integer product_category_id,
@RequestParam Double product_sale_price,
@RequestParam Double product_price,
@RequestParam Byte product_isEnabled,
object = JSON.parseObject(propertyUpdateJson);
propertyIdSet = object.keySet();
if (propertyIdSet.size() > 0) {
logger.info("整合产品子信息-需要更新的产品属性");
List propertyValueList = new ArrayList<>(5);
for (String key : propertyIdSet) {
String value = object.getString(key);
PropertyValue propertyValue = new PropertyValue()
.setPropertyValue_value(value)
.setPropertyValue_id(Integer.valueOf(key));
propertyValueList.add(propertyValue);
}
logger.info("共有{}条需要更新的产品属性数据", propertyValueList.size());
ListcategoryList = categoryService.getList(null, null); map.put("categoryList", categoryList); logger.info("获取前10条产品列表"); PageUtil pageUtil = new PageUtil(0, 10); List productList = productService.getList(null, null, null, pageUtil); map.put("productList", productList); logger.info("获取产品总数量"); Integer productCount = productService.getTotal(null, null); map.put("productCount", productCount); logger.info("获取分页信息"); pageUtil.setTotal(productCount); map.put("pageUtil", pageUtil); logger.info("转到后台管理-产品页-ajax方式"); return "admin/productManagePage"; } //转到后台管理-产品详情页-ajax @RequestMapping(value="admin/product/{pid}",method = RequestMethod.GET) public String goToDetailsPage(HttpSession session, Map map, @PathVariable Integer pid) { logger.info("检查管理员权限");
logger.info("共有{}条产品详情图片数据", productImageList.size());
yn = productImageService.addList(productImageList);
if (yn) {
logger.info("产品详情图片添加成功!");
} else {
logger.warn("产品详情图片添加失败!事务回滚");
jsonObject.put("success", false);
throw new RuntimeException();
}
}
logger.info("产品信息及其子信息添加成功!");
jsonObject.put("success", true);
jsonObject.put("product_id", product_id);
return jsonObject.toJSONString();
}
//更新产品信息-ajax
@ResponseBody
@RequestMapping(value = "admin/product/{product_id}", method = RequestMethod.PUT, produces = "application/json;charset=utf-8")
public String updateProduct(@RequestParam String product_name,
JSONObject object = new JSONObject();
logger.info("检查用户是否登录");
Object userId = checkUser(session);
if (userId == null) {
object.put("url", "/login");
object.put("success", false);
return object.toJSONString();
}
logger.info("检查用户的购物车项");
List orderItemList = productOrderItemService.getListByUserId(Integer.valueOf(userId.toString()), null);
boolean isMine = false;
for (ProductOrderItem orderItem : orderItemList) {
logger.info("找到匹配的购物车项");
if (orderItem.getProductOrderItem_id().equals(orderItem_id)) {
isMine = true;
break;
}
if (yn) {
logger.info("更新成功!");
jsonObject.put("success", true);
jsonObject.put("category_id", category_id);
} else {
jsonObject.put("success", false);
logger.info("更新失败!事务回滚");
throw new RuntimeException();
}
return jsonObject.toJSONString();
}
//按条件查询分类-ajax
@ResponseBody
@RequestMapping(value = "admin/category/{index}/{count}", method = RequestMethod.GET, produces = "application/json;charset=utf-8")
public String getCategoryBySearch(@RequestParam(required = false) String category_name,
@PathVariable Integer index,
@PathVariable Integer count) throws UnsupportedEncodingException {
//移除不必要条件
if (category_name != null) {
//如果为非空字符串则解决中文乱码:URLDecoder.decode(String,"UTF-8");
);
}
logger.info("共有{}条产品详情图片数据", productImageList.size());
yn = productImageService.addList(productImageList);
if (yn) {
logger.info("产品详情图片添加成功!");
} else {
logger.warn("产品详情图片添加失败!事务回滚");
jsonObject.put("success", false);
throw new RuntimeException();
}
}
logger.info("共有{}条产品属性数据", propertyValueList.size());
yn = propertyValueService.addList(propertyValueList);
if (yn) {
logger.info("产品属性添加成功!");
} else {
logger.warn("产品属性添加失败!事务回滚");
jsonObject.put("success", false);
throw new RuntimeException();
}
}
if (productSingleImageList != null && productSingleImageList.length > 0) {
logger.info("整合产品子信息-产品预览图片");
List productImageList = new ArrayList<>(5);
for (String imageName : productSingleImageList) {
productImageList.add(new ProductImage()
.setProductImage_type((byte) 0)
.setProductImage_src(imageName.substring(imageName.lastIndexOf("/") + 1))
.setProductImage_product(new Product().setProduct_id(product_id))
);
}
logger.info("共有{}条产品预览图片数据", productImageList.size());
yn = productImageService.addList(productImageList);
PageUtil pageUtil = new PageUtil(index, count);
logger.info("根据用户ID:{}获取订单列表", userId);
List productOrderList = productOrderService.getList(new ProductOrder().setProductOrder_user(new User().setUser_id(Integer.valueOf(userId.toString()))), status_array, new OrderUtil("productOrder_id", true), pageUtil);
//订单总数量
Integer orderCount = 0;
if (productOrderList.size() > 0) {
orderCount = productOrderService.getTotal(new ProductOrder().setProductOrder_user(new User().setUser_id(Integer.valueOf(userId.toString()))), status_array);
logger.info("获取订单项信息及对应的产品信息");
for (ProductOrder order : productOrderList) {
List productOrderItemList = productOrderItemService.getListByOrderId(order.getProductOrder_id(), null);
if (productOrderItemList != null) {
for (ProductOrderItem productOrderItem : productOrderItemList) {
Integer product_id = productOrderItem.getProductOrderItem_product().getProduct_id();
Product product = productService.get(product_id);
product.setSingleProductImageList(productImageService.getList(product_id, (byte) 0, new PageUtil(0, 1)));
productOrderItem.setProductOrderItem_product(product);
if (order.getProductOrder_status() == 3) {
productOrderItem.setIsReview(reviewService.getTotalByOrderItemId(productOrderItem.getProductOrderItem_id()) > 0);
}
}
return object.toJSONString();
}
logger.info("更新订单信息");
ProductOrder productOrder = new ProductOrder()
.setProductOrder_id(order.getProductOrder_id())
.setProductOrder_status((byte) 4);
boolean yn = productOrderService.update(productOrder);
if (yn) {
object.put("success", true);
} else {
object.put("success", false);
}
private PropertyService propertyService;
//转到后台管理-分类页-ajax
@RequestMapping(value = "admin/category", method = RequestMethod.GET)
public String goToPage(HttpSession session, Map map) {
logger.info("检查管理员权限");
Object adminId = checkAdmin(session);
if (adminId == null) {
return "admin/include/loginMessage";
}
logger.info("获取前10条分类列表");
PageUtil pageUtil = new PageUtil(0, 10);
List categoryList = categoryService.getList(null, pageUtil);
map.put("categoryList", categoryList);
logger.info("获取分类总数量");
Integer categoryCount = categoryService.getTotal(null);
map.put("categoryCount", categoryCount);
logger.info("获取分页信息");
pageUtil.setTotal(categoryCount);
map.put("pageUtil", pageUtil);
logger.info("转到后台管理-分类页-ajax方式");
return "admin/categoryManagePage";
orderTotalPrice += productOrderItem.getProductOrderItem_price();
}
}
logger.info("订单总金额为:{}元", orderTotalPrice);
map.put("productOrder", order);
map.put("orderTotalPrice", orderTotalPrice);
logger.info("转到前台天猫-订单确认页");
return "fore/order/confirm/iPage";
}
//转到前台天猫-订单完成页
@RequestMapping(value = "order/success/{order_code}", method = RequestMethod.GET)
public String goToOrderSuccessPage(Map map, HttpSession session,
@PathVariable("order_code") String order_code) {
logger.info("检查用户是否登录");
Object userId = checkUser(session);
User user;
if (userId != null) {
logger.info("获取用户信息");
user = userService.get(Integer.parseInt(userId.toString()));
map.put("user", user);
} else {
return "redirect:/login";
return object.toJSONString();
}
logger.info("验证用户与订单是否一致");
if (order.getProductOrder_user().getUser_id() != Integer.parseInt(userId.toString())) {
logger.warn("用户与订单信息不一致,返回订单列表页");
object.put("success", false);
object.put("url", "/order/0/10");
return object.toJSONString();
}
order.setProductOrderItemList(productOrderItemService.getListByOrderId(order.getProductOrder_id(), null));
double orderTotalPrice = 0.00;
if (order.getProductOrderItemList().size() == 1) {
logger.info("获取单订单项的产品信息");
ProductOrderItem productOrderItem = order.getProductOrderItemList().get(0);
Product product = productService.get(productOrderItem.getProductOrderItem_product().getProduct_id());
product.setProduct_category(categoryService.get(product.getProduct_category().getCategory_id()));
}
logger.info("获取省份信息");
List addressList = addressService.getRoot();
logger.info("获取addressId为{}的市级地址信息", addressId);
List cityAddress = addressService.getList(null, addressId);
logger.info("获取cityAddressId为{}的区级地址信息", cityAddressId);
List districtAddress = addressService.getList(null, cityAddressId);
map.put("orderItemList", orderItemList);
map.put("addressList", addressList);
map.put("cityList", cityAddress);
}
order.setProductOrderItemList(productOrderItemService.getListByOrderId(order.getProductOrder_id(), null));
double orderTotalPrice = 0.00;
if (order.getProductOrderItemList().size() == 1) {
logger.info("获取单订单项的产品信息");
ProductOrderItem productOrderItem = order.getProductOrderItemList().get(0);
Product product = productService.get(productOrderItem.getProductOrderItem_product().getProduct_id());
product.setProduct_category(categoryService.get(product.getProduct_category().getCategory_id()));
productOrderItem.setProductOrderItem_product(product);
orderTotalPrice = productOrderItem.getProductOrderItem_price();
} else {
for (ProductOrderItem productOrderItem : order.getProductOrderItemList()) {
orderTotalPrice += productOrderItem.getProductOrderItem_price();
}
}
logger.info("总共支付金额为:{}元", orderTotalPrice);
logger.info("更新订单信息");
ProductOrder productOrder = new ProductOrder()
object.put("url", "/order/pay/" + productOrder.getProductOrder_code());
return object.toJSONString();
}
//创建订单项-购物车-ajax
@ResponseBody
@RequestMapping(value = "orderItem/create/{product_id}", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
public String createOrderItem(@PathVariable("product_id") Integer product_id,
@RequestParam(required = false, defaultValue = "1") Short product_number,
HttpSession session,
HttpServletRequest request) {
JSONObject object = new JSONObject();
logger.info("检查用户是否登录");
Object userId = checkUser(session);
if (userId == null) {
logger.info("按条件获取分类总数量");
Integer categoryCount = categoryService.getTotal(category_name);
object.put("categoryCount", categoryCount);
logger.info("获取分页信息");
pageUtil.setTotal(categoryCount);
object.put("totalPage", pageUtil.getTotalPage());
object.put("pageUtil", pageUtil);
return object.toJSONString();
}
// 上传分类图片-ajax
@ResponseBody
@RequestMapping(value = "admin/uploadCategoryImage", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
public String uploadCategoryImage(@RequestParam MultipartFile file, HttpSession session) {
String originalFileName = file.getOriginalFilename();
logger.info("获取图片原始文件名: {}", originalFileName);
String extension = originalFileName.substring(originalFileName.lastIndexOf('.'));
String fileName = UUID.randomUUID() + extension;
String filePath = session.getServletContext().getRealPath("/") + "res/images/item/categoryPicture/" + fileName;
logger.info("文件上传路径:{}", filePath);



