分享:vue3+OpenTiny UI+cesium 实现三维地球

效果图

使用vue3 + OpenTiny UI + cesium 实现三维地球

  1. node.js >= v16.0

  2. opentiny vue3 ui安装指南 https://opentiny.design/tiny-vue/zh-CN/os-theme/docs/installation yarn add @opentiny/vue@3

项目依赖

"dependencies": {"@opentiny/vue": "3","core-js": "^3.8.3","vue": "^3.2.13","vue-router": "4","cesium": "^1.99.0","cesium-navigation-es6": "^3.0.8"}

模块化代码

main.js

import { createApp } from 'vue'
import App from './App.vue'
// 引入 @opentiny/vue 组件
import TinyVue from '@opentiny/vue'
import Cesium from 'cesium'// 创建并挂载根实例
const app = createApp(App)
// 注册 @opentiny/vue 组件
app.use(TinyVue)
app.use(Cesium)
app.mount('#app')

App.vue

<template><gis></gis>
</template><script>
import gis from './components/EarthGis.vue'export default {name: 'App',components: {gis},data() {return {}},mounted(){// 在“about:blank”中阻止脚本执行,因为文档的框架已被沙盒化并且未设置“allow-scripts”权限。let iframe = document.getElementsByClassName('cesium-infoBox-iframe')[0];iframe.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-popups allow-forms');iframe.setAttribute('src', ''); // 必须设置src为空 否则不会生效。}
}
</script><style>
body {margin: 0;padding: 0;background-color: #e9edfa;
}
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;background-color: transparent;
}
#loading {position: fixed;top: 50%;left: 50%;transform: translate(-50%);z-index: 1;
}
.progressText {text-align: center;
}
</style>

EarthGis.vue

<template><div class="content"><tiny-layout :cols="12"><tiny-row :gutter="10"><tiny-col :span="12"><div class="col" style="position: relative;"><div class="select-menu"><tiny-dropdown title="影像来源"  size="medium" split-button @item-click="selectChange"><template #dropdown><tiny-dropdown-menu popper-class="select-item"><tiny-dropdown-itemv-for="(item, index) in imageryLayersOptions":key="index":label="item.label":item-data="item.value"></tiny-dropdown-item></tiny-dropdown-menu></template></tiny-dropdown></div><div id="cesium-container"></div></div></tiny-col></tiny-row></tiny-layout></div>
</template><script type="allow-scripts">
import 'cesium/Source/Widgets/widgets.css'
import {  Layout, Row, Col, Dropdown, DropdownMenu, DropdownItem } from '@opentiny/vue'
import { World } from './js/World/World.js'
export default {name: 'EarthGis',props: {msg: String},components: {TinyDropdown: Dropdown,TinyDropdownMenu: DropdownMenu,TinyDropdownItem: DropdownItem,TinyLayout: Layout,TinyRow: Row,TinyCol: Col},watch: {isLoading: function (val) {document.getElementById('loading').style.display = val ? 'black' : 'none'}},data() {return {isLoading: true,imageryLayersOptions: [{value: 'SingleTile',label: 'SingleTileImageryProvider'}],world: null}},methods: {selectChange(data) {let item = data.itemDataswitch (item) {case 'SingleTile':this.world.changeImagery()breakdefault:break}}},mounted() {// 1. Create an instance of the World appthis.world = new World('cesium-container');this.$nextTick(() => {this.selectChange({itemData: 'SingleTile'})})},destroy(){this.removeNavigation()}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
#cesium-container{width: 100vw;height: 100vh;
}
.select-menu{position: absolute;top: 1rem;left: 1rem;background: #ffffff66;border-radius: 5px;padding: 10px;
}
.select-item{top: 1rem;left: 1rem;background: #ffffff66;border-radius: 5px;padding: 10px;
}
</style>

World.js

import { createViewer } from './components/viewer.js'
import { createImageryLayer } from './components/imageryLayer.js'
import { createTerrain } from './components/terrain.js'
import { createNavigation } from './components/navigation.js'
import { createCamera } from './components/camera.js';
import darkEarth from '@/assets/images/darkEarth.jpg'
import { FeatureDetection, DirectionalLight, Cartesian3, JulianDate, Math, CameraEventType, KeyboardEventModifier, Cesium3DTileset,HeadingPitchRange,Matrix4,Cartographic,ScreenSpaceEventType,SingleTileImageryProvider,WebMercatorTilingScheme,ScreenSpaceEventHandler,WebMapTileServiceImageryProvider,GeographicTilingScheme,ImageryLayer, UrlTemplateImageryProvider,OpenStreetMapImageryProvider,IonImageryProvider,createOsmBuildings,Rectangle  } from 'cesium'
// These variables are module-scoped: we cannot access them
// from outside the module
let viewer;
// 添加主题图层相关配置
let layerOption = {show: true, // 图像层是否可见alpha: 0.6, // 透明度nightAlpha: 1, // 地球夜晚一侧的透明度dayAlpha: 1, // 地球白天一侧的透明度brightness: 1, // 亮度contrast: 1, // 对比度hue: 0, // 色调saturation: 1, // 饱和度gamma: 1, // 伽马校正
}
class World {// 1. Create an instance of the World appconstructor(id) {viewer = createViewer(id)viewer.imageryLayers.removeAll(true)}init(){// 修改场景环境,关闭相关特效viewer.scene.debugShowFramesPerSecond = true// 显示fpsviewer.scene.moon.show = true// 月亮viewer.scene.fog.enabled = true// 雾viewer.scene.sun.show = true// 太阳viewer.scene.skyBox.show = true// 天空盒viewer.scene.globe.enableLighting = true // 激活基于太阳位置的光照(场景光照)viewer.resolutionScale = 1// 画面细度,默认值为1.0// 不显示cesium icon版权信息viewer._cesiumWidget._creditContainer.style.display="none"viewer.geocoder._form.children[0].placeholder = "请输入关键字"// DirectionalLight 表示 从无限远的地方向单一方向发射的光。解决模型光照问题viewer.scene.light = new DirectionalLight({direction: new Cartesian3(0.354925, -0.890918, -0.283358)})viewer.clock.currentTime = JulianDate.addHours(JulianDate.now(new Date()),12,new JulianDate())// 启用深度测试,使地形后面的东西消失。viewer.scene.globe.depthTestAgainstTerrain = trueviewer.scene.fxaa = falseviewer.scene.postProcessStages.fxaa.enabled = true// 水雾特效viewer.scene.globe.showGroundAtmosphere = true// 设置最大俯仰角,[-90,0]区间内,默认为-30,单位弧度viewer.scene.screenSpaceCameraController.constrainedPitch = Math.toRadians(-20)viewer.scene.screenSpaceCameraController.autoResetHeadingPitch = falseviewer.scene.screenSpaceCameraController.inertiaZoom = 0.5viewer.scene.screenSpaceCameraController.minimumZoomDistance = 50viewer.scene.screenSpaceCameraController.maximumZoomDistance = 20000000viewer.scene.screenSpaceCameraController.zoomEventTypes = [CameraEventType.RIGHT_DRAG,CameraEventType.WHEEL,CameraEventType.PINCH]viewer.scene.screenSpaceCameraController.tiltEventTypes = [CameraEventType.MIDDLE_DRAG,CameraEventType.PINCH,{eventType: CameraEventType.LEFT_DRAG,modifier: KeyboardEventModifier.CTRL},{eventType: CameraEventType.RIGHT_DRAG,modifier: KeyboardEventModifier.CTRL}]// 开启抗锯齿if (FeatureDetection.supportsImageRenderingPixelated()) {// 判断是否支持图像渲染像素化处理viewer.resolutionScale = window.devicePixelRatio}// 添加默认图层createImageryLayer()// 开启Navigation导航插件createNavigation(viewer)// 添加cesium自带的地形createTerrain(viewer)// 将三维球定位到中国viewer.camera.flyTo({destination: Cartesian3.fromDegrees(103.84, 31.15, 17860000),orientation: {heading: Math.toRadians(348.4202942851978),pitch: Math.toRadians(-89.74026687972041),roll: Math.toRadians(0)},complete: () => {// 定位完成之后的回调函数console.log('定位完成')document.getElementById('loading').style.display = 'none'}})// 设置默认的视角为中国createCamera.DEFAULT_VIEW_RECTANGLE = Rectangle.fromDegrees(// 西边经度89.5,// 南边维度20.4,// 东边经度110.4,// 北边维度61.2)//this.cion(layerOption)//this.osm(layerOption)this.hot(layerOption)//this.cartoVoyager(layerOption)//this.cartoDark(layerOption)//this.stamen(layerOption)//this.wmtsImages(layerOption)//this.osmBuildings()// const tilesetOption = {//     skipLevelOfDetail: true,//     baseScreenSpaceError: 1024,//     skipScreenSpaceErrorFactor: 16,//     skipLevels: 1,//     immediatelyLoadDesiredLevelOfDetail: false,//     loadSiblings: false,//     cullWithChildrenBounds: true// }// const modelPromise = this.addThreeDTiles(69380, tilesetOption);// modelPromise.then(model => {//     console.log('tileset: ', model)//     this.setPosition(model, 113.27, 23.13, 10) // 调整位置到,高度10米//     this.setPosition(model, undefined, undefined, 500) // 仅修改高度至500米//     this.serMatrix(model) // 使用默认变换矩阵(单位向量),实现回到默认位置的效果// })}// 切换图层changeImagery() {viewer.imageryLayers.removeAll(true)this.roaming()}async addThreeDTiles(url, option) {// 开启地形深度检测:// 控制在渲染场景时,相机是否进行深度测试以避免将被遮挡的物体绘制在前景// true: 相机会根据地形高度信息进行深度测试,避免将低于地面的物体绘制在地面之上viewer.scene.globe.depthTestAgainstTerrain = truelet tileset = {}if (typeof url == 'number') {tileset = await Cesium3DTileset.fromIonAssetId(url, option);} else {tileset = await Cesium3DTileset.fromUrl(url, option);}viewer.scene.primitives.add(tileset);// 定位到模型viewer.zoomTo(tileset,new HeadingPitchRange(0.0,-0.5,tileset.boundingSphere.radius * 2.0 // 模型的包围球半径的2倍))return tileset // 返回模型对象}setPosition(tileset, lng, lat, h) {// 计算出模型包围球的中心点(弧度制),从世界坐标转弧度制const cartographic = Cartographic.fromCartesian(tileset.boundingSphere.center)const { longitude, latitude, height } = cartographic// 模型包围球的中心点坐标,输出以笛卡尔坐标系表示的三维坐标点const current = Cartesian3.fromRadians(longitude,latitude,height)// 新的位置的中心点坐标,输出以笛卡尔坐标系表示的三维坐标点const offset = Cartesian3.fromDegrees(lng || Math.toDegrees(longitude),lat || Math.toDegrees(latitude),h || height);// 计算差向量:计算tileset的平移量,并将其应用到modelMatrix中const translation = Cartesian3.subtract(offset,current,new Cartesian3())// 修改模型的变换矩阵,通过四维矩阵tileset.modelMatrix = Matrix4.fromTranslation(translation);viewer.zoomTo(tileset);}//Resets the position of a tileset to a specified model matrix or the identity matrix if none is provided.serMatrix(tileset, matrix) {tileset.modelMatrix = matrix || Matrix4.IDENTITYviewer.zoomTo(tileset);}showAllImagery(boolean = true) {// 获取图像图层集合const imageryLayers = viewer.imageryLayers;// 遍历图像图层并隐藏它们let numLayers = imageryLayers.length;for (let i = 0; i < numLayers; i++) {const layer = imageryLayers.get(i); // 获取图像图层对象layer.show = boolean; // 设置图像图层隐藏}}async roaming() {let isRoaming = true; // 漫游标志位const DEFAULT_LIGHTING = viewer.scene.globe.enableLighting; // 默认光照状态const DEFAULT_SKY_ATMOSPHERE = viewer.scene.skyAtmosphere.show; // 默认光照状态let bgImglayer; // 地球底图this.showAllImagery(false); // 隐藏所有图层viewer.clock.multiplier = -2000.0;  // 时间加速const provider = await SingleTileImageryProvider.fromUrl(darkEarth);provider._tilingScheme = new WebMercatorTilingScheme()bgImglayer = viewer.imageryLayers.addImageryProvider(provider); // 加载背景底图if (!DEFAULT_LIGHTING) {viewer.scene.globe.enableLighting = true; // 开启光照}if (!DEFAULT_SKY_ATMOSPHERE) {viewer.scene.skyAtmosphere.show = true; // 开启天空大气,能在一定程度上降低地球轮廓锯齿}// 添加鼠标事件,触发后停止漫游效果const handler = new ScreenSpaceEventHandler(viewer.scene.canvas); // 交互句柄handler.setInputAction(() => {isRoaming = false // 停止旋转this.showAllImagery(true) // 显示图层if (!DEFAULT_LIGHTING) {viewer.scene.globe.enableLighting = false; // 关闭光照}if (!DEFAULT_SKY_ATMOSPHERE) {viewer.scene.skyAtmosphere.show = false; // 关闭光照}viewer.imageryLayers.remove(bgImglayer, true); // 移除图层viewer.clock.multiplier = 1;  // 正常时间流速handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK); // 移除鼠标事件监听this.init()}, ScreenSpaceEventType.LEFT_CLICK);(function roamingEvent() {if (isRoaming) {// 控制相机围绕 Z 轴旋转viewer.camera.rotate(Cartesian3.UNIT_Z, Math.toRadians(0.1));requestAnimationFrame(roamingEvent);}})()}// Cesium ION 服務cion (layerOption, id = 3812)  {const layer = new ImageryLayer(new IonImageryProvider({ assetId: id }),layerOption)viewer.imageryLayers.add(layer)return layer}// 加载osm地图osm (layerOption)  {const layer = new ImageryLayer(new OpenStreetMapImageryProvider({ url: 'https://a.tile.openstreetmap.org/' }),layerOption)viewer.imageryLayers.add(layer)return layer}// 加载Humanitarian OpenStreetMap Team style地图hot (layerOption)  {const layer = new ImageryLayer(new UrlTemplateImageryProvider({ url: 'https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c'] }),layerOption)viewer.imageryLayers.add(layer)return layer}// 加载carto Basemaps 航海风格地图cartoVoyager (layerOption)  {const layer = new ImageryLayer(new UrlTemplateImageryProvider({ url: 'https://basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png' }),layerOption)viewer.imageryLayers.add(layer)return layer}// 加载carto Basemaps 黑暗风格地图cartoDark (layerOption)  {const layer = new ImageryLayer(new UrlTemplateImageryProvider({ url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c', 'd'] }),layerOption)viewer.imageryLayers.add(layer) return layer}// 加载Stamen地图stamen (layerOption) {const layer = new ImageryLayer(new UrlTemplateImageryProvider({ url: 'https://stamen-tiles.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png' }),layerOption)viewer.imageryLayers.add(layer)return layer}// 加载WMTS瓦片地图服务wmtsImages () {// EPSG:900913(标准名为EPSG:3875)网格切分的瓦片。当将tileMatrixSetID设置为 'EPSG:4326',访问常用的EPSG:4326网络的瓦片// 访问GeoServer发布的地图瓦片服务 WebMapTileServiceImageryProvider的切片方案tilingScheme默认使用EPSG:3875投影,即伪墨卡托网格访问切片,与EPSG:4326网格的切片方案存在较大差异// Tiling是一种椭球体表面上的几何图形或图像的平铺方案。在详细级别为0,即最粗、最不详细的级别上,瓦片的数量是可配置的。在详细级别为1级以上,每个是一级级瓦片经纬两个方向上扩展为两个瓦片,共有四个子瓦片。如此扩展到最大的缩放级别,这也构成了一个图像瓦片的金字塔。TillingScheme有一个参数ellipsoid用来决定切处时使用的椭球,另外两个比较重要的参数numberOfLevelZeroTilesX和numberOfLevelZeroTilesY,用来决定0级瓦片的数量。// TilingSchemee有两个子类,为WebMercatorTilingScheme和GeographicTilingScheme。其中WebMercatorTilingScheme对应于EPSG:3857切片方案,常见于谷歌地图、微软必应地图以及大多数的ArcGIS在线地图,也是Cesium中默认的切片方案。// GeographicTilingScheme对应于EPSG:4326切片方案,是一个简单的地理投影方案,可直接将经纬度映射为X和Y,这种投影通常被称为地理投影、等矩形投影、等距圆柱形投影等。// 由于在X方向上,WebMercatorTilingScheme只有一个0级瓦片,而GeographicTilingScheme却有2个,这就导致了默认的EPSG:3857切片方案不能正确加载EPSG:4326切片方案的瓦片图像。let layer = new WebMapTileServiceImageryProvider({url : '/map/gwc/service/wmts/rest/xian:satellite/{style}/{TileMatrixSet}/{TileMatrixSet}:{TileMatrix}/{TileRow}/{TileCol}?format=image/png',style : 'raster',tileMatrixSetID : 'EPSG:4326',tilingScheme: new GeographicTilingScheme(),});viewer.imageryLayers.addImageryProvider(layer);return layer}// 载入OSM建筑物osmBuildings = () => {// 突出显示所有的商业和住宅建筑,以查看整个城市不同社区的模式// Cesium OSM 建筑物通过3D Tiles,它可以在web上高效地流式传输和可视化。// 3D Tiles是一个开放的标准,所以Cesium OSM建筑可以在任何兼容它的查看器中使用,不仅仅是开源的Cesium。// Cesium全球3.5亿做建筑物,数据来源openStreetMap地图//OpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。//其包含图层主要有高速公路、铁路、水系、水域、建筑、边界、建筑物等图层。我们不仅能够免费下载城市数据还可以下载全球数据。//网址为https://www.openstreetmap.org///Cesium中支持使用OSM在线的建筑矢量三维模型,但目前OSM数据在国外较为细致,国内只支持几个大城市。//由于OSM建筑数据量大,加载较慢,用户在使用建筑白膜时,可根据需求,在OSM官网或百度、高德等地图服务商中下载建筑矢量数据,//使用ArcGIS等GIS软件和SketchUP等建模软件,生成建筑白膜,并使用建模软件对白膜进行贴图修改等操作,以实现城市建筑的美化,//使用CesiumLab等软件对建模的三维建筑数据 进行切片生成3Dtiles等Cesium支持的数据类型,对其进行加载使用。const addOSMAsync = () => {try {// 突出显示所有的商业和住宅建筑,以查看整个城市不同社区的模式viewer.scene.primitives.add(createOsmBuildings())} catch (error) {console.log(`Failed to add world imagery: ${error}`);}};addOSMAsync()}
}export { World };

viewer.js

import { Viewer, Ion } from 'cesium'
function createViewer(id) {const cesiumToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJmNDVhMjQ0Yi05MDg4LTRlNDYtYTIxMi00YmI4ZWYxOWMyNTgiLCJpZCI6MTQ5MzYwLCJpYXQiOjE2ODc3ODQ0OTh9.KlhT_LCnsEtYyawpEmJ_wx44_qTUbgze-SxGMRavbAM'Ion.defaultAccessToken = cesiumTokenconst viewerOption = {// 默认隐藏infoBox: true, //是否显示信息框animation:false,    //左下角的动画仪表盘baseLayerPicker:true,  //右上角的图层选择按钮geocoder:true,  //搜索框homeButton:true,  //home按钮sceneModePicker:true, //模式切换按钮timeline:true,    //底部的时间轴navigationHelpButton:true,  //右上角的帮助按钮fullscreenButton:true,   //右下角的全屏按钮contextOptions:{webgl:{alpha:true}}}const instance = new Viewer(id, viewerOption);return instance;
}export { createViewer }

imageryLayer.js

import { ImageryLayer, UrlTemplateImageryProvider } from 'cesium'
// 添加主题图层相关配置
let layerOption = {show: true, // 图像层是否可见alpha: 0.6, // 透明度nightAlpha: 1, // 地球夜晚一侧的透明度dayAlpha: 1, // 地球白天一侧的透明度brightness: 1, // 亮度contrast: 1, // 对比度hue: 0, // 色调saturation: 1, // 饱和度gamma: 1, // 伽马校正
}
function createImageryLayer( option=layerOption ) {// 添加主题图层相关配置const instance = new ImageryLayer(new UrlTemplateImageryProvider({ url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png', subdomains: ['a', 'b', 'c', 'd'] }),option)return instance;
}export { createImageryLayer }

camera.js

import { Camera } from 'cesium'
function createCamera() {const instance = Camera;return instance;
}export { createCamera }

terrain.js

import { createWorldTerrainAsync } from 'cesium'
function createTerrain(viewer) {// 添加地形数据const addWorldTerrainAsync = async () => {try {const terrainProvider = await createWorldTerrainAsync({requestWaterMask: false, // 水面特效requestVertexNormals: true // 地形照明});  viewer.terrainProvider = terrainProvider;} catch (error) {console.log(`Failed to add world imagery: ${error}`);}};addWorldTerrainAsync()
}export { createTerrain }

navigation.js

import CesiumNavigation from 'cesium-navigation-es6'
import { Cartographic } from 'cesium'let instance;
function createNavigation(viewer) {let navigationOptions = {};// 用于在使用重置导航重置地图视图时设置默认视图控制。接受的值是Cesium.Cartographic 和Cesium.Rectangle.navigationOptions.defaultResetView = Cartographic.fromDegrees(103.84, 31.15, 17860000);// 用于启用或禁用罗盘。true是启用罗盘,false是禁用罗盘。默认值为true。如果将选项设置为false,则罗盘将不会添加到地图中。navigationOptions.enableCompass= true;// 用于启用或禁用缩放控件。true是启用,false是禁用。默认值为true。如果将选项设置为false,则缩放控件 将不会添加到地图中。navigationOptions.enableZoomControls= true;// 用于启用或禁用距离图例。true是启用,false是禁用。默认值为true。如果将选项设置为false,距离图例将不会添加到地图中。navigationOptions.enableDistanceLegend= true;// 用于启用或禁用指南针外环。true是启用,false是禁用。默认值为true。如果将选项设置为false,则该环将可见但无效。navigationOptions.enableCompassOuterRing= true;navigationOptions.resetTooltip = "重置";navigationOptions.zoomInTooltip = "放大";navigationOptions.zoomOutTooltip = "缩小";// 开启Navigation 罗盘、图例、指南针等导航插件instance = new CesiumNavigation(viewer, navigationOptions);return instance;
}
function removeNavigation(){instance.destroy();
}export { createNavigation, removeNavigation }

夜色中的地球图片

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像合成】基于DCGAN典型网络的MNIST字符生成(pytorch)

关于 近年来&#xff0c;基于卷积网络&#xff08;CNN&#xff09;的监督学习已经 在计算机视觉应用中得到了广泛的采用。相比之下&#xff0c;无监督 使用 CNN 进行学习受到的关注较少。在这项工作中&#xff0c;我们希望能有所帮助 缩小了 CNN 在监督学习和无监督学习方面的成…

FPGA时钟资源详解(2)——Clock-Capable Inputs

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 1.1 为什么使用CC 1.2 如何使用CC 二、Clock-Capable Inputs 2.1 SRCC 2.2 MRCC 2.3 其他用途 2.3.1…

element-plus中的日期时间选择器el-date-picker;日期选择面板中选定起始与结束的日期只能改具体的时刻,日期默认是一个月没法动态修改问题

目前遇到一个问题&#xff0c;在使用element-plus中的日期时间选择器el-date-picker&#xff0c;type为datetimerange时&#xff0c;展示的日期选择面板有两个输入框&#xff0c;开始时间和结束时间&#xff0c;element-plus只提供了default-time 使用datetimerange进行范围选择…

我们是如何测试人工智能的(八)包含大模型的企业级智能客服系统拆解与测试方法 -- 大模型 RAG

大模型的缺陷 -- 幻觉 接触过 GPT 这样的大模型产品的同学应该都知道大模型的强大之处&#xff0c; 很多人都应该调戏过 GPT&#xff0c;跟 GPT 聊很多的天。 作为一个面向大众的对话机器人&#xff0c;GPT 明显是鹤立鸡群&#xff0c;在世界范围内还没有看到有能跟 GPT 扳手腕…

五款会让你爱不离手的编程工具,用了都说好,加班变得少。

作为一名“CV工程师” 勤勤恳恳地复制粘贴 没想到AI来了之后 连搬运都不用了&#xff01; 融入了AI代码生成能力的工具 真的能代替程序员的位置吗&#xff1f; 看完这5个AI工具 咱们再来说结论吧&#xff01; aiXcoder 在平时写代码的过程中&#xff0c;经常需要通过上…

flutter3_douyin:基于flutter3+dart3短视频直播实例|Flutter3.x仿抖音

flutter3-dylive 跨平台仿抖音短视频直播app实战项目。 全新原创基于flutter3.19.2dart3.3.0getx等技术开发仿抖音app实战项目。实现了类似抖音整屏丝滑式上下滑动视频、左右滑动切换页面模块&#xff0c;直播间进场/礼物动效&#xff0c;聊天等模块。 运用技术 编辑器&#x…

吴恩达2022机器学习专项课程(一) 4.2 梯度下降实践

问题预览/关键词 本节内容梯度下降更新w的公式梯度下降更新b的公式的含义α的含义为什么要控制梯度下降的幅度&#xff1f;导数项的含义为什么要控制梯度下降的方向&#xff1f;梯度下降何时结束&#xff1f;梯度下降算法收敛的含义正确更新梯度下降的顺序错误更新梯度下降的顺…

网络编程之流式套接字

流式套接字&#xff08;SOCK_STREAM&#xff09;是一种网络编程接口&#xff0c;它提供了一种面向连接的、可靠的、无差错和无重复的数据传输服务。这种服务保证了数据按照发送的顺序被接收&#xff0c;使得数据传输具有高度的稳定性和正确性。通常用于那些对数据的顺序和完整性…

【vue3学习笔记(一)】vue3简介;使用vue-cli创建工程;使用vite创建工程;分析工程结构;安装开发者工具

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 对应课程136-140节 课程 P136节 《vue3简介》笔记 课程 P137节 《使用vue-cli创建工程》笔记 官方文档&#xff1a; https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create官方文档地址 查看vue-cli版本&#x…

不要盲目开抖店,这才是开店的正确流程,2024全新版教程

我是王路飞。 抖音小店和视频号小店&#xff0c;我更建议没有经验的新手去做抖音小店。 虽然现在抖音小店不属于是一个蓝海项目了&#xff0c;但它依旧是我们普通人借助抖音流量变现非常重要的一个渠道&#xff0c;甚至没有之一。 至于视频号小店&#xff0c;可以说是当下最…

【JSON2WEB】11 基于 Amis 角色功能权限设置页面

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

油缸位置传感器871D-DW2NP524-N4

概述 油缸位置传感器是一种使用电感原理来检测物体接近的开关装置。它通过感应物体的电磁场来判断物体的位置&#xff0c;并将信号转化为电信号输出。当物体靠近或远离电感式接近开关时&#xff0c;物体的电磁场会改变&#xff0c;从而使接近开关产生不同的信号输出。电感式接…

Chrome 插件 tabs API 解析

Chrome.tabs API 解析 使用 chrome.tabs API 与浏览器的标签页系统进行交互&#xff0c;可以使用此 API 在浏览器中创建、修改和重新排列标签页 Tabs API 不仅提供操作和管理标签页的功能&#xff0c;还可以检测标签页的语言、截取屏幕截图&#xff0c;以及与标签页的内容脚本…

MySQL面试汇总(一)

MySQL 如何定位慢查询 如何优化慢查询 索引及其底层实现 索引是一个数据结构&#xff0c;可以帮助MySQL高效获取数据。 聚簇索引和非聚簇索引 覆盖索引 索引创建原则 联合索引

6. 学习方法和Java概述

文章目录 1&#xff09;学习方法2&#xff09;Java是什么&#xff1f; 1&#xff09;学习方法 作为一个0基础入门的同学&#xff0c;在刚开始学习的时候&#xff0c;我们不要追求知识点的深度&#xff0c;而是要追求知识点的广度。简单来说&#xff0c;学一个知识点不要想的太…

TCP和UDP分别是什么?TCP和UDP的区别

在计算机网络通信中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两种重要的传输层协议&#xff0c;它们在数据传输过程中发挥着关键作用。本文将深入探讨TCP和UDP的定义、特点以及它们之间的区…

【Qt】QDialog对话框

目录 一、概念 二、对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 三、消息对话框QMessageBox 四、颜色对话框QColorDialog 五、文件对话框QFileDialog 六、字体对话框QFontDialog 七、输入对话框QInputDialog 一、概念 对话框是GUI程序中不可或…

MrDoc寻思文档 个人wiki搭建

通过Docker快速搭建个人wiki&#xff0c;开源wiki系统用于知识沉淀&#xff0c;教学管理&#xff0c;技术学习 部署步骤 ## 拉取 MrDoc 代码 ### 开源版&#xff1a; git clone https://gitee.com/zmister/MrDoc.git### 专业版&#xff1a; git clone https://{用户名}:{密码…

「媒体宣传」如何针对不同行业制定媒体邀约方案

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 针对不同行业制定媒体邀约方案时&#xff0c;需要考虑行业特点、目标受众、媒体偏好以及市场趋势等因素。 一、懂行业 先弄清楚你的行业是啥样&#xff0c;有啥特别之处。 了解行业的热…

PPT没保存怎么恢复?3个方法(更新版)!

“我刚做完一个PPT&#xff0c;正准备保存的时候电脑没电自动关机了&#xff0c;打开电脑后才发现我的PPT没保存。这可怎么办&#xff1f;还有机会恢复吗&#xff1f;” 在日常办公和学习中&#xff0c;PowerPoint是制作演示文稿的重要工具。我们会在各种场景下使用它。但有时候…