毕业设计|SpringMVC+Vue项目运动品交易商城

末获取源码
开发语言:Java
开发工具:IDEA /Eclipse
数据库:MYSQL5.7
应用服务:Tomcat7/Tomcat8
使用框架ssm+vue
JDK版本:jdk1.8
前言介绍 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多商城的之中,随之就产生了“运动品交易商城”,这样就让运动品交易商城更加方便简单。
对于本运动品交易商城的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据运动品交易商城的现状来进行开发的,具体根据现实的需求来实现运动品交易商城网络化的管理,各类信息有序地进行存储,进入运动品交易商城页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、商品类别管理、商品信息管理、明星同款管理、出库信息管理、入库信息管理、配送信息管理、日志信息管理、用户管理、留言板管理、论坛管理、系统管理、订单管理。用户前台:首页、商品信息、明星同款、论坛、留言板、个人中心、后台管理。用户后台:首页、个人中心、我的收藏管理、订单管理等功能。
系统功能需求分析 对于一个新的网站来说开发新网站我们就要做出这个系统的任务需求分析,因为对系统分析的质量好坏它可以决定这个网站开发的意义,俗话说得好一个好的开头是成功的一半,对于开发这个运动品交易商城来说前期的分析是比较重要的,所以任务分析它可以决定这系统的开展和设计,这样就可以保证用户满意性。
任务的需求它能决定这个系统开发过程当中一个重要环节,所以我们在系统开发过程所用质量是比较重要的,因为我们在系统应用过程当中不一定那会出现问题,所以我们在进行对系统分析是比较重要的,因为它可以决定这个系统功能和需求。
本系统要求实现一套运动品交易商城的开发与实现,主要实现功能包括管理员:首页、个人中心、商品类别管理、商品信息管理、明星同款管理、出库信息管理、入库信息管理、配送信息管理、日志信息管理、用户管理、留言板管理、论坛管理、系统管理、订单管理。用户前台:首页、商品信息、明星同款、论坛、留言板、个人中心、后台管理。用户后台:首页、个人中心、我的收藏管理、订单管理。
(1)管理员用例需求如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


(2)用户前台用例需求如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


(3)用户后台用例需求如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


系统的功能结构图 通过系统需求分析,本运动品交易商城主要实现功能包括
【毕业设计|SpringMVC+Vue项目运动品交易商城】管理员:首页、个人中心、商品类别管理、商品信息管理、明星同款管理、出库信息管理、入库信息管理、配送信息管理、日志信息管理、用户管理、留言板管理、论坛管理、系统管理、订单管理。
用户前台:首页、商品信息、明星同款、论坛、留言板、个人中心、后台管理。
用户后台:首页、个人中心、我的收藏管理、订单管理等功能。其功能结构图如下图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

系统功能实现 用户前台 用户通过输入账号,密码,等信息进行系统登录,如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

个人中心进行填写个人信息、信息修改并进行添加、删除、修改以及查看个人中心等等操作如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

在系统首页可以查看,首页,商品信息,明星同款,论坛,留言板,个人中心,后台管理等内容,如图


商品信息详情,在商品信息详情页面可以查看商品编号、商品名称、商品类别、数量、价格等内容,如图

商品信息详情界面图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


我的订单,在我的订单页面可以查看商品、名称、单价、数量、总价、收货地址、状态等内容,如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

地址列表,在地址列表页面可以查看商品、名称、价格、数量、总价等内容,如图所示
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

用户后台功能模块用户进入个人中心可以添加、修改、查看原密码、新密码、确认密码等操作。个人中心效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


用户对个人信息进行查看用户名、用户姓名、密码、性别、联系电话等操作。个人信息效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

用户对我的收藏管理进行查看索引、收藏ID、收藏名称、收藏图片等操作。我的收藏管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

用户对订单管理进行查看订单编号、商品名称、商品图片、购买数量、价格等操作。订单管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员功能实现管理员登录,通过填写用户名、密码、验证码等信息,输入完成后选择登录即可进入运动品交易商城,如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对个人中心进行操作填写原密码、新密码、确认密码并进行添加、删除、修改以及查看。个人中心效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对商品类别管理查看商品类别进行详情、删除、修改、查看等操作。商品类别管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对商品信息管理进行编辑索引、商品编号、商品名称、商品类别、图片、数量、价格等信息进行添加、删除、修改、查看等操作。商品信息管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对出库信息管理进行编辑索引、商品编号、商品名称、数量、登记时间、图片等信息进行添加、删除、修改、查看等操作。出库信息管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对日志信息管理进行编辑索引、标题、登记时间、等信息进行添加、删除、修改、查看等操作。日志信息管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对用户管理进行编辑索引、用户名、用户姓名、密码、性别、联系电话等信息进行添加、删除、修改、查看等操作。用户管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


管理员对留言板管理进行编辑索引、用户名、留言内容、回复内容等信息进行添加、删除、修改、查看等操作。留言板管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片

管理员对订单管理进行编辑订单编号、商品名称、商品图片、购买数量、价格等信息进行添加、删除、修改、查看等操作。订单管理效果图如图
毕业设计|SpringMVC+Vue项目运动品交易商城
文章图片


部分核心代码:controller层
/** * 商品信息评论表 * 后端接口 * @author * @email * @date 2020-11-13 14:48:16 */ @RestController @RequestMapping("/discussshangpinxinxi") public class DiscussshangpinxinxiController { @Autowired private DiscussshangpinxinxiService discussshangpinxinxiService; /** * 后端列表 */ @RequestMapping("/page") public R page(@RequestParam Map params,DiscussshangpinxinxiEntity discussshangpinxinxi, HttpServletRequest request){EntityWrapper ew = new EntityWrapper(); PageUtils page = discussshangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussshangpinxinxi), params), params)); return R.ok().put("data", page); }/** * 前端列表 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map params,DiscussshangpinxinxiEntity discussshangpinxinxi, HttpServletRequest request){ EntityWrapper ew = new EntityWrapper(); PageUtils page = discussshangpinxinxiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussshangpinxinxi), params), params)); return R.ok().put("data", page); } /** * 列表 */ @RequestMapping("/lists") public R list( DiscussshangpinxinxiEntity discussshangpinxinxi){ EntityWrapper ew = new EntityWrapper(); ew.allEq(MPUtil.allEQMapPre( discussshangpinxinxi, "discussshangpinxinxi")); return R.ok().put("data", discussshangpinxinxiService.selectListView(ew)); }/** * 查询 */ @RequestMapping("/query") public R query(DiscussshangpinxinxiEntity discussshangpinxinxi){ EntityWrapper< DiscussshangpinxinxiEntity> ew = new EntityWrapper< DiscussshangpinxinxiEntity>(); ew.allEq(MPUtil.allEQMapPre( discussshangpinxinxi, "discussshangpinxinxi")); DiscussshangpinxinxiView discussshangpinxinxiView =discussshangpinxinxiService.selectView(ew); return R.ok("查询商品信息评论表成功").put("data", discussshangpinxinxiView); } /** * 后端详情 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id){ DiscussshangpinxinxiEntity discussshangpinxinxi = discussshangpinxinxiService.selectById(id); return R.ok().put("data", discussshangpinxinxi); }/** * 前端详情 */ @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") Long id){ DiscussshangpinxinxiEntity discussshangpinxinxi = discussshangpinxinxiService.selectById(id); return R.ok().put("data", discussshangpinxinxi); }/** * 后端保存 */ @RequestMapping("/save") public R save(@RequestBody DiscussshangpinxinxiEntity discussshangpinxinxi, HttpServletRequest request){ discussshangpinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(discussshangpinxinxi); discussshangpinxinxiService.insert(discussshangpinxinxi); return R.ok(); }/** * 前端保存 */ @RequestMapping("/add") public R add(@RequestBody DiscussshangpinxinxiEntity discussshangpinxinxi, HttpServletRequest request){ discussshangpinxinxi.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue()); //ValidatorUtils.validateEntity(discussshangpinxinxi); discussshangpinxinxiService.insert(discussshangpinxinxi); return R.ok(); }/** * 修改 */ @RequestMapping("/update") public R update(@RequestBody DiscussshangpinxinxiEntity discussshangpinxinxi, HttpServletRequest request){ //ValidatorUtils.validateEntity(discussshangpinxinxi); discussshangpinxinxiService.updateById(discussshangpinxinxi); //全部更新 return R.ok(); }/** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] ids){ discussshangpinxinxiService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); }/** * 提醒接口 */ @RequestMapping("/remind/{columnName}/{type}") public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, @PathVariable("type") String type,@RequestParam Map map) { map.put("column", columnName); map.put("type", type); if(type.equals("2")) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); Date remindStartDate = null; Date remindEndDate = null; if(map.get("remindstart")!=null) { Integer remindStart = Integer.parseInt(map.get("remindstart").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindStart); remindStartDate = c.getTime(); map.put("remindstart", sdf.format(remindStartDate)); } if(map.get("remindend")!=null) { Integer remindEnd = Integer.parseInt(map.get("remindend").toString()); c.setTime(new Date()); c.add(Calendar.DAY_OF_MONTH,remindEnd); remindEndDate = c.getTime(); map.put("remindend", sdf.format(remindEndDate)); } }Wrapper wrapper = new EntityWrapper(); if(map.get("remindstart")!=null) { wrapper.ge(columnName, map.get("remindstart")); } if(map.get("remindend")!=null) { wrapper.le(columnName, map.get("remindend")); }int count = discussshangpinxinxiService.selectCount(wrapper); return R.ok().put("count", count); } }

登陆拦截功能实现
/** * 权限(Token)验证 */ @Component public class AuthorizationInterceptor implements HandlerInterceptor { public static final String LOGIN_TOKEN_KEY = "Token"; @Autowired private TokenService tokenService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //支持跨域请求 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with,request-source,Token, Origin,imgType, Content-Type, cache-control,postman-token,Cookie, Accept,authorization"); response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); IgnoreAuth annotation; if (handler instanceof HandlerMethod) { annotation = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class); } else { return true; } //从header中获取token String token = request.getHeader(LOGIN_TOKEN_KEY); /** * 不需要验证权限的方法直接放过 */ if(annotation!=null) { return true; }TokenEntity tokenEntity = null; if(StringUtils.isNotBlank(token)) { tokenEntity = tokenService.getTokenEntity(token); }if(tokenEntity != null) { request.getSession().setAttribute("userId", tokenEntity.getUserid()); request.getSession().setAttribute("role", tokenEntity.getRole()); request.getSession().setAttribute("tableName", tokenEntity.getTablename()); request.getSession().setAttribute("username", tokenEntity.getUsername()); return true; }PrintWriter writer = null; response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); try { writer = response.getWriter(); writer.print(JSONObject.toJSONString(R.error(401, "请先登录"))); } finally { if(writer != null){ writer.close(); } } //throw new EIException("请先登录", 401); return false; } }

文件上传功能
/** * 上传文件映射表 */ @RestController @RequestMapping("file") @SuppressWarnings({"unchecked","rawtypes"}) public class FileController{ @Autowired private ConfigService configService; /** * 上传文件 */ @RequestMapping("/upload") public R upload(@RequestParam("file") MultipartFile file, String type,HttpServletRequest request) throws Exception { if (file.isEmpty()) { throw new EIException("上传文件不能为空"); } String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1); String fileName = new Date().getTime()+"."+fileExt; File dest = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName); file.transferTo(dest); if(StringUtils.isNotBlank(type) && type.equals("1")) { ConfigEntity configEntity = configService.selectOne(new EntityWrapper().eq("name", "faceFile")); if(configEntity==null) { configEntity = new ConfigEntity(); configEntity.setName("faceFile"); configEntity.setValue(fileName); } else { configEntity.setValue(fileName); } configService.insertOrUpdate(configEntity); } return R.ok().put("file", fileName); } /** * 下载文件 */ @IgnoreAuth @RequestMapping("/download") public void download(@RequestParam String fileName, HttpServletRequest request, HttpServletResponse response) { try { File file = new File(request.getSession().getServletContext().getRealPath("/upload")+"/"+fileName); if (file.exists()) { response.reset(); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName+"\""); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(FileUtils.readFileToByteArray(file), response.getOutputStream()); } } catch (IOException e) { e.printStackTrace(); } } }


    推荐阅读