From 8b3f90f178526781188ff37ae460e93eccaa12cd Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 22 七月 2026 09:55:47 +0800
Subject: [PATCH] update
---
admin-server/src/main/resources/templates/第三方评估报告new.docx | 0
admin-server/src/main/resources/templates/设备风险评估报告new.docx | 0
Word在线预览示例.html | 343 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 343 insertions(+), 0 deletions(-)
diff --git "a/Word\345\234\250\347\272\277\351\242\204\350\247\210\347\244\272\344\276\213.html" "b/Word\345\234\250\347\272\277\351\242\204\350\247\210\347\244\272\344\276\213.html"
new file mode 100644
index 0000000..f18e915
--- /dev/null
+++ "b/Word\345\234\250\347\272\277\351\242\204\350\247\210\347\244\272\344\276\213.html"
@@ -0,0 +1,343 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Word 在线预览示例</title>
+ <script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
+ <script src="https://cdn.jsdelivr.net/npm/docx-preview@0.3.6/dist/docx-preview.min.js"></script>
+ <style>
+ * {
+ box-sizing: border-box;
+ }
+
+ body {
+ margin: 0;
+ font-family: "Microsoft YaHei", Arial, sans-serif;
+ color: #1f2937;
+ background: #f5f7fb;
+ }
+
+ .page {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ }
+
+ .toolbar {
+ display: grid;
+ grid-template-columns: 1fr auto auto auto auto;
+ gap: 10px;
+ align-items: center;
+ padding: 14px 18px;
+ background: #ffffff;
+ border-bottom: 1px solid #d9e0ea;
+ }
+
+ .url-input {
+ width: 100%;
+ height: 38px;
+ padding: 0 12px;
+ border: 1px solid #c7d0dd;
+ border-radius: 6px;
+ color: #1f2937;
+ background: #ffffff;
+ outline: none;
+ }
+
+ .api-input {
+ width: 260px;
+ }
+
+ .url-input:focus {
+ border-color: #2563eb;
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);
+ }
+
+ .button {
+ height: 38px;
+ padding: 0 14px;
+ border: 1px solid #2563eb;
+ border-radius: 6px;
+ color: #ffffff;
+ background: #2563eb;
+ cursor: pointer;
+ white-space: nowrap;
+ }
+
+ .button.secondary {
+ color: #1f2937;
+ border-color: #c7d0dd;
+ background: #ffffff;
+ }
+
+ .tips {
+ padding: 10px 18px;
+ color: #64748b;
+ font-size: 13px;
+ line-height: 1.6;
+ background: #ffffff;
+ border-bottom: 1px solid #d9e0ea;
+ }
+
+ .viewer {
+ flex: 1;
+ min-height: 0;
+ padding: 16px;
+ }
+
+ .status {
+ display: none;
+ margin-bottom: 12px;
+ padding: 12px 14px;
+ border: 1px solid #d9e0ea;
+ border-radius: 6px;
+ color: #475569;
+ background: #ffffff;
+ }
+
+ .status.active {
+ display: block;
+ }
+
+ .status.error {
+ color: #b91c1c;
+ border-color: #fecaca;
+ background: #fff7f7;
+ }
+
+ .status a {
+ color: #2563eb;
+ text-decoration: none;
+ }
+
+ .docx-box,
+ .office-frame {
+ width: 100%;
+ min-height: calc(100vh - 140px);
+ border: 1px solid #d9e0ea;
+ border-radius: 8px;
+ background: #ffffff;
+ }
+
+ .docx-box {
+ overflow: auto;
+ padding: 18px;
+ }
+
+ .office-frame {
+ height: calc(100vh - 140px);
+ }
+
+ .hidden {
+ display: none;
+ }
+
+ @media (max-width: 768px) {
+ .toolbar {
+ grid-template-columns: 1fr;
+ padding: 12px;
+ }
+
+ .api-input {
+ width: 100%;
+ }
+
+ .button {
+ width: 100%;
+ }
+
+ .viewer {
+ padding: 10px;
+ }
+
+ .docx-box,
+ .office-frame {
+ min-height: 520px;
+ }
+ }
+ </style>
+</head>
+<body>
+<main class="page">
+ <div class="toolbar">
+ <input
+ id="wordUrl"
+ class="url-input"
+ type="url"
+ value="http://xllpgzx.com/report/%E9%A1%B9%E7%9B%AE%E6%B5%8B%E8%AF%950417%E7%AC%AC%E4%B8%89%E6%96%B9%E6%A3%80%E6%9F%A5%E6%8A%A5%E5%91%8A-%E5%B2%B1%E8%A7%82.docx"
+ >
+ <input
+ id="apiBaseUrl"
+ class="url-input api-input"
+ type="url"
+ value="http://localhost:8182"
+ title="后端服务地址"
+ >
+ <button class="button" type="button" onclick="previewLocal()">本地预览</button>
+ <button class="button secondary" type="button" onclick="previewOfficeEmbed()">Office内嵌</button>
+ <button class="button secondary" type="button" onclick="openOriginal()">打开原文件</button>
+ <button class="button secondary" type="button" onclick="openOfficeViewer()">新窗口预览</button>
+ </div>
+
+ <div class="tips">
+ 默认通过后端代理读取 Word,再使用 docx-preview 在浏览器本地渲染。请先启动后端服务,并确认后端地址正确。
+ </div>
+
+ <section class="viewer">
+ <div id="status" class="status"></div>
+ <div id="docxPreview" class="docx-box"></div>
+ <div id="officeHost" class="hidden"></div>
+ </section>
+</main>
+
+<script>
+ var officeTimer = null;
+
+ function getWordUrl() {
+ return document.getElementById("wordUrl").value.trim();
+ }
+
+ function getApiBaseUrl() {
+ return document.getElementById("apiBaseUrl").value.trim().replace(/\/$/, "");
+ }
+
+ function buildProxyUrl(wordUrl) {
+ return getApiBaseUrl() + "/admin/stat/report/wordPreviewProxy?wordUrl=" + encodeURIComponent(wordUrl);
+ }
+
+ function buildOfficeEmbedUrl(wordUrl) {
+ return "https://view.officeapps.live.com/op/embed.aspx?src=" + encodeURIComponent(wordUrl);
+ }
+
+ function buildOfficeViewUrl(wordUrl) {
+ return "https://view.officeapps.live.com/op/view.aspx?src=" + encodeURIComponent(wordUrl);
+ }
+
+ function showStatus(message, isError) {
+ var status = document.getElementById("status");
+ status.className = "status active" + (isError ? " error" : "");
+ status.innerHTML = message;
+ }
+
+ function hideStatus() {
+ document.getElementById("status").className = "status";
+ }
+
+ function showLocalContainer() {
+ document.getElementById("docxPreview").className = "docx-box";
+ document.getElementById("officeHost").className = "hidden";
+ }
+
+ function showOfficeContainer() {
+ document.getElementById("docxPreview").className = "hidden";
+ document.getElementById("officeHost").className = "";
+ }
+
+ async function previewLocal() {
+ var wordUrl = getWordUrl();
+ if (!wordUrl) {
+ alert("请输入 Word 文件 URL");
+ return;
+ }
+
+ if (!window.docx || !window.docx.renderAsync) {
+ showStatus("docx-preview 加载失败,请检查 CDN 网络。", true);
+ return;
+ }
+
+ showLocalContainer();
+ showStatus("正在下载并渲染 Word 文件...", false);
+
+ var container = document.getElementById("docxPreview");
+ container.innerHTML = "";
+
+ try {
+ var response = await fetch(buildProxyUrl(wordUrl), { mode: "cors" });
+ if (!response.ok) {
+ throw new Error("HTTP " + response.status);
+ }
+
+ var blob = await response.blob();
+ await window.docx.renderAsync(blob, container, null, {
+ className: "docx",
+ inWrapper: true,
+ ignoreWidth: false,
+ ignoreHeight: false,
+ ignoreFonts: false,
+ breakPages: true,
+ renderHeaders: true,
+ renderFooters: true,
+ renderFootnotes: true,
+ renderEndnotes: true,
+ useBase64URL: true,
+ experimental: true
+ });
+ hideStatus();
+ } catch (error) {
+ var viewerUrl = buildOfficeViewUrl(wordUrl);
+ showStatus(
+ "本地预览失败:" + error.message
+ + "。请确认后端服务已启动,且代理接口允许该Word地址。可使用 "
+ + "<a href=\"" + viewerUrl + "\" target=\"_blank\" rel=\"noopener noreferrer\">新窗口预览</a>"
+ + "。",
+ true
+ );
+ }
+ }
+
+ function previewOfficeEmbed() {
+ var wordUrl = getWordUrl();
+ if (!wordUrl) {
+ alert("请输入 Word 文件 URL");
+ return;
+ }
+
+ var officeHost = document.getElementById("officeHost");
+ var viewerUrl = buildOfficeEmbedUrl(wordUrl);
+
+ showOfficeContainer();
+ showStatus("正在加载 Office 内嵌预览...", false);
+ window.clearTimeout(officeTimer);
+
+ officeHost.innerHTML = "";
+ var iframe = document.createElement("iframe");
+ iframe.className = "office-frame";
+ iframe.title = "Office Word 在线预览";
+ iframe.referrerPolicy = "no-referrer-when-downgrade";
+ iframe.allowFullscreen = true;
+ iframe.onload = function () {
+ window.clearTimeout(officeTimer);
+ hideStatus();
+ };
+ iframe.src = viewerUrl;
+ officeHost.appendChild(iframe);
+
+ officeTimer = window.setTimeout(function () {
+ showStatus(
+ "Office 内嵌预览仍在加载。若页面空白,请使用 "
+ + "<a href=\"" + buildOfficeViewUrl(wordUrl) + "\" target=\"_blank\" rel=\"noopener noreferrer\">新窗口预览</a>"
+ + "。",
+ true
+ );
+ }, 8000);
+ }
+
+ function openOriginal() {
+ var wordUrl = getWordUrl();
+ if (wordUrl) {
+ window.open(wordUrl, "_blank", "noopener,noreferrer");
+ }
+ }
+
+ function openOfficeViewer() {
+ var wordUrl = getWordUrl();
+ if (wordUrl) {
+ window.open(buildOfficeViewUrl(wordUrl), "_blank", "noopener,noreferrer");
+ }
+ }
+
+ previewLocal();
+</script>
+</body>
+</html>
diff --git "a/admin-server/src/main/resources/templates/\347\254\254\344\270\211\346\226\271\350\257\204\344\274\260\346\212\245\345\221\212new.docx" "b/admin-server/src/main/resources/templates/\347\254\254\344\270\211\346\226\271\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
index 749bb30..77badd5 100644
--- "a/admin-server/src/main/resources/templates/\347\254\254\344\270\211\346\226\271\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
+++ "b/admin-server/src/main/resources/templates/\347\254\254\344\270\211\346\226\271\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
Binary files differ
diff --git "a/admin-server/src/main/resources/templates/\350\256\276\345\244\207\351\243\216\351\231\251\350\257\204\344\274\260\346\212\245\345\221\212new.docx" "b/admin-server/src/main/resources/templates/\350\256\276\345\244\207\351\243\216\351\231\251\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
index 6bea05a..c0f6720 100644
--- "a/admin-server/src/main/resources/templates/\350\256\276\345\244\207\351\243\216\351\231\251\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
+++ "b/admin-server/src/main/resources/templates/\350\256\276\345\244\207\351\243\216\351\231\251\350\257\204\344\274\260\346\212\245\345\221\212new.docx"
Binary files differ
--
Gitblit v1.7.1