网站广告


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:

  根据传入的条件查询先去查询缓存,若无在去查询表中广告信息。