本博客会一直记录从2020年8月26日起至2020年11月22日之间新乡学院统战部项目的全部开发历程。
综述:由于该项目是在大四上学期进行的,博主经历了自考、软考、发现杯比赛、蓝桥杯省赛、蓝桥杯国赛、发展对象考试以及2021考研,本身又身为该项目的后端负责人,中间的时间十分碎片化,在项目开发时博主很难兼顾到方方面面,在项目开发的过程中很难做到专一
该项目是我接手过的最庞大的一个项目,光数据库的表就有40多个,而且后期因为我的需求一直在变更,也导致开发时间被托的比较长。
该项目也是我搭建的第一版后端框架的第一次实践,中间也有部分时间是对框架的优化
准备阶段
2020年8月26日——需求分析
- 下午4点钟学长开始给我们讲新乡统战部的前台需求。这次确实整个业务需求是比较庞大的,一共有4个大模块——新闻发布获取,联谊聊天,发文章,考试。(仅仅是初期需求)
2020年8月28日——需求分析
- 晚上所有项目组人员、包括python组成员一起到5楼听后台需求,还是非常的多,作为后端人员来说前台和后台的需求也是必须要了解的,所以就非常头疼。
2020年8月29日——设计数据库
- 一上午就和学长设计数据库,前前后后一共设计了20张表(初期),加上原先框架的表一共有30张表。
- 我们后端一共4个人,分别对应四个模块,分好任务和表之后开始画各自的ER图,我是画了9张表,
- 晚上再集中讨论ER图的问题,都互相指出了各自的不足。
2020年8月30日——讨论数据库
- 主要给其他后端人员讲数据库,讲原先eladmin数据库的设计思路与RBAC权限控制思想,并讨论自己的表现存的问题。
2020年8月31日——讨论分工
- 上午项目组所有人开始讨论分工,前端讨论和后端讨论。
- 我的模块主要是联谊交友(初期),其实就是聊天,所以第一个要解决的问题就是netty。
- 回顾netty相关的知识,主要是通过之前写的群聊系统。
2020年9月1日——整合netty
- 上午整合netty,主要看如何实现一对一聊天
方案是使用ConcurrentMap存放用户唯一标识和其channel。 - 但是有一个主要问题是这个用户id如何拿到。
1.通过在前端new Sockcet时,在url末尾加上参数,后端摘取
2.在成功连接到websocket服务器后的回调中发送一条默认消息,其中包含用户唯一标识。 - 我个人倾向第一种,所以需要在升级为ws协议之前获取到http请求的url。即要添加自定义InBoundhandler。但是netty的自定义handler是不会自动去调用下一个handler的,所以在网上搜索了大量的资料,但基本上都没有用。
- 下午算是终于找到了手动执行下一个handler的方法:
就是这个handler实现ChannelInboundHandler接口,重写channelRead方法,在方法最后一定要显示调用fireChannelRead(msg)方法。 - 之后一对一大体流程就走通了,然后提交了一个版本,初始化了fellowship模块。
- 晚上和后端项目组统一后端开发规约。
2020年9月6日——项目排期
- 疫情后刚刚开学,晚上项目组开会,主要是针对项目排期。
开发阶段一
2020年9月7日——聊天模块
- 上午和学长分析联谊的新需求,并改数据库。
- 进行项目上任务的细分,还没有排期。
-下午和前端人员确定聊天的传输数据结构
并初步写了聊天转发与存储。提供了更新已读接口。
2020年9月8日——名单模块和聊天模块
- 上午主要处理联谊名单这一块的接口,写了增删查。
- 下午修改聊天模块的bug:
首先是发现在我的handler里无法依赖注入,所以只能使用SpringContextHolder去拿到bean。
使用hutool的JSONUtil.toBean去转换json,JSONUtil.toJsonStr - 晚上进行项目的同步,剩下的时间主要给go组讲一些java中的方法和逻辑。并且和学长重新讨论了前台登录逻辑。
2020年9月9日——联谊模块和微信登陆
- 上午写微信登陆方面,根据昨晚讨论的登录流程:
以有无token为依据,无token发code,token过期发code,后端根据code拿openid,查用户,有关联手机返回token,无关联则为第一次登录让其登录。 - 但是公众号这边想要拿code还是需要让前台授权才行。
- 下午继续写联谊模块,但是越写越感觉表设计的有问题,就很乱。之后去和学长讨论,学长直接又说需求重新改了。之后就又和学长讨论新需求,并且设计数据结构,然而也没讨论完。
- 晚上学长们终于定了需求,开始和我们项目组的人讲需求,但是在定数据结构的时候又不确定了,主要问题是是否需要维护第一次上传的名单。最后敲定为需要维护第一次上传的名单。
2020年9月10日——分析模块
- 上午和学长最后对了一次联谊的需求,并确定。之后开始写分析模块,主要针对前台和后台。
- 晚上新乡学院统战部进行项目同步,各自汇报进度。之后项目组内讨论问题。
2020年9月11日——分析模块
- 下午写分析模块,主要是针对后台的分析,因为总体来说后台的分析还是比较难,要组装好数据,把整体返回给前台。
- 晚上继续写分析模块。之后测试已写接口的bug。
2020年9月12日——分析模块
- 上午先和学长再次确认数据库联谊模块的表。之后开始写联谊任务模块,基本上没有什么太难的地方。
- 下午写联谊模块,也就是联谊确认表。由晚上再一次开同步会,我这边的大排期基本上是已经完成了。
- 晚上再一次开同步会,我这边的大排期基本上是已经完成了。之后是小组之间讨论一些缓存和规约问题,还有前、后台的对接问题。
2020年9月13日——测试与修复
- 上午针对已经告一段落的排期,开始完善之前写过的接口,显示测试,之后加日志,修复一些bug。
2020年9月14日——后台数据分析导出
- 上午先是修改之前时间查询的bug,时间比较确实用的还是between and,但是时间的格式需要转化:
(l.create_time BETWEEN DATE_FORMAT(#{startTime},'%Y-%m-%d')" + " AND DATE_FORMAT(#{endTime},'%Y-%m-%d'))
- 之后写后台数据分析导出,这个就比较麻烦了,因为导出的上线率、话题书、讨论数和点赞数都是单独的,所以要写四个业务,还需要根据条件写10个sql方法。
- 下午继续写后台数据分析导出。
- 晚上项目同步,之后小组讨论。
2020年9月15日——修改微信登录和配置UEditor
- 上午先调配组员提pr,合分支。之后和学长讨论用户导入时excel的规范。之后修改微信登录,配合前端拿openid。
- 又帮前端人员改了改前台的问题,配合我拿到了openid。需要注意的是测试号的配置,还有拿code时的重定向。
- 之后修改了文件接口和存储路径,现在实现了域名拼接即可访问资源。
- 晚上看学长给我分配的springboot整合ueditor的任务。
2020年9月16日——配置ueditor和修改bug
- 上午开始配置ueditor,由于ueditor这个富文本编辑器还是比较老的,目前官方给的是jsp版本,也就是前后团还不分离,但是网上给的整合教程大多都是需要改源码。我试着根据一些教程的步骤整合了一下,但是前端显示后端配置错误。所以上午就是一直在研究。
- 下午修改联谊接口,主要修改查询联谊信息时,需要返回联谊人和被联谊人的信息,然后不同对立方查到的信息是相对的,但是数据库只存了一条记录,这就导致查询和封装时容易封装反。最后还是多些了很多的sql完成了这一块。
- 晚上学长给我建议去github搜索现成整合好的ueditor,我试着迁移了几个,确实可以用,不过也是修改了源码,但是只要可以用就行。整合ueditor就算告一段落了。
2020年9月17日——各个细节实现
- 早上第一件事还是协调merge代码。
- 下午写用户导入,还是比较简单的:
public void importList(List<List<Object>> list) { Long userid = SecurityUtils.getCurrentUserId(); Timestamp d = new Timestamp(System.currentTimeMillis()); for (int i = 0; i < list.size(); i++) { List<Object> lo = list.get(i); List<Cell> cells = new ArrayList<>(); for (int j = 0; j < lo.size(); j++) { Cell c = (Cell) lo.get(j); c.setCellType(CellType.STRING); cells.add(c); } User user = new User(); //可以将数据遍历出来后,存储到数据库中 user.setNickName(cells.get(0).getStringCellValue()) .setGender(cells.get(1).getStringCellValue()) .setDept(systemMapper.getDeptByName(cells.get(2).getStringCellValue())) .setUsername(cells.get(3).getStringCellValue()) .setPhone(cells.get(4).getStringCellValue()) .setCreateBy(String.valueOf(userid)); user.setCreateTime(d); if (user.getDept() == null) { throw new BadRequestException("党派团体名称有误"); } create(user); } }
- 之后改了一些聊天方面的bug,增加了未读消息个数,修改了双方显示不一致的问题。
- 晚上配置腾讯验证码,实现前台短信验证。之后项目同步,给前端人员处理前台登录问题。
2020年9月18日——协调前端和联谊模块
- 上午先帮助组员协调merge,review代码。之后配合前端人员写前台的登录,成功拿到了token。
- 和学长讨论有关联谊需求的变更,并最终确定需求。
- 之后写联谊名单的导入,先自定义excel模板,自己先尝试在后端解析后返回给前端。
- 晚上根据小组其他同学写好的腾讯sms服务,自己整合了过来,供前台使用。之后进行项目同步,给go组解答疑难。
2020年9月19日——联谊模块
- 上午在协调merge完代码之后就开始改数据库的表,主要是联谊名单那这块的。
- 下午写有关联谊名单发布的接口,一次性要改批量插入两个表。至此,项目组群里有关我的排期算是全部完成了。
- 晚上先修一些bug,之后开始写博客。是有关于自己之后考试时间的安排。
2020年9月21日——联谊模块
- 根据需求修改数据库,新增短信记录表。之后新增短信记录业务,完善我的联谊模块,修bug。
- 下午继续完善联谊模块,优化联谊确认的返回值,新建vo,尽可能使前端方便展示数据。
- 新增获取openid接口。
2020年9月22日——研究mybatis缓存
- 上午继续完善联谊模块,其中最主要的是研究缓存问题。
- 之前使用了mybatis本身的二级缓存,效果非常不错,但是后台那边却给我提示了一个错误,就是分页后返回的total和pages均为0,一开始我以为是分页插件或是自己的问题。经过好大一段时间排查之后发现是在mapper层加上 @CacheNamespace( blocking = true)
- 这个二级缓存回合mybatis plus的分页插件产生冲突,而且mp的官方文档里也提醒到尽量将缓存加到service层。真是鱼和熊掌不可兼得。
- 经过一上午的努力,终于实现了mp + redis,可以实现原生的page正常使用,但是自己写的分页sql还是有bug。
2020年9月23日——心跳检测
- 聊天加入心跳检测。
2020年9月24日——修bug
2020年9月25日——给go讲登录的流程和权限验证
2020年10月1日——处理项目组事务
- 根据学长昨晚的要求,是要有根据openid返回token的接口。完善之后,协调merge其他成员的PR,之后重新打包部署。接着就是处理其他成员的事务。
第一次联调
2020年10月4日——联调
- 今天周日,集中抽出一天的时间进行项目联调,关于我负责的部分主要找出了以下一些bug:
- task的create_by
- 登录记录频繁提示登录已过期(其实不算bug)
- schedule计算
- 联谊确认的分页
- 前台分析参数
- ueditor获取配置文件
- 聊天传输错误
- 下午是针对上午的bug进行修复,基本上都是一些基础的bug,其中ueditor:
Jar包里是不能以ClassLoader.getResource().getPath()来获取文件的路径,应该用Class类的getResourceAsStream()来获取。即String configContent = this.filter(IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("config.json")));
2020年10月5日——完善项目
- 上午去双湖创客,继续完善昨天修改的问题,并和学长讨论有关缓存的问题,还有@One与@Many的问题,这个暂时没有一个定论,打算加了mp官方技术交流群之后再讨论。给项目加上了数据权限,并检测出当为超级管理员时,数据权限为全部,那么查询出来为空集合。最后进行了一版打包部署。
开发阶段二
2020年10月12日——同步第二版新需求
- 晚上新乡学院统战部开始同步第二版需求,其中我这块新增的比较多:
- 联谊新需求
- 数据分析新需求
- 联谊任务新需求
2020年10月19日——处理项目bug
2020年10月20日——开发第二版需求
- 先处理新增联谊体会提交这这一块,修改了数据库。
- 下午继续开发第二版,新增学习体会分析和学习任务分析。并重写了后台分析导出的格式。
- 晚上在双湖创客进行项目同步,说了每个人还存在的问题。晚上我又做了h5登录,不需要通过微信拿openid,并且其他好多的查询不需要微信的内容,这就需要更改比较多的地方。
2020年10月21日——开发第二版需求与修bug
- 上午继续在双湖创客开始进行第二版的开发,新版需求最后剩一个联谊确认的显示和导出。新增一些显示倒不是很难,主要就是导出,有合并单元格,还进行了宽度自适应,搞了比较长的时间。
- 下午主要修改bug,其中包含了以前遗留的不少bug。首当的是微信登录的一些bug。
- 晚上在双湖创客进行联调,继续修改bug。
2020年10月22日——修bug
- 主要修改了分页显示和数据分析总用户。
2020年10月23日——修bug
- 添加了管理员一键重置用户密码接口,还有关于用户禁用的解决方法。
第二次联调
2020年10月26日——新院统战第二次联调
- 晚上新乡学院统战部正式联调,问题果然是不少:
2020年10月27日——修改bug
2020年10月28日——修改bug
2020年10月29日——修改bug
- 改了ueditor的bug:
主要是有关@Value注解注入时间比构造方法晚,所以构造方法里的变量可能为null,改了这个bug
2020年10月30日——修改用户导入
- 修改用户导入接口,新增院系。
第三次联调
2020年10月31日——第三次联调
- 上午修改了一些项目的bug。
- 下午项目再次进行联调测试,并修改bug,这次主要是针对联谊和聊天这一块。
- 晚上继续联调测试,并且配置nginx代理websocket。
2020年11月1日——交付测试和项目评估
- 学长拿着项目给甲方进行测试,中间出现的问题并不是很多,其中我的联谊导入和发布出了bug。
- 下午学长过来进行项目评估,并提出了一些新的问题,主要是我这块的问题比较多。之后我根据学长提的新问题开始修改.
2020年11月4日——修改bug
2020年11月8日——修改bug和新需求
- 上午到小组之后就开始改之前遗留的问题和bug。
- 下午把旧的bug改的差不多之后便和学长对新的需求,其实还是挺麻烦的:
- 查询父党派数据时要把子党派查出来
- 书记身份加上院系过滤
- 前台统计多了好多内容和党派筛选。
- 刚对完之后由于需要修改的地方过于多和麻烦,还自闭了一会,学长过来给我开导。
2020年11月9日——写新需求
- 上午到小组之后开始补第二版的新需求,先把前台多出的统计分析和党派筛选加上了。
- 下午把开始加书记身份的院系数据过滤,这一块可以说是非常麻烦,因为默认书记身份不管进行任何查询,都要进行院系的过滤。
2020年11月10日——写新需求
- 上午到小组之后继续补第二版的新需求,先处理了一些昨天前台处理的bug,之后开始继续加院系的过滤,最后算是把所有查询都加了院系过滤了。
2020年11月11日——写新需求
- 主要是针对查询党派时需要将子党派也查出来,这个需要改动的地方也特别多。
2020年11月12日——完成子党派查询
- 上午到小组之后开始加子党派的查询,主要有前台分析,后台分析,后台分析导出,后台联谊查询、后台联谊查询一共5个部分。之后继续去小组给接口加子党派查询,而且补了一个给未上线的人聊天时发送消息模板的接口。
2020年11月13日——修改bug
- 上午到小组之后除了修复部分bug问题外,还有就是修复redis同时记录了好多条用户登录信息的问题,之后排查发现我是
先判断redis有这个key没有,没有的话再set进去,但是这就导致了高并发情况下会有多次set。之后尝试使用Map去存储,想着这样会快一些,但是发现还是有这个问题。上午算是没有把这个问题解决掉 - 下午和学长讨论之后,用redis的自增set解决这个问题。
部署阶段
2020年11月17日——部署
- 上午和学长一块去了新乡学院部署项目。上午基本上都是学长在操作,我也就是在一旁看着。
- 对方直接给我们扔了一台物理机。我们从零开始,中间还要配网络,属实麻烦。
- 下午继续去新乡学院部署项目,发现在起了docker的情况下会使子网络下其他主机ping不通,之后放弃docker,开始用宿主机安装。一直到6点才弄完,中间还要改一些项目上的配置。之后去了他们的机房开始安装物理机,还是很大气的,但是在调试的时候还是出了一些问题,例如网关消失,这个一直到快7点也没有弄成功,最后只能到明天再去。、
2020年11月18日——部署
- 由于19号就党员考试了,只得让其他组员先去和学长部署了。但是下午打电话给我说项目还是有些bug,今天仍然不能完工。
2020年11月20日——修复bug
- 下午开始修复项目又测试出来的bug,还比较多。晚上也是修复bug。
2020年11月21日——修复bug
- 上午解决联谊这一块的bug,没想到联谊确认这一块这么麻烦,当时设计的数据库也不是十分方便。
自11月22日之后,博主就开始全身心考研,之后也有些零碎的小问题,都直接让其他组员帮我解决了
1 条评论
叼茂SEO.bfbikes.com