一、项目简述
本系统主要实现的功能有: 网上商城系统,前台+后台管理,用户注册,登录,上架展示,分组展示,搜索,收货地址管理,购物车管理,添加,购买,个人信息修改。订单查询等等,后台商品管理,分类管理,库存管理,订单管理,评论管理,用户管理,信息修改等等。
二、项目运行
环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)
项目技术: Springboot+ SpringMVC + MyBatis + Jsp + Html+ JavaScript + JQuery + Ajax + maven等等。
后台管理-账户页控制层:
/** * 后台管理-账户页 * @author yy */ @Controller public class AccountController extends BaseController{ @Resource(name = "adminService") private AdminService adminService; //转到后台管理-账户页-ajax @RequestMapping(value = "admin/account", method = RequestMethod.GET) public String goToPage(HttpSession session, Map<String, Object> map){ logger.info("获取管理员信息"); Object adminId = checkAdmin(session); if(adminId == null){ return "admin/include/loginMessage"; } logger.info("获取目前登录的管理员信息,管理员ID:{}",adminId); Admin admin = adminService.get(null,Integer.parseInt(adminId.toString())); map.put("admin",admin); logger.info("转到后台管理-账户页-ajax方式"); return "admin/accountManagePage"; } //退出当前账号 @RequestMapping(value = "admin/account/logout", method = RequestMethod.GET) public String logout(HttpSession session) { Object o = session.getAttribute("adminId"); if (o == null) { logger.info("无相关信息,返回管理员登陆页"); } else { session.removeAttribute("adminId"); session.invalidate(); logger.info("登录信息已清除,返回管理员登陆页"); } return "redirect:/admin/login"; } //管理员头像上传 @ResponseBody @RequestMapping(value = "admin/uploadAdminHeadImage", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public String uploadAdminHeadImage(@RequestParam MultipartFile file, HttpSession session) { String originalFileName = file.getOriginalFilename(); logger.info("获取图片原始文件名:{}", originalFileName); assert originalFileName != null; String extension = originalFileName.substring(originalFileName.lastIndexOf('.')); //生成随机名 String fileName = UUID.randomUUID() + extension; //获取上传路径 String filePath = session.getServletContext().getRealPath("/") + "res/images/item/adminProfilePicture/" + fileName; logger.info("文件上传路径:{}", filePath); JSONObject jsonObject = new JSONObject(); try { logger.info("文件上传中..."); file.transferTo(new File(filePath)); logger.info("文件上传成功!"); jsonObject.put("success", true); jsonObject.put("fileName", fileName); } catch (IOException e) { logger.warn("文件上传失败!"); e.printStackTrace(); jsonObject.put("success", false); } return jsonObject.toJSONString(); } //更新管理员信息 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @ResponseBody @RequestMapping(value = "admin/account/{admin_id}", method = RequestMethod.PUT, produces = "application/json;charset=UTF-8") public String updateAdmin(HttpSession session, @RequestParam String admin_nickname/*管理员昵称*/, @RequestParam(required = false) String admin_password/*管理员当前密码*/, @RequestParam(required = false) String admin_newPassword/*管理员新密码*/, @RequestParam(required = false) String admin_profile_picture_src/*管理员头像路径*/, @PathVariable("admin_id") String admin_id/*管理员编号*/) { logger.info("获取管理员信息"); Object adminId = checkAdmin(session); if (adminId == null) { return "admin/include/loginMessage"; } JSONObject jsonObject = new JSONObject(); Admin putAdmin = new Admin(); putAdmin.setAdmin_id(Integer.valueOf(admin_id)); putAdmin.setAdmin_nickname(admin_nickname); if (admin_password != null && !"".equals(admin_password) && admin_newPassword != null && !"".equals(admin_newPassword)) { logger.info("获取需要修改的管理员信息"); Admin admin = adminService.get(null, Integer.valueOf(adminId.toString())); if (adminService.login(admin.getAdmin_name(), admin_password) != null) { logger.info("原密码正确"); putAdmin.setAdmin_password(admin_newPassword); } else { logger.info("原密码错误,返回错误信息"); jsonObject.put("success", false); jsonObject.put("message", "原密码输入有误!"); return jsonObject.toJSONString(); } } if (admin_profile_picture_src != null && !"".equals(admin_profile_picture_src)) { logger.info("管理员头像路径为{}", admin_profile_picture_src); putAdmin.setAdmin_profile_picture_src(admin_profile_picture_src.substring(admin_profile_picture_src.lastIndexOf("/") + 1)); } logger.info("更新管理员信息,管理员ID值为:{}", admin_id); Boolean yn = adminService.update(putAdmin); if (yn) { logger.info("更新成功!"); jsonObject.put("success", true); session.removeAttribute("adminId"); session.invalidate(); logger.info("登录信息已清除"); } else { jsonObject.put("success", false); logger.warn("更新失败!事务回滚"); throw new RuntimeException(); } return jsonObject.toJSONString(); } }
后台管理-主页控制层:
/** * 后台管理-主页 */ @Controller public class AdminHomeController extends BaseController { @Resource(name = "adminService") private AdminService adminService; @Resource(name = "productOrderService") private ProductOrderService productOrderService; @Resource(name = "productService") private ProductService productService; @Resource(name = "userService") private UserService userService; /** * 转到后台管理-主页 * @param session session对象 * @param map 前台传入的Map * @return 响应数据 * @throws ParseException 转换异常 */ @RequestMapping(value = "admin", method = RequestMethod.GET) public String goToPage(HttpSession session, Map<String, Object> map) throws ParseException { logger.info("获取管理员信息"); Object adminId = checkAdmin(session); if (adminId == null) { return "redirect:/admin/login"; } Admin admin = adminService.get(null, Integer.parseInt(adminId.toString())); map.put("admin", admin); logger.info("获取统计信息"); //产品总数 Integer productTotal = productService.getTotal(null, new Byte[]{0, 2}); //用户总数 Integer userTotal = userService.getTotal(null); //订单总数 Integer orderTotal = productOrderService.getTotal(null, new Byte[]{3}); logger.info("获取图表信息"); map.put("jsonObject", getChartData(null,null,7)); map.put("productTotal", productTotal); map.put("userTotal", userTotal); map.put("orderTotal", orderTotal); logger.info("转到后台管理-主页"); return "admin/homePage"; } /** * 转到后台管理-主页(ajax方式) * @param session session对象 * @param map 前台传入的Map * @return 响应数据 * @throws ParseException 转换异常 */ @RequestMapping(value = "admin/home", method = RequestMethod.GET) public String goToPageByAjax(HttpSession session, Map<String, Object> map) throws ParseException { logger.info("获取管理员信息"); Object adminId = checkAdmin(session); if (adminId == null) { return "admin/include/loginMessage"; } Admin admin = adminService.get(null, Integer.parseInt(adminId.toString())); map.put("admin", admin); logger.info("获取统计信息"); Integer productTotal = productService.getTotal(null, new Byte[]{0, 2}); Integer userTotal = userService.getTotal(null); Integer orderTotal = productOrderService.getTotal(null, new Byte[]{3}); logger.info("获取图表信息"); map.put("jsonObject", getChartData(null, null,7)); logger.info("获取图表信息"); map.put("jsonObject", getChartData(null,null,7)); map.put("productTotal", productTotal); map.put("userTotal", userTotal); map.put("orderTotal", orderTotal); logger.info("转到后台管理-主页-ajax方式"); return "admin/homeManagePage"; } /** * 按日期查询图表数据(ajax方式) * @param beginDate 开始日期 * @param endDate 结束日期 * @return 响应数据 * @throws ParseException 转换异常 */ @ResponseBody @RequestMapping(value = "admin/home/charts", method = RequestMethod.GET, produces = "application/json;charset=utf-8") public String getChartDataByDate(@RequestParam(required = false) String beginDate, @RequestParam(required = false) String endDate) throws ParseException { if (beginDate != null && endDate != null) { //转换日期格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); return getChartData(simpleDateFormat.parse(beginDate), simpleDateFormat.parse(endDate),7).toJSONString(); } else { return getChartData(null, null,7).toJSONString(); } } /** * 按日期获取图表数据 * @param beginDate 开始日期 * @param endDate 结束日期 * @param days 天数 * @return 图表数据的JSON对象 * @throws ParseException 转换异常 */ private JSONObject getChartData(Date beginDate,Date endDate,int days) throws ParseException { JSONObject jsonObject = new JSONObject(); SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd", Locale.UK); SimpleDateFormat time2 = new SimpleDateFormat("MM/dd", Locale.UK); SimpleDateFormat timeSpecial = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.UK); //如果没有指定开始和结束日期 if (beginDate == null || endDate == null) { //指定一周前的日期为开始日期 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, 1-days); beginDate = time.parse(time.format(cal.getTime())); //指定当前日期为结束日期 cal = Calendar.getInstance(); endDate = cal.getTime(); } else { beginDate = time.parse(time.format(beginDate)); endDate = timeSpecial.parse(time.format(endDate) + " 23:59:59"); } logger.info("根据订单状态分类"); //未付款订单数统计数组 int[] orderUnpaidArray = new int[7]; //未发货订单数统计叔祖 int[] orderNotShippedArray = new int[7]; //未确认订单数统计数组 int[] orderUnconfirmedArray = new int[7]; //交易成功订单数统计数组 int[] orderSuccessArray = new int[7]; //总交易订单数统计数组 int[] orderTotalArray = new int[7]; logger.info("从数据库中获取统计的订单集合数据"); List<OrderGroup> orderGroupList = productOrderService.getTotalByDate(beginDate, endDate); //初始化日期数组 JSONArray dateStr = new JSONArray(days); //按指定的天数进行循环 for (int i = 0; i < days; i++) { //格式化日期串(MM/dd)并放入日期数组中 Calendar cal = Calendar.getInstance(); cal.setTime(beginDate); cal.add(Calendar.DATE, i); String formatDate = time2.format(cal.getTime()); dateStr.add(formatDate); //该天的订单总数 int orderCount = 0; //循环订单集合数据的结果集 for(int j = 0; j < orderGroupList.size(); j++){ OrderGroup orderGroup = orderGroupList.get(j); //如果该订单日期与当前日期一致 if(orderGroup.getProductOrder_pay_date().equals(formatDate)){ //从结果集中移除数据 orderGroupList.remove(j); //根据订单状态将统计结果存入对应的订单状态数组中 switch (orderGroup.getProductOrder_status()) { case 0: //未付款订单 orderUnpaidArray[i] = orderGroup.getProductOrder_count(); break; case 1: //未发货订单 orderNotShippedArray[i] = orderGroup.getProductOrder_count(); break; case 2: //未确认订单 orderUnconfirmedArray[i] = orderGroup.getProductOrder_count(); break; case 3: //交易成功订单 orderSuccessArray[i] = orderGroup.getProductOrder_count(); break; } //累加当前日期的订单总数 orderCount += orderGroup.getProductOrder_count(); } } //将统计的订单总数存入总交易订单数统计数组 orderTotalArray[i] = orderCount; } logger.info("返回结果集map"); jsonObject.put("orderTotalArray", orderTotalArray); jsonObject.put("orderUnpaidArray", orderUnpaidArray); jsonObject.put("orderNotShippedArray", orderNotShippedArray); jsonObject.put("orderUnconfirmedArray", orderUnconfirmedArray); jsonObject.put("orderSuccessArray", orderSuccessArray); jsonObject.put("dateStr",dateStr); return jsonObject; } }
后台管理-订单页控制层:
/** * 后台管理-订单页 */ @Controller public class OrderController extends BaseController{ @Resource(name="productOrderService") private ProductOrderService productOrderService; @Resource(name = "addressService") private AddressService addressService; @Resource(name="userService") private UserService userService; @Resource(name = "productOrderItemService") private ProductOrderItemService productOrderItemService; @Resource(name = "productService") private ProductService productService; @Resource(name = "productImageService") private ProductImageService productImageService; @Resource(name = "lastIDService") private LastIDService lastIDService; //转到后台管理-订单页-ajax @RequestMapping(value = "admin/order", method = RequestMethod.GET) public String goToPage(HttpSession session, Map<String, Object> map){ logger.info("获取前10条订单列表"); PageUtil pageUtil = new PageUtil(0, 10); List<ProductOrder> productOrderList = productOrderService.getList( null, null, new OrderUtil("productOrder_id", true), pageUtil); map.put("productOrderList",productOrderList); logger.info("获取订单总数量"); Integer productOrderCount = productOrderService.getTotal(null, null); map.put("productOrderCount", productOrderCount); logger.info("获取分页信息"); pageUtil.setTotal(productOrderCount); map.put("pageUtil", pageUtil); logger.info("转到后台管理-订单页-ajax方式"); return "admin/orderManagePage"; } //转到后台管理-订单详情页-ajax @RequestMapping(value = "admin/order/{oid}", method = RequestMethod.GET) public String goToDetailsPage(HttpSession session, Map<String, Object> map, @PathVariable Integer oid/* 订单ID */) { logger.info("获取order_id为{}的订单信息",oid); ProductOrder order = productOrderService.get(oid); logger.info("获取订单详情-地址信息"); Address address = addressService.get(order.getProductOrder_address().getAddress_areaId()); Stack<String> addressStack = new Stack<>(); //详细地址 addressStack.push(order.getProductOrder_detail_address()); //最后一级地址 addressStack.push(address.getAddress_name() + " "); //如果不是第一级地址,循环拼接地址信息 while (!address.getAddress_areaId().equals(address.getAddress_regionId().getAddress_areaId())) { address = addressService.get(address.getAddress_regionId().getAddress_areaId()); addressStack.push(address.getAddress_name() + " "); } StringBuilder builder = new StringBuilder(); while (!addressStack.empty()) { builder.append(addressStack.pop()); } logger.info("订单地址字符串:{}", builder); order.setProductOrder_detail_address(builder.toString()); logger.info("获取订单详情-用户信息"); order.setProductOrder_user(userService.get(order.getProductOrder_user().getUser_id())); logger.info("获取订单详情-订单项信息"); List<ProductOrderItem> productOrderItemList = productOrderItemService.getListByOrderId(oid, null); if (productOrderItemList != null) { logger.info("获取订单详情-订单项对应的产品信息"); for (ProductOrderItem productOrderItem : productOrderItemList) { Integer productId = productOrderItem.getProductOrderItem_product().getProduct_id(); logger.info("获取产品ID为{}的产品信息", productId); Product product = productService.get(productId); if (product != null) { logger.info("获取产品ID为{}的第一张预览图片信息", productId); product.setSingleProductImageList(productImageService.getList(productId, (byte) 0, new PageUtil(0, 1))); } productOrderItem.setProductOrderItem_product(product); } } order.setProductOrderItemList(productOrderItemList); map.put("order", order); logger.info("转到后台管理-订单详情页-ajax方式"); return "admin/include/orderDetails"; } //更新订单信息-ajax @ResponseBody @RequestMapping(value = "admin/order/{order_id}", method = RequestMethod.PUT, produces = "application/json;charset=UTF-8") public String updateOrder(@PathVariable("order_id") String order_id) { JSONObject jsonObject = new JSONObject(); logger.info("整合订单信息"); ProductOrder productOrder = new ProductOrder() .setProductOrder_id(Integer.valueOf(order_id)) .setProductOrder_status((byte) 2) .setProductOrder_delivery_date(new Date()); logger.info("更新订单信息,订单ID值为:{}", order_id); boolean yn = productOrderService.update(productOrder); if (yn) { logger.info("更新成功!"); jsonObject.put("success", true); } else { logger.info("更新失败!事务回滚"); jsonObject.put("success", false); throw new RuntimeException(); } jsonObject.put("order_id", order_id); return jsonObject.toJSONString(); } //按条件查询订单-ajax @ResponseBody @RequestMapping(value = "admin/order/{index}/{count}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8") public String getOrderBySearch(@RequestParam(required = false) String productOrder_code/* 订单号 */, @RequestParam(required = false) String productOrder_post/* 订单邮政编码 */, @RequestParam(required = false) Byte[] productOrder_status_array/* 订单状态数组 */, @RequestParam(required = false) String orderBy/* 排序字段 */, @RequestParam(required = false,defaultValue = "true") Boolean isDesc/* 是否倒序 */, @PathVariable Integer index/* 页数 */, @PathVariable Integer count/* 行数 */){ //移除不必要条件 if (productOrder_status_array != null && (productOrder_status_array.length <= 0 || productOrder_status_array.length >=5)) { productOrder_status_array = null; } if (productOrder_code != null){ productOrder_code = "".equals(productOrder_code) ? null : productOrder_code; } if(productOrder_post != null){ productOrder_post = "".equals(productOrder_post) ? null : productOrder_post; } if (orderBy != null && "".equals(orderBy)) { orderBy = null; } //封装查询条件 ProductOrder productOrder = new ProductOrder() .setProductOrder_code(productOrder_code) .setProductOrder_post(productOrder_post); OrderUtil orderUtil = null; if (orderBy != null) { logger.info("根据{}排序,是否倒序:{}",orderBy,isDesc); orderUtil = new OrderUtil(orderBy, isDesc); } else { orderUtil = new OrderUtil("productOrder_id", true); } JSONObject object = new JSONObject(); logger.info("按条件获取第{}页的{}条订单", index + 1, count); PageUtil pageUtil = new PageUtil(index, count); List<ProductOrder> productOrderList = productOrderService.getList(productOrder, productOrder_status_array, orderUtil, pageUtil); object.put("productOrderList", JSONArray.parseArray(JSON.toJSONString(productOrderList))); logger.info("按条件获取订单总数量"); Integer productOrderCount = productOrderService.getTotal(productOrder, productOrder_status_array); object.put("productOrderCount", productOrderCount); logger.info("获取分页信息"); pageUtil.setTotal(productOrderCount); object.put("totalPage", pageUtil.getTotalPage()); object.put("pageUtil", pageUtil); return object.toJSONString(); } }
后台管理-产品页控制层:
/** * 后台管理-产品页 */ @Controller public class ProductController extends BaseController{ @Resource(name = "categoryService") private CategoryService categoryService; @Resource(name = "productService") private ProductService productService; @Resource(name = "productImageService") private ProductImageService productImageService; @Resource(name = "propertyService") private PropertyService propertyService; @Resource(name = "propertyValueService") private PropertyValueService propertyValueService; @Resource(name = "lastIDService") private LastIDService lastIDService; //转到后台管理-产品页-ajax @RequestMapping(value = "admin/product",method = RequestMethod.GET) public String goToPage(HttpSession session, Map<String, Object> map) { logger.info("获取产品分类列表"); List<Category> categoryList = categoryService.getList(null, null); map.put("categoryList", categoryList); logger.info("获取前10条产品列表"); PageUtil pageUtil = new PageUtil(0, 10); List<Product> 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<String, Object> map, @PathVariable Integer pid/* 产品ID */) { logger.info("获取product_id为{}的产品信息",pid); Product product = productService.get(pid); Integer product_id =product.getProduct_id(); logger.info("获取产品预览图片信息"); List<ProductImage> singleProductImageList = productImageService.getList(product_id, (byte) 0, null); product.setSingleProductImageList(singleProductImageList); logger.info("获取产品详情图片信息"); List<ProductImage> detailsProductImageList = productImageService.getList(product_id, (byte) 1, null); product.setDetailProductImageList(detailsProductImageList); map.put("product",product); logger.info("获取产品详情-属性值信息"); List<PropertyValue> propertyValueList = propertyValueService.getList( new PropertyValue().setPropertyValue_product(product),null ); logger.info("获取产品详情-分类信息对应的属性列表"); List<Property> propertyList = propertyService.getList( new Property().setProperty_category(product.getProduct_category()),null ); logger.info("属性列表和属性值列表信息合并"); for(Property property : propertyList){ for(PropertyValue propertyValue : propertyValueList){ if(property.getProperty_id().equals(propertyValue.getPropertyValue_property().getProperty_id())){ List<PropertyValue> property_value_item = new ArrayList<>(1); property_value_item.add(propertyValue); property.setPropertyValueList(property_value_item); break; } } } map.put("propertyList",propertyList); logger.info("获取分类列表"); List<Category> categoryList = categoryService.getList(null,null); map.put("categoryList",categoryList); logger.info("转到后台管理-产品详情页-ajax方式"); return "admin/include/productDetails"; } //转到后台管理-产品添加页-ajax @RequestMapping(value = "admin/product/new",method = RequestMethod.GET) public String goToAddPage(HttpSession session,Map<String, Object> map){ logger.info("获取分类列表"); List<Category> categoryList = categoryService.getList(null,null); map.put("categoryList",categoryList); logger.info("获取第一个分类信息对应的属性列表"); List<Property> propertyList = propertyService.getList( new Property().setProperty_category(categoryList.get(0)),null ); map.put("propertyList",propertyList); logger.info("转到后台管理-产品添加页-ajax方式"); return "admin/include/productDetails"; } //添加产品信息-ajax. @ResponseBody @RequestMapping(value = "admin/product", method = RequestMethod.POST,produces = "application/json;charset=utf-8") public String addProduct(@RequestParam String product_name/* 产品名称 */, @RequestParam String product_title/* 产品标题 */, @RequestParam Integer product_category_id/* 产品类型ID */, @RequestParam Double product_sale_price/* 产品促销价 */, @RequestParam Double product_price/* 产品原价 */, @RequestParam Byte product_isEnabled/* 产品状态 */, @RequestParam String propertyJson/* 产品属性JSON */, @RequestParam Integer product_stock_count/* 产品库存 */, @RequestParam(required = false) String[] productSingleImageList/*产品预览图片名称数组*/, @RequestParam(required = false) String[] productDetailsImageList/*产品详情图片名称数组*/) { JSONObject jsonObject = new JSONObject(); logger.info("整合产品信息"); Product product = new Product() .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()); product.setProduct_stock_count(product_stock_count); logger.info("添加产品信息"); boolean yn = productService.add(product); if (!yn) { logger.warn("产品添加失败!事务回滚"); jsonObject.put("success", false); throw new RuntimeException(); } int product_id = lastIDService.selectLastID(); logger.info("添加成功!,新增产品的ID值为:{}", product_id); JSONObject object = JSON.parseObject(propertyJson); Set<String> propertyIdSet = object.keySet(); if (propertyIdSet.size() > 0) { logger.info("整合产品子信息-产品属性"); List<PropertyValue> propertyValueList = new ArrayList<>(5); for (String key : propertyIdSet) { String value = object.getString(key); PropertyValue propertyValue = new PropertyValue() .setPropertyValue_value(value) .setPropertyValue_property(new Property().setProperty_id(Integer.valueOf(key))) .setPropertyValue_product(new Product().setProduct_id(product_id)); propertyValueList.add(propertyValue); } 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<ProductImage> 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); if (yn) { logger.info("产品预览图片添加成功!"); } else { logger.warn("产品预览图片添加失败!事务回滚"); jsonObject.put("success", false); throw new RuntimeException(); } } if (productDetailsImageList != null && productDetailsImageList.length > 0) { logger.info("整合产品子信息-产品详情图片"); List<ProductImage> productImageList = new ArrayList<>(5); for (String imageName : productDetailsImageList) { productImageList.add(new ProductImage() .setProductImage_type((byte) 1) .setProductImage_src(imageName.substring(imageName.lastIndexOf("/") + 1)) .setProductImage_product(new Product().setProduct_id(product_id)) ); } 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/* 产品名称 */, @RequestParam String product_title/* 产品标题 */, @RequestParam Integer product_category_id/* 产品类型ID */, @RequestParam Double product_sale_price/* 产品促销价 */, @RequestParam Double product_price/* 产品原价 */, @RequestParam Byte product_isEnabled/* 产品状态 */, @RequestParam String propertyAddJson/* 产品添加属性JSON */, @RequestParam String propertyUpdateJson/* 产品更新属性JSON */, @RequestParam Integer product_stock_count/* 产品库存 */, @RequestParam(required = false) Integer[] propertyDeleteList/* 产品删除属性ID数组 */, @RequestParam(required = false) String[] productSingleImageList/*产品预览图片名称数组*/, @RequestParam(required = false) String[] productDetailsImageList/*产品详情图片名称数组*/, @PathVariable("product_id") Integer product_id/* 产品ID */) { JSONObject jsonObject = new JSONObject(); 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()); product.setProduct_stock_count(product_stock_count); logger.info("更新产品信息,产品ID值为:{}", product_id); boolean yn = productService.update(product); if (!yn) { logger.info("产品信息更新失败!事务回滚"); jsonObject.put("success", false); throw new RuntimeException(); } logger.info("产品信息更新成功!"); JSONObject object = JSON.parseObject(propertyAddJson); Set<String> propertyIdSet = object.keySet(); if (propertyIdSet.size() > 0) { logger.info("整合产品子信息-需要添加的产品属性"); List<PropertyValue> propertyValueList = new ArrayList<>(5); for (String key : propertyIdSet) { String value = object.getString(key); PropertyValue propertyValue = new PropertyValue() .setPropertyValue_value(value) .setPropertyValue_property(new Property().setProperty_id(Integer.valueOf(key))) .setPropertyValue_product(product); propertyValueList.add(propertyValue); } logger.info("共有{}条需要添加的产品属性数据", propertyValueList.size()); yn = propertyValueService.addList(propertyValueList); if (yn) { logger.info("产品属性添加成功!"); } else { logger.warn("产品属性添加失败!事务回滚"); jsonObject.put("success", false); throw new RuntimeException(); } } object = JSON.parseObject(propertyUpdateJson); propertyIdSet = object.keySet(); if (propertyIdSet.size() > 0) { logger.info("整合产品子信息-需要更新的产品属性"); List<PropertyValue> 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()); for (int i = 0; i < propertyValueList.size(); i++) { logger.info("正在更新第{}条,共{}条", i + 1, propertyValueList.size()); yn = propertyValueService.update(propertyValueList.get(i)); if (yn) { logger.info("产品属性更新成功!"); } else { logger.warn("产品属性更新失败!事务回滚"); jsonObject.put("success", false); 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) { logger.info("整合产品子信息-产品预览图片"); List<ProductImage> 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(); } } if (productDetailsImageList != null && productDetailsImageList.length > 0) { logger.info("整合产品子信息-产品详情图片"); List<ProductImage> productImageList = new ArrayList<>(5); for (String imageName : productDetailsImageList) { productImageList.add(new ProductImage() .setProductImage_type((byte) 1) .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(); } } jsonObject.put("success", true); jsonObject.put("product_id", product_id); return jsonObject.toJSONString(); } //按条件查询产品-ajax @ResponseBody @RequestMapping(value = "admin/product/{index}/{count}", method = RequestMethod.GET, produces = "application/json;charset=utf-8") public String getProductBySearch(@RequestParam(required = false) String product_name/* 产品名称 */, @RequestParam(required = false) Integer category_id/* 产品类型ID */, @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)) { orderBy = null; } //封装查询条件 Product product = new Product() .setProduct_name(product_name) .setProduct_category(new Category().setCategory_id(category_id)) .setProduct_price(product_price) .setProduct_sale_price(product_sale_price); OrderUtil orderUtil = null; if (orderBy != null) { logger.info("根据{}排序,是否倒序:{}",orderBy,isDesc); orderUtil = new OrderUtil(orderBy, isDesc); } JSONObject object = new JSONObject(); logger.info("按条件获取第{}页的{}条产品", index + 1, count); PageUtil pageUtil = new PageUtil(index, count); List<Product> productList = productService.getList(product, product_isEnabled_array, orderUtil, pageUtil); object.put("productList", JSONArray.parseArray(JSON.toJSONString(productList))); logger.info("按条件获取产品总数量"); Integer productCount = productService.getTotal(product, product_isEnabled_array); object.put("productCount", productCount); logger.info("获取分页信息"); pageUtil.setTotal(productCount); object.put("totalPage", pageUtil.getTotalPage()); object.put("pageUtil", pageUtil); return object.toJSONString(); } //按类型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/* 属性所属类型ID*/){ //封装查询条件 Category category = new Category() .setCategory_id(property_category_id); JSONObject object = new JSONObject(); logger.info("按类型获取属性列表,类型ID:{}",property_category_id); List<Property> 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") public String deleteProductImageById(@PathVariable Integer productImage_id/* 产品图片ID */){ JSONObject object = new JSONObject(); logger.info("获取productImage_id为{}的产品图片信息",productImage_id); ProductImage productImage = productImageService.get(productImage_id); logger.info("删除产品图片"); Boolean yn = productImageService.deleteList(new Integer[]{productImage_id}); if (yn) { logger.info("删除图片成功!"); object.put("success", true); } else { logger.warn("删除图片失败!事务回滚"); object.put("success", false); throw new RuntimeException(); } return object.toJSONString(); } //上传产品图片-ajax @ResponseBody @RequestMapping(value = "admin/uploadProductImage", method = RequestMethod.POST, produces = "application/json;charset=utf-8") public String uploadProductImage(@RequestParam MultipartFile file, @RequestParam String imageType, HttpSession session) { String originalFileName = file.getOriginalFilename(); logger.info("获取图片原始文件名:{}", originalFileName); String extension = originalFileName.substring(originalFileName.lastIndexOf('.')); String filePath; String fileName = UUID.randomUUID() + extension; if ("single".equals(imageType)) { filePath = session.getServletContext().getRealPath("/") + "res/images/item/productSinglePicture/" + fileName; } else { filePath = session.getServletContext().getRealPath("/") + "res/images/item/productDetailsPicture/" + fileName; } logger.info("文件上传路径:{}", filePath); JSONObject object = new JSONObject(); try { logger.info("文件上传中..."); file.transferTo(new File(filePath)); logger.info("文件上传完成"); object.put("success", true); object.put("fileName", fileName); } catch (IOException e) { logger.warn("文件上传失败!"); e.printStackTrace(); object.put("success", false); } return object.toJSONString(); } }