《项目实战》构建前后端一体化项目查询CSDN博客Top100文章质量分

news2024/11/15 4:57:03

系列文章目录

构建前后端一体化项目查询CSDN博客Top100文章质量分

在这里插入图片描述


文章目录

  • 系列文章目录
  • 前言
  • 1、搭建后端框架
    • 1.1、 创建RestFull风格接口
    • 1.2、创建获取数据服务
      • 1.2.1、在个人博客页,找到获取全部博文的路径(页面-> network->找到加载博文的地址)
      • 1.2.2、找到博客的ID
      • 1.2.3、使用RestTemplate通过此接口找到Top100数据(自己定制,可从控制层传递参数)
  • 2、搭建前端模块
    • 2.1、配置Springboot加载静态资源(static文件)
    • 2.2、在static文件下放置html文件
    • 2.3、html引入vue3、elementPlus、axois
    • 2.4、通过axios工具的get请求,获取博客数据
  • 3、效果图
    • 3.1、查询界面
    • 3.2、查询博客之星2023深圳市第一名
    • 3.3、查询博客之星2023苏州市第二名
  • 4、项目地址


前言

构建构建前后端一体化项目,查询CSDN指定博主的博客Top100文章质量分。
后端:Springboot2.X 、本地缓存、RestTemplate、RestFull风格接口
前端:html里引入Vue3、elementPlus、axios


1、搭建后端框架

搭建Springboot2.X项目

1.1、 创建RestFull风格接口

package com.kelvin.spiderx.controller;

import com.kelvin.spiderx.common.ResutlDto;
import com.kelvin.spiderx.common.ResutlTools;
import com.kelvin.spiderx.service.CsdnQcRestService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;

/***
 * @title CsdnQcController
 * @desctption CSDN博客质量查询
 * @author kelvin
 * @create 2023/7/1 14:33
 **/
@RestController
@CrossOrigin("*")
@RequestMapping("/csdn")
public class CsdnQcController {

    @Resource
    private CsdnQcRestService csdnQcService;

    @GetMapping("/qc/name/{username}")
    // 执行查询操作
    public ResutlDto qcbyname(@PathVariable(name = "username") String username) {
        return ResutlTools.buildSuccess(csdnQcService.allBlogQcDataByRest(username));
    }

}

1.2、创建获取数据服务

1.2.1、在个人博客页,找到获取全部博文的路径(页面-> network->找到加载博文的地址)

String url = "https://blog.csdn.net/community/home-api/v1/get-business-list?page="+ page +"&size="+ total +"&businessType=blog&orderby=&noMore=false&year=&month=&username="+userName;

1.2.2、找到博客的ID

例如:https://blog.csdn.net/s445320
ID就是:s445320

1.2.1里的userName,就是这里的博客ID

1.2.3、使用RestTemplate通过此接口找到Top100数据(自己定制,可从控制层传递参数)

		List<BlogInfoDetail> csdnBlogInfoList = null;
        HashMap jsonObject =  restTemplate.getForObject(url, HashMap.class);
        if( jsonObject.get("code").equals(200) ) {
            LinkedHashMap blogInfoMap = (LinkedHashMap) jsonObject.get("data");
            total = (int) blogInfoMap.get("total");
            List<LinkedHashMap> blogInfoDetails = (List<LinkedHashMap>) blogInfoMap.get("list");
            System.out.println( blogInfoDetails.size() );
            if( CollectionUtils.isEmpty(blogInfoDetails) ) {
                log.info("此博主没有发表文章!");
            } else {
                log.info("此博主有文章,开始解析文章质量分!");
                csdnBlogInfoList = new ArrayList<>();
                int num = 0;
                for (LinkedHashMap blogInfoDetail : blogInfoDetails) {
                    String blogUrl = (String) blogInfoDetail.get("url");
                    try{
                        BlogInfoDetail csdnBlogInfo = this.csdnQcByRest(restTemplate , blogUrl);
                        if( null != csdnBlogInfo ) {
                            csdnBlogInfoList.add(csdnBlogInfo);
                        }
                        num ++;
                    } catch (Exception e) {
                        log.info("解析文章质量分失败,文章:{}" , blogUrl);
                    }
                }
            }
        }
        log.info("csdnBlogInfoList size: {}" , csdnBlogInfoList.size());
        log.info("读取数据完毕!the end!");

2、搭建前端模块

2.1、配置Springboot加载静态资源(static文件)

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/***
 * @title WebMvcConfig
 * @desctption <TODO description class purpose>
 * @author LTF
 * @create 2023/7/1 14:07
 **/
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //加载public文件夹数据
        registry.addResourceHandler("/public/**")
                .addResourceLocations("classpath:/public/");

        //加载static文件夹数据
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }

}

2.2、在static文件下放置html文件

在这里插入图片描述

2.3、html引入vue3、elementPlus、axois

	<!-- Import style -->
    <link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" />
    <!-- Import Vue 3 -->
    <script src="//unpkg.com/vue@3"></script>
    <!-- Import axios -->
    <script src="//unpkg.com/axios/dist/axios.min.js"></script>
    <!-- Import component library -->
    <script src="//unpkg.com/element-plus"></script>

2.4、通过axios工具的get请求,获取博客数据


<body>

<div id="app">
    <h1>查询博客质量</h1>
    <el-row class="mb-4">
        <el-input
                placeholder="请输入CSDN博客ID"
                v-model="csdnId"
                clearable>
        </el-input>
        <el-button type="primary" @click="qc">Primary</el-button>
    </el-row>

    <br>
    <el-table  :data="blogDataList"  style="width: 100%" v-loading="loading">
        <el-table-column   prop="post_time"  label="发表日期"  width="180"> </el-table-column>
        <el-table-column   prop="score"  label="分数"  width="180"> </el-table-column>
        <el-table-column   prop="message" label="质量分描述"> </el-table-column>
        <el-table-column   prop="blog_url" label="文章地址"> </el-table-column>
    </el-table>
</div>

<script>
    const App = {
        data(){
            return{
                blogDataList: [],
                csdnId: "",
                loading: false
            }
        },mounted(){
            // this.invokeCsdnDataList();
        },
        methods:{
            invokeCsdnDataList(){
                //axios调用后台get方法
                axios.get("http://localhost/csdn/qc/name/" + this.csdnId)
                    .then(response =>{
                        //对返回结果进行处理
                        var data = response.data;
                        if( data.code == 200 ) {
                            this.blogDataList = data.data;
                            this.loading = false;
                        }
                        console.log(this.blogDataList);
                    }).catch(function(error){
                    //异常处理
                    console.log(error);
                })
            } ,
            qc() {
                this.loading = true;
                this.invokeCsdnDataList();
            }
        }

    }

    const App2 = Vue.createApp(App)
    App2.use(ElementPlus)
    App2.mount(app)
</script>
</body>

3、效果图

访问路径:http://localhost/static/index.html

3.1、查询界面

在这里插入图片描述

3.2、查询博客之星2023深圳市第一名

在这里插入图片描述
在这里插入图片描述

3.3、查询博客之星2023苏州市第二名

在这里插入图片描述

4、项目地址

–> 待整理上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# ---委托机制 delegate 和 回调方法 callback

C# --- 委托机制 delegate 和 回调 callback 什么是委托机制委托机制的优点C# 中的Action 和 Func委托机制的主要用处 --- 回调 Callback 什么是委托机制 委托机制相当于C语言中的函数指针, 将一个方法的reference传入另外一个方法中 Example //创建一个方法 //创建一个委托 …

青少年机器人技术一级考试备考重点(二):基础结构与力的基础

随着机器人技术的飞速发展&#xff0c;越来越多的青少年开始关注并参与其中。青少年机器人技术考试作为一项评估学生机器人技术水平的重要考试&#xff0c;备受广大青少年和家长的关注。为了更好地备战青少年机器人技术一级考试&#xff0c;了解考试的学习要点和备考重点是非常…

设计师简历范文

设计师简历范文一&#xff1a; 姓名&#xff1a; 目前所在&#xff1a; 天河区 年  龄&#xff1a; 26 户口所在&#xff1a; 湖南 国  籍&#xff1a; 中国 婚姻状况&#xff1a; 未婚 民  族&#xff1a; 汉族 身  高&#xff1a; 170 cm 体  重&#xff1a; 65 kg…

大学期间,这些证书你考过了吗

目录 一、概览 1、英语方面 第二外语 2、专业资格证书 3、教师资格证 4、普通话证书 5、财务类证书 6、法律职业资格证 7、有备无患的证书 8、技能类证书-驾照 9、发表论文、专利证书、出专业书 10、竞赛类 11、其他 二、写在最后 一、概览 1、英语方面 第二外语 …

Spring AOP讲解及实例

Aop面向切面编程 文章目录 Aop面向切面编程什么是AOPAOP术语Spring AOP 的使用导入依赖编写切面类切面定义语法小细节输出日志成功 什么是AOP AOP&#xff1a;&#xff08;Aspect Oriented Programming&#xff09;面向切面编程&#xff0c;和OOP&#xff08;Object Oriented …

Nginx(6)nginx的缓存集成

缓存集成 Nginx缓存集成缓存的概念Nginx的web缓存服务 缓存设置的相关指令Nginx缓存设置案例 Nginx缓存的清除Nginx设置资源不缓存 Nginx缓存集成 缓存的概念 缓存就是数据交换的缓冲区(称作Cache)&#xff0c;当用户要获取数据的时候&#xff0c;会先从缓存中去查询获取数据…

前端Vue基本语法

尤雨溪 文章目录 前言MVVM框架认识Vue文本渲染指令 v-text属性绑定指令:title属性动态绑定class属性动态绑定style属性动态绑定 事件绑定 事件名条件渲染指令v-ifv-if和v-showv-else和v-else-if 循环遍历指令 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xf…

华为OD机试真题 Python 实现【获取最大软件版本号】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、补充说明五、解题思路六、Python算法源码七、效果展示1、输入2、输出 一、题目描述 Maven版本号定义&#xff0c;<主版本>.<次版本><增量版本>-<里程碑版本> 举例3.1.4-beta 其中&#xff0c;主版本和次…

华为OD机试真题 Python 实现【货币单位换算】【2023Q1 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、思路分析4、输入5、输出6、思路分析 一、题目描述 记账本上记录了若干条多国货币金额&#xff0c;需要转换成人民币分 (fen)&#xff0c;汇总后输出每行记录一条金额&a…

红色通信史(三):在战火中成长

上一期我们说到&#xff0c;苏区红军因为第五次反围剿失败&#xff0c;被迫进行战略转移&#xff0c;开始了史无前例的长征。 ▉ 粉碎分裂阴谋&#xff0c;确保长征胜利 在长征的过程中&#xff0c;前有堵截&#xff0c;后有追兵&#xff0c;红军历经艰难险阻&#xff0c;不断与…

Qt Quick系列(7)—Model-View

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言内置视图ViewRepeaterListViewGridView 代理delegate总结 前言 在QML中&#xff0c;model和view由delegate连接&#xff0c;他们的关系如下&#x1f447; 1、delegate 属性&#…

Vue3+Vite配置环境变量模式切换开发与生产环境的接口域名

.env.development # .env.production VITE_APP_TITLEhttp://172.16.1.115:8096 .env.production # .env.production VITE_APP_TITLEhttps://172.16.1.119:8097在接口文件中使用配置的地址 import Axios from axios const instanceAxios.create({baseURL:import.meta.env.VITE_A…

如何建立一个企业网站

建立一个企业网站的方法 1、好。如果你的网站将专注于你已经有了一个不错的主意&#xff0c;请跳过此步骤。如果不是&#xff0c;这里有一些事情来帮助你找出答案。首先&#xff0c;要明白&#xff0c;有几十亿人在互联网上&#xff0c;一个健康的比例有自己的网站。如果你限制…

实验八 文件系统-实验部分

目录 一、知识点 1. ucore文件系统设计目标--设计理念和含义 ​​​​1.1. 通用文件系统访问接口层&#xff1a; 1.2. 文件系统抽象层&#xff1a; 1.3. Simple FS 文件系统实现层&#xff1a; 1.4. 外设接口层&#xff1a; 2. ucore文件系统架构总体设计 2.1. ucore文件…

wifi 7主要性能提升

提升1&#xff1a;更快。接近4倍的速率提升&#xff0c;高达36Gbps 提升2&#xff1a;低延迟。单用户低延迟提升80%&#xff0c;多用户低延迟提升25%。 wifi7的主要改变&#xff1a; 改变1&#xff1a;6GHz 320MHz 改变2&#xff1a;4096 QAM 改变3&#xff1a;MLO & M…

有关STL关联/非关联容器/优先级队列的按序初始化

1.对于map/unorderedmap这种&#xff0c;比如想要按照second去排序&#xff0c;思路一&#xff0c;转换成vector这种线性容器&#xff0c;然后利用sort函数&#xff0c;自定义第三个参数去做想要的排序 总之就得转换成别的去做&#xff0c;不能在初始化的时候用自定义的函数或…

JLINK驱动、接线、接口模式、硬件都没问题,JLINK仍然读不到芯片的解决办法

今天遇到一个奇葩的问题&#xff0c;JINK驱动、接线、模式设置&#xff0c;硬件啥都没有问题&#xff0c;就是JINK连不到芯片&#xff0c;读不到芯片。自己平时都是用SWD模式&#xff0c;然后直接JLINK的GND 、SWDIO、SWCLK直接接上&#xff0c;一般我不会接VCC&#xff0c;应该…

Leetcode 75算法题( 下)(使用C++实现)

目录 回溯 17. 电话号码的字母组合 216. 组合总和 III 动态规划 - 一维 1137. 第 N 个泰波那契数 746. 使用最小花费爬楼梯 198. 打家劫舍 790. 多米诺和托米诺平铺 动态规划 - 多维 62. 不同路径 1143. 最长公共子序列 714. 买卖股票的最佳时机含手续费 72. 编辑距…

提升前端GIS开发技能:深入了解5个热门地图框架

前言 地理信息系统&#xff08;GIS&#xff09;已经成为现代应用开发中不可或缺的一部分&#xff0c;尤其在前端开发中。随着Web技术的快速发展&#xff0c;许多强大而灵活的GIS框架涌现出来&#xff0c;为开发人员提供了丰富的工具和功能&#xff0c;使他们能够创建交互式、高…

强大易用的开源建站工具Halo

最近无意间看到别人的博客外观非常美观&#xff0c;便萌生了偷师学艺的想法…所以就看到看了Halo这个开源的建站项目,其实使用起来非常简单&#xff0c;但是想要做一个类似的开源建站工具&#xff0c;谈何容易 访问官网 https://halo.run/ 使用docker部署 搜索镜像halo do…