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<ChapterchapterList=从数据库里根据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<ChaptersubChapters=使用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();
}
尝试完成学习页面的左边栏