MCP服务器自动发现与管理工具mcpfinder详解
2026/5/17 4:42:15
作为广西某集团公司的项目负责人,我们近期需要为企业网站后台管理系统的文章发布模块增加以下功能:
核心需求:
技术栈要求:
特殊要求:
经过市场调研,我筛选出以下几个可能的解决方案:
TinyMCE官方PowerPaste插件
KindEditor商业版
WangEditor企业版
UEditor百度编辑器
自定义开发方案
| 功能特性 | TinyMCE PowerPaste | KindEditor商业版 | WangEditor企业版 | UEditor | 自定义开发 | WordPaster源码版 |
|---|---|---|---|---|---|---|
| Word粘贴 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| 文件导入 | ✔️(仅Word) | ✔️ | ❌ | ✔️ | ✔️ | Word,Excel,PPT,PDF |
| 公众号粘贴 | ❌ | ❌ | ❌ | ✔️ | ✔️ | ✔️ |
| 公式支持 | ✔️ | ❌ | ❌ | ❌ | ✔️ | Latex,MathType |
| 信创兼容 | 部分 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| IE8兼容 | ✔️ | ✔️ | ❌ | ✔️ | ✔️ | ✔️ |
| 买断授权 | ❌ | ✔️ | ✔️ | ✔️ | 不适用 | ✔️ |
| 预算内 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ✔️ |
决策理由:
商务谈判结果:
[前端] Vue2 CLI → TinyMCE编辑器 → 自定义插件(Word/公众号处理) ↓ [后端API] SpringBoot → 文件处理服务 → 华为云OBS存储 ↑ [数据库] MySQL(存储元数据)main.js 集成代码:
importtinymcefrom'tinymce/tinymce'import'tinymce/themes/silver'import'tinymce/plugins/powerpaste'import'tinymce/plugins/wechatpaste'// 自定义公众号插件Vue.prototype.$tinymce=tinymceconstinitTinyMCE={language:'zh_CN',plugins:'powerpaste wechatpaste image table code',toolbar:'paste wechatpaste | image table',powerpaste_word_import:'clean',powerpaste_html_import:'clean',powerpaste_allow_local_images:true,paste_data_images:true,images_upload_handler:function(blobInfo,success,failure){// 调用后端图片上传接口uploadImage(blobInfo.blob()).then(url=>{success(url)}).catch(err=>{failure('上传失败: '+err)})}}图片上传Controller:
@RestController@RequestMapping("/api/upload")publicclassUploadController{@AutowiredprivateHuaweiObsServiceobsService;@PostMapping("/image")publicResponseEntityuploadImage(@RequestParam("file")MultipartFilefile){try{// 生成唯一文件名Stringfilename=UUID.randomUUID()+getFileExtension(file.getOriginalFilename());// 上传到华为云OBSStringurl=obsService.uploadFile("images/"+filename,file.getInputStream());// 返回JSON结果returnResponseEntity.ok(Collections.singletonMap("url",url));}catch(Exceptione){returnResponseEntity.status(500).body("上传失败: "+e.getMessage());}}privateStringgetFileExtension(Stringfilename){returnfilename.substring(filename.lastIndexOf("."));}}@ServicepublicclassHuaweiObsServiceImplimplementsHuaweiObsService{@Value("${huawei.obs.endpoint}")privateStringendpoint;@Value("${huawei.obs.bucket}")privateStringbucketName;privateObsClientobsClient;@PostConstructpublicvoidinit(){// 使用华为云永久AK/SK初始化obsClient=newObsClient("your-access-key","your-secret-key",endpoint);}@OverridepublicStringuploadFile(StringobjectKey,InputStreaminputStream)throwsException{PutObjectRequestrequest=newPutObjectRequest(bucketName,objectKey,inputStream);obsClient.putObject(request);returnString.format("https://%s.%s/%s",bucketName,endpoint,objectKey);}@PreDestroypublicvoiddestroy(){if(obsClient!=null){try{obsClient.close();}catch(Exceptione){// 记录日志}}}}针对信创环境的特殊处理:
字体兼容性方案:
/* 全局CSS设置GB2312字体回退 */body{font-family:"SimSun","STSong","NSimSun","FangSong","KaiTi",sans-serif;}浏览器polyfill处理:
// 在入口文件添加IE8兼容代码if(window.attachEvent&&!window.addEventListener){// 加载es5-shim等polyfillimport('es5-shim').then(()=>{import('console-polyfill')import('eventlistener-polyfill')})}国产CPU适配:
在Docker构建时针对不同CPU架构使用多阶段构建:
# 多架构Dockerfile示例 FROM --platform=$TARGETPLATFORM openjdk:8-jdk-alpine COPY target/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]浏览器兼容性测试矩阵:
信创OS测试清单:
信创环境兼容风险:
IE8性能问题:
图片上传稳定性:
| 需求项 | 实现状态 | 备注 |
|---|---|---|
| Word粘贴 | ✔️ | 支持到Office 2019格式 |
| 文件导入 | ✔️ | 支持Word/Excel/PPT/PDF |
| 公众号内容粘贴 | ✔️ | 支持常见公众号排版 |
| 样式保留 | ✔️ | 表格/公式/字体等 |
| 信创兼容 | ✔️ | 测试通过麒麟/UOS等 |
| IE8兼容 | ✔️ | 性能优化后达标 |
长期维护计划:
功能扩展路线图:
技术升级准备:
本项目在预算内按时完成,各项指标达到或超过预期,特别是在信创兼容性方面表现优异,为后续政府项目投标提供了有力的技术支撑。通过买断授权方式,集团后续项目无需重复采购,累计可节省约200万元授权费用。
npm install jquery// 引入tinymce-vueimportEditorfrom'@tinymce/tinymce-vue'import{WordPaster}from'../../static/WordPaster/js/w'import{zyOffice}from'../../static/zyOffice/js/o'import{zyCapture}from'../../static/zyCapture/z'//添加导入excel工具栏按钮(function(){'use strict';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importExcel()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importWordToImg()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().UploadNetImg()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().ImportPDF()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor);WordPaster.getInstance().importPPT()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).importWord()}varregister$1=function(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';varglobal=tinymce.util.Tools.resolve('tinymce.PluginManager');varico="http://localhost:8080/static/WordPaster/plugin/word.png"functionselectLocalImages(editor){WordPaster.getInstance().SetEditor(editor).PasteManual()}varregister$1=function(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 visualchars'default:'autoresize code autolink autosave image imagetools paste preview table powertables'},点击查看在线代码
// 初始化WordPaster.getInstance({// 上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:'http://localhost:8891/upload.aspx',// 为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:'http://localhost:8891{url}',// 设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:'file',// 提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''})在编辑器中增加功能按钮
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
一键自动上传网络图片。
点击下载完整示例