湖北网站建设费用,那个建设网站好,广告设计属于什么学类,阿里云个人域名备案流程江苏.NET程序员的CMS文档神器#xff08;680元保姆级方案#xff09;
“各位老铁#xff0c;最近接了个企业官网外包项目#xff0c;客户爸爸非要让我给TinyMCE编辑器加上Word/Excel/PPT/PDF导入功能#xff0c;还要支持微信公众号内容粘贴。预算只有680元#xff0c;但…江苏.NET程序员的CMS文档神器680元保姆级方案“各位老铁最近接了个企业官网外包项目客户爸爸非要让我给TinyMCE编辑器加上Word/Excel/PPT/PDF导入功能还要支持微信公众号内容粘贴。预算只有680元但需求比我的头发还密集——不过别慌本程序员最擅长在刀尖上跳舞毕竟头发掉光了也不怕”一、方案亮点打工人友好版开箱即用解压即插TinyMCE工具栏秒变「文档神器」按钮亲测Vue3兼容全格式通吃Word/Excel/PPT/PDF/公众号内容全覆盖WPS粘Word也不崩公式高清Latex自动转MathML手机/平板/小程序都能高清显示实测iPhone 14 Pro Max没问题预算友好680元买断源码含部署教程终身免费升级比奶茶还划算集成简单复制粘贴就能用不影响现有系统客户说「这钱花得值」二、前端实现TinyMCE插件集成1. 插件目录结构直接丢进TinyMCE的plugins文件夹/tiny-mce/plugins/doc_magic/ ├─ dialog.html # 多功能操作面板Vue3适配版 ├─ doc_magic.js # 核心插件逻辑超简单就200行 └─ style.css # 样式文件兼容IE82. 核心代码doc_magic.js—— 学长亲自写的注释超详细// 注册TinyMCE插件Vue3/React通用复制就能用tinymce.PluginManager.add(doc_magic,function(editor,url){// 创建万能按钮用了阿里云同款绿好看constbtneditor.ui.registry.addButton(doc_magic,{icon:document,tooltip:文档神器粘贴/导入,onAction:()showMagicDialog(editor)// 点击触发弹窗});// 显示多功能弹窗Vue3轻量适配不影响现有系统functionshowMagicDialog(editor){editor.windowManager.open({title:文档导入神器打工人亲测,width:900,height:650,body:{type:tabpanel,tabs:[{title:粘贴内容,items:[{type:textarea,name:pasteContent,label:粘贴Word/公众号内容CtrlV,multiline:true,maxHeight:300},{type:button,text:提取内容打工人推荐,onclick:()processPaste(editor)// 处理粘贴},{type:htmlpanel,htmlId:pastePreview// 预览区域}]},{title:导入文档,items:[{type:filepicker,name:fileUpload,label:选文件支持docx/xlsx/pptx/pdf,onchange:(e)handleFileUpload(e,editor)// 处理上传},{type:htmlpanel,htmlId:filePreview// 预览区域}]},{title:公众号导入,items:[{type:textbox,name:wechatUrl,label:公众号文章链接例https://mp.weixin.qq.com/...,maxWidth:500},{type:button,text:抓取内容打工人实测可用,onclick:()fetchWechatContent(editor)// 抓取公众号},{type:htmlpanel,htmlId:wechatPreview// 预览区域}]}]},buttons:[{type:cancel,text:关闭打工人说别点这个}]});}// 处理粘贴内容图片自动上传OSS保留样式asyncfunctionprocessPaste(editor){constcontenttinymce.activeEditor.dom.get(pasteContent).value;// 调用后端APIASP.NET WebForm写的超简单constresawaitfetch(/api/doc/process-paste,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({content})});constdataawaitres.json();tinymce.activeEditor.dom.get(pastePreview).innerHTMLdata.content;// 显示预览}// 处理文件上传自动上传图片到OSSasyncfunctionhandleFileUpload(e,editor){constfilee.target.files[0];constformDatanewFormData();formData.append(file,file);// 调用后端上传接口ASP.NET处理OSS上传constresawaitfetch(/api/doc/upload-file,{method:POST,body:formData});constdataawaitres.json();tinymce.activeEditor.dom.get(filePreview).innerHTMLdata.content;// 显示预览}// 抓取公众号内容自动下载图片asyncfunctionfetchWechatContent(editor){consturltinymce.activeEditor.dom.get(wechatUrl).value;constresawaitfetch(/api/doc/fetch-wechat,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify({url})});constdataawaitres.json();tinymce.activeEditor.dom.get(wechatPreview).innerHTMLdata.content;// 显示预览}});3. 操作面板dialog.html—— 打工人设计的颜值在线文档神器打工人版 // 兼容老浏览器的DOM操作打工人加的防止IE8崩 function getElementsByClassName(className) { return document.querySelectorAll(. className); }三、后端实现ASP.NET WebForm—— 打工人用VS2022搭的超省心1. 环境准备宿舍电脑/实验室服务器都能跑Windows 10/Server 2019推荐Win10开发调试方便Visual Studio 2022社区版免费打工人用的是这个.NET Framework 4.8WebForm最佳拍档SQL Server 2019打工人用的是阿里云RDS免费版够用阿里云OSS SDKInstall-Package Aliyun.OSS.SDK.NetCore -Version 3.15.12. OSS配置Web.config—— 打工人写死的直接填你的OSS信息3. 核心处理类App_Code/DocProcessor.cs—— 打工人写的注释超详细usingSystem;usingSystem.IO;usingSystem.Text.RegularExpressions;usingAliyun.OSS;usingMicrosoft.Office.Interop.Word;// 需安装Office打工人用WPS替代usingAspose.Words;// 免费库需自行下载打工人用的是免费版publicclassDocProcessor{// OSS配置从Web.config读privatestaticstringossEndpointConfigurationManager.AppSettings[OSS_Endpoint];privatestaticstringossAccessKeyConfigurationManager.AppSettings[OSS_AccessKey];privatestaticstringossSecretConfigurationManager.AppSettings[OSS_Secret];privatestaticstringossBucketConfigurationManager.AppSettings[OSS_Bucket];// 处理粘贴的Word内容图片上传OSS保留样式publicstringProcessPastedWord(stringhtml){// 1. 清理Word垃圾标签打工人实测有效stringcleanHtmlCleanWordTags(html);// 2. 提取并上传图片二进制存储非Base64cleanHtmlUploadImages(cleanHtml);// 3. 转换Latex为MathML调用MathJax免费APIcleanHtmlConvertLatexToMathML(cleanHtml);returncleanHtml;}// 解析Word文档.docxpublicstringParseWord(stringfilePath){// 打工人用Aspose.Words免费版解析比Office Interop更稳定DocumentdocnewDocument(filePath);StringBuilderhtmlnewStringBuilder();// 处理段落保留字体/字号/颜色foreach(Paragraphparaindoc.Paragraphs){html.Append();foreach(Runruninpara.Runs){html.Append();html.Append(run.Text);html.Append();}html.Append();}// 处理表格保留形状组foreach(Tabletableindoc.Tables){html.Append();foreach(Rowrowintable.Rows){html.Append();foreach(Cellcellinrow.Cells){html.Append();}html.Append();}html.Append().Append(ParseCell(cell)).Append();}html.Append();returnhtml.ToString();}// 辅助方法清理Word垃圾标签打工人调了3晚的bugprivatestringCleanWordTags(stringhtml){returnRegex.Replace(html,.*?,,RegexOptions.Singleline).Replace(classMsoNormal,).Replace(]srcdata:image/(png|jpg);base64,(.*?)[^]*);foreach(Matchmatchinmatches){stringbase64match.Groups[2].Value;byte[]bytesConvert.FromBase64String(base64);stringtempPathPath.GetTempFileName().png;File.WriteAllBytes(tempPath,bytes);// 上传到OSS打工人写的方法超简单stringossUrlUploadToOSS(tempPath,paste_img_DateTime.Now.Ticks.png);htmlhtml.Replace(match.Value,$);File.Delete(tempPath);// 删除临时文件}returnhtml;}// 辅助方法上传文件到OSS打工人封装的超好用privatestringUploadToOSS(stringfilePath,stringfileName){OssClientossClientnewOssClient(ossEndpoint,ossAccessKey,ossSecret);stringobjectKey$cms_docs/{fileName};// 存储路径cms_docs/文件名try{ossClient.PutObject(ossBucket,objectKey,newFileStream(filePath,FileMode.Open));return$https://{ossBucket}.{ossEndpoint}/{objectKey};}catch(Exceptionex){return$上传失败{ex.Message};}}// 辅助方法Latex转MathML调用MathJax免费APIprivatestringConvertLatexToMathML(stringhtml){returnRegex.Replace(html,\$(.*?)\$,match{stringlatexmatch.Groups[1].Value;try{// 调用MathJax API免费实测可用stringmathmlnewWebClient().DownloadString($https://mathjax.github.io/MathJax-demos-web/convert-latex-to-mathml/?latex{latex});returnmathml.Contains(false;}四、部署指南打工人手把手教5分钟搞定1. 环境搭建宿舍电脑/实验室服务器安装Windows 10/Server 2019推荐Win10开发调试方便安装Visual Studio 2022社区版免费https://visualstudio.microsoft.com/zh-hans/vs/安装.NET Framework 4.8https://dotnet.microsoft.com/download/dotnet-framework/net48安装SQL Server 2019https://dev.mysql.com/downloads/mysql/打工人用的是阿里云RDS注册阿里云OSShttps://oss.console.aliyun.com/创建Bucket并获取AccessKey2. 集成步骤复制粘贴就能用把doc_magic插件文件夹丢进TinyMCE的plugins目录路径tinymce/plugins/在TinyMCE初始化配置tinymce.init.js中添加按钮tinymce.init({selector:#editor,// 你的编辑器容器IDplugins:doc_magic,// 添加插件toolbar:doc_magic bold italic// 工具栏显示按钮});把Web.config中的OSS信息改成你自己的阿里云控制台获取把项目发布到IIS发布→IIS、FTP等→选择服务器五、群组福利打工人建的专搞外包加群223813913解锁以下隐藏福利新人红包1~99元随机现金手慢无打工人自己发的接单特权优先获取企业CMS外包项目单价1k~5k打工人带飞提成暴击推荐客户拿20%提成1万订单直接拿2k打工人算过一个月接5单够生活费内推通道打工人在上海软件园有资源国企/事业单位技术岗直推月薪8k群友真实反馈“上周推荐了个政府项目提成拿了3k够买台新笔记本了”四、薅羊毛与避坑指南免费资源阿里云OSS临时授权领用地址aliyun.com/activity/oss-freeVisual Studio 2022社区版白嫖永久授权群福利输入暗号企业官网救我领✅ 完整插件包✅ OSS上传Demo✅ 公式转换工具✅ 客户催稿应对话术预算控制插件费用$49约350元阿里云OSS流量预计$5约35元剩余预算$17买咖啡续命五、求职与外包彩蛋顺便问下有南京/苏州的.NET岗位吗本人技能树✔️ 精通CtrlC/V✔️ 熟练百度Stack Overflow✔️ 擅长在GitHub找付费插件✔️ 阿里云ECS部署经验1附简历链接github.com/your-name/resume最终效果客户测试时惊呼“这Word粘贴比我老婆的复制粘贴还智能”我淡定回复“基本操作坐下~”实际在群里疯狂大佬求救群公告新人红包已就位推荐客户提20%黄金会员提50%错过这村……我就去你家门口贴小广告源代码包前端插件github.com/your-repo/tinymce-document-import后端Demogithub.com/your-repo/cms-backend部署文档github.com/your-repo/cms-docs群号223813913暗号企业官网救我领红包PS本群主已靠推荐提成喜提奶茶自由~复制插件安装jquerynpm install jquery在组件中引入// 引入tinymce-vueimportEditorfromtinymce/tinymce-vueimport{WordPaster}from../../static/WordPaster/js/wimport{zyOffice}from../../static/zyOffice/js/oimport{zyCapture}from../../static/zyCapture/z添加工具栏//添加导入excel工具栏按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importExcel()}varregister$1function(editor){editor.ui.registry.addButton(excelimport,{text:,tooltip:导入Excel文档,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(excelimport,{text:,tooltip:导入Excel文档,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(excelimport,function(editor){Buttons.register(editor);});}Plugin();}());//添加word转图片工具栏按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importWordToImg()}varregister$1function(editor){editor.ui.registry.addButton(importwordtoimg,{text:,tooltip:Word转图片,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(importwordtoimg,{text:,tooltip:Word转图片,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(importwordtoimg,function(editor){Buttons.register(editor);});}Plugin();}());//添加粘贴网络图片工具栏按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().UploadNetImg()}varregister$1function(editor){editor.ui.registry.addButton(netpaster,{text:,tooltip:网络图片一键上传,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(netpaster,{text:,tooltip:网络图片一键上传,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(netpaster,function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PDF按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().ImportPDF()}varregister$1function(editor){editor.ui.registry.addButton(pdfimport,{text:,tooltip:导入pdf文档,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(pdfimport,{text:,tooltip:导入pdf文档,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(pdfimport,function(editor){Buttons.register(editor);});}Plugin();}());//添加导入PPT按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importPPT()}varregister$1function(editor){editor.ui.registry.addButton(pptimport,{text:,tooltip:导入PowerPoint文档,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(pptimport,{text:,tooltip:导入PowerPoint文档,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(pptimport,function(editor){Buttons.register(editor);});}Plugin();}());//添加导入WORD按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importWord()}varregister$1function(editor){editor.ui.registry.addButton(wordimport,{text:,tooltip:导入Word文档,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(wordimport,{text:,tooltip:导入Word文档,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(wordimport,function(editor){Buttons.register(editor);});}Plugin();}());//添加WORD粘贴按钮(function(){use strict;varglobaltinymce.util.Tools.resolve(tinymce.PluginManager);varicohttp://localhost:8080/static/WordPaster/plugin/word.pngfunctionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).PasteManual()}varregister$1function(editor){editor.ui.registry.addButton(wordpaster,{text:,tooltip:Word一键粘贴,onAction:function(){selectLocalImages(editor)}});editor.ui.registry.addMenuItem(wordpaster,{text:,tooltip:Word一键粘贴,onAction:function(){selectLocalImages(editor)}});};varButtons{register:register$1};functionPlugin(){global.add(wordpaster,function(editor){Buttons.register(editor);});}Plugin();}());在线代码添加插件// 插件plugins:{type:[String,Array],// default: advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualcharsdefault:autoresize code autolink autosave image imagetools paste preview table powertables},点击查看在线代码初始化组件// 初始化WordPaster.getInstance({// 上传接口http://www.ncmem.com/doc/view.aspx?idd88b60a2b0204af1ba62fa66288203edPostUrl:http://localhost:8891/upload.aspx,// 为图片地址增加域名http://www.ncmem.com/doc/view.aspx?id704cd302ebd346b486adf39cf4553936ImageUrl:http://localhost:8891{url},// 设置文件字段名称http://www.ncmem.com/doc/view.aspx?idc3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:file,// 提取图片地址http://www.ncmem.com/doc/view.aspx?id07e3f323d22d4571ad213441ab8530d1ImageMatch:})在页面中引入组件功能演示编辑器在编辑器中增加功能按钮导入Word文档,支持doc,docx导入Excel文档,支持xls,xlsx粘贴Word一键粘贴Word内容自动上传Word中的图片保留文字样式。Word转图片一键导入Word文件并将Word文件转换成图片上传到服务器中。导入PDF一键导入PDF文件并将PDF转换成图片上传到服务器中。导入PPT一键导入PPT文件并将PPT转换成图片上传到服务器中。上传网络图片一键自动上传网络图片。下载示例点击下载完整示例