• 0907小众网,续0906,SSM前后端项目,思路,报错(重点)


    • 我们现在要实现单击加载出来的某个子项,跳转到相应的detail详情页

      • 思路:我们需要获取到所点击书本的id,将id传给控制层
      • 我们在控制层使用的是@PathVariable注解来绑定URL中的参数占位符(映射 url 路径中的变量

       前端获取到id之后,路径上需要注意,/xzw没加路径访问不到(没整明白)

    •  到这里,我们已经实现了详情页的跳转,因为是页面的跳转,我们不要通过ajax,接下来,去编写实现详情页展示的内容

    • 跳转缓过来的时候,页面布局不对劲,模板css和js,bootstrap都加载不出,并且图片路径都不对,需要在引入时路劲前面加上/xzw/,

      1. <link rel="stylesheet" href="/xzw/resources/bootstrap/bootstrap.css">
      2. <link rel="stylesheet" href="/xzw/resources/raty/lib/jquery.raty.css">
      3. <script src="/xzw/resources/jquery.3.3.1.min.js">script>
      4. <script src="/xzw/resources/bootstrap/bootstrap.min.js">script>
      5. <script src="/xzw/resources/raty/lib/jquery.raty.js">script>
       当我们把id传到后台去进行查询的时候,在业务层,参数也传过去了,但是返回值却是null,在这里卡了两个小时,最后发现是实体类没有写注解(@TableName("book"),主键@TableId(type = IdType.AUTO,所以自己一定要注意,现在用的是框架,如果你不写注解,调用BaseMapper里面自带的方法时,是找不到的,所以,切记,切记,,页面上此时加载的全是代码,这是因为数据库的头像图片地址是空的,加上就可以了
    •  在使用星型组件,配置他的初始化图片目录的时候,也需要加上/xzw/

     

    我们是先显示了所有和书本表有关的信息,会员名称还没有显示,那么我们要如何去将会员名称显示出来呢?评论表当中有书本和会员两张表的外键,所以我们可以多加两个对象属性,但是我们让他在自动加载SQL的时候不自动生成

    1. @TableField(exist = false)//表示表中不存在对应字段,不会参与到SQL的自动生成
    2. private Book book;//这个对象需要我们自己手动查询得到
    3. @TableField(exist = false)//表示表中不存在对应字段,不会参与到SQL的自动生成
    4. private Member member;//这个对象需要我们自己手动查询得到

     但是当我在写member类的时候,由于大意修改,没有将属性名nickname和他对应的get,set方法的方法名写成一致的,导致报了错,找了很久,所以这里要注意

     然后,我们在评价业务层当中,需要根据评论集合当中的单个评论对应的会员id去查对应会员的属性,然后再去给刚刚定义好的member会员对象属性初始化,所以需要用到遍历。

    1. @Override
    2. public List getEvaluationByBookId(Long bookId) {
    3. QueryWrapper queryWrapper = new QueryWrapper();
    4. queryWrapper.eq("book_id",bookId);
    5. queryWrapper.eq("state","enable");
    6. queryWrapper.orderByDesc("create_time");
    7. List evaluationList = evaluationMapper.selectList(queryWrapper);
    8. Book book = bookMapper.selectById(bookId);
    9. for (Evaluation evaluation : evaluationList) {
    10. Member member = memberMapper.selectById(evaluation.getMemberId());
    11. evaluation.setMember(member);
    12. evaluation.setBook(book);
    13. }
    14. return evaluationList;
    15. }

    这一步完成之后,我们需要在控制层通过modelandview对象,将初始化的评论list加到session当中,后续在页面中,通过freemarker模板中的循环遍历显示所有的评论

    1. //单击某本书,跳转到详情
    2. // 根据图书id,拿到所有评论
    3. @GetMapping("/book/{bookId}")
    4. public ModelAndView displayBookDetail(@PathVariable("bookId")Long bookId){
    5. ModelAndView mav = new ModelAndView("/detail");
    6. Book book = bookService.getBookById(bookId);
    7. List evaluationList = evaluationService.getEvaluationByBookId(bookId);
    8. mav.addObject("book",book);
    9. mav.addObject("evaluationList",evaluationList);
    10. return mav;
    11. }

     这样详情及评论效果就实现了

     验证码功能的实现

    • 导入的依赖
        1. <dependency>
        2. <groupId>com.github.pengglegroupId>
        3. <artifactId>kaptchaartifactId>
        4. <version>2.3.2version>
        5. dependency>
    •  在applicationContext.xml里面配置kaptcha:验证码的宽度,高度,字符等
        1. <bean id="defaultKaptcha" class="com.google.code.kaptcha.impl.DefaultKaptcha">
        2. <property name="config">
        3. <bean class="com.google.code.kaptcha.util.Config">
        4. <constructor-arg>
        5. <props>
        6. <prop key="kaptcha.border">noprop>
        7. <prop key="kaptcha.image.width">120prop>
        8. <prop key="kaptcha.textproducer.font.color">blueprop>
        9. <prop key="kaptcha.textproducer.font.size">40prop>
        10. <prop key="kaptcha.textproducer.char.length">4prop>
        11. props>
        12. constructor-arg>
        13. bean>
        14. property>
        15. bean>
    •  然后需要写一个专门用来生成验证码的Controller,需要用的时候,直接拿来用就行,不需要自己会写,
        1. @Controller
        2. public class KaptchaController {
        3. @Autowired
        4. private Producer defaultKaptcha;//这个名字要和主配置文件里面的相同
        5. @GetMapping("verify_code")
        6. public void createVerifycode(HttpServletRequest request, HttpServletResponse response)throws Exception{
        7. response.setDateHeader("Expires",0); //响应立即过期
        8. //不缓存任何图片
        9. response.setHeader("Cache-Control","no-store,no-cache,must-revalidate");
        10. response.setHeader("Cache-Control","post-check=0,pre-check=0");
        11. response.setHeader("Pragma","no-cache");
        12. response.setContentType("image/png");
        13. //生成验证码文本
        14. String verifyCode=defaultKaptcha.createText();
        15. request.getSession().setAttribute("verifyCode",verifyCode);
        16. System.out.println(request.getSession().getAttribute("verifyCode"));
        17. //转图片
        18. BufferedImage image = defaultKaptcha.createImage(verifyCode);//创建验证码图片
        19. ServletOutputStream outputStream = response.getOutputStream();
        20. //ImageIO.setUseCache(false); 有的不加此,会报错
        21. ImageIO.write(image,"png",outputStream);//输出图片流
        22. outputStream.flush();
        23. outputStream.close();
        24. }
        25. }
    •  效果如图

  • 相关阅读:
    JVM 运行时数据区和垃圾收集算法
    Python——操作MySQL数据库
    一小时入门proteus使用教程
    Spark案例实际操作
    红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远程控制软件总结
    竞赛 机器视觉人体跌倒检测系统 - opencv python
    android Room数据库使用之多List<Object>并存。
    【杭电多校第四场 B题】最短路图+缩点dp
    【计算机网络】数据链路层
    vue中使用qrcodejs2-fix生成二维码
  • 原文地址:https://blog.csdn.net/qq_60555957/article/details/126759392