第十五届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组
·
第一题:动态tab栏目
.buttons {
......
/* TODO: 请在此补充代码实现tab栏动态固定 */
position: sticky;
top: 0;
}
第二题:地球漫游
.earth-con {
......
/* TODO:待补充代码,添加动画 */
animation: orbit 36.5s linear infinite;
}
第三题:迷惑的this
//事件处理函数
handle() {
// TODO:待补充代码
this.inputEl.addEventListener('input',this.handleInput.bind(this),false)
},
第四题:魔法失灵了
//TODO:待修复代码
// let { value } = { ...data };
let { value } = toRefs(data);
function update(val) {
value = val;
}
第五题:燃烧你的卡路里
目标1:
<!-- 抽屉 start -->
<!-- TODO:待补充代码,点击按钮时显示抽屉组件 -->
<el-drawer v-model="drawer" title="我是标题" :with-header="false" size="60%" :direction="direction">
......
</div>
</el-drawer>
const submit = async () => {
// TODO 待添加的代码 功能显示抽屉组件
drawer.value = true;
......
};
目标2:
const sortItem = (arr, pro, compare) => {
// TODO 根据 compare 匹配食材对象后返回这个对象
let result = arr.sort((a, b) => {
return b[pro] - a[pro];
});
for (const item of result) {
if (item[pro] < compare) {
return item;
}
}
};
第六题:司龄统计
目标1:
// 按照年龄分组的函数
const groupByAge = (peoples) => {
// TODO:待补充代码,按照年龄进行分组
const age_group = {};
peoples.map((item) => {
return (age_group[item.age] = []);
});
for (const item of peoples) {
age_group[item.age].push(item)
}
return age_group
};
目标2:
const app = Vue.createApp({
setup() {
const { updateData } = useECharts();
let xAxisData = Vue.ref([]); // X 轴数据,司龄从小到大排列
let seriesData = Vue.ref([]); // Y 轴数据,司龄对应的人数
const groupedPeople = Vue.ref([]); // table 中显示的数据
Vue.onMounted(async () => {
const data = await (await fetch("./mock/data.json")).json();
groupedPeople.value = groupByAge(data); //把请求回来的数据变成需要的数据格式
// TODO: 设置 Echars X 轴数据 xAxisData 和 Y 轴数据 seriesData
let age_result = data.sort((a, b) => {
return a.age - b.age;
});
xAxisData.value = [...new Set(age_result.map((item) => item.age))];
for (let key in groupedPeople.value) {
seriesData.value.push(groupedPeople.value[key].length);
}
// 更新 echars 数据
updateData(xAxisData.value, seriesData.value);
});
第七题:不翼而飞的余额
目标1:
<script>
const { createApp } = Vue;
const { createPinia } = Pinia;
const { createRouter, createWebHistory } = VueRouter; // TODO:待补充代码,在此引入路由相关 API
const app = createApp({});
app.use(createPinia());
const router = createRouter({
// TODO:待补充代码,为项目配置 history 模式的路由
history: createWebHistory(),
routes: [
{
path: "/",
component: WalletPage,
},
{
path: "/deposit",
component: DepositPage,
},
],
});
app.use(router);
// 注册组件
app.mount("#app");
</script>
目标2/3:
<!-- TODO:待补充代码,在 # deposit-balance 中正确显示钱包余额 -->
<span id="deposit-balance">{{store.balance}}</span>
// TODO:待补充代码,完善点击存款按钮事件
function deposit() {
store.balance += depositAmount.value
depositAmount.value = "";
}
return {
depositAmount,
store,
deposit
}
第八题:个性化推荐
req.on("end", () => {
let { interested = [] } = qs.parse(body);
// TODO: 补充个性化页面处理代码
let html = ''
interested = Array.isArray(interested) ? interested : [interested]
if(interested.length) {
let obj = data.reduce((p, c) => (p[c.tag] = c, p), {})
interested = Array.from(new Set(interested.reduce((p, c) => (p.push(...obj[c].relevance), p), [...interested]))).map(item => obj[item])
html = interested.map(item => `
<div class="interest">
<div class="tag">${item.tag}</div>
<div>${item.content}</div>
</div>`).join('')
} else {
html = '<div class="unselect">你还未选择任何感兴趣的标签!</div>'
}
let customizedPage = fs.readFileSync(path.join(__dirname, '../customized.html'), 'utf-8')
customizedPage = customizedPage.replace('<body></body>', `<body>${html}</body>`)
res.writeHead(200, { 'Content-Type': 'text/html' })
res.write(customizedPage)
res.end()
});
第九题:贪吃蛇
// 移动蛇的头部
nextStep() {
// TODO:待补充代码
let old_head = this.snakeBody[0];
let new_head = {};
switch (this.direction) {
case "right": // 右
new_head = {
left: old_head.left + this.size,
top: old_head.top,
};
break;
case "down": // 下
new_head = {
left: old_head.left,
top: old_head.top + this.size,
};
break;
case "left": //左
new_head = {
left: old_head.left - this.size,
top: old_head.top,
};
break;
case "up": //上
new_head = {
left: old_head.left,
top: old_head.top - this.size,
};
break;
}
this.snakeBody.unshift(new_head)
this.snakeBody.pop()
}
第十题:自定义表单验证
目标1:
setup(props, { emit }) {
const inputValue = ref(props.value);
const holder = ref(props.holder);
// TODO:目标 1 当输入框的值变化时,触发 input 事件更新父组件的 v-model 值
watch(inputValue, (event) => emit("update:modelValue", event));
// TODO:end
return {
inputValue,
holder,
};
},
目标2:
/** 邮箱验证函数
* @param {string} val 邮箱地址
* @return {boolean}
*/
const is_email = (val) => {
// TODO:目标 2 待补充代码
return /^\w+@\w+\.[a-zA-Z]{2,4}$/.test(val);
};
目标3:
// TODO:目标 3 编写通用的表单验证规则,并将错误信息放置到 errors 对象中
const { rules, formData } = props;
for (const key in rules) {
const r = rules[key];
const val = formData[key];
for (const rule of r) {
if (rule.validator && typeof rule.validator == "function") {
rule.validator(rule, val, (e) => {
if (e) errors.value[key] = e.message;
});
}
if (rule.required && val == "") {
!errors.value[key] && (errors.value[key] = rule.message);
}
if (rule.type) {
let isTrue = validateByType(rule.type, val);
if (!isTrue && !errors.value[key]) {
errors.value[key] = rule.message;
}
}
if (val < rule.min || val > rule.max) {
!errors.value[key] && (errors.value[key] = rule.message);
}
}
}
// TODO:END
更多推荐


所有评论(0)