javaScript蓝桥杯---一起会议吧

news2024/11/28 20:55:15

目录

  • 一、介绍
  • 二、准备
  • 三、目标
  • 四、代码
  • 五、完成


一、介绍

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

本题需要在已提供的基础项目中使用 Vue 2.x 知识完善代码,最终实现网络会议软件中,参会人员列表的几个展示效果。

二、准备

开始答题前,需要先打开本题的项目代码文件夹,目录结构如下:

├── effect.gif
├── index.html
├── css
├── images
└── js
    ├── axios.min.js
    ├── userList.json
    └── vue.js

其中:

  • effect.gif 是最终实现的效果图。
  • index.html 是主页面。
  • css 是样式文件夹。
  • images 是图片文件夹。
  • js/axios.min.js 是 axios 文件。
  • js/userList.json 是需要请求的数据文件。
  • js/vue.js 是 Vue 2.x 文件。

在浏览器中预览 index.html 页面,显示如下所示:
在这里插入图片描述

三、目标

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

  1. 实现异步数据读取和渲染功能。
    • 使用 axios 异步获取 ./js/userList.json 中的用户数据(注意:调试完成后请将请求地址写死为 ./js/userList.json),并显示在登录窗口及参会人员窗口中。效果如下:
    • 在这里插入图片描述
    • 在这里插入图片描述
  2. 实现登录、注销切换功能。
    • 在登录窗口选取用户登录后,登录窗口切换为注销窗口,具体变化为:登录标题变为注销字样;选择用户下拉框变为显示当前登录用户名;登录按钮变为注销按钮。参会人员窗口显示,并默认只显示当前登录用户信息。效果如下:
    • 在这里插入图片描述
      在注销窗口点击注销按钮后,注销窗口切换为登录窗口,参会人员窗口消失。效果如下:

在这里插入图片描述
3. 实现参会列表中的首位用户始终为登录用户功能。
参会列表中的首位用户始终为登录用户。效果如下:

在这里插入图片描述
4. 实现用户窗口显隐切换功能。
通过点击隐藏参会用户窗口或显示参会用户窗口按钮图标,可切换参会人员窗口的显隐。效果如下:

在这里插入图片描述

在这里插入图片描述
5. 实现用户列表显示效果切换功能。

  • 点击显示所有参会人员的按钮图标,图标变色(即 class=active**),参会人员窗口**内的人员列表显示所有参会人员信息。效果如下:

在这里插入图片描述

注意,参会人员列表中用户名称前面的黄色小图标,代表的是该成员为会议发起者,与当前登录用户无关。与之对应的 ./js/userList.json 中的字段为 isHost,其中 “isHost”: true 为会议发起人,“isHost”: false 为普通参会成员。

点击最左侧的不显示参会人员列表的按钮图标,图标变色(即 class=active**),参会人员窗口**内的人员列表隐藏。效果如下:

在这里插入图片描述
点击只显示当前登录用户的按钮图标,图标变色(即 class=active**),参会人员窗口**内的人员列表中只显示当前登录用户信息。效果如下:

在这里插入图片描述
最终完成图:
在这里插入图片描述

四、代码

index.html

<!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>登录</h3>
        <p>
          选择用户:<select id="selectUser">
            <option value="1">Tom</option>
          </select>
        </p>
        <p>当前用户为:Tom</p>

        <a class="login-btn">登录</a>
      </div>

      <!-- 右侧显示用户列表窗口按钮 -->
      <button id="show" class="right-btn">
        <span class="iconfont icon-left-arrow"></span>
      </button>

      <!-- 用户列表窗口 -->
      <div class="user-dialog">
        <!-- 用户列表窗口上侧工具栏 -->
        <ul class="tools">
          <li class="tools-left">
            <button>
              <span class="iconfont icon-close"></span>
            </button>
            <button>
              <span class="iconfont icon-dialog"></span>
            </button>
            <button class="active">
              <span class="iconfont icon-list"></span>
            </button>
          </li>
          <li class="tools-right">
            <button class="show-list">
              <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>正在讲话:Tom;</li>
        </ul>
        <ul class="user-list">
          <li>
            <img class="header" src="./images/header1.png" />
            <div class="user-name">
              <span class="iconfont icon-user header-icon"></span>
              <span class="iconfont icon-microphone"></span>
              Tom
            </div>
          </li>
          <li>
            <img class="header" src="./images/header2.png" />
            <div class="user-name">
              <span class="iconfont icon-microphone"></span>
              Lily
            </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",
      });
    </script>
  </body>
</html>

js/userList.json

[
  {
    "id": "1",
    "name": "Tom",
    "imgPath": "./images/header1.png",
    "isHost": true
  },
  {
    "id": "2",
    "name": "Lily",
    "imgPath": "./images/header2.png",
    "isHost": false
  }
]

css/index.css

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body {
  font-size: 12px;
}
button {
  background-color: transparent;
  border: none;
  color: white;
  cursor: pointer;
}
ul {
  list-style: none;
}
a {
  cursor: pointer;
}
.login {
  width: 360px;
  font-size: 14px;
  border-radius: 8px;
  height: 500px;
  position: absolute;
  left: 50%;
  top: 50px;
  transform: translateX(-50%);
  box-shadow: 5px 5px 10.1px #cbc7c7;
}
.login h3 {
  text-align: center;
  padding: 50px 0 60px 0;
}
.login select {
  width: 70%;
  height: 30px;
  border: 1px solid #1579f7;
}
.login p {
  padding: 10px;
  text-align: center;
  width: 76%;
  margin: 0 auto;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.login-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 76%;
  height: 40px;
  background-color: #1579f7;
  color: white;
  margin: 0px auto;
  border-radius: 2px;
  margin-top: 50px;
  font-size: 16px;
}
.right-btn {
  position: fixed;
  top: 100px;
  right: 0;
  display: block;
  width: 30px;
  height: 36px;
  background-color: #686767;
  border-top-left-radius: 18px;
  border-bottom-left-radius: 18px;
  color: white;
  display: flex;
  align-items: center;
  padding-left: 10px;
  box-shadow: 5px 5px 10.1px #9e9696;
}
.user-dialog {
  position: fixed;
  z-index: 99;
  right: 100px;
  top: 100px;
  width: 300px;
  background-color: #333333;
  border-radius: 6px;
  color: white;
  overflow: hidden;
  box-shadow: 5px 5px 10.1px #9e9696;
}
.tools {
  display: flex;
  height: 44px;
  justify-content: space-between;
  padding: 0 15px;
  align-items: center;
}
.tools-left {
  width: 100px;
  display: flex;
  justify-content: space-between;
}
.say-list {
  display: flex;
  align-items: center;
  height: 44px;
  background-color: dimgrey;
}
.say-list > li:nth-child(1) {
  min-width: 40px;
  padding: 0 15px;
}
.line {
  height: 30px;
  width: 1px;
  background-color: #333333;
  margin-right: 10px;
}
.user-list {
  width: 100%;
}
.user-list > li {
  height: 130px;
  background-color: dimgrey;
  margin-top: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
}
.user-name {
  position: absolute;
  left: 0;
  bottom: 0;
  height: 30px;
  background-color: #444444;
  display: flex;
  padding: 0 5px 0 2px;
  align-items: center;
}
.header-icon {
  width: 22px;
  height: 22px;
  background-color: orange;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 18px !important;
}
.user-name span {
  padding: 0 3px;
}
.header {
  display: block;
  width: 100px;
  height: 100px;
  border-radius: 50%;
}
.active {
  color: #0077aa;
}

.left-tools {
  padding-left: 15px;
  height: 32px;
  display: flex;
  align-items: center;
}
.close-btn {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: red;
}
.shrink-btn {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #ffa100;
  margin-left: 8px;
}

五、完成

index.html

<!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>{{loinOrlogout}}</h3>
        <p v-if="!isShow">
          选择用户:<select v-model="indexUser" id="selectUser">
            <option v-for="item in list" :value="item.name">
              {{item.name}}
            </option>
          </select>
        </p>
        <p v-else>当前用户为:Tom</p>

        <a @click="login" class="login-btn">{{loinOrlogout}}</a>
      </div>

      <!-- 右侧显示用户列表窗口按钮 -->
      <button v-if="isShow&&isShowRbtn" @click="showUserList" id="show" class="right-btn">
        <span class="iconfont icon-left-arrow"></span>
      </button>

      <!-- 用户列表窗口 -->
      <div v-if="isShowUserList&&isShow" class="user-dialog">
        <!-- 用户列表窗口上侧工具栏 -->
        <ul class="tools">
          <li class="tools-left">
            <button @click="changeBtnActive(false,false,1)" :class="{'active': buttonIndex==1 ? true : false}">
              <span class="iconfont icon-close"></span>
            </button>
            <button @click="changeBtnActive(true,false,2)"  :class="{'active': buttonIndex==2 ? true : false}">
              <span class="iconfont icon-dialog"></span>
            </button>
            <button @click="changeBtnActive(true,true,3)" :class="{'active': buttonIndex==3 ? true : false}">
              <span class="iconfont icon-list"></span>
            </button>
          </li>
          <li @click="showUserList" class="tools-right">
            <button class="show-list">
              <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>正在讲话:Tom;</li>
        </ul>
        <ul v-if="isShow" class="user-list">
          <li v-if="isShowIndexUser">
            <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>
          <li
            v-for="item in list"
            v-if="item.name!=user.name&&isShowOtherUser"
          >
            <img class="header" :src="item.imgPath" />
            <div class="user-name">
              <span v-if="item.isHost&&changeBtnActive" class="iconfont icon-user header-icon"></span>
              <span class="iconfont icon-microphone"></span>
              {{item.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() {
          return {
            list: [],
            indexUser: "Tom",
            isShow: false,
            isShowRbtn:false,
            isShowUserList:true,
            isShowOtherUser:false,
            isShowIndexUser:true,
            user: "",
            buttonIndex:2
          };
        },
        mounted() {
          this.getData();
        },
        computed: {
          loinOrlogout() {
            return this.isShow ? "注销" : "登录";
          },
        },
        methods: {
          //异步获取数据
          async getData() {
            const res = await axios({ url: "./js/userList.json" });
            this.list = res.data;
            console.log(res.data);
          },
          changeBtnActive(userFlag,otherUserFlag,value){
            this.isShowIndexUser=userFlag
            this.isShowOtherUser=otherUserFlag
            this.buttonIndex=value
          },
          showUserList(){
            this.isShowUserList=!this.isShowUserList
            this.showRbtn()
          },
          showRbtn(){
            this.isShowRbtn=!this.isShowRbtn
          },
          //登录
          login() {
            this.isShow = !this.isShow;
            this.user=this.list.find(item=>item.name==this.indexUser)
            console.log(this.user);
          },
        },
      });
    </script>
  </body>
</html>

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

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

相关文章

javaScript蓝桥杯----权限管理

目录 一、介绍二、准备三、目标四、代码五、知识点六、完成 一、介绍 你有没有想过&#xff0c;在我们日常浏览的网页中&#xff0c;那些新闻或者商品内容是如何被输入到数据库中的呢&#xff1f;大家虽然没有用过&#xff0c;但是肯定听过“后台管理系统”&#xff0c;运营人…

从零开始的软路由之爱快虚拟机搭建openwrt

缘起 上篇文章我们介绍了爱快软路由的搭建方法&#xff0c;成功了实现了软路由的初级布置——能上网了。接下来就是搭建双软路由中的另一个openwrt了&#xff0c;上期介绍了爱快的特点&#xff0c;主要是用来多拨&#xff0c;分流&#xff0c;流控等操作&#xff0c;在这些方面…

maven 插件 assembly 打tar.gz包

maven 插件 assembly 打tar.gz包 一、项目目录二、pom文件1. profiles2. plugins3. resource 三、assembly.xml四、application.yml五、启动脚本1. start.sh2. stop.sh 六、执行 mvn 打包命令七、tar.gz 包上传服务器并解压八、执行 start.sh 启动脚本九、访问 swagger GitHub:…

Tomcat的部署及优化(贼详细)

目录 一、Tomcat服务器简介 1、Tomcat服务器 2、Tomcat三大核心组件 3、 Java Servlet 4、JSP全称Java Server Pages 5、 Tomcat 功能组件结构 6、 Container 结构分析 7、Tomcat 请求过程 二&#xff1a;Tomcat部署与安装 1.关闭防火墙&#xff0c;上传所需软件包 2.安…

跨部门沟通与协作迟迟进展不下去,如何有效解决问题?

在一个完整的项目中&#xff0c;多个专业技能版块的联动是必不可少的。然而&#xff0c;由于各个部门之间工作交集的存在&#xff0c;跨部门沟通与协作成为了必经之路&#xff0c;需要我们各部门凝聚力量&#xff0c;携手闯关。 但是&#xff0c;在工作中总会出现各种问题&…

05_MySQL索引优化

四种&#xff1a;1.主键 2.单值 3.唯一 4.复合 1. 性能分析&#xff08;explain&#xff09; mysql5.6以后优化器做了很多改进&#xff0c;执行时会自动进行大量的优化&#xff0c;很多现象需要在5.5才能演示成功。 1.1 explain是什么? 模拟优化器查看执行计划 使用EXPLAIN关…

python基础----09-----类、对象、魔法方法、封装、继承、类型注解、多态

一 初识对象 说白了就是类的实例化&#xff0c;类是一个抽象层的定义。 例如下面class Student就是定义的一个类&#xff0c;它是抽象层&#xff0c;然后stu_1 Student()&#xff0c;我们根据类创建了一个对象&#xff0c;就是对类的实例化&#xff0c;这个实例化对象我们是可…

FinalShell界面左侧为什么能够监测系统指标动态变化的原理

前言&#xff1a; 我们可以看出FinalShell是用Java写的&#xff0c;具体怎么看出来的&#xff0c;不能光看界面logo是Java的logo&#xff0c;还要进它的安装目录下进行查看是否真是用Java编写的&#xff01;&#xff01;&#xff01; 具体查看如下&#xff1a; 查看finalshe…

Qt+QtWebApp开发笔记(五):http服务器html中使用json触发ajax与后台交互实现数据更新传递

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/131122772 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

如何规划和执行安全测试

如何规划和执行安全测试 在现代软件开发中&#xff0c;安全测试已经成为一个必不可少的环节。在完成软件开发后&#xff0c;需要对应用程序进行安全测试&#xff0c;以确保其可以在生产环境中正常运行并能够抵御各种安全攻击和漏洞。 如何规划和执行安全测试是一个重要的问题&a…

Microsoft Excel中HYPERLINK函数的6个用途

Excel 在工具栏中提供了自己的内置链接功能。但 HYPERLINK 功能可以让你做更多的事情,比如公司内部网上的工作簿链接、共享服务器、其他驱动器,甚至 Word 文档中的书签。让我们来看看使用这个多功能功能可以做的一切。 HYPERLINK函数的6个用途 链接到电子表格中的单元格链接到…

概率论:方差、标准差、协方差、皮尔逊相关系数、线性相关

方差和标准差&#xff1a; 一个随机变量&#xff0c;的值的变化程度可以用方差计算&#xff1a; &#xff1b;其中 是期望。 我们举个例子&#xff1a; 服从均一分布&#xff0c;取值为0.1&#xff0c;0.2&#xff0c;0.3&#xff0c;0.4&#xff0c;0.5 &#xff0c;每种值…

springboot 精华

一、基础 官方文档地址&#xff1a;Spring Boot 注&#xff1a;以下部分例子 有些用到 .properties 方式&#xff0c;有些用 .yml方式&#xff0c;两者可自行学习&#xff0c;这里部分是为了省空间而写 .properties 方式。 1、泛谈 &#xff08;1&#xff09;优势 快速构建…

MyBatis Plus 拦截器实现数据权限控制(完整版)

一、说明 变化&#xff1a;相比于之前写的数据权限拦截器&#xff0c;新增了白名单功能&#xff0c;通过注解的方式让哪些SQL不进行数据权限拦截&#xff0c;之前的文章地址 思路&#xff1a;通过MyBatisPlus的拦截器对每个要执行的SQL进行拦截&#xff0c;然后判断其是否为查询…

勒索病毒远程桌面——防御方案

一、适用目标&#xff08;校园网、企业网&#xff0c;windows系列的操作系统&#xff09;&#xff1a; 所有在局域网内运行windows系统的电脑&#xff0c;并非只感染服务器操作系统&#xff0c;单机照样感染。会将你电脑中的所有文件全部加密&#xff0c;部分已感染案例有2个共…

常见的存储类型:DAS vs SAN vs NAS

什么是存储 你有想过你在朋友圈分享的照片都存在哪里&#xff1f;你在视频网站上浏览的视频都存放在哪里&#xff1f;甚至&#xff0c;你在银行卡里的存款、房贷是如何随时查询、随时存取的&#xff1f; 没错&#xff0c;这些照片、视频&#xff0c;甚至你的存款、房贷的数值…

机器学习-6 支持向量机

支持向量机 算法概述算法流程线性分类线性可分性向量内积硬间隔分类软间隔SVM模型非线性支持向量机非线性的情况非线性支持向量机核函数 SVM优点 算法步骤线性可支持向量机的程序流程图SVM算法步骤 算法实例有关数据集利用Sklearn的datasets模块生成数据集其他生成数据集的方法…

BIM与点云:一种基于航空LiDAR点云的大规模建筑重建

文章&#xff1a;City3D: Large-Scale Building Reconstruction from Airborne LiDAR Point Clouds 作者&#xff1a;Jin Huang , Jantien Stoter , Ravi Peters and Liangliang Nan 编辑&#xff1a;点云PCL 来源&#xff1a;arXiv2023 欢迎各位加入知识星球&#xff0c;获取P…

GeoServer SQL注入漏洞复现(CVE-2023-25157)

0x01 产品简介 GeoServer是一款开源的地理数据服务器软件&#xff0c;主要用于发布、共享和处理各种地理空间数据。它支持众多的地图和空间数据标准&#xff0c;能够使各种设备通过网络来浏览和使用这些地理信息数据。 0x02 漏洞概述 GeoServer在预览图层的时候&#xff0c;可…

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例

文章目录 1.1 准备服务器的基本信息1.2 操作系统上创建其用户1.3 部署MongoDB服务端1.4 部署MongoDB客户端1.5 部署MongoDB 27017实例1.5.1 创建相关目录1.5.2 准备配置文件1.5.3 准备启停脚本1.5.4 进行启停测试1.5.5 加入开机自启动 1.6 创建超级管理员用户1.6.1 创建本地的超…