网站广告
1.需求:
客户端:首页、发现页展示的轮播广告,广告信息由后台系统配置,要求可以展示图片、点击图片可跳转链接等功能。
后台管理:进入广告配置管理页面,根据页面要求输入对应的查询条件,点击【查询】按钮,将符合条件的数据显示到查询结果列表,查询结果列表中的产品数据可以进行修改、排序、上下架、删除操作
2.代码实现:
后台:
2.1广告信息的新增:
图片信息放进入库、Redis缓存;前端展示广告是直接请求服务器地址(后端也可以直接将图片信息经Base64编码Str信息返回,前端作解码展示)。
图片上传:
1 /** 2 * 图片上传 3 * @param textName 二进制图片信息 4 * @param request 5 * @param resp 6 */ 7 @RequestMapping("/upImages") 8 public Status addimage(@RequestParam MultipartFile textName, HttpServletRequest request, HttpServletResponse resp) { 9 resp.setCharacterEncoding("utf-8"); 10 resp.setContentType("text/html"); 11 Status status = new Status(); 12 try { 13 String flag = request.getParameter("flag"); 14 ImageUtilService.upImg(status, textName, flag); 15 } 16 catch (Exception e) { 17 log.info("上传图片失败:" + e); 18 status.setStatusCode("0"); 19 status.setStatusMessage("上传图片失败!"); 20 } 21 return status; 22 }
1 @Override 2 public void upImg(Status status, MultipartFile textName, String flag) { 3 Map < Object, Object > map = new HashMap < Object, Object >(); 4 5 String adsPic = null; 6 //广告上传标识 7 if ("7".equals(flag)) { 8 adsPic = env.getProperty("advertiseImage") + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) 9 + Tools.createRandomCode(5) + ".jpg"; 10 11 // 为图片设置前缀 management/image/advertise2020-08-0101362.jpg 12 //从yml文件中读取配置信息 13 adsPic = (env.getProperty("picture.prefix") + "/") + adsPic; 14 log.info("上传图片的路径:{}", adsPic); 15 String picUrl = "";// 图片路径 16 try { 17 InputStream ips = textName.getInputStream(); 18 //ip 路径 数据 19 baseFileUtil.uploadStream(env.getProperty("cmsp.file.oss.bucketName"), adsPic, ips); 20 ips.close(); 21 String urlString = baseFileUtil.getUrl(env.getProperty("cmsp.file.oss.bucketName"), adsPic); 22 if (urlString.indexOf("?") > 0) { 23 //获取图片服务器地址 http://insurance.cc2gxj.cn/nas/bucket-uat-lx-zt/management/image/advertise2020-08-0101362.jpg 24 urlString = urlString.substring(0, urlString.indexOf("?")); 25 } 26 System.out.println(urlString); 27 picUrl = urlString;// "http://" + env.getProperty("cmsp.file.oss.serverAddress") + "/" + adsPic; 28 log.info("上传图片路径:" + picUrl); 29 if (picUrl.equals("")) { 30 status.setStatusCode("0"); 31 status.setStatusMessage("上传图片失败!"); 32 } 33 else { 34 map.put("picUrl", picUrl); 35 status.setReturns(map); 36 status.setStatusCode("1"); 37 status.setStatusMessage("上传图片成功!"); 38 } 39 40 } 41 catch (IOException e) { 42 log.info("上传图片失败:" + e); 43 status.setStatusCode("0"); 44 status.setStatusMessage("上传图片失败!"); 45 } 46 }
保存信息:
1 /** 2 * 广告新增 3 * 4 * @param req 5 * @param resp 6 */ 7 @PostMapping("/addAdver") 8 @ResponseBody 9 //AOP 用于记录用户操作轨迹 10 @Operation(category = OperationCategory.SLIDE_SHOW, type = OperationType.ADD) 11 public Status addAdverInfo(@RequestBody AdvertiseInfo advertiseInfo) { 12 Status status = new Status(); 13 try { 14 advertiseService.addAdver(status, advertiseInfo); 15 } 16 catch (Exception e) { 17 status.setStatusCode("0"); 18 status.setStatusMessage("【增加广告】参数解析异常!!!"); 19 log.error("app新增广告失败!!!" + e.getMessage()); 20 } 21 status.setTransTime(DateTime.getTimeString()); 22 return status; 23 }
1 @Override 2 public void addAdver(Status status, AdvertiseInfo advertiseInfo) { 3 String orignUrlString = advertiseInfo.getImgUrl(); 4 advertiseInfo.setDateCreated(new Date()); 5 advertiseInfo.setDateUpdated(new Date()); 6 advertiseInfo.setIsDelete("0"); 7 String[] urls = advertiseInfo.getImgUrl().split(env.getProperty("env.product.aliyun.oss.bucketName") + "/"); 8 advertiseInfo.setImgUrl(urls[1]); 9 int i = advertiseInfoMapper.insert(advertiseInfo); 10 advertiseInfo.setImgUrl(orignUrlString); 11 //缓存 RedisTemplate < String, String > adverRedisCache; 12 String adverText = (String) adverRedisCache.opsForValue().get(env.getProperty("adverText.prefix")); 13 if (StringUtils.isBlank(adverText)) { 14 com.alibaba.fastjson.JSONArray jsonArray1 = new com.alibaba.fastjson.JSONArray(); 15 jsonArray1.add(JSON.toJSONString(advertiseInfo)); 16 adverRedisCache.opsForValue().set(env.getProperty("adverText.prefix"), JSON.toJSONString(jsonArray1)); 17 } 18 else { 19 com.alibaba.fastjson.JSONArray jsonArray1 = com.alibaba.fastjson.JSONArray.parseArray(adverText); 20 jsonArray1.add(JSON.toJSONString(advertiseInfo)); 21 adverRedisCache.opsForValue().set(env.getProperty("adverText.prefix"), JSON.toJSONString(jsonArray1)); 22 } 23 Map < Object, Object > mapLi = new HashMap < Object, Object >(); 24 if (i > 0) { 25 mapLi.put("list", i); 26 status.setReturns(mapLi); 27 status.setStatusCode("1"); 28 status.setStatusMessage("增加广告成功!!!"); 29 log.info("增加广告成功!!!"); 30 } 31 else { 32 mapLi.put("list", i); 33 status.setReturns(mapLi); 34 status.setStatusCode("0"); 35 status.setStatusMessage("增加广告失败!!!"); 36 log.info("增加广告失败!!!"); 37 } 38 }
2.2广告信息的修改:
根据id将查询,修改完信息,刷新Redis缓存;
2.3广告信息的删除:
根据id删除广告信息,刷新Redis缓存;
2.4广告信息的查询:
根据输入/选择的条件查询数据库(app端是先查询缓存)。
1 /** 2 * 根据条件查询广告列表 3 * 4 * @param req 5 * @param resp 6 */ 7 @PostMapping("/findAdvertise") 8 @ResponseBody 9 public Status findAdverText(@RequestBody AdverFindDto adverFindDto) { 10 Status status = new Status(); 11 try { 12 13 log.info("【根据条件查询数据库数据】请求报文:" + adverFindDto.toString()); 14 advertiseService.getAdverInfo(status, adverFindDto); 15 } 16 catch (Exception e) { 17 status.setStatusCode("0"); 18 status.setStatusMessage("【根据条件查询数据库数据】参数解析异常!!!" + e.getMessage()); 19 } 20 status.setTransTime(DateTime.getTimeString()); 21 return status; 22 }
1 @Override 2 public void getAdverInfo(Status status, AdverFindDto dto) { 3 Map < Object, Object > returns = new HashMap < Object, Object >(); 4 //Pager自定义分页封装类 5 Pager < AdvertiseInfo > pager = new Pager < AdvertiseInfo >(); 6 // 根据条件查询AdvertiseInfo表 limit实现分页(limit 起始行 每页记录数) 7 dto.setStartIndex((dto.getPageIndex() - 1) * dto.getPageSize()); 8 //查询每页数据 总数 9 List < AdvertiseInfo > list = advertiseInfoMapper.selectAdvertiseInfo(dto); 10 int num = advertiseInfoMapper.selectNewCount(dto); 11 list.forEach(e -> { 12 e.setImgUrl(ImageUtilService.getPicUrlPrefix() + e.getImgUrl()); 13 }); 14 status.setStatusCode("1"); 15 status.setStatusMessage("根据条件查询数据库数据成功!!!"); 16 pager.setPageSize(dto.getPageSize()); 17 pager.setPageNo(dto.getPageIndex()); 18 pager.setEntityCount(num); 19 pager.setEntities(list == null ? new ArrayList < AdvertiseInfo >() : list); 20 returns.put("pager", pager); 21 status.setReturns(returns); 22 }
1 2
2.5广告信息的上/下架:
根据id将对应广告信息的isUse(上下架标识)更新,刷新Redis缓存;
2.6广告信息的上/下移/置顶:
上移:未上线/sort值最小的不可上移;按sort升序查询出广告List遍历:定位到要上移的广告,将它和上条广告的sort值互换,刷新Redis缓存;
下移:未上线/sort值最大的不可下移;按sort升序查询出广告List遍历:定位到要下移的广告,将它和下条广告的sort值互换,刷新Redis缓存;
置顶:未上线/sort值最小的不可置顶;按sort升序查询出广告List遍历(size-1):将广告的sort值顺延(i+1的)(置顶的break),在将需要置顶的那条sort置为最小min(sort),刷新Redis缓存;
APP:
根据传入的条件查询先去查询缓存,若无在去查询表中广告信息。