仿百度网盘的面包屑导航实现

最近项目需要做一个类似网盘的东西,然后有个功能是,浏览文件的时候能够返回之前的目录。因为以前没接触过,思考了许久,终于算是实现了,特此记录一下。

首先说一下什么是面包屑:
在bootstrap官网中这么描述的:在一个带有层次的导航结构中标明当前页面的位置。
类似下图:

5679451-04455e4b2378f017.png

实现这个功能是必要的,因为用户如果点进一个文件夹,发现没有想看的文件,可此时一个一个往回点又太麻烦,所以需要一个面包屑路径,帮助用户快速回到之前的文件夹。

先来看看实现后的样子:

5679451-15c306e8df9e3601.png

点击Team01的文件夹会返回上一级:


5679451-e9dcf3c44f119e3f.png

下面来看实现思路:

一、数据库设计

两张表:文件信息表和文件关系表
文件信息表用于存放文件的信息,比如ID,大小,名称等等。
文件关系表用于描述文件之间的父子关系。

数据如下:

5679451-71e8706d60c6e8ef.png
文件信息表
5679451-59f79d56febdb1cb.png
文件关系表

二、后台设计

后台使用MVC模式,所以只贴controller层的代码,并讲一下逻辑就好了。

因为我们点击之前的路径时,需要知道文件ID才能去数据库查,需要知道当前路径才能更新面包屑。
所以通过生成<input type="hidden"/>标签,在这个标签里放置文件ID列表和文件路径列表。类似这样:

5679451-b892638c5643245b.png

可以看到这两个input标签的value中存放着我们需要的数据。这样就为实现这个功能做好了数据准备。

后台接受四个参数: 文件ID,当前路径,当前路径对应的ID序列,当前路径对应的路径序列。得到之后,进行拼接后通过EL表达式将拼接后的路径写到input里。

同时还要修改面包屑的<a>标签的href:


5679451-4bca6fbf813eff04.png

怎么修改这个href呢?我们要保证之前的链接的ID序列和路径序列要恢复原样,也就是要比后面的链接短。举个例子:

面包屑:path1 -> path2 -> path3
文件夹ID序列:3 ->5 -> 7
路径序列: path1 ->path2 -> path3

假设现在处于path3层级。点了path1。那么此时文件夹ID序列和路径序列必须恢复到path1时候的样子。即:
面包屑:path1
文件夹ID序列:3
路径序列: path1

所以我们需要对这两个序列进行截取,然后拼接到<a>标签的href属性上。

思路大致就是这样,相关代码如下:

controller代码:

    @RequestMapping(value = "/getsubfiles.do")
    public String getSubFilesByFileID(HttpServletRequest request, @RequestParam(value = "fileID") String fileID,
            @RequestParam(value = "curPath") String curpath, @RequestParam(value = "pathStr") String pathStr,
            @RequestParam(value = "idStr") String idStr) {

        List<FileInfo> subFiles = fileService.querySubFilesByFileID(fileID);
        FileBreadCrumb fileBreadCrumb = new FileBreadCrumb();

        String newPathStr = pathStr + "," + curpath;
        String newidStr = idStr + "," + fileID;
        fileBreadCrumb.setPathStr(newPathStr);
        fileBreadCrumb.setIdStr(newidStr);
        ArrayList<String> arrayList = new ArrayList<String>();
        String[] split = newPathStr.split(",");
        for (int i = 1; i < split.length; i++) {
            arrayList.add(split[i]);
        }

        request.setAttribute("breadcrumb", fileBreadCrumb);
        request.setAttribute("breadPath", arrayList);
        request.setAttribute("fileList", subFiles);
        if (subFiles == null) {
            System.out.println("该文件夹没有没有子文件");
        }
        return "online-disk";
    }

JavaScript代码:

/**
 * 文档管理JS
 */
$(function() {
    
    // 修改文件夹的链接地址
    var pathStr = $("#forbreadcrumbpath").attr("value");
    var idStr = $("#forbreadcrumbid").attr("value");
    $("a.filelist").each(function(key,value){
        $(this).attr("href",$(this).attr("href")+"&pathStr="+pathStr+"&idStr="+idStr);
    })
    
    var paths = pathStr.split(",");
    var ids  = idStr.split(",");
    // 修改面包屑的链接地址
    $("a.breadlist").each(function(key,value){
        // alert($(this).attr("href"));
        var pathStr_temp="";
        var idStr_temp="";
        for (var i=0;i<key+1;i++){
             pathStr_temp = pathStr_temp+ paths[i]+",";
             idStr_temp = idStr_temp+ids[i]+",";
        }
        if (pathStr_temp.charAt(pathStr_temp.length-1)==",") {
            pathStr_temp= pathStr_temp.substring(0,pathStr_temp.length-1);
            idStr_temp = idStr_temp.substring(0,idStr_temp.length-1);
        }
        $(this).attr("href",$(this).attr("href")+"fileID="+ids[key+1]+"&curPath="+paths[key+1]+"&pathStr="+pathStr_temp+"&idStr="+idStr_temp);
        //alert(paths[key+1]+":"+ids[key+1]);
    })
});

JSP相关代码:

<input type="hidden" id="forbreadcrumbpath" value="${breadcrumb.pathStr}" />
<input type="hidden" id="forbreadcrumbid" value="${breadcrumb.idStr}" />

<ol class="breadcrumb">
        <li >
                <i class="fa fa-home"></i>文档管理
         </li>
          <c:forEach items="${breadPath}" var="iter_path">
                   <li>
                     <a class="breadlist" href="getsubfiles.do?">${iter_path }</a> 
                   </li>
          </c:forEach>
</ol>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现仿百度网盘的功能,可以运用C语言的文件读取函数fopen()、fgets()、fscanf()来进行文件读、写操作,并使用fscanf()==EOF来判定文件是否读取到末尾。此外,还可以使用Qt框架来实现一个关于小区的数据管理系统,该系统可以通过配置环境来运行。同时,在Linux环境下,也可以使用C语言来实现类似于百度网盘的功能,包括注册、登录、文件列表、上传文件、下载文件、历史记录和退出功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言实现钢琴块小游戏(低仿拉胯版)](https://blog.csdn.net/qq_50534112/article/details/122591117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C语言程序大作业:Qt实现的一个关于小区的数据管理系统.zip](https://download.csdn.net/download/qq_35831906/88259206)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [小度网盘(C语言,linux终端](https://blog.csdn.net/m0_71571889/article/details/127078433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叹了口丶气

觉得有收获就支持一下吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值