说明

onlyoffice为一款开源的office在线编辑组件,提供word/excel/ppt编辑保存操作

  • 以下操作均基于centos8系统,officeonly镜像版本7.1.2.23(社区开源版修改)
  • 镜像下载地址:https://yunpan.360.cn/surl_y87CKKcPdY4 (提取码:1f92)
  • 已优化连接数
  • 已导入常用中文字体,修改了字号
  • 已优化文件上传大小
  • 隐藏所有操作按钮,隐藏onlyoffice图标和名称,只保基础操作栏目
  • 仅用于word文件和excel文件编辑/保存/查看

Linux安装

yum设置

  • 进入yum的repos目录 cd /etc/yum.repos.d/
cd /etc/yum.repos.d/
  • 修改所有的CentOS文件内容
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
  • 更新yum源为阿里镜像
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repoyum clean allyum makecache
  • yum安装测试是否可以yum安装
yum install wget –y
  • 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

docker安装

  • 设置镜像源
sudo yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • 安装docker-ce社区版
sudo yum install docker-ce --allowerasing
  • 创建用户组
建立 Docker 用户组
sudo groupadd docker
添加当前用户到 dockersudo usermod -aG docker $USER
启动docker
systemctl start docker.service
服务开机启动
systemctl enable docker.service
  • 安装docker图形化管理页面
docker volume create portainer_datadocker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

访问http://localhost:9000/进行管理端初始化设置

onlyoffice部署

  • 上传镜像文件到服务器
  • 载入镜像
docker load < onlyoffice.tar
  • 查看镜像
docker images
  • 启动容器
sudo docker run --name=onlyoffice -i -t -d -p  8088:80 --restart=always 镜像id

Windows安装

  • 安装VMWare虚拟机,安装centos8系统,参照上述步骤
  • 网络配置成NAT模式,虚拟机进入centos系统后配置固定ip
  • NAT网卡设置端口转发,转发9000和8088端口,主机端口和虚拟端口一致

添加字体

  • 找到对应字体,如果是windows下的字体进入C:\Windows\Fonts 搜索
  • 安装High-Logic FontCreator 运行Keygen.exe 点击generate获取激活码
  • 工具下载:https://yunpan.360.cn/surl_y87CK8RNr8N (提取码:7059)
  • 打开字体 font=>properties
  • 修改 font family 为custom 中对应的中文 ,导出字体
  • 上传修改后的字体到liunx文件下 eg:/home/fonts/
  • 查看OnlyOffice容器id
docker ps
  • 进入OnlyOffice容器
docker exec -it 容器id /bin/bash
  • 删除字体缓存
cd /var/www/onlyoffice/documentserver/fontsrm -rf *
  • 复制字体到 /var/www/onlyoffice/documentserver/core-fonts 下
docker cp /home/fonts onlyoffice:/var/www/onlyoffice/documentserver/core-fonts
  • 进入onlyoffice容器执行刷新
/usr/bin/documentserver-generate-allfonts.sh
  • 浏览器清除缓存重新刷新

对接业务系统

onlyfiice部署完毕后会有一个服务地址,例如 http://localhost:8088/

引入api.js

不能下载文件本地引用,一定要在线引用

<script type="text/javascript" src="http://localhost:8088/web-apps/apps/api/documents/api.js"></script>

声明dom

页面添加一个div,用于渲染编辑器

<div id="placeholder" class="nav" style="width: 100%; height: 100%"></div>

页面渲染

参数说明

key:对应文档的一个标识,建议前端随机生成,防止重复

url:打开文档的地址,返回流数据

fileType:文档类型,例如:doc/docx

title:文件名称,例如:2022年工作方案.docx

model:打开模式,例如:edit(编辑模式)/view(阅读模式)

callbackUrl:文件修改后保存回调地址

function initDoc(key, url, fileType, title, model, callbackUrl) {let config = {"document": {"documentType": "text","width": "100%", //打开窗口宽度"height": "100%", //打开窗口高度"fileType": fileType, //文档类型"key": key, //定义用于服务识别文档的唯一文档标识符。每次编辑和保存文档时,都必须重新生成密钥。长度限制为128个符号。"title": title, //为查看或编辑的文档定义所需的文件名,该文件名也将在下载文档时用作文件名。长度限制为128个符号。"url": url, //定义存储原始查看或编辑的文档的绝对URL"info": {"owner": "王重阳", //文件创建者名称"sharingSettings": [ //文件对应用户的操作权限配置{"permissions": "Full Access", // 完全操作权限-Full Access,只读权限-Read Only 拒绝访问-Deny Access"user": "林朝英" //有次权限的用户},{"permissions": "Read Only","user": "周伯通"},],"uploaded": "2010-07-07 3:46 PM" //文件创建时间},//文档权限参数"permissions": {"edit": true, //(文件是否可以编辑,false时文件不可编辑)"fillForms": true, //定义是否能在文档中填充表单"print": true, //定义文档是否能打印"review": false, //第一是否显示审阅文档菜单"comment": true, //定义是否可以注释文档。如果注释权限设置为“ true”,则文档侧栏将包含“注释”菜单选项;只有将mode参数设置为edit时才生效,默认值与edit参数的值一致。"copy": true, //是否允许您将内容复制到剪贴板。默认值为true。"download": true, //定义是否可以下载文档或仅在线查看或编辑文档。如果下载权限设置为“false”下载为菜单选项将没有。默认值为true。"modifyContentControl": true, //定义是否可以更改内容控件设置。仅当mode参数设置为edit时,内容控件修改才可用于文档编辑器。默认值为true。"modifyFilter": true, //定义过滤器是否可以全局应用(true)影响所有其他用户,或局部应用(false),即仅适用于当前用户。如果将mode参数设置为edit,则过滤器修改仅对电子表格编辑器可用。默认值为true。}},// type: "embedded",//打开文档类型// text对应各种文档类型(.doc, .docm, .docx, .dot, .dotm, .dotx, .epub, .fodt, .htm, .html, .mht, .odt, .ott, .pdf, .rtf, .txt, .djvu, .xps)//spreadsheet对应表格类型(.csv, .fods, .ods, .ots, .xls, .xlsm, .xlsx, .xlt, .xltm, .xltx)//presentation对应PPT类型(.fodp, .odp, .otp, .pot, .potm, .potx, .pps, .ppsm, .ppsx, .ppt, .pptm, .pptx)"editorConfig": { //编辑配置"createUrl": "http://docServer:port/url-to-create-document/", //指定创建文件的页面,添加该配置后文档服务器插件才会显示新建文件按钮"mode": model, //文档操作模式 view 视图模式不可编辑  edit 编辑模式可编辑文档"callbackUrl": callbackUrl, //保存文件时的回调地址"lang": "zh-CN", //语言环境"customization": { //定制部分允许自定义编辑器界面,使其看起来像您的其他产品,并更改是否存在其他按钮,链接,更改徽标和编辑者所有者详细信息。"help": false, //定义是显示还是隐藏“帮助”菜单按钮。默认值为true。"hideRightMenu": false, //定义在第一次加载时是显示还是隐藏右侧菜单。默认值为false。"autosave": false, //定义是启用还是禁用“自动保存”菜单选项。请注意,如果您在菜单中更改此选项,它将被保存到浏览器的localStorage中。默认值为true。"forcesave": true, //定义保存按钮是否显示默认false"chat": false, //定义“聊天”菜单按钮是显示还是隐藏;请注意,如果您隐藏“聊天”按钮,则相应的聊天功能也将被禁用。默认值为true。"commentAuthorOnly": false, //定义用户是否只能编辑和删除他的评论。默认值为false。"comments": false, //定义是显示还是隐藏“注释”菜单按钮;请注意,如果您隐藏“评论”按钮,则相应的评论功能将仅可用于查看,评论的添加和编辑将不可用。默认值为true。"compactHeader": false, //定义是否将菜单栏放在在徽标旁边使界面更加紧凑默认false。"compactToolbar": false, //定义显示的顶部工具栏类型是完整(false)还是紧凑true。默认值为false 多余菜单将在右侧折叠点击显示。"compatibleFeatures": false, //定义仅与OOXML格式兼容的功能的使用。例如,不要在整个文档上使用注释。默认值为false。"macros": false, //定义是否将运行文档宏以及可用的宏设置。默认值为true。"macrosMode": "warn", //定义是否将运行文档宏。可以采用以下值: disable -根本不运行;enable -自动运行所有宏;warn -警告宏并请求允许运行。默认值为original。"plugins": false, //定义是否将启动插件并可用。默认值为true。"showReviewChanges": false, //定义在加载编辑器时是否自动显示或隐藏审阅更改面板。默认值为false。"spellcheck": false, //定义在加载编辑器时是否自动打开或关闭拼写检查器。拼写检查器仅适用于文档编辑器和演示文稿编辑器。默认值为true。"toolbarNoTabs": false, //定义是突出显示顶部工具栏选项卡样式。默认值为false。"unit": "cm", //定义在标尺和对话框中使用的度量单位。可以采用以下值:cm -厘米,pt-点,inch -英寸。默认值为厘米(cm)。"zoom": 100, //定义以百分比为单位的文档显示缩放值。可以取大于0的值。对于文本文档和演示文稿,可以将此参数设置为-1(使文档适合页面选项)或-2(使文档页面宽度适合编辑器页面)。默认值为100。"customer": { //关于 文档编辑器的显示信息"address": "My City, 123a-45", //有权访问编辑或编辑作者的公司或个人的邮政地址,"info": "Some additional information", //有关您希望其他人认识的公司或个人的一些其他信息,"logo": "https://example.com/logo-big.png", //图片徽标的路径(此文件没有特别建议,但是如果使用透明背景的.png格式会更好)。图片必须具有以下尺寸:432x70,"mail": "john@example.com", //有权访问编辑者或编辑者的公司或个人的电子邮件地址"name": "欧阳锋", //该公司或个人的谁可以访问编辑或编辑作者,名称"www": "example.com" //以上公司或个人的家庭网站地址,},"feedback": { //反馈配置信息"url": "https://example.com", //单击“反馈和支持”菜单按钮时将打开的网站地址的绝对URL ,"visible": false //显示或隐藏“反馈和支持”菜单按钮,},"goback": { //定义“打开文件位置”菜单按钮和右上角按钮的设置。该对象具有以下参数:"blank": true, //在新的浏览器选项卡/窗口(如果值设置为true)或当前选项卡(如果值设置为false)中打开网站。默认值为true,"requestClose": false, //定义如果单击“打开文件位置”按钮,则调用events.onRequestClose事件,而不是打开浏览器选项卡或窗口。默认值为false,"text": "Open file location", //将在“打开文件位置”菜单按钮和右上角按钮(即,而不是“转到文档”)上显示的文本,"url": "https://example.com" //单击“打开文件位置”菜单按钮时将打开的网站地址的绝对URL ,},"logo": {"image": "https://example.com/logo.png", //图像文件的路径,用于在普通工作模式下显示(即,在所有编辑器的查看和编辑模式下)。图片必须具有以下尺寸:172x40,"imageEmbedded": "https://example.com/logo_em.png", //用于以嵌入式模式显示的图像文件的路径(请参阅config部分以了解如何定义嵌入式文档类型)。图片必须具有以下尺寸:248x40,"url": "https://www.baidu.com" //某人单击徽标图像时将使用的绝对URL(可用于转到您的网站等)。保留为空字符串或null以使徽标不可单击,},},"user": { //用户信息"id": "admin", //用户ID"name": "操作员" //用户全名称},"embedded": { //Embedded部分仅适用于嵌入式文档类型(请参阅config部分以了解如何定义嵌入式文档类型)。它允许更改设置,这些设置定义嵌入式模式下按钮的行为。"embedUrl": "https://example.com/embedded?doc=exampledocument1.docx", //定义文档的绝对URL,以作为嵌入到网页中的文档的源文件"fullscreenUrl": "https://example.com/embedded?doc=exampledocument1.docx#fullscreen", //定义将以全屏模式打开的文档的绝对URL。"saveUrl": "https://example.com/download?doc=exampledocument1.docx", //定义允许将文档保存到用户个人计算机上的绝对URL。"shareUrl": "https://example.com/view?doc=exampledocument1.docx", //定义允许其他用户共享此文档的绝对URL。"toolbarDocked": "top" //定义嵌入式查看器工具栏的位置,可以为top或bottom。}},"events": { //事件配置// onAppReady,//-将应用程序加载到浏览器时调用的函数。// onCollaborativeChanges //-当文档由其他用户在严格共同编辑模式下共同编辑时调用的函数。// onDocumentReady,//-将应用程序加载到浏览器时调用的函数。// onDocumentStateChange,//-修改文档时调用的函数。这就是所谓的使用参数:{真正的“数据”}在当前用户编辑文档以及与参数:{“数据”:假}在当前用户的更改发送到文档编辑服务。// onDownloadAs,//-调用downloadAs方法时,使用指向已编辑文件的绝对URL调用的函数。在data参数中发送要下载的文档的绝对URL 。// onError,//-发生错误或其他特定事件时调用的函数。错误消息在data参数中发送。// onInfo,//-应用程序打开文件时调用的函数。该模式在data.mode参数中发送。可以查看或编辑。// onMetaChange,//-通过meta命令更改文档的元信息时调用的函数。文档名称通过data.title参数发送。// onOutdatedVersion,//-使用旧的document.key值打开文档进行编辑时,显示错误后调用的函数,该值用于编辑先前的文档版本并已成功保存。调用此事件时,必须使用新的document.key重新初始化编辑器。// onReady,//-将应用程序加载到浏览器时调用的函数。自从5.0版本不推荐使用,请使用onAppReady代替// onRequestClose,//-结束编辑器的工作并且必须关闭编辑器时调用的函数。// onRequestCompareFile,//-用户尝试通过单击“存储中的文档”按钮来选择要比较的文档时调用的函数。要选择要比较的文档,必须调用setRevisedFile方法。如果未声明该方法,则不会显示“来自存储的文档”按钮。// onRequestCreateNew,//-用户尝试通过单击“新建”按钮来创建文档时调用的函数。使用此方法代替createUrl字段。如果未声明该方法且未指定createUrl,则将不会显示“创建新”按钮。// onRequestEditRights,//-用户尝试通过单击“编辑文档”按钮尝试将文档从视图切换到编辑模式时调用的函数。调用该函数时,必须在编辑模式下再次初始化编辑器。如果未声明该方法,则不会显示“编辑”按钮。// onRequestHistory,//-用户尝试通过单击“版本历史记录”按钮显示文档版本历史记录时调用的函数。要显示文档版本历史,您必须调用refreshHistory方法。如果未声明该方法和onRequestHistoryData方法,则不会显示“版本历史记录”按钮。// onRequestHistoryClose,//-当用户尝试通过单击“关闭历史记录”按钮来查看文档版本历史记录时,试图调用该文档时调用的函数。调用该函数时,必须在编辑模式下再次初始化编辑器。如果未声明该方法,则不会显示“关闭历史记录”按钮。// onRequestHistoryData,//-用户尝试单击文档版本历史记录中的特定文档版本时调用的函数。// onRequestInsertImage,//-用户尝试通过单击“保存图像”按钮插入图像时调用的函数。图像插入的类型在参数data.c中指定。// onRequestRename,//-用户尝试通过单击“重命名...”按钮重命名文件时调用的函数。// onRequestRestore,//-用户单击版本历史记录中的“还原”按钮来还原文件版本时调用的函数。// onRequestSaveAs,//-用户尝试通过单击“另存为...”按钮保存文件时调用的函数。文档的标题和要下载的文档的绝对URL在data参数中发送。如果未声明该方法,则不会显示“另存为...”按钮。// onRequestSharingSettings,//-用户单击“更改访问权限”按钮来管理文档访问权限时调用的函数。必须调用setSharingSettings方法来更新有关允许与其他用户共享文档的设置的信息。如果未声明该方法,则不会显示“更改访问权限”按钮。// onRequestUsers,//-评论者可以选择要在评论中提及的其他用户时调用的函数。要设置用户列表,必须调用setUsers方法。// onWarning,//-发生警告时调用的函数。警告消息在data参数中发送。// "onDocumentStateChange": function() {// }, //文档改变后的回调//"onDocumentReady" : onDocumentReady, //文档初始化准备好后的回调},};var docEditor = new DocsAPI.DocEditor("placeholder", config);}

数据接口

  • 下载文件

返回数据流即可,示例如下

    @GetMapping("/download")@ResponseBodypublic void download(@RequestParam("attguid") String attguid, HttpServletRequest request, HttpServletResponse response) throws Exception {AttachmentDO attachment = attachmentService.selectOne(attguid);String filePath = "";//云上传的附件if (attachment.getVirtualpath().contains("ReadAlOSS")) {if (attachment.getCanedit() == null || attachment.getCanedit() == 20) {String fileurl = aliUtil.readOSSFile(attachment);if (!StringUtil.isEmpty(fileurl)) {response.sendRedirect(fileurl);}} else if (attachment.getCanedit() == 30) {String fileurl = huaWeiUtil.readOBSFile(attachment);System.out.println(fileurl);if (!StringUtil.isEmpty(fileurl)) {response.sendRedirect(fileurl);}} else if (attachment.getCanedit() == 40) {String fileurl = minioUtil.readMinioFile(attachment);System.out.println(fileurl);if (!StringUtil.isEmpty(fileurl)) {response.sendRedirect(fileurl);}}}//本地文件String configPath = frameConfig.getAttachPath();filePath = configPath + attachment.getVirtualpath();File file = new File(filePath);if (file.exists()) {String filename = attachment.getFilename();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));response.setCharacterEncoding("utf-8");response.setContentLength((int) file.length());byte[] buff = new byte[(int) file.length()];BufferedInputStream bufferedInputStream = null;OutputStream outputStream = null;try {outputStream = response.getOutputStream();bufferedInputStream = new BufferedInputStream(new FileInputStream(file));int i = 0;while ((i = bufferedInputStream.read(buff)) != -1) {outputStream.write(buff, 0, i);outputStream.flush();}} catch (IOException e) {e.printStackTrace();} finally {try {bufferedInputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
  • 保存文件

解析传递的参数,获取文件url下载到本地后,进行自定义业务操作

@PostMapping("/save")@ResponseBodypublic void save(@RequestParam Map<String, String> map, HttpServletRequest request, HttpServletResponse response) {PrintWriter writer = null;String body = "";String attguid = request.getParameter("attguid");try {writer = response.getWriter();Scanner scanner = new Scanner(request.getInputStream());scanner.useDelimiter("\\A");body = scanner.hasNext() ? scanner.next() : "";scanner.close();} catch (Exception ex) {writer.write("get request.getInputStream error:" + ex.getMessage());return;}if (body.isEmpty()) {throw new CustomerRuntimeException("ONLYOFFICE回调保存请求体未空");}JSONObject jsonObj = JSONObject.parseObject(body);int status = (Integer) jsonObj.get("status");int saved = 0;String key = jsonObj.get("key").toString();if (status == 2 || status == 3 || status == 6) //MustSave, Corrupted{String downloadUri = (String) jsonObj.get("url");System.out.println(downloadUri);try {String filePath = "tempfiles/onlyoffice/savedownload/";FileUtil.initfloderPath(filePath);String fileName = CommonUtil.getNewGuid();HttpUtil.downLoadFromUrl(downloadUri, filePath, fileName);attachLogic.updateAttachContent(attguid, FileUtil.getBytes(filePath + fileName));} catch (Exception ex) {saved = 1;ex.printStackTrace();}}writer.write("{\"error\":" + saved + "}");}

外部按钮接入

以保存按钮为例

获取编辑器iframe按钮中的slot-btn-dt-save节点元素,定位div下的button按钮,进行js模拟点击实现保存操作

通过监听iframe的message来捕获到保存结束页面弹出自定义提示

上述操作因编辑器html页面和onlyoffice服务存在跨域问题,需要配置nginx代理到统一ip端口下

  function HandleSave() {var frameDocument = document.getElementsByTagName("iframe")[0].contentDocument;frameDocument.getElementById("slot-btn-dt-save").getElementsByTagName("button")[0].click();}window.onmessage = function (event) {var data = JSON.parse(event.data);if (data.event == "onDocumentStateChange" && data.data == false) {OpenSuccessMessage("保存成功")}}

SpringBoot集成onlyoffice实现word文档编辑保存相关推荐

  1. SpringBoot集成onlyoffice实现word文档编辑保存 [ 转载 ]

    原文地址 说明 onlyoffice为一款开源的office在线编辑组件,提供word/excel/ppt编辑保存操作 以下操作均基于centos8系统,officeonly镜像版本7.1.2.23( ...

  2. pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存

    pageOffice插件 springboot实现服务器上Word文档在线打开编辑保存 需求: 在oa系统上,想实现在线,服务器上doc,docx文档,在web打开,编辑.编辑后,可以再同步保存到服务 ...

  3. word文档编辑受限制怎么解除?

    在使用word文档的时候,为了避免内容被无修改而设置编辑保护,但是想要修改的时候发现word文档编辑受限了,那么怎么解除呢,其实关闭保护功能即可.下面一起来看看操作方法吧! word文档编辑受限怎么解 ...

  4. 用计算机如何编辑文档,怎么使用手机word文档编辑

    当电脑不在身边的时候,如何在手机上编辑word文档呢?下面就由学习啦小编来告诉你怎么使用手机word文档编辑,希望对你有帮助! 怎样在手机上编辑word文档 先下载wps office 的软件,如下图 ...

  5. word文档编辑问题

    输入字会把后面的字删除? 最近编辑word文档时遇到这么个问题:输入字会把后面的字删除,这个问题也不是总出现,可能把文档关闭,或者新建一个文档,这个问题就不存在了. 通过查阅资料,我发现问题在于wor ...

  6. ****来稿一律用WORD文档编辑,投稿邮箱:hljkjxx@yahoo.com.cn

    ****来稿一律用WORD文档编辑,投稿邮箱:hljkjxx@yahoo.com.cn 本刊是国内外公开发行的综合性科技类学术期刊.国际大16开本精美印刷.有正规刊号: 主要栏目:工程技术.建筑科学. ...

  7. word文档没保存就关了怎么恢复?别慌!试试这个操作

    word文档没保存就关了怎么恢复?工作和学习中,我们最常用到的就是word,但有时候电脑会遇到死机.崩溃等情况,如果正在编辑的文档没点保存,基本再次打开就没了,有什么方法可以恢复还没保存的word文档 ...

  8. 新建word文档没保存能恢复吗(已有579人收藏)

    大家在Word进行文档编辑时因为不可抗力因素都会遭遇过文档丢失的情况,那么新建word文档没保存能恢复吗?需要如何恢复呢,本篇文章就来为你解答这个问题. 新建Word文档没保存能恢复吗? 如果你在意外 ...

  9. word关闭时卡死_办公技巧:word文档没有保存就关闭了怎么找回?

    说到编辑文本,大家第一个想到的肯定就是TXT文本文档以及Word文档了吧.其中TXT文本文档以纯输入文本而文明,而Word则还支持各种文字格式.排版.以及插入图片等更多高阶的操作而深受学生.职场人的欢 ...

  10. php保存word没背景图,为什么word文档明明保存了却不见了

    原因:保存的地址出错了,文件保存到其他地方了.解决方法:1.首先打开Word软件,点击[文件]选项:然后点击[最近所用文件],对近来使用的文档进行查询,寻找之前保存的文件即可.2.在桌面点击放大镜图标 ...

最新文章

  1. scala while循环中断
  2. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...
  3. 脚本:获取CSDN文章的访问量
  4. MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
  5. linux内核5.4,Linux Kernel 5.4 RC8 发布,一切都很正常
  6. ScrollView嵌套EditText联带滑动的解决办法
  7. 【latex】输入公式与编号
  8. 创业一定要做自己“喜欢”并且有“优势”的事情
  9. c++拷贝构造函数(深拷贝和浅拷贝)
  10. 【IoT】产品设计:硬件成本核算,这篇文章就够了
  11. 《成语接龙》隐私说明
  12. 「文献解读」RNAi在油菜研究中的应用
  13. IDEA 离线安装lombok插件
  14. url跳转http不携带referer方法
  15. PTA 帅到没朋友 (20分)
  16. inurl .php sid=,兄弟们现在还有那些好用的发外链的网站啊? - 搜外SEO问答
  17. javascript求1~100的素数和
  18. 使用FPT上传下载文件和解决中文名文件乱码问题
  19. 【历史上的今天】2 月 20 日:Python 代码首次发布;Facebook 收购 WhatsApp;DEC 创始人出生
  20. Windows日志筛选

热门文章

  1. VScode C/C++ 环境配置教程 (GCC)
  2. 天风掌财社新股认购如何操作?
  3. 2020蚂蚁森林自动收能量-保持更新
  4. 为知笔记的快捷键整理
  5. bat 命令如何启动远程PC上的一个程序?
  6. 同一服务器上运行两个mysql实例
  7. ios html5键盘弹出视图上移,ios 软键盘弹出, 页面整体上移问题
  8. 华为交换机默认vlan都是通的吗_最全的华为交换机vlan配置教程
  9. 开发一款APP需要多少钱?
  10. 国际商业分析师CBAP认证与PMI-PBA认证的区别——上海信息化培训中心