草庐IT

【蓝桥杯Web】第十四届蓝桥杯Web模拟赛 3 期 | 精品题解(上)

海底烧烤店ai 2023-04-13 原文


🧑‍💼 个人简介:一个不甘平庸的平凡人🍬
🖥️ 蓝桥杯专栏:蓝桥杯题解/感悟
🖥️ TS知识总结:十万字TS知识点总结
👉 你的一键三连是我更新的最大动力❤️!
📢 欢迎私信博主加入前端交流群🌹


📑 目录


🔽 前言

好久没更新了,今天上线收到了很多小伙伴的私信,发现有很多朋友正在准备蓝桥杯,问我要不要出几天前开放的模拟赛 3 期的解析,其实这一期的模拟赛刚开始时我就知道了,但根据以往CSDN平台的限制以及我确实没想到会有这么多人想看,于是就没第一时间出。

看到了大家的催更后,我想着就发一下试试吧,希望能顺利发出,话不多说,开干!

由于篇幅有限,这次题解将分为上下两篇,这一篇先讲本科组的前八题,下一篇中我们再讲本科组的最后两题和职业院校组中和本科组不一样的题。

1️⃣ 网页PPT

使用简单的JQuery就能实习:

function switchPage() {
  // TODO: 请补充该函数,实现根据activeIndex切换页面的功能,并且在到达最后一页或第一页时给相应的按钮添加disable类
  // 1. 设置指定页面显示
  $("section").each((index, item) => {
    $(item).css("display", index !== activeIndex ? "none" : "block");
  });
  // 2. 修改页码
  $(".controls .page").text(`${activeIndex + 1} / 5`);
  // 3. 根据情况修改按钮的class
  if (activeIndex === 0) {
    $(".btn.left").addClass("disable");
  } else if (activeIndex === sectionsCount - 1) {
    $(".btn.right").addClass("disable");
  } else {
    $(".btn.left").removeClass("disable");
    $(".btn.right").removeClass("disable");
  }
}

2️⃣ 西游记之西天取经

考察CSS3动画属性,题目中说动画只动一次就会停下来,这明显是没有设置动画的animation-iteration-count(动画执行次数)导致的,所以想要让动画无限循环起来,只需要为每个animation复合属性添加infinite(无限循环)即可:

/* TODO 填空 */
animation: a3 0.8s steps(8) infinite ; 

3️⃣ 商品销量和销售额实时展示看板

考查echarts的基础使用,挺简单的,直接上代码:

// TODO:补全 `yAxis` 的设置,要求“销售额”(即,配置项 `name`)的位置(即,配置项 `position`)在图表的左侧,“销量”(即,配置项 `name`)的位置(即,配置项 `position`)在图表的右侧。
yAxis: [{
    type: 'value',
    name: '销售额',
    position: 'left',
},
{
    type: 'value',
    name: '销量',
    position: 'right',
}],

// TODO:补全代码,正确给 X 轴的时间,以及 Y 轴的商品的销售额 saleObj 和销量赋值 countObj。
charData.xAxis.data = Object.keys(result.data.countObj); // 获得由全部key组成的数组
charData.series[0].data = Object.values(result.data.saleObj); // 获得由全部value组成的数组
charData.series[1].data = Object.values(result.data.countObj);

4️⃣ 蓝桥校园一卡通

考察一些简单的正则与表单验证,这里我封装了一个validate函数专门用来验证输入与控制DOM

submit.onclick = () => {
  // TODO 待补充代码
  /**
   * 用于验证输入并控制相关DOM操作
   * @param {RegExp} reg 用于检验文本的正则
   * @param {Element} inputNode input元素
   * @param {String} parentNodeClass 需要给父节点添加的类名
   * @param {String} errorNodeId 错误信息节点的id
   * @return {*}
   */
  function validate(reg, inputNode, parentClass, errorId) {
    const parentElement = inputNode.parentElement // 获取父元素
    const errorElement = parentElement.querySelector('#' + errorId) // 获取错误信息元素
    let result = false // 是否通过验证
    if (!reg.test(inputNode.value)) {
      // 输入不匹配
      parentElement.classList.add(parentClass) // 给父节点添加class
      errorElement.style.display = 'block' // 显示错误信息
    } else {
      // 输入匹配
      parentElement.classList.remove(parentClass) // 移除父节点class
      errorElement.style.display = 'none' // 隐藏错误信息
      result = true
    }
    return result
  }
  // 姓名
  let regName = /^[\u4e00-\u9fa5]{2,4}$/g
  const nameVail = validate(regName, studentName, 'has-error', 'vail_name')
  if (!nameVail) {
    return
  }
  // 学号
  let regStuId = /^\d{1,12}$/g
  const stuIdVail = validate(regStuId, studentId, 'has-error', 'vail_studentId')
  if (!stuIdVail) {
    return
  }

  item[0].innerHTML = studentName.value
  item[1].innerHTML = studentId.value
  item[2].innerHTML = college.value

  // 添加 showCard 类显示放大一卡通的动画,请勿删除
  cardStyle.classList.add('showCard')
}

5️⃣ 会员权益领取中心

每次蓝桥杯的题中都会有一道这种仿页面的题,没啥技术含量,就是纯体力活,这里就不贴代码了。大家在考试的时候切记不要浪费太多时间在这道题上,很容易吃力不讨好。

6️⃣ 心愿便利贴

这题主要考察了element-ui表单验证,根据代码中的提示发现有两处需要修改。

一是,题中给出的代码中v-for遍历的是一个空数组v-for="(item,index) in []" ,我们需要找到存放数据的数据来替换这个空数组,翻到下面的提交方法onSubmit中很容易发现数据存放在wishList中,所以:

<!-- TODO 待修改的代码 -->
<div class="card" :class="item.css" v-for="(item,index) in wishList" ...

二是,需要补充rules中的验证规则:

rules: {
	// TODO 待补充验证的代码
	name: [
		{ required: true, message: '请输入姓名', trigger: 'blur' },
		{ min: 2, max: 4, message: '长度在 2 到 4 个字符', trigger: 'blur' }
	],
	content: [
		{ required: true, message: '请输入许愿内容', trigger: 'blur' },
		{ min: 1, max: 30, message: '长度在 1 到 30 个字符', trigger: 'blur' }
	],
},

每条规则的key对应的是el-form-item上的prop属性,根据题目的示例,这两天规则很容易写出,这里就不多说了。

7️⃣ 消失的 Token

考察Vuex的使用,题目中明确说了:“仔细阅读 store 文件夹下的相关代码并结合 Vuex 相关知识,排查代码中存在的问题”。

所以我们应该先去看一下Vuex相关的代码,在UserModule.js中会发现UserModule这个模块开启了命名空间:

UserModule.js

const UserModule = {
    namespaced: true, // 开启了命名空间
    ...

index.js中是通过user字段来引入UserModule的:
index.js

const store = new Vuex.Store({
    modules: {
        base: BaseModule,
        user: UserModule, // 注意
    },
})

所以在使用UserModule模块的内容时就需要注意要通过命名空间user来引用,之后检查index.html就很容易发现问题所在了:

// TODO 修改下面错误代码
var app = new Vue({
  el: '#app',
  data() {},
  computed: {
    welcome() {
      return store.getters.welcome
    },
    username() {
      return store.getters['user/username'] // 修改处:通过命名空间引用
    },
    token() {
      return store.getters['user/token'] // 修改处:通过命名空间引用
    }
  },
  methods: {
    // 回车/点击确认的回调事件
    login(username) {
      // 修改处:通过命名空间引用
      username && store.commit('user/login', { username, token: 'sxgWKnLADfS8hUxbiMWyb' })
      username && store.commit('say', '登录成功,欢迎你回来!')
    }
  }
})

8️⃣ 封装 Promisefy 函数

考查了promise的使用,在题中我们很容易发现promisefy有以下几个需求:

  1. 需要返回一个函数,并且返回的这个函数还需要返回一个promise
  2. promisefy接收的fn参数是个函数,它最后一个参数是个回调函数,回调函数的第一个参数代表 err 信息,第二个参数代表成功返回的结果。

代码:

const promisefy = (fn) => {
  // TODO 此处完成该函数的封装
  return (...arg) => { // 使用剩余参数arg收集所传递的实参
    return new Promise((resolve, reject) => {
      // 将arg解构传递给fn
      fn(...arg, (err, contrast) => {
        if (err) {
          // err存在代表fn运行出错了,调用reject将promise的状态转换为rejected并传递err,此时该promise的catch方法将捕捉到该err错误
          reject(err)
        }
        // 如果代码运行到这说明没出错,调用resolve将promise的状态转换为fulfilled并传递contrast,此时该promise的then方法将捕捉到该contrast信息
        resolve(contrast)
      })
    })
  }
}

上面代码也挺简单的,需要注意的一点就是promise的状态一旦改变就不能再次改变了,所以上面代码中如果先调用了reject,则后面的resolve调用就不再起作用了,所以在if语句中不需要加return来阻断后续代码的执行。

🔼 结语

距离第十四届蓝桥杯的正式比赛还有不到一个月的时间,好好复习,祝大家都能在正式比赛中取得满意的成绩!

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

有关【蓝桥杯Web】第十四届蓝桥杯Web模拟赛 3 期 | 精品题解(上)的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  3. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  4. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  5. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  6. ruby-on-rails - rspec 模拟对象属性赋值 - 2

    我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat

  7. ruby - 如何使用 rspec stub /模拟对命令行的调用? - 2

    我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy

  8. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  9. 适用于Web开发的Python还是Ruby? - 2

    Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML

  10. ruby - 接收 block 作为参数的模拟方法 - 2

    我有一个或多或少这样的场景classAdefinitialize(&block)b=B.new(&block)endend我正在对A类进行单元测试,我想知道B#new是否正在接收传递给A#new的block。我使用Mocha作为模拟框架。这可能吗? 最佳答案 我用Mocha和RSpec都试过了,虽然我可以通过测试,但行为不正确。从我的实验中,我得出结论,验证block是否已通过是不可能的。问题:为什么要传递一个block作为参数?block将用于什么目的?什么时候调用?也许这确实是您应该用类似的东西测试的行为:classBlockP

随机推荐