项目难点和优化

news2024/10/1 9:36:44

难点: 对于同一个位置百度地图定位的经纬度和腾讯地图定位的经纬度不一样?

解决:由于两者所用的算法不同,计算出来的经纬度也是不一样的,将百度地图的经纬度转换成腾讯地图的经纬度/腾讯的经纬度转化百度的经纬度
export function  bMapTransQQMap(lng,lat){
        let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        let x = lng - 0.0065;
        let y = lat - 0.006;
        let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
        let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
        let lngs = z * Math.cos(theta);
        let lats = z * Math.sin(theta);
        return {
            longitude: lngs,
            latitude: lats
        }
 }
// 腾讯转百度
export function qqMapTransBMap(lng,lat){
        let x_pi = 3.14159265358979324 * 3000.0 / 180.0;
        let x = lng;
        let y = lat;
        let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
        let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
        let lngs = z * Math.cos(theta) + 0.0065;
        let lats = z * Math.sin(theta) + 0.006;
        return {
            longitude: lngs,
            latitude: lats
        }
}

难点 : 移动端使用echarts绘制图表使用tooltip无效果

解决:

echarts 引入的时候,会优先判断当前的环境。

uniapp的又一个全局变量就叫做wx。
导致这里的判断直接走第一个。

在main.js中

window.wx = {}  直接将wx重新赋值。

难点:echarts中的面积图,由于点击区域、折线、折线中的小圆点都会出现提示框,只有点击折线上的点才出现tooltip(提示框),

解决:通过监听echart的鼠标的mouseover事件,函数中设置某个全局变量为当前折线的seriesName(名字),然后再监听鼠标的mouseout事件,函数中设置某个全局变量为空字符串,这两个事件只有直线上的小圆点才执行的,所以可以区分区域点击事件和折线点击事件,之后在提示框的自定义内容中(formatter),如果存在某个全局变量就显示提示框,否则不显示。

难点:在线上,使用window.open方法无法实现下载功能

解决:

webpack构建优化

webpack构建优化

构建前: 编译速度:2.69m

​ 构建速度 :第一次构建速度: 59.93,

​ cache-loader: 默认脚手架使用了cache-loader进行缓存,第二次的构建速度: 39.84 ,构建速度提升了33%

​ 为 loader 指定 include,减少 loader 应用范围,仅应用于最少数量的必要模块,。rule.exclude 可以排除模块范围,也可用于减少 loader 应用范围.

​ thread-loader多线程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一次编译:177 第二次编译: 75 热更新:15

在优化开始之前,需要做一些准备工作。

安装以下 webpack 插件,帮助我们分析优化效率:

1. 编译进度条

一般来说,中型项目的首次编译时间为 5-20s,没个进度条等得多着急,通过 progress-bar-webpack-plugin 插件查看编译进度,方便我们掌握编译情况。

安装:

npm i -D progress-bar-webpack-plugin

vue.config.js 配置如下

const chalk = require('chalk')
const ProgressBarPlugin = require('progress-bar-webpack-plugin')
 configureWebpack: config => {
      config.plugins.push(new ProgressBarPlugin({
      format: `  :msg [:bar] ${chalk.green.bold(':percent')} (:elapsed s)`
    }))
 }

2. 编译速度分析

优化 webpack 构建速度,首先需要知道是哪些插件、哪些 loader 耗时长,方便我们针对性的优化。

通过 speed-measure-webpack-plugin 插件进行构建速度分析,可以看到各个 loader、plugin 的构建时长,后续可针对耗时 loader、plugin 进行优化。

安装:

npm i -D speed-measure-webpack-plugin

vue.config.js 配置如下

const SpeedMeasurePlugin = require("speed-measure-webpack-plugin")
 configureWebpack: config => {
      config.plugins.push(new ProgressBarPlugin({
      format: `  :msg [:bar] ${chalk.green.bold(':percent')} (:elapsed s)`
    }), new SpeedMeasurePlugin())
 }

3. 打包体积分析

build 构建打包命令加入 --report inspect命令生成一份vue-cli 内置的配置内容

  "scripts": {
    "build": "vue-cli-service build --report",
    "inspect": "vue-cli-service inspect --> output.js"
  },

4. 查看vue.config.js 的输出后的所有配置

  "scripts": {
    "inspect": "vue-cli-service inspect --> output.js"
  },

第一次编译:219s ,第二次编译:72s

加入配置config.resolve.modules 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤 extensions缩小查找后缀的范围

 configureWebpack: config => {
      // 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤
    // __diename 表示当前工作目录,也就是项目根目录
    config.resolve.modules.unshift(resolve('node_modules'))
    config.resolve.extensions = ['.js', '.vue', '.json']
  },

构建完成:第一次编译:173s 153s 第二次编译:65s

加入配置 **config.module.noParse = /^(vue|vue-router|vuex|vuex-router-sync|jquery|lodash|chartjs|echarts)$/ ** 防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中 不应该含有 import, require, define 的调用,或任何其他导入机制。忽略大型的 library 可以提高构建性能。

 configureWebpack: config => {
        // 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤
    // __diename 表示当前工作目录,也就是项目根目录
    config.resolve.modules.unshift(resolve('node_modules'))
    config.resolve.extensions = ['.js', '.vue', '.json']
     // 防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中 
    // 不应该含有 import, require, define 的调用,或任何其他导入机制。忽略大型的 library 可以提高构建性能。
    config.module.noParse = /^(vue|vue-router|vuex|vuex-router-sync|lodash)$/
  },

构建完成:第一次编译:155s 第二次编译:64

加入thread-loader —— 开启多线程优化配置,对于编译时间过长的loader加入thread-loader,

注意:仅在耗时的操作中使用 thread-loader,否则使用 thread-loader 会后可能会导致项目构建时间变得更长,因为每个 worker 都是一个独立的 node.js 进程,其开销大约为 600ms 左右,同时还会限制跨进程的数据交换等。

 configureWebpack: config => {
      // 对babel-loader 使用thread-loader
    config.module.rules[12].use.unshift({
      loader: 'thread-loader',
      options: {
        workers: 3 // 进程3个
      }
    })
    config.module.rules[15].use.unshift({
      loader: 'thread-loader',
      options: {
        workers: 3 // 进程3个
      }
    })
 }
  chainWebpack: config => { 
  	 config.module
      .rule('markdown')
      .test(/\.md$/)
      .use('loader1')
        .loader('loader1') // 第一个 Loader
        .end()
      .use('loader2')
        .loader('loader2') // 第二个 Loader
        .options({ /* Loader 的选项 */ })
        .end()
      .use('loader3')
        .loader('loader3') // 第三个 Loader
        .end();
  }

构建完成:第一次编译:151s 第二次编译:62s

IgnorePlugin

webpack 的内置插件,作用是忽略第三方包指定目录。

例如: moment (2.24.0版本) 会将所有本地化内容和核心功能一起打包,我们就可以使用 IgnorePlugin 在打包时忽略本地化内容。

//webpack.config.js
module.exports = {
    //...
    plugins: [
        //忽略 moment 下的 ./locale 目录
        new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
    ]
}

在使用的时候,如果我们需要指定语言,那么需要我们手动的去引入语言包,例如,引入中文语言包:

import moment from 'moment';
import 'moment/locale/zh-cn';// 手动引入

index.js 中只引入 moment,打包出来的 bundle.js 大小为 263KB,如果配置了 IgnorePlugin,单独引入 moment/locale/zh-cn,构建出来的包大小为 55KB

externals

我们可以将一些JS文件存储在 CDN 上(减少 Webpack打包出来的 js 体积),在 index.html 中通过 <script> 标签引入,如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="root">root</div>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</body>
</html>

我们希望在使用时,仍然可以通过 import 的方式去引用(如 import $ from 'jquery'),并且希望 webpack 不会对其进行打包,此时就可以配置 externals

//webpack.config.js
module.exports = {
    //...
    externals: {
        //jquery通过script引入之后,全局中即有了 jQuery 变量
        'jquery': 'jQuery'
    }
}

构建完成: 226s 186s 代码体积减少50%,文件数量减少40%

性能优化

性能分析工具:chrome-Lighthouse

分数:25

Eliminate render-blocking resources: 消除渲染阻塞资源

​ 优化前:1.7s

​ 优化后:0s

​ 优化css样式:异步加载css:1、js动态加载css 2、rel=“preload”

 <link type="text/css" rel="preload" href="<%= BASE_URL %>tinymce/skins/lightgray/skin.min.css"/>

​ 优化js:babel-polyfill插件是开发环境才需要,不需要在生产环境上使用,去除掉babel-polyfill的引入,如需引入可异步加载js

splitChunk: 对代码进行分割,合并公用代码块,对第三方库分别独立打包,减少下载次数,合并零散的文件,减少http请求

压缩图片的体积

开启http2请求

开启gzip压缩

分数:57

const path = require('path')
const CompressionPlugin = require('compression-webpack-plugin')

function resolve(dir) {
  return path.join(__dirname, dir)
}

// vue.config.js
module.exports = {
  /*
    Vue-cli3:
    Crashed when using Webpack `import()` #2463
    https://github.com/vuejs/vue-cli/issues/2463
   */
  // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
  productionSourceMap: false,
  //qiankuan打包时放开
  //outputDir: "../dist/main",
  // 多入口配置
  // pages: {
  //   index: {
  //     entry: 'src/main.js',
  //     template: 'public/index.html',
  //     filename: 'index.html',
  //   }
  // },
  //打包app时放开该配置
  publicPath: '/health-archives-ui',
  configureWebpack: config => {
    //生产环境取消 console.log
    // if (process.env.NODE_ENV === 'production') {
    //   config.optimization.minimizer[0].options.terserOptions.compress.drop_console = true
    // }
    config.optimization = {
      splitChunks: {
        chunks: 'all',
        minSize: 0,
        minChunks: 1,
        cacheGroups: {
          vendors: {
            name: 'chunk-vendors',
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
            reuseExistingChunk: true,
            chunks: 'all'
          },
          common: {
            name: 'chunk-common',
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true,
            chunks: 'all'
          },
          elementUI: {
            name: 'chunk-elementUI',
            priority: 20, // initial the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
            chunks: 'all'
          },
          echarts: {
            name: 'chunk-echarts',
            priority: 20,
            test: /[\\/]node_modules[\\/]_?echarts(.*)/,
            chunks: 'all'
          }
          // moment: {
          //   priority: 20,
          //   test: /[\\/]node_modules[\\/]_?moment(.*)/,
          //   reuseExistingChunk: true
          // }
        }
      }
    }
  },
  chainWebpack: config => {
    config.resolve.alias
      .set('@$', resolve('src'))
      .set('@api', resolve('src/api'))
      .set('@assets', resolve('src/assets'))
      .set('@comp', resolve('src/components'))
      .set('@views', resolve('src/views'))

    //生产环境,开启js\css压缩
    if (process.env.NODE_ENV === 'production') {
      config.plugin('compressionPlugin').use(
        new CompressionPlugin({
          test: /\.(js|css|less)$/, // 匹配文件名
          threshold: 10240, // 对超过10k的数据压缩
          deleteOriginalAssets: false // 不删除源文件
        })
      )
    }

    // 配置 webpack 识别 markdown 为普通的文件
    config.module
      .rule('markdown')
      .test(/\.md$/)
      .use()
      .loader('file-loader')
      .end()

    // 编译vxe-table包里的es6代码,解决IE11兼容问题
    config.module
      .rule('vxe')
      .test(/\.js$/)
      .include.add(resolve('node_modules/vxe-table'))
      .add(resolve('node_modules/vxe-table-plugin-antd'))
      .end()
      .use()
      .loader('babel-loader')
      .end()
  },

  css: {
    loaderOptions: {
      less: {
        modifyVars: {
          /* less 变量覆盖,用于自定义 ant design 主题 */
          'primary-color': '#1890FF',
          'link-color': '#1890FF',
          'border-radius-base': '4px'
        },
        javascriptEnabled: true
      }
    }
  },

  devServer: {
    port: 3000,
    // hot: true,
    // disableHostCheck: true,
    // overlay: {
    //     warnings: false,
    //     errors: true,
    // },
    // headers: {
    //     'Access-Control-Allow-Origin': '*',
    // },
    proxy: {
      /* '/api': {
        target: 'https://mock.ihx.me/mock/5baf3052f7da7e07e04a5116/antd-pro', //mock API接口系统
        ws: false,
        changeOrigin: true,
        pathRewrite: {
          '/jeecg-boot': ''  //默认所有请求都加了jeecg-boot前缀,需要去掉
        }
      },*/
      '/jeecg-boot': {
        target: 'http://localhost:8080', //请求本地 需要jeecg-boot后台项目
        ws: false,
        changeOrigin: true
      }
    }
  },

  lintOnSave: undefined
}

图片水印

​ 图片如何添加水印步骤:1、选择图片,2、创建canvas对象,ctx.drawImage把图片放入到canvas中,3、设置水印的位置、大小、颜色,4、执行ctx.draw()方 法在回调函数中将执行canvas.canvasToTempFilePath()方法,canvas转换成图片,5、将生成的图片上传到服务器并回显图片

问题:选择多个图片后只上传了一张图片? 原因:遍历多张图片的时间快于canvas.draw回调方法执行时间,canvas.draw回调函数只执行了一次,导致只能上传一张图片

解决:通过使用promise方式解决,在循环中使用promise,promise回调函数执行canvas.draw方法,只有执行完第一次的promise回调函数改变了状态,才会执行第二次的promise,因此canvas.draw方法也会执行多次,就可以上传多个图片了。

  for (let item of that.data.imgList) {
	// 循环遍历promise
   const data = await this.getCanvasImg(item)

   this.uploadFile(data); 

  }

	getCanvasImg(item) {
			const that = this
			return new Promise((resolve, reject) => {
				console.log(245);
				let ctx = that.data.ctx
				console.log("获取图片详情", ctx)
				//将图片src放到cancas内,宽高为图片大小
				ctx.drawImage(item, 0, 0, 375, 375)
				//将声明的时间放入canvas
				ctx.setFontSize(18) //注意:设置文字大小必须放在填充文字之前,否则不生效
				// 添加水印
				// 日期时间 
				const watermar = that.data.watermarks
				watermar[0].text = getTime()

				for (let index = 0; index < watermar.length; index++) {
					const element = watermar[index];
					ctx.setFillStyle(element.color)
					ctx.fillText(element.text, element.x, element.y)
					ctx.strokeText(element.text, element.x, element.y)
				}
				ctx.draw(true, function () {
					wx.canvasToTempFilePath({
						canvasId: 'firstCanvas',
						success: (res) => {
							resolve([res.tempFilePath])
						},
						fail: (e) => {
							console.log(e)
						}
					}, that)
				})
			})
		},
		uploadFile(arrImg) {
			console.log('arrImg', arrImg);
			wx.showLoading({
				title: '正在上传',
			})
			var that = this;
			var t = 0;
			for (var i = 0; i < arrImg.length; i++) {
				wx.uploadFile({
					url: api.upload.img,
					filePath: arrImg[i],
					name: 'file',
					dataType: "json",
					success: function (res) {
						console.log(272, res);
						var redata = JSON.parse(res.data);
						if (t < arrImg.length) {
							if (redata.code == 200) {
								setTimeout(function () {
									that.setTopicResource(redata.data, 1);
								}, 500)
							} else {
								// app.showError('请上传小于5M的图片')

							}
							wx.hideLoading();
						}
						t++;
					},
				})
			}
		},

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

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

相关文章

【超简版,代码可用!】【0基础Python爬虫入门——下载歌曲/视频】

安装第三方模块— requests 完成图片操作后输入&#xff1a;pip install requests 科普&#xff1a; get:公开数据 post:加密 &#xff0c;个人信息 进入某音乐网页&#xff0c;打开开发者工具F12 选择网络&#xff0c;再选择—>媒体——>获取URL【先完成刷新页面】 科…

环保投入超20亿,齐鲁制药集团争做绿色制药标杆

近期&#xff0c;由人民日报社指导、人民网主办的2023人民企业社会责任荣誉盛典暨第十八届人民企业社会责任奖颁奖活动在京举行&#xff0c;齐鲁制药集团荣获“人民企业社会责任奖绿色发展奖”。多年来&#xff0c;齐鲁制药深入践行“绿水青山就是金山银山”理念&#xff0c;积…

【Linux】Linux进程间通信

Linux进程间通信 一、进程间通信介绍1、概念2、进程间通信目的3、进程间通信的本质4、进程间通信分类 二、管道1、什么是管道2、匿名管道&#xff08;1&#xff09;匿名管道原理&#xff08;2&#xff09;pipe函数&#xff08;3&#xff09;匿名管道的使用步骤i、父进程调用pip…

SUSE Linux 12 SP5 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

idea中debug Go程序报错error layer=debugger could not patch runtime.mallogc

一、问题场景 在idea中配置了Go编程环境&#xff0c;可以运行Go程序&#xff0c;但是无法debug&#xff0c;报错error layerdebugger could not patch runtime.mallogc: no type entry found, use ‘types’ for a list of valid types 二、解决方案 这是由于idea中使用的d…

定向减免!函数计算让 ETL 数据加工更简单

业内较为常见的高频短时 ETL 数据加工场景&#xff0c;即频率高时延短&#xff0c;一般费用大头均在函数调用次数上&#xff0c;推荐方案一般为攒批处理&#xff0c;高额的计算成本往往令用户感到头疼&#xff0c;函数计算推出定向减免方案&#xff0c;让 ETL数据加工更简单、更…

一篇文章带你搞懂非关系型数据库MongoDB

目录 一、引言 二、核心概念 三、使用场景 四、最佳实践 五、总结 一、引言 随着互联网技术的快速发展&#xff0c;大数据和云计算的普及&#xff0c;传统的关系型数据库在处理海量数据和高并发请求时逐渐显得力不从心。为了满足这些新的需求&#xff0c;非关系型数据库应…

MySQL45道练习题

作业需要数据表SQL语句已给 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 select * from Student RIGHT JOIN (select t1.SId, class1, class2 from(select SId, score as class1 from sc where sc.CId 01)as t1, (select SId, score as …

鸿蒙 HarmonyOS ArkTS 点击事件,获取被点击对象的的位置

EntryComponentstruct Page {State screenX:number 0State screenY:number 0State X:number 0State Y:number 0State timestamp:number 0build () {Row () {Column(){Text(应用窗口左上角的X坐标: this.screenX).fontColor(Color.White).margin({bottom:20})Text(应用窗口…

Python教程91:海龟画图turtle画(三角形、正方形、五边形、六边形、圆、同心圆、边切圆,五角星,椭圆)

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python源码49&#xff1a;海龟画图turtle画美国旗 Python教程48&#xff1a;海龟画图turtle画太极八卦阵 Python源码47&#xff1a;海龟画图tu…

Linux查看各端口网络带宽使用情况

1.安装iftop: yum install -y iftop 2.使用 安装好后在服务器执行iftop -i ens33 就可以查看服务器公网网卡带宽使用情况(如果只执行iftop默认检测第一块网卡使用情况&#xff0c;这样查的会是内网网卡ens33 。 iftop -i ens33 -P 显示进出子网的流量 如果您在子网中&…

聚道云连接器助力钉钉与金蝶云星辰无缝对接,实现多维度数据同步

客户介绍 某企业服务有限公司专注于为企业提供全方位、高质量的企业服务&#xff0c;致力于于企业管理咨询、企业形象策划、市场营销策划、财务管理咨询等方面。该公司拥有一支经验丰富、专业化的团队&#xff0c;他们深入了解企业需求&#xff0c;为客户提供个性化的解决方案…

Ultralist 面向技术人员的命令行任务管理系统

Ultralist CLI 是一个简单且非常快速的命令行任务管理系统。它源于大卫艾伦&#xff08;David Allen&#xff09;推广的“把事情做好”&#xff08;Getting Things Done&#xff09;理念。作者是GTD的忠实粉丝&#xff0c;每天都在使用它。作者一直在寻找一个轻量级的任务管理系…

商城系统中30分钟未付款自动取消订单怎么实现(简单几种方法)

实现以上功能 方法1&#xff1a;定时任务批量执行 写一个定时任务&#xff0c;每隔 30分钟执行一次&#xff0c;列出所有超出时间范围得订单id的列表 AsyncScheduled(cron "20 20 1 * * ?")public void cancelOrder(){log.info("【取消订单任务开始】"…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

常用芯片学习——HC244芯片

HC573 三态输出八路缓冲器|线路驱动器 使用说明 SNx4HC244 八路缓冲器和线路驱动器专门设计用于提高三态存储器地址驱动器、时钟驱动器以及总线导向接收器和发送器的性能和密度。SNx4HC244 器件配备两个具有独立输出使能 (OE) 输入的 4 位缓冲器和驱动器。当 OE 为低电平时&a…

1130 - Host 182.244.45,94‘ is not allowed to connect to this MySQL server

1130 - Host 182.244.45,94’ is not allowed to connect to this MySQL server MySQL错误代码 1130 表明连接 MySQL 服务器的主机被拒绝。在这个错误消息中&#xff0c;你提到的是主机 “182.244.45.94”&#xff0c;但可能有一个小错误&#xff0c;IP 地址中的逗号应该是点&…

《Linux系列》Linux虚拟机,LVM逻辑卷扩容,xfs文件系统扩容

Linux虚拟机&#xff0c;LVM逻辑卷扩容&#xff0c;xfs文件系统扩容 1 虚拟机配置介绍 在创建虚拟机的时候只给了20G磁盘空间大小&#xff0c;但是现在需求变更&#xff0c;想要增加到40G磁盘空间大小&#xff0c;所以需要通过两步扩容磁盘空间。 系统版本是Centos7 根目录…

01.Elasticsearch应用(一)

Elasticsearch应用&#xff08;一&#xff09; 1.什么是ELK ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和…

【算法专题】动态规划之路径问题

动态规划2.0 动态规划 - - - 路径问题1. 不同路径2. 不同路径Ⅱ3. 珠宝的最高价值4. 下降路径最小和5. 最小路径和6. 地下城游戏 动态规划 - - - 路径问题 1. 不同路径 题目链接 -> Leetcode -62.不同路径 Leetcode -62.不同路径 题目&#xff1a;一个机器人位于一个 m …