本博客会一直记录从2020年8月26日起至2020年11月22日之间新乡学院统战部项目的全部开发历程。



准备阶段

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日——讨论分工

  • 上午项目组所有人开始讨论分工,前端讨论和后端讨论。
    新院统战分工.jpg
  • 我的模块主要是联谊交友(初期),其实就是聊天,所以第一个要解决的问题就是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。
    新院统战bug.png

2020年10月22日——修bug

  • 主要修改了分页显示和数据分析总用户。

2020年10月23日——修bug

  • 添加了管理员一键重置用户密码接口,还有关于用户禁用的解决方法。

第二次联调

2020年10月26日——新院统战第二次联调

  • 晚上新乡学院统战部正式联调,问题果然是不少:
    新院统战第二次联调.jpg

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,没想到联谊确认这一块这么麻烦,当时设计的数据库也不是十分方便。

最后修改:2021 年 06 月 03 日