【vue前端项目实战案例】Vue3仿今日头条App

news2024/9/21 12:42:32

本文将开发一款仿“今日头条”的新闻App。该案例是基于 Vue3.0 + Vue Router + webpack + TypeScript
等技术栈实现的一款新闻资讯类App,适合有一定Vue框架使用经验的开发者进行学习。

项目源码在文章末尾

1 项目概述

该项目是一款“今日头条”的新闻资讯App,主要有以下功能。

  • 新闻分类
  • 首页新闻列表
  • 刷新加载最新新闻
  • 用户私信留言
  • 新闻搜索
  • 查看新闻详情

1.1 开发环境

本项目是基于Vue3框架开发的一款WebApp,使用Vue CLI脚手架工具创建项目。在指定的硬盘目录处启动命令行工具,例如,在 C:\project 目录下打开命令行工具,并执行以下命令。

#安装脚手架
npm i -g @vue/cli

#创建项目
vue create toutiao

项目创建成功后,继续在命令行工具中执行 cd toutiao 命令,进入项目根目录,安装Vant UI组件库和axios模块。执行命令如下:

#安装Vant3 UI组件库
npm i vant@next -S

#安装axios模块
npm i axios -S

项目的调试使用Google Chrome浏览器的控制台进行,在浏览器中按下F12键,然后单击“切换设备工具栏”,进入移动端的调试界面,可以选择相应的设备进行调试。
项目运行的效果如图1 所示。

在这里插入图片描述
图 1 项目效果图

1.2 项目结构

项目结构如图2所示,其中src文件夹是项目的源文件目录,src文件夹下的项目结构如图3所示。
在这里插入图片描述
图2 项目结构

在这里插入图片描述
图3 src文件夹

项目结构中主要文件说明如下。

  • node_modules:项目依赖管理目录。
  • public:项目的静态文件存放目录,也是本地服务器的根目录。
  • src:项目源文件存放目录。
  • package.json:项目npm配置文件。
  • vue.config.js:项目构建配置文件

src文件夹目录说明如下。

  • assets:静态资源文件存放目。
  • components:公共组件存放目录。
  • hooks:项目的静态数据和模块封装管理目录。
  • router:路由配置文件存放目录。
  • store:状态管理配置存放目录。
  • views:视图组件存放目录。
  • App.vue:项目的根组件。
  • main.ts:项目的入口文件。
  • Shims-vue.d.ts: typescript的适配定义文件。

2 入口文件

项目的入口文件有 index.html、main.ts和App.vue三个文件,这些入口文件的具体内容介绍如下。

2.1 项目入口页面

index.html是项目默认的主渲染页面文件,主要用于Vue实例挂载点的声明与DOM渲染。代码如下:

<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

2.2 程序入口文件

main.ts是程序的入口文件,主要用于加载各种公共组件和初始化Vue实例。本项目是基于Vue3开发的,在入口文件中引入createApp()来创建vue实例对象。项目中的路由设置和引用的Vant UI组件库也是在该文件中定义的。代码如下:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import Vant from 'vant';
import 'vant/lib/index.css';

const app = createApp(App)
app.use(store)
app.use(router)
app.use(Vant)
app.mount('#app')

2.3 组件入口文件

App.vue是项目的根组件,所有的页面都是在App.vue下面切换的,所有的页面组件都是App.vue的子组件。在App.vue组件内只需要使用 组件作为占位符,就可以实现各个页面的引入。代码如下:

<template>
  <router-view/>
</template>

2.4 路由文件

在src/router/index.ts文件中,定义了项目的所有跳转的路由,代码如下:

import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'Home',
    component: () => import ('@/views/Home.vue')
  },
  {
    path: '/search',
    name: 'Search',
    component: () => import ('@/views/Search.vue')
  },
  {
    path: '/details',
    name: 'Details',
    component: () => import ('@/views/Details.vue')
  },
  {
    path: '/message',
    name: 'Message',
    component: () => import ('@/views/Message.vue')
  }
]

const router = createRouter({
  history: createWebHashHistory(),
  routes
})

export default router

3 项目组件

项目中所有页面组件都在views文件夹中定义,所有的公共组件都在components文件夹中定义,具体组件内容介绍如下。

3.1 公共组件

在首页新闻列表和新闻内容页中,都需要使用到新闻列表的展示,为了增强代码的可扩展性,可以在components文件夹下创建NewsCard.vue新闻卡片的公共组件。代码如下:

<template>
  <div class="news-card" @click="onClick">
      <van-row gutter="20">
        <van-col span="16">
            <div class="news-title">{{title}}</div>
            <div class="news-msg">
                <span>{{author}}</span>
                <span>{{date}}</span>
            </div>
        </van-col>
        <van-col span="8">
            <van-image :src="pic" style="height: 100%">
                <template v-slot:error>加载失败</template>
            </van-image>
        </van-col>
     </van-row>
  </div>
</template>

<script>
export default {
    props: {
        title: String,
        author: String,
        date: String,
        pic: String
    },
    setup(props,context) {

        //新闻点击事件
        const onClick = () => {
            
        }

        return {
            onClick
        }
    }
}
</script>

<style scoped>
.news-card{
    box-sizing: border-box;
    padding: 0px 10px;
}
.van-row{
    padding: 15px 0px;
    border-bottom: 1px solid #F7F7F7;
}
.news-title{
    color: #222;
    font-size: 18px;
}
.news-msg{
    font-size: 12px;
    color: #999;
    margin-top: 5px;
}
.news-msg span{
    margin-right: 8px;
}
</style>

3.2 首页导航栏

App首页汇集了整个应用的核心功能入口,在头部导航栏部分,主要涉及了两个功能的入口按钮,分别是“私信”和“搜索”。在头部导航栏的下方,设计了新闻分类的标签页按钮,方便用户切换不同类别的新闻列表。效果如图4所示。

在这里插入图片描述
图 4 首页导航栏效果

Home.vue首页组件,代码如下:

<template>
  <div class="page-body">
    <!-- 头部 -->
    <van-nav-bar fixed z-index="1000">
      <template #title>
        <span class="top-title">今日头条</span>
        <van-icon name="replay" color="#fff" size="18"/>
      </template>
      <template #left>
        <van-icon name="envelop-o" color="#fff" size="22" />
      </template>
      <template #right>
        <van-icon name="search" color="#fff" size="22" />
      </template>
    </van-nav-bar>

    <!-- 分类导航 -->
    <van-tabs
      v-model:active="active"
      background="#F4F5F6"
      sticky
      offset-top="46"
      title-active-color="#EE0A24"
    >
      <van-tab v-for="tab in tabsList" 
:key="tab.key" :title="tab.name" :name="tab.key">
        <div class="tab-views">
	<!-- 此处为新闻列表 -->
        </div>
      </van-tab>
    </van-tabs>
  </div>
</template>

新闻类别的标签页数据使用的是本地静态数据,在项目中的src/hooks文件夹下创建tabs.ts文件,用于保存新闻分类的静态数据。代码如下:

const tabs = [
    {
        key: 'top',
        name: '推荐'
    },
    {
        key: 'guonei',
        name: '国内'
    },
    {
        key: 'guoji',
        name: '国际'
    },
    {
        key: 'yule',
        name: '娱乐'
    },
    {
        key: 'tiyu',
        name: '体育'
    },
    {
        key: 'junshi',
        name: '军事'
    },
    {
        key: 'keji',
        name: '科技'
    },
    {
        key: 'caijing',
        name: '财经'
    },
    {
        key: 'shishang',
        name: '时尚'
    },
    {
        key: 'youxi',
        name: '游戏'
    },
    {
        key: 'qiche',
        name: '汽车'
    },
    {
        key: 'jiankang',
        name: '健康'
    }
]

export default tabs

在Home.vue文件中,进入src/hooks/tabs.ts文件,并设置为响应式数据。代码如下:

<script lang="ts">
import { ref } from "vue";
import tabs from "../hooks/tabs";
export default {
  name: "Home",
  setup() {
    const tabsList = ref(tabs);

    return {
      tabsList
    };
  },
};
</script>

3.3 首页新闻列表

首页新闻列表的效果如图5所示。

在这里插入图片描述
图5 首页新闻列表效果

在首页中引入NewsCard.vue新闻卡片的公共组件,并对axios获取数据进行封装。由于本项目中使用的是“聚合数据平台”的数据接口,在请求服务端接口时会出现跨域,需要先配置本地服务器的请求代理。
在项目根目录下创建vue.config.js配置文件,在配置文件中添加proxy的配置。代码如下:

module.exports = {
    devServer: {
      proxy: {
        '/api': {
          target: 'http://v.juhe.cn',
          changeOrigin: true,
          pathRewrite: {
            "^/api": ""
          }
        }
      }
   }
}

封装axios请求方法,在src/hooks目录下创建sendhttp.ts文件,代码如下:

import axios from 'axios';
import { ref } from 'vue';
import { Toast } from 'vant';

//聚合数据上申请的用户密钥
const key = 'xxx'

function sendhttp(api: string, query: string) {

    const result = ref(null)

    //加载数据
    const getData = (query: string, toast?: any) => {
        axios.get(api, {
            params: {
                type: query,
                key
            }
        }).then(res => {
            console.log(res.data)
            result.value = res.data.result.data
            if(toast){
                toast.clear()
            }
        }).catch(err=>{
            if(toast){
                toast.clear()
            }
        })
    }
    getData(query)

    //切换导航事件
    const tabsChange = (name: string) => {
        getData(name)
    }

    //刷新事件
    const replay = (name: string) => {
        const toast = Toast.loading({
            message: "加载中...",
            forbidClick: true,
            duration: 0,
            loadingType: "spinner",
        });
        getData(name,toast)
    }

    return {
        result,
        tabsChange,
        replay
    }
}

export default sendhttp

在Home.vue文件中,引入src/hooks/sendhttp.ts文件,并在setup()函数中发送请求,将请求成功后的数据遍历在标签页中。
Home.vue文件,代码如下:

<template>
  <div class="page-body">
    <!-- 头部 -->
    <van-nav-bar fixed z-index="1000" @click-left="onClickLeft" @click-right="onClickRight">
      <template #title>
        <span class="top-title">新闻头条</span>
        <van-icon name="replay" color="#fff" size="18" @click="replay" />
      </template>
      <template #left>
        <van-icon name="envelop-o" color="#fff" size="22" />
      </template>
      <template #right>
        <van-icon name="search" color="#fff" size="22" />
      </template>
    </van-nav-bar>

    <!-- 分类导航 -->
    <van-tabs
      v-model:active="active"
      background="#F4F5F6"
      sticky
      offset-top="46"
      title-active-color="#EE0A24"
      @change="tabsChange"
    >
      <van-tab v-for="tab in tabsList" :key="tab.key" :title="tab.name" :name="tab.key">
        <div class="tab-views">
          <news-card v-for="news in result" 
            :key="news.uniquekey" 
            :title="news.title" 
            :author="news.author_name"
            :date="news.date"
            :pic="news.thumbnail_pic_s"
            @click="onClickNews(news.uniquekey)">
          </news-card>
        </div>
      </van-tab>
    </van-tabs>
  </div>
</template>

<script lang="ts">
import { ref } from "vue";
import tabs from "../hooks/tabs";
import sendhttp from '../hooks/sendhttp';
import NewsCard from '../components/NewsCard.vue';
import { useRoute, useRouter } from 'vue-router'
export default {
  name: "Home",
  components: {
    'news-card': NewsCard
  },
  setup() {

    const router = useRouter()

    const active = ref('top');
    const tabsList = ref(tabs);

    //获取新闻数据
    const {result, tabsChange, replay} = sendhttp('/api/toutiao/index',active.value)

    //导航栏左侧按钮点击事件
    const onClickLeft = () => {
      router.push({
        path: 'message'
      })
    }

    //导航栏右侧按钮点击事件
    const onClickRight = () => {
      router.push({
        path: 'search'
      })
    }

    //点击新闻
    const onClickNews = (id:string) => {
      router.push({
        path: 'details',
        query: {
          id
        }
      })
    }

    return {
      active,
      replay,
      tabsList,
      tabsChange,
      result,
      onClickLeft,
      onClickRight,
      onClickNews
    };
  },
};
</script>

<style scoped>
.van-nav-bar {
  background-color: #d43d3d;
}
.top-title {
  font-size: 18px;
  font-weight: bold;
  color: #fff;
  margin-right: 5px;
}
.van-tabs{
  top: 46px;
}
</style>

3.4 新闻详情页

点击新闻列表,触发NewsCard.vue新闻卡片组件上的点击事件,通过useRouter路由模块,将新闻的id传给Details.vue新闻详情组件。代码如下:

<template>
  <div class="page-body">
    <!-- 分类导航 -->
    <van-tabs
      v-model:active="active"
      background="#F4F5F6"
      sticky
      offset-top="46"
      title-active-color="#EE0A24"
      @change="tabsChange"
    >
      <van-tab v-for="tab in tabsList" :key="tab.key" :title="tab.name" :name="tab.key">
        <div class="tab-views">
          <news-card v-for="news in result" 
            :key="news.uniquekey" 
            :title="news.title" 
            :author="news.author_name"
            :date="news.date"
            :pic="news.thumbnail_pic_s"
            @click="onClickNews(news.uniquekey)">
          </news-card>
        </div>
      </van-tab>
    </van-tabs>
  </div>
</template>

<script lang="ts">
import NewsCard from '../components/NewsCard.vue';
import { useRoute, useRouter } from 'vue-router'
export default {
  name: "Home",
  components: {
    'news-card': NewsCard
  },
  setup() {

    const router = useRouter()

    //其他代码...

    //点击新闻
    const onClickNews = (id:string) => {
      router.push({
        path: 'details',
        query: {
          id
        }
      })
    }

    return {
      onClickNews
    };
  },
};
</script>

在新闻详情页中,通过useRoute组件获取参数,得到新闻的id,并再次发送axios请求,获取当前新闻的详细数据。Details.vue组件,代码如下:

<template>
  <div>
    <!-- 导航栏 -->
    <van-nav-bar left-arrow fixed @click-left="onClickLeft">
      <template #left>
        <van-icon name="arrow-left" size="16" color="#999" />
        <span style="margin-left:10px;">{{result.author_name}}</span>
      </template>
      <template #right>
        <van-icon name="share-o" size="20" color="#999" />
      </template>
    </van-nav-bar>

    <!-- 正文 -->
    <div class="news-body">
      <!-- 新闻标题 -->
      <div class="news-title">{{result.title}}</div>

      <!-- 新闻信息 -->
      <div class="news-msg">
        <span>{{result.author_name}}</span>
        <span>{{result.date}}</span>
      </div>

      <!-- 新闻内容 -->
      <div class="news-content" v-html="result.content"></div>
    </div>
  </div>
</template>

<script>
import { ref } from "vue";
import { useRoute } from "vue-router";
import axios from 'axios';

export default {
  setup() {
    const route = useRoute();
    const id = route.query.id;
    const result = ref({
        title:'',
        author_name: '',
        date: '',
        content: ''
    });

    //获取请求
    axios.get('/api/toutiao/content',{
        params: {
            uniquekey: id,
            key: '26dafe8731502872b632b9552feccf06'
        }
    }).then(res=>{
        result.value = res.data.result.detail
    }).catch(err => {

    })

    //点击导航栏左侧按钮
    const onClickLeft = () => {
      window.history.back();
    };

    return {
      onClickLeft,
      result
    };
  },
};
</script>

<style scoped>
.news-body{
    margin-top: 60px ;
    box-sizing: border-box;
    padding: 0px 15px;
}
.news-title{
    font-size: 22px;
    color: #222;
    font-weight: bold;
}
.news-msg{
    font-size: 12px;
    color: #999;
    margin: 10px 0px 20px;
}
.news-msg span{
    margin-right: 10px;
}
</style>

新闻详情页的效果如图6所示。

在这里插入图片描述
图6 新闻详情页效果

3.5 私信留言页

点击头部导航栏的左侧图标按钮,跳转到私信留言列表页面,效果如图7所示。

在这里插入图片描述
图7 私信留言列表

Message.vue私信列表组件,代码如下:

<template>
  <div>
      <!-- 导航栏 -->
      <van-nav-bar
        title="私信"
        fixed
        left-arrow
        @click-left="onClickLeft">
        <template #left>
            <van-icon name="arrow-left" size="16" color="#999" />
        </template>
      </van-nav-bar>

      <!-- 留言列表 -->
      <div class="message-list">
        <van-cell v-for="(msg,index) in list" :key="index" :value="msg.date">
            <!-- 使用 title 插槽来自定义标题 -->
            <template #title>
                <van-badge :dot="!msg.read">
                    <span class="custom-title">{{msg.name}}</span>
                </van-badge>
            </template>
            <template #label>
                <span class="msg-content">{{msg.content}}</span>
            </template>
        </van-cell>
      </div>

  </div>
</template>

<script>
import { ref } from 'vue';
import messageData from '../hooks/messageData';
export default {
    setup(){

        const list = ref(messageData)

        const onClickLeft = () => {
            window.history.back()
        }

        return {
            onClickLeft,
            list
        }
    }
}
</script>

<style scoped>
.message-list{
    margin-top: 50px ;
}
.msg-content{
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
    overflow: hidden;
}
</style>

本项目的私信留言使用的是本地静态数据,在src/hooks目录下创建messageData.ts文件,用于留言静态数据。代码如下:

const messageData = [
    {
        name: '独上归州',
        date: '2021-3-18',
        content: '你好,你的那篇文章的链接失效了,能不能再重新发布一次?',
        read: false
    },
    {
        name: '椒房殿°',
        date: '2021-1-8',
        content: '前端简历的模板发一下吧',
        read: false
    },
    {
        name: '你在逗我笑i',
        date: '2020-12-5',
        content: '你好啊!',
        read: false
    },
    {
        name: '猫与玫瑰 ะ',
        date: '2020-8-10',
        content: '你的文章写的很棒啊!',
        read: true
    },
    {
        name: '那只小猪像你',
        date: '2020-8-1',
        content: '已转发',
        read: true
    },
    {
        name: '橙子姑娘',
        date: '2020-5-11',
        content: '已转发',
        read: true
    },
    {
        name: '忽然之间',
        date: '2020-3-6',
        content: '点个赞',
        read: true
    },
    {
        name: '配角戏',
        date: '2020-1-3',
        content: '已转发',
        read: true
    }
]

export default messageData

3.6 新闻搜索页面

在首页的头部导航栏,点击右侧按钮,跳转到新闻搜索页面,效果如图8所示。
在这里插入图片描述
图 8 新闻搜索也效果

Search.vue新闻搜索组件,代码如下:

<template>
  <div class="search">
    <!-- 搜索框 -->
    <van-search
      v-model="keywords"
      shape="round"
      placeholder="请输入你感兴趣的"
      show-action
      action-text="搜索"
      @cancel="onClickRight">
      <template #left>
        <van-icon name="arrow-left" @click="onClickLeft" style="margin-right:10px"/>
      </template>
    </van-search>

    <!-- 搜索记录 -->
    <div class="search-history">
      <div class="search-history-title">
        <span>搜索记录</span>
        <van-icon name="delete-o" @click="clear" />
      </div>
      <div>
        <van-tag v-for="(kw,index) in list" :key="index" closeable size="medium" type="primary" @close="delTag(index)">
          {{kw}}
        </van-tag>
      </div>
    </div>
  </div>
</template>

<script>
import { ref } from 'vue';
import { Dialog } from 'vant';
export default {
  setup() {
    const keywords = ref('')
    const list = ref(['千锋教育','前端教程'])

    //点击导航栏左侧按钮
    const onClickLeft = () => {
      window.history.back()
    }

    //点击导航栏右侧搜索按钮
    const onClickRight = () => {
      list.value.push(keywords.value)
      console.log(keywords)
    }

    //删除搜索记录
    const delTag = (index) => {
      list.value.splice(index,1)
    }

    //清空搜索记录
    const clear = () => {
      Dialog.confirm({
        message: '确定要清空记录吗?',
      }).then(() => {
          list.value = []
      }).catch(() => {});
    }

    return {
      keywords,
      onClickLeft,
      delTag,
      clear,
      onClickRight,
      list
    }
  }
}
</script>

<style scoped>
.van-search{
  border-bottom: 1px solid #eee;
}
.search-history{
  box-sizing: border-box;
  padding: 0px 15px;
  margin-top: 10px ;
}
.search-history-title{
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.search-history-title>span{
  font-size: 14px;
}
.van-tag{
  margin: 6px 8px;
}
</style>

项目源码下载地址:
https://download.csdn.net/download/p445098355/89570498

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

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

相关文章

防爆开关的类型及工作原理,你了解多少?

在工业生产中&#xff0c;安全始终是首要考量。特别是在易燃、易爆环境下的作业&#xff0c;如化工厂、油库、矿井等场所&#xff0c;任何微小的火花都可能引发灾难性的后果。防爆开关作为一种关键的安全设备&#xff0c;其重要性不言而喻。 【一、防爆开关的定义与重要性】 …

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(四)高斯牛顿法详解

一、高斯牛顿法详解 拓展阅读&#xff1a;高斯牛顿法详解_gauss-newton算法步骤-CSDN博客 1、梯度下降法 ​ ​ ​ 无论一阶泰勒展开&#xff0c;还是二阶泰勒展开都是关于增量​的方程。 2、牛顿法 ​ 这个自变量增量都是可求的。但是二阶求解复杂。因此为了简化有了下…

2023IMO预选题几何第6题

锐角 △ A B C \triangle ABC △ABC 的外接圆为 ω \omega ω, 圆 I I I 与 ω \omega ω 内切于 A A A, 且与 B C BC BC 切于点 D D D. 设直线 A B AB AB, A C AC AC 分别与 I I I 交于点 P P P, Q Q Q, 点 M M M, N N N 在直线 B C BC BC 上, 满足 B B B 是 …

【Golang 面试基础题】每日 5 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…

【HarmonyOS】应用推送使用个推SDK如何实现?

【HarmonyOS】应用推送使用个推SDK如何实现&#xff1f; 前言 个推和极光都是市面上很成熟的推送第三方SDK了。今天讲讲个推SDK在鸿蒙中如何集成使用。 存在即合理&#xff0c;三方SDK推送给我们带来了极大的好处&#xff0c;首先在服务器后台处理一套API就可搞定&#xff0…

lambda 28

package Api;public class local7 {public static void main(String[] args) {Swimmimg w()->{System.out.println("方式");};} } interface Swimmimg{void run(); }/* public static void main(String[] args) {Animal a new Animal(){Overridepublic void…

基于高光谱图像的压缩感知网络

压缩感知算法原理 压缩感知&#xff08;Compressed Sensing, CS&#xff09;是一种信号处理技术&#xff0c;它允许在远低于Nyquist采样率的情况下对信号进行有效采样和重建。压缩感知理论的核心思想是利用信号的稀疏性&#xff0c;通过少量的线性测量重建出原始信号。以下是压…

指令重排:

目录 指令重排&#xff1a; 代码&#xff1a; 执行结果&#xff1a; 分析原因&#xff1a; 解决办法&#xff1a; 加入语句&#xff1a; 完整代码&#xff1a; 补充&#xff1a; 1.printStackTrace(); 2.yield() 指令重排&#xff1a; 在class文件执行的时候&#…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的&#xff0c;因此你可以根据需要测量的距离&#xff0c;自定义深度相机安装基线&#xff0c;并根据你的项目要求&#xff08;分辨率、快门类型、FPS、光学元件&#xff…

【C++】选择结构-switch语句

switch 语句语法格式&#xff1a; switch (已定义整型或字符型变量名) { case 单个整型或字符型1&#xff1a; 满足这个 case 下整型或字符型执行的操作 break; case 单个整型或字符型2&#xff1a; 满足这个 case 下整型或字符型执行的操作 break; ...... default : 所有 ca…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错&#xff0c;其实是因为druid并未加载进去。如果你其它配置都没问题的话&#xff0c;请检查druid的依赖是什么版本的&#xff0c;因为springboot3刚开始是不支持druid的。 方案一&#xff1a; 即需要手动在resources目录下创建META-INF/s…

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…

队列--顺序队列的表示和实现

#include<stdio.h> #define MAXQSIZE 10 typedef int QElemType; typedef int Status; //顺序队列 (循环队列,有一个空间不用) typedef struct{QElemType *base;int rear;int front; }SqQueue; //初始化队列 Status InitQueue(SqQueue &Q){Q.basenew QElemType[MAX…

微信Android一面凉经(2024)

微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…

数据结构——二叉树性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>1)。 这个性质很好记忆&#xff0c;观察一下图6-5-5。 第一层是根结点&#xff0c;只有一个&#xff0c;所以2^(1-1)2^01。 第二层有两个&#xff0c;2^(2-1)22。 第三层有四个&#xff0c;2^(3-1)2^24。 第四层有八个&am…

centos7 mysql 基本测试(6)主从简单测试

centos7 xtrabackup mysql 基本测试&#xff08;6&#xff09;主从简单测试 mysql -u etc -p 1234aA~1 参考&#xff1a; centos7 时区设置 时间同步 https://blog.csdn.net/wowocpp/article/details/135931129 Mysql数据库&#xff1a;主从复制与读写分离 https://blog.csd…

【中项】系统集成项目管理工程师-第5章 软件工程-5.3软件设计

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

800G以太网测试之FEC压力测试(FEC统计,FEC Error Injection)

目录 FEC是什么 FEC测试需要关注哪些内容 基础的 FEC 性能监测 需要测试和验证的 FEC 特性 FEC Error Injection / FEC误码压力测试 Codeword & Symbol Error Configuration Errored Symbol Per CW Configuration Bit Error Mask Configuration Loop Mode FEC 引擎…

JavaScript Let

ECMAScript 2015 ES2015 引入了两个重要的 JavaScript 新关键词&#xff1a;let 和 const。 这两个关键字在 JavaScript 中提供了块作用域&#xff08;Block Scope&#xff09;变量&#xff08;和常量&#xff09;。 在 ES2015 之前&#xff0c;JavaScript 只有两种类型的作…