Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)
获取源码
git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git
解压文件

- 得到如下内容

编译安装修改后的g2o
cd g2o_with_orbslam2
mkdir build
cd build
cmake ..
make
sudo make install //别忘了这一步 不然之后会有文件找不到
编译错误解决
尝试将 double 类型的角度直接传给需要 Eigen::Rotation2D<double> 对象的函数,导致类型不匹配

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp:51:39: error: cannot convert ‘Eigen::Rotation2D<double>::Scalar’ {aka ‘double’} to ‘const Rotation2Dd&’ {aka ‘const Eigen::Rotation2D<double>&’}51 | t.setRotation(t.rotation().angle()+_measurement);| ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~| || Eigen::Rotation2D<double>::Scalar {aka double}
报错原因
- 这个编译错误是因为在 g2o 库的代码中尝试将
double类型的值(在这里是通过调用Eigen::Rotation2D<double>::angle()得到的角度加上_measurement)赋值给需要const Rotation2Dd&(即const Eigen::Rotation2D<double>&)类型的函数setRotation。Eigen::Rotation2D<double>::angle()返回一个double类型的值,表示旋转的角度,而setRotation函数期望的是一个Rotation2Dd类型的对象。这种类型不匹配导致了编译错误,因为不能直接将double类型转换为Rotation2Dd对象。正确的做法应该是创建一个新的Rotation2Dd对象,将角度传递给它,然后再调用setRotation。
解决办法
- 修改edge2_se2_pointxy_bearing.cpp(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d)中的第51行
- 从
t.setRotation(t.rotation().angle()+_measurement);
-
改为
-
t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));
由于在 Eigen 操作中未显式转换不同的数值类型,违反了 Eigen 对于类型一致性的严格要求

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/solvers/eigen/linear_solver_eigen.h:92:10: required from here
/usr/include/eigen3/Eigen/src/Core/util/XprHelper.h:819:96: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY819 | ASSERT((Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS,BINOP> >::value), \| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
报错原因
- 这个错误是因为在 Eigen 库的操作中混合使用了不同的数值类型,而没有显式地进行类型转换。Eigen 要求在操作涉及不同类型的数值时,必须使用其
.cast<>()方法来显式转换类型,以确保操作的数学和类型正确性。
解决办法
-
修改linear_solver_eigen.h(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/solvers/eigen)的第54行
-
从
-
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix; -
改为
-
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;
在使用 Eigen 库时,向期望整数的参数传递了浮点数,导致类型不匹配

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d/simulator.cpp:80:39: required from here
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:778:27: error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED778 | EIGEN_STATIC_ASSERT(is_integer,| ^~~~~~~~~~
报错原因
- 这个编译错误发生是因为在使用 Eigen 库时,期望一个整数类型的参数却错误地传入了一个浮点数,违反了 Eigen 对于参数类型的要求,Eigen 静态断言失败是为了确保类型安全,防止错误的数据类型使用。
解决办法
-
修改simulator.cpp(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d)的第80行
-
从
-
VectorXd probLimits(MO_NUM_ELEMS); for (int i = 0; i < probLimits.size(); ++i)probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS; -
改为
-
VectorXd probLimits; probLimits.resize(MO_NUM_ELEMS); for (int i = 0; i < probLimits.size(); ++i)probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;
编译DBoW2

cd orbslam2_modified/ORB_SLAM2_modified/Thirdparty/DBoW2
mkdir build
cd build
cmake ..
make
编译Pangolin模块
- 略
- https://github.com/stevenlovegrove/Pangolin
获取Vocabulary


- 将ORB_SLAM2原仓库的Vocabulary文件夹复制过来,替代这里的空的Vocabulary文件夹
编译修改后的ORB_SLAM2
cd ORB_SLAM2_modified
mkdir build
cd build
cmake ..
make
编译报错解决
未能找到匹配请求的版本 “2.4.3” 的 OpenCV 配置文件,尽管检查了多个更高版本的安装

CMake Error at CMakeLists.txt:33 (find_package):Could not find a configuration file for package "OpenCV" that is compatiblewith requested version "2.4.3".The following configuration files were considered but not accepted:/usr/local/opencv3.2.0/share/OpenCV/OpenCVConfig.cmake, version: 3.2.0/usr/local/opencv-4.4.0/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.4.0/usr/local/opencv-3.2.0/share/OpenCV/OpenCVConfig.cmake, version: 3.2.0/usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0-- Configuring incomplete, errors occurred!
报错原因
- 这个 CMake 错误发生是因为 CMake 在配置时未能找到与指定版本(2.4.3)兼容的 OpenCV 包配置文件,尽管考虑了多个已安装的更高版本(3.2.0, 4.4.0, 和 4.2.0),但这些都不满足指定的版本需求。
解决方法
-
修改ORB_SLAM2_modified下的CMakeLists.txt
-
将
-
find_package(OpenCV 2.4.3 REQUIRED) -
改为自己系统中安装的OpenCV版本即可
-
例如 我这里装的是OpenCV 3.2.0
-
find_package(OpenCV 3.2.0 REQUIRED)
当前编译环境未设置为使用 PCL 所需的 C++14 或更高版本的编译标准

/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above7 | #error PCL requires C++14 or above| ^~~~~
报错原因
- 这个编译错误发生是因为 Point Cloud Library (PCL) 需要 C++14 或更高版本的编译标准,而当前的编译环境可能未设置为使用 C++14 或更高。
解决方法
-
修改ORB_SLAM2_modified下的CMakeLists.txt
-
将
-
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")add_definitions(-DCOMPILEDWITHC11)message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.") else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() -
其中的11全部改为14即可
-
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX14)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")add_definitions(-DCOMPILEDWITHC14)message(STATUS "Using flag -std=c++14.") elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.") else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") endif()
std::map 的分配器的值类型与 map 的值类型不一致,导致静态断言失败

/usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator122 | static_assert(is_same<typename _Alloc::value_type, value_type>::value,| ^~~~~
报错原因
这个编译错误是因为在使用 std::map 时,分配器(allocator)的 value_type 和 std::map 的值类型不匹配,违反了 STL map 的类型一致性要求,导致静态断言失败。
解决方法
-
修改LoopClosing.h(ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/include)中的第49行
-
从
-
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose; -
改为
-
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;
代码错误地引用了不存在的 std::chrono::monotonic_clock 类,导致相关时间点变量 t1 和 t2 未被正确声明

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc: In function ‘int main(int, char**)’:
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:81:22: error: ‘std::chrono::monotonic_clock’ has not been declared81 | std::chrono::monotonic_clock::time_point t1 = std::chrono::monotonic_clock::now();| ^~~~~~~~~~~~~~~
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:90:22: error: ‘std::chrono::monotonic_clock’ has not been declared90 | std::chrono::monotonic_clock::time_point t2 = std::chrono::monotonic_clock::now();| ^~~~~~~~~~~~~~~
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:93:83: error: ‘t2’ was not declared in this scope; did you mean ‘tm’?93 | uble ttrack= std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();| ^~| tm
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:93:88: error: ‘t1’ was not declared in this scope; did you mean ‘y1’?93 | uble ttrack= std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();| ^~| y1
报错原因
- 这些编译错误发生因为代码中尝试使用了不存在的
std::chrono::monotonic_clock类,该类在 C++ 标准库中并未定义。此外,由于t1和t2变量的声明失败(因为它们依赖于不存在的monotonic_clock类),后续代码中尝试使用这些变量时也出现了错误,提示未声明的变量。正确的类应该是std::chrono::steady_clock或std::chrono::system_clock。
解决方法
- 将代码中所有使用
std::chrono::monotonic_clock的地方替换为std::chrono::steady_clock。 - 主要存在于以下文件中(ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples)
- Monocular
- mono_kitti.cc
- mono_tum.cc
- RGB-D
- rgbd_tum.cc
- Stereo
- stereo_kitti.cc
- Monocular
运行ORB_SLAM2 RGBD
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ~/rgbd_dataset_freiburg1_xyz Examples/RGB-D/associations/fr1_xyz.txt
- 运行成功,效果如下

运行报错解决
段错误 (核心已转储)

Depth Threshold (Close/Far Points): 3.86618
段错误 (核心已转储)
报错原因
- “段错误 (核心已转储)” 错误通常表明程序试图访问其内存空间中未授权或不存在的部分,这可能是由于无效的指针引用、数组越界、或其他内存管理错误导致的。
解决方法
-
删除所有CMakeLists.txt文件里的
-march=native -
如下
-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native") -
修改为
-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ") -
主要存在于以下文件中:
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/CMakeLists.txt
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/CMakeLists.txt
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Thirdparty/DBoW2/CMakeLists.txt
-
之后全部重新用CMake构建,Make编译一遍即可,再次运行即可运行成功。

相关文章:
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra为例) 获取源码 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git解压文件 得到如下内容 编译安装修改后的g2o cd g2o_with_orbslam2 mkdir build cd build cmake .. make…...
MyBatis(四)
第一章:MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别,使用一对多的环境举例子。 立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。 延迟加载:当前查询用户的时候&…...
【从零开始的LeetCode-算法】3285. 找到稳定山的下标
有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我…...
Docker常用命令总结~
1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的,使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...
浅谈怎样系统的准备前端面试
前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…...
如何配置防火墙提高服务器安全性
配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量,限制未经授权的访问,防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是: 限制未经授权的访问:…...
java集合-Map HashMap 源码解析
hashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...
案例分享|企查查的数据降本增效之路
分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…...
图书馆管理系统(四)基于jquery、ajax--完结篇
任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端,使用 Express 框架来处理 HTTP 请求,并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…...
什么是Modbus协议网关?
在工业自动化领域,设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议,自1971年由Modicon公司首次推出以来,便以其标准、开放、支持多种电气接口等特点,在工业控制系统中占据了重要地位。然…...
Docker 容器中启用 SSH 服务
在 Docker 容器中运行 SSH 服务需要一些调整,因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤: 1. 安装 SSH 服务 如果还未安装 OpenSSH,请先安装: apt update…...
Linux系统—利用systemd管控系统以及服务详解(十四)
本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了,时间过得真快,这星期就要冬至啦!! 今天继续Linux系统高级管理板块,主要讲述使用systemd管控系统和服务~ 上期回顾:“Linux系统—进程管理详解” 更…...
人工智能 AI 大模型研究设计与实践应用技术毕业论文
标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一,它具有高度的通用性、灵活性和智能性,可以应用于多种领域,如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...
已有 containerd 的情况下部署二进制 docker 共存
文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付,相对方便很多,不需要担心别人的环境缺少需要的依…...
VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…...
vue+springboot+cas配置及cookie传递问题
cookie的注意事项 前边的文章已经介绍过cookie的基本信息,这里再次说明一点:cookie是无法进行跨域传递的,很多时候cookie无法设置和传递都是因为跨域问题,ip/端口不一致。 主要就是:被设置cookie和要传递cookie的地址…...
0009.基于springboot+layui的ERP企业进销存管理系统
一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂,适合小白学编程,课程设计,毕业设计。 二、系统架构 前端:html| layui 后端:springboot | mybatis| thymeleaf 环境:jdk1.8 |…...
ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
由于需要进行一些FPGA的简单开发,但板载PL端没有焊接晶振,所以需要从PS端借用时钟到PL端使用。 首先新建项目,根据自己的板载选择芯片,我的板载芯片是zynq_7010。 一路next,在自己的vivado的工作文档新建文件夹并给自…...
Android详解——ConstraintLayout约束布局
目录 一、ConstraintLayout概述 二、ConstraintLayout属性介绍 1. 相对位置 2. 边距 3. 中心和偏移位置 中心位置 偏移位置 4. 圆形位置 5. 可见性 6. 尺寸约束 最小尺寸 WRAP_CONTENT :强制约束 MATCH_CONSTRAINT Min和Max 百分比尺寸 比率 7. 链式布局 创建…...
docker简单命令
docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件,id取前三位即可 docker rmi e64 删除镜像文件(先删容器才能删镜像),id取前三位即可 在包含Dockerfile文件的目录…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
