【技术日记:一个学生的Word转存CMS逆袭之路】
"同学们!今天又是被UEditor折磨的一天!"我叼着辣条敲下这行字,屏幕里闪烁着第38次调试失败的PHP日志。作为贵州山区走出来的程序猿(自封的),我深知在预算99元的情况下实现Word图片一键转存+多端公式渲染有多刺激——这简直比用PHP写区块链还离谱!
一、技术选型:白嫖党的自我修养
- 前端三件套:Vue3+TypeScript+UEditor(百度开源版,毕竟咱穷)
- 后端全家桶:PHP8.1+Swoole协程(假装高并发)+MySQL(学生版免费)
- 存储方案:阿里云OSS(学生机9.9元/月)+本地缓存
- 核心组件:
mammoth.js(Word转HTML白嫖神器)MathJax(公式渲染,CDN免费)Puppeteer(PDF转图片,用学校机房服务器白嫖算力)
二、前端魔改实录(Vue3版)
// /src/components/UEditorPlus.vueimport{onMounted,ref}from'vue'import'ueditor/dist/ueditor.config'import'ueditor/dist/ueditor.all.min'declare global{interfaceWindow{UE:anyMathJax:any}}exportdefault{setup(){consteditorRef=ref(null)onMounted(()=>{constue=window.UE.getEditor('editor',{toolbars:[// 新增Word转存按钮['wordtrans']],// 重点:禁用默认图片上传,改用我们的接口imageUrl:'/api/fake-upload'// 先骗过UEditor初始化})// 注册Word转存插件ue.registerCommand('wordtrans',()=>{constinput=document.createElement('input')input.type='file'input.accept='.docx,.doc'input.onchange=async(e)=>{constfile=e.target.files[0]constformData=newFormData()formData.append('file',file)// 调用后端接口constres=awaitfetch('/api/word/parse',{method:'POST',body:formData})const{html,ossUrls}=awaitres.json()// 替换图片路径为OSS地址constfinalHtml=html.replace(/src="temp\//g,`src="${ossUrls.join('|')}".split('|')[0]`)// 插入到编辑器(简单版,实际要处理公式)ue.execCommand('insertHtml',finalHtml)// 触发MathJax重渲染setTimeout(()=>{window.MathJax.typesetPromise()},300)}input.click()})editorRef.value=ue})return{editorRef}}}三、PHP后端:99元预算的极限操作
// /api/word/parse.phpvalue();preg_match_all('/ $base64) { $imageName = 'word-img/'.uniqid().'.'.explode('/', $matches[1][$i])[1]; $client->putObject('your-bucket', $imageName, base64_decode($base64)); $ossUrls[] = 'https://your-bucket.oss-cn-hangzhou.aliyuncs.com/'.$imageName;// 替换HTML中的base64为OSS链接(实际要更复杂)$html=str_replace($matches[0][$i],' $html, 'ossUrls' => $ossUrls, 'message' => '穷学生的逆袭之路']);四、公式渲染终极方案
// 在UEditor初始化后执行functionrenderMath(){// 1. 识别MathType公式图片(通过alt属性)document.querySelectorAll('img[alt*="MathType"]').forEach(img=>{// 实际要用OCR识别图片内容,这里简化处理constlatex='E=mc^2';// 假装从图片识别出来的img.outerHTML=`\\(${latex}\\)`;});// 2. 使用MathJax渲染window.MathJax={tex:{inlineMath:[['$','$']]},svg:{fontCache:'global'}};// 动态加载MathJax(CDN白嫖)constscript=document.createElement('script');script.src='https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js';script.onload=()=>window.MathJax.typeset();document.head.appendChild(script);}五、求职彩蛋:师兄师姐内推通道
"各位大佬看过来!本人精通:
- 在99元预算下实现不可能的功能
- 用PHP写区块链(误)
- 调试UEditor到凌晨三点
- 阿里云OSS白嫖技巧
求内推Java/PHP开发岗,可接受996福报!附上我的GitHub项目:https://github.com/poor-student/cms-with-99yuan
PS:加群223813913领红包,推荐客户拿20%提成!本群已帮助3位同学月入过万(其中一位是我妈在跳广场舞时发展的下线)"
【技术总结】
- 核心思路:用开源组件拼凑+阿里云学生优惠+CDN白嫖
- 待解决问题:
- MathType公式OCR识别(考虑用Python训练个简易模型)
- 多端公式适配(准备用CSS的
aspect-ratio属性) - 性能优化(Swoole协程版正在开发中)
- 预算分配:
- 阿里云OSS:9.9元/月
- 域名:免费子域名
- 服务器:学校机房白嫖
- 剩余:89.1元(准备买包辣条庆祝)
"程序员的浪漫,就是在预算99元的情况下,用PHP实现Java都搞不定的功能!"我合上用了5年的ThinkPad,望着窗外贵阳的夜景,仿佛看到了自己站在阿里P7的领奖台上…
复制插件目录
引入插件文件
UEditor 1.4.3.3示例注意:不要重复引入jquery,如果您的项目已经引入了jq,则不用再引入jq-1.4
在工具栏中增加插件按钮
//工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义toolbars:[["fullscreen","source","|","zycapture","|","wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport","|","importword","exportword","importpdf"]]初始化控件
varpos=window.location.href.lastIndexOf("/");varapi=[window.location.href.substr(0,pos+1),"asp/upload.asp"].join("");WordPaster.getInstance({//上传接口:http://www.ncmem.com/doc/view.aspx?id=d88b60a2b0204af1ba62fa66288203edPostUrl:api,//为图片地址增加域名:http://www.ncmem.com/doc/view.aspx?id=704cd302ebd346b486adf39cf4553936ImageUrl:"",//设置文件字段名称:http://www.ncmem.com/doc/view.aspx?id=c3ad06c2ae31454cb418ceb2b8da7c45FileFieldName:"file",//提取图片地址:http://www.ncmem.com/doc/view.aspx?id=07e3f323d22d4571ad213441ab8530d1ImageMatch:''});//加载控件注意
如果接口字段名称不是file,请配置FileFieldName。ueditor接口中使用的upfile字段
点击查看详细教程
配置ImageMatch
匹配图片地址,如果服务器返回的是JSON则需要通过正则匹配
ImageMatch:'',点击参考链接
配置ImageUrl
为图片地址增加域名,如果服务器返回的图片地址是相对路径,可通过此属性添加自定义域名。
ImageUrl:"",点击查看详细教程
配置SESSION
如果接口有权限验证(登陆验证,SESSION验证),请配置COOKIE。或取消权限验证。
参考:http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3
效果
编辑器界面
导入Word文档,支持doc,docx
导入Excel文档,支持xls,xlsx
粘贴Word
一键粘贴Word内容,自动上传Word中的图片,保留文字样式。
Word转图片
一键导入Word文件,并将Word文件转换成图片上传到服务器中。
导入PDF
一键导入PDF文件,并将PDF转换成图片上传到服务器中。
导入PPT
一键导入PPT文件,并将PPT转换成图片上传到服务器中。
上传网络图片
下载示例
点击下载完整示例