todo模块
后端
- 1. 数据表
除了基本的id、创建时间、更新时间、用户id等,其中date指的是代办所在日期,例如可以7月11日为7月14日创建一条代办,那么这条代办对应的date就是7.14,其中date均以2022-03-04这样的形式存在。
- 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
- 问题(1): 测试删除时报错
- 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效果