使用SpringBoot搭建的一个以图文结合的方式在线分享壁纸照片和画作的网站项目,原本在阿里云上运行测试,但因为11月份七牛云的免费测试域名协议更新,所以网站停掉了;
使用了Mysql数据库,thymeleaf模板引擎,Spring Data JPA,Security,百度Ueditor富文本编辑器,七牛云的对象存储,以及一些第三方js小插件(模态框,头像裁剪,图片轮播等js插件),运行环境为Linux,以jar包的方式运行,
以前的window本地版本已经与此阿里云版本合并;
1: 本项目由于租用的阿里云服务器性能限制,所以取消了redis和elasticsearch,只需要一个mysql数据库,sql文件在项目根目录里;
2: 项目在初次运行时会根据操作系统切换不同的资源保存目录,
win系统默认资源路径前缀为"C:/NotSystemSrc/projectdev/"
linux系统默认资源路径前缀为"/home/projectdev/"
如果需要修改的话请修改com.kingguanzhang.toptalk.utils包下的PathUtil类;
1 : 页面默认都是引用七牛云上的图片资源,例如网站logo , 底部二维码等一些不会频繁变动的图片等 , 如果是未联网运行页面会显示错乱;
2 : 项目运行前创建完资源路径后,在/projectdev/upload/images/文件夹下放一张error.jpg图片用于图片上传保存失败后返回一张默认的错误提示图片;
3 : 项目默认在windows端是关闭七牛云功能的,这是为了方便我开发投稿板块,如果需要开启,直接在application.properties里打开qiniu.enableqiniu即可,或者可以修改com.kingguanzhang.toptalk.component.QiniuStatus类里的静态代码块;
4 : 在application.properties文件里需要切换日志保存路径,Linux下为/root/log/文件夹,win下为C:/NotSystemSrc/projectdev/文件夹
5 : 百度富文本编辑器一般不需要配置文件上传请求路径,在/resources/static/js文件下有两个js文件:storyContribute.js文件的115行和eventContribute.js文件的115行都需要修改,默认是localhost,如果后台处理上传图片请求的url修改了则需要同时修改此处的代码;
PhotoLike 网站(图漾网站) -- 照片 壁纸 绘画和涂鸦爱好者书写情感的地方.
(原名toptalk,现在toptalk名字已经用于另一个大型论坛项目,此网站更名为photolike)
专辑板块 : 专题壁纸分享板块(例如山水专辑,运动专辑,建筑专辑) ;
随笔板块 : 单张壁纸分享板块 (例如微软bing的每日一张精美壁纸推荐) ,
故事板块 : 有故事的系列壁纸分享板块(例如个人游记,电影截图影评) ,
活动板块 : 组织网友活动的板块(例如旅游,聚会,照相等)(计划在以后改成推荐书刊杂志的板块);
专辑板块、故事板块和活动板块点击标题会进入详情页面;随笔稿件并没有详情页,在随笔板块点击随笔标题会选中此随笔在顶部展示,其图片和文字都会稍微放大以仔细查看; 专辑稿件进入详情页后专辑内所有图片会滚动播放,故事稿件和活动稿件进入详情页后会以博客文章的方式进行展示;
专辑稿件详情页有下载按钮,点击后会以zip打包的方式下载到本地;网站所有的图片都是以原图显示,可以直接右击后保存到本地;
用户注册需要根据注册页面的提示输入合法的账号,密码以及基本信息进行注册;此时前端页面会使用js代码进行输入框校验,同时会使用ajax的方式进行账号和昵称的重复性校验; 校验不通过时会在输入框后面进行相应的状态提示;
用户注册时会使用系统的默认头像,注册成功后可以修改头像,鼠标移动到修改信息页面的头像框上会弹出"修改头像"的按钮,点击后会弹出一个模态框, 模态框里可以上传头像并进行相应的裁剪和缩放操作,点击确认裁切按钮会使用js代码进行裁切操作(而不是原始图片加裁剪数据发送到后端进行操作),同时保存已经裁剪好的头像图片上传到七牛云; 修改基本信息时会像注册时一样进行前端js代码校验输入框和ajax方式校验昵称重复性,同时会判断用户是否修改了昵称而决定是否发送昵称修改请求; 为了保证用户账号的安全性,密码采用了BCrypt加密方式,不会保存原始密码;
仅专辑稿件和故事稿件可以评论,评论分父评论和子评论,以后升级版本时会引用第三方的畅言评论接口; 默认每页显示10个父评论,每个父评论显示10个子评论,可以进行父评论翻页和子评论的展开/折叠操作;
可以对所有评论进行点赞,每个用户只能对各个评论点赞一次,再次点击会取消点赞;
用户登录后可以对除活动板块之外的稿件进行收藏,收藏后会进入用户的收藏夹,再次点击收藏按钮会取消收藏;
网站导航条上的搜索框默认是搜索专辑板块,进入到搜索页面后可以筛选需要搜索的板块; 目前因为租用的服务器性能不佳,所以是使用sql语句的搜索数据库,以后服务器升级后会引入elasticsearch搜索组件;
点击其他用户昵称后会进入用户主页,显示用户发布的稿件,目前因为不开放普通用户投稿权限,所以只能在点击某个稿件作者后才会有数据显示;
故事稿件和活动稿件的投稿使用了百度富文本编辑器,可以进行基本的文字排版和图片插入,表情插入,地图定位插入等高级功能; 为了保证网站的稿件质量,目前只有具有管理员角色权限的用户可以进行投稿;
网站会根据登录用户拥有的角色显示不同的链接和操作区域,例如当具有管理员角色的用户登录后,导航条上会额外显示"稿件管理"和"分类及城市"管理链接,同时浏览稿件详情时会显示额外的操作区域,浏览评论时会显示额外的操作按钮;
具有管理员角色的用户可以进行各个板块的稿件管理, 稿件管理页面会显示各种板块和各种状态的筛选按钮,以及按条件查询稿件以进行管理的筛选按钮; 所有稿件具有5个状态: 展示中 隐藏中 待审核 已退回 已废弃; 稿件在不同的状态会显示不同的操作按钮:例如在展示中状态会显示"隐藏"按钮和"废弃"按钮,在待审核状态会显示"通过"按钮和"退回"按钮; 管理员在浏览稿件详情时或者浏览随笔板块主页时会显示额外的操作区域,会显示稿件的id以及作者信息,可对其进行的操作与稿件管理页面的操作一致; 管理员在退回稿件时浏览器会弹出一个模态框,需要管理员选择对应的退稿理由和备注信息,退稿后在稿件管理的"已退回"页面会显示一个"信息"按钮,点击后可以查看退稿理由; 在删除稿件时,会默认将稿件放入"已废弃"状态,在"已废弃"页面的稿件可以恢复,除非在此页面再次点击"抹除"按钮才是真正从数据库删除数据;
管理员可以修改专辑分类及城市名字,可以修改专辑分类及城市的排序等级,可以新增或删除专辑分类及城市,当删除专辑分类及城市时,不会删除关联的稿件,而是将这些稿件移动到预留的备用分类或城市下,
1:弃用模板引擎,改为前后端分离,前端使用饿了么ui
2:将管理端分离出来,做成一个单独的项目;
3:完善接口文档和字典文件,按照公司的开发规范进行整理;
2019/01/31:
1 : 重新整理了项目的文件结构,公司新的项目马上上线,等有空的时候会重新整理这个项目;
2018/10/30:
1 : 稿件管理中删除稿件的方法中新增删除七牛云图片资源和本地图片资源的代码;
2 : ContributeController | UserController | AdminCategoryAndCityController | AdminContributeController |CommentController中新增部分日志打印代码;
2018/10/29:
1 : 开启日志记录功能,linux环境日志存放路径为/root/log/photolikeLoging.log, win环境日志存放路径为C:/NotSystemSrc/projectdev/log/photolikeLoging.log
2 : 预留了一个全局异常处理类;
2018/10/25:
1 : 完成加密密码修改功能;
2018/10/24:
1 : 优化了部分判断语句,将原来的 PhotoLikeForWindows 版本与此版本合并,现在此版本会根据操作系统切换不同的资源路径并切换七牛云状态,当在linux端运行时需要联网调用七牛云api , windows 端可以离线运行;
2 : 为了方便以后测试投稿板块,增加了根据系统自动选择是否开启七牛云的功能,默认情况下,win系统会关闭七牛云,所有投稿会保存本地路径到数据库中,阿里云linux生产环境会开启七牛云; (可以通过properties文件来手动开启或禁用自动配置);S
3 : 去掉了一些无效的引用;
2018/10/23:
1: 优化部分代码,项目会根据操作系统切换不同的本地储存路径,需要运行前更新yml文件中临时路径变量;
2: 更换mysql-connector-java包版本为8.0.12;
2018/9/16:
1:更换了网站标题为PhotoLike; 2:因为数据库现在保存的是加密的密码字段,所以原数据库的几名网友的测试账号被移除了;
2018/9/16:
正在参与一个新项目,此项目仍然会保持缓慢更新;
1:用户密码现在会采用加密方式在数据库中保存;
2:移除了user角色的限制,security现在只拦截管理员角色;
2018/9/5:
1:修复了管理员在稿件详情页管理稿件时“审核通过”按钮点击无效的问题;
2:补充了sql文件,方便导入到数据库进行测试;
3:修复了活动投稿时未正确保存七牛云图片地址及稿件状态的错误;
4:修复了判断用户是否有权限查看非展示中稿件时的错误;
5:修复了活动详情页标签的显示错误;
2018/8/24:
1:新增了活动板块的后台管理;
2:修复了删除稿件时删除稿件下所有父评论的sql语句的错误
2018/8/20:
1:整合了七牛云的云储存,现在稿件的封面和内容图片,以及用户头像都会在本地和七牛云各保存一份,网页中显示的图片通过七牛云加载,而专辑中的zip下载则是通过本地下载, ,仅网站图标和logo,以及下方的微信图片和默认用户头像保存在项目资源文件夹中;
2018/8/13:
1:进行本地运行jar包测试:(目前通过测试,在阿里云服务器部署后通过外网正常浏览各个网页)
解决的问题:
1:使用idea build菜单打包后可能会丢失很多自动配置,导致运行报错,在打包前手动管理jar包依赖可解决,但比较麻烦,推荐使用idea自导的maven插件来打包(需要在pom里设置maven配置);
2:项目中以jar包运行后部分页面访问不了,后台模板引擎报错"页面未找到或解析出错",但是在idea中会正常运行,原因在于有部分return语句中原本是"portal/essay"的语句,错写成"/portal/essay",这种错误拼写在idea中运行项目会自动纠正,但打包成jar后会报错;
2:移除了test包;
3:进行阿里云服务器环境搭建,测试服务器端环境是否成功运行;
4:修复了投稿页面前端输入框校验时输入框id错误导致的js文件报错的问题;
5:将项目下所有图片相关的文件夹路径修改成了服务器端的文件夹路径;
6:修复了用户收藏页面会显示已经不在展示中的稿件的业务逻辑问题;
7:开启了springboot设置里的模板引擎缓存;
8:修复了在移动端屏幕变小时底部黑色背景显示不全的问题:解决方法 ,在底部foot div上添加样式"min-wider:980px";
9:修改服务器端口为80,这样在公网就无需输入:8080来访问项目;
10:修复了当只输入网站简单域名不带/index时跳转首页却没有经过controller,直接通过模板引擎解析portal/index导致页面报错的问题;
2018/8/12:
1:修改了网站logo,更新了底部微信二维码;
2018/8/11:
1:修复了大量的bug:
现在板块稿件收藏后收藏总数能正确的增加与减少了;
故事板块的稿件点击收藏后爱心按钮会正确的点亮了;
注册页面账号ajax重复性检验会正常的显示检验结果了;
修改用户信息页面当昵称输入框最终结果没改变时不会再发送昵称修改请求;
2:新增了点击作者昵称跳转到查看作者发表稿件页面并显示发表中稿件的功能;
3:新增了错误信息页面;
4:管理员登录后顶部导航条新增发表稿件入口;
5:发表稿件页面新增稿件板块切换链接,同时移除了底部的百度富文本编辑器测试区域;
6:暂时移除了第三方网站的分享链接;
7:暂时移除了底部的友链及移动端接口;
2018/8/6:
1:经过反复重装虚拟机以及更换版本的测试,linux 下的doucker或者直接安装elasticsearch后项目连接9300端口都报找不到nodes节点的错误,使用jest方式可以连接,但为了以后开发和维护方便,所以放弃使用elasticsearch和redis,直接使用sql查询数据库和springboot自带的cache缓存;
2:完成了搜索功能:根据关键字使用sql语句查询数据库:
错误的语句,此语句最后的and条件是不会起作用的:select * from topic where title like :keyword or content like :keyword and status = :status
正确的语句:select * from topic where status = 1 and (title like :keyword or content like :keyword)
3:修正了翻页的显示效果,现在当最大页码不足两页时不会显示翻页按钮了
2018/8/4:
1:整合了elasticsearch,功能尚未完善;
关于报错: "NoNodeAvailableException[None of the configured nodes are available" 的问题的情况:
在通过Linux下docker运行5.6.10版elasticsearch镜像时,window端能链接9200端口,而springboot链接9300端口后报错找不到节点,抛弃掉docker直接通过终端安装了elasticsearch仍然出现同样情况,所有设置均为默认;
换成window的5.6.10版elasticsearch后正常运行,因此排除了pom和Linux端版本不一致的问题,也排除了springboot jar包冲突问题,问题只出在项目启动后找不到9300端口下或此端口下的nodes节点,通过关闭elasticsearch服务后启动项目报同样的错误,所以找不到端口的可能性大于找不到节点的可能性;
2018/8/1:
1:管理员稿件管理页面新增了按作者id和分类条件筛选稿件的功能,以及根据稿件id查看稿件的功能;
2018/7/28:
1:完成了专辑投稿 故事投稿以及随笔投稿的前端输入框校验和后端字符长度校验;
2:完成了修改用户信息的前后端校验,格外需要注意的是前端需要判断用户是否在修改昵称时将输入框变更后又修改成了旧的昵称,如果是,则清除校验信息,不进行下一步的正则和ajax校验,此时后端也不更新昵称;
2018/7/27:
1:完成了注册用户的前端校验和后端校验:页面输入框的值变更时会js校验一次然后后端校验一次是否被占用,提交注册时再前端js校验一次然后后端再次校验是否被占用,同时根据用户输入操作步骤优化了一下报错的逻辑,保证了用户比较好的体验;
2018/7/26:最近开发速度会比较慢,开发有可能会中断一段时间,项目完成开发后会放到云服务器上运行;
1:已经引入搜索页面,但目前并不计划立即整合elasticsearch,
2项目分成两条开发方向:一方案是完成不使用Linux环境下的组件,只采用ide启动即可运行的方式,例如搜索功能采用数据库模糊查询,缓存采用springboot默认的缓存,方便其他人下载项目后快速预览项目运行效果; 二方案是采用elasticsearch和redis,后续发布到华为或腾讯云服务上运行; 3:二方案具体的后续开发计划如下:
1:先完成TODO事项,完成前端的输入框校验及后端校验,完成管理员管理稿件页面中的搜索和筛选功能(使用数据库精确查询查询id或作者,模糊查询标题,筛选分类,这三个功能独立实现);
2:完成搜索功能(使用sql语句搜索数据库或使用jpa查询);
3:完成缓存功能(使用springboot自带的缓存);
4:用户投稿功能暂不开放,只能由管理员投稿,后续考虑让用户申请成为作者来获得投稿权限;
3:一方案具体的后续开发计划如下:
1:先完成TODO事项,完成前端的输入框校验及后端校验,完成管理员管理稿件页面中的搜索和筛选功能(使用数据库精确查询查询id或作者,模糊查询标题,筛选分类,这三个功能独立实现);
2:完成搜索功能(整合elasticsearch);
3:完成缓存功能(整合redis);
4:用户投稿功能暂不开放,只能由管理员投稿,后续考虑让用户申请成为作者来获得投稿权限;
2018/7/24:
最近项目提交代码至GitHub仓库时频繁出现网络连接问题,正在寻找解决方法,同时暂时删除了一些图片文件以压缩项目占用空间大小方便传输;
2018/7/21:
1:重新改写了security的登录方法,新增LongSuccessHandle来实现当用户登录后的一些小功能(例如加登录积分,读取ip,访问量+1等):
原先是利用security的默认的登录处理方式,跳转到首页利用首页controller来往session里写用户信息,此方法的不足是每次登录后只能往首页来跳转实现获取用户信息;
而现在改进后,登录成功时security会调用自定义的LoginSuccessHandle方法,该方法通过自定义实现网session里写用户信息和实现需要的统计功能(例如获取用户ip地址和登录积分变更等),
并且能获取到security拦截的url请求地址,当处理完需求后再将页面跳转到拦截的url,这样可避免每次登录后都丢失请求页面强制跳到首页的糟糕体验;
2:发现并解决了story投稿时百度富文本编辑器不能加载文件选择框内容,并无法回显图片提示上传错误(实际图片已经上传储存)的问题:原因在于设置了security组件之后,security默认配置阻止了页面内部插入iframe框架, 默认配置中 'X-Frame-Options'的值是 'DENY',浏览器会报此错误,解决方法时在security的config方法中配置http.headers().frameOptions().disable();即可,此配置语句可以写在权限角色配置语句的前面并用.and()链接;
2018/7/20:
1:除了活动板块外各个板块的稿件详情页面会根据用户是否具有管理员权限而显示管理员操作区域,thymeleaf里使用sec:authorize="hasRole('ROLE_ADMIN')"来判断角色权限,而js里则判断是否存在父评论的管理区域,没有则说明不是管理员,则不渲染出子评论管理区域;
2:完成了专辑稿件的分类管理功能,管理员浏览专辑稿件详情页时,标题栏分类链接后面会显示"修改分类"按钮,点击后弹出模态框选择新的分类;
2018/7/19:
1:完成了管理员管理专辑分类和城市的后端代码,需要注意的是当删除分类和城市时,默认会将所关联的专辑 活动或用户下的分类或城市id用默认的值(id为1的分类或城市)替换,然后再执行删除; 已经提供了替换为指定id的分类或城市的方法,但是不推荐使用此方案,而推荐使用修改分类名字来实现替换分类;
2:修复了一个自定义删除语句中@Transactional注解错写成@Trensient注解的错误;
2018/7/18:
1:完成了管理员管理专辑分类和城市的前端页面及js代码,进入管理分类和城市的页面后,点击分类或城市名字会弹出一个模态框,并且模态框根据分类或城市是编辑模式还是新增模式显示不同的按钮;
2018/7/16:
1:完成了管理员管理稿件的后端操作代码;
2:几处稿件管理的小调整: 当管理员恢复稿件时,稿件会进入审核状态; 稿件的审核状态移除了废弃按钮,改为通过按钮,点击后稿件审核通过进入展示状态;
3:完成了删除评论的功能,当删除评论时,会删除下级所有子评论,同时会将稿件根据删除的子评论数量+1进行相应的评论总数扣减, 同时会删除对应的评论与稿件的映射关系,但子评论与稿件的映射关系不会删除,因为子评论不会影响到查询稿件时的评论映射(稿件只与父评论有映射关系,子评论只依附于父评论)
4:完成了删除稿件的功能,同时删除稿件下所有父评论及点赞记录,子评论暂时没有好的删除逻辑;图片暂时不实现删除方法,因为以后可能要改成将图片引用第三方云平台保存;
5:暂时移除了用户删除自己稿件的功能,等到项目业务逻辑梳理清楚之后再开放,防止其他用户利用漏洞造成损失;
2018/7/15:
1:补充了评论按最新和最热排序的功能;
2:修正了各个板块的稿件默认按id排序的错误,按id排序时当稿件被用户修改状态时刷新id导致排序混乱,现在已经修改成按发布时间排序;
解决了一个pageable里的参数传值的问题:
在下面的例子中,
Pageable pageable2 = new PageRequest(pn-1,10,new Sort(Sort.Direction.DESC,"creatTime"));
如果当前是自定义的需要写sql语句的查询方法(例如MyFindSql等),则最后一个传值需要写对应的数据库表字段的名字:creat_timg;
而如果是jpa默认的查询方法(例如findAll等),则传值是对应的实体类属性名:creatTimg;
否则会抛异常;
3:完成了管理员后台管理稿件的前端页面:
后台管理页可以筛选稿件状态,会根据稿件不同的状态显示不同的操作按钮,例如稿件处于正常展示状态时会显示"隐藏"按钮和"废弃"按钮,处于审核状态时会显示"退稿"按钮和"废弃"按钮;
按钮操作详情:
"隐藏"按钮点击后会将稿件设置为隐藏状态,普通用户在浏览网站时无法发现此稿件,即使是通过修改get请求和post请求,因为后台查询稿件的方法也同时做了状态判断;
"显示"按钮则会将隐藏稿件设置为正常显示的稿件;
"退稿"按钮点击后会弹出一个模态框让管理员填写退稿理由,模态框下半部分预设了一些语句,点击后自动填充进输入框中,再点击确认退稿按钮则会将稿件设置成已退稿状态,表示稿件不能通过审核,不能发表;
"废弃"按钮点击后会将稿件放入回收站,代表删除稿件,但不是物理删除,用户可以通过申诉申请恢复此稿件;
"抹除"按钮才是真的物理删除,点击后则会将此稿件的数据库数据删除;
4:在稿件详情页面会判断角色权限而显示额外的稿件操作按钮区域,能执行的操作与后台管理页相同, 不同之处在于管理页点击按钮后是在页面移除此稿件的div元素,而稿件详情页是刷新当前页面或返回到板块页面(当执行的操作是抹除时);
5:稿件详情页面同时也可以删除评论;
2018/7/14:
1:完成了用户管理自己的稿件的功能:稿件分为5个状态:0表示审核中,1表示展示中,2表示隐藏中,3表示被退回,4表示放在回收站; 用户可以根据状态浏览自己的稿件,并且可以根据状态执行相应的操作:展示中的稿件可以设置为隐藏,隐藏中的稿件可以恢复展示,回收站之外的稿件都可以执行删除操作(不会执行物理删除,只会置于回收站),被退回的稿件可以点击查看管理员的留言,回收站的稿件不能再更改状态(只能点击查看id值再通过联系客服来恢复);
2:所有稿件实体类新增Info属性来记录管理员的留言,用于提示用户此稿件被退回的原因,需要管理员输入自定义字符串或以后在后台页面快捷设置回复信息;
2018/7/13:
1:完成了用户删除稿件的功能;
2:topic essay story event四个实体类新增Status属性用于记录稿件状态,为0时代表稿件正在审核,当为1时则稿件正常展示,为2时表示稿件被隐藏,3代表稿件被管理员退回,4代表稿件被放置于回收站;
3:新增了稿件浏览限制,用户只能浏览稿件状态为1(代表正常展示)的稿件,除非浏览者是此稿件作者或管理员;
4:新增了一些限制,防止用户恶意修改url地址中的稿件id请求浏览到原本不应该看到的稿件;
2018/7/12:
1:优化了一下页面的加载速度,废弃掉了百度和谷歌浏览量统计,以及一些无用的js代码和初始化操作;
2:新增了评论点赞功能,页面会加载评论后会根据用户是否赞过此评论来切换评论点赞按钮的状态,同时点赞计数也会根据用户的点赞动作而相应的增加或减少;
3:新增了Praise实体类以及数据库表praise,用于记录用户的点赞信息;Comment实体类新增praiseNumber属性用于记录被赞总数;
2018/7/11:
1:完成了topic essay 和story 三个板块收藏和取消收藏功能,同时各板块页面上的收藏按钮会根据用户是否收藏了此条目而显示"收藏"或"取消收藏"的对应样式;
2:修改了收藏夹页面的板式,使其图片宽和高的比例符合16:9,并自动缩放成固定的px大小;
此次开发解决的问题:
自定义删除sql语句时,需要注意注解一定要写全,三个注解都不能缺失,而查询语句只需要写@Query注解:
@Modifying
@Transactional
@Query(nativeQuery = true, value = "delete from user_favorite where user_id= :userId and story_id=:storyId"
)
void deleteFavoriteStory(@Param("userId")Long userId,@Param("storyId")Long storyId );
2018/7/10:
1:修改了专辑图片的投稿逻辑:将封面图片与内容图片投稿时一同打包,并按专辑id做为文件夹名进行隔离;在展示专辑图片滚动播放时,将专辑图作为第一张展示,同时设置投稿功能需要security权限验证;
2:移除了百度浏览数据流量统计的js代码;
2018/7/09:
1:完成了父评论下的子评论的分页功能;实现方式是利用js控制加载的数量,默认只加载10个,当用户点击"更多子评论"按钮时,会再加载后面的10个,此时父评论下就累积了20个子评论,并判断是否还有剩余评论,有则继续显示此按钮,没有则改变此按钮样式; 当子评论加载超过10个时,显示"折叠子评论"按钮,点击后则刷新掉超出10个的部分,变成初始10个的数量,并移除掉此按钮,同时判断是否要显示"更多子评论"按钮;
2:修改了专辑页面的板式,移除了封面图片的展示,将其添加进专辑内容展示区域并且包含进下载的zip压缩包中;
2018/7/08:
1:完成了专辑评论和故事评论 以及父评论下面的子评论功能,需要以后完善子评论的翻页功能(由于落网上子评论数量较少没有达到翻页的限制,所以没有展示子评论翻页的样式作为参考,前端页面样式设计会比较麻烦);
2:修改了项目session的有效期为6个小时,防止当用户投稿时编辑时间过长导致发布失败;
2018/7/07:
1:完成了单独修改用户头像,单独修改用户签名,以及修改用户其它信息的功能,暂时不提同修改密码的功能,因为考虑到以后还需要密码加密储存,所以以后再完成修改密码的功能;
2:删掉了较为累赘的Comment.js文件,重写评论功能的js代码;
2018/7/06:
1:完成了修改用户信息的页面,鼠标移动到用户头像上时会弹出"修改头像"的提示按钮,点击后弹出模态框,在模态框里可以上传图片,可以预览和进行裁剪;
2:后端新增接收base64字符串转换成multipartFile文件的功能,原理是新增自定义类继承MultipartFile类,重点提取请求头信息和base64字符串转成byte数组,这两个之外的属性(例如文件名和原始文件名等)采用随机数生成;
2018/7/05:
1:整合了security,新增角色实体类Role,角色与用户关联的实体类RoleRelateUser,数据库新增role表和role_user表; 同时提交了测试用sql数据库数据文件;
2:完成了用户登录和用户注册功能;当用户登录时security会从数据库中找到用户账号对应的角色信息判断是否具有对应网页的权限;
3:移除了弹出式登录框和注册框,改为登录页面和注册页面,这是为了更好的配合security权限组件;
2018/7/04:
1:修改了一下用户收藏页面和用户投稿查看页面;
2018/7/03:
1:完成了活动投稿功能;
2:完善了活动城市分类筛选功能,完善了活动详情页及列表页页面显示效果;
2018/7/02:
1:新增在页面导航条上点击登录链接时弹出登录框,点击关闭则关闭登录框;
2:新增注册框,登录和注册功能暂时放到后面与security一起完成;
2018/7/01:
1:新增了文件上传时自动打包成zip文件的功能,同时设置所有上传图片以1080p分辨率保存;专辑页面新增下载zip文件的功能,点击后可以下载专辑页面所有图片的zip压缩包;随笔页面可以点击图片查看原图,故事页面可以右击图片保存原图;
2:完善了各板块的页面显示效果;将上次强制缩放为1.42比例的图片更改为1080P的16:9的图片,这样用户就可以下载高清的图片作为壁纸,同时也可以上传自己的壁纸,板块开发需求从侧重文字抒情改为分享精美壁纸;
2018/6/30:
1:完成了随笔投稿功能,用户可以投稿随笔,撰写随笔标题,上传随笔封面图片,撰写随笔正文,目前会强制缩放用户上传的图片,将其缩放成长宽比为1.42的矩形,在网上找了一下页面裁剪图片的插件,发现都是js记录并发送裁剪的数据和原图,还需要后台去处理裁剪数据,由于时间不够充裕,所以留着以后完善此功能;
2:完成了故事和专辑的投稿功能;
3:新增了专辑页面的轮播图功能;
4:废弃掉了专辑与分类的多对多的关系,修改为专辑与分类的多对一关系,因此修改了相关实体类与数据库表结构;
2018/6/29:
1:发现Umeditor 存在段落样式无效的问题,已经换成了完整版的Ueditor,测试段落样式可以有效使用;
2:完成了Ueditory富文本编辑器的图片上传保存和回显;
2018/6/28:
1:完成了专辑投稿页面的前端;使用js完成了封面单图选择和回显,以及多图片上传的选择和回显,
2:完成了故事投稿页面的百度富文本编辑器Umeditor 的前端页面整合;
2018/6/27:
1:完成了topic和story板块的评论加载和子评论加载;父评论翻页以完成,子评论还没有完成翻页功能;
2:修复了当查询的记录为0时topic和story总页面尾页参数为0的错误;
2018/6/26:
1:在开发查询用户信息时发现jpa的example查询会查出不区分大小写的记录;
//创建的example,withMatcher()已经设置了属性account区分大小写,然后又将整个example的withIgnoreCase()忽略大小写设置成了false,
ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("account",ExampleMatcher.GenericPropertyMatchers.caseSensitive()).withIgnorePaths("id").withIgnoreCase(false);
//然而还是查询多条不区分大小写的记录,原因在于mysql数据库查询时不区分大小写;
报错信息:query did not return a unique result: 3; nested exception is javax.persistence.NonUniqueResultException: query did not return a unique result: 3
//解决方法,以下方法任选一个即可:
//1:在查询语句中加上binary;
select * from user where account = binary 'testuser'
//2:在mysql设置文件里开启区别大小写;可以修改my.ini或者my.cnf
[mysqld]
lower_case_table_names=1
(0:区分;1:不区分)
//3:修改表中的字段使其区别大小写;
alter table user change account account varchar(225) binary;
2:完成了浏览用户发布的专辑,随笔,故事三个页面,并完善了一下用户收藏页面的逻辑,当查询不到记录时显示提示;
2018/6/25:
1:完成了用户信息里的随笔收藏,专辑收藏,故事收藏这三个板块的浏览页面;
2018/6/24:
1:完成了各个板块除评论功能外基本的页面渲染及链接的跳转;
2018/6/23:
1:完成了通过分类id查询topic并且返回page的功能,解决的问题:开发时遇到自定义查询能完成查询但是却不能分页,总是查询出所有的记录,在网上搜索了很多遇到相同问题的记录,后来有网友解释早先版本是因为bug问题不能按照官方文档上的说明来实现分页,解决方案是在语句后加order by ?#{#pageable}来实现分页,但是从spring 2.0.4版本之后修复了这个bug,分页排序可以直接传pageable,加了这段语句反而不能分页,
spring2.0.4之前需要在value语句后加ORDER BY ?#{#pageable}并且在接口方法里传pageable来实现分页和排序 ;
spring2.0.4之后直接传pageable即可,再加ORDER BY ?#{#pageable}反而不能分页排序;
@Query(nativeQuery = true, value = "select * from topic where id in (select topic_id from category_topic where category_id= :categoryId)",//ORDER BY ?#{#pageable}
countQuery = "select count(*) from topic where id in (select topic_id from category_topic where category_id= :categoryId)")
Page<Topic> findByCategoryId(@Param("categoryId")Long categoryId,Pageable pageable);
2018/6/22:
1:经过跟网友的讨论,重新整理了实体类,废弃了多对多的级联映射,以提高性能及数据操作的灵活性;
2:在数据库中重新注入了测试数据;
3:实现了首页及专辑页的不带条件的查询的页面显示,接下来需要实现点击分类后进行分页查询并显示;
2018/6/21 :
1:根据前端页面及功能设计了一些实体类,通过hibernate注解配置好了实体类及实体类之间的级联关系,生成了数据库表;
2:增删改查已经通过测试,目前发现的问题:在Java9中已经移除了部分jarEE包导致hibernate会报错java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
<!--下面四个jar包是由于java9移除了这些jarEE包导致hibernate运行时抛出java.lang.ClassNotFoundException: javax.xml.bind.JAXBException-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.2.0</version>
</dependency>
另外在执行批量save时,注意saveAndFlush会返回id导致批量持久化会报错说重复的id字段;批量save时注意要在for循环里new对象才能保证id为空,否则只会不停的update数据导致只保存了一条记录;
2018/6/20 : 创建项目,导入前端页面;