【Django+Vue3 线上教育平台项目实战】构建课程详情页与集成视频播放功能

在这里插入图片描述


文章目录

  • 前言
  • 一、课程列表页面
    • a.后端代码
    • b.前端代码
  • 二、课程详情页面
    • a. 视频播放功能的集成
      • 1.获取上传视频的链接地址
      • 2.集成在前端页面中
        • 1>使用vue-alipayer视频播放组件
        • 2>使用video标签
    • b. 页面主要内容展示
      • 1.后端代码
        • 1>分析表
        • 2>核心逻辑
      • 2.前端代码
      • 3.效果图


前言

    随着数字化教育的兴起,构建一个高效、用户友好的线上教育平台至关重要。本文将探讨如何使用Django与Vue.js 3结合,实现一个包含课程列表和课程详情页(含视频播放功能)的线上教育平台部分。本文主要介绍了如何设计数据库模型、处理数据查询、构建动态前端界面,并集成视频播放功能,为用户带来流畅的学习体验。


一、课程列表页面

获取所有一级分类,获取所有二级分类,获取所有课程(课程分页处理),点击方向和分类时获取此方向或者此分类下的数据信息

页面展示:
在这里插入图片描述

a.后端代码

url配置信息:

    path('nav/cates/', CategoryView.as_view()), #课程列表页面 /project-方向/一级分类 ----- 侧边栏-获取一二级分类 -path('nav/category/', CateView.as_view()),  #课程列表页面 /project-二级分类#课程列表页面 / projectpath('courseSearch/', CourseSearch.as_view()),  # /project页面--搜索课程---

获取方向、分类及课程信息:

# 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})# 2.2 categoryId指定类别时,展示categoryId的子分类
# 获取project页面的二级分类
class CateView(APIView):def get(self, request):categoryId = int(request.GET.get('categoryId'))print(categoryId)if categoryId:category = CategoryModel.objects.filter(is_delete=False, parent_id=categoryId).all()else:category = CategoryModel.objects.filter(is_delete=False, parent_id__isnull=False).all()cates = SonCategorySerializer(category, many=True)return Response({"cood": 200, "cateList": cates.data})# 8.搜索课程
class CourseSearch(APIView):def get(self,request):topId = int(request.GET.get('topId'))cid = int(request.GET.get('cid'))page = int(request.GET.get('page'))pageSize = int(request.GET.get('pageSize'))print(page,pageSize)if topId:course = CourseModel.objects.filter(topid=topId)if cid:course = CourseModel.objects.filter(parent_id=cid)if not topId and not cid:course = CourseModel.objects.all()courseTotal = CourseSerializer(course,many=True)coursePage = Paginator(course, pageSize)courseList = CourseSerializer(coursePage.get_page(page),many=True)return Response({"code": 200,"pagetion":{"page":page,"pageSize":pageSize,"total":len(courseTotal.data)},'cousers': courseList.data})

b.前端代码

主要代码(方向、分类、课程的获取与展示)- src/views/Course.vue:

<div class="type"><div class="type-wrap"><!-- 方向: --><div class="one warp"><span class="name">方向:</span><ul class="items"><li :class="{cur: course.current_direction === 0}"><a href="" @click.prevent="course.current_direction=0">全部</a></li><li :class="{cur: course.current_direction === direction.id}" v-for="direction in category.data"><a href="" @click.prevent="course.current_direction=direction.id">{{direction.name}}</a></li></ul></div><!-- 分类 --><div class="two warp"><span class="name">分类:</span><ul class="items"><li :class="{cur: course.current_category === 0}"><a href="" @click.prevent="course.current_category=0">不限</a></li><li :class="{cur: course.current_category === category.id}" v-for="category in category.cateList"><a href="" @click.prevent="course.current_category=category.id">{{category.name}}</a></li></ul></div></div>
</div>
<!-- Main课程部分 -->
<div class="main"><div class="main-wrap"><div class="filter clearfix"><div class="sort l"><a href="" :class="{on:course.ordering==='-id'}" @click.prevent.stop="course.ordering=(course.ordering==='-id'?'':'-id')">最新</a><a href="" :class="{on:course.ordering==='-students'}" @click.prevent.stop="course.ordering=(course.ordering==='-students'?'':'-students')">销量</a><a href="" :class="{on:course.ordering==='-orders'}" @click.prevent.stop="course.ordering=(course.ordering==='-orders'?'':'-orders')">推荐</a></div><div class="other r clearfix"><a class="course-line l" href="" target="_blank">学习路线</a></div></div><ul class="course-list clearfix"><!-- 遍历展示课程信息 --><li class="course-card" v-for="course_info in category.course_list"><router-link :to="`/project/${course_info.id}`"><div class="img"><img :src="course_info.picurl" alt=""></div><p class="title ellipsis2">{{course_info.name}}</p><p class="one"><span>{{ course_info.level }} · {{ course_info.sales }}人报名</span></p><p class="two clearfix"><span class="price l red bold" v-if="course_info.price !== undefined">¥{{parseFloat(course_info.price).toFixed(2)}}</span><span class="price l red bold" v-else>¥{{parseFloat(course_info.price).toFixed(2)}}</span><span class="origin-price l delete-line" v-if="course_info.price !== undefined">¥{{parseFloat(course_info.price).toFixed(2)}}</span><el-popconfirm title="您确认添加当前课程加入购物车吗?" @confirm.prevent.stop="add_course_to_cart(course_info)" confirmButtonText="买买买!" cancelButtonText="误操作!"><template #reference><span class="add-shop-cart r" @click.stop.prevent=""><img class="icon imv2-shopping-cart" src="../assets/cart2.svg">加购物车</span></template></el-popconfirm></p></router-link></li></ul><!-- 分页功能 --><div class="page"><div style="position: absolute;left: 50%;transform: translateX(-50%)"><el-paginationstyle="margin: auto" background layout="prev, pager, next":total='category.pageTion.total':page-size="category.pageTion.pageSize"@current-change="change"/></div></div></div>
</div>
import category from "../api/cetory.js";//++category.get_category();
category.search_course(0, 0,pageTion);
category.get_cate(0);

src/api/cetory.js:

import { reactive } from "vue";
import http from "../http";
const category = reactive({data: [],  // 方向 / 一级分类course_list: [], // 课程信息cateList: [], //二级分类pageTion: {}, // 分页get_category(id) {return http.get("/home/nav/cates/", { params: { cateid: id } }).then(response => {//课程列表页面-project-获取方向(一级分类)// console.log("response.data.data*************/home/nav/cates/******************");// console.log(response.data.data);this.data = response.data.data;})},get_cate(categoryId) {return http.get("/home/nav/category/", { params: { categoryId: categoryId } }).then(response => {//课程列表页面-project-获取二级分类// console.log("response.data*********************/home/nav/category/***************************");// console.log(response.data);this.cateList = response.data.cateList;})},// 分页、搜索对应方向或分类的课程topid-->方向,cid-->分类search_course(topId, cid, page) {const params = {topId: topId,cid: cid,page: page.page,pageSize: page.pageSize}return http.get(`/home/courseSearch/`, { params }).then(response => {console.log("response.data****************/home/courseSearch/*********************");console.log(response.data);this.course_list = response.data.cousers;this.pageTion = response.data.pagetion;})},
})export default category;

二、课程详情页面

a. 视频播放功能的集成

这里以七牛云服务器 (存储视频)+ vue-alipayer视频播放组件为例实现视频播放功能

  • 七牛云官网地址:https://www.qiniu.com/
  • vue-alipayer视频播放组件地址:https://github.com/liho98/vue-aliplayer-v2
    • 演示效果:https://player.alicdn.com/aliplayer/index.html

1.获取上传视频的链接地址

具体操作步骤如下:

  • 1.七牛云注册登录:https://www.qiniu.com/
  • 2.点击对象存储:
    在这里插入图片描述
  • 3.创建存储空间:
    在这里插入图片描述
  • 4.创建成功:
    在这里插入图片描述
  • 5.上传一段视频用于在课程详情页面展示:
    在这里插入图片描述
  • 6.视频上传成功:
    在这里插入图片描述
  • 7.查看文件详情,可获得文件链接:
    在这里插入图片描述

2.集成在前端页面中

1>使用vue-alipayer视频播放组件
            <AliPlayerV3ref="player"class="h-64 md:h-96 w-full rounded-lg"style="height: 100%; width: 100%;":source="course.info.course[0].video_url":cover="course.info.course_cover":options="options"@play="onPlay($event)"@pause="onPause($event)"@playing="onPlaying($event)"/>

source属性绑定的值,存放视频播放地址。(通过向后端发送请求获取数据库中的数据)


页面效果如下图:
在这里插入图片描述

2>使用video标签

可参考菜鸟教程:https://www.runoob.com/html/html-videos.html
示例代码:

<video width="320" height="240" controls><source src="http://sgigui51q.hb-bkt.clouddn.com/scenery.mp4" type="video/mp4">
</video> 

b. 页面主要内容展示

1.后端代码

1>分析表
  • 1.课程表CourseModel
    • 新加字段:total_jie(总节数)、hours(总时长)、vide_url(课程总介绍)、question常见问题
  • 2.课程章表
    • 字段:id、名称、课程id(外键)、总节数、时间(用于页面展示)、总时长(秒)
  • 3.课程节表
    • 字段:id、名称、课程id、章id(外键)、视频id、时间、时长(秒)
  • 4.教师表(课程表+teacher字段关联教师表)
    • 字段:id、姓名、头像、介绍、教授的课程
  • 5.用户表
    • 字段:id、用户名、手机号、密码、积分、头像、个性签名
  • 6.评价表
    • 字段:id、userid(外键)、courseid(外键)、评价、评分
  • 7.回复表
    • 字段:id、回复人id(用户id)、评价id(外键)、内容
2>核心逻辑
# 0.课程详情
class CourseDetailView(APIView):def get(self, request, id):r.delete_str("testdata")# 先取一下缓存test_data = r.get_str("testdata")if test_data:# 序列化 str-->jsontest_data = json.loads(test_data)return Response({"message":"test111111","data":test_data})course_list = CourseModel.objects.filter(id=id)ser = CourseSerializer(course_list, many=True)# 放入缓存 json-->strr.set_str('testdata',json.dumps(ser.data))return Response({"message":"test22222222222","code":"200","data":ser.data})# 1.获取章节信息
class ChaptersView(APIView):def get(self, request, id):# 根据课程id查对应章节course = CourseModel.objects.filter(id=id).first()# course + chapterschapt = course.chapters.all()ser = ChaptersSerializer(chapt, many=True)return Response({"code": "200", "data": ser.data})#2.评论及其回复
class CommentView(APIView):def get(self, request, id):# id---> 课程id ---对应查询课程下面的评论comments = CommentModel.objects.filter(course_id=id)comments_ser = CommentsSerializer(comments, many=True)return Response({"code": "200", "data": comments_ser.data})

2.前端代码

课程详情页面src/views/Info.vue:

<template><div class="detail"><Header/><!-- 主体内容 --><div class="main"><!-- 课程详情 -上半部分 --><div class="course-info"><div class="wrap-left"><!-- 视频播放器 --><AliPlayerV3ref="player"class="h-64 md:h-96 w-full rounded-lg"style="height: 100%; width: 100%;":source="course.info.course[0].video_url":cover="course.info.course_cover":options="options"@play="onPlay($event)"@pause="onPause($event)"@playing="onPlaying($event)"/></div><div class="wrap-right"><h3 class="course-name">{{course.info.course[0].name}}</h3><p class="data">{{course.info.course[0].sales}}人在A学&nbsp;&nbsp;&nbsp;&nbsp;课程总时长:{{course.info.pub_lessons}}课时/{{course.info.lessons}}课时&nbsp;&nbsp;&nbsp;&nbsp;难度:{{course.info.course[0].level}}</p><div class="sale-time" v-if="!course.info.discount.type"><p class="sale-type">课程价格 ¥{{parseFloat(course.info.course[0].price).toFixed(2)}}</p></div><p class="course-price" v-if="course.info.discount.price !== undefined"><span>活动价</span><span class="discount">¥{{parseFloat(course.info.discount.price).toFixed(2)}}</span><span class="original">¥{{parseFloat(course.info.price).toFixed(2)}}</span></p><p class="course-price" v-if="course.info.credit>0"><span>抵扣积分</span><span class="discount">{{course.info.credit}}</span></p><div class="buy"><div class="buy-btn"><button class="buy-now">立即购买</button><button class="free">免费试学</button></div><el-popconfirm title="您确认添加当前课程加入购物车吗?" @confirm="add_course_to_cart" confirmButtonText="买买买!" cancelButtonText="误操作!"><template #reference><div class="add-cart"><img src="../assets/cart-yellow.svg" alt="">加入购物车</div></template></el-popconfirm></div></div></div><!-- 课程标签、课程选项卡 -中间部分 --><div class="course-tab"><ul class="tab-list"><li :class="course.tabIndex===1?'active':''" @click="course.tabIndex=1">详情介绍</li><li :class="course.tabIndex===2?'active':''" @click="course.tabIndex=2">课程章节 <span :class="course.tabIndex!==2?'free':''" v-if="course.info.can_free_study">(试学)</span></li><li :class="course.tabIndex===3?'active':''" @click="course.tabIndex=3">用户评论 </li><li :class="course.tabIndex===4?'active':''" @click="course.tabIndex=4">常见问题</li></ul></div><!-- 课程内容 -章节-下半部分 --><!-- 章节:{{course.chapter_list[0].name}} --><div class="course-content"><!-- 选项卡-内容 --><div class="course-tab-list"><!-- 选项卡1:详情介绍 --><div class="tab-item" v-if="course.tabIndex===1" v-html="course.info.course[0].describe"></div><!-- 选项卡2:课程章节 --><div class="tab-item" v-if="course.tabIndex===2"><div class="tab-item-title"><p class="chapter">课程章节</p><p class="chapter-length">共{{course.chapter_list.length}}章 {{course.info.course[0].hours}}个课时</p></div><div class="chapter-item" v-for="chapter,index in course.chapter_list" :key="index"><p class="chapter-title"><img src="../assets/1.svg" alt="">第{{chapter.id}}章·{{chapter.name}}</p><div class="chapter-title" style="padding-left: 2.4rem;" v-if="chapter.summary" v-html="chapter.summary"></div><!-- jie:{{chapter.sections}} --><ul class="lesson-list"><li class="lesson-item"  v-for="lesson,index in chapter.sections" :key="index"><p class="name"><span class="index">{{chapter.orders}}-{{lesson.orders}}</span>{{lesson.name}}<span class="free" v-if="lesson.free_trail">免费</span></p><p class="time">{{lesson.duration}} <img src="../assets/chapter-player.svg"></p><button class="try"  v-if="lesson.free_trail">立即试学</button><button class="try" v-else>购买课程</button></li></ul></div></div><!-- 选项卡3:用户评论 --><div class="tab-item" v-if="course.tabIndex===3"><h2>用户评论</h2><div class="teacher-content"><div class="cont1"><img style="border-radius: 50%;" :src="course.comments_list[0].user.avatar"><p class="teacher-name">{{course.comments_list[0].user.username}}</p></div><div class="narrative" v-html="course.comments_list[0].message"></div>  </div></div><!-- 选项卡4:常见问题 --><div class="tab-item" v-if="course.tabIndex===4"><h2>常见问题</h2><div v-html="course.info.course[0].question"></div></div></div><!-- 课程旁边的老师 --><!-- 教师:{{course.info.course[0].teacher}} --><div class="course-side"><div class="teacher-info"><h4 class="side-title"><span>授课老师</span></h4><div class="teacher-content"><div class="cont1"><img style="border-radius: 50%;" :src="course.info.course[0].teacher.avatar"><div class="name"><p class="teacher-name">{{course.info.course[0].teacher.name}}</p><p class="teacher-title">{{course.info.course[0].teacher.get_role_display}}角色:教师,教授的课程:{{course.info.course[0].teacher.courses}}</p></div></div><div class="narrative" v-html="course.info.course[0].teacher.introduce"></div></div></div></div></div></div><Footer/></div>
</template>

课程详情src/api/course.js:

  get_course() {// 获取课程详情return http.get(`/info/courses/${this.course_id}/`).then(response => {console.log("response.data:**************/info/courses/*******************");console.log(response.data);this.info.course = response.data.data;return this.get_course_chapters();})},get_course_chapters() {// 获取指定课程的章节列表return http.get(`/info/chapters/${this.course_id}/`).then(response => {// console.log("response.data---*******************/info/chapters********************");// console.log(response.data);this.chapter_list = response.data.data;})},get_comments_list() {// 获取对应课程下面的评论信息return http.get(`/info/comments/${this.course_id}/`).then(response => {console.log("response.data-----------/info/comments/*****************");console.log(response.data);console.log(response.data.data);this.comments_list = response.data.data;})},

3.效果图

  • 详情介绍
    在这里插入图片描述
  • 课程章节
    在这里插入图片描述
  • 用户评论
    在这里插入图片描述
  • 常见问题
    在这里插入图片描述

在这里插入图片描述

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

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

相关文章

线程池-拒绝策略

线程池-拒绝策略 RejectedExecutionHandlerAbortPolicyCallerRunsPolicyDiscardPolicyDiscardOldestPolicy自定义拒绝策略 当核心线程已用尽 & 阻塞队列已满 & 超过最大线程数时&#xff0c;再向线程池提交任务&#xff0c;则会触发线程池的拒绝策略。 RejectedExecuti…

Python爬虫与文本到语音转换实战:获取并播报长沙天气

简介&#x1f495; 在本文中&#xff0c;我们将通过一个简单的Python脚本&#xff0c;演示如何使用网络爬虫技术获取长沙的天气信息&#xff0c;并使用文本到语音技术将天气信息播报出来。我们将使用pyttsx3库进行语音播报&#xff0c;使用requests库来发起网络请求&#xff0…

自动驾驶-2D目标检测

yolo及yolo的变体 anchor boxes (锚框) intersection over union 并集交集 用于计算两个边界框的差异程度 bounding box predictions 边界框预测 non maximum suppression非极大值抑制 为了分离这些边界框并为每个对象获得单个边界框&#xff0c;我们使用IOU。这种获取单…

2024-07-15 Unity插件 Odin Inspector4 —— Collection Attributes

文章目录 1 说明2 集合相关特性2.1 DictionaryDrawerSettings2.2 ListDrawerSettings2.3 TableColumnWidth2.4 TableList2.5 TableMatrix 1 说明 ​ 本章介绍 Odin Inspector 插件中集合&#xff08;Dictionary、List&#xff09;相关特性的使用方法。 2 集合相关特性 2.1 D…

2-34 小波神经网络采用传统 BP 算法

小波神经网络采用传统 BP 算法&#xff0c;存在收敛速度慢和易陷入局部极小值两个突出弱点。建立了基于遗传算法的小波神经网络股票预测模型 GA-WNN。该模型结合了遗传算法的全局优化搜索能力以及小波神经网络良好的时频局部特性。运用 MATLAB 对拟合和预测过程进行仿真。结果表…

<数据集>绝缘子缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2139张 标注数量(xml文件个数)&#xff1a;2139 标注数量(txt文件个数)&#xff1a;2139 标注类别数&#xff1a;8 标注类别名称&#xff1a;[insulator, broken disc, pollution-flashover, Two glass, Glassdirt…

李笑来思考框架的结晶《思考的真相》(2024 年新书)

点开文章的你肯定读过李笑来的书&#xff0c;比如讲认知的《财富自由之路》、讲管理自己的《把时间当做朋友》、讲财富底层逻辑的《财富的真相》、讲定投的《让时间陪你慢慢变富》等等。 李笑来的书不讲究华丽的文字&#xff0c;在意逻辑、论证的严谨&#xff0c;层层递进&…

数据结构之通过“ 队列 ”实现的“ 栈 ”功能。

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 本节内容是利用“ 队列 ”先进先出的特点 实现 “ 栈 ” 先进后出。 一、题目 1.1 题目描述&#xff1a; 请你仅使用两个队列实现一个后入先出&…

成为CMake砖家(1): 在Windows上查看CMake文档

大家好&#xff0c;我是白鱼。 在使用 CMake 的过程中&#xff0c;想必有不少朋友像我一样&#xff0c; 想在本地查看 CMake 文档。 首先安装 CMake, Installer 版本&#xff1a; 安装后&#xff0c;从开始菜单输入 CMake&#xff0c; 选择结果中的 “CMake Documentation”…

如何在 Shell 脚本中使用函数 ?

函数是一个可重用的代码块。我们经常把重复的代码放入一个函数中&#xff0c;并从不同的地方调用该函数&#xff0c;库是函数的集合。我们可以在库中定义常用的函数&#xff0c;其他脚本可以使用它们而无需复制代码。 Calling function 在 Shell 中&#xff0c;调用函数和调用…

1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程 激活可视化&#xff08;Activation Visualization&#xff09;指的是通过可视化神经网络中激活函数的输出&#xff0c;来理解神经网络是如何学习并提取特征的过程。在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;我们可以通过…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引&#xff0c;使得在千万级数据量的一个情况下&#xff0c;树的高度可以控制在3层以内&#xff0c;而层高代表磁盘IO的一个次数&#xff0c;因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先&#xff0c;我们创建一个mn的棋盘&#xff0c;并初始化所有的点为未访问状态。 然后&#xff0c;我们从(0, 0)位置开始进行深度优先搜索。 在每一步中&#xff0c;我们先标记当前位置为已访问&#xff0…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码&#xff0c;或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考&#xff1a; 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP&#xff0c;后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案&#xff0c;可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署&#xff01;加密通道&#xff01;牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA&#xff1f; 《网络弹性法案》&#xff08;CRA&#xff09;是即将出台的欧盟法规&#xff0c;旨在确保在欧盟销售的所有数字产品和服务&#xff08;如连接到互联网的软件和硬件&#xff09;都采用强大的网络安全措施。 该法案要求…