SpringBoot2.x 整合 Ueditor

在这里插入图片描述
在这里插入图片描述

文章目录

          • 一、基础准备
            • 1. 创建项目并引入依赖
            • 2. 下载Ueditor源码
            • 3. Java代码整合
            • 4. 静态文件整合
          • 二、静态页面+控制层
            • 2.1. index.html
            • 2.2. demo1.html
            • 2.3. demo2.html
            • 2.4. demo3.html
            • 2.5. Controller
          • 三、配置调整
            • 3.1. 图片大小
            • 3.2. 修改ueditor.config.js
            • 3.3. 修改config.json文件
            • 3.4. 修改BinaryUploader
            • 3.5. 修改ConfigManage类
            • 3.6. 设置图片在Ueditor中回显

一、基础准备
1. 创建项目并引入依赖

boot-ueditor

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version><relativePath/> <!-- lookup parent from repository --></parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20190722</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency>
2. 下载Ueditor源码

下载地址:https://github.com/fex-team/ueditor/tree/dev-2.0.0

3. Java代码整合

ueditor-dev-2.0.0版本\ueditor\jsp\src下的com文件夹整体复制到项目Java目录下面
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4. 静态文件整合
  • ①把ueditor整个文件夹复制到static目录下面
  • ②把ueditor\jsp\config.json复制到ueditor的根目录下面
  • ③在resources目录下面创建js文件夹存放jquery2.1.3.min.js

在这里插入图片描述

二、静态页面+控制层

resources目录下面创建templates

2.1. index.html
<!DOCTYPE>
<html xmlns:th="http://www.thymeleaf.org">
<head><title>完整demo</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.config.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.all.js}"> </script><!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败--><!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文--><script type="text/javascript" charset="utf-8" th:src="@{ueditor/lang/zh-cn/zh-cn.js}"></script><style type="text/css">div{width:100%;}</style>
</head>
<body>
<div><h1>完整demo</h1><script id="editor" type="text/plain" style="width:1024px;height:500px;"></script>
</div>
<div id="btns"><div><button onclick="getAllHtml()">获得整个html的内容</button><button onclick="getContent()">获得内容</button><button onclick="setContent()">写入内容</button><button onclick="setContent(true)">追加内容</button><button onclick="getContentTxt()">获得纯文本</button><button onclick="getPlainTxt()">获得带格式的纯文本</button><button onclick="hasContent()">判断是否有内容</button><button onclick="setFocus()">使编辑器获得焦点</button><button onmousedown="isFocus(event)">编辑器是否获得焦点</button><button onmousedown="setblur(event)" >编辑器失去焦点</button></div><div><button onclick="getText()">获得当前选中的文本</button><button onclick="insertHtml()">插入给定的内容</button><button id="enable" onclick="setEnabled()">可以编辑</button><button onclick="setDisabled()">不可编辑</button><button onclick=" UE.getEditor('editor').setHide()">隐藏编辑器</button><button onclick=" UE.getEditor('editor').setShow()">显示编辑器</button><button onclick=" UE.getEditor('editor').setHeight(300)">设置高度为300默认关闭了自动长高</button></div><div><button onclick="getLocalData()" >获取草稿箱内容</button><button onclick="clearLocalData()" >清空草稿箱</button></div></div>
<div><button onclick="createEditor()">创建编辑器</button><button onclick="deleteEditor()">删除编辑器</button>
</div><script type="text/javascript">//实例化编辑器//建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例var ue = UE.getEditor('editor');function isFocus(e){alert(UE.getEditor('editor').isFocus());UE.dom.domUtils.preventDefault(e)}function setblur(e){UE.getEditor('editor').blur();UE.dom.domUtils.preventDefault(e)}function insertHtml() {var value = prompt('插入html代码', '');UE.getEditor('editor').execCommand('insertHtml', value)}function createEditor() {enableBtn();UE.getEditor('editor');}function getAllHtml() {alert(UE.getEditor('editor').getAllHtml())}function getContent() {var arr = [];arr.push("使用editor.getContent()方法可以获得编辑器的内容");arr.push("内容为:");arr.push(UE.getEditor('editor').getContent());alert(arr.join("\n"));}function getPlainTxt() {var arr = [];arr.push("使用editor.getPlainTxt()方法可以获得编辑器的带格式的纯文本内容");arr.push("内容为:");arr.push(UE.getEditor('editor').getPlainTxt());alert(arr.join('\n'))}function setContent(isAppendTo) {var arr = [];arr.push("使用editor.setContent('欢迎使用ueditor')方法可以设置编辑器的内容");UE.getEditor('editor').setContent('欢迎使用ueditor', isAppendTo);alert(arr.join("\n"));}function setDisabled() {UE.getEditor('editor').setDisabled('fullscreen');disableBtn("enable");}function setEnabled() {UE.getEditor('editor').setEnabled();enableBtn();}function getText() {//当你点击按钮时编辑区域已经失去了焦点,如果直接用getText将不会得到内容,所以要在选回来,然后取得内容var range = UE.getEditor('editor').selection.getRange();range.select();var txt = UE.getEditor('editor').selection.getText();alert(txt)}function getContentTxt() {var arr = [];arr.push("使用editor.getContentTxt()方法可以获得编辑器的纯文本内容");arr.push("编辑器的纯文本内容为:");arr.push(UE.getEditor('editor').getContentTxt());alert(arr.join("\n"));}function hasContent() {var arr = [];arr.push("使用editor.hasContents()方法判断编辑器里是否有内容");arr.push("判断结果为:");arr.push(UE.getEditor('editor').hasContents());alert(arr.join("\n"));}function setFocus() {UE.getEditor('editor').focus();}function deleteEditor() {disableBtn();UE.getEditor('editor').destroy();}function disableBtn(str) {var div = document.getElementById('btns');var btns = UE.dom.domUtils.getElementsByTagName(div, "button");for (var i = 0, btn; btn = btns[i++];) {if (btn.id == str) {UE.dom.domUtils.removeAttributes(btn, ["disabled"]);} else {btn.setAttribute("disabled", "true");}}}function enableBtn() {var div = document.getElementById('btns');var btns = UE.dom.domUtils.getElementsByTagName(div, "button");for (var i = 0, btn; btn = btns[i++];) {UE.dom.domUtils.removeAttributes(btn, ["disabled"]);}}function getLocalData () {alert(UE.getEditor('editor').execCommand( "getlocaldata" ));}function clearLocalData () {UE.getEditor('editor').execCommand( "clearlocaldata" );alert("已清空草稿箱")}
</script>
</body>
</html>
2.2. demo1.html
<html xmlns:th="http://www.thymeleaf.org">
<head><title>UEditor Demo</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><script type="text/javascript" th:src="@{js/jquery2.1.3.min.js}"></script><!-- ueditor start --><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.config.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.all.js}"> </script><!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败--><!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文--><script type="text/javascript" charset="utf-8" th:src="@{ueditor/lang/zh-cn/zh-cn.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video-js.css}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video.js}"></script><!-- ueditor end --></head>
<body><div><h1>完整demo</h1><textarea id="editor" type="text/plain" style="width:95%;height:500px;"></textarea></div><button onclick="getContent()">获得内容</button><script type="text/javascript">//实例化编辑器//建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例let ue = UE.getEditor('editor');function getContent() {let arr = [];arr.push(ue.getContent());$.post("ueditor/d1",arr.join("\n"));}</script>
</body>
</html>
2.3. demo2.html
<html xmlns:th="http://www.thymeleaf.org">
<head><title>UEditor Demo</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><script type="text/javascript" th:src="@{js/jquery2.1.3.min.js}"></script><!-- ueditor start --><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.config.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.all.js}"> </script><!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败--><!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文--><script type="text/javascript" charset="utf-8" th:src="@{ueditor/lang/zh-cn/zh-cn.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video-js.css}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video.js}"></script><!-- ueditor end -->
</head>
<body><div><h1>完整demo</h1><textarea id="editor" type="text/plain" style="width:95%;height:500px;"></textarea></div><button onclick="getContent()">获得内容</button><script type="text/javascript">//实例化编辑器let ue = UE.getEditor('editor');function getContent() {let arr = [];arr.push(ue.getContent());$.post("ueditor/d2","data="+arr.join("\n"));}</script>
</body>
</html>
2.4. demo3.html
<html xmlns:th="http://www.thymeleaf.org">
<head><title>UEditor Demo</title><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/><script type="text/javascript" th:src="@{js/jquery2.1.3.min.js}"></script><!-- ueditor start --><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.config.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/ueditor.all.js}"> </script><!--建议手动加在语言,避免在ie下有时因为加载语言失败导致编辑器加载失败--><!--这里加载的语言文件会覆盖你在配置项目里添加的语言类型,比如你在配置项目里配置的是英文,这里加载的中文,那最后就是中文--><script type="text/javascript" charset="utf-8" th:src="@{ueditor/lang/zh-cn/zh-cn.js}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video-js.css}"></script><script type="text/javascript" charset="utf-8" th:src="@{ueditor/third-party/video-js/video.js}"></script><!-- ueditor end -->
</head>
<body><form th:action="@{ueditor/d3}">姓名:<input type="text" name="name" id="name"><br>简介:<textarea id="info" type="text/plain" style="width:95%;height:200px;"></textarea><input type="submit" value="提交"></form><script type="text/javascript">//实例化编辑器let ue =  UE.getEditor('info');</script>
</body>
</html>
2.5. Controller

DispatcherController

package com.baidu.ueditor.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class DispatcherController {@RequestMapping("/index")public String index() {return "index";}@RequestMapping("/demo1")public String demo1() {return "demo1";}@RequestMapping("/demo2")public String demo2() {return "demo2";}@RequestMapping("/demo3")public String demo3() {return "demo3";}
}

UEditorController

package com.baidu.ueditor.controller;import com.baidu.ueditor.ActionEnter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;@Controller
@RequestMapping("/ueditor")
public class UEditorController {@RequestMapping(value = "/config")public void config(HttpServletRequest request, HttpServletResponse response) {response.setContentType("application/json");String rootPath = request.getSession().getServletContext().getRealPath("/");try {String exec = new ActionEnter(request, rootPath).exec();PrintWriter writer = response.getWriter();writer.write(exec);writer.flush();writer.close();} catch (IOException e) {e.printStackTrace();}}///@ResponseBody@RequestMapping("/d1")public void demo1(HttpServletRequest request) throws IOException {ServletInputStream is = request.getInputStream();String str = inputStream2String(is, "UTF-8");System.out.println("用户在UEditor中输入的内容是:" + str);}public static String inputStream2String(InputStream is, String encode) {String str = "";try {if (encode == null || encode.equals("")) {encode = "utf-8";// 默认以utf-8形式}BufferedReader br = new BufferedReader(new InputStreamReader(is, encode));StringBuffer sb = new StringBuffer();while ((str = br.readLine()) != null) {sb.append(str).append("\n");}return sb.toString();} catch (IOException e) {e.printStackTrace();}return str;}@ResponseBody@RequestMapping("/d2")public void demo2(HttpServletRequest request) throws IOException {String data = request.getParameter("data");System.out.println(data);}@ResponseBody@RequestMapping("/d3")public void demo3(String name,String editorValue) throws IOException {System.out.println("doGet");System.out.println(name);System.out.println(editorValue);}
}
三、配置调整
3.1. 图片大小

当用户上传的图片太大时,为了不让Ueditor不出现水平滚动轴,可以修改ueditor.all.js文件以及ueditor.all.mini.js文件
在这里插入图片描述

3.2. 修改ueditor.config.js

修改ueditor.config.js文件,在其中指定Ueditor请求的服务器端的路径:
在这里插入图片描述

3.3. 修改config.json文件

修改config.json文件,为其添加一个表示上传资料基本路径的变量basePath
在这里插入图片描述

3.4. 修改BinaryUploader

修改BinaryUploader的save()方法的代码如下

public static final State save(HttpServletRequest request,Map<String, Object> conf) {// FileItemStream fileStream = null;// boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;if (!ServletFileUpload.isMultipartContent(request)) {return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);}// ServletFileUpload upload = new ServletFileUpload(// 	new DiskFileItemFactory());//// if ( isAjaxUpload ) {//     upload.setHeaderEncoding( "UTF-8" );// }try {// FileItemIterator iterator = upload.getItemIterator(request);//// while (iterator.hasNext()) {// 	fileStream = iterator.next();//// 	if (!fileStream.isFormField())// 		break;// 	fileStream = null;// }//// if (fileStream == null) {// 	return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);// }MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;MultipartFile multipartFile = multipartRequest.getFile(conf.get("fieldName").toString());if(multipartFile==null){return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);}String savePath = (String) conf.get("savePath");//String originFileName = fileStream.getName();String originFileName = multipartFile.getOriginalFilename();String suffix = FileType.getSuffixByFilename(originFileName);originFileName = originFileName.substring(0,originFileName.length() - suffix.length());savePath = savePath + suffix;long maxSize = ((Long) conf.get("maxSize")).longValue();if (!validType(suffix, (String[]) conf.get("allowFiles"))) {return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);}savePath = PathFormat.parse(savePath, originFileName);//String physicalPath = (String) conf.get("rootPath") + savePath;String basePath=(String) conf.get("basePath");String physicalPath = basePath + savePath;//InputStream is = fileStream.openStream();InputStream is = multipartFile.getInputStream();State storageState = StorageManager.saveFileByInputStream(is,physicalPath, maxSize);is.close();if (storageState.isSuccess()) {storageState.putInfo("url", PathFormat.format(savePath));storageState.putInfo("type", suffix);storageState.putInfo("original", originFileName + suffix);}return storageState;// } catch (FileUploadException e) {// 	return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);} catch (IOException e) {}return new BaseState(false, AppInfo.IO_ERROR);}
3.5. 修改ConfigManage类
  • 修改成员变量configFileName的值为config.json的路径值:
private static final String configFileName = "static/ueditor/config.json";

在这里插入图片描述

  • 在getConfig()方法的return语句之前添加如下代码:
		//将basePath塞进confconf.put("basePath", this.jsonConfig.getString("basePath"));conf.put("savePath", savePath);conf.put("rootPath", this.rootPath);

在这里插入图片描述

  • 修改initEnv()方法
    为了让项目在打包后能正常够上传文件/图片,修改initEnv()方法用Class类的getResourceAsStream()来读取文件
private void initEnv() throws FileNotFoundException, IOException {File file = new File(this.originalPath);if (!file.isAbsolute()) {file = new File(file.getAbsolutePath());}this.parentPath = file.getParent();//String configContent = this.readFile(this.getConfigPath());String configContent = this.filter(IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream(configFileName)));try {JSONObject jsonConfig = new JSONObject(configContent);this.jsonConfig = jsonConfig;} catch (Exception e) {this.jsonConfig = null;}
}

在这里插入图片描述

  • 修改getConfigPath()方法的代码如下:
private String getConfigPath() {try {//获取classpath下的config.json路径return this.getClass().getClassLoader().getResource(configFileName).toURI().getPath();} catch (URISyntaxException e) {return this.parentPath + File.separator + ConfigManager.configFileName;}
}
3.6. 设置图片在Ueditor中回显

因为我们把图片存在E盘了,而spring并没有对E盘目录进行映射。只有按如下所示在application.properties文件加入路径映射,上传成功的图片在Ueditor中才才能回显:

spring:servlet:#设置SpringBoot内置tomcat允许上传图片的大小multipart:max-file-size: 100MBmax-request-size: 1000MB#路径映射,Ueditor上传图片成功后回显用resources:static-locations: classpath:static/,file:static/,file:D:/ueditor

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

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

相关文章

无线路由攻击和WiFi密码破解实战[渗透技术]

文章目录一、准备阶段二、攻击阶段1.停止&#x1f6d1;网络管理员2.开启网卡监听模式3. 捕获数据包4.获取数据包5.注入数据包&#xff08;DeAuth洪水攻击&#xff09;5.WiFi密码破解一、准备阶段 攻击主机&#xff1a;kali Linux攻击工具&#xff1a;aircrack-ng、airodump-ng…

支付宝双11狂欢幕后的女程序员:服务全球12亿人,每天和不法分子打攻防战

再过3天&#xff0c;全球最大的购物狂欢节就开始了。 在这个睡不着的午夜&#xff0c;无数男男女女会在闪烁的屏幕前滑屏、抢购、享受秒级付款带来的快感。整个过程大脑分泌的多巴胺&#xff0c;又驱使他们以更快的速度重新填满购物车。 2018年天猫双11成交额2135亿元&#x…

技术直播:程序员副业的修炼指南!(限免报名)

面试造飞机&#xff0c;上班拧螺丝&#xff0c;每天想辞职&#xff0c;但无奈副业还“大器晚成”的样子&#xff01;那可能是你还没有选对副业&#xff01;滴滴 ~福利卡&#xff01;&#xff01;&#xff01;CSDN学院邀请汤小洋老师开设技术直播课《程序员副业之路-三大终极秘籍…

轻松解决Android gradle太慢问题

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 一、解决方案 从网上下载对应版本的gradle,然后把gradle压缩包复制到C:\Users\liuxin\.gradle\wrapper\dists\gradle-6.5-all\2oz4ud9k3tuxjg84bbf55q0tn目录下&#xff0c;重新build工程就搞定了。 安卓开发者平台官…

持续交付体系在高德的实践历程

1. 前序 对于工程团队来说&#xff0c;构建一套具有可持续性的、多方面质量保证的交付体系建设&#xff0c;能够为业务价值的快速交付搭建起高速公路&#xff0c;也能为交付过程中的质量起到保驾护航的作用。本文为大家介绍持续交付体系在高德的演进与落地。 2. 持续交付 正…

RuoYi-Cloud 部署篇_01(windows环境 mysql +nginx版本)

文章目录一、基础准备1. 技术选型2. 源码克隆3. 安装依赖4. 将 RuoYi-Cloud 项目导入到 IDEA5. 安装启动Mysql6. 安装启动Redis7. 创建数据库&#xff0c;执行 SQL脚本文件二、安装与配置 nacos2.1. 下载nacos2.2. 安装 nacos2.3. nacos持久化配置2.4. 执行脚本文件2.5. nacos连…

趣头条基于 Flink 的实时平台建设实践

本文由趣头条实时平台负责人席建刚分享趣头条实时平台的建设&#xff0c;整理者叶里君。文章将从平台的架构、Flink 现状&#xff0c;Flink 应用以及未来计划四部分分享。 一&#xff0e;平台架构 1.Flink 应用时间线 首先是平台的架构&#xff0c;2018 年 3 月之前基本都是基…

我!程序猿!被银行套路了!

作者 | 程序猿石头责编 | Carol封图 | CSDN 付费下载自视觉中国话说&#xff0c;你肯定也经常收到各个银行电话推销&#xff0c;可以办理小额贷款/信用卡账单分期/万用金&#xff0c;或者其他乱七八糟的名字的产品。又或者接到电话说&#xff0c;“石头先生&#xff0c;我们有留…

巧妙地在Windows搭建node服务器

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 文章目录一、 安装node1. 官网下载node.js2. 测试npm是否成功安装3. 配置npm模块和缓存的存放路径4. 安装express5. 配置npm环境变量二、安装cnpm1.执行安装2. 配置cnpm环境变量一、 安装node 1. 官网下载node.js 官…

jdk8下载

文章目录1. 官网2. windows下载链接3. linux下载链接1. 官网 https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html 2. windows下载链接 https://download.oracle.com/otn/java/jdk/8u301-b09/d3c52aa6bfa54d3ca74e617f18309292/jdk-8u301-window…

测试工程师不懂AI,还有未来吗?

阿里妹导读&#xff1a;近几年人工智能、机器学习等词漫天遍地&#xff0c;似乎有一种无AI&#xff0c;无研发&#xff0c;无AI&#xff0c;无测试的感觉。有人说&#xff1a;不带上“智能”二字&#xff0c;都不好意思说自己是创新。我们先暂且不评论对错&#xff0c;只探讨这…

redis 下载、启动 windows环境

文章目录1. 下载2. 启动1. 下载 https://github.com/MicrosoftArchive/redis/releases 2. 启动 进入redis的bin目录双击redis-server.exe

Aruba发布业界首款服务智能边缘的云原生平台Aruba ESP

利用AI 和自动化技术打造智能网络&#xff1b;支持业务连续性任务&#xff0c;驾驭未来智能边缘 慧与公司旗下的Aruba今日推出业内首款 AI 驱动的云原生平台 Aruba ESP&#xff08;边缘服务平台&#xff09;&#xff0c;该平台建立在AIOps、零信任网络安全和统一架构基础上&am…

axios的安装和使用

文章目录一、axios介绍二、安装axios三、 案例四、框架整合五、插件一、axios介绍 什么是 axios? Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 特性: 1、从浏览器中创建 XMLHttpRequests 2、从 node.js 创建 http 请求 3、支持 Promise AP…

达摩院最新AI技术助力天猫双11,提供接近真人的语音交互体验

11月8日&#xff0c;记者了解到&#xff0c;阿里巴巴达摩院机器智能实验室最新研究成果——KAN-TTS将首次大规模应用于今年天猫双11&#xff0c;基于该技术&#xff0c;菜鸟热线机器人、语音机器人小蜜以及天猫精灵将为全球消费者提供接近真人的语音交互体验。 让机器开口说话…

make[1]: *** [objs/Makefile:445: objs/src/core/ngx_murmurhash.o] Error

执行完make以后报错 make[1]: *** [objs/Makefile:445: objs/src/core/ngx_murmurhash.o] Error 1 make[1]: Leaving directory /app/nginx-1.9.9 make: *** [Makefile:8: build] Error 2解决办法 找到对应的Maakefile文件&#xff08;我的在 /nginx/objs/Makefile&#xff09…

原来记录系统日志那么简单【Java】【SpringBoot】【Mybatis Plus】【AspcetJ】

夫陶公清风千古&#xff0c;余又何人&#xff0c;敢称庶几 文章目录前言一、系统日志是什么二、开发技术三、开发步骤3.1引入依赖坐标3.1.1 导入Lombok3.1.2 数据库连接依赖3.1.3 spring aop依赖3.1.4 aspectJ依赖3.1.5 Druid连接池&#xff08;阿里巴巴&#xff09;3.1.6 myb…

程序员风光背后:从零到今日头条数据分析师,我走了1年!

笔者最近在今日头条上&#xff0c;看到了头条员工的自述&#xff1a;“从什么都不懂的小白&#xff0c;到入职头条成为数据分析工程师&#xff0c;我走了1年的时间。”评论区却炸锅了&#xff01;大家不明白&#xff0c;1年时间为什么要学这个&#xff1f;半年时间学Java不香吗…

前端内存优化的探索与实践

引言 标注是地图最基本的元素之一&#xff0c;标明了地图每个位置或线路的名称。在地图 JSAPI 中&#xff0c;标注的展示效果及性能也是需要重点解决的问题。 新版地图标注的设计中&#xff0c;引入了 SDF &#xff08; signed distance field&#xff09;重构了整个标注部分…

直播:AI时代,普通程序员该如何转人工智能(限免报名)

常常有小伙伴在后台反馈&#xff1a;想了解人工智能&#xff0c;但是该怎么学&#xff1f;自学难度大又没有效果&#xff0c;该怎么办&#xff1f;CSDN为了解决这个难题&#xff0c;联合唐宇迪老师为大家带来了一场精彩的直播【年薪百万AI工程师亲授&#xff1a;小白实战培养计…