在上一篇文章中,实现了通过sqlite读取百度网盘的缓存数据库文件来读取百度网盘的目录了,但是数据库中的目录比较乱,我们用代码来实现一波整理,用来满足我们的需求

表分析

Springboot+sqlite实现百度网盘目录读取

这个上面的是表的机构信息,通过数据分析,对我们比较有用的就是parent_path(上级目录地址),server_filename(当前目录名),isdir(是否是目录),category(文件类型)

目录分析

查找当前目录的位置:parent_path+server_filename and isdir=1

查找上面目录下面的文件:parent_path(新) = parent_path(上)+server_filename(上)+"/"  and isdir != 1 这个新parent_path下面的所有记录就是上面目录下面的所有文件。

写代码

新建Springboot maven工程

我搭建的项目架构是Springboot+Mybaits+通用mapper,数据库驱动是用Druid

添加依赖

        <dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--sqlite连接驱动包-->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.25.2</version>
        </dependency>
         <!--通用mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.4</version>
        </dependency>

springboot+sqlite数据库驱动环境配置:


## Êý¾Ý¿â·ÃÎÊÅäÖÃ
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.datasource.url=jdbc:sqlite:D:\\temp\\BaiduYunCacheFileV0.db
spring.datasource.username=
spring.datasource.password=

# ÏÂÃæÎªÁ¬½Ó³ØµÄ²¹³äÉèÖã¬Ó¦Óõ½ÉÏÃæËùÓÐÊý¾ÝÔ´ÖÐ
# ³õʼ»¯´óС£¬×îС£¬×î´ó
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
# ÅäÖûñÈ¡Á¬½ÓµÈ´ý³¬Ê±µÄʱ¼ä
spring.datasource.maxWait=60000
# ÅäÖüä¸ô¶à¾Ã²Å½øÐÐÒ»´Î¼ì²â£¬¼ì²âÐèÒª¹Ø±ÕµÄ¿ÕÏÐÁ¬½Ó£¬µ¥Î»ÊǺÁÃë
spring.datasource.timeBetweenEvictionRunsMillis=60000
# ÅäÖÃÒ»¸öÁ¬½ÓÔÚ³ØÖÐ×îСÉú´æµÄʱ¼ä£¬µ¥Î»ÊǺÁÃë
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select 1 from sqlite_master
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# ´ò¿ªPSCache£¬²¢ÇÒÖ¸¶¨Ã¿¸öÁ¬½ÓÉÏPSCacheµÄ´óС
#spring.datasource.poolPreparedStatements=false
#spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# ÅäÖÃ¼à¿ØÍ³¼ÆÀ¹½ØµÄfilters£¬È¥µôºó¼à¿Ø½çÃæsqlÎÞ·¨Í³¼Æ£¬'wall'ÓÃÓÚ·À»ðǽ
spring.datasource.filters=stat,log4j
# ºÏ²¢¶à¸öDruidDataSourceµÄ¼à¿ØÊý¾Ý
#spring.datasource.useGlobalDataSourceStat=true
spring.datasource.loginusername=admin
spring.datasource.loginpassword=admin

#mybatis
mybatis.mapper-locations=classpath:cn/javabb/mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
#mappers ¶à¸ö½Ó¿Úʱ¶ººÅ¸ô¿ª
mapper.mappers=cn.javabb.common.BaseMapper
mapper.notEmpty=false
mapper.before=true
mapper.identity=sqlite

为cache_file创建一个实体,只用几个必要的属性,其他的可以不要,(省略Get,Set方法)

    @Id
    private Integer id;
    
    private String parentPath;
    
    private String serverFilename;
    
    private Integer fileSize;
    
    private String md5;
    
    private Integer isdir;
    
    private Integer category;

编写方法,根据目录名(全名)查找数据

<select id="listByParentPath" parameterType="String" resultType="cn.javabb.entity.CacheFile">
		select id,parent_path,server_filename,file_size,isdir from cache_file where parent_path =#{pathName} order by isdir desc,server_filename asc
	</select>

Springboot+sqlite实现百度网盘目录读取

业务处理类:

参数1:folderName->目录名称

参数2:level->从目录下递归几层,当前目录为1层,目录下第一级为2层

@Service
public class CacheFileService {

    @Autowired
    CacheFileMapper cacheFileMapper;

    public List<CacheFile> listByFolderName(String folderName,Integer level){
            CacheFile floder = new CacheFile();
            floder.setServerFilename(folderName);
            floder.setIsdir(1);
            List<CacheFile> floderList = cacheFileMapper.select(floder);
            if(null!=floderList){
                CacheFile floderNew = floderList.get(0); 
                List<CacheFile> menuList = cacheFileMapper.listByParentPath(floderNew.getParentPath()+floderNew.getServerFilename()+"/");
                if(null == menuList){
                    System.out.println("资源目录为空");
                    return null;
                }
                for(CacheFile cf:menuList){
                    if(cf.getServerFilename().indexOf("下载必看")>-1&&cf.getIsdir()==0){
                        continue;
                    }
                    System.out.println(formatter(cf.getServerFilename()));
                    if(cf.getIsdir()==0){
                        
                    }else{
                        if(level>1){
                            listByFolderName(cf.getServerFilename(),level-1);
                        }
                    }
                }
            }else{
                System.out.println("资源找不到");
            }
        
        return null;
    }
    /**
     * 过滤关键词
     * @author QINB
     * @param name
     * @return
     */
    public String formatter(String name){
        String str = name.replace("[www.javadaba.com Java大巴]","")
            .replace("【www.javadaba.com Java大巴】", "")
            .replace("www.javadaba.com", "");
        return str;
    }

测试:

 

Springboot+sqlite实现百度网盘目录读取

我自己测试了很多,目前没有啥子别的问题,向下递归也没有问题,无论多少层,只要设置好level你就可以递归到多少层。

项目源码:https://gitee.com/imqinbao/baiduYun

备注:在application.yml中将数据库文件用你自己的数据库文件。

我的博客地址:www.javabb.cn 博客开源地址:https://gitee.com/imqinbao/javabb_blog

 

相关文章: