tips:点击左上角的爱心 ❤️ 可切换夜间模式保护眼睛哦!!

本文旨在描述搭建毕设的过程中遇到的困难与解决方案,为论文与 PPT 提供一些思路

相信多年后的我看到当初这样的自己也会觉得羞愧难当—— 怎么当初就犯了这么沙雕的错误呢?!

本文纯属想到哪里写到哪里,算是毕设大体完成后的总结


layui

前端我真的不熟悉,HTML+CSS+JavaScript 的功课没有好好学吃了大亏,想着使用对后端程序员十分友好的 layui 兴许可以缓解尴尬的场面,然后我还是被前端血虐,下面就看看我都犯过什么愚蠢的错误 top 很多……

  1. 渲染 select 下拉框出错

    众所周知,layui 中的下拉框渲染是跟着 form 标签一起的,在 js 中也是使用form.render('selector')的语法来完成下拉框样式的渲染,可我偏偏忽视了这一点,select 标签孤零零站在寒风中没有被 form 抱住,然后渲染肯定是失败啦……

    教训:layui 渲染的 select 下拉框一定要包含在 form 标签内

  2. 标签内 onclick="fucntion()“属性不起作用

    想在按钮点击的时候触发一个点击事件,我一直使用 layui 自带的 jQuery,所以函数要写在 layui 函数内部,但是点击事件怎么都不起作用,经过一番学习 百度之后才了解 layui 内部的函数不能在外面直接调用

    教训:layui 内部的函数想要在外部调用就必须使用 window.函数名 = function(){} 的方式声明

  3. 自定义的发送 post 后端验证的 lay-verify 不起作用

    在用户修改密码的页面中,想要验证用户输入的旧密码是否正确就尝试加一个自己的表单验证,在验证函数里发送 ajax 请求来验证数据是否合法,但是每次点击提交按钮之后,验证都没有执行,调试一番后发现,表单总是先一步提交,而验证的方法总是后一步执行,只能归咎与我对 ajax、layui 的 API 还不够熟悉,解决方案就是在提交表单时嵌套一次验证, 验证通过之后再提交整个表单


navicat

数据库可视化工具——偏偏坑到我这种不长眼睛的主……事实证明,哪怕真的可视化了,我们也会忽略很多东西 通俗点说就是瞎

  1. datetime 类型的字段数据莫名其妙地自动更新

    我的数据库中有个表的数据是多个用户可以操作的,为了避免同时修改导致数据出错的情况,加上了一个 datetime 类型的"更新时间"字段,但是在每次更新的时候,隔壁也是 datetime 类型的好兄弟"创建时间"字段也会更新,挠破头之后问了大佬才一语点醒我:“你数据库这个字段有没有设置成按照时间戳自动更新?”

    我一检查,人都傻了,还真是

    image.png

    教训:navicat 中 datetime 类型字段会默认勾选根据时间戳自动更新,设计字段时根据需要选择


shiro

非常常见的权限管理框架,我用来设置角色、权限,和 thymeleaf 结合使用在同一个页面中为不同的用户响应出不同的页面元素

  1. shiro:hasPermission 不起作用

    兴致勃勃地添加了 html 头部的 thymeleaf 和 shiro 的命名空间,写上 shiro:hasPermission 属性,但是不起作用,打了断点,后端也输出了该用户的权限内容,可页面死活就是加载不出来,死马当活马医试了一下重启,才知道和 devtools 的热部署有关系

教训:IDEA 中的 devtools 热部署项目会让 shiro 权限丢失,我们需要重启项目再次登录才行


AOP

用 Spring 切面做一个缓存,想减轻大量重复查询给服务器带来的无意义压力,所以把不常修改的且会被大量查询的小部分数据放在一个内存的 map 中管理,因为内存的访问速度一定是快于硬盘的

  1. 更新数据之后缓存中部分字段丢失

    我更新了一个数据库的一条数据,但是发现再次查询的时候缺少很多字段,只有更新的字段有值,这个其实非常好排查,打一个断点就不难想到是缓存的问题,前端提交表单的时候只传输了更新的数据而没有其它字段内容,而我在更新 map 容器里的缓存数据时用了 Spring 提供的BeanUtils工具类来拷贝更新后的数据,没有更新的字段自然就为 null。

    // 复制更新后的数据
    BeanUtils.copyProperties(dept, newDept);
    

    教训:copyProperties 的这个方法要慎用,所有同名字段都会被拷贝,无论其是否为 null