3.10 学习-侧边导航
顶部菜单中的学习
首先发起一个post请求chapters,发送的参数为courseId以及一个标记参数sub。
在统计的时候,已经有一个chapters请求,当时是查找所有章节,然后用作下拉菜单,并不需要做子章节,而这个sub就是标记,如果这个值不为空,那么按这一节的要求做子章节(有subChapters)
返回的json将填满左侧的章节导航,json结构如下:
{ "code": "200", "info": "31", "data": [ { "score": 0, "code": "010000", "parentCode": "000000", "serial": "第一章", "name": "python介绍", "subChapters": [ { "score": 0, "code": "010100", "parentCode": "010000", "serial": "1.1 ", "name": "python开发环境", "id": "771" }, { "score": 0, "code": "010200", "parentCode": "010000", "serial": "1.2 ", "name": "第一个python程序", "id": "772" }, { "score": 0, "code": "010300", "parentCode": "010000", "serial": "1.3 ", "name": "使用pycharm", "id": "783" }, { "score": 0, "code": "010400", "parentCode": "010000", "serial": "1.4 ", "name": "如何学习python", "id": "792" } ], "id": "765" }, { "score": 175, "code": "020000", "parentCode": "000000", "serial": "第二章", "name": "变量和运算符", "subChapters": [略...], } //其余部分略 ]}
这里的难点在于子章节,除了从数据库里找到章节数据外,还要从code值再去查一次数据库,看有没有子章节,有的话把数据绑定到subChapters下,下面是实现的伪代码:
List<Chapter> chapterList=从数据库里根据courseId取得主要章节(code值以0000结尾);JSONArray arr=new JSONArray();/*json数组 */for(Chapter cha:chapterList){ JSONObject obj=new JSONObject(); /* 把需要的属性逐个加入到obj */ obj.put("score",cha.getScore()); obj.put("code",cha.getCode()); 其余省略; /* 处理子章节,只处理一层, 如果懂递归,这里用递归处理更合理 */ List<Chapter> subChapters=使用cha的code值作为parentCode以及cha的courseId来查找,看是否有数据,有的话就是cha的子章节; if(subChapters != null && subChapters.size() > 0){ /* 第2行到第13行的逻辑再来一遍 */ JSONArray subChapter=new JSONArray(); for(Chapter c:subChapters){ JSONObject ob=new JSONObject(); /* 把需要的属性逐个加入到ob */ ob.put("score",cha.getScore()); ob.put("code",cha.getCode()); 其余省略; /* 节点增加到子章节 */ subChapter.add(ob); } /* 子章节的json数组数据加入json */ obj.put("subChapters",subChapters); } /* 节点增加到数组 */ arr.add(obj);}CommonMessage message=new CommonMessage("200");message.setData(arr);message.setInfo(courseId);
至于serial这个属性,也就是现实“第一章”,“1.2 ”值,它是根据code值计算出来的,可直接调用下面的函数:
/**把code变成1.1这样的形式 * */public static String chapterSerialNumber(String code){ if(code==null || "".equals(code)) return ""; String firstLevelCode=code.substring(0,2); String secondLevelCode=code.substring(2,4); String thirdLevelCode=code.substring(4,6); int m1=Integer.parseInt(firstLevelCode); int m2=Integer.parseInt(secondLevelCode); int m3=Integer.parseInt(thirdLevelCode); if(m2==0 && m3==0) return m1+""; if(m3==0){ return m1+"."+m2+" "; } return m1+"."+m2+"."+m3+" ";}/**把code变成“第一章”或者“1.2”这样的形式 */public static String getChapterName(String code){ if(code==null || "".equals(code)) return ""; String chapterName=chapterSerialNumber(code); int m1=0; String chapter2=""; if(chapterName.indexOf('.')!= -1){ String chapter1=chapterName.substring(0,chapterName.indexOf('.')); m1=Integer.parseInt(chapter1); int f=chapterName.indexOf('.'); int s=chapterName.indexOf('.',f+1); if(s==-1) chapter2=chapterName.substring(f+1); else chapter2=chapterName.substring(f+1,s); } else{ m1=Integer.parseInt(chapterName); } String m=""; switch(m1){ case 1:m="一"; break; case 2:m="二"; break; case 3:m="三"; break; case 4:m="四"; break; case 5:m="五"; break; case 6:m="六"; break; case 7:m="七"; break; case 8:m="八"; break; case 9:m="九"; break; case 10:m="十"; break; case 11:m="十一"; break; case 12:m="十二"; break; case 13:m="十三"; break; case 14:m="十四"; break; case 15:m="十五"; break; case 16:m="十六"; break; case 17:m="十七"; break; case 18:m="十八"; break; case 19:m="十九"; break; case 20:m="二十"; break; default:m=""+m1; } StringBuilder buffer=new StringBuilder("第"); buffer.append(m).append("章"); if(chapter2 != null && ! "".equals(chapter2))){ buffer=new StringBuilder(chapterName); } return buffer.toString();}
尝试完成学习页面的左边栏