蓝桥杯Web开发【大学组:国赛】2022年真题

1.分一分

如果给你一个数组,你能很快将它分割成指定长度的若干份吗?

1.1 题目问题

请在 js/index.js 文件中补全函数 splitArray 中的代码,最终返回按指定长度分割的数组。

具体要求如下:

  1. 将待分割的(一维)数组升序排序。
  2. 将排序后的数组从下标为 0 的元素开始,按照从 id=sliceNum 的输入框中获取到的数值去分割,并将分割好的数据存入一个新数组中。如:输入框中值为 n,将原数组按每 n 个一组分割,不足 n 个的数据为一组。
  3. 将得到的新数组返回(即 return 一个二维数组)。

例如:

var arr = [3, 1, 4, 2, 5, 6, 7];
// 分割成每 1 个一组
var newA = splitArray(arr, 1);
console.log(newA); // => [[1],[2],[3],[4],[5],[6],[7]]// 分割成每 2 个一组
newA = splitArray(arr, 2);
console.log(newA); // => [[1,2],[3,4],[5,6],[7]]// 分割成每 4 个一组
newA = splitArray(arr, 4);
console.log(newA); // => [[1,2,3,4],[5,6,7]]// 分割成每 7 个一组
newA = splitArray(arr, 7);
console.log(newA); // => [[1,2,3,4,5,6,7]]

上述仅为示例代码,判题时会随机提供数组对该函数功能进行检测。

完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。

在这里插入图片描述

1.2 题目分析

排序可以使用数组的sort方法

完成分割可以使用数组的slice方法做成切片然后push到需要返回的数组中去

1.3 题目解答

const splitArray = (oldArr, num) => {// TODO:请补充代码实现功能let newArr = []oldArr.sort((a, b) => a - b)for(let i = 0 ; i < oldArr.length; i += num){const a = oldArr.slice(i, num+i)newArr.push(a)}return newArr}

2.新鲜的蔬菜

厨房里新到一批蔬菜,被凌乱地堆放在一起,现在我们给蔬菜分下类,把相同的蔬菜放到同一个菜板上,拿给厨师烹饪美味佳肴吧。

2.1 题目问题

完成 css/style.css 中的 TODO 部分。所有元素的大小都已给出,无需修改,

初始效果

完成后效果如下(图中灰色线条为布局参考线无需实现):

布局位置示意图

2.2 题目分析

本题主要是考察了对flex布局的应用,以及结构伪类选择器的使用

2.3 题目解答

/* TODO:待补充代码 */
#box1{display: flex;justify-content: center;align-content: center;flex-wrap: wrap;
}#box2{display: flex;justify-content: space-between;
}#box2 .item:nth-child(2){align-self: flex-end;
}#box3 {display: flex;justify-content: space-evenly;
}#box3 .item:nth-child(2){align-self: center;
}#box3 .item:nth-child(3){align-self: flex-end;
}

3.水果消消乐

消消乐是一款益智类休闲游戏,在排队等待做核酸的时候可以打开手机玩一会,陪你度过这漫长且无聊的等待期。

3.1 题目问题

请完善 js/index.js 文件。

具体说明如下:

  • 点击开始按钮后,该按钮被隐藏,方格上的图片显示后又隐藏。
  • 点击方格,方格中的图片显示,页面显示两张图片后,比较图片是否相同。
  • 如果图片上的水果相同,方格即可消除,并得 2 分;如果图片上的水果不相同,图片隐藏,并扣 2 分(分数可以为负数)。
  • 在文本 “当前分数为:” 的冒号后面会实时统计当前的得分情况。

在这里插入图片描述

完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。

在这里插入图片描述

3.2 题目分析

本题主要是利用事件监听,来控制元素的显示和隐藏

要注意的点是事件监听的事件对象e和如何获取子节点父节点等

以及两个水果相同的时候控制隐藏和消失的不是display而是visibility或者是opacity。因为display是直接相当于消除了该元素,会影响布局的结构,而visibility和opacity只是让这个元素单单的隐藏

3.3 题目解答

// TODO:请补充代码
function startGame() {document.querySelector("#start").style.display = "none";const img = document.querySelectorAll("img")for(let i = 0; i < img.length; i++ ){img[i].style.display= 'inline-block'}setTimeout(() => {for(let i = 0; i < img.length; i++ ){img[i].style.display= 'none'}}, 1000);let count = 0let alt = ''let prevObj = nulllet score = 0const scoreobj = document.querySelector('#score')const arr = document.querySelectorAll('.img-box')for(let i = 0; i < arr.length; i++){arr[i].addEventListener('click', (e) => {if(count  === 0 ){prevObj = e.targete.target.children[0].style.display= 'inline-block'alt = e.target.children[0].altcount = 1}else{e.target.children[0].style.display= 'inline-block'setTimeout(() => {if(e.target.children[0].alt === alt){e.target.style.visibility = 'hidden'prevObj.style.opacity = 0count = 0score += 2scoreobj.innerHTML = `${score}`}else{prevObj.children[0].style.display = 'none'e.target.children[0].style.display= 'none'count = 0score -= 2scoreobj.innerHTML = `${score}`}}, 500)}})}
}

4.用什么来做计算A

古以算盘作为计算工具。算盘常为木制矩框,内嵌珠子数串,定位拨珠,可做加减乘除等运算。站在前人的肩膀上,后人研究出计算器,便利了大家的生活,我们不用带着笨重的计算工具出门,打开手机上的计算器就可以了。

4.1 题目问题

请完善 js/index.js 文件,当鼠标点击计算器上的按钮时,能够正常进行计算。

具体说明如下:

  • 点击按钮会在计算式子区域显示当前输入的计算式子,当点击等号(=) 后,在结果显示区域应该显示出正确的结果。
  • 计算器需要具有加(+)减(-)乘(x)除(÷)开二次方(√)重置(AC)小数点(.)括号运算这八个功能。
  • 计算器的计算遵循四则混合运算的法则,括号的优先级最高,其次是乘除,加减的优先级最低。

效果说明如下:

  • 能够正确进行加、减、乘、除的混合运算,样例如下所示:

在这里插入图片描述

  • 能够正确进行开二次方,输入一个可以平方的数,点击开方(√)按钮即可在结果显示区域显示结果。如果输入的值是不能平方,结果显示 NaN,样例如下所示:

在这里插入图片描述

在这里插入图片描述

  • 点击重置按钮(AC),可以清空计算式子显示区域和结果显示区域的值。

  • 能够进行小数的加减乘除运算,样例如下所示:

在这里插入图片描述

完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。

在这里插入图片描述

4.2 题目分析

本题最关键的核心就是eval函数。eval函数可以将传入的字符串变成代码去执行

其次就是判断字符串相等和一些字符串常用的方法

而解决开二次方,则需要用到JS内置的Math构造函数的sqrt()

4.3 题目解答

解法1

// TODO:请补充代码
const show1 = document.querySelector('#formula')
const show2 = document.querySelector('#result')let process = ''const button = document.querySelectorAll('.calc-button')
for ( let i = 0; i < button.length; i++ ) {button[i].addEventListener('click', function (e) {if(e.target.innerHTML === 'AC'){show1.value = ''process = ''show2.value = ''}else if(e.target.innerHTML === '='){console.log(process);show2.value = eval(process)}else if(e.target.innerHTML === '÷'){process += '/'show1.value += e.target.innerHTML}else if(e.target.innerHTML === 'x'){process += '*'show1.value += e.target.innerHTML}else if(e.target.innerHTML === '√'){console.log(eval(process));if(eval(process) < 0 ){show2.value = NaN}show2.value = Math.sqrt(eval(process))}else{show1.value += e.target.innerHTMLprocess += e.target.innerHTML}   })
}

解法2

// TODO:请补充代码
const calculator = document.querySelector('.calculator');// 事件委托(无需遍历所有按钮)
calculator.addEventListener('click', (event) => {if (event.target.className == 'calc-button') {// 当点击的是以下 3 种按钮时 需要做特殊处理。switch(event.target.textContent) {case '=' :const resultStr1 = formula.value.replaceAll('x', '*').replaceAll('÷', '/');result.value = eval(resultStr1);return;case 'AC' :formula.value = '';result.value = '';return;case '√' :result.value = Math.sqrt(formula.value);return;}formula.value += event.target.textContent;}
});

5.开学礼物大放送

又是一年开学季,蓝桥为大家准备了开学礼物,想制作一个页面来宣传一下该活动。

5.1 题目问题

请完善 css/style.cssindex.html 文件。

请根据 mark/preview 最终效果图和 mark/index.html 上的参数标注来完成页面布局。

效果图如下:

在这里插入图片描述

5.2 题目分析

看结构就知道考察了定位、flex方面的一些知识

5.3 题目解答

考察的只是简答的页面实现,每个人的实现方式不同,代码差异也很大,这里就不放代码了

6.权限管理

你有没有想过,在我们日常浏览的网页中,那些新闻或者商品内容是如何被输入到数据库中的呢?大家虽然没有用过,但是肯定听过“后台管理系统”,运营人员就是通过它将批量的商品上传到数据库并呈现在网页中的。那么随便一个人就可以通过该管理系统操作这些商品数据吗?当然不行,这就涉及到了权限管理问题。

6.1 题目问题

请在 js/index.js 文件中补全代码,最终实现管理用户权限的功能。

具体需求如下:

  1. 实现异步数据读取和渲染功能。

    • 使用 ajax 异步获取 ./js/userList.json 中的用户数据,并以正确的方式显示在页面下的用户权限表格中(注意:调试完成后请将请求地址写死为 ./js/userList.json)。

    • 页面初始化时,左边用户列表显示 7 个用户(页面数据和结构不能随意篡改),右边的管理员列表无选项。效果如下:

在这里插入图片描述

  1. 实现左/右单个、多个或全部互移功能。

    • 选中任意一个或多个(按 Ctrl 键可多选)左/右边用户/管理员列表中的用户,并点击选中移动到右/左边按钮,即可将选中的用户/管理员移动至另一边的管理员/用户列表中。效果如下:

在这里插入图片描述

  • 点击全部移动到右/左边按钮,则将左/右边用户/管理员列表中的用户全部移动到右/左边的管理员/用户列表中(即:左/右边列表被清空)。效果如下:

在这里插入图片描述

在这里插入图片描述

  1. 实现用户权限表格中的权限,随用户移动发生变化功能。

    • 页面下的用户权限表格中所有用户的权限,会根据页面上方所处列表不同发生相应改变,即管理员列表中的用户权限为管理员,用户列表中的用户权限为普通用户

完成后效果如下:

在这里插入图片描述

6.2 题目分析

本题主要考察了ajax进行请求数据的知识,我们可以用ajax中的xhr技术来完成

还考察了对文档对象模型的考察,以及操作节点

还有就是css的伪类选择器:checked

6.3 题目解答

$(function () {// 使用 ajax 获取 userList.json 数据并渲染到页面getData();// 为按钮添加事件$("#add").click(function () {// TODO:补充代码,实现功能changeAccess(true,document.querySelectorAll('#leftSelect>option:checked'))});$("#addAll").click(function () {// TODO:补充代码,实现功能changeAccess(true,document.querySelectorAll('#leftSelect>option'))});$("#remove").click(function () {// TODO:补充代码,实现功能changeAccess(false,document.querySelectorAll('#rightSelect>option:checked'))});$("#removeAll").click(function () {// TODO:补充代码,实现功能changeAccess(false,document.querySelectorAll('#rightSelect>option'))});
});/*** 修改权限* @param {Object} right 要修改的权限* @param {Object} changeList 要修改权限的用户列表*/
function changeAccess(right, changeList) {// TODO:补充代码,实现功能if(right) fn('#rightSelect')else fn('#leftSelect')function fn(who){for(let i = 0;i<changeList.length;i++){document.querySelector(who).appendChild(changeList[i])const tr = document.querySelectorAll('#userList>tr')tr.forEach(e=>{if(e.firstChild.innerText==changeList[i].value){e.lastChild.innerText = right?'管理员':'普通用户'}})}}
}// 异步获取数据
function getData() {// TODO:补充代码,实现功能const xhr = new XMLHttpRequest();xhr.open("GET", "./js/userList.json");xhr.addEventListener("loadend", () => {const res = JSON.parse(xhr.response)// 一定要注意不能篡改页面数据结构,意思就是不能自己加表格的表头// 因此就不要用map了res.forEach(item => {const tr = document.createElement('tr')const power = item.right ? '管理员' : '普通用户'tr.innerHTML = `<td>${item.name}</td><td>${power}</td>`document.querySelector(".user-list").appendChild(tr)})});xhr.send()
}

7.一起会议吧

网络会议已经成为当下最流行的会议模式,为网络会议提供支持的当然是一些优秀的会议软件。

1.1 题目问题

请在 index.html 文件中补全代码,最终实现网络会议中参会人员列表的几个展示效果

具体需求如下:

  1. 实现异步数据读取和渲染功能。

    • 使用 axios 异步获取 ./js/userList.json 中的用户数据(注意:调试完成后请将请求地址写死为 ./js/userList.json),并显示在登录窗口参会人员窗口中。效果如下:

  2. 实现登录、注销切换功能。

    • 在登录窗口选取用户登录后,登录窗口切换为注销窗口,具体变化为:登录标题变为注销字样;选择用户下拉框变为显示当前登录用户名登录按钮变为注销按钮。参会人员窗口显示,并默认只显示当前登录用户信息。效果如下:

1.2 题目分析

computed中计算当前用户列表有哪些,返回一个数组,根据图标点击的状态筛选出相应的用户对象,状态改变了,就会重新计算。

1.3 题目解答

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>一起会议吧</title><link rel="stylesheet" type="text/css" href="./css/index.css" /><link rel="stylesheet" href="./css/iconfont/iconfont.css" /></head><body><div id="app"><!-- TODO:请在下面实现需求 --><!-- 登录/注销窗口 --><div class="login"><div class="left-tools"><a class="close-btn"></a><a class="shrink-btn"></a></div><h3>{{ !isLogin ? '登录' : '注销' }}</h3><p v-if="!isLogin">选择用户:<select id="selectUser" v-model="currentUser"><option v-for="user in userList" :key="user.id" :value="user">{{ user.name }}</option></select></p><p v-if="isLogin">当前用户为:{{ currentUser.name }}</p><a class="login-btn" @click="handleLogin">{{ !isLogin ? '登录' : '注销' }}</a></div><!-- 右侧显示用户列表窗口按钮 --><button id="show" class="right-btn" v-if="isLogin" v-show="!isShow" @click="isShow = true"><span class="iconfont icon-left-arrow"></span></button><!-- 用户列表窗口 --><div class="user-dialog" v-if="isLogin" v-show="isShow"><!-- 用户列表窗口上侧工具栏 --><ul class="tools"><li class="tools-left"><button :class="{ active: currentState == 1 }" @click="currentState = 1"><span class="iconfont icon-close"></span></button><button :class="{ active: currentState == 2 }" @click="currentState = 2"><span class="iconfont icon-dialog"></span></button><button :class="{ active: currentState == 3 }" @click="currentState = 3"><span class="iconfont icon-list"></span></button></li><li class="tools-right"><button class="show-list" @click="isShow = false"><span class="iconfont icon-retract"></span></button></li></ul><!-- 用户列表 --><ul class="say-list"><li><span class="iconfont icon-microphone"></span></li><li class="line"></li><li>正在讲话:{{ currentSay }};</li></ul><ul class="user-list"><li v-for="user in filterUserList" :key="user.id"><img class="header" :src="user.imgPath" /><div class="user-name"><span v-if="user.isHost" class="iconfont icon-user header-icon"></span><span class="iconfont icon-microphone"></span>{{ user.name }}</div></li></ul></div></div><script type="text/javascript" src="./js/vue.js"></script><script type="text/javascript" src="./js/axios.min.js"></script><script type="text/javascript">// TODO:请在下面实现需求new Vue({el: "#app",data: {userList: [],  // axios获取的用户列表isLogin: false,  // 登录标志isShow: true,   // 展示用户列表标志currentUser: {},  // 当前登录用户对象currentState: 2  // 当前选择页面呈现的方式},async mounted() {let { data } = await axios.get('./js/userList.json')this.userList = datathis.currentUser = this.userList[0]},methods: {handleLogin() {if(this.isLogin) {// 注销重置this.currentState = 2this.isShow = true}this.isLogin = !this.isLogin}},computed: {filterUserList() {if(this.currentState == 2) {return this.userList.filter(u => u.id == this.currentUser.id)} else if(this.currentState == 3) {return this.userList.filter(u => u.id == this.currentUser.id).concat(this.userList.filter(u => u.id != this.currentUser.id))} else {return []}},currentSay() {return this.userList.find(u => u.isHost).name}}});</script></body>
</html>

8.天气趋势A

日常生活中,气象数据对于人们的生活具有非常重要的意义,数据的表现形式多种多样,使用图表进行展示使数据在呈现上更加直观。

1.1 题目问题

请在 index.html 文件中补全代码,具体需求如下:

  1. 完成数据请求(数据来源 ./js/weather.json),weather.json 中存放的数据为 12 个月对应的温度数据。在项目目录下已经提供了 axios,考生可自行选择是否使用。注意:调试完成后请将请求地址写死为 ./js/weather.json

  2. data 中的月份数据 monthList, 在 class=month 标签下面的 li 上完成渲染,点击月份则切换对应月份的温度数据同时被点击的月份会变成激活状态( .active 类),x 轴为日期,y 轴为温度,默认显示 1 月份数据。

  3. 如果点击的月份是当天(通过时间函数动态获取的时间)所在月份,本月和未来七天切换的 tab (即 id=currentMonth 元素)显示,其他月份 currentMonth 元素不显示。

    • 默认显示本月数据。
    • 点击本月显示当月数据,点击未来七天显示从当天(包含当天)开始未来七天的数据,当显示未来七天数据时 x 轴需要显示为月/日格式。
    • 点击 tab本月未来七天会切换激活状态(.active)。

    以当天为 5 月 29 号为例,未来七天 x 轴显示示例(即 x 轴显示成:5/29,5/30,5/31,6/1,6/2,6/3,6/4):

本月未来七天 切换效果见文件夹下 effect-1.gif

最终效果见文件夹下面的 gif 图,图片名称为 effect-2.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)

在这里插入图片描述

1.2 题目分析

本题主要是考查如何异步更新图标数据的问题

以及内置的Date构造函数的使用

1.3 题目解答

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>天气趋势</title><metaname="viewport"content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/><link rel="stylesheet" type="text/css" href="css/style.css" /><script src="./js/axios.js"></script><script src="js/vue.min.js" type="text/javascript" charset="utf-8"></script><scriptsrc="js/echarts.min.js"type="text/javascript"charset="utf-8"></script></head><body><div id="app"><div class="top-bar">2022年 Y 城全年温度统计图</div><!-- 主体 --><div class="container"><!-- 月份 --><div class="month"><ul><!-- TODO:待补充代码 在下面的 li 标签中完成 12个月份 (即 monthList) 的渲染  --><li:class="{active:active == i}"v-for="(m,k,i) in monthList"@click="changeMonth(i)">{{m}}</li></ul></div><div class="chart"><!-- TODO:待补充代码  --><!-- currentMonth  未来七天和本月 tab 切换,只有当前月才显示 --><div id="currentMonth" v-if="currentMonth == active"><div class="title"><h3>{{isfuture ? '未来七天天气' : typeTitle}}</h3><div class="type"><span id="seven" :class="{active:isfuture}" @click="future">未来7天</span><spanid="current":class="{active:!isfuture}"@click="changeMonth(active)">本月</span></div></div></div><div id="chart"></div></div></div></div></body>
</html>
<script>// TODO:待补充代码var vm = new Vue({el: "#app",data: {chart: null, // 图表chartOptions: null, // 图表配置项typeTitle: "本月天气",active: 0,isfuture: false,currentMonth: new Date().getMonth(),weatherData: [],monthList: {January: "1月",February: "2月",March: "3月",April: "4月",May: "5月",June: "6月",July: "7月",August: "8月",September: "9月",October: "10月",November: "11月",December: "12月",},},mounted: async function () {let { data } = await axios.get("./js/weather.json");this.weatherData = data.map((v) => Object.values(v).flat(1));// 初始化 echartsthis.$nextTick(() => {this.initChart();});},methods: {async initChart() {// 初始化图表this.chart = echarts.init(document.getElementById("chart"));// 配置项this.chartOptions = {grid: {top: 35,bottom: 5,left: 10,right: 10,containLabel: true,},tooltip: {trigger: "axis",axisPointer: {lineStyle: {color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "rgba(255,255,255,0)",},{offset: 0.5,color: "rgba(255,255,255,1)",},{offset: 1,color: "rgba(255,255,255,0)",},],global: false,},},},},xAxis: [{type: "category",boundaryGap: false,axisLabel: {formatter: "{value}",fontSize: 12,margin: 20,textStyle: {color: "#bfbfbf",},},axisLine: {lineStyle: {color: "#e9e9e9",},},splitLine: {show: true,lineStyle: {color: "#f7f7f7",},},axisTick: {show: false,},// x 轴显示的数据,日期data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,],},],yAxis: [{boundaryGap: false,type: "value",axisLabel: {textStyle: {color: "#bfbfbf",},formatter: `{value}\u2103`,},nameTextStyle: {color: "#fff",fontSize: 12,lineHeight: 40,},splitLine: {lineStyle: {color: "#f7f7f7",},},axisLine: {show: true,lineStyle: {color: "#e9e9e9",},},axisTick: {show: false,},},],series: [{name: "天气",type: "line",smooth: false,showSymbol: false,symbolSize: 0,zlevel: 3,itemStyle: {color: "#ff6600",borderColor: "#a3c8d8",},lineStyle: {normal: {width: 3,color: "#ff6600",},},areaStyle: {normal: {color: new echarts.graphic.LinearGradient(0,0,0,1,[{offset: 0,color: "#ff6600",},{offset: 0.8,color: "#ff9900",},],false),},},//  Y 轴显示的数据,即温度数据data: [23, 19, 30, 31, 18, 20, 16, 15, 23, 27, 29, 30, 32, 23, 25, 20,22, 24, 34, 24, 21, 26, 23, 24, 25, 23, 25, 28, 32, 20,],},],};// 调用此方法设置 echarts 数据this.chart.setOption(this.chartOptions);this.changeMonth(0);},changeMonth(m) {this.active = m;this.isfuture = false;let x = [...new Array(this.weatherData[m].length).keys()].map((v) => v + 1);let y = this.weatherData[m];this.chartOptions.xAxis[0].data = x;this.chartOptions.series[0].data = y;this.chart.setOption(this.chartOptions);},future() {this.isfuture = true;let date = new Date();let d = date.getDate();let x = [];let y = this.weatherData[date.getMonth()].slice(d - 1, d + 6);if (y.length != 7) {y = y.concat(this.weatherData.slice(0, 7 - y.length));}for (let i = +date;i < +date + 7 * 1000 * 60 * 60 * 24;i += 1000 * 60 * 60 * 24) {x.push(new Date(i).getMonth() + 1 + "/" + new Date(i).getDate());}console.log(x, y);this.chartOptions.xAxis[0].data = x;this.chartOptions.series[0].data = y;this.chart.setOption(this.chartOptions);},},});
</script>

9.JSON生成器

JSON 已经是大家必须掌握的知识点,JSON 数据格式为前后端通信带来了很大的便利。在开发中,前端开发工程师可以借助于 JSON 生成器快速构建一个 JSON 用来模拟数据。

1.1 题目问题

请在 index.js 文件中补全 generateData 函数代码,并最终返回一个 js 对象(说明 : generateData 生成的数据会由插件自动转化成 JSON)。

在左侧的输入框中输入指定格式的数据模板,点击生成 JSON 按钮,右侧会自动生成对应格式的 JSON 数据。

  1. 数据模板中对象的 key 对应的 value 如果是 {{}} 并且符合下述规则,则根据下述规则解析,否则一律返回原始 value 值。具体规则如下:

    • {{bool()}} 表示随机生成布尔值。
    • {{integer(n, m)}} 表示生成 n-m 之间(包含 n、m )的随机整数(注意:n<m)。

    目标1测试用例

    附目标 1 测试用例:

    {isPass: '{{bool()}}',age: '{{integer(3, 5)}}',goodsNumber:2,isShow:false,tag:'phone',fn:'{{integer}}'
    }
    
  2. 数据模板中 {{repeat()}}(此项只会出现在数组首位)表示重复生成数组中的数据,如:"repeat(5, 7)" 则表示随机生成 5-7 条数组数据,repeat 中值只包含一个数字,如"repeat(5)" 表示生成 5 条数组数据。

    目标2测试用例

    附目标 2 测试用例(3 组):

    // (1)随机生成 `2-5` 条数组数据
    ["{{repeat(2, 5)}}",{isActive: "{{bool()}}",age: "{{integer(20, 40)}}",num: 2,boolean: true,str: "str",isTel: "{{bool}}",fn: "{{fn()}}",},
    ]
    // (2)固定生成 `7` 条数组数据
    [("{{repeat(7)}}",{isTrue: "{{bool()}}",score: "{{integer(3, 7)}}",tag: "android",isSamll: true,fn: "{{fn()}}",})
    ]
    // (3)无 repeat 的情况
    [{ maxNum: 10 }
    ];
    

注意:本题不考虑用户输入和传参不合法的情况,只处理合法的数据格式即可,实际测试中 keyvalue 为非固定值。提供的测试用例仅为方便测试代码使用,实际使用中需要对所有符合要求的数组/对象结构的模板生效。

1.2 题目分析

主要是考察了对正则的理解和使用

以及eval和Math的相关使用

注意:eval执行字符串里面的代码的时候如果出现{{ 代码 }}包裹的字符串,{{}}不会被执行和返回-----类似于vue的插值表达式

1.3 题目解答

/** @param {*}  左侧输入框输入的值转化成的 js 数据* @return {*} 根据传入的数据生成对应的 js 格式数据*/
let generateData = (data) => {// TODO:待补充代码//正则表达式用于匹配字符//匹配形如 {{repeat(n1, n2, ..., nk)}} 的字符串模式let reg1 = /^\{\{(repeat\([\d,\s]+\))\}\}$/let reg2 = /^\{\{bool\(\)\}\}$/let reg3 = /^\{\{integer\([\d,\s]+\)}\}$///不是数组进入if(!Array.isArray(data)){for(let k in data){//将bool和integer进行转换并运行if(reg2.test(data[k])||reg3.test(data[k])){data[k]=eval(data[k]);}}return data;}//记录重复生成的次数let len = reg1.test(data[0]) ? eval(data[0]) : 1let result = []//记录结果while (result.length !== len) {let obj = {...data[1]}//扩展成一个对象for (let k in obj) {if(reg2.test(obj[k]) || reg3.test(obj[k])) {obj[k] = eval(obj[k])}}result.push(obj)}function repeat(a,b){//如果b是空值,则返回啊,否则返回随机值return  b ? Math.random() * (b-a+1) + a | 0 : a}function integer(a, b) {return Math.random() * (b - a + 1) + a | 0}function bool() {return Math.random() > 0.5}return result
};module.exports = { generateData };

10.商城管理系统

在商城管理系统中,超级管理员和普通管理员因为权限不同,登录进入后看到的菜单也会是不同的。

1.1 题目问题

请在 js/auth.js 文件中补全 getMenuListAndAuth 函数代码。

在登录页 login.html 点击管理员登录超级管理员登录时会根据管理员的权限不同,在商城首页 index.html 的左侧显示不同的菜单列表。但是后端同学给的数据是不符合前端展示要求的,所以我们需要做些处理,假如后端提供的数据是这样的:

[{ parentId: -1, name: "商品管理", id: 1, auth: "cart" },{ parentId: 1, name: "商品列表", id: 4, auth: "cart-list" },{ parentId: -1, name: "添加管理员", id: 10, auth: "admin" },
];

其中数据中对象字段的含义说明:

  • id 表示当前节点
  • parentId 表示父级节点,如果为 -1 则表示顶级数据
  • auth 表示权限

具体需求如下:

  1. 将待处理数据(一维数组)根据 parentId 字段值处理成树形结构存入 menus 变量中。

把数据处理成如下格式(每一项都必须有 children 字段,没有子级时,children 为空数组):

[{parentId: -1,name: "商品管理",id: 1,auth: "cart",children: [{parentId: 1,name: "商品列表",id: 4,auth: "cart-list",children: [],},],},{parentId: -1,name: "添加管理员",id: 10,auth: "admin",children: [],},
];

注意js/auth.js 中的 menuList 仅为后端返回的数据结构示例,非固定数据。实际使用中,后端返回的数据转化成树形结构时层级可能更多,封装方法时务必考虑通用性。

  1. 将待处理数据中的 auth 字段提取出来并存入 auths 变量中,左侧菜单会根据传入的权限列表数组和 auths 对比后进行菜单渲染。

经过 getMenuListAndAuth 处理后 auths 的结果为:

["cart", "cart-list", "admin"];

完成后的效果见文件夹下面的 gif 图,图片名称为 effect.gif(提示:可以通过 VS Code 或者浏览器预览 gif 图片)。

在这里插入图片描述

1.2 题目分析

考察了递归算法和数组的去重

1.3 题目解答

const getMenuListAndAuth = (menuList) => {// TODO:待补充代码const arr = menuList.map(item => item.auth)const auths = arr.filter((item, index) => arr.indexOf(item) === index)const menus = getMenuList(menuList, -1)function getMenuList(menuList, parentId) {let arr = []menuList.forEach(item => {if (item.parentId == parentId) {arr.push(item)item.children = getMenuList(menuList, item.id)}})return arr}return { menus, auths }; // menus 转化后的树形结构数据,auths 转化后的权限列表数组
};

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

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

相关文章

从了解到掌握 Spark 计算框架(一)Spark 简介与基础概念

文章目录 什么是 Spark&#xff1f;核心特点 Spark 对比 MapReduceSpark 编程模型RDDDataFrameDataset Spark 运行模式Spark 生态 什么是 Spark&#xff1f; Spark 是一个基于内存的分布式计算框架&#xff0c;最初由加州大学伯克利分校的 AMPLab 开发&#xff0c;后来捐赠给了…

go语言基准测试Benchmark 最佳实践-冒泡排序和快速排序算法基准测试时间复杂度对比

在go语言中Benchmark基准测试( 在后缀为_test.go的文件中&#xff0c;函数原型为 func BenchmarkXxx(b *testing.B) {}的函数 )可以用来帮助我们发现代码的性能和瓶颈&#xff0c; 其最佳实践 应该是我们最常用的 冒泡排序和快速排序的测试了&#xff0c;废话不说&#xff0c;直…

项目9-网页聊天室3(主界面之用户信息)

1.前端页面 CSS: 如何让img里的图片自适应div&#xff0c;且不变形_img自适应div大小 铺满且不变形-CSDN博客 JavaScript/jQuery 如何改变一个img元素的src属性|极客教程 (geek-docs.com) 2.要求 左上角显示用户的昵称和头像. 3.后端代码 3.1 添加拦截器 3.2 注册拦截器 …

go升级后 编译的exe在win7上无法正常运行

D:/Go/src/runtime/sys_windows_amd64.s:65 x75 fpx22fca sp-0x22fc8日 升级到go 1.21后报一堆错误&#xff0c;要死了啊 原来是go 1.21不支持win7了&#xff0c;必须把go退回到1.20版本 谷歌发布编程语言 Go 1.21 版本&#xff1a;取消支持微软 Win7/8 及苹果 macOS 10.13/10…

pip install pytorch-quantization error

一 报错信息 最近安装pytorch-quantization报错&#xff0c;安装失败报错信息如下&#xff1a; Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

Vue3学习使用axios和qs进行POST请求和响应处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言1.准备工作2.发送POST请求3.处理响应数据4.总结 一、前言 在前端开发中&#xff0c;经常需要与后端进行数据交互&#xff0c;其中包括发送POST请求并处理响…

HarmonyOS 鸿蒙应用开发 - 创建自定义组件

开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#xff0c;后续版本演进等因素。因此&#xff0c;将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。 1、创…

快团团帮卖团长怎么对供货大团长进行评分?

都说帮卖“躺赚”&#xff1f; 一旦遇团不淑&#xff0c;惨遭不靠谱团长挖坑&#xff0c;售后拖延、发货慢、产品瑕疵…… 加上顾客夺命连环催&#xff0c;双面夹击&#xff0c;夹缝生存。供货团长靠不靠谱太重要了&#xff01; 快团团供货团长评分系统上线&#xff01; 帮卖团…

ECOLOGY9解决明细表数据按需显示或隐藏

ECOLOGY9:由于领导需要查看完整的明细表数据&#xff0c;没有启用分页功能&#xff0c;导致大领导查看时又出现几百行的数据&#xff0c;影响使用体验。需求&#xff1a;只看正常表单数据&#xff0c;明细表数据&#xff0c;默认不显示&#xff0c;需要查看时再打开。 实现&am…

【RK3288 Android10 T8pro usb hid-multitouch idc配置】

【RK3288 Android10 T8pro usb hid-multitouch idc配置】 文章目录 【RK3288 Android10 T8pro usb hid-multitouch idc配置】背景代码分析1. 读取配置文件2. 标志内外置屏幕3. 设置输入设备4. findviewport()5. 根据对应的viewport来计算相应的mapping的参数 结论 背景 T8pro …

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…

关于k8s集群的污点和容忍,以及k8s集群的故障排查思路

一 污点(Taint) 和 容忍(Tolerations) &#xff08;一&#xff09;污点 在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;污点&#xff08;Taints&#xff09;是一个重要的概念&#xff0c;用于实现Pod的调度控制。以下是关于污点的详细解释&#xff1a;1.污点定义 污点…

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

【算法】位运算算法——判断字符是否唯一

题解&#xff1a;判断字符是否唯一(位运算算法) 目录 1.题目2.题解3.位图参考代码4.细节5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 题解有两种方法&#xff0c; 一是做一个哈希数组&#xff0c;去查重&#xff1b; 二是直接用一个变量每一位来对应表示是否有这个字母…

Android - failed to set system property

记录一次疏忽&#xff0c;起因是我需要在自定义的 receiver 中保存 property 方便&#xff0c;方便在三方 app 中使用&#xff0c;结果直接崩溃了&#xff0c;虽然结果保存成功了&#xff0c;但是这种情况也是无法接收的&#xff0c;错误日志如下&#xff1a; M006082 05-25 1…

场景题11111

关单操作&#xff1f; 优先考虑定时任务、Redissonredis、RocketMQ延迟消息实现&#xff08;订单量特别大的时候&#xff0c;不建议使用MQ&#xff09; 每个订单都有一个消息会增加资源消耗可靠性问题&#xff08;丢失&#xff09;大量的无效消息不是所有消息队列都支持一般通…

PID控制中的积分到底是什么,为什么它可以将矩形线转换为曲线?simulink搭建PID控制,积分模块1/s

PID控制中的积分到底是什么&#xff0c;为什么它可以将矩形线转换为曲线&#xff0c; 这个问题呢其实道理很简单&#xff0c;用到的是初中的知识 我们做几个测试案例 如下面matlab搭建了积分1/s 那显示如下&#xff08;红色曲线相当于加速度、蓝色曲线相当于速度&#xff09;&a…

5.28_Java语法_运算符,接收键盘数据

1、运算符 具体应用同我C语言操作符详解博客相同,另有补充会直接写 1.1、基本的算术运算符、符号做连接符 CSDN 具体应用同我C语言操作符详解博客相同 符号做连接符&#xff1a; ""符号与字符串运算连用的时候是用作连接符的&#xff0c;其结果依然是一个字符串…

前端响应式期末作品

网页设计成品_前端响应式 主题&#xff1a;租房网站&#xff0c;共6个html页面&#xff0c;包含首页&#xff0c;登录注册&#xff0c;租房新闻&#xff0c;租房精选&#xff0c;租房详情&#xff0c;数据可视化页面&#xff08;可以修改内容&#xff09; 采用技术&#xff1a;…