感觉蓝桥杯的模拟赛一次比一次难了
制作不易,代码都是纯手敲,觉得有帮助的伙伴们记得点个赞评论一下,谢谢大家支持
话不多说直接上答案
目录
1、想不相等
2、三行情书
3、电影院在线订票
4、老虎机
5、星际通讯
6、蓝桥杯排位赛
7、拼出一个未来
8、超能英雄联盟
HeroList.js
TeamList.js
9、万能合成台
10、账户验证
这里有个坑,题意说如果不符合要求要抛出错误'...',实际上只需要return即可,不需要用到throw语句,当时这里卡了有一会
/**
* @param {string} val
* @return {Object}
*/
var expectFn = function(val) {
// TODO
return{
toBe(_val){
return val === _val || 'Not Equal'
},
notToBe(_val){
return val !== _val || 'Equal'
}
}
};
// console.log(expectFn(5).toBe(5)); // true
// console.log(expectFn(5).notToBe(5)); // "Equal"
// 检测需要,请勿删除
module.exports = expectFn;
这题要注意的是,span标签原本为行内元素,无法设置宽高,需要将span转换为块级元素
span {
font-size: 20px;
color: #837362;
/* TODO:补充下面的代码 */
display: block;
width: 100%;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
p {
color: #837362;
/* TODO:补充下面的代码 */
display: -webkit-box;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
}
/* TODO:
1. 完成数据请求,生成电影名,价格以及座位情况
2. 绑定点击事件,实现订票功能
*/
// 获取座位区域节点
const seatAreaNode = document.getElementById("seat-area");
// 获取电影名节点
const movieNameNode = document.getElementById("movie-name");
// 获取电影票价节点
const moviePriceNode = document.getElementById("movie-price");
// 获取已订电影票数量节点
const count = document.getElementById("count");
// 获取已订电影票总价节点
const total = document.getElementById("total");
axios('./data.json').then(res=>{
let {data} = res
console.log(data);
movieNameNode.innerText = data.name
moviePriceNode.innerText = data.price
let tpl = ``
data.seats.map(item=>{
tpl+=`{{replace}}`
let _tpl = ''
item.map(_item=>{
_tpl+=_item?`
`:``
})
tpl = tpl.replace('{{replace}}',_tpl)
})
seatAreaNode.innerHTML = tpl
;[...document.getElementsByClassName('seat')].map(node=>{
if(![...node.classList].includes('occupied')){
node.onclick=function(){
if([...node.classList].includes('selected')){
node.classList.remove('selected')
count.innerHTML = parseInt(count.innerHTML) - 1
total.innerHTML = parseInt(total.innerHTML) - 20
}else{
node.classList.add('selected')
count.innerHTML = parseInt(count.innerHTML) + 1
total.innerHTML = parseInt(total.innerHTML) + 20
}
}
}
})
})
这题如果读懂题意还是很简单的,要r1、r2和r3减1即可
// GetResult 中奖结果函数,r1,r2,r3 为最后图片停留位置,以第一列为例,最终显示的元素是 sevenFirst 下的第 r 个 li 元素。
GetResult(r1, r2, r3) {
// TODO 待补充代码
let o1 = document.getElementById('sevenFirst').getElementsByTagName('li'),
o2 = document.getElementById('sevenSecond').getElementsByTagName('li'),
o3 = document.getElementById('sevenThird').getElementsByTagName('li'),
oTip = document.getElementsByClassName('textPanel')[0]
if(o1[r1-1].dataset.point == o2[r2-1].dataset.point == o3[r3-1].dataset.point){
oTip.innerHTML ='恭喜你,中奖了'
}else{
oTip.innerHTML ='很遗憾,未中奖'
}
}
}
这题难度还是比较简单的,因为codonTable里的key都是三位数的
/**
* @param {string} alienMessage 外星人的密文
* @return {string} 翻译结果
*/
const translate = (alienMessage) => {
// TODO:待补充代码
if(!alienMessage)return ""
if(alienMessage.length%3!=0)return"无效密语"
let strArr = [],
_str = '',
result = ''
for(let strIdx in alienMessage){
_str+=alienMessage[strIdx]
if(_str == 'XXI')break
if(_str.length == 3){
strArr.push(_str)
_str = ''
}
}
result+=(strArr.map(item=>codonTable[item])+'').replaceAll(',','')
if(result=='undefined' || !result)return "无效密语"
return result
};
考察的是echart,直接上答案
const { createApp, ref, onMounted } = Vue;
const app = createApp({
setup() {
const chartsData = ref([]);
onMounted(() => {
// TODO:待补充代码 请求数据,并正确渲染柱形图和地图
fetch('./mock/map.json').then(res=>res.json()).then(res=>{
let schoolList = []
res.map(item=>{
item.school_power.map((item,idx)=>schoolList.push(item))
})
schoolList.sort((a,b)=>b.power-a.power)
schoolList.length = 10
showChartBar(schoolList);
showChinaMap(res);
})
});
// 展示柱状图
const showChartBar = (schoolList) => {
const myChart = echarts.init(document.getElementById('chart'));
let data = chartsData.value.map((item, index) => {
return item.school_power;
});
let result = data.flat(1).sort((a, z) => {
return z.power - a.power;
});
let arr = result.slice(0, 10);
let school = arr.map((item) => {
return item.name;
});
let power = arr.map((item) => {
return item.power;
});
// 指定配置和数据
const option = {
xAxis: {
type: 'category',
axisLabel: { interval: 0, rotate: 40 },
// TODO:待修改 柱状图 x 轴数据 -> 前 10 学校名称
data: schoolList.map(item=>item.name),
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true,
},
yAxis: {
type: 'value',
boundaryGap: [0, 0.01],
},
series: [
{
// TODO:待修改 柱状图 y 轴数据->学校战力值
data: schoolList.map(item=>item.power),
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.2)',
},
itemStyle: {
color: '#8c7ae6',
},
},
],
};
// 把配置给实例对象
myChart.setOption(option);
// 根据浏览器大小切换图表尺寸
window.addEventListener('resize', function () {
myChart.resize();
});
};
// 展示地图
const showChinaMap = (data) => {
const chinaMap = echarts.init(document.getElementById('chinaMap'));
// 进行相关配置
const mapOption = {
tooltip: [
{
backgroundColor: '#fff',
subtext: 'aaa',
borderColor: '#ccc',
padding: 15,
formatter: (params) => {
return (
params.name +
'热度值:' +
params.value +
'
' +
params.data.school_count +
'所学校已加入备赛'
);
},
textStyle: {
fontSize: 18,
fontWeight: 'bold',
color: '#464646',
},
subtextStyle: {
fontSize: 12,
color: '#6E7079',
},
},
],
geo: {
// 这个是重点配置区
map: 'china', // 表示中国地图
label: {
normal: {
show: false, // 是否显示对应地名
},
},
itemStyle: {
normal: {
borderColor: 'rgb(38,63,168)',
borderWidth: '0.4',
areaColor: '#fff',
},
emphasis: {
//鼠标移入的效果
areaColor: 'rgb(255,158,0)',
shadowOffsetX: 0,
shadowOffsetY: 0,
shadowBlur: 20,
borderWidth: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)',
},
},
},
visualMap: {
show: true,
left: 'center',
top: 'bottom',
type: 'piecewise',
align: 'bottom',
orient: 'horizontal',
pieces: [
{
gte: 80000,
color: 'rgb(140,122,230)',
},
{
min: 50000,
max: 79999,
color: 'rgba(140,122,230,.8)',
},
{
min: 30000,
max: 49999,
color: 'rgba(140,122,230,.6)',
},
{
min: 10000,
max: 29999,
color: 'rgba(140,122,230,.4)',
},
{
min: 1,
max: 9999,
color: 'rgba(140,122,230,.2)',
},
],
textStyle: {
color: '#000',
fontSize: '11px',
},
},
series: [
{
type: 'map',
geoIndex: 0,
// TODO:待修改 地图对应数据
data,
},
],
};
// 把配置给实例对象
chinaMap.setOption(mapOption);
};
return {
chartsData,
showChartBar,
showChinaMap,
};
},
});
app.mount('#app');
// 定义拖放事件的处理函数
function drop(event) {
// 检查是否拖动的拼图块不是当前目标拼图块
// draggedPiece 被拖动的拼图块元素。this 目标位置的拼图块元素。
if (draggedPiece !== this) {
// TODO:待补充代码
let saveArr = [
[draggedPiece.children[0].src,draggedPiece.children[0].dataset.id]
,[this.children[0].src,this.children[0].dataset.id]
]
draggedPiece.children[0].src = saveArr[1][0]
draggedPiece.children[0].dataset.id = saveArr[1][1]
this.children[0].src = saveArr[0][0]
this.children[0].dataset.id = saveArr[0][1]
let imgDataIdList = [...document.getElementById('puzzle-container').getElementsByTagName('img')].map(item=>item.dataset.id)
console.log(imgDataIdList);
if(imgDataIdList == '1,2,3,4,5,6,7,8,9'){
document.getElementById('success-message').classList.remove('hide')
document.getElementById('success-message').classList.add('show')
}else{
document.getElementById('success-message').classList.remove('show')
document.getElementById('success-message').classList.add('hide')
}
}
// 重置正在拖动的拼图块
draggedPiece = null;
}
这里我只改动了两个地方
// TODO:补全代码,实现目标效果
const HeroList = {
template: `
可选英雄
-
{{item.name}}
{{item.ability}}
{{item.strength}}
`,
setup() {
let store = useHeroStore(),
list = ref([])
axios('./js/heroes.json').then(({data})=>{
data.map(item=>{
item.btnInfo = {
text:'添加至队伍',
disabled:false
}
})
list.value = data
store.heroes = list.value
})
return{
list,
clickEvent(idx){
list.value[idx].btnInfo.text = '已添加'
list.value[idx].btnInfo.disabled = true
}
}
},
};
// TODOEnd
// TODO:补全代码,实现目标效果
const TeamList = {
template: `
我的队伍
-
{{item.name}}
{{item.strength}}
当前队伍战斗力:{{count}}
`,
setup() {
let store = useHeroStore(),
list = Vue.ref([]),
count = Vue.ref(0)
Vue.watch(()=>store.heroes,nv=>{
count.value = 0
list.value = nv.filter(item=>{
if(item.btnInfo.disabled){
count.value += item.strength
return true
}
})
},{deep:true})
return {
list,
count,
removeHero(item,idx){
store.heroes[item.id-1].btnInfo.text = '添加至队伍里'
store.heroes[item.id-1].btnInfo.disabled = false
},
sortStrength(){
list.value.sort((a,b)=>b.strength - a.strength)
},
}
},
};
// TODOEnd
这题的含金量还是比较高,考察了很多方面的知识点
这题我选择用了字符串来解
// state 辅助记录当前合成栏内容的全局变量
let state = [
['', '', ''],
['', '', ''],
['', '', '']
];
let targetItemName = ''; //辅助记录当前合成栏的可能目标合成物品每次 onPickItem 执行后,前端界面会根据此全局变量的值更改图标
/** 检查当前的合成配方是否能够合成某个物品。如果配方合法,返回一个合成的目标物品名,否则返回一个空字符串。
* @param {*} map 为一个 3*3 的二维数组,第一维为物品的每一横行,第二维为每一横行物品下的每个纵列
*/
function checkRecipe(map) {
// TODO:待补充代码
let rule = structuredClone(window.recipes)
//用字符串来玩这道题
let rMap = map.map(item=>{
return (item+'').replaceAll(',',' ').trim()
}),
rRule = {},
result = ''
for (let key in rule) {
rRule[key] = []
for (let idx in rule[key]) {
rRule[key][idx] = rule[key][idx].map(item=>(item+'').replaceAll(',',' ').trim())
}
}
for(let key in rRule){
for (const item of rRule[key]) {
let _itemStr = ''
//判断纵向是否拥有空位
if((rMap+'')[0]==','){
_itemStr = ','+item
}else if((rMap+'')[(rMap+'').length-1]==','){
_itemStr = item+','
}else{
_itemStr = item+''
}
if(_itemStr == rMap)result = key
}
}
return result
}
/** 更新 state 中的物品位置
* @param {string} name 为此次修改为的物品,可能为空字符串(通过右下角清空),也可能为物品
* @param {Array} pos 为一个两个元素的数字数组,分别指示物品的所在横行与所在纵列
*/
function onPickItem(name, pos) {
// TODO:待补充代码
state[pos[0]-1][pos[1]-1] = name
targetItemName = checkRecipe(state) || '';
}
这题有个坑,最后清空了输入框的值依旧不给过,然后换了一种思路就可以了,上代码:
账户验证
使用手机号登录
输入短信验证码
- 已向
{{handlePhoneVal}}
发送验证码
-
重新发送
验证成功!
5s后将自动跳转