基于Springboot+Vue的在线答题闯关系统

基于Springboot+Vue的在线答题闯关系统

前言:随着在线教育的快速发展,传统的教育模式逐渐向互联网+教育模式转型。在线答题系统作为其中的一个重要组成部分,能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架,设计并实现了一个在线答题闯关系统,旨在为用户提供顺序出题、随机出题、错题本、收藏题目、答题统计等多种功能,以增强用户的学习体验。

目录

  • 前言
    • 项目功能及技术
      • 用户端
      • 管理端
  • API
    • SpringBoot框架搭建
    • 实体映射创建Mapper
    • 接口封装
    • 整合Swagger
    • 常用字段类型
  • 参考代码块

前言

本系统采用前后端分离架构,前端使用Vue.js框架实现,后端则通过Spring Boot进行构建,数据存储使用MySQL数据库。前端使用Vue.js进行数据渲染,而后端提供RESTful API接口来实现前后端的有效数据交互。

项目功能及技术

功能模块设计

  • 顺序出题模块:该模块允许用户按顺序答题,系统根据预设的题目顺序逐一展示给用户。用户完成每一道题后可以进入下一题,适合需要系统化学习的用户。

  • 体型练习模块:用户可以根据自己的需求选择特定的练习模式,比如选择某个类别或某个难度的题目进行练习。该模块支持用户自定义练习内容,帮助用户强化薄弱的知识点。

  • 随机出题模块:系统可以随机从题库中抽取题目,进行答题闯关,用户在有限的时间内答题,提升学习的趣味性和挑战性。

  • 错题本模块:该模块记录用户做错的题目,用户可以随时查看并重新进行练习,帮助用户集中攻克自己的薄弱环节,提升记忆与掌握度。

  • 我的收藏模块:用户可以将自己喜欢或难度较高的题目收藏到个人收藏夹,方便以后再次复习或挑战。

  • 答题统计模块:系统自动统计用户的答题情况,包括正确率、答题速度、错题数量等,帮助用户了解自己的学习进度和成效,并能根据数据调整学习策略。

技术:

  • Spring Boot:后端框架,利用Spring Boot的快速开发特性。同时,通过Mybatis简化数据库操作,提高数据访问效率。

  • Vue.js:前端框架,使用Vuex进行全局状态管理,提升数据的一致性与可维护性。

  • MySQL:数据库存储引擎,负责存储题目数据、用户答题记录、错题与收藏等信息。

  • Layui:前端UI组件库,用于搭建美观且响应式的用户界面,提升用户交互体验。

用户端

管理端

API

SpringBoot框架搭建

1.创建maven project,先创建一个名为SpringBootDemo的项目,选择【New Project】

在这里插入图片描述

然后在弹出的下图窗口中,选择左侧菜单的【New Project】

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

在project下创建module,点击右键选择【new】—【Module…】

在这里插入图片描述

左侧选择【Spring initializr】,通过idea中集成的Spring initializr工具进行spring boot项目的快速创建。窗口右侧:name可根据自己喜好设置,group和artifact和上面一样的规则,其他选项保持默认值即可,【next】

在这里插入图片描述

Developer Tools模块勾选【Spring Boot DevTools】,web模块勾选【Spring Web】,此时,一个Springboot项目已经搭建完成,可开发后续功能

在这里插入图片描述

实体映射创建Mapper

创建一个entity实体类文件夹,并在该文件夹下创建项目用到的实体类

在这里插入图片描述

package com.example.demo.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@Data
public class User {@TableId(type = IdType.AUTO)private Long id;private String account;private String pwd;private String userDesc;private String userHead;private LocalDateTime createTime;private Long role;private String nickname;private String email;private String tags;
}

接口封装

由于我们使用mybatis-plus,所以简单的增删改查不用自己写,框架自带了,只需要实现或者继承他的Mapper、Service

在这里插入图片描述

创建控制器Controller

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

整合Swagger

添加依赖

先导入spring boot的web包

<!--swagger依赖-->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>

配置Swagger

创建一个swagger的配置类,命名为SwaggerConfig.java

/**用于定义API主界面的信息,比如可以声明所有的API的总标题、描述、版本*/private ApiInfo apiDemo() {return new ApiInfoBuilder()//用来自定义API的标题.title("SpringBoot项目SwaggerAPIAPI标题测试")//用来描述整体的API.description("SpringBoot项目SwaggerAPI描述测试")//创建人信息.contact(new Contact("测试员张三","http://localhost:8080/springboot/swagger-ui.html","xxxxxxxx@163.com"))//用于定义服务的域名//.termsOfServiceUrl("").version("1.0") //可以用来定义版本.build();}

接口测试

运行Spring Boot项目,默认端口8080,通过地址栏访问url

在这里插入图片描述

接口组定义

根据不同的业务区分不同的接口组,使用@API来划分

@Api(tags = "用户管理") //  tags:组名称
@RestController
public class RoleController {
}

在这里插入图片描述
接口定义

使用@ApiModel来标注实体类,同时在接口中定义入参为实体类作为参数。

  • @ApiModel:用来标类

  • 常用配置项:value:实体类简称;description:实体类说明

  • @ApiModelProperty:用来描述类的字段的含义。

常用字段类型

字段类型所占字节存储范围最大存储值使用场景
TINYINT1-128~127127存储小整数
INT4-2147483648~21474836472147483647存储大整数
BIGINT8-9223372036854775808~92233720368547758079223372036854775807存储极大整数
DECIMAL可变长度存储精度要求高的数值
CHAR固定长度最多255字节255个字符存储长度固定的字符串
VARCHAR可变长度最多65535字节65535个字符存储长度不固定的字符串
DATETIME8‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’‘9999-12-31 23:59:59’存储日期和时间

参考代码块

  <body style="background-color: #f7f7f7;"><div class="headerBox"><div class="logoBox"><img src="img/logo1.png" /><div class="logoTitle">在线答题闯关</div></div><div class="menuBox"><div class="menuItem activeMenu "><a href="index.html">练习模式</a></div><div class="menuItem blackColor"><a href="challengeLevels.html?param=primary">闯关模式</a></div><div class="menuItem blackColor"><a href="wrongQuestion.html">我的错题</a></div><div class="menuItem blackColor"><a href="myCollection.html">我的收藏</a></div><div class="menuItem blackColor"><a href="statistics.html">答题统计</a></div><div class="menuItem blackColor"><a href="center.html">个人中心</a></div><div class="menuItem blackColor"><a href="./login/login.html">退出登录</a></div></div></div><div class="container-fluid" id="content-page"><div class="row"><div class="col-md-2">&nbsp;</div><div class="col-md-8"><div class="searchBox"><div class="leftTitle">{{pageTitle}}</div></div></div><div class="col-md-2">&nbsp;</div></div><div class="row"><div class="col-md-2">&nbsp;</div><div class="col-md-8"><div v-for="(item,index) in questionList"><div class="radioItemBox" v-if="item.questionType == '单选题'"><div class="BtnBox radioItem"><div>{{index+1}}.</div><textarea rows="18" cols="90" v-model="item.title" disabled></textarea><img src="img/collecQues.png" class="radioItemTypeImg"v-on:click="collection(item.id)" /></div><div class="BtnBox radioLineV2" v-if="item.checkA!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'A')" /></div><div>A.</div><input v-model="item.checkA" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkB!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'B')" /></div><div>B.</div><input v-model="item.checkB" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkC!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'C')" /></div><div>C.</div><input v-model="item.checkC" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkD!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'D')" /></div><div>D.</div><input v-model="item.checkD" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkE!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'E')" /></div><div>E.</div><input v-model="item.checkE" disabled class="radioLineV2Input" /></div></div><div class="radioItemBox" v-if="item.questionType == '多选题'"><div class="BtnBox radioItem"><div>{{index+1}}.</div><textarea rows="18" cols="90" v-model="item.title" disabled></textarea><img src="img/collecQues.png" class="radioItemTypeImg"v-on:click="collection(item.id)" /></div><div class="BtnBox radioLineV2" v-if="item.checkA!=''"><div class="radioIconBox"><input type="checkbox" class="radioInputCheck" :name="index"v-on:change="checkTwo($event,index,'A')" /></div><div>A.</div><input v-model="item.checkA" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkB!=''"><div class="radioIconBox"><input type="checkbox" class="radioInputCheck" :name="index"v-on:change="checkTwo($event,index,'B')" /></div><div>B.</div><input v-model="item.checkB" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkC!=''"><div class="radioIconBox"><input type="checkbox" class="radioInputCheck" :name="index"v-on:change="checkTwo($event,index,'C')" /></div><div>C.</div><input v-model="item.checkC" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkD!=''"><div class="radioIconBox"><input type="checkbox" class="radioInputCheck" :name="index"v-on:change="checkTwo($event,index,'D')" /></div><div>D.</div><input v-model="item.checkD" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkE!=''"><div class="radioIconBox"><input type="checkbox" class="radioInputCheck" :name="index"v-on:change="checkTwo($event,index,'E')" /></div><div>E.</div><input v-model="item.checkE" disabled class="radioLineV2Input" /></div></div><div class="radioItemBox" v-if="item.questionType == '判断题'"><div class="BtnBox radioItem"><div>{{index+1}}.</div><textarea rows="18" cols="90" v-model="item.title" disabled></textarea><img src="img/collecQues.png" class="radioItemTypeImg"v-on:click="collection(item.id)" /></div><div class="BtnBox radioLineV2" v-if="item.checkA!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'A')" /></div><div>A.</div><input v-model="item.checkA" disabled class="radioLineV2Input" /></div><div class="BtnBox radioLineV2" v-if="item.checkB!=''"><div class="radioIconBox"><input type="radio" class="radioInputCheck" :name="index"v-on:change="checkOne(index,'B')" /></div><div>B.</div><input v-model="item.checkB" disabled class="radioLineV2Input" /></div></div></div><div class="BtnBox margin-sm"><div class="AddQuesBtnItem" v-on:click="SaveChange"><img src="img/submit.png" />提交</div><div style="height:100px;"></div></div></div><div class="col-md-2">&nbsp;</div></div></div><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/vue.js"></script><script type="text/javascript" src="login/layui/layui.js"></script><script>//轻量级框架var dataInfo = new Vue({el: "#content-page",//Vue的数据对象data: {questionList: [],pageTitle: ''}, //数据对象结束//方法methods: {GetAll: function() {let vm = this;let param = GetQueryString("param");let type = GetQueryString("type");let quesType = '';if (param == 'practice') {if (type == '0') {quesType = '单选题';} else if (type == '1') {quesType = '多选题';} else {quesType = '判断题';}vm.pageTitle = '练习模式:' + quesType;} else if (param == 'order') {vm.pageTitle = '顺序出题';} else {vm.pageTitle = '随机练习';}var user = JSON.parse(sessionStorage.getItem('user'));$.ajax({url: "http://127.0.0.1:8081/common/answer-list?userId=" + user.id + "&param=" +param + "&type=" + quesType,async: false,type: "POST",contentType: 'application/json',dataType: 'json',success: function(json) {vm.questionList = json.list}});},//单选框选择事件checkOne(index, check) {let vm = this;vm.questionList[index].isChecked = check;},//多选框选择事件checkTwo(event, index, check) {let vm = this;const checked = event.target.checked;let info = vm.questionList[index];let checkedArray = info.isChecked.split(',');if (checkedArray[0] == '') {checkedArray.splice(0, 1);}if (checked) {checkedArray.push(check);info.isChecked = checkedArray.join(',');} else {let ind = checkedArray.indexOf(check);if (ind !== -1) {checkedArray.splice(ind, 1);}info.isChecked = checkedArray.join(',');}},//点击提交SaveChange() {let vm = this;//得分let number = 0;let list = vm.questionList;for (let i = 0; i < list.length; i++) {if (list[i].isChecked != '') {let right = list[i].rightKey.split(',');let check = list[i].isChecked.split(',');if (right.length === check.length && right.sort().toString() === check.sort().toString()) {list[i].correct = 1;number++;}}}var user = JSON.parse(sessionStorage.getItem('user'));var vo = {};vo.answerList = list;vo.number = number;vo.userId = user.id;vo.type = '练习';$.ajax({url: "http://127.0.0.1:8081/common/get-answer",async: false,type: "POST",contentType: 'application/json',dataType: 'json',data: JSON.stringify(vo),success: function(json) {layui.use('layer', function() {var layer = layui.layer;// 弹出提示框layer.msg('您的分数为:' + number + '分', {icon: 6, // 图标样式,默认为信息图标time: 2000, // 显示时间,默认为2秒shade: 0.5, // 遮罩层透明度,默认为0.3shadeClose: true // 是否点击遮罩关闭弹框,默认为true});});}});},//点击收藏collection(id) {var vo = {};var user = JSON.parse(sessionStorage.getItem('user'));vo.userId = user.id;vo.answerId = id;$.ajax({url: "http://127.0.0.1:8081/common/addCollect",async: false,type: "POST",contentType: 'application/json',dataType: 'json',data: JSON.stringify(vo),success: function(json) {layui.use('layer', function() {var layer = layui.layer;// 弹出提示框layer.msg(json.returnMsg, {icon: json.returnMsg == '您已收藏过' ? 5 :6, // 图标样式,默认为信息图标time: 2000, // 显示时间,默认为2秒shade: 0.5, // 遮罩层透明度,默认为0.3shadeClose: true // 是否点击遮罩关闭弹框,默认为true});});}});},}, //方法结束created: function() {var vm = this;vm.GetAll();}, //初始加载方法结束}); //vue结束function GetQueryString(name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if (r != null) return unescape(r[2]);return null;}</script></body>
</html>
<head><meta charset="utf-8" /><title>答题统计</title></head><link href="css/index.css" rel="stylesheet" /><link href="css/bootstrap.min.css" rel="stylesheet" /><body style="background-color: #f7f7f7;"><div class="headerBox"><div class="logoBox"><img src="img/logo1.png" /><div class="logoTitle">在线答题闯关</div></div><div class="menuBox"><div class="menuItem  blackColor"><a href="index.html">练习模式</a></div><div class="menuItem blackColor"><a href="challengeLevels.html?param=primary">闯关模式</a></div><div class="menuItem blackColor"><a href="wrongQuestion.html">我的错题</a></div><div class="menuItem blackColor"><a href="myCollection.html">我的收藏</a></div><div class="menuItem activeMenu"><a href="statistics.html">答题统计</a></div><div class="menuItem blackColor"><a href="center.html">个人中心</a></div><div class="menuItem blackColor"><a href="./login/login.html">退出登录</a></div></div></div><div class="container-fluid" id="content-page"><div class="row"><div class="col-md-2">&nbsp;</div><div class="col-md-8"><div class="searchBox"><div class="leftTitle">答题统计</div><div></div></div></div><div class="col-md-2">&nbsp;</div></div><div class="row"><div class="col-md-2">&nbsp;</div><div class="col-md-4"><div id="main"></div></div><div class="col-md-4"><div id="main2"></div></div><div class="col-md-2">&nbsp;</div></div></div><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/echarts.min.js"></script><script>function GetQueryString(name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if (r != null) return unescape(r[2]);return null;}var user = JSON.parse(sessionStorage.getItem('user'));$.ajax({url: "http://127.0.0.1:8081/common/total?userId=" + user.id,async: false,type: "POST",contentType: 'application/json',dataType: 'json',data: JSON.stringify({}),success: function(json) {initCharts1(json.data);var inputArray = json.data;// 定义对应的题目类型名称数组var typeNameArray = ['单选题', '多选题', '判断题'];// 结果数组var resultArray = [];// 遍历输入数组for (var i = 0; i < inputArray.length; i++) {// 构造对象,并添加到结果数组中var item = {value: inputArray[i],name: typeNameArray[i]};resultArray.push(item);}initCharts(resultArray);}});function initCharts(data1) {var chartDom = document.getElementById('main');var myChart = echarts.init(chartDom);var option;option = {title: {text: '答题数统计',subtext: '',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},series: [{name: 'Access From',type: 'pie',radius: '50%',data: data1,emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]};myChart.setOption(option);};function initCharts1(data2) {var chartDom = document.getElementById('main2');var myChart = echarts.init(chartDom);var option;option = {xAxis: {type: 'category',data: ['单选题', '多选题', '判断题']},yAxis: {type: 'value'},series: [{data: data2,type: 'bar',showBackground: true,backgroundStyle: {color: 'rgba(180, 180, 180, 0.2)'}}]};myChart.setOption(option);};</script></body>
</html>

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

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

相关文章

矿区新发现,改造明星profinet转profibus协议网关也有未来

profinet转profibusDP协议网关&#xff0c;在矿区的一些老设备上&#xff0c;改造升级一定会遇到profibus无法通讯的情况&#xff0c;选择一个协议模块网关是性价比的首选&#xff0c;下面介绍一下协议网关的一些指标 PROFINET 在 PROFIBUS 一侧为 PROFIBUS DP 从站&#xff0…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编

1.整体框架&#xff1a;1-22题&#xff08;17-20为编程题分别源自数中的P98,P162,P177页&#xff09; 2.简答题部分&#xff1a; 3.计算题 4.程序题/编程题

Vision Transformer (ViT) 基本原理

Vision Transformer (ViT) 基本原理 flyfish Vision Transformer (ViT) 是一种基于 Transformer 架构的计算机视觉模型 一、ViT 的基本原理 ViT 的核心思想是将一张图像视为一组序列&#xff0c;将其嵌入到 Transformer 的输入中&#xff0c;通过自注意力机制捕获全局上下文…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

三款电容麦的对比

纸面参数 第一款麦克风 灵敏度: -36 dB 2 dB&#xff08;0 dB1V/Pa at 1 kHz&#xff09; 灵敏度较低&#xff0c;需要更高的增益来拾取同样的音量。频率响应: 40 Hz - 18 kHz 响应范围较窄&#xff0c;尤其在高频区域。等效噪音级: ≤18 dB&#xff08;A计权&#xff09; 噪…

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…

PPT怎样做的更加精美

目录 PPT怎样做的更加精美 3D的GIF图片 3维空间图​编辑 结果有明显的对比 阅读高质量文献,采用他们的图 PPT怎样做的更加精美 3D的GIF图片 3维空间图 结果有明显的对比

插入排序⁻⁻⁻⁻直接插入排序希尔排序

引言 所谓的排序&#xff0c;就是使一串记录按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见的排序算法有&#xff1a; 今天我们主要学习插入排序的直接插入排序和希尔排序。 直接插入排序 什么是直接插入排序&#xff1f; 直接插入排序其…

鸿蒙UI开发——亮/暗色模式适配

1、概 述 系统存在深浅色两种显示模式&#xff0c;为了给用户更好的使用体验&#xff0c;应用最好适配暗色和亮色两种模式。从应用与系统配置关联的角度来看&#xff0c;适配暗色和亮色模式可以分为下面两种情况&#xff1a; 应用跟随系统的深浅色模式&#xff1b; 应用主动设…

推荐在线Sql运行

SQL Fiddle 1、网址&#xff1a;SQL Fiddle - Online SQL Compiler for learning & practiceDiscover our free online SQL editor enhanced with AI to chat, explain, and generate code. Support SQL Server, MySQL, MariaDB, PostgreSQL, and SQLite.http://www.sqlfi…

在Ubuntu-22.04 [WSL2]中配置Docker

文章目录 0. 进入Ubuntu-22.041. 更新系统软件包2. 安装Docker相关依赖包3. 添加Docker官方GPG密钥4. 添加Docker软件源5. 安装Docker Engine5.1 更新软件包列表5.2 安装Docker相关软件包 6. 验证Docker安装是否成功6.1 查看Docker版本信息6.2 启动Docker6.3 配置镜像加速器6.4…

AI大模型ollama结合Open-webui

AI大模型Ollama结合Open-webui 作者:行癫(盗版必究) 一:认识 Ollama 1.什么是Ollama ​ Ollama是一个开源的 LLM(大型语言模型)服务工具,用于简化在本地运行大语言模型,降低使用大语言模型的门槛,使得大模型的开发者、研究人员和爱好者能够在本地环境快速实验、管理和…

使用ensp搭建内外互通,使用路由跨不同vlan通信。

1.网络拓扑图 2.规则 &#xff08;1&#xff09;允许 &#xff08;自己&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以. &#xff08;2&#xff09; 允许&#xff08;电信&#xff09;ping通内外网&#xff0c;内外网随便一个pc就可以 &#xff08;时间问题不做…

gRPC 快速入门 — SpringBoot 实现(1)

目录 一、什么是 RPC 框架 &#xff1f; 二、什么是 gRPC 框架 &#xff1f; 三、传统 RPC 与 gRPC 对比 四、gRPC 的优势和适用场景 五、gRPC 在分布式系统中应用场景 六、什么是 Protocol Buffers&#xff08;ProtoBuf&#xff09;&#xff1f; 特点 使用场景 简单的…

Python实现BBS论坛自动签到【steamtools论坛】

一、知识点分析 1.requests模块介绍 ‌requests模块是Python中用于发送HTTP请求的一个库,它封装了urllib3库,提供了更加便捷的API接口。‌ 通过使用requests模块,用户可以模拟浏览器的请求,发送HTTP请求到指定的URL,并获取响应内容。与urllib相比,requests模块的API更加…

Probabilistic Face Embeddings 论文阅读

Probabilistic Face Embeddings 论文阅读 Abstract1. Introduction2. Related Work3. Limitations of Deterministic Embeddings4. Probabilistic Face Embeddings4.1. Matching with PFEs4.2. Fusion with PFEs4.3. Learning 5. Experiments5.1. Experiments on Different Bas…

重磅升级:OpenAI o1模型上手实测,从芯片架构分析到象棋残局判断的全能表现

引言 昨日&#xff0c;在圣诞节系列发布会的第一天&#xff0c;OpenAI终于给我们带来了令人振奋的更新&#xff0c;这些更新有望塑造AI互动的未来。备受期待的OpenAI o1正式版的推出&#xff0c;标志着ChatGPT体验的重大进化&#xff0c;宣告了AI驱动应用新时代的开始。o1现已可…

1.使用docker 部署redis Cluster模式 集群3主3从

1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务&#xff0c;拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中&#xff0c;您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”&#xff0c;它们可以在系统启动时自动加载并开始运行&#xff0c;有时甚至在后台默默工作。虽然一些启动项可能是必要的&#xff08;如杀毒软件&#xff09;&a…