Web前端105天-day62-HTML5_CORE

news2024/11/19 23:31:14

HTML5CORE02

目录

前言

一、复习

二、拖拽

三、上传服务器

四、Canvas

五、地图

总结


前言

HTML5CORE02学习开始


一、复习

  • 跨域
    • 浏览器的同源策略导致
    • 在网页中, 通过 AJAX 发送网络请求时, 默认只能向同源的服务器请求
    • 同源: 协议 端口号 域名 三者都相同
  • 产生跨域的原因: 目前流行前后端分离 开发模式
  • 由于 静态网页服务器接口服务器 非同源, 所以产生跨域问题
  • 解决方案:
    • CORS: 最佳的解决方案
      • 在服务器利用 cors 模块解决即可
      • 原理: 接口服务器告知浏览器, 允许其他来源的访问
    • PROXY: 代理模式 -- 适合临时解决
      • 服务器无法添加cors 的场景
      • 采用 express-http-proxy模块 转发请求
    • JSONP
      • 利用 script 的 src 获取数据没有跨域限定
      • 需要 服务器 和 前端配合, 共同解决跨域问题
  • 文件上传
    • 服务器端
    • 使用 multer 模块实现
const upload = multer({
    storage: multer.diskStorage({
        desctination: 'upload', // 存放上传文件的目录
        filename(req, file, cb){
            // 根据上传的文件信息, 提供存储时 对应的文件名
        }
    })
})
  • 前端
    • Form表单模式
      • 由于功能过于单一, 使用较少
    • DOM模式
      • 通过DOM操作, 手动制作 FormData 对象
        • 验证数据大小
        • 验证数据的格式
      • 利用 AJAX 实现文件上传
        • 监听上传进度, 来实现进度条

二、拖拽

<!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>拖拽操作 09:15</title>

  <style>
    #box {
      background-color: #bbb;
      width: 500px;
      height: 300px;
    }
  </style>
</head>

<body>
  <!-- HTML5中 新增了拖拽操作 -->
  <!-- 默认 图片 和 超链接 均支持拖拽, 其他标签不支持 -->
  <img id="img1" src="./imgs/smallskin-1.jpg" width="100" alt="">
  <a id="a1" href="http://www.baidu.com">百度一下</a>
  <!-- draggable: 控制是否可以拖拽 -->
  <p draggable="true" id="p1">Hello P!</p>

  <div id="box"></div>

  <script>
    const a1 = document.getElementById('a1')
    a1.ondragstart = function (e) {
      e.dataTransfer.setData('text', 'a1')
    }

    const img1 = document.getElementById('img1')
    img1.ondragstart = function (e) {
      e.dataTransfer.setData('text', 'img1')
    }


    const p = document.querySelector('p')
    // 在用户开始拖拽元素时触发
    p.ondragstart = function (e) {
      console.log('p被拖拽 ondragstart', e)
      // dataTransfer: 数据传输者 -- 用于在事件中保存一些信息
      // setData: 用于设置数据
      // 参数1: 固定的值,  'text' 代表文本类型的信息
      // 参数2: 自定义的值, 此处 p1 是拖拽的元素的id
      e.dataTransfer.setData('text', 'p1')
    }
    // 处于拖拽状态时, 每隔 350毫秒, 0.35秒 触发一次
    p.ondrag = function (e) {
      // console.log('p被拖动 ondrag', e);
    }
    // 拖动结束时
    p.ondragend = function (e) {
      console.log('拖动结束 ondragend');
    }

    //
    // 盒子
    const box = document.getElementById('box')

    box.ondragenter = function () {
      console.log('拖拽元素进入盒子范围 ondragenter');
    }
    // 每隔350ms 触发一次
    box.ondragover = function (e) {
      // console.log('拖拽元素在盒子范围内 ondragover');
      // 默认事件操作: 不允许元素被放下到盒子里
      // 阻止事件的默认行为, 盒子不会排斥拖拽的元素
      e.preventDefault()
    }

    box.ondragleave = function () {
      console.log('拖拽元素离开盒子范围 ondragleave');
    }

    // 检测到有元素被放置到盒子中
    box.ondrop = function (e) {
      // 问题: 如何区分被放下的元素是什么?
      console.log('有元素被放下 ondrop:', e)

      // 读取数据传输者中 存放的信息
      var el_id = e.dataTransfer.getData('text')
      // 通过id 读取被放下的元素
      var el = document.getElementById(el_id)
      // 添加到盒子里
      box.appendChild(el)
    }
  </script>
</body>

</html>
  • 文件拖拽
<!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>文件拖拽 10:21</title>

  <style>
    #box {
      background-color: #aaa;
      width: 300px;
      height: 300px;
    }
  </style>
</head>

<body>
  <button>上传</button>
  <div id="box"></div>

  <script>
    const box = document.getElementById('box')

    // 阻止路过自身上方的元素的默认行为
    box.ondragover = function (e) {
      e.preventDefault()
    }

    box.ondrop = function (e) {
      e.preventDefault()

      console.log('被放下的元素', e);
      console.log(e.dataTransfer.files);

      var file = e.dataTransfer.files[0]
      this.innerHTML = file.name
    }
  </script>
</body>

</html>

三、上传服务器

  • 1.制作文件夹:upload-server
  • 2.初始化命令: npm init -y
  • 3.安装模块: npm i express uuid multer cors
  • 4.制作 app.js 文件, 完成基本服务器的启动代码, 端口3000
  • 5.制作静态文件夹 public
    • app.js 中, 指定 public 为静态托管文件夹
    • 在 public 下创建 index.html , 书写 h1 标签, 显示 欢迎 文字
    • 把 jquery.min.js 引入到 public 目录中
  • 6.在 app.js 中添加 multer 模块, 完成单文件的一系列操作
    • 指定 upload 目录保存上传文件
    • 个性化 配置上传文件的名字
    • 添加 post方式的 /upload 接口, 用于接收单文件
const express = require('express');
const cors = require('cors');
const uuid = require('uuid');
const multer = require('multer');

const app = express()
app.listen(3000, () => {
  console.log('服务器启动');
})

app.use(express.static('public'))

app.use(cors())

const upload = multer({
  storage: multer.diskStorage({
    destination: 'upload',
    filename(req, file, cb) {
      var dian_index = file.originalname.lastIndexOf('.')
      var ext = file.originalname.substr(dian_index)

      cb(null, uuid.v4() + ext)
    }
  })
})

// 单文件
app.post('/upload', upload.single('avatar'), (req, res) => {
  res.send(req.file)
})

// 多文件
// 变化1: upload.array  代表收到的文件是多个
// 变化2: req.files 代表多个文件的信息
app.post('/uploads', upload.array('avatars'), (req, res) => {
  res.send(req.files)
})
  • 单文件
<!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>
  <style>
    #box {
      background-color: #aaa;
      height: 200px;
      padding: 10px;
    }
  </style>
</head>

<body>
  <h1>欢迎使用文件上传</h1>
  <!-- 不要使用live server, 会导致上传后 自动刷新 -->
  <div id="box"></div>
  <button>上传</button>

  <script src="./jquery-3.6.1.min.js"></script>
  <script>
    let files = null //用于存放拖拽的文件信息

    $('#box')
      .on('dragover', function (e) {
        e.preventDefault()
      })
      .on('drop', function (e) {
        // jQuery触发的事件参数 e  是经过封装的, 并非原生的事件参数
        // 其中的 originalEvent 存储了原生的事件参数
        e.preventDefault()
        console.log('drop', e);
        // 存放到全局的 files 属性
        files = e.originalEvent.dataTransfer.files
        console.log('files', files);

        $('#box').empty() //清空
        for (const file of files) {
          $('#box').append(`<div>${file.name}</div>`)
        }
      })

    // 单文件上传
    $('button').click(function () {
      // FormData
      var fd = new FormData()
      fd.append('avatar', files[0])

      $.ajax({
        type: 'post',
        data: fd,
        contentType: false,
        processData: false,
        url: 'http://localhost:3000/upload',
        success(res) {
          console.log(res);
        }
      })
    })
  </script>
</body>

</html>
  • 多文件
<!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>
  <style>
    #box {
      background-color: #aaa;
      height: 200px;
      padding: 10px;
    }
  </style>
</head>

<body>
  <h1>欢迎使用文件上传</h1>
  <!-- 不要使用live server, 会导致上传后 自动刷新 -->
  <div id="box"></div>
  <button>上传</button>

  <script src="./jquery-3.6.1.min.js"></script>
  <script>
    let files = null //用于存放拖拽的文件信息

    $('#box')
      .on('dragover', function (e) {
        e.preventDefault()
      })
      .on('drop', function (e) {
        // jQuery触发的事件参数 e  是经过封装的, 并非原生的事件参数
        // 其中的 originalEvent 存储了原生的事件参数
        e.preventDefault()
        console.log('drop', e);
        // 存放到全局的 files 属性
        files = e.originalEvent.dataTransfer.files
        console.log('files', files);

        $('#box').empty() //清空
        for (const file of files) {
          $('#box').append(`<div>${file.name}</div>`)
        }
      })

    // 单文件上传
    $('button').click(function () {
      // FormData
      var fd = new FormData()
      // 多文件, 用变量进行数据的添加
      for (const file of files) {
        fd.append('avatars', file)
      }

      $.ajax({
        type: 'post',
        data: fd,
        contentType: false,
        processData: false,
        url: 'http://localhost:3000/uploads',
        success(res) {
          console.log(res);
        }
      })
    })
  </script>
</body>

</html>

四、Canvas

  • 入门
<!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>canvas 14:01</title>
  <style>
    /* 图片具有两种宽高: 1.原始宽高  2.显示宽高 */
    /* canvas上设置的 width 和 height 是图片的原本宽高 */
    /* css 上设置的是 图片显示的宽高 */
    #c1 {
      /* 显示时, 宽高与原图不同, 则会拉伸 或 压缩 */
      width: 400px;
      /* height: 800px; */
    }
  </style>
</head>

<body>
  <!-- canvas : 画布;  来自HTML5 新增的标签, 赋予了 HTML 画图能力 -->
  <!-- 可以利用 JS 代码来 实时绘制图片 -->
  <!-- 场景: 地图, 图表, 网页游戏... -->
  <!-- 实时根据数据, 绘制不规则的 样式丰富的 图形 -->

  <!-- width: 设置画布的宽度 -->
  <!-- height: 设置画布的高度 -->
  <canvas id="c1" width="400" height="400" style="background-color: gray;"></canvas>

  <script>
    // 通过规范的注释, 告诉vscode 变量c1 的类型是画布, 才能得到提示
    /** @type {HTMLCanvasElement} */
    var c1 = document.getElementById('c1')
    console.dir(c1)

    // 1.找到 画布中提供的 绘制工具
    // 使用说明: https://www.runoob.com/tags/ref-canvas.html
    var ctx = c1.getContext('2d') //绘制2d图形的工具箱
    console.log(ctx)

    ctx.strokeStyle = 'green' //笔触的颜色    
    ctx.lineWidth = 5  // 默认单位 px
    // 左上角的坐标x,y ;   宽和高
    ctx.strokeRect(50, 50, 150, 150)

    // 在 60,60  坐标,  绘制 120, 120 宽高的 填充矩形, 填充红色red
    ctx.fillStyle = 'red'
    ctx.fillRect(60, 60, 120, 120)

    // 画一条线: 把画笔移动到起始点 -- 60,60
    // 线段颜色 blue
    // 移动到 180, 180 坐标
    // 开始画线
    ctx.beginPath() // 开始绘制路径
    ctx.moveTo(60, 60) // 从60,60坐标开始
    ctx.lineTo(180, 180) // 画线到指定坐标
    ctx.strokeStyle = 'blue'  //线的颜色
    ctx.stroke() // 绘制
  </script>
</body>

</html>
  • 柱状图
<!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>练习 15:16</title>
</head>

<body>
  <canvas id="c1" width="800" height="300" style="background-color: #bbb;"></canvas>

  <script>
    var data = [
      { value: 146, color: 'pink' },
      { value: 72, color: 'black' },
      { value: 60, color: 'orange' },
      { value: 102, color: 'blue' },
      { value: 75, color: '#ff68b5' },
      { value: 43, color: '#fea600' },
      { value: 120, color: '#ce8540' },
    ]

    /** @type {HTMLCanvasElement} */
    var c1 = document.getElementById('c1')

    var ctx = c1.getContext('2d')

    // 坐标轴的竖线
    ctx.beginPath()
    ctx.moveTo(20, 20)
    ctx.lineTo(20, 280)
    ctx.lineTo(780, 280)
    ctx.stroke()

    // 竖着
    data.forEach((item, index) => {
      const { value, color } = item

      var h = 20
      var space = 10 //距离
      var x = 21
      var w = value
      var y = 280 - (index + 1) * (h + space)

      ctx.fillStyle = color
      ctx.fillRect(x, y, w, h)
    })

    // 横着
    // data.forEach((item, index) => {
    //   const { value, color } = item

    //   // 矩形左上角的 y
    //   var y = 280 - value
    //   var w = 50 //宽度
    //   var space = 20 //间距
    //   var h = value //高
    //   var x = (index + 1) * space + index * w + 20

    //   ctx.fillStyle = color
    //   ctx.fillRect(x, y, w, h)
    // })
  </script>
</body>

</html>
  • 文本绘制
<!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>绘制文本 16:16</title>
</head>

<body>
  <canvas id="c1" width="500" height="500" style="background-color: #ccc;"></canvas>

  <script>
    /** @type {HTMLCanvasElement} */
    var c1 = document.getElementById('c1')

    var ctx = c1.getContext('2d')

    // 渐变色:
    var co = ctx.createLinearGradient(0, 0, 250, 50)
    co.addColorStop(0, 'blue') // 开头的颜色
    co.addColorStop(0.5, 'purple') // 一半的颜色
    co.addColorStop(1, 'brown') // 最后的颜色

    ctx.fillStyle = co

    ctx.font = '50px 微软雅黑'
    // 参数2 和 参数3: 代表文本的左下角坐标
    ctx.fillText("填充的文本", 10, 50)

    ctx.font = '50px 微软雅黑'
    ctx.strokeText('描边文本', 10, 120)
  </script>
</body>

</html>

五、地图

  • 文档地址:高德开放平台 | 高德地图API

  •  按照教程准备进行操作
    • 登录账号以后, 在控制台创建新应用
    • 名称和类型 根据实际情况填写, 可以随便写

  •  添加一个key: 类似玩游戏时 要先新建角色

<!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>map 16:32</title>

  <style>
    #container {
      width: 500px;
      height: 500px;
    }

    .home {
      list-style: none;
      margin: 0;
      background-color: #eee;
      border-radius: 4px;
      padding: 4px;
    }
  </style>
</head>

<body>
  <!-- 地图: 百度地图, 腾讯, 谷歌, 高德... -->
  <!-- 这些厂商 开发了一些地图的API 可以使用 -->
  <!-- 高德地图开放平台: https://lbs.amap.com/ -->

  <div id="container"></div>

  <script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: '1c93d9f935422a937e3e4352acd10b6a',
    }
  </script>
  <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=6f7aeb74b1f6e28d7d820dbc7eb9f315"></script>

  <script>
    // 快速上手
    // 把 #container 初始化为地图
    // 参数1: 把 指定id的元素, 转换成地图
    // 参数2: 各种配置
    var map = new AMap.Map('container', {
      zoom: 11, //缩放级别
      // 坐标拾取器, 可以获取地址的经纬度
      // https://lbs.amap.com/tools/picker
      center: [116.39, 39.9], //中心点坐标
      viewMode: '3D', // 使用功能 3D 视图
      layers: [//使用多个图层
        new AMap.TileLayer.Satellite(),
        new AMap.TileLayer.RoadNet()
      ],
    });

    //实时路况图层
    var trafficLayer = new AMap.TileLayer.Traffic({
      zIndex: 10
    });
    map.add(trafficLayer);//添加图层到地图

    // 标记点
    var marker = new AMap.Marker({
      position: [116.39, 39.9]//位置
    })
    map.add(marker);//添加到地图

    // 标记点 点击弹窗
    var infoWindow = new AMap.InfoWindow({ //创建信息窗体
      isCustom: true,  //使用自定义窗体
      content: `<ul class="home">
        <li>亮亮的小屋</li>
        <li>营业时间  09:00 - 22:00</li>
        <li>联系方式: 18811718888</li>
        </ul>`, //信息窗体的内容可以是任意html片段
      offset: new AMap.Pixel(16, -45)
    });
    var onMarkerClick = function (e) {
      infoWindow.open(map, e.target.getPosition());//打开信息窗体
      //e.target就是被点击的Marker
    }
    var marker = new AMap.Marker({
      position: [116.481181, 39.989792]
    })
    map.add(marker);
    marker.on('click', onMarkerClick);//绑定click事件

    // 插件的使用:
    AMap.plugin('AMap.ToolBar', function () {//异步加载插件
      var toolbar = new AMap.ToolBar();
      map.addControl(toolbar);
    });

    AMap.plugin(['AMap.ToolBar', 'AMap.MapType', 'AMap.Scale', 'AMap.HawkEye', 'AMap.Geolocation'], function () {//异步同时加载多个插件
      var toolbar = new AMap.ToolBar();
      map.addControl(toolbar);

      var maptype = new AMap.MapType()
      map.addControl(maptype)

      var scale = new AMap.Scale()
      map.addControl(scale)

      var hawkeye = new AMap.HawkEye({ position: 'LT' })
      map.addControl(hawkeye)

      var geolocation = new AMap.Geolocation()
      map.addControl(geolocation)
    });


    //加载天气查询插件
    AMap.plugin('AMap.Weather', function () {
      //创建天气查询实例
      var weather = new AMap.Weather();

      //执行实时天气信息查询
      weather.getLive('北京市', function (err, data) {
        console.log(err, data);
      });
    });
  </script>
</body>

</html>


总结

HTML5CORE02学习结束

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

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

相关文章

杰华特科创板上市:市值227亿 华为英特尔联想是股东

雷递网 雷建平 12月23日杰华特微电子股份有限公司&#xff08;简称&#xff1a;“杰华特”&#xff0c;股票代码为&#xff1a;“688141” &#xff09;今日在科创板上市&#xff0c;发行价为38.26元。杰华特此次发行5808万股&#xff0c;发行价为38.26元&#xff0c;募资总额为…

32天高效突击:开源框架+性能优化+微服务架构+分布式,面阿里获P7(脑图、笔记、面试考点全都有)

今年的大环境不佳&#xff0c;所以大部分的人在今年的招聘旺季都没有收获到好的结果。 但不要着急&#xff0c;今天分享的内容则是由 一位阿里P7的面试心得&#xff0c;通过32天的高效突击训练&#xff0c;成功拿下offer的学习方法。 篇章分为三大章节&#xff0c;可以根据自…

【TypeScript】类型兼容性与交叉类型讲解

目录 类型兼容性 对象类型兼容性 接口类型兼容性 函数类型兼容性 交叉类型 类型兼容性 在TS中&#xff0c;类型采用的是结构化类型系统&#xff0c;也叫做 duck typing&#xff08;鸭子类型&#xff09;&#xff0c;类型检查关注的是值所具有的形状。也就是说&#xff0c…

C. Building a Fence(范围判定)

Problem - 1469C - Codeforces 你想建造一个由n个相等部分组成的栅栏。所有部分的宽度都等于1&#xff0c;高度都等于k。 不幸的是&#xff0c;篱笆下面的地面并不平坦。为了简单起见&#xff0c;你可以认为第i节下面的地面等于hi。 你应该遵循几个规则来建造围栏。 连续的部…

C++知识总结

1.C面向对象三大特征&#xff1a;继承、封装、多态。其中多态分为静态多态和动态多态。静态多态&#xff1a;重载&#xff0c;参数模板 动态多态&#xff1a;虚函数&#xff0c;强制转换。 2.static类型的变量存在静态存储区&#xff0c;初始值为0或者null 3.char *p“PCGAME”…

kubekey初期尝试安装 KubeSphere单机和多机避坑指南

kubekey初期尝试安装 KubeSphere单机和多机避坑指南 准备工作 请注意开始前工作确定各个软件版本情况&#xff0c;本文章要想阅读比较舒服请还得有些Go开发经验 CentOS 7.9 KubeKey v1.21 KubeSphere v3.2.1 Docker 和 Kubernetes 根据支持进行选择&#xff1a; 获取支持可以通…

【复盘】2022年度复盘

年度总结 今年的年度总结比之前写早了一点&#xff0c;主要在因为居家办公时间太久&#xff0c;正好有空就找点时间提前写一下总结复盘计划&#xff0c;说实话要是每月都写一次&#xff0c;我自己也做不到。今年这一年如果用两个字来形容的话&#xff0c;应该是坚定 工作篇 …

用树莓派4B安装gitlab,亲测可用~

最近成功在CentOS7上安装了gitlab&#xff0c;忽然想到是不是可以把吃灰的树莓派4B也装上gitlab&#xff0c;于是研究了一下&#xff0c;做个分享。 树莓派是4B 8G版本。本身装的是官方的64位系统。之前可能还装过一些乱七八糟的东西&#xff0c;这里就不提了。 上gitlab官网…

m基于GRNN广义回归神经网络的飞机发动机剩余寿命预测matlab仿真,训练集采用C-MAPSS数据集

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 GRNN建立在非参数核回归基础上&#xff0c;以样本数据为后验条件&#xff0c;通过执行诸如Parzen非参数估计&#xff0c;从观测样本里求得自变量和因变量之间的联结概率密度函数之后&#xff0c;…

mysql查询某字符串是否在某字段中精确查找是否存在和case when语法规则使用说明

mysql中函数find_in_set可以对字符串在某个字段中是否存在&#xff0c;如果存在则返回含有该查询项的所有记录 SELECT count(1) FROM contingency_plan_team_role WHERE find_in_set( 36, preview_task_ids); 查询结果&#xff1a; case when 进行分组判断 cas…

【数据结构与算法基础】青岛大学王卓老师

【数据结构与算法基础】 1. 学习笔记参考 《数据结构与算法基础》教学视频目录87师兄-B站课程《数据结构与算法基础》脑图 2. 学习章节 【青岛大学王卓】第1章_前言【青岛大学王卓】第2章_线性表【青岛大学王卓】第3章_栈和队列【青岛大学王卓】第4章_串、数组和广义表【青岛…

Python爬虫入门——BeautifulSoup库

一、前言 这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据。 update on 2016-12-28&#xff1a;之前忘记给BeautifulSoup的官网了&#xff0c;今天补上&#xff0c;顺便再补点BeautifulSoup的用法。 update on 2017-08-16&#xff1a;很多网友留言说U…

搜索(5):迭代加深、双向dfs

活动 - AcWing 算法竞赛进阶指南 一、迭代加深概述 dfs每次选定一个分支&#xff0c;直到抵达递归边界才回溯&#xff0c;这种策略有一定缺陷。当搜索树的某个分支情况非常多&#xff0c;并且问题的答案在一个较浅的分支上时&#xff0c;如果一开始就选错了分支&#xff0…

在宜宾,看见未来中国的产融平台样本

在被验证的京东西南数字化产融协同平台背后&#xff0c;恰证明着在京东这样的新型实体企业支持下&#xff0c;中国的区域产业经济已经出现星星之火&#xff0c;而这些星星之火正在帮助成千上万的企业走出固有的销售渠道和销售模型&#xff0c;成为新时代数字经济和产业经济的一…

单芯片快速以太网MAC控制器DM9000介绍

DM9000简介 DM9000是一款完全集成的和符合成本效益单芯片快速以太网MAC控制器与一般处理接口&#xff0c;一个10/100M 自适应的PHY 和4K DWORD 值的SRAM。它的目的是在低功耗和高性能进程的3.3V与5V的支持宽容。 DM9000 还提供了介质无关的接口&#xff0c;来连接所有提供支持介…

javaee之spring2

基于注解的IOC配置 一、先来说一下放在对象上面的注解 Component: * 作用&#xff1a;用于把当前类对象存入spring容器中 * 属性&#xff1a; * value&#xff1a;用于指定bean的id。当我们不写时&#xff0c;它的默认值是当前类名&#xf…

RabbitMQ 第一天 基础 5 Spring 整合RabbitMQ 5.2 Spring 整合 RabbitMQ【消费者】 5.3 小结

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础5 Spring 整合RabbitMQ5.2 Spring 整合 RabbitMQ【消费者】5.2.1 消费者5.3 小结第一天 基础 5 Spring 整合RabbitMQ 5.2 Spring 整合 RabbitMQ【消费者】 5.2.1…

白话说Java虚拟机原理系列【第五章】:内存结构之堆详解

文章目录堆(Heap)对象在堆中的存储结构垃圾收集器详解对象存活判断算法引用的种类对象最终判定死亡之两次标记规则方法区的垃圾回收原则垃圾收集算法分代收集模型垃圾收集器对象分配原则垃圾收集触发方式垃圾收集器的参数异常前导说明&#xff1a; 本文基于《深入理解Java虚拟机…

大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Django】第二课 基于Django超市订单管理系统开发

概念 本文在上一文之上&#xff0c;针对管理员&#xff0c;经理&#xff0c;普通员工身份的用户操作用户管理模块功能。 功能实现 1.普通员工登录系统后&#xff0c;对于用户管理模块不具备操作其他用户信息的权限。因此当普通员工登录后&#xff0c;弹出对话框提示用户。 2…