前端系列19集-vue3引入高德地图,响应式,自适应

news2024/11/22 18:44:16

npm i @amap/amap-jsapi-loader --save

import AMapLoader from '@amap/amap-jsapi-loader' // 使用加载器加载JSAPI,可以避免异步加载、重复加载等常见错误加载错误
//为地图注册click事件获取鼠标点击出的经纬度坐标 
map.on("click", function (e: any) { 
// 点击事件 
}); let infoWindow = new AMap.InfoWindow({ 
//创建信息窗体 
isCustom: false, 
//使用自定义窗体 
anchor: "top-right", 
//信息窗体的三角所在位置 
content: `<a href="#">XXX信息</a>`, 
//信息窗体的内容可以是任意html片段 
offset: new AMap.Pixel(-10, -5), }); 
infoWindow.open(map, [116.397128, 39.916527]); 
//填写想要窗体信息指示的坐标
import AMapLoader from '@amap/amap-jsapi-loader';
export function loadAMap() {
  return new Promise(function (resolve, reject) {
    AMapLoader.load({
      key: '', // 申请好的Web端开发者Key,首次调用 load 时必填
      version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
      plugins: [
        'AMap.ControlBar',
        'AMap.LineSearch',
        'AMap.StationSearch',
        'AMap.PolylineEditor',
        'AMap.PolygonEditor',
        'AMap.CircleEditor',
        'AMap.AutoComplete',
        'AMap.AutoComplete',
        'AMap.DistrictSearch',
        'AMap.PlaceSearch',
        'AMap.MouseTool',
      ], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    })
      .then((AMap: any) => {
        window.AMap = AMap
        resolve(window.AMap);
      })
      .catch((e: any) => {
        console.log(e);
        reject();
      });
  });
}

import AMapLoader from '@amap/amap-jsapi-loader'

要在Vue 3中引入高德地图,你可以按照以下步骤进行操作:

在项目目录中使用npm或yarn安装高德地图的JavaScript API库。你可以使用以下命令之一:

npm install @amap/amap-jsapi-loader

yarn add @amap/amap-jsapi-loader

在Vue组件中引入并使用高德地图。

在你的Vue组件中,你可以使用AmapLoader从高德地图加载API,然后在地图准备好后使用AmapMap组件进行展示。以下是一个简单的示例:

// return new Promise(function (resolve, reject) {
    //     AMapLoader.load({
    //         key: '', // 申请好的Web端开发者Key,首次调用 load 时必填
    //         version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    //         plugins: [
    //             'AMap.ControlBar',
    //             'AMap.LineSearch',
    //             'AMap.StationSearch',
    //             'AMap.PolylineEditor',
    //             'AMap.PolygonEditor',
    //             'AMap.CircleEditor',
    //             'AMap.AutoComplete',
    //             'AMap.AutoComplete',
    //             'AMap.DistrictSearch',
    //             'AMap.PlaceSearch',
    //             'AMap.MouseTool'
    //         ] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    //     })
    //         .then((AMap: any) => {
    //             const map = new AMap.Map('container', {
    //                 //设置地图容器id
    //                 viewMode: '3D', //是否为3D地图模式
    //                 zoom: 5, //初始化地图级别
    //                 center: [116.397428, 39.90923] //初始化地图中心点位置
    //             })
    //         })
    //         .catch((e: any) => {
    //             console.log(e)
    //             reject()
    //         })
    // })
<template>
  <div>
    <div id="mapContainer"></div>
  </div>
</template>

<script>
import { AmapLoader, AmapMap } from '@amap/amap-jsapi-loader';

export default {
  name: 'MapComponent',
  mounted() {
    AmapLoader.load({
      key: '你的高德地图API密钥',
      version: '2.0',
      plugins: ['AMap.Geolocation'],
    }).then((AMap) => {
      const map = new AMap.Map('mapContainer', {
        center: [经度, 纬度],
        zoom: 缩放级别,
      });

      // 在这里你可以使用各种高德地图的功能,例如添加标记、绘制路线等

      // 当你需要使用地图组件时,你可以使用AmapMap组件
      Vue.component('AmapMap', AmapMap);
    });
  },
};
</script>

请确保替换代码中的你的高德地图API密钥为你自己的API密钥,以及经度纬度缩放级别为合适的值。

使用<MapComponent>在其他Vue组件中显示地图。

在其他的Vue组件中,你可以使用<MapComponent>标签来显示地图:

const map = new AMap.Map(wrapEl, {
        zoom: 15,
        center: [116.397428, 39.90923],
        viewMode: '3D'
    })
//进行地图初始化
const initMap = async () => {
    await toPromise() // 等待脚本加载完成的 Promise 解析
    await nextTick() // 等待 Vue 的下一个更新周期
    const wrapEl = unref(wrapRef) // 获取未包装的包裹元素的值
    if (!wrapEl) return // 如果包裹元素不存在,则返回
    const AMap = (window as any).AMap // 获取全局的 AMap 对象

    // 创建一个新的 AMap.Map 实例,并将其绑定到包裹元素上
    const map = new AMap.Map(wrapEl, {
        zoom: 15,
        center: [116.397428, 39.90923],
        viewMode: '3D'
    })

    AMap.plugin(['AMap.HawkEye'], () => {
        // 将缩略图控件添加到地图实例中
        map.addControl(new AMap.HawkEye())
    })
}
AMap.plugin(['AMap.HawkEye'], () => {
        // 将缩略图控件添加到地图实例中
        map.addControl(new AMap.HawkEye())
    })

在Vue 3中引入高德地图时,如果地图拖动不了其他地方,可能是由于以下原因:

  1. 容器尺寸问题:检查包裹地图的容器元素的尺寸设置。确保容器具有足够的宽度和高度以容纳地图,并且不会被其他元素覆盖。

  2. CSS 样式问题:检查容器元素的 CSS 样式,确保没有设置不正确的定位或溢出属性。地图容器应该使用适当的 CSS 属性(例如position: relative)来确保地图可以正确地进行定位和拖动。

  3. 脚本加载问题:确认高德地图的相关脚本和依赖已经正确加载,并且没有出现任何错误或警告。可以检查浏览器的开发者工具控制台,查看是否有与地图加载相关的错误信息。

  4. 地图初始化设置:检查地图初始化设置,包括缩放级别、中心点位置和视图模式。确保这些设置正确,以便在地图加载后能够正确显示和拖动地图。

如果问题仍然存在,可以提供更多关于你的代码和具体情况的信息,以便更好地理解问题并提供更精确的帮助。

//进行地图初始化
const initMap = async () => {
    await toPromise() // 等待脚本加载完成的 Promise 解析
    await nextTick() // 等待 Vue 的下一个更新周期
    const wrapEl = unref(wrapRef) // 获取未包装的包裹元素的值
    if (!wrapEl) return // 如果包裹元素不存在,则返回
    const AMap = (window as any).AMap // 获取全局的 AMap 对象

    const lineArr = data.map((item) => [item.longitude, item.latitude])

    // 创建一个新的 AMap.Map 实例,并将其绑定到包裹元素上
    const map = new AMap.Map(wrapEl, {
        center: [116.397428, 39.90923]
    })

    const marker = new AMap.Marker({
        // Map: 要显示该marker的地图对象
        map: map,
        // LngLat: 点标记在地图上显示的位置,默认为地图中心点,数组类型的格式也可以
        // 或 position: new AMap.LngLat(116.478935, 39.997761),
        position: lineArr[0],
        // String/Icon: 需在点标记中显示的图标。可以是一个本地图标地址,或者Icon对象。有合法的content内容时,此属性无效
        icon: 'https://webapi.amap.com/images/car.png',
        /*
        Pixel: 点标记显示位置偏移量,默认值为Pixel(-10,-34)
        Marker指定position后,默认以marker左上角位置为基准点,对准所给定的position位置,若需使marker指定位置对准在position处,需根据marker的尺寸设置一定的偏移量
        */
        offset: new AMap.Pixel(-26, -13),
        // Boolean: 是否自动旋转。点标记在使用moveAlong动画时,路径方向若有变化,点标记是否自动调整角度,默认为false。广泛用于自动调节车辆行驶方向
        autoRotation: true,
        // Number: 点标记的旋转角度,广泛用于改变车辆行驶方向
        angle: -90
    })

    // 绘制整条轨迹
    const polyline = new AMap.Polyline({
        // Map: 要显示该polyline的地图对象
        map: map,
        // Array: 折线的节点坐标数组
        path: lineArr,
        // Boolean: 是否延路径显示白色方向箭头,默认false。Canvas绘制时有效,建议折线宽度大于6时使用
        showDir: true,
        // String: 线条颜色,使用16进制颜色代码赋值。默认值为#006600
        strokeColor: '#28F',
        // Number: 线条透明度,取值范围[0,1],0表示完全透明,1表示不透明。默认为0.9
        strokeOpacity: 1,
        // Number: 线条宽度,单位:像素
        strokeWeight: 6,
        // String: 线样式,实线:solid,虚线:dashed
        strokeStyle: 'solid'
    })
}

地图的创建

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <title>地图显示</title>
    <style>
        html,
        body,
        #container {
          width: 100%;
          height: 100%;
        }
    </style>
</head>
<body>
<div id="container"></div>
<!-- 加载地图JSAPI脚本 -->
<script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
<script>
    var map = new AMap.Map('container', {
        resizeEnable: true, //是否监控地图容器尺寸变化
        zoom:11, //初始化地图层级
        center: [116.397428, 39.90923] //初始化地图中心点
    });
</script>
</body>
</html>

地图加载完成

地图加载完成事件 map.on("complete")

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }
  </style>
  <title>地图加载完成</title>
</head>

<body>
  <div id="container"></div>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
  <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
  <script>
    var map = map = new AMap.Map('container', {
        resizeEnable: true
    });
    
    map.on("complete", function(){
       log.success("地图加载完成!");  
    });
  </script>
</body>

</html>

地图的销毁

地图的销毁 map.destroy

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }
  </style>
  <title>地图创建与销毁</title>
</head>

<body>
  <div id="container"></div>
  <div class="input-card" style="width:16rem">
    <h4>创建、销毁地图</h4>
    <div id="btns">
      <div class="input-item">
        <button id="create-btn" class="btn" style="margin-right:1rem;">创建地图</button>
        <button id="destroy-btn" class="btn">销毁地图</button>
      </div>
    </div>
  </div>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
  <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
  <script>
    var map = null;

    function createMap() {
      map = new AMap.Map('container', {
        resizeEnable: true
      });
      log.success("创建地图成功");
    }

    function destroyMap() {
      map && map.destroy();
      log.info("地图已销毁");
    }

    //初始化地图
    createMap();

    //绑定创建、销毁事件
    document.querySelector("#create-btn").onclick = createMap;
    document.querySelector("#destroy-btn").onclick = destroyMap;
  </script>
</body>

</html>

异步加载地图

给JSAPI引用地址url加上callback参数,异步调用JSAPI接口。

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>异步加载地图</title>
    <link rel="stylesheet" href="https://cache.amap.com/lbs/static/main1119.css"/>
</head>
<body>
<div id="container"></div>
<script>
    function onApiLoaded(){
        var map = new AMap.Map('container', {
            center: [117.000923, 36.675807],
            zoom: 6
        });
        map.plugin(["AMap.ToolBar"], function() {
            map.addControl(new AMap.ToolBar());
        });
    }
     var url = 'https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&callback=onApiLoaded';
    var jsapi = document.createElement('script');
    jsapi.charset = 'utf-8';
    jsapi.src = url;
    document.head.appendChild(jsapi);
</script>
</body>
</html>

中、英文地图

英文地图显示,英文、中英文、中文地图之间动态切换

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <title>英文、中英文地图</title>
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <div class="input-card" style="width:13rem">
    <h4>底图语言切换</h4>
    <div id="lang">
      <div class="input-item"><input id="en" name="language" type="radio" checked="checked"><span class="input-text">英文底图</span></div>
      <div class="input-item"><input id="zh_en" name="language" type="radio"><span class="input-text">中英文对照</span></div>
      <div class="input-item"><input id="zh_cn" name="language" type="radio"><span class="input-text">中文底图</span></div>
    </div>
  </div>
  <script src="https://cache.amap.com/lbs/static/es5.min.js"></script>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
  <script>
    //初始化地图
    var map = new AMap.Map('container', {
      resizeEnable: true,
      center: [121.498586, 31.239637],
      lang: "en" //可选值:en,zh_en, zh_cn
    });

    //绑定radio点击事件
    var radios = document.querySelectorAll("#lang input");
    radios.forEach(function(ratio) {
      ratio.onclick = setLang;
    });

    function setLang() {
      map.setLang(this.id);
    }
  </script>
</body>

</html>

设置/获取地图显示范围

通过map.getBounds、map.getBounds设置/获取地图显示范围

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <title>地图显示范围</title>
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }

    .lnglat {
      color: #0288d1;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <div class="info">
    <h4>当前地图显示范围(Bounds)</h4>
    <p>NorthEast坐标:<span id="ne" class="lnglat"></span></p>
    <p>SouthWest坐标:<span id="sw" class="lnglat"></span></p>
  </div>
  <div class="input-card" style="width:16rem;">
    <h4>控制地图显示范围</h4>
    <div class="input-item">
      <button class="btn" id="reset-bounds">指定地图显示范围</button>
    </div>
  </div>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
  <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
  <script>
    //创建地图
    var map = new AMap.Map('container', {
      resizeEnable: true,
      zoom: 10,
      center: [116.405285, 39.904989],
      showIndoorMap: false
    });

    //显示当前地图边界范围坐标
    function logMapBounds() {
      var bounds = map.getBounds();
      document.querySelector("#ne").innerText = bounds.northeast.toString();
      document.querySelector("#sw").innerText = bounds.southwest.toString();
    }

    logMapBounds();

    //绑定地图移动与缩放事件
    map.on('moveend', logMapBounds);
    map.on('zoomend', logMapBounds);

    //绑定按钮事件
    document.querySelector("#reset-bounds").onclick = function() {
      //通过 new AMap.Bounds(southWest:LngLat, northEast:LngLat) 或者 map.getBounds() 获得地图Bounds信息
      var mybounds = new AMap.Bounds([116.319665, 39.855919], [116.468324,39.9756]);
      map.setBounds(mybounds);
    }
  </script>
</body>

</html>

地图的平移

除了鼠标、触摸交互,通过map.panBy和map.panTo也可以移动地图

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>地图平移</title>
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
    <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
   
   <style>
    html,
    body,
    #container {
        width: 100%;
        height: 100%;
    }
  </style>
</head>
<body>
<div id="container"></div>
<div class="input-card" style="width: auto">
    <div class="input-item">
        <input id="piexBtn" type="button" class="btn" value="平移像素值:(50,100)"/>
    </div>
    <div class="input-item">
        <input id="pantoBtn" type="button" class="btn" value="地图中心点平移至:(116.405467,39.907761)"/>
    </div>
</div>
<script>
    var map = new AMap.Map('container', {
        resizeEnable: true,
        zoom: 13,
        center: [116.397428, 39.90923]
    });

    AMap.event.addDomListener(document.getElementById('piexBtn'), 'click', function() {
        map.panBy(50, 100);
    });
    AMap.event.addDomListener(document.getElementById('pantoBtn'), 'click', function() {
        map.panTo([116.405467, 39.907761]);
    });
</script>
</body>
</html>

获取鼠标点击经纬度

给地图绑定click事件,获取鼠标位置的经纬度坐标。

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>鼠标拾取地图坐标</title>
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
</head>
<style type="text/css">
    html,body{
        width: 100%;
        height: 100%;
        margin: 0px;
    }
    .map{
        height: 100%;
        width: 100%;
        float: left;
    }
</style>
<body>
<div id="container" class="map"></div>
<div class="input-card">
    <h4>左击获取经纬度:</h4>
    <div class="input-item">
      <input type="text" readonly="true" id="lnglat">
    </div>
</div>

<script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&plugin=AMap.Autocomplete"></script>
<script type="text/javascript">
    var map = new AMap.Map("container", {
        resizeEnable: true
    });
    //为地图注册click事件获取鼠标点击出的经纬度坐标
    map.on('click', function(e) {
        document.getElementById("lnglat").value = e.lnglat.getLng() + ',' + e.lnglat.getLat()
    });
</script>
</body>
</html>

设置鼠标样式

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <title>设置鼠标样式</title>
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <link rel="stylesheet" href="https://at.alicdn.com/t/font_873139_0v65kqy674.css" >
    <script type="text/javascript"
            src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
    <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script>
    
    <style type="text/css">
        html,body{
            width: 100%;
            height: 100%;
            margin: 0px;
        }
        .map{
            height: 100%;
            width: 100%;
            float: left;
        }
        .input-card {
            width: 70px;
        }
        ul {
            margin: 0;
            padding: 0;
            list-style: none;
        }
    </style>
</head>
<body>
<div id="container" class="map"></div>
<ul id="cursorList" class="input-card">
    <li>
        <input name="cursor" value="default" type="radio" onclick="switchCursor(this)" checked>
        <span class="iconfont icon-Cursor"></span>
    </li>
    <li>
        <input name="cursor" value="pointer" type="radio" onclick="switchCursor(this)">
        <span class="iconfont icon--Hand-Cursor"></span>
    </li>
    <li>
        <input name="cursor" value="move" type="radio" onclick="switchCursor(this)">
        <span class="iconfont icon-cursor-move"></span>
    </li>
    <li>
        <input name="cursor" value="crosshair" type="radio" onclick="switchCursor(this)">
        <span class="iconfont icon-cross"></span>
    </li>
</div>
<script type="text/javascript">
    //初始化地图对象,加载地图
    var map = new AMap.Map("container", {
        resizeEnable: true
    });
    
    //使用CSS默认样式定义地图上的鼠标样式
    map.setDefaultCursor("pointer");
    
    
    //自定义鼠标样式图标
    function switchCursor(target) {
        var value = target.value;
        map.setDefaultCursor(value);
    }
</script>
</body>
</html>

隐藏文字标注

showLabel设定为 false 隐藏文字标注

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
  <title>地图文字标记开关</title>
  <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
  <style>
    html,
    body,
    #container {
      width: 100%;
      height: 100%;
    }
  </style>
</head>

<body>
  <div id="container"></div>
  <script src="https://cache.amap.com/lbs/static/es5.min.js"></script>
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script>
  <script>
    //初始化地图
    var map = new AMap.Map('container', {
      showLabel: false //不显示地图文字标记
    });
  </script>
</body>

</html>

响应式 vs. 自适应

  • 媒体查询,边界断点的规则设定(Media queries && break point)

  • 内容的可伸缩性效果(Flexibel visuals)

  • 流式网格布局(Fluid grids)

  • 主要内容呈现及图片的高质量(Main content and high quality)

通常认为,RWD 是 AWD 的子集

RWD:Ethan Marcote 的文章是大家认为 RWD 的起源。他提出的 RWD 方案是通过 HTML 和 CSS 的媒体查询技术,配合流体布局实现。RWD 倾向于只改变元素的外观布局,而不大幅度改变内容。Jeffrey Zeldman 总结说,我们就把 RWD 定义为一切能用来为各种分辨率和设备性能优化视觉体验的技术

AWD:Adaptive Design 是 Aaron Gustafson 的书的标题。他认为 AWD 在包括 RWD 的 CSS 媒体查询技术以外,也要用 Javascript 来操作 HTML 来更适应移动设备的能力。AWD 有可能会针对移动端用户减去内容,减去功能。AWD 可以在服务器端就进行优化,把优化过的内容送到终端上。

设备独立像素 = CSS 像素 = 逻辑像素

GitLab私有化部署

  1. 一台云服务器

  2. 云服务器上已安装Docker

  3. 了解Docker基础

部署和使用公共密钥

公共密钥可以在所有项目中使用,添加读写权限。部署后可以为git仓库的使用或者配合其他平台做自动化流程提供便利。

8b763d723e6fbb32b1b51acdf37ff176.png
image.png

选择“部署密钥”,点击“新建部署密钥”

afdd700685782d229d784e9389960e28.pnghttps://docs.gitlab.cn/jh/user/ssh.html#generate-an-ssh-key-pair

填入标题和ssh公钥,ssh密钥的生成参考官网这里[1]进入某个具体的项目(如没有则新建一个),点击“设置” => “仓库”

“部署密钥”展开 => 选择“公开访问的部署密钥” => 启用对应的公共密钥

“已启用的部署密钥” => 选择对应的公共密钥,点击编辑 => 打钩“授予此密钥写入权限” 保存更改

f4366d789709e373dad6204e668a4768.png
image.png

1. 安装GitLab 插件

2. 配置触发时机

  1. 选择“Build when a change is pushed to GitLab”

  2. 点击Generate 生成一个Secret token

使用Docker安装Jenkins

0d1cf3b4a3d284e77fb9cd2a284288fa.png
image.png
591812d945b79b8049764ce129a80078.png
image.png

GitLab webhooks

  1. 填写url,这个url就在Jenkins “Build when a change is pushed to GitLab” 后面

  2. 填写Jenkins刚刚生成的secret token

  3. 触发来源勾选“标签推送事件”

  4. SSL 验证取决于你的Jenkins服务是http还是https,如果是http就取消勾选

4f80669e6eef454de99e7adbffcae771.png
image.png
3636ee80b2480451e8ae68a89f9be2aa.png
image.png

webhooks

点击 “标签推送事件”,Jenkins自动触发一次构建,则配置成功

7d56864e04b0ef59e0b5fbb4b917df0e.png
image.png

https://juejin.cn/post/7242105983136448573

docker run --name docker_jenkins --privileged=true -itd -p 8080:8080 -p 50000:50000 --restart=on-failure -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts-jdk11

  • --name:自定义容器名称

  • --privileged=true:赋予该容器更高的权限。几乎与宿主机上的root用户拥有相同的权限。能够在容器中使用docker命令

  • -itd :容器内增加交互终端

  • -v jenkins_home:/var/jenkins_home:存储Jenkins数据,这几乎是必须的。如果不设置,重启Jenkins容器后,Jenkins将会被重置

安装成功后,访问服务器8080端口

  • 打印Jenkins日志:docker logs -f [container_id]。日志中就存有初始化的管理员密码

  • 进入容器内部,根据提示找到初始密码所在位置查看

    • 进入容器:docker exec -it [container_id] bash

    • 查看密码:cat /var/jenkins_home/secrets/initialAdminPassword

90a2cedb0c1c02300044aa4a38d9a81c.png
image.png
6ac314dc9457f3cfd14a09dfde628b00.png
image.png
0524da77958047c1187337d620ba7965.png
image.png

全局凭据

  1. 类型:选择“SSH Username with private key”

  2. Username: 填写GitLab用户名

  3. Enter directly:选中后,将生成的ssh密钥的私钥填入

  4. Passphrase:如果生成ssh密钥对时设置了就填写设置的内容,未设置就不需要填写

7fb239f871f1ae64c3513896edd22ec4.png
image.png
042df1f6940031319097d1d2722361bc.png
image.png

拉取GitLab仓库代码

  1. Jenkins新建任务,选择 “构建一个自由风格的软件项目”

  2. 源码管理:选择Git,进行配置

    1. 安装插件时选择“安装推荐的插件” Git Plugin会自动安装,才会出现这个Git选项。否则需要先手动安装Git Plugin

    2. 地址填写基于ssh的仓库地址

    3. 凭据选择之前创建的全局凭据

    4. GitLab侧需要同步配置,将ssh的公钥作为项目的部署密钥,这一步参考GitLab私有化部署[2]

移动端适配及PC端适配心得总结体会(二)

https://juejin.cn/post/6885721051360133133#heading-11

8f2c5afcceca7940a1fbea1b8c5d6b81.png
image.png

WebSocket

let _ws: WebSocket | null = null

export function initWebSock(vm: Vue) {

  _ws = new WebSocket('')

  _ws.addEventListener('open', (e) => {
  })

  _ws.addEventListener('message', (e: any) => {

  })
}

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/WebGuideInterview

参考资料

[1]

https://docs.gitlab.cn/jh/user/ssh.html#generate-an-ssh-key-pair: https://link.juejin.cn/?target=https%3A%2F%2Fdocs.gitlab.cn%2Fjh%2Fuser%2Fssh.html%23generate-an-ssh-key-pair

[2]

https://juejin.cn/post/7242007082920312888#heading-6: https://juejin.cn/post/7242007082920312888#heading-6

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

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

相关文章

30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

前言 &#x1f3ac;【全网首发】 | 30分钟了解所有组件&#xff0c;132个Unity 游戏引擎组件速通&#xff01;一、Mesh 网格1.Mesh Filter2.Mesh Renderer3.Skinned Mesh Renderer4.Text Mesh5.TextMeshPro-Text 二、Effects 特效组件1.Particle System2.Visual Effect3.Trail …

一篇一个CV模型,第(1)篇:StyleGAN

写在前面&#xff1a; 虽说自己肯定对外宣称自己是搞CV的&#xff0c;但是其实在自己接近两年半(&#x1f414;)的研究生生涯中&#xff0c;也没有熟练掌握过很多个CV领域的模型&#xff0c;或者说是CV领域的概念。我认为这个东西是必须得补的&#xff0c;不然作为CV算法工程师…

嵌入式应用复习知识点总结

一.期末考试题型 1.单选题40’2.判断题10’3.简答题20’4.综合设计题&#xff08;66108&#xff09; 二.单选题知识点 1.嵌入式系统 1.定义 IEEE&#xff08;国际电气和电子工程师协会&#xff09;的定义&#xff1a; Devices used to control, monitor, or assist the op…

CDN能防住攻击吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是CDN&#xf…

撸一遍STM32最小系统板

采样的MCU型号为STM32F405RGT6&#xff0c;目前这款芯片价格便宜性能好。 1 电机控制会用到单片机的哪些功能&#xff1f; GPIO&#xff08;通用输入/输出&#xff09;&#xff1a;单片机的GPIO引脚可以用于控制电机的开关、使能以及接收传感器的反馈信号。通过设置GPIO引脚的…

机器学习强基计划9-2:图解字典学习KSVD算法(附Python实战)

目录 0 写在前面1 字典学习2 问题形式化3 KSVD算法4 Python实现 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器学习模型&#xff1a;决策树、支持向量机、…

基于Java+Swing实现的代码统计工具

基于JavaSwing实现的代码统计工具 一、系统介绍二、功能展示三、代码展示四、其他系统五、获取源码 一、系统介绍 系统可以统计C&#xff0c;C&#xff0c;Java代码的空行、注释、有效代码行数 使用说明 直接运行main方法即可 运行环境&#xff1a;idea jdk 二、功能展示 …

2023全国滋补健康产业创新发展交流会八月相聚上海

简介&#xff1a;2023全国滋补健康产业创新发展交流会&#xff0c;愉极2023年“优秀滋补品牌商”精英班&鲜炖鱼胶师培训考核班 愉极&燕博会 2023年“优秀滋补品牌商”精英班&鲜炖鱼胶师培训考核班 前言 在国家提倡全民养生&#xff0c;国民健康意识增强&#xf…

【从零开始学微服务】09.为什么需要服务注册发现?

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务调用的问题 在上一篇文章中&#xff0c;我们深入探讨了微服务架构的引入过程。在这种架构中&#xff0c;原本庞大且复杂的单体应用会根据业务需求被拆分成一系列精简的小型…

MySQL空间数据学习

一、MySQL空间数据形式 MKT 已知文本&#xff08;WKT&#xff09;格式。用已知文本&#xff08;WKT&#xff09;表示几何值是为用ASCII格式交换几何数据而设计的。OpenGIS规范提供了一个BackusNaur语法&#xff0c;它指定了写入WKT值的正式生成规则。 MKB 已知二进制&#xff…

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)综合知识(选择题*75)1-10 题11-20 题21-30 题31-40 题41-50 题51-60 …

LNMP环境

目录 安装Nginx MySQL PHP安装搭建 部署Discuz&#xff01;社区论坛 安装Nginx 1、关闭防火墙 2、安装依赖包 3、解包 4、配置路径编译安装 5、优化路径创建软连接 6、添加Nginx服务 7、赋权 8、启动服务 9、检查是否安装成功 MySQL 1、安装依赖环境 2、创建运行用户 3、…

带你深入学习“反射”技术

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

Git入门到精通全套教程(涵盖GitHub\Gitee码云)

一个小时搞定Git 对应的视频教程讲解&#xff1a; Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云&#xff09;_哔哩哔哩_bilibili 目录 1. 为什么要使用版本控制软件 2. 市场上的版本控制软件 3. Git简介 3.1Git简介 3.2集中式vs分布式 3.3作用 二、Git的使用…

【MySQL基础 | 第二篇】数据处理之分组查询

前言 查询语句属于DML&#xff08;Data Manipulation Language&#xff09;数据操作语言的其中一种&#xff0c;用于从数据库中提取所需的数据。通过灵活的条件和组合&#xff0c;查询语句帮助用户有效地获取、过滤和排序数据&#xff0c;满足各种信息需求。 文章目录 前言1️⃣…

阿里企业邮箱注册申请流程(图文详解)

2023阿里云企业邮箱注册流程&#xff0c;企业邮箱分为免费版、标准版、集团版和尊享版&#xff0c;阿里云百科分享企业邮箱版本区别&#xff0c;企业邮箱收费标准&#xff0c;以及阿里企业邮箱详细注册开通流程&#xff0c;包括阿里云账号注册、实名认证、企业邮箱版本区别及选…

基于Fedora 38的Ultramarine Linux 38推出了System76的调度器

导读Ultramarine Linux 38已经发布&#xff0c;它是另一个基于Fedora Linux的发行版&#xff0c;具有Budgie、GNOME、KDE Plasma和 elementary OS的Pantheon桌面环境的四个版本。 基于Fedora Linux 38&#xff0c;但默认使用Linux内核6.3&#xff0c;Ultramarine Linux 38&…

人工智能的几个概念

一、什么是人工智能 人工智能不是最近几年才兴起的&#xff0c;它已经有几十年发展的历史&#xff0c;下面是业内公认的一种关于人工智能概念的定义&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff1a;缩写为AI&#xff0c;是研究开发用于模拟、…

报名开启!2023大模型应用创新挑战赛来啦

满脑创意无处落地&#xff1f; 满身技术无人看到&#xff1f; 飞桨邀你开启大模型应用创意挑战之旅 寻找那个最具创意的你 资深开发者指导&#xff0c;助你落地“黄金”项目 大模型从业者合作交流 找到创业道路上的partner 高额奖金、技能提升、优质项目 官方扶持落地&#xff…

MCScanX安装与使用

为什么要写这篇文章&#xff1a; 最近因为朋友需要用到MCScanX画两个物种的共线性点图&#xff0c;但是发现搜到的blog中所提供的安装方法都不太相同&#xff0c;且在都会出现或多或少的问题&#xff0c;所以来找我帮忙&#xff0c;我搜到的所有blog安装链接http://chibba.pgml…