蓝桥杯Web前端练习

简介: 蓝桥杯Web前端练习

1. 【功能实现】折叠手风琴

var lists = $('.option')
// each遍历
$.each(lists,function(index,value){
    $(value).click(function(e){
        // siblings()遍历出除这个元素以外的所有元素
        // 移除除这个元素以外的元素的所有active class
        $(this).siblings().removeClass('active')
        $(this).addClass('active')
    });
});
//方法二
//$('.option').each(function(){ 
//    $(this).click(function(){
//        $(this).addClass('active')
//        $(this).siblings().removeClass('active')
//    })
//})

2. 【功能实现】 卡片化标签页

// 实现选项卡功能
function init() {
    // TODO 待补充代码
    const tabs = document.querySelectorAll('.tabs div')

    const content = document.querySelectorAll('#content div')
    for (let index = 0; index < tabs.length; index++) {
        tabs[index].onclick = function() {
            for (let i = 0; i < tabs.length; i++) {
                tabs[i].classList.remove('active')
                content[i].classList.remove('active')
            }
            this.classList.add('active')
            content[index].classList.add('active')
        }
    }

}
init();

3. 【功能实现】新年贺卡

document.addEventListener('DOMContentLoaded', function () {
    const greetingDisplay = document.getElementById("greeting-display")
    const btn = document.getElementById("btn")
    // 点击开始书写按钮
    btn.addEventListener("click", () => {
        show(greetingDisplay)
    })
})

const greetings = [
    "新年快乐!",
    "接受我新春的祝愿,祝你平安幸福",
    "祝你新年快乐,洋洋得意!",
    "新的一年,新的开始;心的祝福,新的起点!",
    "新年好!祝新年心情好,身体好,一切顺心!",
]

// 随机数函数 从 greetings 随机取一个值并返回
function writeGreeting() {
    // TODO 带补充代码  
    // Math.round(n); 返回n四舍五入后整数的值。
    // Math.random() [0,1)的随机数
    let index =Math.round( Math.random()*4)
    return greetings[index]
}

/*
 * @param {*} greetingDisplay  要显示内容的dom元素
 */
//  show 将 writeGreeting 函数中返回的内容显示在 greetingDisplay 元素中
function show(greetingDisplay) {
    // TODO 待补充代码
    greetingDisplay.innerHTML=writeGreeting()
    
}

module.exports = { show, writeGreeting }

4. Flex 经典骰子布局

在这里插入图片描述


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>骰子布局</title>
    <style>
        body {
            margin: 10px 0 0 0;
            display: flex;
            justify-content: space-around;
        }
        
        body>div {
            display: flex;
            width: 100px;
            height: 100px;
            border-radius: 4px;
            border: 2px solid red;
            box-sizing: border-box;
        }
        
        p {
            width: 15px;
            height: 15px;
            background-color: black;
            border-radius: 50%;
            margin: 2px;
        }
        
        .div1 {
            justify-content: center;
            align-items: center;
        }
        /*todo:请补全剩余骰子布局代码*/
        .div2 {
            justify-content:space-around;
            flex-direction: column;
            align-items: center;
        }
        .div3 {
           align-items: center;
           justify-content: space-around;

        }
        .div3 p:nth-child(1){
            align-self:flex-start;
        }
        .div3 p:nth-child(3){
            align-self:flex-end;
        }
        .div4 {
            justify-content: space-around;
            flex-direction: column;
        }
        .div4 div {
            display: flex;
         justify-content: space-around;
        }
        .div5 {
            flex-direction: column;
            justify-content: space-around;
        }
        .div5 div {
            display: flex;
            justify-content: space-around;
        }
        .div6 {
            flex-direction: column;
            justify-content: space-around;
        
        }
        .div6 div {
            display: flex;
            justify-content: space-around;
        }
        .div7 {
            flex-direction: column;
            justify-content: space-around;
        }
        .div7 div {
            display: flex;
justify-content: space-around;
        }
        .div8 {
            justify-content: space-around;
            flex-wrap: wrap;
            align-items: center;
        }
        .div8 div {
            flex-basis: 100px;
            display: flex;
            justify-content: space-between;
        }
        .div9 {
            flex-direction: column;
            justify-content: space-around;
        }
        .div9 div{
            justify-content: space-around;
            display: flex;
        }
    </style>
</head>

<body>
    <!--骰子1-->
    <div class="div1">
        <p></p>
    </div>
    <!--骰子2-->
    <div class="div2">
        <p></p>
        <p></p>
    </div>
    <!--骰子3-->
    <div class="div3">
        <p></p>
        <p></p>
        <p></p>
    </div>
    <!--骰子4-->
    <div class="div4">
        <div>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
        </div>
    </div>
    <!--骰子5-->
    <div class="div5">
        <div>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
        </div>
    </div>
    <!--骰子6-->
    <div class="div6">
        <div>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
        </div>
    </div>
    <!--骰子7-->
    <div class="div7">
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
    </div>
    <!--骰子8-->
    <div class="div8">
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
    </div>
    <!--骰子9-->
    <div class="div9">
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
        <div>
            <p></p>
            <p></p>
            <p></p>
        </div>
    </div>
</body>

</html>

5. 【数据交互】天气预报查询

index.js


 function getweather() {
     //TODO:请补充代码
     $.get('js/weather.json',function(data,textStatus){
         let item =$('.item')
         let img,one,two,three,time
         for(let i=0;i<data.result.length;i++){
             img=item[i].children[0]
             one=item[i].children[1].children[0]
             two=item[i].children[1].children[1]
             three=item[i].children[1].children[2]
             time=item[i].children[1].children[3].children
             img.src=data.result[i].weather_icon
           one.innerText =data.result[i].weather
           two.innerText =data.result[i].temperature
           three.innerText =data.result[i].winp
           time[0].innerText=data.result[i].days
           time[1].innerText=data.result[i].week
         }
      })
}

getweather();

6.知乎首页数据动态化

注意要引入axios以及axios的使用,以及json文件路径,以及vue2语法

<template>
  <div class="list">
    <div class="list-item" v-for="(item,index) in list" :key="item+index">
      <img
        class='list-pic'
   :src='item.imgUrl'
      />
      <div class="list-info">
        <p class='title'>{{item.title}}</p>
        <p class='desc'>{{item.desc}}</p>
      </div>
    </div>
  </div>
</template>

<script>
//引入axios
import axios from 'axios'
export default {
  data() {
    return {
      list:[]
    };
  },
  created(){
  
axios.get('./static/data/list.json').then((res) => {
           this.list=res.data.data.listInfo
           console.log(this.list);
          }
        )
  }
};
</script>

7. RESTful API 开发

var express = require('express');
var app = express();
var fs = require("fs");
var path =require('path');
app.use(express.json())
app.use(express.urlencoded({ extended: false }))


//添加用户
app.post('/add', function(req, res) {
    fs.readFile(path.resolve(__dirname,'./users.json'), 'utf8', function(err, data) {
        data = JSON.parse(data);
        data["userlist"].push({
            "id": 4,
            "username": "lucy",
            "password": "123456"
        });
        res.json(data);
    });
})

//TODO:请补全获取用户列表代码
app.get('/list', function(req, res) {
    fs.readFile(path.resolve(__dirname,'./users.json'), 'utf8', function(err, data) {
        data = JSON.parse(data);
        res.json(data);
    });
})

app.listen(8080, function() {
    console.log("访问地址:http://localhost:8080")
})

module.exports = app;

8.实现卡号绑定功能

查看题

//点击绑卡按钮执行的函数
function bind(cardno, password) {
    //Todo:补充代码
    $.get('js/cardnolist.json').then(res=>{
      /**
       * some():用于检测数组中的元素是否满足指定条件(函数提供)
       * 如果有一个元素满足条件,则表达式返回true,剩余的元素不会再执行检测。
       * 如果没有满足条件的元素,则返回false。
       */
        let flag=res.cardnolist.some(item=>item.cardno===cardno&&item.password===password)
    if(flag){
        $('#tip2').removeClass('show').addClass('fade')
        $('#tip1').removeClass('fade').addClass('show')
    }else {
        $('#tip1').removeClass('show').addClass('fade')
        $('#tip2').removeClass('fade').addClass('show')
    }
})
 
}
$(document).ready(function() {
    $("#btnsubmit").click(function() {
        //卡号
        let cardno = $("#exampleInputCardno").val();
        //密码
        let password = $("#exampleInputPassword").val();
        bind(cardno, password);
    });
});

9.【功能实现】菜单树检索

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>test</title>
    <script src="./js/vue.js"></script>
    <script src="./js/axios.min.js"></script>
    <style>
        input {
            width: 200px;
            height: 32px;
            padding-left: 5px;
        }
        /* 法二 */
        /* .title {
            background-color: yellow;
        } */
    </style>
</head>

<body>
    <!-- 需求:输入待查找的字段,输出包含该字段的所有菜单数据。
    1、若该菜单有父级菜单,则返回其父级菜单及同胞菜单。
    2、若该菜单有子级菜单,则返回该菜单及其下子级菜单。
    3、若该菜单既无父级也无子级,则返回菜单本身即可。
    测试字段:查询、首页、管理、配置、维护 -->
    <div id="app">
        <input type="text" placeholder="请输入要搜索的菜单内容" v-model="title" />
        <ul>
            <li v-for="(item,index) in list" :key="item.meta.title">
                <span :style="{'background-color': item.meta.title.includes(title)&&title!==''?'yellow':''}">{{item.meta.title}}</span>
                <ul v-if="item.children">
                    <li v-for="(cln,indexC) in item.children" :key="cln.meta.title">
                        <span :style="{'background-color': cln.meta.title.includes(title)&&title!==''?'yellow':''}">{{cln.meta.title}}</span>
                    </li>
                </ul>
            </li>
        </ul>
    </div>
    <!-- 法二 -->
    <!-- <div id="app">
        <input type="text" v-model="value" placeholder="请输入要搜索的菜单内容"/>
        <ul>
            <li v-for="(item,index) in list" v-if="!item.ishide">
                <span :class="{'title':item.meta.title.includes(value)&&value}" >{{item.meta.title}}</span>
                <ul v-if="item.children">
                    <li v-for="(item2,index2) in item.children" >
                        <span :class="{'title':item2.meta.title.includes(value)&&value}" >{{item2.meta.title}}</span>
                    </li>
                </ul>
            </li>
        </ul>
    </div> -->
</body>
<script type="text/javascript" src="./js/index.js"></script>

</html>
const app = new Vue({
    el: "#app",
    // 在此处补全代码,实现二级菜单搜索功能
    data: {
        list: [],
        listData: [],
        title: ''
    },
    async created() {
        const res = await axios.get('./data.json')
        this.listData = res.data
        this.list = res.data
    },
    methods: {
        search(n) {
            //搜索函数
            this.list = []
            for (let i = 0; i < this.listData.length; i++) {
                if (this.listData[i].meta.title.includes(n)) {
                    this.list.push(this.listData[i])
                } else if (this.listData[i].children) {
                    const chilData = this.listData[i].children
                    chil: for (let cli = 0; cli < chilData.length; cli++) {
                        if (chilData[cli].meta.title.includes(n)) {
                            this.list.push(this.listData[i])
                            break chil
                        }

                    }
                }

            }
        }
    },
    watch: {
        title: (n, o) => {
            app.search(n)
        }
    }
});
//法二
// const app = new Vue({
//     el:"#app",
//     // 在此处补全代码,实现二级菜单搜索功能
//     data(){
//       return {
//         list:[],
//         value:''
//       }
//     },
//     created(){
//       axios.get('./data.json').then(res=>{
//         this.list=res.data
//       })
//     },
//     methods:{
//       screath(val){
//         this.list.forEach(item => {
//           //是否隐藏
//           item.ishide=true
//           if(item.meta.title.includes(val)){
//             item.ishide=false
//           }
//           if(item.children) {
//             item.children.forEach(item2=>{
//                if(item2.meta.title.includes(val)){
//                 item.ishide=false
//               }
//             })
//           }

//         });
//       }
//     },
//     watch:{
//       value(n,o){
//         this.screath(n)
//       }
//     }

//   });

10.【功能实现】购物车

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>购物车</title>
    <script src="./js/vue.js"></script>
    <script src="./js/axios.js"></script>
    <style>
        h4 {
            text-align: center;
        }
        
        .box-card {
            width: 200px;
            overflow: hidden;
            margin: 0 auto;
        }
        
        .box-card img {
            width: 100%;
            height: auto;
        }
        
        .bottom {
            margin: 8px 0;
        }
    </style>
</head>

<body>
    <div class="container" id="app">
        <h4>购物车</h4>
        <!--TODO 购物车列表 -->
        <div v-for="item in carlist" :key="item.id">
            <div class="box-card">
                <!-- 商品图片 img -->
                <img :src="item.img">
                <div>
                    <span>
                        <!-- 商品名称 name -->
                        {{item.name}}
                    </span>
                    <div class="bottom clearfix">
                        <button type="text" class="button">+</button>
                        <button type="text" class="button">
                            <!-- 商品数量 num -->
                            {{item.num}}
                        </button>
                        <button type="text" class="button">-</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>

    <!-- 引入组件库 -->
    <script>
        new Vue({
            el: "#app",
            data: {
                carlist: [] //购物车列表
            },
            async created() {
                //TODO 使用axios  请求购物车列表
                const res = await axios.get('./carList.json')
                this.carlist = res.data
            },
        })
    </script>
</body>




</html>

11. 【功能实现】时间管理大师

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>任务管理器</title>

    <link type="text/css" href="css/style.css" rel="stylesheet" />
</head>

<body>
    <div id="box">
        <div class="head">
            <h2>Todos</h2>
            <p>罗列日常计划,做一个时间管理大师!</p>
            <div class="input">
                <span>内容</span>
                <input type="text" placeholder="请输入你要做的事" v-model="text" />
                <span id="add" @click="add">确认</span>
            </div>
        </div>

        <ul class="list">
            <li v-if="!list.length">暂无数据</li>
            <li v-else v-for="(item,index) in list" :key="index">
                <!-- 前面的序号 -->
                <span class="xh">{{index+1}}</span>
                <!-- 列表内容 -->
                <span>{{item}}</span>
                <!-- 删除按钮 -->
                <span class="qc" @click="remove(index)"></span>
            </li>
            <!-- <li>
          <span class="xh">2</span>
          <span>吃饭</span>
          <span class="qc"></span>
        </li>
        <li>
          <span class="xh">3</span>
          <span>睡觉</span>
          <span class="qc"></span>
        </li> -->
            <li v-if="list.length">
                <b> 总数:{{list.length}} </b>
                <b id="clear" @click="clear">清除</b>
            </li>
        </ul>
    </div>
    <script src="js/vue.js"></script>
    <script>
        var top = new Vue({
            el: "#box",
            // 在此处补全代码,实现所需功能
            data: {
                list: [],
                text: ''
            },
            methods: {
                add() {
                    if (this.text !== '') {
                        this.list.push(this.text)
                        this.text = ''
                    }
                },
                remove(index) {
                    this.list.splice(index, 1)
                },
                clear() {
                    this.list = []
                }
            }


        });
    </script>
</body>

</html>

12. 【算法实现】小兔子爬楼梯

const climbStairs = (n) => {
    // TODO:请补充代码
    /**
     * 思路:分析可得第n阶梯子的跳法等于第n-1和第n-2阶梯子的跳法之和
     */
    //法一:递归思想
    if (n <= 2) {
        return n
    } else {
        return climbStairs(n - 1) + climbStairs(n - 2)
    }


    //法二:第1阶梯子有一种跳法 第2阶梯子有2种跳法,用a,b往后移代表第n-1和第n-2阶梯子的跳法
    // if (n <= 2) {
    //     return n
    // }
    // let a = 1
    // let b = 2
    // let c
    // while (n > 2) {
    //     c = a + b
    //后移a,b
    //     a = b
    //     b = c
    //     n--
    // }
    // return c


    //法三:利用解构赋值,整体思想与法二一样
    // if (n <= 2) {
    //     return n
    // }
    // let a = 1
    // let b = 2
    // while (n > 2) {
    //     // 解构赋值
    //     [b, a] = [a + b, b]
    //     n--
    // }
    // return b

};
module.exports = climbStairs;

13.【代码改错】学生信息统计

 <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById("main"));
        // 指定图表的配置项和数据
        var option = {
            title: {
                text: "学生成绩统计",
            },
            tooltip: {},
            legend: {
                data: ["成绩"],
            },
            // TODO:待补充修改代码,定义x轴数据,并让数据正确显示
            xAxis: {
                data: ["张三", "李四", "王五", "贺八", "杨七", "陈九"],
            },
            // y轴
            yAxis: {},
            series: [{
                name: "成绩",
                type: "bar",
                data: [55, 90, 65, 70, 80, 63],
            }, ],
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>

14.【算法实现】随机数生成器

/**
 * 封装函数,函数名 getRandomNum(min,max,countNum)
 * 生成 min~max 范围的 countNum 个不重复的随机数,存入数组并返回
 */
//生成指定数目和范围的随机数
// const getRandomNum = function(min, max, countNum) {
//     var arr = [];
//     for (let i = 0; i < countNum; i++) {
//         let number = Math.round(Math.random() * (max - min)) + min
//             // 如果数组里已经存在该数则重新生成
//         while (arr.indexOf(number) !== -1) {
//             number = Math.round(Math.random() * (max - min)) + min
//         }
//         arr.push(number)


//     }
//     // 在此处补全代码
//     return arr;
// };

// 法二
const getRandomNum = function(min, max, countNum) {
    var arr = [];
    // 在此处补全代码
    let set = new Set()
    while (set.size < countNum) {
        let number = Math.floor(Math.random() * (max - min)) + min;
        set.add(number)
    }
    arr = [...set]
    return arr;
};
module.exports = getRandomNum; //请勿删除
相关文章
|
28天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
44 3
|
14天前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
25天前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
23天前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
45 3
|
29天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
27 3
|
29天前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
43 2
|
2月前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
1月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
44 0
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
126 3
|
28天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
139 45