如果你想开发一个应用(1-23)

image.png

首页功能

接下来回到首页,想想现有功能的缺陷,是的,现在首页只能显示当前月的todos,看动漫中的情况,页面是有一个双重的滑动功能,在单月的情况下,滑动更新每个月的todos,然后到底之后,再去更新下一个月份,接下来要针对这个功能对首页内的todos各模块进行改造

布局改造

对于Panel组件来说,修改一下class即可:

\components\DiaryPanel.vue

.itemlist{
    position:relative;
    padding: 15px;
    overflow-y: scroll;  //纵轴显示滚动条
    height: 100%;
    z-index: 1;          
}

然后修改list组件,之前的代码是直接进行item的循环,这里要在外边包裹一层容器:

\components\DiaryPanel.vue

<div class="diarypanel">
    <mu-paper class="diaryitem" :zDepth="2" v-for="(item) in todos" >
        ...     
    </mu-paper>
</div>

首先同样是修改css:

.diarypanel{
    overflow-y: scroll;
}

这时候运行起来,你会发现,纵向滚动条依然无法显示,经过排查,原因为这个容器的高度不固定。没办法,在首页给这个容器加上一个样式:

\views\Index.vue

<div id="contentPanel">
    <transition   name="custom-classes-transition"
    enter-active-class="animated bounceInLeft"
    leave-active-class="animated fadeOut"
    :duration="{ enter: 700, leave: 200 }">
        <component v-bind:is="currentView">
        </component>
    </transition>
</div>

到了contentPanel的样式:

#contentPanel{
    overflow-y: scroll;
}

可以看到,依然不可以。

填充数据##

在继续修改样式之前,我们先对数据进行一下修改,修改为如果发现数据不能撑满一屏,那么继续查询下一个月,下面一步一步的完成这个改变,客户端开始,首先将读取的部分抽象独立出来:

setIndexData:function(data){
    this.$http.post("/api/index",data,{headers:{"token":this.token}}).then(res=>{
        ...
    },res=>{
        ...
    })
},

之前的refresh进行改造:

refresh:function(data){
    this.setIndexData(data);
},

而创建页面的时候首先会调用一次Irefresh,并付给当前的年份和月份:

created(){
    var month=(new Date()).getMonth();
    var year=(new Date()).getFullYear();
    this.refresh({month:month,year:year})
},

新增一个记录页面总记录数的变量,就叫allCount,每次回调之后更新此值:

if(!(result== undefined ||result=="")){
    ...
    this.allCount+=result.items[0].todos.length;
    ...
}

同时这里做一个是否充满屏幕的判断,采用最简单粗暴的方法,小于10条即认为他没有将屏幕充满,即新增一条判断:

this.allCount+=result.items[0].todos.length;
if(this.allCount<10){
    this.refresh({year:data.year,month:--data.month})
}

同时,在vuex部分还进行一下削繁就简,将叠加服务端返回todos的部分包装起来:

addIndexData(state,indexTodos)
{
    if(state.indexTodos[0].month==-1){
        state.indexTodos=[indexTodos];
    }
    else{
        var temp=state.indexTodos
        temp.push(indexTodos);
        state.indexTodos=temp;
    }
},

同时month的默认值给-1,然后setIndexData就可以光荣的退休了,直接删除即可。

下面运行看一下效果:

image

看上去似乎非常不错,但是,用手划一下会怎么样呢?

image

偿还服务端债务##

可以看到,一月份之后并没有变为上一年的12月份,看来之前的技术债务到了偿还的时候了。首先还是修改服务端的Controller的增加year的参数。

Integer year=Integer.parseInt(map.get("year").toString());

然后修改服务层参数,这里实际上不需要只有一个月份参数的时间区间,于是加上年份:

public List<Todo> getTodoByDefaultGroup(int userId,int year,int month) {
    TodoGroup todoGroup=todoGroupRepository.findByIsDefaultAndUserId(1,userId);
    DateBetween between=getDate(year,month);
    List<Todo>  todos= todoRepository.getByGroupIdAndCreateTimeBetween(todoGroup.getId(),between.getFirstDate(),between.getEndDate());
    return todos;
}

getDate的修改地点极少,只需要给first和end增加一行代码就行了:

private DateBetween getDate(int year, int month ){
    DateBetween between=new DateBetween();
    Calendar firstCalender =  Calendar.getInstance();
    // 获取前年月的第一天
    firstCalender.set(Calendar.YEAR,year);
    ...
    between.setFirstDate(firstCalender.getTime());
    // 获取前年月的最后一天
    Calendar endCalender =   Calendar.getInstance();
    endCalender.set(Calendar.YEAR,year);
    ...
    return  between;
}

然后对controller调用的部分进行修改。并且返回年份:

......
List<Todo> todos = todoService.getTodoByDefaultGroup(Integer.parseInt(userId),year,month);
Map<String, Object> data = new HashMap<String, Object>();
data.put("month", month+1); //java的月份从0开始
data.put("todos", todos);
data.put("year", year);
data.put("default", 1);
items.add(data);
......

ok 服务端改造完成

偿还客户端债务##

客户端由于设计的缺陷,组件化不够彻底,首页和panel页均访问服务器获取todos,这就要求他们两个均能读取年份和月份的信息并能分别计算,为了方便,从vuex入手(暂时依然不考虑使用getter),首先修改模型,增加year属性:

indexTodos:[
    {
        month:-1,
        year:0,
        default:1,
        todos
    }
],

然后修改index.vue,新增考虑年份的计算方法:

getBeforeMonth(year,month){
    if(month>0){
        return {year:year,month:--month}
    }else{
        return{
            year:--year,
            month:11
        }
    }
},

调用的地方修改为:

if(this.allCount<10){
    this.refresh(this.getBeforeMonth(data.year,data.month))
}

先采用最反模式的方法,在DiaryPanel.vue内同样更新一个类似的方法,同时对查询服务器方法的参数做适当的修改(由月份数字改为年月组成的对象):

getBeforeMonth(year,month){
    if(month>0){
        return {year:year,month:--month}
    }else{
        return{
            year:--year,
            month:11
        }
    }
},


upTodos(data){
    console.log(data.year);
    console.log(data.month);
    ...
}

下面再次用土土的方法测试一下:

image

修改一个bug

这时候看一下浏览器的输出:

image

啊哦,一直在往下查询,都查到了1987年,一下子查询了30年。这是一个小bug,最终要在页低输出一个已经是最后一条,为了方便操作,将首条记录的年月时间保存在客户端,首先修改一下vuex的模型:

firstYear:0,
firstMonth:0

设置值的方法略。

接下来服务端查询首条记录时间,以年月方式返回:

@RequestMapping(value = "/api/mindate",method = RequestMethod.POST)
public Object getMinDate(HttpServletRequest request,@RequestBody Map map){
    Integer userId= Integer.parseInt(request.getAttribute("tokenId").toString());
    Date firstDate=todoService.getFirstDateByGroupId(userId);
    Map<String, Object> data = new HashMap<String, Object>();
    Calendar calendar=Calendar.getInstance();
    calendar.setTime(firstDate);
    data.put("year",calendar.get(Calendar.YEAR));
    data.put("month",calendar.get(Calendar.MONTH));
    return result(data);
}

服务层:

public Date getFirstDateByGroupId(int userId) {
    TodoGroup todoGroup=todoGroupRepository.findByIsDefaultAndUserId(1,userId);
    Todo todo=todoRepository.getFirstByGroupIdOrderByCreateTime(todoGroup.getId());
    return todo.getCreateTime();
}

orm略

然后在进入首页的时候调用,并保存:

refresh:function(data){
    this.$http.post("/api/mindate",{},{headers:{"token":this.token}}).then(res=>{
        console.log(res);
        if(res.data.msg!=""){
            this.$router.push({name:"Login"})
        }
        var result=res.data.data;
        if(!(result== undefined ||result=="")){
            console.log(result);
            this.$store.commit('setFirstYear',result.year);
            this.$store.commit('setFirstMonth',result.month);
        }
    },res=>{
        //查询服务器失败
        this.$router.push({name:"Login"})
    })
    this.setIndexData(data);
},

而判断方式,则采用最简单粗暴的,只判断一下年份:

if(data.year>=this.firstYear){
    this.upTodos(this.getBeforeMonth(data.year,data.month))
}else{
    this.loading=false;
}

同时,loadMore方法也需要做一下判断这里就要年份和月份同样判断了:

loadMore () {
    //赋值
    var year=this.indexTodos[this.indexTodos.length-1].year
    var month=this.indexTodos[this.indexTodos.length-1].month-1  //上一个月
    if(year>=this.firstYear&&month>this.firstMonth){
        this.loading = true
        this.upTodos(this.getBeforeMonth(year,month));
    }
},

再次运行,这个bug消失了。

偿还了部分技术债务,并且修改了部分bug,这一章也暂时告一段落。

客户端代码:
github

服务端代码:
github

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • 数据模型 mvvm是数据驱动的,数据模型占了举足轻重的地位,所以,在做首页最终要的todo列表组件的时候,先暂时在...
    双鱼座的牛阅读 508评论 0 0
  • 日历页 接下来把目光转向日历页,这个日历页的功能很单一,点击按钮后,显示当天记录日记项,为了方便起见,仍然不考虑分...
    双鱼座的牛阅读 429评论 0 0
  • 目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element★13489 ...
    余生社会阅读 19,776评论 7 233
  • 首先这个差距是指什么差距?三观?爱好?习惯?还是脾气之类的。。。 以我的性格的话,我特别讨厌冷战,觉得简直就是煎熬...
    古米阅读 214评论 1 0
  • 老师为了鼓励我们写作,要求写下自己的10优点,让我们能够积极的面对生活。 我想了一下,我这个人各方面都不突出,什么...
    如烟出岫阅读 768评论 0 0