一,项目简介
鲜花线上销售管理系统在开发技术,选择JSP来开发系统动态页面,系统开发工具则使用IDEA这款口碑极佳的集成开发工具,系统的后台开发方面使用SSM框架,系统前端的体验是现阶段重点考虑的一个问题,较好的人机交机,能有效提升用户的体验,所以我们选用比较成熟的BootStrap来做页面开发,使用Jquery来进行异步请求处理,数据存储方面本系统数据库则使用My SQL。本系统目前主要利用这些技术和工具来开发一个网上商城交易网站,主要实现的系统功能:一是鲜花线上销售管理系统前台用户注册之后,根据注册账户登陆系统,浏览商品并进行购买,并可以在个人中心中查询查询订单等;二是鲜花线上销售管理系统后台管理用户登陆系统后,可以实现像包含用户信息管理、商品类别管理、商品管理、订单管理等以及网站新闻管理等信息管理的功能。
鲜花线上销售管理系统是借助 Internet 移动互联网的应用技术,实现了资源的共享,借助于网络平台各种形式的商品展示窗体,让网上客户能够更易地接受这个网上商城的交易网站,并且打破以往网上购买商品的局限性,缩短了用户寻找商品的难度和时间。
为保障鲜花在线销售系统的使用安全性,对用户的账户进行了一定程度上的保护管理,前端用户和后台管理用户在登陆和注册时,都是使用的基于MD5加密处理的密码进行处注册或登陆,这种加密本身除通过暴力破解这种方式外是没办法进行破解的,而暴力破解的成本又较高。下面展示一下用户登陆的基本安全保障流程图:
二,环境介绍
语言环境:Java: jdk1.8
数据库:Mysql: mysql5.7
应用服务器:Tomcat: tomcat8.5.31
开发工具:IDEA或eclipse
后台开发技术:SSM开发框架
前台开发技术:Bootstrap+Jquery+Ajax
三,系统展示
3.1 前台用户功能模块的展示
3.1.1 前台用户浏览鲜花模块
鲜花线上销售管理系统前台用户进入商城后无须注册登陆即可查看商城相应的产品信息。鲜花线上销售管理系统的前端用户浏览鲜花具体操作界面展示如下图3-1所示。
图3-1 前台用户浏览鲜花UI界面
3.1.2前台用户购物车模块
鲜花线上销售管理系统前台用户,在输入账户密码后登陆系统后,可以将需要购买的产品添加到商城购物车,并可以自定义购买数量的增减。鲜花线上销售管理系统前端用户添加购物车操作界面如下图3-2所示。
图3-2 前台用户添加购物车操作界面
3.1.3 前台用户购买商品模块
前台用户登陆鲜花线上销售管理系统后,可以将喜欢的商品添加到购物车后提交订单并进行支付购买。在鲜花线上销售平台上完成产品购买后可以对系统的服务、物流的速度、客服的态度等进行评分,并对产品进行相关的评论。鲜花线上销售管理系统用户下单操作界面如下图3-3所示。
图3-3前台用户购物操作界面
3.1.4前台用户个人订单管理模块
鲜花线上销售管理系统前台用户登陆系统后可以在个人订单管理模块中管理个人的订单信息。鲜花线上销售管理系统会自动根据订单的处理状态来显示当前订单状态,主要有有未付款、己付款待发货、己收货待评价己收货己评价等几种状态。鲜花线上销售管理系统前端用户个人订单管理操作界面如下图4-4所示。
图3-4前台用户个人订单管理操作界面
3.2后台功能模块的展示
3.2.1用户登录功能
鲜花线上销售管理系统后台用户如果想要对商城的相关信息进行管理操作,首先要登录系统,才可展开相关的操作。鲜花线上销售管理系统后台用户登陆界面如下图3-10所示。
图3-10用户登录操作界面
3.2.2用户管理功能
这个模块主要是对系统的用户进行管理,鲜花线上销售管理系统管理员用户登陆系统后,点击左边的用户管理菜单后可以进入用户信息管理界面。鲜花线上销售管理系统用户管理操作界面如下图3-11所示:
图3-11后台用户管理功能界面图
3.2.3一级分类管理功能
鲜花线上销售管理系统管理员用户登陆系统后,可以进入一级菜单进行相应的菜单信息管理。鲜花线上销售管理系统一级菜单操作界面如下图3-12所示。
图3-12鲜花销售一级菜单管理功能UI界面
3.2.4 后台商品二级分类管理操作UI
鲜花线上销售管理系统管理员用户登陆系统后,可以进入二级菜单进行相应的菜单信息管理。鲜花线上销售管理系统二级菜单操作界面如下图3-13所示。
图3-13鲜花销售二级菜单管理功能UI界面
3.2.5 后台商品管理操作UI
鲜花线上销售管理系统管理员用户登陆系统后,可以进入商品管理菜单进行相应的商品信息管理。其中主要包含商品的添加、修改、查询、删除操作等,添加商品时可以上传商品的图片进行展示。鲜花线上销售管理系统商品信息管理操作界面如下图3-14所示。
图3-14后台商品管理功能UI界面
3.2.6 后台商品订单管理操作UI
鲜花线上销售管理系统管理员用户登陆系统后,可以进入商品订单管理菜单进行相应的商品订单信息管理。其中主要包含商品订单的查询、订单明细的查看、订单发货、订单评论的回复及对评分的回复等,添加商品时可以上传商品的图片进行展示。鲜花线上销售管理系统商品信息管理操作界面如下图3-15所示。
图4-15后台订单管理功能UI界面
3.2.7 后台商品销量统计管理操作UI
鲜花线上销售管理系统管理员用户登陆系统后,可以进入销量统计管理菜单进行相应的商品销售情况进行统计查看。主要以图形报表方式进行展示,其中主要以饼状图和柱状态图的形态进行展示。展示的图片可以下载也可以在线打印操作。鲜花线上销售管理系统商品信息统计查看界面如下图3-16、3-17所示。
图3-16饼状图展示销售统计功能UI界面
图3-17柱状图展示销售统计功能UI界面
四,核心代码展示
package com.qst.controller; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.qst.beans.*; import com.qst.service.impl.*; import org.apache.commons.io.FileUtils; import org.apache.ibatis.annotations.Param; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.aspectj.weaver.ast.Or; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @Controller @RequestMapping("/admin") public class AdminController { @Autowired private AdminUserServiceImpl adminUserService; @Autowired private CategoryServiceImpl categoryService; @Autowired private CategorySecondServiceImpl secondService; @Autowired private ProductServiceImpl productService; @Autowired private OrderServiceImpl orderService; @Autowired private UserServiceImpl userService; @RequestMapping("/adminIndex") public String adminHome(){//到后台登录页 return "admin/index"; } @RequestMapping("/adminLogin") public String adminLogin(@Param("username") String username, @Param("password") String password, HttpServletRequest request){ AdminUser adminUser = new AdminUser(); adminUser.setUsername(username); adminUser.setPassword(password); AdminUser adminBynamePwd = adminUserService.getAdminBynamePwd(adminUser); System.out.println(adminBynamePwd==null?"查询到的用户信息为空":adminBynamePwd); /*登录成功就到管理页,否则就回到登录页*/ if (adminBynamePwd!=null) { request.getSession().setAttribute("enterAdmin",adminBynamePwd); return "/admin/home"; } return "/admin/index"; } /*------------------以下是管理员对用户的操作*/ @RequestMapping(value = ("/adminUser_findAllByPage") ) public String findAllUserByPage(@Param("page") Integer page,HttpServletRequest request){//查找商品并分页 PageUtils<User> userPageUtils = new PageUtils<>(); int limit = 5;//每页的记录数 if (page==null) page = 1; PageHelper.startPage(page,limit); List<User> userList = userService.findAll(); PageInfo<User> pageInfo = new PageInfo<>(userList);//得到分页信息 userPageUtils.setPage(page);//当前页 userPageUtils.setList(userList);//当前页的记录数 userPageUtils.setTotalPage(pageInfo.getPages());//所有的页数 request.setAttribute("userPageUtils", userPageUtils); return "/admin/user/list"; } /*跳转到某商品的编辑页面*/ @RequestMapping("/adminUser_edit") public String editUser(@RequestParam("id")Integer uid,HttpServletRequest request){ /*根据商品ID获取某商品*/ User user = userService.findById(uid); request.setAttribute("user",user); return "/admin/user/edit"; } /*保存商品修改信息,并重新上传*/ @RequestMapping("/adminUser_update") public String updateUser(User user,HttpServletRequest request)throws IOException { int save = userService.update(user); return "redirect: /admin/adminUser_findAllByPage"; } /*删除用户*/ @RequestMapping("/adminUser_delete") public String deleteUser(@Param("id") Integer uid, HttpServletRequest request){ /*删除数据库中的记录*/ int deleteByid = userService.deleteById(uid); return "redirect: /admin/adminUser_findAllByPage"; } /*-------以下是管理员对一级分类的操作*/ @RequestMapping("/adminGetAllCate") public String getAllCategory(HttpServletRequest request){/*查找所有一级分类*/ List<Category> categoryList = categoryService.findAll(); request.setAttribute("cList",categoryList); return "admin/category/list"; } @RequestMapping("/toAddCategory") public String toAddCategory(){ System.out.println("进入添加一级分类页面"); return "admin/category/add"; } /*像数据库添加一级分类*/ @RequestMapping(value="/addCategory_save" ) public String addCategory(Category category){ String cname = category.getCname(); System.out.println("添加一级分类:"+cname); int i = categoryService.addCategory(category); if(i>0){ System.out.println("添加"+category+"成功"); } return "redirect: /admin/adminGetAllCate"; } /*跳转到编辑一级分类页面*/ @RequestMapping("/adminCategory_edit") public String editCategory(@Param("cid") Integer cid,HttpServletRequest request){ /*从数据库中查找到此分类*/ Category cByid = categoryService.findCByid(cid); request.setAttribute("category",cByid); return "admin/category/edit"; } /*更新某一级分类*/ @RequestMapping("/adminCategory_update") public String updateCategory(Category category){ int i = categoryService.saveCategory(category); System.out.println(category.getCname()+"更新成功:"+i); return "redirect: /admin/adminGetAllCate"; } /*删除一级分类*/ @RequestMapping(value ="/adminCategory_delete") public String deleteCategory(@Param("cid") Integer cid){ /*删除一级分类之前先删除其下的二级分类*/ List<CategorySecond> categorySecondList = categoryService.findCSByCid(cid); for (CategorySecond cs:categorySecondList ) { System.out.println("要删除的二级分类:"+cs.getCsname()); int i = secondService.deleteById(cs.getCsid()); System.out.println("删除成功与否:"+i); } /*最后删除一级分类*/ int i = categoryService.deletByid(cid); System.out.println("一级分类删除成功与否:"+i); return "redirect: /admin/adminGetAllCate"; } /*-------以下是管理员对二级分类的操作*/ @RequestMapping("/adminCategorySecond_findAllByPage") public String findCSByPage(@Param("page") Integer page,HttpServletRequest request){/*查找所有二级分类并分页*/ PageUtils<CategorySecond> secondPageUtils = new PageUtils<>(); //查找所有二级分类并分页 int limit = 4;//每页分页记录数 if (page==null) page = 1; PageHelper.startPage(page,limit); List<CategorySecond> allCS = secondService.findAllCS(); PageInfo<CategorySecond> pageInfo = new PageInfo<>(allCS);//得到分页信息 secondPageUtils.setPage(page);//当前页 secondPageUtils.setList(allCS);//当前页的记录 secondPageUtils.setTotalPage(pageInfo.getPages());//所有页数 request.setAttribute("secondPageUtils",secondPageUtils); return "/admin/categorysecond/list"; } /*进入添加二级商品类目页面*/ @RequestMapping(value = "toAddCategorySecond") public String toAddCategorySecond(HttpServletRequest request){ List<Category> categoryList = categoryService.findAll(); request.setAttribute("categoryList",categoryList); return "/admin/categorysecond/add"; } /*添加二级商品类目*/ @RequestMapping(value = "addcategorySecond_save") public String addcategorySecond_save(CategorySecond categorySecond){ System.out.println("所添加的二级目录"+categorySecond); int save = secondService.add(categorySecond); if (save>0) System.out.println("添加二级目录"+categorySecond+"成功"); return "redirect: /admin/adminCategorySecond_findAllByPage"; } /*跳转到编辑二级分类页面*/ @RequestMapping("/adminCategorySecond_edit") public String editSecondCategory(@Param("csid") Integer csid,HttpServletRequest request){ /*从数据库中查找到此分类*/ CategorySecond categorySecond = secondService.findCSByid(csid); List<Category> categoryList = categoryService.findAll(); request.setAttribute("categoryList", categoryList); request.setAttribute("categorySecond",categorySecond); return "/admin/categorysecond/edit"; } /*更新某二级分类*/ @RequestMapping("/adminSecondCategory_update") public String updateSecondCategory(CategorySecond category){ secondService.update(category); return "redirect: /admin/adminCategorySecond_findAllByPage"; } /*------------------以下是管理员对商品的操作*/ @RequestMapping(value = ("/adminProduct_findAllByPage") ) public String findAllProByPage(@Param("page") Integer page,HttpServletRequest request){//查找商品并分页 PageUtils<Product> productPageUtils = new PageUtils<>(); int limit = 5;//每页的记录数 if (page==null) page = 1; PageHelper.startPage(page,limit); List<Product> productList = productService.findAll(); PageInfo<Product> pageInfo = new PageInfo<>(productList);//得到分页信息 productPageUtils.setPage(page);//当前页 productPageUtils.setList(productList);//当前页的记录数 productPageUtils.setTotalPage(pageInfo.getPages());//所有的页数 request.setAttribute("productPageUtils", productPageUtils); return "/admin/product/list"; } @RequestMapping("/toAddProduct") public String toAddProduct(HttpServletRequest request){//跳转到添加商品页面 //查找所有的二级分类 List<CategorySecond> categorySecondList = secondService.findAllCS(); request.setAttribute("csList",categorySecondList); return "/admin/product/add"; } /*++++++添加商品++++*/ @RequestMapping("/addProduct_save") public String addProduct(Product product,@RequestParam("upload") MultipartFile upload,HttpServletRequest request)throws Exception{ product.setPdate(new Date()); product.setIs_hot(0); String realPath = request.getServletContext().getRealPath("/products"); System.out.println(realPath); String originalFilename = upload.getOriginalFilename(); File diskFile = new File(realPath + "//"+ originalFilename); System.out.println("目标文件:"+diskFile.getAbsolutePath()); //将上传的实体文件复制到指定目录upload下 upload.transferTo(diskFile); product.setImage("products/"+originalFilename); System.out.println("收到的商品:"+product); //将信息保存到数据库 int save = productService.save(product); System.out.println(product.getPname()+"保存是否成功:"+save); return "redirect: /admin/adminProduct_findAllByPage"; } /*删除产品*/ @RequestMapping("/adminProduct_delete") public String deleteProduct(@Param("pid") Integer pid, HttpServletRequest request){ /* 删除上传文件图片*/ Product product = productService.findById(pid); String path = product.getImage(); if(path!=null) { String realPath = request.getServletContext().getRealPath("/" + path); File file = new File(realPath); file.delete(); } /*删除数据库中的记录*/ int deleteByid = productService.deleteByid(pid); return "redirect: /admin/adminProduct_findAllByPage"; } /*跳转到某商品的编辑页面*/ @RequestMapping("/adminProduct_edit") public String editProduct(@RequestParam("pid")Integer pid,HttpServletRequest request){ /*根据商品ID获取某商品*/ Product product = productService.findById(pid); System.out.println(product); request.setAttribute("product",product); /*所有二级分类*/ List<CategorySecond> allCS = secondService.findAllCS(); request.setAttribute("csList",allCS); return "/admin/product/edit"; } /*保存商品修改信息,并重新上传*/ @RequestMapping("/adminProduct_update") public String updateProduct(Product product, @RequestParam("upload")MultipartFile upload, HttpServletRequest request)throws IOException { product.setPdate(new Date()); if(upload.getSize() >=0){ /*删除 目录中的文件,然后重新上传 * 以及更新数据库中的记录*/ String path = product.getImage(); if (path != null){ String realPath = request.getServletContext().getRealPath("/" + path); File file = new File(realPath); file.delete(); } String realPath = request.getServletContext().getRealPath("/products"); String originalFilename = upload.getOriginalFilename(); File diskFile = new File(realPath + "//"+ originalFilename); //将上传的实体文件复制到指定目录upload下 upload.transferTo(diskFile); product.setImage("products/"+originalFilename); } System.out.println("商品:"+product); //将信息保存到数据库 int save = productService.update(product); return "redirect: /admin/adminProduct_findAllByPage"; } /*---------------以下是管理员对订单的管理,只能修改订单的状态*/ @RequestMapping("/adminOrder_findAllByPage") public String findAllOrderPage(@Param("page") Integer page, HttpServletRequest request){ PageUtils<Order> orderPageUtils = new PageUtils<>(); if (page == null) page = 1; PageHelper.startPage(page,5); List<Order> allOrder = orderService.getAllOrder(); PageInfo<Order> pageInfo = new PageInfo<>(allOrder); orderPageUtils.setList(allOrder); orderPageUtils.setPage(page); orderPageUtils.setTotalPage(pageInfo.getPages()); request.setAttribute("orderPageUtils",orderPageUtils); return "/admin/order/list"; } /*根据订单编号查找订单项*/ @RequestMapping(value = "/adminOrderItem_findById") @ResponseBody public List<OrderItem> findItemsById(@RequestBody Order order, HttpServletRequest request){ System.out.println("所需查找的订单项ID:"+order.getOid()); List<OrderItem> orderItemSet = orderService.findByOid(order.getOid()); for (OrderItem orderitem: orderItemSet ) { System.out.println(orderitem); } // request.setAttribute("orderItems",orderItemSet); // return "/admin/order/orderItem"; return orderItemSet; } @RequestMapping("/export_product_info") public void exportProductInfo(HttpServletResponse response)throws IOException{ response.setCharacterEncoding("UTF-8"); List<Product> productList = productService.findAll(); System.out.println(productList); /*创建excel文件*/ //创建excel文件 HSSFWorkbook wb = new HSSFWorkbook(); //创建sheet页 HSSFSheet sheet = wb.createSheet("商品信息表"); //创建标题行 HSSFRow titleRow = sheet.createRow(0); titleRow.createCell(0).setCellValue("商品名称"); titleRow.createCell(1).setCellValue("平台价格"); titleRow.createCell(2).setCellValue("市场价格"); titleRow.createCell(3).setCellValue("图片目录"); titleRow.createCell(4).setCellValue("商品广告词"); titleRow.createCell(5).setCellValue("销售量"); titleRow.createCell(6).setCellValue("添加日期"); titleRow.createCell(7).setCellValue("所属目录"); for(Product product : productList){ HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum()+1); dataRow.createCell(0).setCellValue(product.getPname()); dataRow.createCell(1).setCellValue(product.getShop_price()); dataRow.createCell(2).setCellValue(product.getMarket_price()); dataRow.createCell(3).setCellValue(product.getImage()); dataRow.createCell(4).setCellValue(product.getIs_hot()); dataRow.createCell(5).setCellValue(product.getPdesc()); dataRow.createCell(6).setCellValue(product.getPdate()); dataRow.createCell(7).setCellValue(product.getCsid()); } // 设置下载时客户端Excel的名称 String filename =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ".xls"; response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + filename); OutputStream ouputStream = response.getOutputStream(); wb.write(ouputStream); ouputStream.flush(); ouputStream.close(); } /** * 退出系统 * @param request * @return */ @RequestMapping("/exit") public String exit(HttpServletRequest request){ request.getSession().invalidate(); return "/admin/index"; } }
package com.qst.controller; import com.qst.beans.DayIn; import com.qst.beans.Product; import com.qst.service.impl.OrderServiceImpl; import com.qst.service.impl.ProductServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; @Controller @RequestMapping("/echart") public class AdminTongjiBijiao { @Resource private OrderServiceImpl orderService; @Autowired private ProductServiceImpl productService;/*is_hot就是商品加入购物车次数【未实现数据统一】,就是购买次数*/ /*得到所有已被销售商品的销售情况*/ @RequestMapping(value = "/adminEachartzhu") @ResponseBody public List<Product> getAllXiaoshou(){ System.out.println("柱状图数据统计请求"); /** * 得到各商品名称和商品销售数量(本应该让product表与orderitem表关联统计) */ List<Product> productList = productService.findAll(); List<Product> products= new ArrayList<>(); // List<Map<String,Integer>> products = new ArrayList<>(); for (Product p:productList ) { System.out.print(p.getIs_hot()); if (p.getPname()!=null&&p.getPname()!=""&&p.getIs_hot()!=null&&p.getIs_hot()>0){ // Map<String,Integer> map = new HashMap<>(); // map.put(p.getPname(),p.getIs_hot()); products.add(p); // products.add(map); } } return products; } /*跳转到销售柱状图页面*/ @RequestMapping(value = "/toadminEachartzhu") public String toAdminEchart(){ return "/admin/echart/xiaoshouZhu"; } /*跳转到销售饼状图页面*/ @RequestMapping(value = "/toadminEachartBin") public String toadminEachartzhu2(){ return "admin/echart/xiaoshouBin"; } /*管理员权限查询近日订单金额*/ @RequestMapping(value = "/getAllOrdersComeInByDate") @ResponseBody public List<DayIn> getAllOrdersComeInByDate(){ System.out.println("管理员权限查询近日订单金额"); List<DayIn> ordersComeInByDate = orderService.getAllOrdersComeInByDate(); for (DayIn map:ordersComeInByDate){ System.out.println(map); } return ordersComeInByDate; } }
五,项目总结
鲜花线上销售管理系统在设计之初就选择了自己在技术上相对熟悉的Java语言为基础,在众多的Java技术平台中选中spring框架来进行整体设计,作为系统的基础开发主框架。鲜花线上销售管理系统采用 springmvc有效的将模型和视图进行分离。鲜花线上销售管理系统在数据持久化操作封装上,则毫无保留的选用Mybatis框架,它呢对鲜花线上销售管理系统的数据底层的JDBC操作进行有效的封装,减化了开发难度,提高了开发效率。鲜花线上销售管理系统前端数据展示选用以JSP进行页面展示,同时配合JavaScript脚本和CSS样式来进行页面数据的美化和交互设计,并且为了提升系统的执行效率和性能使用了AJAX异步交互,主要基于jquery封装的相关函数来实现。鲜花线上销售管理系统整体功能设计严格按照鲜花线上销售管理系统需求分析的功能要求和鲜花线上销售管理系统非功能性要求来进行开发实现。