From dc109bf9f657f74e723fc4aa3572cb14a673f603 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Thu, 9 Jul 2026 20:20:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/apidoc/generator/ApiDocGenerator.java | 225 +++++++++++++++++- .../resources/templates/project_paths.txt | 1 + 2 files changed, 225 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/workutils/biz/apidoc/generator/ApiDocGenerator.java b/src/main/java/com/example/workutils/biz/apidoc/generator/ApiDocGenerator.java index 83cf2d1..2ec0737 100644 --- a/src/main/java/com/example/workutils/biz/apidoc/generator/ApiDocGenerator.java +++ b/src/main/java/com/example/workutils/biz/apidoc/generator/ApiDocGenerator.java @@ -71,6 +71,8 @@ public class ApiDocGenerator { sb.append("\n"); sb.append("API 接口文档\n"); appendCss(sb); + // 图片复制依赖 html2canvas(联网时加载;离线自动降级为富文本) + sb.append("\n"); sb.append("\n\n"); // 顶部栏(含搜索) @@ -150,7 +152,10 @@ public class ApiDocGenerator { sb.append(" ").append(escapeHtml(ci.className)).append("\n"); sb.append(" \n"); if (ci.methods != null) { - sb.append("
").append(ci.methods.size()).append(" 个方法
\n"); + sb.append("
"); + sb.append(" "); + sb.append(" "); + sb.append("").append(ci.methods.size()).append(" 个方法
\n"); } sb.append(" \n"); @@ -194,6 +199,8 @@ public class ApiDocGenerator { if (mi.returnType != null) { sb.append(" → ").append(escapeHtml(mi.returnType)).append("\n"); } + sb.append(" \n"); + sb.append(" \n"); sb.append(" \n"); // 方法体 @@ -516,6 +523,20 @@ public class ApiDocGenerator { sb.append(".copy-btn:hover{color:#fff;border-color:#888}\n"); sb.append(".copy-btn.copied{color:#52c41a;border-color:#52c41a}\n"); + // 接口/方法级复制按钮 + sb.append(".api-copy-btn{padding:4px 12px;border:1px solid #1677ff;border-radius:4px;background:#e8f3ff;color:#1677ff;font-size:12px;cursor:pointer;transition:.15s;font-family:inherit}\n"); + sb.append(".api-copy-btn:hover{background:#1677ff;color:#fff}\n"); + sb.append(".api-copy-btn.copied{background:#52c41a;border-color:#52c41a;color:#fff}\n"); + sb.append(".method-copy-btn{margin-left:auto;padding:3px 10px;border:1px solid #e5e6eb;border-radius:3px;background:#fff;color:#4e5969;font-size:11px;cursor:pointer;transition:.15s;font-family:inherit;flex-shrink:0}\n"); + sb.append(".method-copy-btn:hover{border-color:#1677ff;color:#1677ff;background:#e8f3ff}\n"); + sb.append(".method-copy-btn.copied{border-color:#52c41a;color:#52c41a;background:#f6ffed}\n"); + // 复制双按钮:图片为主,富文本为次 + sb.append(".api-copy-btn.txt{background:#fff;color:#1677ff}\n"); + sb.append(".api-copy-btn.txt:hover{background:#e8f3ff}\n"); + sb.append(".method-copy-btn.txt{color:#1677ff;border-color:#91caff;background:#f0f7ff}\n"); + sb.append(".method-copy-btn.img{background:#1677ff;color:#fff;border-color:#1677ff}\n"); + sb.append(".method-copy-btn.img:hover{background:#0958d9;border-color:#0958d9}\n"); + // 参数块 sb.append(".params-block{margin-bottom:12px}\n"); sb.append(".params-block-title{font-size:13px;font-weight:600;color:#4e5969;margin-bottom:6px}\n"); @@ -656,6 +677,208 @@ public class ApiDocGenerator { sb.append(" btn.textContent='\\u2714';btn.classList.add('copied');\n"); sb.append(" setTimeout(function(){btn.textContent='\\u590D\\u5236';btn.classList.remove('copied');},1500);\n"); sb.append("}\n"); + + // 复制用内联样式(保证粘贴到 Word 保留表格/缩进/配色,且可编辑) + sb.append("var DOC_CSS=\"\";\n"); + + // 复制按钮反馈 + sb.append("function markCopied(btn,msg){\n"); + sb.append(" if(!btn._orig)btn._orig=btn.innerHTML;\n"); + sb.append(" btn.classList.add('copied');\n"); + sb.append(" btn.textContent=msg||'\\u2714 已复制';\n"); + sb.append(" setTimeout(function(){if(btn._orig)btn.innerHTML=btn._orig;btn.classList.remove('copied');},2000);\n"); + sb.append("}\n"); + + // 去掉复制按钮等干扰元素 + sb.append("function cleanBody(body){\n"); + sb.append(" var t=document.createElement('div');t.innerHTML=body.innerHTML;\n"); + sb.append(" t.querySelectorAll('.copy-btn').forEach(function(b){if(b.parentNode)b.parentNode.removeChild(b);});\n"); + sb.append(" return t.innerHTML;\n"); + sb.append("}\n"); + + // 构建接口级富文本 + sb.append("function buildFacadeHtml(card){\n"); + sb.append(" var name=card.querySelector('.api-name').textContent;\n"); + sb.append(" var fqn=card.querySelector('.info-value.mono');\n"); + sb.append(" var fqnText=fqn?fqn.textContent:'';\n"); + sb.append(" var html='
'+DOC_CSS+'

'+name+'

'+fqnText+'
';\n"); + sb.append(" card.querySelectorAll('.method-card').forEach(function(mc){\n"); + sb.append(" var wasCollapsed=mc.querySelector('.method-header.collapsed');\n"); + sb.append(" if(wasCollapsed)wasCollapsed.classList.remove('collapsed');\n"); + sb.append(" var body=mc.querySelector('.method-body');\n"); + sb.append(" if(body)html+='
'+cleanBody(body)+'
';\n"); + sb.append(" if(wasCollapsed)mc.querySelector('.method-header').classList.add('collapsed');\n"); + sb.append(" });\n"); + sb.append(" html+='
';\n"); + sb.append(" return html;\n"); + sb.append("}\n"); + + // 构建方法级富文本 + sb.append("function buildMethodHtml(mc){\n"); + sb.append(" var name=mc.querySelector('.method-name').textContent;\n"); + sb.append(" var html='
'+DOC_CSS+'

'+name+'

';\n"); + sb.append(" var wasCollapsed=mc.querySelector('.method-header.collapsed');\n"); + sb.append(" if(wasCollapsed)wasCollapsed.classList.remove('collapsed');\n"); + sb.append(" var body=mc.querySelector('.method-body');\n"); + sb.append(" if(body)html+=cleanBody(body);\n"); + sb.append(" if(wasCollapsed)mc.querySelector('.method-header').classList.add('collapsed');\n"); + sb.append(" html+='
';\n"); + sb.append(" return html;\n"); + sb.append("}\n"); + + // ===== 复制为 RTF(Word 还原度最高,纯离线、零依赖)===== + // RTF 转义:中文用 \\u 十进制转义,规避编码问题;字体统一微软雅黑 + sb.append("function rtfEsc(s){\n"); + sb.append(" s=(s==null?'':String(s));var out='';\n"); + sb.append(" for(var i=0;i32767)v-=65536;out+='\\\\u'+v+'?';}}\n"); + sb.append(" return out;\n"); + sb.append("}\n"); + // RTF 文档头(字体表/颜色表/默认段落),字号单位半磅 + sb.append("var RTF_HEAD=\"{\\\\rtf1\\\\ansi\\\\ansicpg936\\\\uc1\\\\deff0\\\\deflang1033\\\\deflangfe2052\"\n"); + sb.append(" +\"{\\\\fonttbl{\\\\f0\\\\fnil\\\\fcharset134\\\\fprq2 Microsoft YaHei;}}\"\n"); + sb.append(" +\"{\\\\colortbl;\\\\red102\\\\green102\\\\blue102;\\\\red22\\\\green119\\\\blue255;\\\\red212\\\\green107\\\\blue8;\\\\red245\\\\green63\\\\blue63;\\\\red82\\\\green196\\\\blue26;\\\\red250\\\\green140\\\\blue22;\\\\red114\\\\green46\\\\blue209;\\\\red29\\\\green29\\\\blue29;}\"\n"); + sb.append(" +\"\\\\viewkind4\\\\uc1\\\\pard\\\\sa80\\\\sl240\\\\slmult1\\\\f0\\\\fs21\\\\cf0\\\\widctlpar\\\\hyphpar0\\\\par\";\n"); + sb.append("var RTF_TAIL=\"}\";\n"); + // 段落 + sb.append("function rtfP(o,t){o=o||{};var b=o.b?'\\\\b ':'';var col=o.cf!=null?'\\\\cf'+o.cf+' ':'';var li=o.li||0;var sz=o.sz||21;\n"); + sb.append(" t=(t==null?'':String(t)).replace(/\\r?\\n/g,'\\\\line ');\n"); + sb.append(" return '\\\\pard\\\\li'+li+'\\\\sa80\\\\sl240\\\\slmult1 '+b+col+'\\\\f0\\\\fs'+sz+' '+rtfEsc(t)+'\\\\par';\n"); + sb.append("}\n"); + // 表格(含边框),left 为整体左缩进(twips) + sb.append("function rtfTable(tableEl,left){\n"); + sb.append(" left=left||0;var rows=tableEl.querySelectorAll('tr');if(!rows.length)return '';\n"); + sb.append(" var n=rows[0].querySelectorAll('th,td').length;var total=8800;var w=Math.floor(total/n);var cx=[];for(var k=0;k\n"); } diff --git a/src/main/resources/templates/project_paths.txt b/src/main/resources/templates/project_paths.txt index 38bea1c..0adf7cd 100644 --- a/src/main/resources/templates/project_paths.txt +++ b/src/main/resources/templates/project_paths.txt @@ -68,3 +68,4 @@ D:/bestpay-srdcloud/ft-blockchain-prod=https://srd17321104074@code.srdcloud.cn/b D:/bestpay-srdcloud/ft-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-collateral-core.git D:/bestpay-srdcloud/ft-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-commodity-core.git D:/bestpay-srdcloud/ft-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-commonservice.git +D:/bestpay-srdcloud/ft-deposit-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-deposit-core