全部版块 我的主页
论坛 数据科学与人工智能 IT基础
13 0
2025-11-22

江西铁路行业集团公司项目需求技术实施方案

一、项目概述

本项目由江西铁路行业集团公司主导,旨在对企业网站后台管理系统进行功能升级。作为项目负责人,主要任务是实现文章发布模块的三项新增功能:支持Word内容直接粘贴、导入本地Word文档,以及从微信公众号复制内容并自动处理图文资源。所有功能将通过在现有Web编辑器中集成插件按钮的方式完成,确保系统稳定性、跨平台兼容性及未来可维护性。

二、系统架构与技术要求

前端技术方案

  • 开发框架:采用 Vue3 CLI 构建主应用,部分模块兼容 React 技术栈
  • 富文本编辑器:基于百度开源的 UEditor 实现内容编辑功能
  • 浏览器支持:全面覆盖包括 IE8 在内的主流浏览器,并适配信创环境下的国产浏览器(如奇安信安全浏览器、龙芯浏览器、红莲花安全浏览器等)

后端技术配置

  • 服务端框架:JSP
  • 开发工具:Eclipse JEE、MyEclipse、IntelliJ IDEA
  • 数据库系统:MySQL
  • 部署环境:阿里云 ECS,操作系统涵盖 CentOS 与 RedHat
  • 文件存储:使用阿里云对象存储(OSS),支持公有云、私有云及混合云部署模式

国产化适配要求

系统需完整支持国家信息技术应用创新环境,具体包括:

  • 操作系统:Windows、macOS、Linux 发行版(RedHat、CentOS、Ubuntu)、中标麒麟、银河麒麟、统信UOS
  • CPU架构:x86系列(Intel、AMD、兆芯、海光);ARM架构(鲲鹏、飞腾);龙芯平台(MIPS、LoongArch)

项目预算与交付标准

  • 总预算:控制在98万元以内
  • 交付内容:买断产品全部源代码,提供完整的编译、打包与发布培训指导

供应商资质要求

参与实施的软件厂商须具备以下条件:

  • 至少承接过5个中央企业、国有企业或政府事业单位项目
  • 需提供合同原件、银行付款凭证、信创环境兼容认证材料
  • 拥有相关软件著作权证书、营业执照及法人身份证原件备查

三、功能实现细节

1. UEditor 插件按钮扩展

为满足文档导入需求,在UEditor工具栏中注册自定义按钮,分别用于触发Word文件导入操作。通过动态添加隐藏输入框,实现文件选择与上传流程无缝衔接。

// 注册UEditor自定义按钮“Word导入”
UE.registerUI('wordImport', function(editor, uiName) {
  var btn = new UE.ui.Button({
    name: uiName,
    title: 'Word导入',
    onclick: function() {
      document.getElementById('wordImportInput').click();
    }
  });
  editor.addListener('ready', function() {
    editor.afterConfigReady(function() {
      editor.ui.add(btn);
    });
  });
  return btn;
});

// 创建隐藏文件输入元素
var fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.id = 'wordImportInput';
fileInput.accept = '.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf';
fileInput.style.display = 'none';
fileInput.onchange = function(e) {
  var file = e.target.files[0];
  if (file) {
    handleFileImport(file);
  }
};
document.body.appendChild(fileInput);

// 文件上传处理逻辑
function handleFileImport(file) {
  var formData = new FormData();
  formData.append('file', file);
  fetch('/api/upload', {
    method: 'POST',
    body: formData
  })
  .then(response => response.json())
  .then(data => {
    if (data.success) {
      var editor = UE.getEditor('editor');
      editor.setContent(data.content, true);
    } else {
      alert('导入失败: ' + data.message);
    }
  })
  .catch(error => {
    console.error('Error:', error);
    alert('导入过程中发生错误');
  });
}

2. 微信公众号内容粘贴功能实现

针对微信文章排版复杂、图片外链多的问题,设计专用粘贴插件,自动识别剪贴板中的微信内容,提取正文并下载远程图片至本地服务器,再转换为内网链接插入编辑器。

UE.registerUI('wechatPaste', function(editor, uiName) {
  var btn = new UE.ui.Button({
    name: uiName,
    title: '粘贴微信公众号内容',
    onclick: function() {
      // 启用剪贴板监听,解析微信HTML结构
      navigator.clipboard.read().then(items => {
        for (let item of items) {
          if (item.types.includes('text/html')) {
            item.getType('text/html').then(blob => {
              blob.text().then(html => {
                processWeChatContent(html, editor);
              });
            });
          }
        }
      }).catch(err => {
        alert('无法访问剪贴板: ' + err);
      });
    }
  });
  editor.ui.addButton('wechatPaste', btn);
  return btn;
});

该功能核心在于对微信特有的HTML标签结构进行清洗和资源重定向处理,确保格式保留的同时提升加载速度与安全性。

function processWechatContent(html, editor) {
    var tempDiv = document.createElement('div');
    tempDiv.innerHTML = html;
    var imgs = tempDiv.querySelectorAll('img');
    var promises = [];
    imgs.forEach(img => {
        var src = img.src;
        if (src.startsWith('http')) {
            promises.push(downloadAndUploadImage(src).then(newUrl => {
                img.src = newUrl;
            }));
        }
    });
    Promise.all(promises).then(() => {
        editor.setContent(tempDiv.innerHTML, true);
    });
}

function downloadAndUploadImage(url) {
    return fetch(url)
        .then(response => response.blob())
        .then(blob => {
            var formData = new FormData();
            formData.append('file', blob, 'image.jpg');
            return fetch('/api/uploadImage', {
                method: 'POST',
                body: formData
            })
            .then(response => response.json())
            .then(data => {
                if (data.success) {
                    return data.url;
                } else {
                    throw new Error('图片上传失败');
                }
            });
        });
}

// 监听粘贴事件
editor.addListener('paste', function(type, evt) {
    var html = evt.html;
    if (html) {
        processWechatContent(html, editor);
    }
});

editor.addListener('ready', function() {
    editor.afterConfigReady(function() {
        editor.ui.add(btn);
    });
});

return btn;

后端实现

1. 文件上传接口

用于处理 Word、Excel、PPT、PDF 等文档的上传及内容提取。

@WebServlet("/api/upload")
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        Part filePart = request.getPart("file");
        String fileName = filePart.getSubmittedFileName();
        InputStream fileContent = filePart.getInputStream();

        // 根据文件扩展名判断类型并提取内容
        String content = "";
        if (fileName.endsWith(".doc") || fileName.endsWith(".docx")) {
            content = WordProcessor.extractContent(fileContent);
        } else if (fileName.endsWith(".xls") || fileName.endsWith(".xlsx")) {
            content = ExcelProcessor.extractContent(fileContent);
        } else if (fileName.endsWith(".ppt") || fileName.endsWith(".pptx")) {
            content = PptProcessor.extractContent(fileContent);
        } else if (fileName.endsWith(".pdf")) {
            content = PdfProcessor.extractContent(fileContent);
        }

        // 设置响应格式为 JSON
        response.setContentType("application/json");

该逻辑实现了从剪贴板中获取带有图文的内容后,自动将外部图片下载并重新上传至本地服务器,同时保留原有格式结构。前端通过监听粘贴动作触发内容处理流程,而后端则提供统一接口支持多种办公文档的解析与数据返回,确保跨平台内容迁移的完整性与可用性。

@WebServlet("/api/getContent")
public class GetContentServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String content = extractContentFromWeChat(); // 模拟从公众号获取内容
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(String.format("{\"success\": true, \"content\": \"%s\"}", escapeJsonString(content)));
    }

    private String escapeJsonString(String input) {
        return input.replace("\\", "\\\\").replace("\"", "\\\"");
    }
}

图片上传接口处理

该接口用于处理从微信公众号提取的图片上传请求。

@WebServlet("/api/uploadImage")
public class ImageUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Part filePart = request.getPart("file");
        InputStream fileContent = filePart.getInputStream();
        String fileName = filePart.getSubmittedFileName();

        // 生成唯一文件名,保留原始扩展名
        String uniqueFileName = UUID.randomUUID().toString() + 
                                fileName.substring(fileName.lastIndexOf('.');

        // 将文件流上传至阿里云OSS
        String fileUrl = AliyunOssUtil.uploadFile(uniqueFileName, fileContent);

        // 返回JSON格式的图片访问链接
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(String.format("{\"success\": true, \"url\": \"%s\"}", fileUrl));
    }
}

阿里云OSS工具类实现

封装了与阿里云对象存储服务(OSS)交互的核心方法,支持文件流上传功能。

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import java.io.InputStream;

public class AliyunOssUtil {
    private static final String ENDPOINT = "your-oss-endpoint";
    private static final String ACCESS_KEY_ID = "your-access-key-id";
    private static final String ACCESS_KEY_SECRET = "your-access-key-secret";
    private static final String BUCKET_NAME = "your-bucket-name";

    public static String uploadFile(String objectName, InputStream inputStream) {
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
            ossClient.putObject(BUCKET_NAME, objectName, inputStream);
            return "https://" + BUCKET_NAME + "." + ENDPOINT + "/" + objectName;
        } finally {
            ossClient.shutdown();
        }
    }
}

项目部署流程

前端部分

将前端资源进行构建打包后,部署至主流Web服务器环境,例如Nginx或Apache。

确保UEditor编辑器的配置文件中,API接口地址正确指向后端服务路径,以保障内容抓取和图片上传功能正常运行。

后端服务部署

使用Eclipse JEE、MyEclipse或IntelliJ IDEA等Java开发工具导入完整项目工程。

根据实际环境修改数据库连接信息及阿里云OSS相关参数(如Endpoint、AccessKey等)。

完成配置后,将项目打包成WAR格式文件,并部署到Tomcat应用服务器中启动运行。

信创环境适配要求

为满足国产化信息技术应用创新环境的需求,需验证以下组件在目标平台中的兼容性:

  • 操作系统:支持主流国产操作系统(如麒麟、UOS等)
  • 中间件:Tomcat或其他符合标准的Java Web容器
  • 数据库:确保所用数据库(如MySQL、达梦、人大金仓等)驱动兼容
  • 依赖库:所有第三方JAR包应通过安全审查并在信创环境下测试通过

建议在正式部署前进行全面的功能与稳定性测试,确保系统可在指定信创平台上稳定运行。

支持的操作系统包括:Windows、macOS、Linux 以及基于 Linux 的多种国产操作系统,如 RedHat、CentOS、Ubuntu、中标麒麟、银河麒麟和统信UOS。

兼容的浏览器涵盖 IE8 及以上版本,同时支持奇安信安全浏览器、龙芯浏览器以及红莲花安全浏览器,确保在各类信创环境下稳定运行。

CPU 架构方面,适配主流的 x86 和 ARM 架构,并原生支持龙芯处理器,满足国产化硬件平台的部署需求。

预算与授权说明

  • 预算范围:控制在 98 万元以内,采用买断制,包含产品全部源代码的永久使用权。
  • 授权方式:提供无限制使用授权,并配套编译、打包、发布等全流程的技术培训与指导服务。

资质要求

参与项目的软件厂商须具备丰富的政企项目经验,需提交至少 5 个与央企、国有企业或政府事业单位成功合作的项目案例资料作为资格证明。

功能集成方案概述

本方案旨在实现 Word 内容粘贴、Word 文档导入及微信公众号内容一键粘贴等功能,全面兼容多操作系统与主流浏览器环境,尤其针对信创国产化生态进行了深度优化。系统部署简便,无需改动现有架构,可显著提升用户操作便捷性与编辑效率。

插件集成步骤

  1. 复制插件目录至项目指定路径
    UEditor 1.4.3.3示例
  2. 引入必要的插件文件资源
  3. 注意避免重复加载 jQuery。若项目中已引入 jQuery(版本不低于1.4),则无需再次添加 jq-1.4 文件。

工具栏配置

可通过初始化编辑器实例时自定义工具栏功能项,以下为推荐配置:

toolbars: [
  [
    "fullscreen",
    "source",
    "|",
    "zycapture",
    "|",
    "wordpaster","importwordtoimg","netpaster","wordimport","excelimport","pptimport","pdfimport",
    "|",
    "importword","exportword","importpdf"
  ]
]

控件初始化设置

示例代码如下:

var pos = window.location.href.lastIndexOf("/");
var api = [
  window.location.href.substr(0, pos + 1),
  "asp/upload.asp"
].join("");

WordPaster.getInstance({
  // 设置文件上传接口地址
  PostUrl: api,
  
  // 若返回图片路径为相对地址,可通过此参数补全域名
  ImageUrl: "",

  // 自定义上传字段名称,默认为 'file';若后端使用其他字段(如ueditor中的upfile),请修改此项
  FileFieldName: "file",

  // 图片地址匹配规则:当服务器返回JSON格式响应时,需通过正则提取图片URL
  ImageMatch: ''
});
// 加载控件 

关键配置说明

  • FileFieldName 配置:若后端接口接收文件的字段非 "file",请根据实际字段名调整配置。例如 ueditor 使用的是 "upfile"。
  • ImageMatch 设置:用于从服务器返回的 JSON 数据中提取图片地址,需填写合适的正则表达式。
  • ImageUrl 配置:当上传接口返回的是相对路径时,可通过该属性自动拼接完整域名。
  • SESSION 权限处理:若上传接口涉及登录验证或 SESSION 校验,请正确传递 COOKIE 信息,或临时关闭权限校验以便测试。参考链接:
    http://www.ncmem.com/doc/view.aspx?id=8602DDBF62374D189725BF17367125F3

功能效果展示

编辑器界面展示

支持导入 .doc 和 .docx 格式的 Word 文档

支持导入 .xls 和 .xlsx 格式的 Excel 文件

一键粘贴 Word 内容,自动上传文档内嵌图片并保留原有文字样式

将 Word 文件整体转换为图片并上传至服务器

PDF 文件一键导入并转为图片上传

PPT 文件导入并转换成图片形式上传

支持网络图片直接上传

点击下载完整示例代码以获取详细实现细节。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群