【Django+Vue3项目实战】构建高效线上教育平台之首页模块

在这里插入图片描述


文章目录

  • 前言
  • 一、导航功能实现
    • a.效果图:
    • b.后端代码
    • c.前端代码
  • 二、轮播图功能实现
    • a.效果图
    • b.后端代码
    • c.前端代码
  • 三、标签栏功能实现
    • a.效果图
    • b.后端代码
    • c.前端代码
  • 四、侧边栏功能实现
    • 1.整体效果图
    • 2.侧边栏功能实现
      • a.效果图
      • b.后端代码
      • c.前端代码
    • 3.侧边栏展示分类及课程信息功能实现
      • a.效果图
      • b.后端代码
      • c.前端代码
  • 五、分类课程推荐(楼层设计)功能实现
    • a.效果图
    • b.后端代码
    • c.前端代码


前言

   在当今数字化教育浪潮中,构建一个高效且用户友好的线上教育平台至关重要。本博客将指导您使用Django作为后端框架,结合Vue 3的强大前端能力,快速搭建平台首页的核心功能,包括导航栏、轮播图、侧边栏、标签栏及分类课程推荐。我们将探讨前后端数据交互、Vue组件化开发等关键技术,轻松构建出既美观又实用的线上教育平台。


  最终实现效果图如下:
在这里插入图片描述


一、导航功能实现

a.效果图:

在这里插入图片描述

b.后端代码

导航表模型类:

class NavigationModel(BaseModel):
    name = models.CharField(max_length=100)
    url = models.CharField(max_length=100)
    is_url = models.BooleanField(default=False)
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = '导航表'
        verbose_name_plural = '导航表'
        db_table = 'navigation'

导航表序列化器:

class NavigationSerializer(serializers.ModelSerializer):
    class Meta:
        model = NavigationModel
        fields = ('id','name','url','is_url')
        # fields = '__all__'

获取所有头部导航栏信息:

class NavigationView(APIView):
    def get(self, request):
        nav_list = NavigationModel.objects.all()
        ser = NavigationSerializer(nav_list, many=True)
        return Response({"code":"200", "data":ser.data})

配置url信息:

urlpatterns = [
    path('nav/header/', NavigationView.as_view()),
    ...
]

c.前端代码

components/Header.vue:

<!-- 0.导航栏 -->
<ul class="nav">
   <li v-for="(item,index) in nav.header_nav_list " :key="index">
     <a :href="item.url" v-if="item.is_url">{{item.name}}</a>
     <router-link :to="item.url" v-else>{{item.name}}</router-link>
   </li>
</ul>
<script setup>
import nav from "../api/nav"
	// 获取顶部导航菜单
	nav.get_header_nav()
</script>

src/api/nav.js:

import http from "../http";
import {reactive} from "vue";
const nav = reactive({
 header_nav_list: [], // 头部导航列表
 get_header_nav(){
   // 获取头部导航菜单
   http.get("/home/nav/header/").then(response=>{
     this.header_nav_list = response.data;
   })
 },
})
export default nav;

二、轮播图功能实现

a.效果图

在这里插入图片描述

b.后端代码

轮播图模型类:

class BannerModel(BaseModel):
    image = models.CharField(max_length=255)
    link = models.CharField(max_length=255)
    is_http = models.BooleanField(default=False)
    def __str__(self):
        return self.image
    class Meta:
        verbose_name = "轮播图表"
        verbose_name_plural = "轮播图表"
        db_table = 'banner'

轮播图序列化器:

class BannerSerializer(serializers.ModelSerializer):
    class Meta:
        model = BannerModel
        fields = '__all__'

获取轮播图数据:

class BannerView(APIView):
    def get(self, request):
        banners = BannerModel.objects.all()
        ser = BannerSerializer(banners, many=True)
        return Response({"code":"200", "data":ser.data})

配置url信息:

    path('banner/', BannerView.as_view()),

c.前端代码

src/components/Banner.vue:

<!-- 焦点图、轮播图-->
<div class="g-banner-content" @mouseover="state.current_menu = -1">
  <el-carousel height="382px" indicator-position="bottom" @change="handleCarouselChange">
    <el-carousel-item v-for="(item, key) in banner.bannerImg" :key="key">
      <img :src="item.image" alt="" style="width: 100%; height: 100%" />
    </el-carousel-item>
  </el-carousel>
</div>
<script setup>
import banner from "../api/banner";
banner.get_banner_list();

// 轮播图列表  接口数据替换
// http://192.168.56.1:3000/src/assets/img/course1.jpg
const bannerImg = reactive([{
  image: '/src/assets/img/course1.jpg',
  link: '',
  is_http: false,
}])

// 当前轮播 banner背景
const nowBannerImg = reactive({ src: bannerImg[0].image });
//轮播切换赋值
const handleCarouselChange = (index) => {
  // 更新当前banner图片地址
  nowBannerImg.src = banner.bannerImg[index].image;
};

<script>

src/api/banner.js:

import { reactive } from "vue";
import http from "../http";
const banner = reactive({
  bannerImg: [],  // 轮播广告列表

  get_banner_list() {
    // 获取轮播广告列表
    return http.get("/home/banner/").then(response => {
      // console.log("Bannner---response.data");
      // console.log(response.data);
      this.bannerImg = response.data.data;
      // console.log("bannerImg");
      // console.log(response.data.data);
    })
  },
})

export default banner;

三、标签栏功能实现

a.效果图

在这里插入图片描述

b.后端代码

标签表模型类:

class DirectionModel(BaseModel):
    direction = models.CharField(max_length=255)
    desc = models.CharField(max_length=255)
    icon = models.CharField(max_length=255)
    def __str__(self):
        return self.direction
    class Meta:
        verbose_name = "方向表"
        verbose_name_plural = "标签表"
        db_table = 'direction'

标签 / 方向表序列化器:

class DirectionSerializer(serializers.ModelSerializer):
    class Meta:
        model = DirectionModel
        fields = ['id','direction','desc','icon']
        # fields = '__all__'

获取所有标签数据:

class DirectionView(APIView):
    def get(self, request):
        directions = DirectionModel.objects.all()
        ser = DirectionSerializer(directions, many=True)
        return Response({"code":"200", "data":ser.data})

配置urls:

    path('directions/', DirectionView.as_view()),

c.前端代码

src/components/Banner.vue:

    <!-- 标签表(方向表) -->
    <div class="system-class-show">
      <a class="show-box" v-for="(item, index) in directions.directions_list" :key="index">
        <div class="system-class-icon" :style="{ 'background-image': `url('${item.icon}')` }"></div>
        <div class="describe">
          <h4>{{ item.direction }}</h4>
          <p>{{ item.desc }}</p>
        </div>
      </a>
      <div class="line"></div>
      <a class="all-btn">
        
        <div class="mini-title">体系课</div>
        <div class="more-btn">more</div>
      </a>
    </div>
import directions from '../api/directions';

directions.get_directions_list();

src/api/directions.js:

import { reactive } from "vue";
import http from "../http";

const directions = reactive({
    directions_list: [],  // 标签列表
    get_directions_list() {
        // 获取标签列表
        return http.get("/home/directions/").then(response => {
            // console.log("11111111111111");
            // console.log("directions_list---response.data");
            // console.log(response.data);
            this.directions_list = response.data.data;
            // console.log(response.data.data);
        })
    },

})

export default directions;

四、侧边栏功能实现

1.整体效果图

在这里插入图片描述

2.侧边栏功能实现

a.效果图

在这里插入图片描述

b.后端代码

分类表模型类:

class CategoryModel(BaseModel):
    id = models.AutoField(primary_key=True)  # 通常Django会自动为主键添加AutoField,这里显式写出也可以
    name = models.CharField(max_length=255, unique=True)  # 假设分类名最大长度为255个字符
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='son')  # 自关联字段,表示父分类
    recommend = models.BooleanField(default=False)
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = '分类表'
        verbose_name_plural = '分类表'
        db_table = 'category'

父级分类序列化器、子级分类序列化器:

# 子类序列化器---二级分类
class SonCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = CategoryModel
        fields = ('id', 'name')
        # fields = '__all__'

# 父类序列化器--一级分类
class CategorySerializer(serializers.ModelSerializer):
    son = SonCategorySerializer(many=True, read_only=True)
    class Meta:
        model = CategoryModel
        fields = '__all__'
        # fields = ('id','name','son')

获取父级与子级分类:

# 2.获取一、二级分类
class CategoryView(APIView):
    def get(self, request):
        # 查询所有一级分类:parent is null
        # query_set
        categories = CategoryModel.objects.filter(is_delete=0,parent__id__isnull=True)  #query_set

        clist = [] #侧边栏 二级分类显示几个
        for category in categories:
            # 获取一级下面所有的二级分类,操作显示二级分类数据条数
            sondata = category.son.all()[0:2] #query_set
            # d对二级数据进行序列化操作
            son = SonCategorySerializer(sondata, many=True)
            clist.append({"id": category.id, "name": category.name, "son": son.data})

        return Response({"code":"200", "data":clist})

配置url:

    path('nav/cates/', CategoryView.as_view()), #侧边栏-获取一二级分类 

c.前端代码

src/components/Banner.vue:

<!-- 左侧边栏Banner---二级分类 -->
 <div class="menuContent">
   <div
     v-for="(item, index) in cates.cates_list"
     :key="index"
     class="item"
     :class="{ 'js-menu-item-on': state.current_menu == 0 }"
     @mouseover="fnMethod(item.id)"
   ><!-- item.id 一级分类id -->
     <span class="title">{{ item.name }}:</span>
     <span class="sub-title" v-for="(s, index) in item.son" :key="index"
       >&nbsp;&nbsp;{{ s.name }}&nbsp;&nbsp;</span
     >
     <i class="imv2-arrow1_r"></i>
   </div>

 </div>
import cates from "../api/cates";

cates.get_cates_list();
// 定义方法-展示侧边栏所有二级分类以及所有分类下的课程
const fnMethod = (cateid) => {
  state.current_menu = 0;
  cates.get_coures_list(cateid);
};

src/api/cates.js:

import http from "../http";
import { reactive } from "vue";

const cates = reactive({
  cates_list: [], // Banner---两级分类列表
  
  get_cates_list() {
    // 获取两级分类
    return http.get("/home/nav/cates/").then(response => {
      // console.log("左侧边栏获取两级分类response.data:");
      // console.log(response.data);
      this.cates_list = response.data.data;
    })
  },
})
export default cates;

3.侧边栏展示分类及课程信息功能实现

点击分类(侧边栏触发),获取此分类下所有的二级分类(@mouseover)以及此分类下推荐的课程

a.效果图

在这里插入图片描述

b.后端代码

+课程表模型类:

class CourseModel(BaseModel):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, unique=True)

    # parent 指向 Category 分类id
    parent = models.ForeignKey(CategoryModel, on_delete=models.CASCADE, related_name='course',verbose_name="parent-父级分类")
    topid = models.IntegerField(verbose_name="topid-顶级分类")

    recommend = models.BooleanField(default=False)
    picurl = models.CharField(max_length=100)
    price = models.FloatField()
    level = models.IntegerField(verbose_name="1零基础 2中级 3高级")
    sales = models.IntegerField(default=0,verbose_name="销量")
    describe = models.TextField()
    
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = '课程表'
        verbose_name_plural = '课程表'
        db_table = 'course'

课程序列化器:

class CourseSerializer(serializers.ModelSerializer):
    # teacher = TeachersSerializer(many=True, read_only=True)
    # teacher = TeachersSerializer()
    class Meta:
        model = CourseModel
        fields = '__all__'

获取所有分类及其推荐课程:

class CategoryCourseView(APIView):
    def get(self, request):
        #获取一级分类id
        cateid = request.GET.get("cateid")
        #根据id查询分类:一级分类和二级分类
        cate = CategoryModel.objects.filter(id=cateid).first()
        #通过id查询推荐课程
        ser = CategorySerializer(cate)
        #返回结果
        #print(cate.id)
        courses = CourseModel.objects.filter(topid=cateid,recommend=True)
        #print(courses)
        cSer = CourseSerializer(courses, many=True)
        #print(cSer.data)
        return Response({"code":"200", "clist":ser.data,"courses":cSer.data})

配置urls:

	path('nav/catescourses/', CategoryCourseView.as_view()),#侧边栏-传一级分类id->展示子分类及其所有课程

c.前端代码

src/components/Banner.vue:

<!-- 侧边栏触发显示:分类信息、课程信息 -->
<div class="submenu" v-if="state.current_menu === 0">
  <!-- 1.2.1侧边栏触发显示:商品课程二级分类信息  -->
  <div class="inner-box">
    <h2 class="type">{{ cates.cc_list.name }}</h2>
    <div class="tag clearfix"></div>
    <div class="lore">
      <span class="title">知识点:</span>
      <p class="lores clearfix">
        <a target="_blank" v-for="(item, index) in cates.cc_list.son" :key="index" href="">{{ item.name }}</a>
      </p>
    </div>
  </div>

  <!-- 1.2.2侧边栏触发显示:分类下的课程信息--->
  <div class="recomment clearfix">
    <a href="" target="_blank" title="" class="recomment-item" v-for="(c,index) in cates.course_list" :key="index">
      <div class="img" :style="{ 'background-image': `url('${c.picurl}')`, 'background-size': '100%' }"></div>
      <div class="details">
        <div class="title-box">
          <p class="title">
            <span class="text">{{c.name}}</span>
            <span class="tag tixi">体系</span>
          </p>
        </div>
        <div class="bottom">
          <span class="discount-name">优惠价:</span>
          <span class="price">¥{{c.price}}</span> &middot;
          <span class="difficulty"> {{c.describe}} </span> &middot;
          <span class="difficulty" v-if="c.level==1"> 0基础 </span> &middot;
          <span class="difficulty" v-if="c.level==2"> 中级 </span> &middot;
          <span class="difficulty" v-if="c.level==3"> 高级 </span> &middot;
          <span class="num"><i class="imv2-set-sns"></i> {{c.sales}}人</span>
        </div>
      </div>
    </a>
  </div>

</div>

src/api/cates.js:

import http from "../http";
import { reactive } from "vue";

const cates = reactive({
  cates_list: [], // Banner---两级分类列表
  cc_list: {}, //Banner---触发显示:显示所有二级分类
  course_list: [], //Banner ---触发显示:显示分类下的课程

  get_cates_list() {
    // 获取两级分类
    return http.get("/home/nav/cates/").then(response => {
      this.cates_list = response.data.data;
    })
  },

  get_coures_list(cateid) {
    // 获取所有二级分类 及其 课程
    return http.get("/home/nav/catescourses/?cateid=" + cateid).then(response => {
      // console.log("左侧边栏获取课程分类及课程response.data:");
      // console.log(response.data);
      this.cc_list = response.data.clist;
      this.course_list = response.data.courses;
    })
  },

})

export default cates;

五、分类课程推荐(楼层设计)功能实现

首页分类课程推荐设计:
    显示推荐分类,获取不同楼层不同分类下的课程,点击不同分类时获取当前楼层分类下的推荐课程并显示

a.效果图

在这里插入图片描述

b.后端代码

为了便于理解,建立三张表:频道表、频道分类表、频道课程表,模型类如下:

# a.频道表
class ChannelModel(BaseModel):
    name = models.CharField(max_length=255, unique=True)
    picurl = models.CharField(max_length=100)
    sort = models.IntegerField()
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = '频道表'
        verbose_name_plural = '频道表'
        db_table = 'channel'

# b.频道分类表 id,name,显示顺序,频道id,类别(1-添加的 2-分类的),分类id
class ChannelCategoryModel(BaseModel):
    name = models.CharField(max_length=255)
    sort = models.IntegerField()
    channel = models.ForeignKey(ChannelModel, on_delete=models.CASCADE, related_name='cates')
    type = models.IntegerField()
    cateid = models.IntegerField()
    def __str__(self):
        return self.name

    class Meta:
        verbose_name = '频道分类表'
        verbose_name_plural = '频道分类表'
        db_table = 'channel_cates'

# c.频道分类课程表 id,name,图标,价格,难度,购买人数,频道分类id
class ChannelCoursesModel(BaseModel):
    name = models.CharField(max_length=255,unique=True)
    picurl = models.CharField(max_length=100)
    price = models.FloatField()
    sales = models.IntegerField(default=0)
    level = models.IntegerField()
    ccates = models.ForeignKey(ChannelCategoryModel, on_delete=models.CASCADE, related_name='courses')
    def __str__(self):
        return self.name
    class Meta:
        verbose_name = '频道分类课程表'
        verbose_name_plural = '频道分类课程表'
        db_table = 'channel_courses'

频道、频道分类、频道课程序列化器:

# --
# c.频道分类课程序列化器
class ChannelCourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = ChannelCoursesModel
        fields = '__all__'

# b.频道分类序列化器-
class ChannelCategorySerializer(serializers.ModelSerializer):
    courses = ChannelCourseSerializer(many=True, read_only=True)
    class Meta:
        model = ChannelCategoryModel
        fields = '__all__'

# a.频道序列化器
class ChannelSerializer(serializers.ModelSerializer):
    cates = ChannelCategorySerializer(many=True, read_only=True)
    class Meta:
        model = ChannelModel
        fields = '__all__'

获取首页推荐课程分类信息:

# 6.2 楼层-课程卡片--(无顺序版-->直接嵌套序列化器)
class HomeCourseView(APIView):
    def get(self, request):
        channels = ChannelModel.objects.order_by('sort').all()
        ser_channels = ChannelSerializer(channels, many=True)
        return Response({"code":"200", "data":ser_channels.data})

配置urls:

    path('homecourse/', HomeCourseView.as_view()), #首页推荐分类课程

c.前端代码

src/components/NewCourse.vue:

<template>
  <div class="bg000">
    <div class="container-types new-course" v-for="record,index in course.data" :key="index">
      <!-- 第一级:pic -->
      <h3
          class="types-title justify-content_flex-start"
          :style="{ 'background-image': `url('${record.picurl}')` }"
      >{{index}}

        <!-- 第二级 eg:推荐、前端课程 -->
        <ul class="menu">
          <li :class="{'curr': state.current_menu[index]==key}"
              v-for="item,key in record.cates" :key="key"
              @click="selectTab(item,key,index)"
          >
            <a>{{ item.name }}</a>
          </li>
        </ul>

      </h3>
      
      <!-- 对应分类下的课程信息 -->
      <div class="list clearfix show" >
        <a class="item" v-for="citem,cindex in record.cates[courseList.data[index]].courses" :key="cindex">
          <div class="img"
               :style="{ 'background-image': `url('${citem.picurl}')` }">
          </div>
          <div class="title ellipsis2">{{ citem.name }}</div>
          <div class="difficulty">{{ citem.level }} · {{ citem.person }}人报名</div>
          <div class="bottom clearfix">
            <span class="price l red bold">¥{{ citem.price }}</span>
          </div>
        </a>
      </div>


    </div>  
  </div>
</template>
<script setup>
import {reactive} from "vue"
// 接口取回的数据
import course from "../api/home";

course.get_courses_list();

// 定义每个频道TAB的下标
let courseList = reactive({data: [0,0,0]})

// 点击事件item-cates,key-二级index,index-一级index
const selectTab = (item,key,index) => {
  courseList.data[index] = key
  state.current_menu[index] = key
}
const state = reactive({
  current_menu: [0,0,0],
})

</script>

src/api/home.js:

import { reactive } from "vue";
import http from "../http";
const course = reactive({
  data: [],  // 分类下课程信息

  get_courses_list() {
    // 获取分类下课程信息
    return http.get("/home/homecourse/").then(response => {
      console.log("response.data.data");
      console.log(response.data.data);
      this.data = response.data.data;
  },

})

export default course;


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip&#xff1a; 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术&#xff0c;广泛应用于…

买不到用户的大模型,开始倒闭了

前段时间各个大模型开始降价甚至免费&#xff0c;都是为了抢夺用户&#xff1b;而随着AI加持&#xff0c;iPhone也要来抢夺用户&#xff1b;这种情况下&#xff0c;没有用户甚至买不到用户的大模型&#xff0c;已经开始倒闭了。 拿到2000万元创业投资的大林&#xff0c;仅过了一…

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序

LeetCode刷题笔记第3011题&#xff1a;判断一个数组是否可以变为有序 题目&#xff1a; 想法&#xff1a; 使用冒泡排序进行排序&#xff0c;在判断大小条件时加入判断二进制下数位为1的数目是否相同&#xff0c;相同则可以进行互换。最后遍历数组&#xff0c;相邻两两之间是…

创建地形——笔记

1、创建地面 (1) 3D Object-Terrain (2) 导入资源 (3) 选中Terrain&#xff0c;绘制贴图 (4) 新建一个沙土层 (5) 编辑沙土层——选中Inspector中的新建沙土层&#xff0c;出现编辑面板 依次点击Nomal Map和Mask Map右侧的Slect&#xff0c;增加法线贴图&#xff08;紫&…

【Redis】初识 Redis

文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

keepalive和haproxy

1、keepalive 1.1概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;主停止工作&#xff0c;vip漂移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器 1、配优先级 …

智能优化算法之蚁群算法ACO

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;由意大利学者马尔科多里戈&#xff08;Marco Dorigo&#xff09;于1992年在其博士论文中首次提出。灵感来自于自然界中的蚂蚁群体行为&#xff0c;特别是蚂蚁在寻找食物过程中所展示的路径优化能力。蚁群算法属于…

基于stm32+小程序开发智能家居门禁系统-硬件-软件实现

视频演示&#xff1a; 基于stm32智能家居门禁系统小程序开发项目 视频还有添加删除卡号&#xff0c;添加删除指纹&#xff0c;关闭继电器电源等没有演示。 代码Git&#xff1a; https://github.com/Abear6666/stm32lock 总体功能&#xff1a; 本门禁系统主要解锁功能分别为卡…

一文彻底学会Vue3路由:全面讲解路由流程、路由模式、传参等——全栈开发之路--前端篇(7)路由详解

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

离线 VisualStudio2022 安装包在无互联网的环境下安装

文章目录 下载 Visual Studio 引导程序以创建布局离线安装包将离线包更新为产品的最新版本将布局更新为产品的特定版本 下载 Visual Studio 引导程序以创建布局 https://learn.microsoft.com/zh-cn/visualstudio/install/create-a-network-installation-of-visual-studio?vie…

Golang | Leetcode Golang题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; func computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 int) int {area1 : (ax2 - ax1) * (ay2 - ay1)area2 : (bx2 - bx1) * (by2 - by1)overlapWidth : min(ax2, bx2) - max(ax1, bx1)overlapHeight : min(ay2, by2) - max(ay1, by1)…

浅谈后置处理器之JSON提取器

浅谈后置处理器之JSON提取器 JMeter 的 JSON 提取器&#xff08;JSON Extractor&#xff09;是一个强大的后置处理器&#xff0c;它允许用户从HTTP响应、数据库查询或其他类型的响应中提取JSON数据&#xff0c;并将这些数据存储为变量&#xff0c;以便在后续的请求中重用。这对…

从数据仓库到数据湖(上):数据湖导论

文章目录 一、什么是数据湖&#xff1f;起源数据湖的特征 二、为什么要用数据湖&#xff1f;三、数据湖与数据仓库的区别数据仓库和数据湖的对比 四、数据湖本质数据存储架构数据处理工具&#xff1a;三类第一类工具第二类工具第三类工具 小结 五、总结六、参考资料 一、什么是…

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

手机怎么用代理ip上网

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。然而&#xff0c;有时候出于安全、隐私或访问特定网络资源的需要&#xff0c;我们可能需要使用代理IP来上网。那么&#xff0c;什么是代理IP&#xff1f;如何在手机上设置并使用它呢&#xff1f;本文将为您详…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作&#xff0c;它可以帮助企业展示产品、服务和品牌形象&#xff0c;吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段&#xff0c;需要和客…

SpringCloud Alibaba Sentinel网关流量控制实践总结

官网地址&#xff1a;https://sentinelguard.io/zh-cn/docs/api-gateway-flow-control.html GitHub地址&#xff1a;GitHub Sentinel 网关限流 【1】概述 Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 Sentinel 1.6.0 引入了 Sentinel API …

QFileDialog的简单了解

ps&#xff1a;写了点垃圾&#xff08;哈哈哈&#xff09; 现在感觉Qt库应该是调用了Windows提供的这块的接口了。 它继承自QDialog 这是Windows自己的文件夹 这是两者的对比图&#xff1a; 通过看QFileDialog的源码&#xff0c;来分析它是怎么实现这样的效果的。 源码组成…