主頁 > 企業開發 > 使用Three.js實作炫酷的賽博朋克風格3D數字地球大屏 🌐

使用Three.js實作炫酷的賽博朋克風格3D數字地球大屏 🌐

2022-07-25 09:27:07 企業開發

宣告:本文涉及圖文和模型素材僅用于個人學習、研究和欣賞,請勿二次修改、非法傳播、轉載、出版、商用、及進行其他獲利行為,

背景

近期作業有涉及到數字大屏的需求,于是利用業余時間,結合 Three.js 和 CSS實作賽博朋克2077風格視覺效果 實作炫酷 3D 數字地球大屏頁面,頁面使用 React + Three.js + Echarts + stylus 技術堆疊,本文涉及到的主要知識點包括:THREE.Spherical 球體坐標系的應用、Shader 結合 TWEEN 實作飛線和沖擊波影片效果、dat.GUI 除錯工具庫的使用、clip-path 創建不規則圖形、Echarts 的基本使用方法、radial-gradient 創建雷達圖形及影片、GlitchPass 添加故障風格后期、Raycaster 網格點擊事件等,

效果

如下圖 ?? 所示,頁面主要頭部、兩側卡片、底部儀表盤以及主體 3D 地球 ?? 構成,地球外圍有 飛線 影片和 沖擊波 影片效果 ?? ,通過 ?? 滑鼠可以旋轉和放大地球,點擊第一張卡片的 START ? 按鈕會給頁面添加故障風格后期 ?雙擊地球會彈出隨機提示語彈窗,

  • ?? 本頁面僅適配 PC 端,大屏訪問效果更佳,
  • ????? 在線預覽地址1:https://3d-eosin.vercel.app/#/earthDigital
  • ????? 在線預覽地址2:https://dragonir.github.io/3d/#/earthDigital

實作

?? 資源引入

引入開發必備的資源,其中除了基礎的 React 和樣式表之外,dat.gui 用于動態控制頁面引數,其他剩余的主要分為兩部分:Three.js相關, OrbitControls 用于鏡頭軌道控制、TWEEN 用于補間影片控制、mergeBufferGeometries 用戶合并模型、EffectComposer RenderPass GlitchPass 用于生成后期故障效果影片、 lineFragmentShader 是飛線的 ShaderEcharts相關按需引入需要的組件,最后使用 echarts.use 使其生效,

import './index.styl';
import React from 'react';
import * as dat from 'dat.gui';
// three.js 相關
import * as THREE from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
import { TWEEN } from 'three/examples/jsm/libs/tween.module.min.js';
import { mergeBufferGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils';
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
import { GlitchPass } from 'three/examples/jsm/postprocessing/GlitchPass.js';
import lineFragmentShader from '@/containers/EarthDigital/shaders/line/fragment.glsl';
// echarts 相關
import * as echarts from 'echarts/core';
import { BarChart /*...*/ } from 'echarts/charts';
import { GridComponent /*...*/ } from 'echarts/components';
import { LabelLayout /*...*/ } from 'echarts/features';
import { CanvasRenderer } from 'echarts/renderers';
echarts.use([BarChart, GridComponent, /* ...*/ ]);

?? 頁面結構

頁面主要結構如以下代碼所示,.webgl 用于渲染 3D 數字地球;.header 是頁面頂部,里面包括時間日期星際坐標Cyberpunk 2077 Logo、本人 Github 倉庫地址等;.aside 是左右兩側的圖表展示區域;.footer 是底部的儀表盤,展示一些雷達影片和文本資訊;如果仔細觀察,可以看出背景有噪點效果,.bg 就是用于生成噪點背景效果,

<div className='earth_digital'>
  <canvas className='webgl'></canvas>
  <header className='hud header'>
  <header></header>
  <aside className='hud aside left'></aside>
  <aside className='hud aside right'></aside>
  <footer className='hud footer'></footer>
  <section className="bg"></section>
</div>

?? 場景初始化

定義一些全域變數和引數,初始化場景相機鏡頭軌道控制器頁面縮放監聽、添加頁面重繪更新影片等進行場景初始化,

const renderer = new THREE.WebGLRenderer({
  canvas: document.querySelector('canvas.webgl'),
  antialias: true,
  alpha: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
// 創建場景
const scene = new THREE.Scene();
// 創建相機
const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, .01, 50);
camera.position.set(0, 0, 15.5);
// 添加鏡頭軌道控制器
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.enablePan = false;
// 頁面縮放監聽并重新更新場景和相機
window.addEventListener('resize', () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize( window.innerWidth, window.innerHeight );
}, false);
// 頁面重繪影片
renderer.setAnimationLoop( _ => {
  TWEEN.update();
  earth.rotation.y += 0.001;
  renderer.render(scene, camera);
});

?? 創建點狀地球

具體思路是使用 THREE.Spherical 創建一個球體坐標系 ?,然后創建 10000 個平面網格圓點,將它們的空間坐標轉換成球坐標,并使用 mergeBufferGeometries 將它們合并為一個網格,然后使用一張如下圖所示的地圖圖片作為材質,在 shader 中根據材質圖片的顏色分布調整圓點的大小和透明度,根據傳入的引數調整圓點的顏色和大小比例,然后創建一個球體 SphereGeometry,使用生成的著色器材質,并將它添加到場景中,到此,一個點狀地球 ?? 模型就完成了,具體實作如下,

// 創建球類坐標
let sph = new THREE.Spherical();
let dummyObj = new THREE.Object3D();
let p = new THREE.Vector3();
let geoms = [], rad = 5, r = 0;
let dlong = Math.PI * (3 - Math.sqrt(5));
let dz = 2 / counter;
let long = 0;
let z = 1 - dz / 2;
let params = {
  colors: { base: '#f9f002', gradInner: '#8ae66e', gradOuter: '#03c03c' },
  reset: () => { controls.reset() }
}
let uniforms = {
  impacts: { value: impacts },
  // 陸地色塊大小
  maxSize: { value: .04 },
  // 海洋色塊大小
  minSize: { value: .025 },
  // 沖擊波高度
  waveHeight: { value: .1 },
  // 沖擊波范圍
  scaling: { value: 1 },
  // 沖擊波徑向漸變內側顏色
  gradInner: { value: new THREE.Color(params.colors.gradInner) },
  // 沖擊波徑向漸變外側顏色
  gradOuter: { value: new THREE.Color(params.colors.gradOuter) }
}
// 創建10000個平面圓點網格并將其定位到球坐標
for (let i = 0; i < 10000; i++) {
  r = Math.sqrt(1 - z * z);
  p.set( Math.cos(long) * r, z, -Math.sin(long) * r).multiplyScalar(rad);
  z = z - dz;
  long = long + dlong;
  sph.setFromVector3(p);
  dummyObj.lookAt(p);
  dummyObj.updateMatrix();
  let g =  new THREE.PlaneGeometry(1, 1);
  g.applyMatrix4(dummyObj.matrix);
  g.translate(p.x, p.y, p.z);
  let centers = [p.x, p.y, p.z, p.x, p.y, p.z, p.x, p.y, p.z, p.x, p.y, p.z];
  let uv = new THREE.Vector2((sph.theta + Math.PI) / (Math.PI * 2), 1. - sph.phi / Math.PI);
  let uvs = [uv.x, uv.y, uv.x, uv.y, uv.x, uv.y, uv.x, uv.y];
  g.setAttribute('center', new THREE.Float32BufferAttribute(centers, 3));
  g.setAttribute('baseUv', new THREE.Float32BufferAttribute(uvs, 2));
  geoms.push(g);
}
// 將多個網格合并為一個網格
let g = mergeBufferGeometries(geoms);
let m = new THREE.MeshBasicMaterial({
  color: new THREE.Color(params.colors.base),
  onBeforeCompile: shader => {
    shader.uniforms.impacts = uniforms.impacts;
    shader.uniforms.maxSize = uniforms.maxSize;
    shader.uniforms.minSize = uniforms.minSize;
    shader.uniforms.waveHeight = uniforms.waveHeight;
    shader.uniforms.scaling = uniforms.scaling;
    shader.uniforms.gradInner = uniforms.gradInner;
    shader.uniforms.gradOuter = uniforms.gradOuter;
    // 將地球圖片作為引數傳遞給shader
    shader.uniforms.tex = { value: new THREE.TextureLoader().load(imgData) };
    shader.vertexShader = vertexShader;
    shader.fragmentShader = fragmentShader;
    );
  }
});
// 創建球體
const earth = new THREE.Mesh(g, m);
earth.rotation.y = Math.PI;
earth.add(new THREE.Mesh(new THREE.SphereGeometry(4.9995, 72, 36), new THREE.MeshBasicMaterial({ color: new THREE.Color(0x000000) })));
earth.position.set(0, -.4, 0);
scene.add(earth);

?? 添加除錯工具

為了實時調整球體的樣式和后續飛線和沖擊波的引數調整,可以使用工具庫 dat.GUI,它可以創建一個表單添加到頁面,通過調整表單上面的引數、滑塊和數值等方式系結頁面引數,引數值更改后可以實時更新畫面,這樣就不用一邊到編輯器調整代碼一邊到瀏覽器查看效果了,基本用法如下,本例中可以在頁面通過點擊鍵盤 ? H鍵顯示或隱藏引數表單,通過表單可以修改 ?? 地球背景色、飛線顏色、沖擊波幅度大小等效果,

const gui = new dat.GUI();
gui.add(uniforms.maxSize, 'value', 0.01, 0.06).step(0.001).name('陸地');
gui.add(uniforms.minSize, 'value', 0.01, 0.06).step(0.001).name('海洋');
gui.addColor(params.colors, 'base').name('基礎色').onChange(val => {
 earth && earth.material.color.set(val);
});

?? 如果想要了解更多關于 dat.GUI 的屬性和方法,可以訪問本文末尾提供的官方檔案地址

?? 添加飛線和沖擊波

這部分內容實作地球表層的飛線和沖擊波效果 ??,基本思路是:使用 THREE.Line 創建 10 條隨機位置的飛線路徑,通過 setPath 方法設定飛線的路徑 然后通過 TWEEN 更新飛線和沖擊波擴散影片,一條影片結束后,在終點的位置基礎上重新調整飛線開始的位置,通過更新 Shader 引數 實作飛線和沖擊波效果,并回圈執行該程序,最后將飛線和沖擊波關聯到地球 ?? 上,具體實作如以下代碼所示:

let maxImpactAmount = 10, impacts = [];
let trails = [];
for (let i = 0; i < maxImpactAmount; i++) {
  impacts.push({
    impactPosition: new THREE.Vector3().random().subScalar(0.5).setLength(5),
    impactMaxRadius: 5 * THREE.Math.randFloat(0.5, 0.75),
    impactRatio: 0,
    prevPosition: new THREE.Vector3().random().subScalar(0.5).setLength(5),
    trailRatio: {value: 0},
    trailLength: {value: 0}
  });
  makeTrail(i);
}
// 創建虛線材質和線網格并設定路徑
function makeTrail(idx){
  let pts = new Array(100 * 3).fill(0);
  let g = new THREE.BufferGeometry();
  g.setAttribute('position', new THREE.Float32BufferAttribute(pts, 3));
  let m = new THREE.LineDashedMaterial({
    color: params.colors.gradOuter,
    transparent: true,
    onBeforeCompile: shader => {
      shader.uniforms.actionRatio = impacts[idx].trailRatio;
      shader.uniforms.lineLength = impacts[idx].trailLength;
      // 片段著色器
      shader.fragmentShader = lineFragmentShader;
    }
  });
  // 創建飛線
  let l = new THREE.Line(g, m);
  l.userData.idx = idx;
  setPath(l, impacts[idx].prevPosition, impacts[idx].impactPosition, 1);
  trails.push(l);
}
// 飛線網格、起點位置、終點位置、頂點高度
function setPath(l, startPoint, endPoint, peakHeight) {
  let pos = l.geometry.attributes.position;
  let division = pos.count - 1;
  let peak = peakHeight || 1;
  let radius = startPoint.length();
  let angle = startPoint.angleTo(endPoint);
  let arcLength = radius * angle;
  let diameterMinor = arcLength / Math.PI;
  let radiusMinor = (diameterMinor * 0.5) / cycle;
  let peakRatio = peak / diameterMinor;
  let radiusMajor = startPoint.length() + radiusMinor;
  let basisMajor = new THREE.Vector3().copy(startPoint).setLength(radiusMajor);
  let basisMinor = new THREE.Vector3().copy(startPoint).negate().setLength(radiusMinor);
  let tri = new THREE.Triangle(startPoint, endPoint, new THREE.Vector3());
  let nrm = new THREE.Vector3();
  tri.getNormal(nrm);
  let v3Major = new THREE.Vector3();
  let v3Minor = new THREE.Vector3();
  let v3Inter = new THREE.Vector3();
  let vFinal = new THREE.Vector3();
  for (let i = 0; i <= division; i++) {
    let divisionRatio = i / division;
    let angleValue = https://www.cnblogs.com/dragonir/p/angle * divisionRatio;
    v3Major.copy(basisMajor).applyAxisAngle(nrm, angleValue);
    v3Minor.copy(basisMinor).applyAxisAngle(nrm, angleValue + Math.PI * 2 * divisionRatio * 1);
    v3Inter.addVectors(v3Major, v3Minor);
    let newLength = ((v3Inter.length() - radius) * peakRatio) + radius;
    vFinal.copy(v3Inter).setLength(newLength);
    pos.setXYZ(i, vFinal.x, vFinal.y, vFinal.z);
  }
  pos.needsUpdate = true;
  l.computeLineDistances();
  l.geometry.attributes.lineDistance.needsUpdate = true;
  impacts[l.userData.idx].trailLength.value = l.geometry.attributes.lineDistance.array[99];
  l.material.dashSize = 3;
}

添加影片過渡效果

for (let i = 0; i < maxImpactAmount; i++) {
  tweens.push({
    runTween: () => {
      let path = trails[i];
      let speed = 3;
      let len = path.geometry.attributes.lineDistance.array[99];
      let dur = len / speed;
      let tweenTrail = new TWEEN.Tween({ value: 0 })
        .to({value: 1}, dur * 1000)
        .onUpdate( val => {
          impacts[i].trailRatio.value = https://www.cnblogs.com/dragonir/p/val.value;
        });
        var tweenImpact = new TWEEN.Tween({ value: 0 })
        .to({ value: 1 }, THREE.Math.randInt(2500, 5000))
        .onUpdate(val => {
          uniforms.impacts.value[i].impactRatio = val.value;
        })
        .onComplete(val => {
          impacts[i].prevPosition.copy(impacts[i].impactPosition);
          impacts[i].impactPosition.random().subScalar(0.5).setLength(5);
          setPath(path, impacts[i].prevPosition, impacts[i].impactPosition, 1);
          uniforms.impacts.value[i].impactMaxRadius = 5 * THREE.Math.randFloat(0.5, 0.75);
          tweens[i].runTween();
        });
      tweenTrail.chain(tweenImpact);
      tweenTrail.start();
    }
  });
}

?? 創建頭部

頭部機甲風格的形狀是通過純 CSS 實作的,利用 clip-path 屬性,使用不同的裁剪方式創建元素的可顯示區域,區域內的部分顯示,區域外的隱藏,

.header
  background #f9f002
  clip-path polygon(0 0, 100% 0, 100% calc(100% - 35px), 75% calc(100% - 35px), 72.5% 100%, 27.5% 100%, 25% calc(100% - 35px), 0 calc(100% - 35px), 0 0)

?? 如果想了解關于 clip-path 的更多知識,可以訪問文章末尾提供的 MDN 地址,

?? 添加兩側卡片

兩側的 卡片 ??,也是機甲風格形狀,同樣由 clip-path 生成的,卡片有實心實心點狀背景鏤空背景三種基本樣式,

.box
  background-color #000
  clip-path polygon(0px 25px, 26px 0px, calc(60% - 25px) 0px, 60% 25px, 100% 25px, 100% calc(100% - 10px), calc(100% - 15px) calc(100% - 10px), calc(80% - 10px) calc(100% - 10px), calc(80% - 15px) 100%, 80px calc(100% - 0px), 65px calc(100% - 15px), 0% calc(100% - 15px))
  transition all .25s linear
  &.inverse
    border none
    padding 40px 15px 30px
    color #000
    background-color var(--yellow-color)
    border-right 2px solid var(--border-color)
    &::before
      content "T-71"
      background-color #000
      color var(--yellow-color)
  &.dotted, &.dotted::after
    background var(--yellow-color)
    background-image radial-gradient(#00000021 1px, transparent 0)
    background-size 5px 5px
    background-position -13px -3px

卡片上的圖表 ??,直接使用的是 Eachrts 插件,通過修改每個圖表的配置來適配 賽博朋克 2077 的樣式風格,

const chart_1 = echarts.init(document.getElementsByClassName('chart_1')[0], 'dark');
chart_1 && chart_1.setOption(chart_1_option);

?? Echarts 圖示使用不是本文重點內容,想要了解更多細節內容,可訪問其官網,

? 添加底部儀表盤

底部儀表盤主要用于資料展示,并且添加了 3雷達掃描影片,雷達 ?? 形狀則是通過 radial-gradient 徑向漸變來實作的,然后利用 ::before::after 偽元素實作掃描影片效果,具體 keyframes 實作可以查看樣式原始碼,

.radar
  background: radial-gradient(center, rgba(32, 255, 77, 0.3) 0%, rgba(32, 255, 77, 0) 75%), repeating-radial-gradient(rgba(32, 255, 77, 0) 5.8%, rgba(32, 255, 77, 0) 18%, #20ff4d 18.6%, rgba(32, 255, 77, 0) 18.9%), linear-gradient(90deg, rgba(32, 255, 77, 0) 49.5%, #20ff4d 50%, #20ff4d 50%, rgba(32, 255, 77, 0) 50.2%), linear-gradient(0deg, rgba(32, 255, 77, 0) 49.5%, #20ff4d 50%, #20ff4d 50%, rgba(32, 255, 77, 0) 50.2%)
.radar:before
  content ''
  display block
  position absolute
  width 100%
  height 100%
  border-radius: 50%
  animation blips  1.4s 5s infinite linear
.radar:after
  content ''
  display block
  background-image linear-gradient(44deg, rgba(0, 255, 51, 0) 50%, #00ff33 100%)
  width 50%
  height 50%
  animation radar-beam 5s infinite linear
  transform-origin: bottom right
  border-radius 100% 0 0 0

?? 添加互動

故障風格后期

點擊第一個卡片上的按鈕 START ?,星際之旅進入 Hard 模式 ??,頁面將會產生如下圖所示的故障影片效果,它是通過引入 Three.js 內置的后期通道 GlitchPass 實作的,添加以下代碼后,記得要在頁面重繪影片中更新 composer

const composer = new EffectComposer(renderer);
composer.addPass( new RenderPass(scene, camera));
const glitchPass = new GlitchPass();
composer.addPass(glitchPass);

地球點擊事件

使用 Raycaster 給地球網格添加點擊事件,在地球上 雙擊滑鼠 ??,會彈出一個提示框 ??,并會隨機加載一些提示文案,

const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();
window.addEventListener('dblclick', event => {
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
  raycaster.setFromCamera(mouse, camera);
  const intersects = raycaster.intersectObjects(earth.children);
  if (intersects.length > 0) {
    this.setState({
      showModal: true,
      modelText: tips[Math.floor(Math.random() * tips.length)]
    });
  }
}, false);

?? 添加入場影片等其他細節

最后,還添加了一些樣式細節和影片效果,如頭部和兩側卡片的入場影片、頭部時間坐標文字閃爍影片、第一張卡片按鈕故障風格影片Cyberpunk 2077 Logo陰影效果等,由于文章篇幅有限,不在這里細講,感興趣的朋友可以自己查看原始碼學習,也可以查看閱讀我的另一篇文章 僅用CSS幾步實作賽博朋克2077風格視覺效果 > 傳送門 ?? 查看更多細節內容,

總結

本文包含的新知識點主要包括:

  • THREE.Spherical 球體坐標系的應用
  • Shader 結合 TWEEN 實作飛線和沖擊波影片效果
  • dat.GUI 除錯工具庫的使用
  • clip-path 創建不規則圖形
  • Echarts 的基本使用方法
  • radial-gradient 創建雷達圖形及影片
  • GlitchPass 添加故障風格后期
  • Raycaster 網格點擊事件等

后續計劃

本頁面雖然已經做了很多效果和優化,但是還有很多改進的空間,后續我計劃更新的內容包括:

  • ?? 地球坐標和實際地理坐標結合,可以根據經緯度定位到國家、省份等具體位置
  • ?? 縮放適配不同螢屏尺寸
  • ?? 圖表以及儀表盤展示一些真實的資料并且可以實時更新
  • ?? 頭部和卡片添加一些炫酷的描邊影片
  • ?? 添加宇宙星空粒子背景(有時間的話,現在的噪點背景也不錯)
  • ?? 性能優化

想了解其他前端知識或其他未在本文中詳細描述的 Web 3D 開發技術相關知識,可閱讀我往期的文章,轉載請注明原文地址和作者,如果覺得文章對你有幫助,不要忘了一鍵三連哦 ??

附錄

  • 我的3D專欄可以點擊此鏈接訪問 ??

  • [1]. ?? Three.js 實作3D開放世界小游戲:阿貍的多元宇宙

  • [2]. ?? Three.js 火焰效果實作艾爾登法環動態logo

  • [3]. ?? Three.js 實作2022冬奧主題3D趣味頁面,含冰墩墩

  • ...

  • [1]. ?? 前端實作很哇塞的瀏覽器端掃碼功能

  • [2]. ?? 前端瓦片地圖加載之塞爾達傳說曠野之息

  • [3]. ?? 僅用CSS幾步實作賽博朋克2077風格視覺效果

  • ...

參考

  • [1]. https://threejs.org
  • [2]. https://github.com/dataarts/dat.gui/blob/master/API.md
  • [3]. https://echarts.apache.org/zh/index.html
  • [4]. https://www.cnblogs.com/pangys/p/13276936.html
  • [5]. https://developer.mozilla.org/zh-CN/docs/Web/CSS/gradient/radial-gradient
  • [6]. https://developer.mozilla.org/zh-CN/docs/Web/CSS/clip-path

作者:dragonir 本文地址:https://www.cnblogs.com/dragonir/p/16516254.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/500210.html

標籤:JavaScript

上一篇:JS中的樹形資料結構處理

下一篇:html簡單學習!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more