二一(GIT4)、echarts(地图)、黑马就业数据平台(学生页-增 删 改)

1. echarts 地图

  • echarts社区:makeapie echarts社区图表可视化案例

  • 社区模板代码地址:自定义 tooltip-轮播 - category-work,series-map地图,tooltip提示框,visualMap视觉映射 - makeapie echarts社区图表可视化案例

// todo: 籍贯分布 地图
function renderProvince(provinceData) {
  // console.log(provinceData);

  const chartDom = document.querySelector("#map");
  const myEchart = echarts.init(chartDom);
  const dataList = [
    { name: "南海诸岛", value: 0 },
    { name: "北京", value: 0 },
    { name: "天津", value: 0 },
    { name: "上海", value: 0 },
    { name: "重庆", value: 0 },
    { name: "河北", value: 0 },
    { name: "河南", value: 0 },
    { name: "云南", value: 0 },
    { name: "辽宁", value: 0 },
    { name: "黑龙江", value: 0 },
    { name: "湖南", value: 0 },
    { name: "安徽", value: 0 },
    { name: "山东", value: 0 },
    { name: "新疆", value: 0 },
    { name: "江苏", value: 0 },
    { name: "浙江", value: 0 },
    { name: "江西", value: 0 },
    { name: "湖北", value: 0 },
    { name: "广西", value: 0 },
    { name: "甘肃", value: 0 },
    { name: "山西", value: 0 },
    { name: "内蒙古", value: 0 },
    { name: "陕西", value: 0 },
    { name: "吉林", value: 0 },
    { name: "福建", value: 0 },
    { name: "贵州", value: 0 },
    { name: "广东", value: 0 },
    { name: "青海", value: 0 },
    { name: "西藏", value: 0 },
    { name: "四川", value: 0 },
    { name: "宁夏", value: 0 },
    { name: "海南", value: 0 },
    { name: "台湾", value: 0 },
    { name: "香港", value: 0 },
    { name: "澳门", value: 0 },
  ];
  // * 接口数据带省/自治区等字,不能直接拿来用 需双层遍历,将接口数据赋值给dataList内对应数据
  dataList.forEach((item) => {
    provinceData.forEach((res) => {
      // * includes() 返回值为布尔型
      if (res.name.includes(item.name)) {
        item.value = res.value;
      }
    });
  });
  const option = {
    title: {
      text: "籍贯分布",
      top: 10,
      left: 10,
      textStyle: {
        fontSize: 16,
      },
    },
    tooltip: {
      trigger: "item",
      formatter: "{b}: {c} 位学员",
      borderColor: "transparent",
      backgroundColor: "rgba(0,0,0,0.5)",
      textStyle: {
        color: "#fff",
      },
    },
    visualMap: {
      min: 0,
      max: 6,
      left: "left",
      bottom: "20",
      text: ["6", "0"],
      inRange: {
        color: ["#ffffff", "#0075F0"],
      },
      show: true,
      left: 40,
    },
    geo: {
      map: "china",
      roam: false,
      zoom: 1.0,
      label: {
        normal: {
          show: true,
          fontSize: "10",
          color: "rgba(0,0,0,0.7)",
        },
      },
      itemStyle: {
        normal: {
          borderColor: "rgba(0, 0, 0, 0.2)",
          color: "#e0ffff",
        },
        emphasis: {
          areaColor: "#34D39A",
          shadowOffsetX: 0,
          shadowOffsetY: 0,
          shadowBlur: 20,
          borderWidth: 0,
          shadowColor: "rgba(0, 0, 0, 0.5)",
        },
      },
    },
    series: [
      {
        name: "籍贯分布",
        type: "map",
        geoIndex: 0,
        data: dataList,
      },
    ],
  };
  myEchart.setOption(option);
}

2. 黑马就业数据平台

学生页增删改

// 调用函数 判断是否有token(登录校验)
checkLogin();

// 渲染用户名
renderName(1);

// 退出登录
logout();

// * 渲染学生信息 增删改之后需再次渲染 → 封装函数
// * 获取服务器学生列表 并渲染到页面
async function render() {
  // 已设置请求拦截器
  const res = await axios.get("/students");
  const str = res.data
    .map((item) => {
      const {
        id,
        name,
        age,
        gender,
        group,
        hope_salary,
        salary,
        province,
        city,
        area,
      } = item;
      return `
        <tr>
          <td>${name}</td>
          <td>${age}</td>
          <td>${gender === 0 ? "男" : "女"}</td>
          <td>第${group}组</td>
          <td>${hope_salary}</td>
          <td>${salary}</td>
          <td>${province + city + area}</td>
          <td data-id="${id}">
            <a href="javascript:;" class="text-success mr-3"><i class="bi bi-pen"></i></a>
            <a href="javascript:;" class="text-danger"><i class="bi bi-trash"></i></a>
          </td>
        </tr>
      `;
    })
    .join("");
  document.querySelector(".list").innerHTML = str;
  document.querySelector(".total").innerHTML = res.data.length;
}
render();

// 模态框
const modalDom = document.querySelector("#modal");
const modal = new bootstrap.Modal(modalDom);
// modal.show();

// * 省市区
// 根据name获取元素 属性选择器[name=province]
const province = document.querySelector("[name=province]");
// console.log(province);
const city = document.querySelector("[name=city]");
const area = document.querySelector("[name=area]");
async function getPCA() {
  const resP = await axios.get("/api/province");
  // console.log(resP);
  // 省份数据渲染
  province.innerHTML =
    `<option value="">--省份--</option>` +
    resP.list
      .map((item) => {
        return `<option value="${item}">${item}</option>`;
      })
      .join("");

  // 省份区域值变化时
  let pname = "";
  province.addEventListener("change", async function () {
    pname = province.value;
    // console.log(pname);

    const resC = await axios.get("/api/city", { params: { pname } });
    // console.log(resC);
    // 城市数据渲染
    city.innerHTML =
      `<option value="">--城市--</option>` +
      resC.list
        .map((item) => {
          return `<option value="${item}">${item}</option>`;
        })
        .join("");
    area.innerHTML = `<option value="">--地区--</option>`;
  });

  city.addEventListener("change", async function () {
    pname = province.value;
    let cname = city.value;
    const resA = await axios.get("/api/area", { params: { pname, cname } });
    // 地区数据渲染
    area.innerHTML =
      `<option value="">--地区--</option>` +
      resA.list
        .map((item) => {
          return `<option value="${item}">${item}</option>`;
        })
        .join("");
  });
}
getPCA();

// todo: 编辑与删除(事件委托) 代码有点长,函数封装后调用
document.querySelector(".list").addEventListener("click", function (e) {
  // 删除
  if (e.target.classList.contains("bi-trash")) {
    // console.log("删除");
    del(e.target.parentNode.parentNode.dataset.id);
  }
  // 编辑
  if (e.target.classList.contains("bi-pen")) {
    // console.log("编辑");
    edit(e.target.parentNode.parentNode.dataset.id);
    modalDom.dataset.id = e.target.parentNode.parentNode.dataset.id;
  }
});

// todo: 删除函数
async function del(id) {
  // confirm() 返回值为布尔型
  if (confirm("确定要删除吗?")) {
    await axios.delete(`/students/${id}`);
    showToast("删除成功");
    render();
  }
}

// todo: 编辑函数(点击)
// let editID = null;
async function edit(id) {
  // modalDom.dataset.id = e.target.parentNode.parentNode.dataset.id;
  // editID = id;
  // 模态框标题修改
  document.querySelector(".modal-title").innerHTML = "编辑学员";
  // 从服务器根据id获取学生详情
  const res = await axios.get(`/students/${id}`);

  // * 数据回显
  // console.log(res.data);
  // 1. 普通数据
  const keys = ["age", "group", "hope_salary", "name", "salary"];
  keys.forEach((key) => {
    document.querySelector(`[name=${key}]`).value = res.data[key];
  });

  // 2. 性别
  /* if (res.data.gender === 0) {
    document.querySelector("#cb01").checked = true;
  } else {
    document.querySelector("#cb02").checked = true;
  } */
  // document.querySelector(`#cb0${res.data.gender + 1}`).checked = true;
  const { gender } = res.data;
  const cks = document.querySelectorAll("[name=gender]");
  cks[gender].checked = true;

  // 3. 省市区
  province.value = res.data.province;

  const resC = await axios.get("/api/city", {
    params: { pname: res.data.province },
  });
  city.innerHTML =
    `<option value="">--城市--</option>` +
    resC.list
      .map((item) => {
        return `<option value="${item}">${item}</option>`;
      })
      .join("");
  city.value = res.data.city;

  const resA = await axios.get("/api/area", {
    params: { pname: res.data.province, cname: res.data.city },
  });
  area.innerHTML =
    `<option value="">--地区--</option>` +
    resA.list
      .map((item) => {
        return `<option value="${item}">${item}</option>`;
      })
      .join("");
  area.value = res.data.area;

  modal.show();
}

// todo: 新增学生
document.querySelector(".bi-plus").addEventListener("click", function () {
  // console.log(11);
  // dataset.id会将赋给其的值自动转换为字符串
  modalDom.dataset.id = "";
  // 使用removeAttribute方法来移除DOM元素的自定义属性
  // modalDom.removeAttribute("data-id");
  document.querySelector(".modal-title").innerHTML = "添加学员";
  city.innerHTML = `<option value="">--城市--</option>`;
  area.innerHTML = `<option value="">--地区--</option>`;
  modal.show();
});

// todo: 添加学生&修改学生 提交
document.querySelector("#submit").addEventListener("click", function () {
  const form = document.querySelector("#form");
  const data = serialize(form, { hash: true, empty: true });
  // 表单收集到的数据类型和服务器要求的不一致 → 数据类型转换
  data.age = +data.age;
  data.hope_salary = +data.hope_salary;
  data.salary = +data.salary;
  data.gender = +data.gender;
  data.group = +data.group;

  // 将新添数据发送到服务器
  /* if (document.querySelector(".modal-title").innerHTML.includes("添加")) {
    addStu(data);
  } else {
    editSubmit(data);
  } */
  if (modalDom.dataset.id) {
    // console.log("编辑");
    editSubmit(data);
  } else {
    // console.log("添加");
    addStu(data);
  }
  modal.hide();
  // 清空表单
  form.reset();
  /* 
  // 添加成功后 → 清空表单数据
  document.querySelectorAll(".form-control").forEach((item) => {
    item.value = "";
  });
  // 清空省市区数据
  city.innerHTML = `<option value="">--城市--</option>`;
  area.innerHTML = `<option value="">--地区--</option>`;
  // 清空性别选中状态
  document.querySelectorAll(".form-check-input").forEach((item) => {
    item.checked = false;
  }); 
  */
});

// todo: 点击确定 添加数据
async function addStu(data) {
  const res = await axios.post("/students", data);
  showToast(res.message);
  render();
}

// todo: 点击确定 修改数据
async function editSubmit(data) {
  // const res = await axios.put(`/students/${editID}`, data);
  const res = await axios.put(`/students/${modalDom.dataset.id}`, data);
  showToast(res.message);
  render();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iPhone 17 Air基本确认,3个大动作

近段时间&#xff0c;果粉圈都在讨论一个尚未发布的新品&#xff1a;iPhone 17 Air&#xff0c;苹果又要来整新活了。 从供应链消息来看&#xff0c;iPhone 17 Air本质上是Plus的替代品&#xff0c;主要是在维持“大屏”这一卖点的同时&#xff0c;增加了“轻薄”属性&#xff…

数据结构之初始二叉树(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 树型结构 树的概念 与树的有关概念 树的表示形式 树的应用 二叉树 概念 两种特殊的…

RabbitMQ七种工作模式之 RPC通信模式, 发布确认模式

文章目录 六. RPC(RPC通信模式)客户端服务端 七. Publisher Confirms(发布确认模式)1. Publishing Messages Individually(单独确认)2. Publishing Messages in Batches(批量确认)3. Handling Publisher Confirms Asynchronously(异步确认) 六. RPC(RPC通信模式) 客⼾端发送消息…

深入理解 SQL 注入:原理、攻击流程与防御措施

深入理解 SQL 注入&#xff1a;原理、攻击流程与防御措施 在当今数字化的时代&#xff0c;数据安全已成为每个企业和开发者必须面对的重要课题。SQL 注入&#xff08;SQL Injection&#xff09;作为一种常见的网络攻击方式&#xff0c;给无数企业带来了巨大的损失。本文将深入…

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…

深入探索 Compose 渲染流程:从 UI 树到 Skia 绘制的实现解析

文章目录 前言Compose 渲染流程概述1. Compose 解析1.1 Compose 声明性 UI1.2 Compose 编译1.2.1 Compose 编译概述1.2.2 代码示例1.2.3 编译过程细节 1.3 组合与重组合1.3.1 组合&#xff08;Composition&#xff09;1.3.2 重组合1.3.3 组合与重组合的区别1.3.4 组合与重组合的…

数据结构排序算法详解

数据结构排序算法详解 1、冒泡排序&#xff08;Bubble Sort&#xff09;2、选择排序&#xff08;Selection Sort&#xff09;2、插入排序&#xff08;Insertion Sort&#xff09;4、快速排序&#xff08;Quick Sort&#xff09; 1、冒泡排序&#xff08;Bubble Sort&#xff09…

命令模式的理解和实践

在软件开发中&#xff0c;设计模式是开发者们经过长期实践总结出来的、可复用的解决方案&#xff0c;用于解决常见的设计问题。命令模式&#xff08;Command Pattern&#xff09;是行为型设计模式之一&#xff0c;它通过将一个请求封装成一个对象&#xff0c;从而允许用户用不同…

【C++】关系操作符的全面解析与高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;关系操作符1.关系操作符的分类与语义2.关系操作符的连用问题3.浮点数比较的精度问题问题示例解决方案 &#x1f4af;总结核心要点 &#x1f4af;小结 &#x1f4af;前言 在…

python爬虫--某房源网站验证码破解

文章目录 使用模块爬取目标验证码技术细节实现成果代码实现使用模块 requests请求模块 lxml数据解析模块 ddddocr光学识别 爬取目标 网站验证码破解思路是统一的,本文以城市列表为例 目标获取城市名以及城市连接,之后获取城市房源信息技术直接替换地址即可 验证码 技术…

java+ssm+mysql校园物品租赁网

项目介绍&#xff1a; 使用javassmmysql开发的校园物品租赁网&#xff0c;系统包含管理员、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;用户管理&#xff1b;物品管理&#xff08;物品种类、物品信息、评论信息&#xff09;&#xff1b;订单管理&#xff1…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

Oracle系统性能监控工具oswatcher演示

1、关于 OSW OSWatcher 的使用符合 Oracle 的标准许可条款&#xff0c;并且不需要额外的许可即可使用&#xff01;&#xff01;&#xff01;&#xff01; OSWatcher (oswbb) 是一种 UNIX shell 脚本的集合&#xff0c;主要用于收集和归档操作系统和网络的度量&#xff0c;以便…

Oracle EBS PAC 如何复修非标任务单生产生非常大的PAC成本?

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 非标准任务单组件和装配相同物料A,俗称投入A产A。该物料A的期初数量为0。 上期成本假设为20,而本期成本爆增至563.674234。关键问题点: 由于该物料没有期初数量,无法通过“更新定期成本”指定“新期本…

word实践:正文/标题/表图等的共用模板样式设置

说在前面 最近使用word新建文件很多&#xff0c;发现要给大毛病&#xff0c;每次新建一个word文件&#xff0c;标题/正文的字体、大小和间距都要重新设置一遍&#xff0c;而且每次设置这些样式都忘记了参数&#xff0c;今天记录一下&#xff0c;以便后续方便查看使用。现在就以…

java抽奖系统(一)2.0

1. 项⽬介绍 1.1 背景 随着数字营销的兴起&#xff0c;企业越来越重视通过在线活动来吸引和留住客⼾。抽奖活动作为⼀种有效的营 销⼿段&#xff0c;能够显著提升⽤⼾参与度和品牌曝光率。于是我们就开发了以抽奖活动作为背景的Spring Boot项⽬&#xff0c;通过这个项⽬提供⼀…

spring 源码分析

1 IOC 源码解析 BeanDefinition: bean的定义。里面会有beanClass、beanName、scope等属性 beanClass&#xff1a;通过Class.forName生成的Class 对象beanName&#xff1a;context.getBean(“account”)&#xff0c;acount就是beanNamescope: 作用区分单例bean、原型bean Bea…

Android水波纹效果

Android水波纹效果 需要到水波纹效果的场景还蛮少的。万一刚好你需要呢 一、思路&#xff1a; 自定义组件SpreadView 二、效果图&#xff1a; 看视频更直观点&#xff1a; Android轮子分享-水波纹效果 三、关键代码&#xff1a; public class SpreadView extends View {pr…

用 NotePad++ 运行 Java 程序

安装包 网盘链接 下载得到的安装包: 安装步骤 双击安装包开始安装. 安装完成: 配置编码 用 NotePad 写 Java 程序时, 需要设置编码. 在 设置, 首选项, 新建 中进行设置, 可以对每一个新建的文件起作用. 之前写的文件不起作用. 在文件名处右键, 可以快速打开 CMD 窗口, 且路…