【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.nameclass Meta:verbose_name = '导航表'verbose_name_plural = '导航表'db_table = 'navigation'

导航表序列化器:

class NavigationSerializer(serializers.ModelSerializer):class Meta:model = NavigationModelfields = ('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.imageclass Meta:verbose_name = "轮播图表"verbose_name_plural = "轮播图表"db_table = 'banner'

轮播图序列化器:

class BannerSerializer(serializers.ModelSerializer):class Meta:model = BannerModelfields = '__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.directionclass Meta:verbose_name = "方向表"verbose_name_plural = "标签表"db_table = 'direction'

标签 / 方向表序列化器:

class DirectionSerializer(serializers.ModelSerializer):class Meta:model = DirectionModelfields = ['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.nameclass Meta:verbose_name = '分类表'verbose_name_plural = '分类表'db_table = 'category'

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

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

获取父级与子级分类:

# 2.获取一、二级分类
class CategoryView(APIView):def get(self, request):# 查询所有一级分类:parent is null# query_setcategories = CategoryModel.objects.filter(is_delete=0,parent__id__isnull=True)  #query_setclist = [] #侧边栏 二级分类显示几个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"><divv-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 分类idparent = 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.nameclass 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 = CourseModelfields = '__all__'

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

class CategoryCourseView(APIView):def get(self, request):#获取一级分类idcateid = 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.nameclass 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.nameclass 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.nameclass Meta:verbose_name = '频道分类课程表'verbose_name_plural = '频道分类课程表'db_table = 'channel_courses'

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

# --
# c.频道分类课程序列化器
class ChannelCourseSerializer(serializers.ModelSerializer):class Meta:model = ChannelCoursesModelfields = '__all__'# b.频道分类序列化器-
class ChannelCategorySerializer(serializers.ModelSerializer):courses = ChannelCourseSerializer(many=True, read_only=True)class Meta:model = ChannelCategoryModelfields = '__all__'# a.频道序列化器
class ChannelSerializer(serializers.ModelSerializer):cates = ChannelCategorySerializer(many=True, read_only=True)class Meta:model = ChannelModelfields = '__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 --><h3class="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] = keystate.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.mzph.cn/web/44970.shtml

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

相关文章

element UI时间组件两种使用方式

加油&#xff0c;新时代打工&#xff01; 组件官网&#xff1a;https://element.eleme.cn/#/zh-CN/component/date-picker 先上效果图&#xff0c;如下&#xff1a; 第一种实现方式 <div class"app-container"><el-formref"submitForm":model&q…

探索 Prompt 的世界:让你的 AI 更智能

探索 Prompt 的世界&#xff1a;让你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何编写有效的 Prompt1. 清晰明确2. 包含关键细节3. 提供上下文 实践中的 Prompt 技巧1. 多次迭代2. 实验不同风格3. 结合实际应用 总结 引言 随着人工智能&#xff08;AI&…

数据恢复篇:适用于 Android 的恢复工具

正在摆弄 Android 设备。突然&#xff0c;您意外删除了一张或多张图片。不用担心&#xff0c;您总能找到一款价格实惠的照片恢复应用。这款先进的软件可帮助 Android 用户从硬盘、安全数字 (SD) 或存储卡以及数码相机中恢复已删除的图片。 Android 上文件被删除的主要原因 在获…

采用自动微分进行模型的训练

自动微分训练模型 简单代码实现&#xff1a; import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的线性回归模型 class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear nn.Linear(1, 1) …

【Linux】数据流重定向

数据流重定向&#xff08;redirect&#xff09;由字面上的意思来看&#xff0c;好像就是将【数据给它定向到其他地方去】的样子&#xff1f; 没错&#xff0c;数据流重定向就是将某个命令执行后应该要出现在屏幕上的数据&#xff0c;给它传输到其他的地方&#xff0c;例如文件或…

[图解]企业应用架构模式2024新译本讲解26-层超类型2

1 00:00:00,510 --> 00:00:03,030 这个时候&#xff0c;如果再次查找所有人员 2 00:00:03,040 --> 00:00:03,750 我们会发现 3 00:00:05,010 --> 00:00:06,370 这一次所有的对象 4 00:00:06,740 --> 00:00:08,690 都是来自标识映射的 5 00:00:10,540 --> 00…

2024辽宁省数学建模C题【改性生物碳对水中洛克沙胂和砷离子的吸附】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年辽宁省大学数学建模竞赛C题改性生物碳对水中洛克沙胂和砷离子的吸附完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃…

【JavaScript】解决 JavaScript 语言报错:Uncaught SyntaxError: Unexpected identifier

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 缺少必要的标点符号2. 使用了不正确的标识符3. 关键词拼写错误4. 变量名与保留字冲突 四、解决方案与预防措施1. 检查和添加必要的标点符号2. 使用正确的标识符3. 检查关键词拼写4. 避免使用保留字作为变量名…

全栈 Discord 克隆:Next.js 13、React、Socket.io、Prisma、Tailwind、MySQL笔记(一)

前言 阅读本文你需要有 Next.js 基础 React 基础 Prisma 基础 tailwind 基础 MySql基础 准备工作 打开网站 https://ui.shadcn.com/docs 这不是一个组件库。它是可重用组件的集合&#xff0c;您可以将其复制并粘贴到应用中。 打开installation 选择Next.js 也就是此页面…

智慧校园服务监控功能

智慧校园系统中的服务监控功能&#xff0c;扮演着维护整个校园数字化生态系统稳定与高效运作的重要角色。它如同一位全天候的守护者&#xff0c;通过实时跟踪、分析并响应系统各层面的运行状况&#xff0c;确保教学、管理等核心业务流程的顺畅进行。 服务监控功能覆盖了智慧校园…

开发个人Ollama-Chat--6 OpenUI

开发个人Ollama-Chat–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由&#xff0c;OpenAI 的接口需要密钥才…

知识图谱与 LLM:微调与检索增强生成

Midjourney 的知识图谱聊天机器人的想法。 大型语言模型 (LLM) 的第一波炒作来自 ChatGPT 和类似的基于网络的聊天机器人&#xff0c;这些模型在理解和生成文本方面非常出色&#xff0c;这让人们&#xff08;包括我自己&#xff09;感到震惊。 我们中的许多人登录并测试了它写…

微信视频号的视频怎么下载到本地?快速教你下载视频号视频

天来说说市面上常见的微信视频号视频下载工具&#xff0c;教大家快速下载视频号视频&#xff01; 方法一&#xff1a;缓存方法 该方法来源早期视频技术&#xff0c;因早期无法将大量视频通过网络存储&#xff0c;故而会有缓存视频文件到手机&#xff0c;其目的为了提高用户体验…

尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程

Vue3 编码规范 创建vue3工程 基于vite创建 快速上手 | Vue.js (vuejs.org) npm create vuelatest 在nodejs环境下运行进行创建 按提示进行创建 用vscode打开项目 安装依赖 源文件有src 内有main.ts App.vue 简单分析 编写src vue2语法在三中适用 vue2中的date metho…

【深度学习入门篇 ⑤ 】PyTorch网络模型创建

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

OSPF.综合实验

1、首先将各个网段基于172.16.0.0 16 进行划分 1.1、划分为4个大区域 172.16.0.0 18 172.16.64.0 18 172.16.128.0 18 172.16.192.0 18 四个网段 划分R4 划分area2 划分area3 划分area1 2、进行IP配置 如图使用配置指令进行配置 ip address x.x.x.x /x 并且将缺省路由…

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

C语言 ——— 实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

一 GD32 MCU 开发环境搭建

GD32 系列为通用型 MCU &#xff0c;所以开发环境也可以使用通用型的 IDE &#xff0c;目前使用较多的是 KEIL、 IAR 、 GCC 和 Embedded Builder &#xff0c;客户可以根据个人喜好来选择相应的开发环境。 目录 1、使用 Keil 开发 GD32 目前市面通用的MDK for ARM版本有Kei…

企业网三层架构

企业网三层架构&#xff1a;是一种层次化模型设计&#xff0c;旨在将复杂的网络设计分成三个层次&#xff0c;每个层次都着重于某些特定的功能&#xff0c;以提高效率和稳定性。 企业网三层架构层次&#xff1a; 接入层&#xff1a;使终端设备接入到网络中来&#xff0c;提供…