基于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:用来描述类的字段的含义。
常用字段类型
字段类型 | 所占字节 | 存储范围 | 最大存储值 | 使用场景 |
---|---|---|---|---|
TINYINT | 1 | -128~127 | 127 | 存储小整数 |
INT | 4 | -2147483648~2147483647 | 2147483647 | 存储大整数 |
BIGINT | 8 | -9223372036854775808~9223372036854775807 | 9223372036854775807 | 存储极大整数 |
DECIMAL | 可变长度 | 存储精度要求高的数值 | ||
CHAR | 固定长度 | 最多255字节 | 255个字符 | 存储长度固定的字符串 |
VARCHAR | 可变长度 | 最多65535字节 | 65535个字符 | 存储长度不固定的字符串 |
DATETIME | 8 | ‘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"> </div><div class="col-md-8"><div class="searchBox"><div class="leftTitle">{{pageTitle}}</div></div></div><div class="col-md-2"> </div></div><div class="row"><div class="col-md-2"> </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"> </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 + "¶m=" +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"> </div><div class="col-md-8"><div class="searchBox"><div class="leftTitle">答题统计</div><div></div></div></div><div class="col-md-2"> </div></div><div class="row"><div class="col-md-2"> </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"> </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>
相关文章:
基于Springboot+Vue的在线答题闯关系统
基于SpringbootVue的在线答题闯关系统 前言:随着在线教育的快速发展,传统的教育模式逐渐向互联网教育模式转型。在线答题系统作为其中的一个重要组成部分,能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架&…...
html css 图片背景透明
html css图标背景透明 css属性: background-color:transparent; mix-blend-mode: multiply; 完整HTML代码: <html><head><title>Test</title></head><body><div id"test" style"background-col…...
Servlet
一 Servlet Servlet (server applet) 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口 用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求…...
MySQL用法---MySQL Workbench创建数据库和表
1. 连接数据库 打开软件,点击左下角卡片,输入设置的数据库密码,勾选单选框 2. 了解主页面的组成部分 3. 创建数据库 先点击工具栏的创建按钮 再输入数据库名称 点击 Apply 创建 4. 创建数据表 展开数据库,在Tables上右键&…...
WordPress Elementor Page Builde 任意文件读取漏洞复现(CVE-2024-9935)
0x01 产品描述: WordPress Elementor Page Builder 是一款 WordPress 插件,它允许用户以可视化方式创建和编辑网页。0x02 漏洞描述: WordPress 的 Elementor Page Builder 插件的 PDF 生成器插件在 1.7.5 之前的所有版本中都容易受到路径遍历的攻击,包括 1.7.5 rtw_pgaepb_…...
静态链接和动态链接的特点
静态链接 链接方式:在编译时,所有依赖的库代码被直接打包到生成的可执行文件中。这意味着在程序运行时,不需要再加载任何外部库文件。 优点: 独立性强:生成的可执行文件可以在没有依赖库的系统上直接运行&am…...
内核流对象(Kernel Streaming Objects)
内核流对象(Kernel Streaming Objects)是 Windows 系统中用于处理音频、视频等流媒体数据的重要机制。让我详细解释其作用和主要组件: 1. 主要作用: c // 内核流的核心功能 - 音频/视频数据的实时处理 - 多媒体设备驱动开发 - 硬件与软件之间的数据流传…...
Java 在Json对象字符串中查找和提取特定的数据
1、在处理JSON数据时,需要提出个别字段的值,通过正则表达式提取特定的数据 public static void main(String[] args) {//定义多个JSON对象字符串类型,假设每个对象有a,b,c 字段String strJson "{\"a\":1.23,\"b\"…...
21、结构体成员分布
结构体中的成员并不是紧挨着分布的,内存分布遵循字节对齐的原则。 按照成员定义的顺序,遵循字节对齐的原则存储。 字节对齐的原则: 找成员中占据字节数最大的成员,以它为单位进行空间空配 --- 遇到数组看元素的类型 每一个成员距离…...
【深度学习】四大图像分类网络之ResNet
ResNet网络是在2015年由微软实验室中的何凯明等几位提出,在CVPR 2016发表影响深远的网络模型,由何凯明团队提出来,在ImageNet的分类比赛上将网络深度直接提高到了152层,前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…...
zookeeper学习
解决什么问题? 首先来分析下业务对象,才能对解决的问题进行归纳和总结。它解决的事分布式应用的问题,那么分布式应用会存在哪里问题是由它的业务特性来决定的,这些问题已是为了解决业务的问题。分布式的业务特征有哪些࿱…...
Monkey结合appium模拟操作特定界面
目录 1. 使用 Monkey 操作特定界面(通过UI标识来限制) 2. 结合 uiautomator 或 appium 定位特定元素 步骤: 3. 使用 Monkey Appium 控制特定界面点击 4. 如何结合 Appium 与 Monkey 5. 限制 Monkey 只点击固定界面上的元素 使用 --pc…...
智能指针【C++11】
文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针,auto_ptr通过管理权转移的方式解决智能指针的拷贝问题,保证一个资源…...
plsql 执行存储过程 SYS_REFCURSOR
关键字:plsql 执行存储过程 SYS_REFCURSOR 在PL/SQL中,SYS_REFCURSOR是一种特殊的数据类型,用于表示引用游标,可以用来返回查询结果或者操作数据库中的结果集。 以下是一个使用SYS_REFCURSOR执行存储过程的例子: CR…...
git修改某次commit(白痴版)
第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…...
设计模式:19、桥接模式
目录 0、定义 1、桥接模式的四种角色 2、桥接模式的UML类图 3、示例代码 0、定义 将抽象部门与实现部分分离,使它们都可以独立地变化。 1、桥接模式的四种角色 抽象(Abstraction):一个抽象类,包含实现者…...
闭包函数的基础知识
上期文章 1. 函数装饰器 2.闭包 2.1变量作用域 python有3种变量作用域 模块全局作用域:在类或函数外部分配定义的。函数局部作用域:通过参数或者在函数主体中定义的。第3种作用域:闭包中的变量环境 2.2全局变量和局部变量 def fun(a):print(a)print(b)fun(10)10---------…...
python3D圣诞树
import pygame import math from pygame.locals import *# 初始化Pygame pygame.init()# 设置屏幕尺寸和标题 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(3D 圣诞树)# 设置颜色 GREEN (34, 139, 34) BROWN (139,…...
博物馆导览系统方案(一)背景需求分析与核心技术实现
维小帮提供多个场所的室内外导航导览方案,如需获取博物馆导览系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花! 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中,博物馆作为文化传承和知…...
[代码随想录09]字符串2的总结
前言 处理字符串主要是有思路,同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣(LeetCode) 55. 右旋字符串(第八期模拟笔试) 一、翻转字符串里的单词 这个题目的主要思路,代码采用从后往前遍历字…...
C语言程序设计P5-3【应用函数进行程序设计 | 第三节】——知识要点:函数的嵌套调用和递归调用
知识要点:函数的嵌套调用和递归调用 视频 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求用递归法求 n!。 我们知道n!n(n-1)(n-2)……1n(n-1)!递归公式为: 1.上面公式分解为n!n(n-1)!,即将求n!的问题变为…...
【Java】protobuf-maven-plugin主动下载protoc编译proto文件
背景: 我们hadoop的代码里,配置的是3.7.1的protocol buffer,但是编译环境上安装的是2.5.0。 能成功编译,且没有什么兼容性问题。这里非常好奇发生了什么,于是研究了一下protobuf-maven-plugin插件, 发现是他去下载的 在使用protobuf-maven-plugin插件时,我们一般会这么…...
Go学习:变量
目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息,变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中,变量名的命名规则 与其他编程语言一样,都是由字母、数…...
AllegroHand 四指灵巧手:机器人领域的创新力量
Allegro Hand 作为一款高性价比且适应性强的机器人四指灵巧手,凭借其四根手指和十六个独立的电流控制接头,成为机器人复杂抓握、柔性操作以及触觉传感器等研究领域的理想之选。 Allegrohand 四指灵巧手技术特点 机械结构 Allegro Hand的机械结构设计高…...
蓝桥杯准备训练(lesson3 ,c++)
变量与常量 4.1 变量的创建4.2 变量初始化4.3 变量的分类4.4 常量4.4.1 字⾯常量4.4.2 #define定义常量4.4.3 const定义常量4.5 练习练习1:买票练习2:AB问题练习3:鸡兔同笼 4.1 变量的创建 了解清楚了类型,我们使⽤类型做什么呢&…...
Conda + JuiceFS :增强 AI 开发环境共享能力
Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方面仍存在一些挑战。比如,在不同机器上复用相…...
小红薯x-s算法最新补环境教程12-06更新(下)
在上一篇文章中已经讲了如何去定位x-s生成的位置,本篇文章就直接开始撸代码吧 如果没看过的话可以看:小红薯最新x-s算法分析12-06(x-s 56)(上)-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...
强化ASPICE合规与认可度:关键策略与实践路径
确保ASPICE(Automotive SPICE)标准的合规性和认可度,是一个涉及多方面努力和持续改进的过程。以下是一些关键步骤和建议,以帮助企业实现这一目标: 一、熟悉ASPICE标准 深入阅读和理解:首先,需要…...
没有合理使用线程池,引发的生产环境BUG
引言 随着多线程和并发处理需求的增加,线程池成为了提升系统性能的重要工具。Java 提供了强大的 ThreadPoolExecutor 类,能够高效地管理线程池,减少线程创建和销毁的开销。然而,当线程池达到其最大容量时,如何优雅地处…...
异步处理与后台任务管理:在 FastAPI 中实现高级特性
异步处理与后台任务管理:在 FastAPI 中实现高级特性 目录 ⚡ 背景任务与异步处理概述🛠️ 使用 BackgroundTasks 执行后台任务🚀 异步视图函数:使用 async 和 await🔄 处理并发任务:提升应用性能与响应能…...
ceph存储池
1、存储池 1、存储池的概念 存储池就是ceph的逻辑分区,专门用来存储对象的 特点 将文件切片成对象,通过hash算法,找到存储池中的pg,池中的pg根据crush算法找到osd节点 存储中的PG数量对性能有重要的影响,过多和过少…...
STM32基于HAL库的串口接收中断触发机制和适用场景
1. HAL_UART_Receive_DMA函数 基本功能 作用:启动一个固定长度的 DMA 数据接收。特点: 需要预先指定接收数据的长度(Size 参数)。DMA 会一直工作直到接收到指定数量的数据,接收完成后触发 HAL_UART_RxCpltCallback 回…...
如何查看电脑的屏幕刷新率?
1、按一下键盘的 win i 键,打开如下界面,选择【系统】: 2、选择【屏幕】-【高级显示设置】 如下位置,显示屏幕的刷新率:60Hz 如果可以更改,则选择更高的刷新率,有助于电脑使用起来界面更加流…...
Q3收入回退,盈利与商业化落地步履艰难,文远知行亟待背水一战
撰稿|行星 来源|贝多财经 12月2日,全球商业杂志《Fortune》(财富)揭晓了2024年“未来50强”(The Future 50)企业榜单,上市不久的全球Rbotaxi第一股文远知行(NASDAQ:WRD)位列第26名…...
如何利用Java爬虫获得商品类目
在当今数字化时代,数据已成为企业最宝贵的资产之一。获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场…...
Charts 教程:创建交互式图表的基础
ECharts 是一个开源的、基于 JavaScript 的数据可视化库,它可以帮助你快速创建交互式的图表。无论是简单的柱状图、折线图,还是复杂的地图和关系图,ECharts 都能够轻松应对。本文将带你了解如何在你的网页中使用 ECharts 创建图表,…...
Jackson - JsonGenerator创建JSON、JsonParser解析JSON
以下是关于如何使用Jackson的JsonGenerator类来创建JSON内容以及如何使用JsonParser类来读取JSON内容的教程。 依赖项 首先,在pom.xml文件中添加以下依赖项以引入Jackson库: <dependency><groupId>com.fasterxml.jackson.core</groupI…...
数据结构与算法——1202—排序递归
1、选择排序 #include<iostream> #include<vector> using namespace std;void SelectSort(vector<int>& nums) {int i;int j;int minIndex;int length nums.size();if (length 0 || length 1) return;for (i 0; i < length-1; i)//遍历所有元素{…...
Lattice Radiant Software Lattice Propel Builder Lattice Propel 2024.1 安装
因项目需要,对Lattice 器件LIFCL-40 CrossLink进行评估 先从Lattice官网下载Radiant安装包: Lattice Radiant设计软件 新建工程环境...
【Linux系统】 Linux内核与UNIX设计哲学的结合
Linux 内核虽然不是 UNIX 的直接衍生物,但它深受 UNIX 设计哲学的影响。Linux 的开发者,尤其是 Linus Torvalds,在设计和实现 Linux 时,借鉴了 UNIX 的核心思想,使 Linux 成为一个类 UNIX 系统。 以下从 UNIX 设计哲学…...
MKS EDGE Series RF Generators Power Solution 软件
MKS EDGE Series RF Generators Power Solution 软件...
【机器学习 | 基于Lasso回归和随机森林的上海链家二手房房价预测】
文章目录 🏳️🌈 1. 导入模块🏳️🌈 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 去除缺失数据2.5 面积、价格、单价、楼层、建筑时间数据提取2.6 朝向数据处理 🏳️🌈 3. 特…...
MyBatis-Plus分页查询方式
分页查询基本方式 SpringBootTest(classes LearningApplication.class) public class MPTest {AutowiredILearningLessonService lessonService;Testpublic void test(){/*** Page<LearningLesson>:MyBatisPlus提供的分页对象* 1:当前页数* 2&am…...
分布式cap
P(分区安全)都能保证,就是在C(强一致)和A(性能)之间做取舍。 (即立马做主从同步,还是先返回写入结果等会再做主从同步。类似的还有,缓存和db之间的同步。&am…...
【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。
文章目录 前言一、简单版Tabs代码实现: 二、下划线带动画的TabsAPI回顾:代码实现: 三、内容区域滑动切换切换动画代码实现:(2)禁用手势滑动切换(3)内容区域换为插槽 四、标签栏可滚动…...
AI在SEO中的应用与关键词优化探讨
内容概要 在当今数字化时代,人工智能(AI)技术为搜索引擎优化(SEO)带来了革命性的改变。传统的SEO主要依赖于人为的经验和判断,而AI则通过算法分析海量数据,提供更加精准和高效的方式优化关键词…...
JUC:Synchronized和锁升级
1. 面试题 谈谈你对Synchronized的理解Sychronized的锁升级你聊聊Synchronized实现原理,monitor对象什么时候生成的?知道monitor的monitorenter和monitorexit这两个是怎么保证同步的嘛?或者说这两个操作计算机底层是如何执行的偏向锁和轻量级…...
如何使用锁实现多进程和多线程的并发执行的安全
多进程和多线程的并发: 多进程和多线程的并发意思是在同一段时间内,多个进程或者线程一起执行,但是这些进程或者线程的执行并不是真正意义上在同一时刻执行,而是在不同的时间里执行,因为每个CPU在同一时间只能处理同一…...
LabVIEW如何用运动控制卡实现伺服电机的转矩控制?
在LabVIEW中,使用运动控制卡实现伺服电机的转矩控制,通常通过以下几个步骤来完成。这里将结合LabVIEW的运动控制功能和伺服电机控制的基本原理进行详细介绍。 1. 选择合适的运动控制卡 要实现伺服电机的转矩控制,首先需要一张支持伺服电…...
SQL面试题——百度SQL面试题 无效搜索
百度SQL面试题 无效搜索 今天的题目是来自百度的SQL 面试题目 现有一份用户搜索日志,包含用户ID,时间,用户搜索内容。定义 无效搜索:如果用户下一次搜索内容中包含本次搜索内容,则认为本次搜索为无效搜索。请查询用户无效搜索记录 +---------+---------------------+--…...