个人项目的一些记录2- 通知和todo模块

141 阅读4分钟

todo模块

后端

  • 1. 数据表

除了基本的id、创建时间、更新时间、用户id等,其中date指的是代办所在日期,例如可以7月11日为7月14日创建一条代办,那么这条代办对应的date就是7.14,其中date均以2022-03-04这样的形式存在。

image.png

  • 2. 查找用户某一日期的todo(传入id,日期)(测试成功)
  • 3. 新增todo (测试成功) api参数:todo { description, priority, date, userId}
  • 4. 删除todo (测试成功)
    • 问题(1): 测试删除时报错nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread
    • 解决:service层加上@Transactional
  • 5. 标记完成 (测试成功)
  • 6. 更新todo (测试成功)
    • 问题(1): 测试删除时报错create_time为空,但是数据库中这项并不为空。
    • 原因: 将todo对象传给save方式时,jpa会将所有属性都更新,为null的属性也不例外。
    • 解决:参考这篇文章,整体思路是把传入的todo对象非空属性复制到从数据库获取的对象中。
  • 7. 修改todo获取按时间排序,不然默认会按名字排序。
    • jpa里设置两个排序基准, 一个是按创建时间升序,一个是按orderIndex升序。
  • 8. 调整todo顺序方法 参考 这里,我决定使用取中值法。
    • 将add修改为参数需要加一个日期和优先区域,因为orderindex是在同一日期同一优先区域的todo排的。(11.19)
    • 写完reoder相关的controller 、service,增加了几个sql(11.19)
    • 将设置为已完成的todo的orderindex设置为0,不再参与排序。(11.19)
    • markdone的内容更新update time(11.19)

前端

大部分内容都写好代码了,主要是测试一下功能。之后再把以前写的思路再整理一下。

  • 1. 添加待办测试
  • 问题(1):前端发送数据后后端校验优先级不通过。前端传的数据是字符串10,与后端10数据进行equals比较时返回false。检查后发现两个字符串长度都是2,所以不存在空格问题。打印哈希值发现,两者哈希值确实不同=> 后来复制到word中发现是低级错误,java枚举中的10的0打成了字母o。
  • 2. 设置待办为完成状态测试
  • 3. 查看具体某一天的待办测试
  • 4. 测试首先待办卡功能
  • 5.切换到待办页面时,前面会先显示“暂时没有待办”,然后页面会跳一下显示出拉取出的待办数据,这里需要优化一下,加一个loading功能。
  • 6. 调整todo顺序
    • 修改前端位置是否需要改变的判定代码(11.19)
    • 将已完成的todo按update time(完成顺序)排序(11.19)
    • 已完成的todo列表是computed数值,这里我加上了按照updatetime排序。发现后端这里没有更新updatetime导致排序不正确。
  • 基本思路:写一个demo记录一下思路,demo见另一篇文章。
  • 7. 编辑todo
  • 这里我的思路是todo直接为可编辑区,编辑完点击其他地方(blur事件)就会自动发送更新数据的请求。
    • 编辑todo前端校验(11.19)
    • 设置如果todo描述为空的话,页面上自动显示回原来的todo描述(11.19)
  • 这部分我是写了一个todo item的组件,当编辑区域blur之后,emit一个edit事件。这里我最终设置为如果描述为空或者描述与原来相同,弹出提示,恢复文本为原来文本,并且取消emit
   onBlurTodoContent(){
     const oldContent = this.description
     const newContent = event.target.innerText.trim()

     // 只有在描述与原来不同并且不为空的情况下,才会传送edit请求
     if(oldContent == newContent){
       event.target.innerText = oldContent
       this.$toast.show('待办描述未改变')
       return
     }
     if(!newContent){
       event.target.innerText = oldContent
       this.$toast.error('待办描述不能为空')
       return
     }

     this.$emit('edit', {newContent})
   }
  • 8. 删除todo(11.19)
  • 9. 读取某一月还有未完成待办的日期 (11.19)
  • 我想的解决方法是:将每一个日期存在一个todo_memo数据表中。记录该天是否有未完成todo。每次对某天todo进行增删改查后,更新这个memo。
    • memo数据表基本内容创建(entity、service等)

通知信息模块

后端

  • 1. 显示出某信息所有信息通知
  • 2. 将某条信息设置已读
    • 问题:发现根据id和用户id查找时,提示数据不存在。
    • 原因:发现自己数据库里的数据用户id末尾有空格。对于末尾没空格的行,查询出来结果是正常的。网上查询说理论上末尾空格是不影响查询结果的,所以这点仍存疑
  • 3. 删除某条信息
  • 4. 删除某用户所有信息
  • 5. 检查某用户是否有未读通知
  • 6. 新用户自动产生欢迎通知
  • 7. 增加查询最近3条的接口
  • 8.把之前查询添加上按时间顺序倒序排序。

前端

  • 1. 测试注册后是否自动显示新的通知
  • 问题(1): 通知的红点显示出来了,但是没有显示出信息。 原因:获取通知的api有误。
  • 2. 设置点击铃铛后只显示3条信息,如果总的条数超过三条会显示「显示全部通知」按钮
  • 这里改为不调用查询最近3条的借口,直接调用list借口,但是只在下拉单中渲染3条信息,然后进行判断,如果length> 3,则显示「显示全部通知」按钮。
  • vue如何只渲染数组中的前几个数据=> 设置v-if="index<n"即可。
  • 3. 改成显示全部,菜单里加滚动条,但对于内容多的信息会省略一部分内容
  • 多行文本隐藏
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3; //行数设置
line-clamp: 3;
-webkit-box-orient: vertical;
  • 添加滚动条
 overflow-y: scroll
  • 4. 通知标题hover后变颜色(改为出现下划线)。正文信息鼠标改为普通状态
  • 5. 点击某条信息后出现modal框显示信息全部内容。
  • 6. 修正关闭modal后dropdown也消失的问题。 drodpdown我是用了vue-click-away这个拓展,所以当点击dropdown以外部分的时候,dropdown会被关闭。我的思路是当modal打开的时候如何给dp传送一个值,当dp收到这个值后click away的处理事件会无效。

解决方法: 为dropdown设置一个clickAwayDisabled数据,当modal打开时,将这个数据设置为false,当modal关闭后,将这个数据设置为true。

    // 点击通知标题后显示通知
    showNotification(index, id){
      // 不允许dropdown在点击别处后关闭
      this.$refs.notiDropdown.clickAwayDisabled = true
      this.$refs.notificationModal.open()
      .....
    },
    // 处理通知modal关闭后
    handleNotiModalClosed(){
      const _this = this
      // 允许dropdown在点击别处后关闭
      setTimeout(()=> {_this.$refs.notiDropdown.clickAwayDisabled = false}, 0) // 这里需要设置setTimeout,才能保证设置false发生在modal真正被关闭后
    }

下面是dropdown相关函数

  onClickAway(){
      // 如果被外部禁用了clickaway则什么也不做
      if(this.clickAwayDisabled){
        return
      }
      if(this.active){
        this.active = false
      }
    },
  • 7. 点击某条信息并打开modal后发送将这条信息改为已读状态的api,然后刷新列表
  • 8. 测试删除单条通知
  • 9. 测试删除全部通知
  • 10. 清除全部通知加上确认modal(11.19)
  • 11. 清空全部按钮加hover效果
  • 12. 加loading效果