1.app端登录功能

  • 整体思路与admin微服务登录和wemedia微服务登录相差不多,唯一需要注意的是

    • 因为app端支持不登录先看看的功能,所以不会向后台传userId,没有userId的情况下就不会生成token,所以当用户选择不登录先看看时应该添加获取token的处理.
      1. else {
      2. Map<String,Object> map = new HashMap<>();
      3. // 通过设备ID登录的 userId存0
      4. map.put("token",AppJwtUtil.getToken(0L));
      5. return ResponseResult.okResult(map);
      6. }

      2.app端-文章列表获取功能

  • 实现思路:

    1. 1. 在默认频道展示10条文章信息
    2. 1. 可以切换频道查看不同种类文章
    3. 1. 当用户上拉可以加载更多的文章信息(按照发布时间)
    4. 1. 分页
    5. 1. 根据前端传递过来的最小时间(即最后一条文章的发布时间)去数据库查询更早的文章返回前端显示
    6. 4. 当用户下拉可以加载最新的文章
    7. 1. 分页
    8. 1. 根据前端传递过来的最大时间(即第一条一条文章的发布时间)去数据库查询更晚的文章返回前端显示

    3.文章详情页面静态化

  • 所用技术亮点: minio 因为页面消息访问量大,如果每次都去数据库查询,严重影响效率,所以为了解决这个问题,引入了页面静态化的技术,我们项目使用的开源的minIO,类似OSS的分布式文件存储服务器

  • 实现思路:

    1. 1. 首先修改文章对应的表,增加一个字段,用来存储minIO中页面的路径
    2. 1. 获取模板
    3. 1. 准备数据
    1. //3. 用数据替换模板,输出到指定的输出流中
    2. StringWriter stringWriter = new StringWriter();
    3. template.process(map,stringWriter);
    4. String contentHtml = stringWriter.toString();
    5. // 4. 将静态也 上传到minIO中 静态页名称: articleId + .html
    6. String store = minIOFileStorageService.store(prefix,
    7. apArticle.getId() + ".html",
    8. "text/html",
    9. new ByteArrayInputStream(contentHtml.getBytes())
    10. );
    1. 4. 用数据替换模板,输出到指定的输出流中
    2. 4. 将静态也 上传到minIO 静态页名称: articleId + .html
    3. 4. minio中静态页面的路径 设置到 article表的static_url属性上
    4. 4. 在发布文章时,和app端加载文章列表时也要把static_url的路径补全

    4.app端-关注作者或取消关注

  • 所用技术亮点: Redis

  • 由于业务需求,如果使用mysql数据库保存两者的关系,需要频繁的对该表CRUD降低了效率,所以我们采用Redis进行存储该数据
  • 设计思路:

    • 从用户的角度出发:一个用户可以关注其他多个作者 —— 我的关注

      从作者的角度出发:一个用户(同是作者)也可以拥有很多个粉丝 —— 我的粉丝

    • 数据之间一对多所以采用集合方式,关注时间要有序,所以要选用有序的集合,数据需要不重复,所以满足所有需求的集合为ZSET

  • 示例: 当一号用户关注了二号关注,就在follow表中加一条数据

    1. 同时一号用户也成为了二号用户的粉丝,要在fans表中添加一条数据
    1. ZADD follow:1 time(时间戳) 2
    2. ZADD fans:2 time(时间戳) 1
  • 实现思路:

    1. 1. 参数校验
    2. 1. 自己不能关注自己
    3. 1. 判断operation的值是否等于0(关注)
    4. 1. 满足 如果是0 关注该作者 ZADD 集合添加数据
    5. 1. 不满足 如果是1 取消关注该作者 ZREM 集合删除数据