当前位置: 首页 > news >正文

网页 H5 微应用接入钉钉自动登录

ℹ️关于云审批
云审批(cloud approve) ,一款专为小微企业打造,支持多租户的在线审批神器。它简化了申请和审批流程,让您随时随地通过手机或电脑完成请款操作。员工一键提交申请,审批者即时响应,方便快捷。同时,云审批提供全面的数据记录与分析,助力企业实现财务管理透明化、智能化,安全高效,让企业的信息数字化管理变得简单轻松!最后,重要的事情说三遍📢:开源、开源、所有代码开源。
👉GITHUB开源地址 👈
👉飞书在线文档👈

概述

钉钉免登(此处专指自建H5微应用,官方文档)是一种便捷的登录机制,当用户已在钉钉客户端(包括PC端和移动端)完成登录后,通过工作台访问我们的网站时,系统能够自动识别并完成用户身份验证,无需重复输入登录信息。该功能广泛应用于微信、飞书、抖音等主流平台,为用户提供无缝的跨平台使用体验。

流程详解

数据表

登录模块设计到两个表:账号表/Account、员工表/Staff。

账号/Account

此表为登录到平台的账户信息,支持传统的账密方式、钉钉免登等方式,并记录与之关联的员工ID

字段名中文名类型必填默认值说明
id编号Int唯一标识
cid企业IDInt关联企业
name账号名称String
pwd密码String加密
type类型String登录类型
sid员工IDInt关联员工
active是否生效Booleanfalse
addOn录入日期Int

登录类型:

  • dingding=钉钉
  • wechat=微信
  • phone=手机号(未来支持手机验证码登录)
  • other=其它(传统密码登录)

员工/Staff

字段名中文名类型必填默认值说明
id编号Int唯一标识
cid企业IDInt关联企业
name员工名称String
phone电话号码String
summary描述String

免登流程

  • 准备阶段
    • 企业管理员登录钉钉开发者后台,创建应用并配置网页功能
    • 获取应用的AppKeyAppSecrect
  • 逻辑实现
    • 新建钉钉登录专用页面(dingding.html)
    • 在页面中获取两个参数cid(企业ID)corpId(钉钉内企业ID)
    • 前端调用钉钉接口获取授权码/CODE
    • 后端拿到上述 CODE 后通过AppKeyAppSecrect获取到用户信息(包含唯一编号 unionid、姓名 name 等)
    • 构建唯一账户名:D_{unionid}_{name}
    • 检查强求账户名是否存在于 Account 表
    • 如存在则判断是否生效,若生效返回token,否则报错
    • 若不存在
      • 自动创建账户信息
      • 检索企业下同名员工,若不存在则自动创建并关联到账户对象
      • 若配置了账户自动生效,返回 token,否则前端提示账户未激活请联系管理员
  • 部署上线
    • 部署平台获取到登录页 URL(https://{域名}/dingding.html)
    • 在钉钉后台填入上述地址后发布应用版本
    • 用户在钉钉客户端工作台添加应用后即可访问

新建 dingding.html

我们在前端项目代码下新建对应页面:

并在 rsbuild.config.mjs中配置多页面:

export default defineConfig({source:{entry:{index: './src/index.js',dingding: './src/pages/dingding/index.js'}}
})

至此,我们可以通过 http://{IP}/dingding.html访问到该页面,作为钉钉免登的入口😄。

编写登录页面逻辑

登录页主要组件 App.vue 代码如下:

<template><div style="width: 80%; margin: 40px auto;"><div class="text-center" v-if="!errMsg"><n-spin :show="working"><template #description>钉钉客户端登录中,请稍候...</template></n-spin></div><n-alert v-else :type show-icon title="钉钉自动登录失败" :bordered="false">{{ errMsg }}</n-alert></div>
</template><script setup>import { NSpin, NAlert, useMessage, NMessageProvider } from 'naive-ui'import { requestAuth } from "./dingding"import { checkLocalToken, saveLocalToken } from "../login"const msg = useMessage()let cid = undefinedlet corpId = undefinedconst debug = import.meta.env.DEV;let working = ref(true)let errMsg = ref("")let type = ref("info")const onMsg = (msg, isError=true)=>{errMsg.value = msgtype.value = isError?"error":"info"}const tryToAutoLogin = ()=>{requestAuth(corpId).then(code=>{msg.info(`CODE=${code}`)fetch("/common/login-with-dingding",{method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ cid, code })}).then(response => response.json()).then(({ success, data, message }) => {if(success==true){msg.success(`登陆成功`)saveLocalToken(data)gotoIndex()}else{const messages = {E01 : "您的钉钉账户为首次登录,请先联系管理员完成激活",E02 : "您的钉钉账户关联未激活,请联系企业管理员",E03 : "找不到当前钉钉账户关联的员工"}onMsg(messages[message]||message, !messages[message])}})}).catch(e=>onMsg(typeof(e)=='string'?e:e.message))}const gotoIndex = ()=> location.href = "/"onMounted(() => {let u = new URL(location.href)cid = u.searchParams.get('cid')corpId = u.searchParams.get('corpId')if(checkLocalToken())return gotoIndex()tryToAutoLogin()})
</script>
// dingding.js
import { runtime } from 'dingtalk-jsapi'export const requestAuth = async (corpId)=> {let { code } = await runtime.permission.requestAuthCode({corpId})return code
}//login.js
const NAME = import.meta.env.PUBLIC_HEADER_TOKEN
const CREATED = `${NAME}_CREATED`/*** 检查本地 token 是否在有效期内* @param {Number} expired - token 有效期,默认12小时,单位毫秒* @returns {Boolean} true 时为 token 有效*/
export const checkLocalToken = (expired=12*60*60*1000)=>{let token = localStorage.getItem(NAME)if(!token)  return falselet expire = localStorage.getItem(CREATED)||0if(Date.now() - expire>=expired)return falsereturn true
}export const saveLocalToken = token=>{localStorage.setItem(NAME, token)localStorage.setItem(CREATED, Date.now())
}

这里不得不吐槽下钉钉开发平台的官网文档,新旧版 API 文档特别容易让人混乱,引入dingtalk-jsapi的话需要查看旧版文档😔。

编写后端与钉钉服务器的交互

const { get, post } = require('axios')
const { loadWithCidAndName } = require("./ConstantService")
const logger = require('../common/logger')/*** @typedef {Object} DDTokenResponse - 钉钉获取token效应值* @property {String} access_token - token值* @property {Number} expires_in - 有效期(单位秒)* @property {Number} errcode - 错误代码* @property {String} errmsg - 错误信息** @typedef {Object} DDUser - 钉钉用户信息* @property {String} userid* @property {String} unionid - 唯一编号* @property {String} name - 用户名称** @typedef {Object} DDUserResponse - 钉钉用户信息响应值* @property {DDUser} result* @property {String} request_id* @property {Number} errcode - 错误代码* @property {String} errmsg - 错误信息*/const DING_HOST = "https://oapi.dingtalk.com"let localToken = {value: "",expire: 0
}const isTokenExpired = ()=> !localToken.value || localToken.expire<=Date.now()
const log = (msg, level='info')=> logger[level](`[钉钉] ${msg}`)exports.loginWithCode = async (cid, code)=>{if(isTokenExpired()){/**@type {CompanyConfig} */let cfg = await loadWithCidAndName(cid)if(!cfg || !(cfg.ddAppKey && cfg.ddAppSecret))throw `企业未配置钉钉登录`let url = `${DING_HOST}/gettoken?appkey=${cfg.ddAppKey}&appsecret=${cfg.ddAppSecret}`/**@type {{data:DDTokenResponse}} */let { data } = await get(url)if(data.errcode != 0){log(`获取企业 token 失败:${data.errcode}|${data.errmsg}`, 'error')throw data.errmsg}localToken.value = data.access_tokenlocalToken.expire = Date.now() + data.expires_in*1000log(`更新 TOKEN 为 ${localToken.value}(EXPIRED=${data.expires_in}`)}let url = `${DING_HOST}/topapi/v2/user/getuserinfo?access_token=${localToken.value}`/**@type {{data:DDUserResponse}} */let { data } = await post(url, { code })if(data.errcode != 0){log(`[钉钉] 获取用户信息失败:${data.errcode}|${data.errmsg}`, 'error')throw data.errmsg}global.isDebug && log(`获取用户信息 ${data.result.userid}/${data.result.name}`, 'debug')return data.result
}

部署及上线

创建钉钉H5微应用

  1. 登录钉钉开发者后台。
  2. 单击应用开发 > 企业内部应用 > 钉钉应用 > 创建应用
  3. 填写应用信息。
配置项是否必填配置说明
应用名称输入应用名称,应用名称最小长度为 2 个字符。
应用描述简要描述应用提供的产品或服务,应用描述最小长度为 4 个字符。
应用图标上传应用图标,图标要求 JPG/PNG 格式、240 px * 240 px 以上、1:1 、2 MB 以内的无圆角图标。
  1. 单击保存,进入应用详情页。
  2. 如果你需要开发 AI 应用、小程序、网页应用、酷应用和机器人功能,你需要添加应用能力。

发布应用

创建应用后,需要发布才能看到噢


接着在钉钉客户端就能看到此应用啦🎉

相关文章:

网页 H5 微应用接入钉钉自动登录

ℹ️关于云审批 云审批&#xff08;cloud approve&#xff09; &#xff0c;一款专为小微企业打造&#xff0c;支持多租户的在线审批神器。它简化了申请和审批流程&#xff0c;让您随时随地通过手机或电脑完成请款操作。员工一键提交申请&#xff0c;审批者即时响应&#xff0c…...

接口——类比摄像

最近迷上了买相机&#xff0c;大疆Pocket、Insta Go3、大疆Mini3、佳能50D、vivo徕卡人像大师&#xff08;狗头&#xff09;&#xff0c;在买配件的时候&#xff0c;发现1/4螺口简直是神中之神&#xff0c;这个万能接口让我想到计算机设计中的接口&#xff0c;遂有此篇—— 接…...

java每日精进 5.18【文件存储】

1.文件存储思路 支持将文件上传到三类存储器&#xff1a; 兼容 S3 协议的对象存储&#xff1a;支持 MinIO、腾讯云 COS、七牛云 Kodo、华为云 OBS、亚马逊 S3 等等。磁盘存储&#xff1a;本地、FTP 服务器、SFTP 服务器。数据库存储&#xff1a;MySQL、Oracle、PostgreSQL、S…...

LeetCode 394. 字符串解码详解:Java栈实现与逐行解析

文章目录 1. 问题描述2. 解决思路核心问题栈的应用遍历逻辑 3. 完整代码实现4. 关键代码解析处理右括号 ]处理嵌套的示例 5. 复杂度分析6. 总结 1. 问题描述 给定一个经过编码的字符串&#xff0c;要求将其解码为原始字符串。编码规则为 k[encoded_string]&#xff0c;表示方括…...

基于STC89C52的红外遥控的电子密码锁设计与实现

一、引言 电子密码锁作为一种安全便捷的门禁系统,广泛应用于家庭、办公室等场景。结合红外遥控功能,可实现远程控制开锁,提升使用灵活性。本文基于 STC89C52 单片机,设计一种兼具密码输入和红外遥控的电子密码锁系统,详细阐述硬件选型、电路连接及软件实现方案。 二、硬…...

Android 性能优化入门(一)—— 数据结构优化

1、概述 一款 app 除了要有令人惊叹的功能和令人发指交互之外&#xff0c;在性能上也应该追求丝滑的要求&#xff0c;这样才能更好地提高用户体验&#xff1a; 优化目的性能指标优化的方向更快流畅性启动速度页面显示速度(显示和切换)响应速度更稳定稳定性避免出现 应用崩溃&…...

深入理解Docker和K8S

深入理解Docker和K8S Docker 是大型架构的必备技能&#xff0c;也是云原生核心。Docker 容器化作为一种轻量级的虚拟化技术&#xff0c;其核心思想&#xff1a;将应用程序及其所有依赖项打包在一起&#xff0c;形成一个可移植的单元。 容器的本质是进程&#xff1a; 容器是在…...

5.18本日总结

一、英语 复习list3list28 二、数学 学习14讲部分内容&#xff0c;1000题13讲部分 三、408 学习计网5.3剩余内容 四、总结 计网TCP内容比较重要&#xff0c;连接过程等要时常复习&#xff1b;高数学到二重积分对定积分的计算相关方法有所遗忘&#xff0c;需要加强巩固。…...

muduo库TcpServer模块详解

Muduo库核心模块——TcpServer Muduo库的TcpServer模块是一个基于Reactor模式的高性能TCP服务端实现&#xff0c;负责管理监听端口、接受新连接、分发IO事件及处理连接生命周期。 一、核心组件与职责 Acceptor 监听指定端口&#xff0c;接受新连接&#xff0c;通过epoll监听l…...

深入理解 OpenCV 的 DNN 模块:从基础到实践

在计算机视觉领域蓬勃发展的当下&#xff0c;深度学习模型的广泛应用推动着技术的不断革新。OpenCV 作为一款强大且开源的计算机视觉库&#xff0c;其 DNN&#xff08;Deep Neural Network&#xff09;模块为深度学习模型的落地应用提供了高效便捷的解决方案。本文将以理论为核…...

MyBatis 延迟加载与缓存

一、延迟加载策略&#xff1a;按需加载&#xff0c;优化性能 1. 延迟加载 vs 立即加载&#xff1a;核心区别 立即加载&#xff1a;主查询&#xff08;如查询用户&#xff09;执行时&#xff0c;主动关联加载关联数据&#xff08;如用户的所有账号&#xff09;。 场景&#xf…...

6.2.2邻接表法-图的存储

知识总览&#xff1a; 为什么要用邻接表 因为邻接矩阵的空间复杂度高(O(n))&#xff0c;且不适合边少的稀疏图&#xff0c;所以有了邻接表 用代码表示顶点、图 声明顶点图信息 声明顶点用一维数组存储各个顶点的信息&#xff0c;一维数组字段包括2个&#xff0c;每个顶点的…...

【甲方安全建设】拉取镜像执行漏洞扫描教程

文章目录 前置知识镜像(Docker Image)是什么?镜像的 tag(标签)查看本地已有镜像的 tag查看远程仓库的所有 tag构建镜像与拉取镜像的区别正文安装docker拉取待扫描镜像安装 veinmind-runner 镜像下载 veinmind-runner 平行容器启动脚本快速扫描本地镜像/容器6. 生成 报告前…...

第四天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下&#xff0c;我昨天看白色巨塔电视剧&#xff0c;看的入迷了&#xff0c;同时也看出一些道理&#xff0c;学到东西&#xff1b; 但是把昨天的写事情给忘记了&#xff0c;今天…...

大数据场景下数据导出的架构演进与EasyExcel实战方案

一、引言&#xff1a;数据导出的演进驱动力 在数字化时代&#xff0c;数据导出功能已成为企业数据服务的基础能力。随着数据规模从GB级向TB级甚至PB级发展&#xff0c;传统导出方案面临三大核心挑战&#xff1a; ‌数据规模爆炸‌&#xff1a;单次导出数据量从万级到亿级的增长…...

svn: E170013 和 svn: E120171 的问题

在 Deepin23 上尝试用 svn 连接我的 Visual SVN 服务器&#xff0c;得到如下错误信息&#xff0c; > svn: E170013: Unable to connect to a repository at URL https://my.com/svn/mysource/branch_4.2.x > svn: E120171: 执行上下文错误: An error occurred during SSL…...

Limesurvay系统“48核心92GB服务器”优化方案

1、Redis maxmemory 16GB # 限制Redis内存&#xff08;预留足够空间给其他服务&#xff09; maxmemory-policy volatile-lru # 自动淘汰旧会话&#xff08;仅对带TTL的键&#xff09; save 300 100 # 仅保留一个条件减少阻塞 stop-writes-on-bgsave-error no #…...

DockerFile实战

背景 在上一篇文章中&#xff0c;我们对DockerFile有了一个较为深刻的认识&#xff0c;那么这篇文章&#xff0c;我将会向你展示如何自定义一个镜像并且在docker上运行。 一、基础指令 指令技术说明生产环境最佳实践典型错误示例​FROM​- 必须作为Dockerfile第一条指令 - 推…...

【Linux】简易版Shell实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 前言 之前我们学习了Linux的进程概念以及进程控制相关接口&#xff1a; 【Linux】进程控制-CSDN博客 本篇文章&#xff0c;我们将一起踏上一段有趣的旅程&a…...

MATLAB安装常见问题解决方案

目前新版本的matlab安装往往需要十几G的本地安装容量&#xff0c;例如matlab2022b、matlab2023b, 首先就是要保证本地硬盘空间足够大&#xff0c;如果没有足够的本地内存空间&#xff0c;那么可以尝试释放本地硬盘空间&#xff0c;或者安装所需内存空间较小的旧版本的matlab&am…...

在 Vue 中插入 B 站视频

前言 在 Vue 项目中&#xff0c;有时我们需要嵌入 B 站视频来丰富页面内容&#xff0c;为用户提供更直观的信息展示。本文将详细介绍在 Vue 中插入 B 站视频的多种方法。 使用<iframe>标签直接嵌入,<iframe>标签是一种简单直接的方式&#xff0c;可将 B 站视频嵌…...

【深度学习】#12 计算机视觉

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李沐学AI 目录 目标检测锚框交并比&#xff08;IoU&#xff09;锚框标注真实边界框分配偏移量计算损失函数 非极大值抑制预测 多尺度目标检测单发多框检测&#xff08;S…...

QT学习3

QT项目视图 1、List View清单视图 private:QListView *listview1; private slots:void slotClickedFunc(const QModelIndex &index); #include "widget.h" #include "ui_widget.h"#include <QStringListModel>//字符串列表模型 #include <QS…...

Vue 3 动态 ref 的使用方式(表格)

一、问题描述 先给大家简单介绍一下问题背景。我正在开发的项目中&#xff0c;有一个表格组件&#xff0c;其中一列是分镜描述&#xff0c;需要支持视频上传功能。用户可以为每一行的分镜描述上传对应的视频示例。然而&#xff0c;在实现过程中&#xff0c;出现了一个严重的问…...

FAST-DDS源码分析PDP(一)

准备开一个FAST-DDS源码分析系列&#xff0c;源码版本FAST-DDS 1.1.0版本。 FAST-DDS这种网络中间件是非常复杂的&#xff0c;所以前期先去分析每个类的作用是什么&#xff0c;然后在结合RTPS DOC&#xff0c;FAST-DDS DEMO,以及FAST-DDS的doc去串起来逻辑。 Builtin Discovery…...

Flutter与Kotlin Multiplatform(KMP)深度对比及鸿蒙生态适配解析

Flutter 与 Kotlin Multiplatform&#xff08;KMP&#xff09;深度对比及鸿蒙生态适配解析 在跨平台开发领域&#xff0c;Flutter 与 Kotlin Multiplatform&#xff08;KMP&#xff09;代表了两种不同的技术路线&#xff1a;前者以 “统一 UI 体验” 为核心&#xff0c;后者以…...

深入了解linux系统—— 基础IO(上)

文件 在之前学习C语言文件操作时&#xff0c;我们了解过什么是文件&#xff0c;这里简单回顾一下&#xff1a; 文件存在磁盘中&#xff0c;文件有分为程序文件、数据文件&#xff1b;二进制文件和文本文件等。 详细描述见文章&#xff1a;文件操作——C语言 文件在磁盘里&a…...

C++ map multimap 容器:赋值、排序、大小与删除操作

概述 map和multimap是C STL中的关联容器&#xff0c;它们存储的是键值对(key-value pairs)&#xff0c;并且会根据键(key)自动排序。两者的主要区别在于&#xff1a; map不允许重复的键multimap允许重复的键 本文将详细解析示例代码中涉及的map操作&#xff0c;包括赋值、排…...

EmuEdit

EmuEdit详解&#xff1a;统一多任务图像编辑的扩展性范式 引言&#xff1a;图像编辑的困境 近年来&#xff0c;扩散模型&#xff08;Diffusion Models&#xff09;在图像合成和编辑方面取得了巨大进展&#xff0c;如 Prompt-to-Prompt (P2P)、InstructPix2Pix、DiffEdit 等方法…...

Linux编译rpm包与deb包

注意&#xff1a; 本文内容于 2025-05-14 23:55:53 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;编译rpm包与deb包。感谢您的关注与支持&#xff01; 近期在通过源码编译安装一些软件包时&#…...

GitHub 趋势日报 (2025年05月17日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 2471⭐ 22302Roff2public-apis/public-a…...

[创业之路-362]:企业战略管理案例分析-3-战略制定-华为使命、愿景、价值观的演变过程

一、华为使命、愿景、价值观的演变过程 1、创业初期&#xff08;1987 - 1994 年&#xff09;&#xff1a;生存导向&#xff0c;文化萌芽 使命愿景雏形&#xff1a;1994年华为提出“10年之后&#xff0c;世界通信行业三分天下&#xff0c;华为将占一份”的宏伟梦想&#xff0c…...

Android 性能优化入门(二)—— 内存优化

1、概述 1.1 Java 对象的生命周期 各状态含义&#xff1a; 创建&#xff1a;分配内存空间并调用构造方法应用&#xff1a;使用中&#xff0c;处于被强引用持有&#xff08;至少一个&#xff09;的状态不可见&#xff1a;不被强引用持有&#xff0c;应用程序已经不再使用该对象…...

(5)python爬虫--BeautifulSoup(bs4)

文章目录 [TOC](文章目录) 前言一、安装bs4二、bs4的基础使用2.1 创建soup对象2.2 根据标签名查找节点2.3 根据函数来查找节点1. find函数2. find_all函数3. select函数 三、使用bs4获取节点信息3.1 获取节点内容3.2 获取节点的属性3.3 获取节点的属性值 四、测试练习 总结 前言…...

如何利用DeepSeek提升工作效率

1. 代码开发辅助 1.1 代码生成 根据需求描述生成代码框架 自动补全代码片段 生成单元测试用例 创建项目文档 1.2 代码优化 代码重构建议 性能优化方案 最佳实践推荐 设计模式应用 2. 问题诊断与解决 2.1 错误分析 编译错误解析 运行时错误诊断 内存泄漏检测 性…...

游戏引擎学习第292天:实现蛇

每次VLC 读取OSD 会有bug 修复一下 回顾并计划实现一种漂浮的移动方式&#xff0c;并制作一个贪吃蛇 虽然不完全记得之前具体计划&#xff0c;但感觉是想实现一个小蛇形生物&#xff0c;之前一直没来得及做。我们还打算让熟悉的伙伴能漂浮移动&#xff0c;所以今天会继续进行一…...

菱形继承原理

在C中&#xff0c;菱形继承的内存模型会因是否使用虚继承产生本质差异。我们通过具体示例说明两种场景的区别&#xff1a; 一、普通菱形继承的内存模型 class A { int a; }; class B : public A { int b; }; class C : public A { int c; }; class D : public B, public C { i…...

C++编程起步项目

员工信息管理系统 需求 Employee.h #pragma once#include<iostream> #include<string>using namespace std;class Employee { public:int id; // 编号string name; // 姓名string position; // 岗位int deptId; // 部门编号Employee();Employee(int id, string n…...

c++编写中遇见的错误

目录 一.获取动态数组的长度二.编译错误三、内存泄露 一.获取动态数组的长度 首先想到获取数组的长度的代码是&#xff1a; sizeof(arr) / sizeof(arr[0]);但是当将其使用到动态数组上时就会产生错误&#xff1b; int* help new int[3];for (int i 0; i < 3; i) {help[…...

股票数据源对接技术指南:印度尼西亚、印度、韩国

一、多国数据对接全景图 1. 核心数据领域对比 国家金融市场数据源宏观经济指标特色数据资源印度NSE/BSE实时行情RBI经济统计库UPI支付数据/GST税务记录印尼IDX交易所数据流BPS官方统计棕榈油产业数据/群岛物流信息韩国KRX综合指数KOSTAT国家统计K-POP消费趋势/半导体出口数据…...

常见面试题:Webpack的构建流程简单说一下。

文章目录 前言一、Webpack 的核心使命&#xff1a;模块化打包二、Webpack 构建流程详解三、构建流程的可视化演示项目结构构建流程图 四、构建流程中的关键技术点1. 依赖图的构建与优化2. 哈希与缓存策略3. 开发环境优化 五、简易版概括构建流程 总结 前言 在前端工程化中&…...

Elasticsearch基础篇-java程序通过RestClient操作es

目录 1.引入 2 初始化RestClient 1&#xff09;引入es的RestHighLevelClient依赖&#xff1a; 2&#xff09;因为SpringBoot默认的ES版本是7.17.10&#xff0c;所以我们需要覆盖默认的ES版本&#xff1a; 3&#xff09;初始化RestHighLevelClient&#xff1a; 4&#xff09…...

SuperYOLO:多模态遥感图像中的超分辨率辅助目标检测之论文阅读

摘要 在遥感影像&#xff08;RSI&#xff09;中&#xff0c;准确且及时地检测包含数十像素的多尺度小目标仍具有挑战性。现有大多数方法主要通过设计复杂的深度神经网络来学习目标与背景的区分特征&#xff0c;常导致计算量过大。本文提出一种兼顾检测精度与计算代价的快速准确…...

k6学习k6学习k6学习k6学习k6学习k6学习

1.安装go 2.安装 xk6 (k6 扩展构建工具): go install go.k6.io/xk6/cmd/xk6latest3.构建自定义 k6 二进制文件&#xff08;集成 faker 扩展&#xff09;: xk6 build --with github.com/gkarthiks/xk6-fakerlatest构建报错处理&#xff08;代码拉取失败&#xff09;&#xff1…...

ubuntu 安装mq

一、安装依赖 编译 Erlang 需要以下依赖库和工具&#xff1a; sudo apt update sudo apt install -y build-essential autoconf libncurses5-dev libssl-dev m4 unixodbc-dev libwxgtk3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev 二、解压源码包 tar -xzvf otp_src_21.…...

优化 Spring Boot 应用启动性能的实践指南

1. 引言 Spring Boot 以其“开箱即用”的特性深受开发者喜爱,但随着项目复杂度的增加,应用的启动时间也可能会变得较长。对于云原生、Serverless 等场景而言,快速启动是一个非常关键的指标。 2. 分析启动过程 2.1 启动阶段概述 Spring Boot 的启动流程主要包括以下几个阶…...

ubuntu18.04编译qt5.14.2源码

ubuntu18.04编译qt5.14.2源码 文章目录 ubuntu18.04编译qt5.14.2源码[toc]1 前言2 参考文档3 下载源码3.1 方法13.2 方法23.3 方法3 4 ubuntu编译qt源码4.1 环境准备4.2 设置交换分区大小4.3 编译源码4.4 添加环境变量4.5 验证编译结果4.6 编译帮助文档&#xff08;qch&#xf…...

leetcodehot100刷题——排序算法总结

排序算法总结 冒泡排序介绍步骤&#xff08;以升序排序为例&#xff09;算法实现复杂度分析时间复杂度空间复杂度 是否为稳定排序&#xff1a;是稳定排序的定义 选择排序介绍步骤&#xff08;以升序排序为例&#xff09;算法实现复杂度分析时间复杂度空间复杂度 是否为稳定排序…...

多用途商务,电子产品发布,科技架构,智能手表交互等发布PPT模版20套一组分享

产品发布类PPT模版20套一组&#xff1a;产品发布PPT模版https://pan.quark.cn/s/25c8517b0be3 第一套PPT模版是一个总结用的PPT封面&#xff0c;背景浅灰色&#xff0c;有绿色叶片和花朵装饰&#xff0c;深绿色标题&#xff0c;多个适用场景和占位符。突出其清新自然的设计和商…...

2025年- H29-Lc137- 19.删除链表的倒数第N个节点(快慢指针)---java版

1.题目描述 2.思路 快慢指针都在虚拟头节点&#xff0c;然后让快指针先走n1步&#xff0c;接下来&#xff0c;快慢指针以前移动&#xff0c;直到快指针指向null&#xff0c;慢指针指向被删节点的前一个节点。 3.代码实现 方法一&#xff1a;不带测试用例 /*** Definition …...