【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组 | 精品题解

news2025/7/5 6:56:18

在这里插入图片描述


📑 目录

  • 🔽 前言
  • 1️⃣ 数据类型检测
  • 2️⃣ 渐变色背景生成器
  • 3️⃣ 水果叠叠乐
  • 4️⃣ element-ui 组件二次封装
  • 5️⃣ http 模块应用
  • 6️⃣ 新课上线啦
  • 7️⃣ 成语学习
  • 8️⃣ 学海无涯
  • 9️⃣ 逃离二向箔
  • 🔟 梅楼封的一天
  • 🔼 结语


🔽 前言

在这里插入图片描述
新一期的蓝桥杯大赛开始报名已经有一段时间了,最近博主的粉丝朋友们有很多都已经在积极备考了,也有很多朋友私信我说让我多发发题解,于是我就去蓝桥杯官网碰碰运气,看能不能找到好的题目(因为今年是蓝桥杯开放Web应用开发方向的第二年,官网上的备赛题目比较少),正巧发现蓝桥杯正在举行线上模拟赛,我便花了一些时间做题、总结、写作,于是这篇文章就诞生了。

如标题所见,这是 Web 应用开发模拟赛 1 期大学组 的题解,关于蓝桥杯更多的题解博主会在之后的文章中陆续更新,欢迎大家关注订阅!

话不多说,开撕!

本篇只会大概提出题目要求,关于题目的更多细节可自行去模拟赛主页查询:Web 应用开发模拟赛 1 期大学组

1️⃣ 数据类型检测

这一题大致的意思就是写一个能够判断参数数据类型的函数,咋一看感觉非常的简单,可再仔细一看题目要求,足足需要判断14种类型!如果你的基础知识不牢固是有很大机率通不过这题的,从题目的通过率就可以看出:

在这里插入图片描述

作为第一题,虽然只有5分,并且挑战人数是10道题中最多的,但通过率确是10道题中最低的,这恰恰反应了大家的基础核心知识不牢固,所以还是简易大家多补补基础核心知识。

要求:

在这里插入图片描述

虽然有14种类型需要判断,但其实只需要一行代码就能通过这题:

/**
 * @description: 数据类型检测
 * @param {*} data 传入的待检测数据
 * @return {*} 返回数据类型
 */
function getType(data) {
  // TODO:待补充代码
 return Object.prototype.toString.call(data).slice(8,-1)
}

JavaScript中判断数据类型主要有以下几种方式:

  • typeof 可以用来区分除了null类型以外的原始数据类型undefinednumberstringsymbolboolean)和对象类型中的函数,针对其它类型时typeof一律返回object类型。

  • instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上,所以它不能用来判断原始数据类型的数据

    并且instanceof的结果并不一定是可靠,因为在ES7的规范中可以通过自定义Symbol.hasInstance方法来覆盖insanceof的默认行为

  • Object.prototype.toString.call 能够满足大部分场景下的需求,但它无法区分数字类型和数字对象类型(同理还有字符串类型和字符串对象类型等,)

    Object.prototype.toString.call(2).slice(8,-1) // "Number"
    // new Number(2)实际是一个数字对象类型
    Object.prototype.toString.call(new Number(2)).slice(8,-1) // "Number"
    

    ES7规范中可以使用Symbol.toStringTag自定义Object.prototype.toString方法的行为,所以该方法判断数据类型也不一定是完全可靠的。

  • Array.isArray 用来判断是否是数组

所以这题对于知道Object.prototype.toString.call方法的同学来说,几乎就是秒解!

2️⃣ 渐变色背景生成器

这题所实现的渐变色背景生成器还是非常有意思的,推荐大家去看一下它完整的源码(代码非常少):

在这里插入图片描述

主要考察的就是通过JavaScript来修改自定义的 CSS 变量,题中主要的代码如下(并不是全部代码,不需要我们了解与实现的代码这里就没有贴出,原题可自行查阅蓝桥官网)

HTML:

 <div class="controls">
   <input id="color1" type="color" name="color1" value="#00dbde" />
   <input id="color2" type="color" name="color2" value="#fc00ff" />
 </div>

CSS:

/* 注意这里定义的 CSS 变量,它们会用于生成渐变色背景 */
:root {
  --color1: #00dbde;
  --color2: #fc00ff;
}
const inputs = document.querySelectorAll(".controls input");

/**
 * 上面已经选取了两个取色器
 * 请添加相应的 JS 事件处理函数并绑定到合适的事件监听器上(提示:change 事件)
 * 这样我们就可以用取色器选取颜色来生成下方的渐变色背景啦
 *  */

 inputs.forEach((item)=>{
    item.addEventListener("change",function (e) {
        document.querySelector("html").style.setProperty(`--${e.target.id}`, e.target.value);
    })
 })

遍历获取到的两个取色盘元素(input.color),分别对其添加change事件,然后通过document.querySelector("html").style.setProperty方法修改html元素(根元素,也即是:root)上css变量的值即可。

这一题题目参考信息中给出了如何使用CSS变量的介绍,根据这个提示来做这题还是非常简单的。

3️⃣ 水果叠叠乐

这简直就是简易般的羊了个羊:

在这里插入图片描述

这一题有个坑,就是点击元素时是需要将这个被点击的元素克隆一份添加到下方的栏中,而不是直接将被点击的元素移动到下方的栏中。

具体实现代码如下

HTML:

<ul id="card">
  <li data-id="1" id="fruit-one">
    <img src="./images/pineapple.svg" alt="" />
  </li>
  <!-- 多个li... -->
</ul>
<!-- 图片位置 -->
<!-- 卡槽位置 -->
<div class="fixed">
  <div class="gradient-border" id="box"></div>
</div>

JavaScript:

$("#card li").on("click", function (e) {
  // TODO: 待补充代码
  if($("#box li").length===7) return;

  // 向box中添加当前点击元素的克隆
  $("#box").append($(this).clone());
  // 隐藏当前点击元素
  $(this).hide();
 
  // 找到与当前点击元素类别一样的其它所有元素
  const list=$(`#box li[data-id=${this.getAttribute('data-id')}]`);

  if (list.length>=3) {
    // each是jQuery遍历元素的方法
    list.each((i,item)=>{
      // 移除元素
      item.remove()
    })
  }
});

我们知道DOM的事件处理函数中的this指的是触发事件的DOM元素,我这里使用$()包裹this$(this))的目的是使this变成JQ对象,从而能够使用jQuery提供的方法,如clone克隆元素。

4️⃣ element-ui 组件二次封装

在这里插入图片描述

需要封装element-ui 的表格组件,实现点击表格组件左侧radio时选中该行,题目要求说了一大堆,其实实际实现只需修改两行代码就行:

<!-- TODO:完善单选按钮组件,实现需求(DOM 结构不能修改) -->
<template slot-scope="scope">
   <el-radio v-model="currentRow" :label="scope.$index">&nbsp;</el-radio>
</template>

5️⃣ http 模块应用

要求就是使用原生http模块,搭建起来一个简单的Node服务器,并返回 “hello world” ,考察的就是基础的原生知识,如果你对Node还不了解,可以订阅我的
Node.js从入门到精通专栏(私信进群能够享返现活动)。

// TODO: 待补充代码
const http = require("http");

const app = http.createServer();

app.on("request",function (req,res) {
    res.end("hello world")
})

app.listen(8080)

6️⃣ 新课上线啦

就是按照官方给的最终效果图,去实现下面这个页面:

在这里插入图片描述

没啥技术含量,全靠堆HTML和CSS,这里就不放代码了。

但这个题是我认为是整场模拟赛里最坑人的题,特别废时间,我建议这个题要么放到最后再写(因为完成度50%以上就能得到分,其它题不行),要么完成差不多后就直接去做下面的题,别死扣细节,不然吃亏的都是你!

7️⃣ 成语学习

这个题也是非常的有意思,不过需要我们写的代码并不多,大多都是官方已经给出了。

在这里插入图片描述

//TODO 点击文字后,在idiom从左到右第一个空的位置加上改文字
getSingleWord(val) {
  for (let i = 0; i < this.idiom.length; i++) {
    if (!this.idiom[i]) {
      this.idiom[i] = val
      this.$set(this.idiom, i, val)
      return
    }
  }
}

// TODO 校验成语是否输入正确答案
// 猜中成语 result 为 true;
// 猜错成语 result 为 false;
// 例1:tip=‘形容非常感激或高兴’,idiom=["热","泪","盈","眶"],则result返回true
// 例2:tip=‘形容非常感激或高兴’,idiom=["泪","眼","盈","眶"],则result返回false
// 例3:tip=‘在繁忙中抽出空闲来’,idiom=["忙","里","偷","闲"],则result返回true
confirm() {
  const target = this.arr.find(item => item.tip === this.tip);
  if (target.word === this.idiom.join('')) {
      this.result = true
  }else {
      this.result = false
  }
}

这里使用的是vue2,需要注意的一点就是当我们直接修改data里的数组中的元素时,视图并不会响应式更新,如果你了解vue2的响应式原理,应该明白这是vue2响应式的一个缺陷所在,我们必须使用$set来修改触发从而引发视图更新。

其实题中原有的代码已经显示了这一点,如clear函数:

clear(i) {
  this.idiom[i] = ""
  this.$set(this.idiom, i, "")
},

8️⃣ 学海无涯

这一题稍微有点复杂,但只要自己理清楚思路,还是能够做出来的,先看一下效果:

在这里插入图片描述

题中使用了Echarts,了解Echarts的朋友知道 Echarts 的表格有x轴和y轴的数据(都是数组形式),所以我们知道只要将题中给我们的数据转换成对应的格式就行了。

复杂的地方在于数据处理,原数据如下:

"data": {
 "2月": [
   30, 40, 30, 20, 10, 20, 30, 69, 86, 12, 32, 12, 23, 40, 50, 61, 39, 28,
   20, 35, 20, 38, 43, 52, 30, 39, 52, 70
 ],
 "3月": [
   36, 48, 52, 30, 39, 52, 20, 18, 25, 33, 21, 36, 44, 63, 32, 89, 98, 23,
   25, 36, 29, 31, 42, 23, 45, 56, 98, 83, 25, 28, 48
 ]
}

我的思路就是将原数据转换成两个对象,一个代表周的x轴y轴数据,一个代表月的x轴y轴数据,所以两个对象的结构是一模一样,转成后的两个对象如下:

// 周数据
weekData = {
  x: ['2月第1周', '2月第2周', '2月第3周', '2月第4周', '3月第1周', '3月第2周', '3月第3周', '3月第4周', '3月第5周'],
  y: [180, 274, 253, 324, 277, 240, 332, 378, 101]
}
// 月数据
monthData = {
  x: ['2月', '3月'],
  y: [1031, 1328]
}

现在我们根据代码来一点点了解我是如何转换的:

// TODO:待补充代码
let weekData ={
  x:[],
  y:[]
}, monthData ={
  x:[],
  y:[]
}

// 定义一个函数:用来修改option对象并重置Echarts图标
function mySetOption(data) {
  // 修改x轴数据
  option.xAxis.data = data.x;
  // 修改y轴数据
  option.series[0].data = data.y;
  // 重置图表
  myChart.setOption(option);
}

// 添加点击事件
document.querySelector(".tabs").addEventListener("click",function (e) {
  if (e.target.id==="week") {
    mySetOption(weekData)
  }else if(e.target.id==="month") {
    mySetOption(monthData)
  }
})

// 获取数据
axios.get('./data.json').then(res=>{
  const data = res.data.data

  for (const key in data) {
  	// weekCount代表一周数据的和,monthCount代表一月数据的和,weekNum代表第几周
    let weekCount = monthCount =0,
        weekNum = 1;
        
    for (let i = 0; i < data[key].length; i++) {
      // 数据累加
      weekCount += data[key][i];
      monthCount += data[key][i];
      
      // 每一周的最后一天或不足一周的最后一天进行push数据
      if ((i+1) % 7 === 0 || ((data[key].length - i <= 7) && (i === data[key].length - 1))) {
        weekData.x.push(`${key}${weekNum++}`)
        weekData.y.push(weekCount)
        // 重置周数据的和为0
        weekCount = 0
      }
    }
    monthData.x.push(key)
    monthData.y.push(monthCount)
  }
  // 获取到数据后调用一次mySetOption重置图表
  mySetOption(weekData)
})

代码不算难,相信大家根据代码里的注释都能够理解,着重说一下上面我使用的 if 表达式:

(i+1) % 7 === 0 || ((data[key].length - i <= 7) && (i === data[key].length - 1))

要明白我们求每一周的总数居时需要在第二周开始前将weekCount归零,我选择了在每周的最后一天(且已经push了数据)重置weekCount,而不是在每周的第一天(计算数据之前)重置weekCount,是因为我感觉这样做判断比较好写。

首先(i+1) % 7 === 0判断了是每星期的最后一天,如:第一周的星期日,在数组中下标为6,加上1对7取余就得0。

((data[key].length - i <= 7) && (i === data[key].length - 1)data[key].length - i <= 7代表剩余的数据不足7条,i === data[key].length - 1代表到了数组最后一项。之所以做这么一个判断,是为了适配天数不是7的倍数的情况,如3月31天,计算完前4周的数据后剩余3天的数据(31-4x7),这3天也要求和作为第5周的数据,所以需要在最后一天结算这三天。

9️⃣ 逃离二向箔

这个题目很有意思,让我瞬间想起了三体宇宙,顿时感觉这题不简单,结果还正如我所想,题中考察的是promise以及JavaScript中的事件执行机制(先执行同步代码再执行异步代码),对于promise,相信大多数人都会比较头疼,这一题考察的角度也比较刁钻,让我们一起来看一看吧!

题目的大致要求就是有一个数组,里面存放了很多需要发射的飞船(一个返回promise对象的函数),然后给了我们一个最大数量,我们只能一次性发送这个最大数量的飞船,当有一个飞船发射成功(promise执行结束),我们才能继续发射下一个飞船。

在这里插入图片描述
完整代码:

// 使用 promise 模拟请求 + 3000ms后完成得到发射后结果
function createRequest(i) {
  return function () {
    return new Promise((resolve, reject) => {
      const start = Date.now();
      setTimeout(() => {
        if (Math.random() >= 0.05) {
          resolve(
            `${i + 1}艘曲率飞船达到光速,成功逃离,用时${Date.now() - start}`
          );
        } else {
          reject(
            `${i + 1}艘曲率飞船出现故障,无法达到光速,用时${
              Date.now() - start
            }`
          );
        }
      }, 3000 + i * 100);
    });
  };
}

class RequestControl {
  constructor({ max, el }) {
    this.max = max;
    this.requestQueue = [];
    this.el = document.querySelector(el);
    setTimeout(() => {
      this.requestQueue.length > 0 && this.run();
    });
    this.startTime = Date.now();
  }
  addRequest(request) {
    this.requestQueue.push(request);
  }
  run() {
    // TODO:待补充代码
    // promiseI代表已经发送飞船的数量,只要一有飞船发射(promise执行)promiseI就加一
    let promiseI = 0
    // 先遍历执行max数量的promise
    for(let i = 0;i < this.max;i++) {
      this.requestQueue[i]().then(res=>{
        this.render(res)
        // 执行成功代表发射飞船成功,这时就调用sentNext执行下一个未执行的promise
        sentNext()
      }).catch(res=>{
        // 到了catch代表执行失败,但这也算是执行完成了,所以也需要调用sentNext
        this.render(res)
        sentNext()
      })
      promiseI++;
    }
    // 定义一个发送下一个未发送飞船的函数
    const sentNext = ()=> {
      // promiseI大于等于总数量时,代表全部飞船都已经发射出去,就不需要执行下面的了,直接return
      if (promiseI >= this.requestQueue.length) return;
      this.requestQueue[promiseI]().then(res=>{
        this.render(res)
        // 执行完成就递归调用
        sentNext()
      }).catch(res=>{
        this.render(res)
        sentNext()
      })
      promiseI++;
    }
  }
  render(context) {
    const childNode = document.createElement("li");
    childNode.innerText = context;
    this.el.appendChild(childNode);
  }
}

let requestControl = new RequestControl({ max: 10, el: "#app" });
  for (let i = 0; i < 25; i++) {
    const request = createRequest(i);
    requestControl.addRequest(request);
  }


module.exports = {
  requestControl,
};

我这里定义了一个变量promiseI存储已经执行过的promise的数量,同时能直接将promiseI当作requestQueue数组的下标,以此来调用requestQueue数组中下一个未被执行的promise,这里大家可以好好理解一下。

需要注意的一点就是this.requestQueue[promiseI]函数的调用是同步代码(这个函数的调用代表开始发射了飞船),调用它之后返回的promise的执行才是异步代码(这个promise的执行代表飞船的发射过程promise执行完就代表飞船发射成功了),所以 promiseI++的执行永远都是在this.requestQueue[promiseI]函数执行之后,这也就是promiseI能够精确表示已发射出去飞船数量的原因。

这道题值得大家好好思考!

🔟 梅楼封的一天

要求就是实现一个脱敏函数,函数入参要求:

  • 第一个参数为字符串(任意字符串)。
  • 第二个参数为脱敏规则,可以是字符串,也可以是数组
  • 第三个参数是字符串,表示用什么来占位脱敏文字(默认为:*)。
  • 第四个参数是:是否将手机号(11 位数字)进行脱敏,默认为 true(规则是:保留前三位和后三位,中间脱敏占位)。

出参要求:

  • 第一个参数不存在返回 null

  • 第一个参数存在,第二个参数不存在,返回原字符串。

  • 第一个参数和第二个参数都存在,返回脱敏后的新字符串以及被脱敏的文本位置,返回格式是一个对象( 注意:无论手机号是否脱敏处理,都不会返回手机号的被脱敏时的位置 ),格式如下:

    {
      "ids": [],
      "newStr": ""
    }
    

这题我利用了正则和字符串的replace方法来实现,并且最有意思的一点是我使用new Array(word.length).fill(symbol).join('')来生成与违规字符相同数量(长度)的脱敏字符(*):

/**
 * @description:
 * @param {*} str
 * @param {*} rule
 * @param {*} symbol
 * @param {*} dealPhone
 * @return {*}
 */
const toDesensitization = (str, rule, symbol = "*", dealPhone = true) => {
    if(!str) return null;
    if (str && !rule) return str;

    const obj = {
        ids: [],
        newStr: str
    }

    // 定义一个获取新字符串的方法
    function getNewStr(ru) {
        // 生成正则,注意要带上'g'表示全局匹配,这样它就能配合字符串的replace方法运用
        const reg = new RegExp(ru,'g');

        obj.newStr = obj.newStr.replace(reg,function (word,index) {
            // word代表匹配到的字符,index代表出现的位置
            obj.ids.push(index);
            // new Array(word.length)生成word.length长度的数组,再fill(symbol)代表将数组内的元素全部设置为symbol的值,再调用join转换为字符串
            return new Array(word.length).fill(symbol).join('')
        })
    }

    if (Array.isArray(rule)) {
        // 如果rule是数组,则遍历
        for (const ru of rule) {
            getNewStr(ru)
        }
    }else {
        getNewStr(rule)
    }

    if (dealPhone) {
        // 因为题目要求手机号是11位数字且测试用例比较简单,我这里就直接使用11位的数字代表
        // 如果题目要求比较严格,可以将reg替换为严格的匹配手机号的正则
        const reg = /\d{11}/g

        obj.newStr = obj.newStr.replace(reg,function (word) {
            return word.slice(0,3)+new Array(5).fill(symbol).join('')+word.slice(-3)
        })
    }

    return obj
};

module.exports = toDesensitization;

整体的思路很清晰,有一点就是replace函数的第二个参数是一个函数时的用法大家可能不太清楚,这里可以查阅:MDN的说明

🔼 结语

至此,第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组的题解就结束了,这期模拟赛整体上来说并不算很难,但考察的知识点还是比较多的,特别是对基础知识的考察(相信你在做题的过程中也能察觉到),所以博主还是建议大家在做题的过程中好好总结,好好复习,祝大家都能在正式比赛中取得满意的成绩!

因为没做什么准备,只是在寝室拿起电脑随便做了一下,最终耗时257分钟,比正式比赛要求的4小时超了17分钟,但幸好最后的成绩还不错。
在这里插入图片描述
总结来说,比较耗时的题就是第6题了,大家可以注意一下,在正式比赛时做好规划。

如果本篇文章对你有所帮助,还请客官一件四连!❤️

在这里插入图片描述

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

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

相关文章

Qt编写4K/8K大分辨率播放器(8K占用1%CPU)

一、前言 在经过多种内核的洗礼以后&#xff0c;逐渐对不同内核的不同音视频文件和视频流进行大量的对比测试&#xff0c;比如测试对各种格式的支持性&#xff0c;对各种网络流的支持程度&#xff0c;在同一个地址下占用的CPU/GPU资源比对&#xff0c;最终发现播放器这块mpv优…

【数据结构】单链表(不带头结点)基本操作的实现(C语言)

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6f9;初出茅庐C语言、&#x1f6f4;数据结构 &#x1f4d5; 学习格言&#xff1a;博…

阿里巴巴任庚:数字城市建设的“两核三转和四横五纵”

阿里巴巴集团副总裁 阿里云智能中国区总裁 任庚 推进数字中国建设是党和国家制定的重要战略&#xff0c;是以数字化转型整体驱动生产方式、生活方式和治理方式的变革&#xff1b;数字城市建设是数字中国建设的重要组成部分&#xff0c;是数字中国建设的先行实践&#xff0c;准确…

【Turtle合集】火遍抖音的五款魔法阵终于被我找到了(初代萌王,童年的小樱回来了)

导语 ​ 小编在昨天看了一个非常好玩的充电器&#xff0c;就是魔法阵充电器。这种感觉&#xff0c;完全是满满的中二气 息啊。魔法阵开启&#xff01;哈哈哈&#xff08;感觉有点儿幼稚&#xff0c;但是还挺有趣的&#xff09; ​ 魔法阵一直都出现在小说、动漫、电影、电视…

MySQL-无锁读

快照 快照是一个指定时间点的数据表示&#xff0c;也就是&#xff0c;在指定时间点的数据版本&#xff0c;即使其他事务对源数据版本做出修改&#xff0c;快照对应的数据版本也不会发生变化&#xff0c;主要是用于事务隔离级别中提供一致性读。 一致性读 一致性读是指一个读…

Chrome调试工具和Emmet语法

调试工具的使用&#xff1a; 打开页面&#xff0c;鼠标"右击"检查&#xff1a; Ctrl滚轮可以放大开发工具代码的大小&#xff1a; 右边CSS样式可以改变数值&#xff08;左右箭头或者直接输入&#xff09;和查看颜色&#xff0c;以此来即时改变网页的元素设置 Ctr…

【C】语言文件操作(二)

&#x1f648;个人主页&#xff1a; 阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;越忙&#xff0c;越要沉住气&#xff01; 继【C】语言文件操作&#xff08;一&#xff09;中我们详细地介绍了文件的顺序读写等一系列函数&…

【数据结构与算法】ArrayList与顺序表

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;数据结构 ✨每日一语&#xff1a;上海就是商海&#xff0c;北京就是背景&#xff0c;誓言就是失言&#xff0c;彩礼就是财力&#xff0c;理想就是离乡&#xff0c;而平民就要拼命 ArrayList与顺序表&#x1f4a6;一.线性表…

刷题笔记之十 (小易的升级之路+找出字符串中第一个只出现一次的字符+洗牌+MP3光标位置)

目录 1.存取任意指定序号的元素和在最后进行插入和删除运算,利用顺序表存储最节省时间 2. 数据结构中具有记忆功能的是栈 3. 递归程序的优化一般为 尾递归优化 4.二叉树遍历,前中后序遍历用到的是栈,而层序遍历用到的队列 5. 将两个各有n个元素的有序表归并成一个有序表,最…

Mybatis的增删改查操作

增删改查操作对于我们程序员来说是最基本也是最重要的操作.那么在Mybatis框架下如何对jdbc中的数据进行增删改查操作? 首先,在介绍之前,我们先来了解一下我们在进行增删改查操作过程中会遇到的各种属性和重要方法: 属性 1.namespace: 称为命名空间,用来将dao与Mapper进行绑…

[Python教程]三位数倒序

前言 最近博主也是没有什么时间来写文章&#xff0c;估计已经快两个月没写新文章了吧&#xff0c;这不&#xff0c;今天有空&#xff0c;所以想着写一篇文章。 今天的文章主要是面对Python刚刚入门的读者写的 涉及知识点 数据的基本运算字符串与数字的拼接输入与打印 相信…

Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)

前言 整个文章都是以精华部分为主&#xff0c;主要分文2个部分&#xff1a; 1、python的【re】正则表达式使用方法。 2、【re】正则表达式以及对应的demo。 第一部分让你知道【re】的几个函数的区别&#xff0c;更好的匹配项目中的需求。 第二部分让你快速的匹配具体需要的正则…

学习笔记-java代码审计-表达式注入

java代码审计-表达式注入 0x01漏洞挖掘 spel spel表达式有三种用法&#xff1a; 注解 value("#{表达式}") public String arg; 这种一般是写死在代码中的&#xff0c;不是关注的重点。 xml <bean id"Bean1" class"com.test.xxx"><prop…

Jquery

目录 一、基本介绍 二、下载地址 三、基本使用 四、jQuery对象和dom对象 五、jQuery选择器 六、jQuery的DOM操作 七、总结 相关文章 JSP的使用JSP的使用 JSON&AjaxJSON&Ajax一、基本介绍jQuery 是一个快速的&#xff0c;简洁的 javaScript 库&#xff0c;使用户能更方便…

DINO学习笔记

DINO学习笔记 DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection Abstract 我们提出了DINO(DETR with Improved deNoising anchOr boxes)&#xff0c;一种先进的端到端对象检测器。DINO采用对比的去噪训练方法、混合查询选择方法进行锚点初…

【蓝桥杯专项】动态规划_背包问题合集(Java)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【蓝桥杯专项】 ✈️✈️本篇内容:动态规划_背包问题合集&#xff01; &#x1f680;&#x1f680;码云仓库gitee&#xff1a;Java数据结构代码存放! ⛵⛵作者简介…

【C++笔试强训】第二十二天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

动态内存管理

目录 内存中的栈区和堆区 malloc free calloc realloc 内存中的栈区和堆区 我们知道php的底层是C (任何语言其实都可以分为大同小异的几块) 而C语言的内存模型分为5个区&#xff1a;栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下&#xff1a; 1、栈区&…

网络:IP与MAC

如果我们要跟对方通信&#xff0c;我们需要知道对方的IP地址与MAC地址。 一、IP IP地址&#xff0c;32位&#xff0c;工作在网络层&#xff0c;属IP协议族。在互联网中逻辑的代表某一台设备&#xff0c;但是在不同的时间&#xff0c;与我合作的主机非常多。某一个设备使用完我…

2022/11/12 json格式转换对象 动态sql

PostMapping public Integer save(RequestBody User user){return userMapper.insert(user); }选择json格式。以为本人忘记选了415错误&#xff0c;media错误 mybatisx插件 sprinboot yml文件导入xml mybatis: mapper-locations: classpath:mapper/*.xml 一直报错 发现重复了…