博客系统面试题
1、为什么做这个项目?
当时学习完mybatis、spring、springmvc等知识后,希望去用这些框架整合在一起写一个项目,巩固所学的知识,将所学的这些知识应用到真正的开发中去。
2、项目介绍
博客系统使用SSM框架写的,数据库使用的是MySQL,共有五个页面,分别是 登陆页面、写博客页面、博客列表页、博客详情页、后台管理页面,功能就是对博客的增删改查,写博客时使用的是百度提供的UEditor富文本编辑器。
数据库方面共有五张表:
- 用户表(t_manager):账号id、账号名称、账号密码
- 文章表(t_article):文章id、分类id、标题、内容、文章简介、状态、作者、发表时间、浏览量。
- 博客/标签对应表(t_article_tag):文章id、标签id
- 标签表(t_tag):标签id、标签名称
- 类别表(t_category):类别id、类别名称、图片样式、别名、排序
3、细节怎么实现?
1、博客内容一般很大,在数据库中用String类型存放不了,怎么处理?
MySQL底层针对博客有个blob类型字段,有tinyblob、blob、mediumblob、logblob,最大的内存限制可达到4G。
2、项目中的数据加密了吗?
加密了,在前端写完博客点击提交以后,会将所有的数据通过json格式传输到后台,所以在后台接收对象的时候需要使用JsonUtil.fromJson()方法将JSON数据解析为对象。保存文章使用ajax来提交数据的,encodeURI方法会将前端的数据按照指定的编码形式编码,所以在后台接收这些数据时,使用了URLDecoder.decode()方法来将接收到的各个参数进行解码,解码成utf-8的编码格式。
3、不登陆也可以直接写博客吗?
不登陆是可以直接通过URL进入写博客页面的,但是无法提交博客。在点击提交按钮后,后台会判断此时有没有登录,也就是去session中获取登录信息,有的话可以提交成功,如果获取的登录信息为空的话会重定向到登陆页面。
在每次登陆后,会通过调用session.setAttribute()方法记录登录的缓存信息。
4、登录页面输入密码时,密码隐藏了吗?
密码加密了,在输入密码时看不到密码,看到的是小点点,这个取决于type这个属性的参数,再导入jquery的js文件后,在span标签中有一个type属性,参数填text时,显示的是文本,也就是能看到密码;参数为password时输入就是图片,隐藏密码与否就是通过这个参数实现的。
5、系统可以存储图片吗?
当时跟着视频配置好以后,文字的存储是没问题的,但是点击图片存储以后没有反应,于是我就去网上查找原因,存储图片的话还是需要自己配置,在config.json文件中去修改"上传图片配置",主要修改两项,一个是图片访问路径前缀,一个是保存路径。保存路径这一项可以去自定义保存路径和文件名格式,为了文件名不为乱码且按序存储,我将图片的文件名设置为了存储的时间,也就是年份+月份+日期+时间戳。
6、数据库密码加密了吗?
加密了,使用的是MySQL中提供的双向加密,加密用的是AES_encryPT命令,解密用的是AES_decryPT命令,但是加密后的数据直接存储varchar类型的话会报错,所以在加密时还得使用HEX()函数来16进制化存入,解密时再使用UNHEX()函数处理后再解密。
7、博客的题目在数据库中是必填的,而传的参数没有博客的题目怎么处理?
在接收到博客从前台传来的各个参数后,对于题目,会进行判空,如果题目不为空,那么可以正常存入数据库,如果题目为空,就会将题目设置为【无题】。
4、项目中遇到的问题?是如何解决的?
1、项目中存在的乱码问题。
因为在MySQL中博客是以blob类型来存储的,那么就会导致在前端页面写完存储到数据库中时或者时前端访问博客详情页时出现乱码的问题,当时该问题没有解决的时候,我的数据库和博客详情页面的文字全部都是?,经过查阅相关资料,是需要一个类型转换器来完成类型的转换的,而且mybatis中提供了类型转换器,MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换,可以实现BaseTypeHandler,自定义 TypeHandler。自定义的类型转换器中我记得是重写了三四个方法,具体操作就是将blob字段一个一个byte的转换成String类型,写好类型转换器后,在mybatis中需要用resultmap来指定博客内容属性对应的类型转换器,里面有个typeHandler标签,参数填自定义的类型转换器的路径。
2、在博客详情页,日期这个属性有问题。
在博客详情页中,对于博客的日期部分只能具体到某一天,而不能看到时分秒,最后是用SimpleDateFormat类解决的,这个类可以将Date类型转化为String类型,而且可以设置成想要的格式,但是时间对应的字母不能错,比如y代表年,M代表月,D代表哪一天等等。
5、这个系统还可以添加什么新功能吗?如何实现?
1、在用户读完博客后肯定有一些想说的话,因此可以添加一个留言功能,这个分为两种,可以非注册式评论,也就是不登录就可以留言(匿名留言),还有一种是注册式评论,用户必须登陆账号以后才可以留言,但是非注册式留言有很大的弊端,就是对于作者的回复不友好,由于对方是非注册式留言,那么作者的回复也不知道往什么地方发送,而且留言者也无法得知作者对他的回复。
2、可以给博客系统添加一个回收站,将用户删除的博客存入回收站中,可以设置一个时间,当这篇博客在指定时间没有被读取的话,就将他删除,就像LRU最近最少使用一样,因为MySQL无法设置数据的过期时间,所以可以用Redis来完成,将MySQL删除的博客写入Redis中,并且给删除的博客设置对应的过期时间,而且Redis中还提供了很多不同的回收策略,更加方便地支持这一功能。